-plugins/cherry/cherry.so: plugins/cherry/cherry.c plugins/game/game.h plugins/score/score.h plugins/inventory/inventory.h
+plugins/cherry/cherry.so: plugins/cherry/cherry.c plugins/game/game.h plugins/score/score.h plugins/inventory/inventory.h plugins/loot/loot.h
cc -g -shared -fpic -o plugins/cherry/cherry.so plugins/cherry/cherry.c
PLUGINS := ${PLUGINS} plugins/cherry/cherry.so
#include "../game/game.h"
#include "../score/score.h"
#include "../inventory/inventory.h"
+#include "../loot/loot.h"
static bool use_cherry(struct itemstack *stack)
{
.room_chance = 100,
.callback = &spawn_cherry,
});
+
+ register_loot((struct loot) {
+ .item = &cherry_item,
+ .chance = 2,
+ .min = 3,
+ .max = 10,
+ });
}
--- /dev/null
+#ifndef _CHERRY_H_
+#define _CHERRY_H_
+
+#include "../inventory/inventory.h"
+
+extern struct item cherry_item;
+
+#endif
game
score
inventory
+loot
-plugins/fireball/fireball.so: plugins/fireball/fireball.c plugins/game/game.h plugins/movement/movement.h plugins/inventory/inventory.h
+plugins/fireball/fireball.so: plugins/fireball/fireball.c plugins/game/game.h plugins/movement/movement.h plugins/inventory/inventory.h plugins/loot/loot.h
cc -g -shared -fpic -o plugins/fireball/fireball.so plugins/fireball/fireball.c
PLUGINS := ${PLUGINS} plugins/fireball/fireball.so
game
movement
inventory
+loot
#include "../game/game.h"
#include "../movement/movement.h"
#include "../inventory/inventory.h"
+#include "../loot/loot.h"
struct fireball_data
{
.count = 7,
.meta = NULL,
});
+
+ register_loot((struct loot) {
+ .item = &fireball_item,
+ .chance = 3,
+ .min = 4,
+ .max = 7,
+ });
}
for (struct list *ptr = air_functions; ptr != NULL; ptr = ptr->next) {
struct generator_function *func = ptr->element;
- if (rand() % (ctx == MG_CTX_CORRIDOR ? func->corridor_chance : func->room_chance) == 0)
+ int chance = ctx == MG_CTX_CORRIDOR ? func->corridor_chance : func->room_chance;
+
+ if (chance && rand() % chance == 0)
func->callback(x, y, ctx);
}
}
--- /dev/null
+plugins/loot/loot.so: plugins/loot/loot.c plugins/loot/loot.h plugins/game/game.h plugins/inventory/inventory.h
+ cc -g -shared -fpic -o plugins/loot/loot.so plugins/loot/loot.c
+
+PLUGINS := ${PLUGINS} plugins/loot/loot.so
--- /dev/null
+game
+inventory
--- /dev/null
+#include <stdlib.h>
+#include "../loot/loot.h"
+#include "../game/game.h"
+
+static struct list *loot_list = NULL;
+
+void register_loot(struct loot loot)
+{
+ loot_list = add_element(loot_list, make_buffer(&loot, sizeof(struct loot)));
+}
+
+static void loot_step(struct entity *self, struct entity_step_data stepdata)
+{
+ if (stepdata.dx == 0 && stepdata.dy == 0) {
+ for (struct list *ptr = loot_list; ptr != NULL; ptr = ptr->next) {
+ struct loot *loot = ptr->element;
+ if (rand() % loot->chance == 0) {
+ inventory_add(&player_inventory, (struct itemstack) {
+ .item = loot->item,
+ .count = loot->min + (loot->max > loot->min ? rand() % (loot->max - loot->min + 1) : 0),
+ .meta = NULL,
+ });
+ }
+ }
+ self->remove = true;
+ }
+}
+
+static struct entity loot_entity = {
+ .name = "loot",
+ .x = 0,
+ .y = 0,
+ .color = {0},
+ .use_color = false,
+ .texture = "🎁",
+ .remove = false,
+ .meta = NULL,
+ .health = 1,
+ .max_health = 1,
+ .collide_with_entities = false,
+
+ .on_step = &loot_step,
+ .on_collide = NULL,
+ .on_collide_with_entity = NULL,
+ .on_spawn = NULL,
+ .on_remove = NULL,
+ .on_death = NULL,
+ .on_damage = NULL,
+};
+
+static void spawn_loot(int x, int y, enum mg_context ctx)
+{
+ spawn(loot_entity, x, y, NULL);
+}
+
+__attribute__((constructor)) static void init()
+{
+ register_air_function((struct generator_function) {
+ .corridor_chance = 0,
+ .room_chance = 250,
+ .callback = &spawn_loot,
+ });
+}
--- /dev/null
+#ifndef _LOOT_H_
+#define _LOOT_H_
+
+#include "../inventory/inventory.h"
+
+struct loot
+{
+ struct item *item;
+ int chance;
+ int min;
+ int max;
+};
+
+void register_loot(struct loot loot);
+
+#endif
-plugins/sword/sword.so: plugins/sword/sword.c plugins/game/game.h plugins/movement/movement.h plugins/inventory/inventory.h plugins/recharge/recharge.h
+plugins/sword/sword.so: plugins/sword/sword.c plugins/game/game.h plugins/movement/movement.h plugins/inventory/inventory.h plugins/recharge/recharge.h plugins/loot/loot.h
cc -g -shared -fpic -o plugins/sword/sword.so plugins/sword/sword.c
PLUGINS := ${PLUGINS} plugins/sword/sword.so
#include "../movement/movement.h"
#include "../inventory/inventory.h"
#include "../recharge/recharge.h"
+#include "../loot/loot.h"
static bool use_broken_sword(struct itemstack *stack)
{
.run_if_dead = false,
.callback = &handle_e,
});
+
+ register_loot((struct loot) {
+ .chance = 7,
+ .item = &sword,
+ .min = 1,
+ .max = 1,
+ });
}