From e1be7203f4c3366a9d278c9bb625a9c678c2ef24 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 14 Jun 2021 21:37:10 +0200 Subject: [PATCH] Add loot boxes --- plugins/cherry/Makefile | 2 +- plugins/cherry/cherry.c | 8 ++++ plugins/cherry/cherry.h | 8 ++++ plugins/cherry/dependencies.txt | 1 + plugins/fireball/Makefile | 2 +- plugins/fireball/dependencies.txt | 1 + plugins/fireball/fireball.c | 8 ++++ plugins/game/game.c | 4 +- plugins/loot/Makefile | 4 ++ plugins/loot/dependencies.txt | 2 + plugins/loot/loot.c | 63 +++++++++++++++++++++++++++++++ plugins/loot/loot.h | 16 ++++++++ plugins/sword/Makefile | 2 +- plugins/sword/sword.c | 8 ++++ 14 files changed, 125 insertions(+), 4 deletions(-) create mode 100644 plugins/cherry/cherry.h create mode 100644 plugins/loot/Makefile create mode 100644 plugins/loot/dependencies.txt create mode 100644 plugins/loot/loot.c create mode 100644 plugins/loot/loot.h diff --git a/plugins/cherry/Makefile b/plugins/cherry/Makefile index edb1f44..a561baa 100644 --- a/plugins/cherry/Makefile +++ b/plugins/cherry/Makefile @@ -1,4 +1,4 @@ -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 diff --git a/plugins/cherry/cherry.c b/plugins/cherry/cherry.c index 1b0ac8a..96f0a2a 100644 --- a/plugins/cherry/cherry.c +++ b/plugins/cherry/cherry.c @@ -3,6 +3,7 @@ #include "../game/game.h" #include "../score/score.h" #include "../inventory/inventory.h" +#include "../loot/loot.h" static bool use_cherry(struct itemstack *stack) { @@ -66,5 +67,12 @@ __attribute__((constructor)) static void init() .room_chance = 100, .callback = &spawn_cherry, }); + + register_loot((struct loot) { + .item = &cherry_item, + .chance = 2, + .min = 3, + .max = 10, + }); } diff --git a/plugins/cherry/cherry.h b/plugins/cherry/cherry.h new file mode 100644 index 0000000..87ccbec --- /dev/null +++ b/plugins/cherry/cherry.h @@ -0,0 +1,8 @@ +#ifndef _CHERRY_H_ +#define _CHERRY_H_ + +#include "../inventory/inventory.h" + +extern struct item cherry_item; + +#endif diff --git a/plugins/cherry/dependencies.txt b/plugins/cherry/dependencies.txt index 4952514..d721cfd 100644 --- a/plugins/cherry/dependencies.txt +++ b/plugins/cherry/dependencies.txt @@ -1,3 +1,4 @@ game score inventory +loot diff --git a/plugins/fireball/Makefile b/plugins/fireball/Makefile index 117c092..24b068e 100644 --- a/plugins/fireball/Makefile +++ b/plugins/fireball/Makefile @@ -1,4 +1,4 @@ -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 diff --git a/plugins/fireball/dependencies.txt b/plugins/fireball/dependencies.txt index b19003b..32ba50f 100644 --- a/plugins/fireball/dependencies.txt +++ b/plugins/fireball/dependencies.txt @@ -1,3 +1,4 @@ game movement inventory +loot diff --git a/plugins/fireball/fireball.c b/plugins/fireball/fireball.c index a0e9a13..e771d08 100644 --- a/plugins/fireball/fireball.c +++ b/plugins/fireball/fireball.c @@ -3,6 +3,7 @@ #include "../game/game.h" #include "../movement/movement.h" #include "../inventory/inventory.h" +#include "../loot/loot.h" struct fireball_data { @@ -113,4 +114,11 @@ __attribute__((constructor)) static void init() .count = 7, .meta = NULL, }); + + register_loot((struct loot) { + .item = &fireball_item, + .chance = 3, + .min = 4, + .max = 7, + }); } diff --git a/plugins/game/game.c b/plugins/game/game.c index cc6d21d..ef2651f 100644 --- a/plugins/game/game.c +++ b/plugins/game/game.c @@ -334,7 +334,9 @@ static void mapgen_set_air(int x, int y, enum mg_context ctx) 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); } } diff --git a/plugins/loot/Makefile b/plugins/loot/Makefile new file mode 100644 index 0000000..bd65c69 --- /dev/null +++ b/plugins/loot/Makefile @@ -0,0 +1,4 @@ +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 diff --git a/plugins/loot/dependencies.txt b/plugins/loot/dependencies.txt new file mode 100644 index 0000000..5968537 --- /dev/null +++ b/plugins/loot/dependencies.txt @@ -0,0 +1,2 @@ +game +inventory diff --git a/plugins/loot/loot.c b/plugins/loot/loot.c new file mode 100644 index 0000000..87d51c9 --- /dev/null +++ b/plugins/loot/loot.c @@ -0,0 +1,63 @@ +#include +#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, + }); +} diff --git a/plugins/loot/loot.h b/plugins/loot/loot.h new file mode 100644 index 0000000..41fda44 --- /dev/null +++ b/plugins/loot/loot.h @@ -0,0 +1,16 @@ +#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 diff --git a/plugins/sword/Makefile b/plugins/sword/Makefile index 034ba74..2173fa1 100644 --- a/plugins/sword/Makefile +++ b/plugins/sword/Makefile @@ -1,4 +1,4 @@ -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 diff --git a/plugins/sword/sword.c b/plugins/sword/sword.c index bac963f..31bb87a 100644 --- a/plugins/sword/sword.c +++ b/plugins/sword/sword.c @@ -4,6 +4,7 @@ #include "../movement/movement.h" #include "../inventory/inventory.h" #include "../recharge/recharge.h" +#include "../loot/loot.h" static bool use_broken_sword(struct itemstack *stack) { @@ -73,4 +74,11 @@ __attribute__((constructor)) static void init() .run_if_dead = false, .callback = &handle_e, }); + + register_loot((struct loot) { + .chance = 7, + .item = &sword, + .min = 1, + .max = 1, + }); } -- 2.44.0