aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElias Fleckenstein <eliasfleckenstein@web.de>2021-06-14 21:37:10 +0200
committerElias Fleckenstein <eliasfleckenstein@web.de>2021-06-14 21:37:10 +0200
commite1be7203f4c3366a9d278c9bb625a9c678c2ef24 (patch)
tree0753b9c68ffaada23f2602aebc613c3c7d1eaae2
parent9d3ecc266d2e06f6cc8f2a310543b16edb8cbd56 (diff)
downloaddungeon_game-e1be7203f4c3366a9d278c9bb625a9c678c2ef24.tar.xz
Add loot boxes
-rw-r--r--plugins/cherry/Makefile2
-rw-r--r--plugins/cherry/cherry.c8
-rw-r--r--plugins/cherry/cherry.h8
-rw-r--r--plugins/cherry/dependencies.txt1
-rw-r--r--plugins/fireball/Makefile2
-rw-r--r--plugins/fireball/dependencies.txt1
-rw-r--r--plugins/fireball/fireball.c8
-rw-r--r--plugins/game/game.c4
-rw-r--r--plugins/loot/Makefile4
-rw-r--r--plugins/loot/dependencies.txt2
-rw-r--r--plugins/loot/loot.c63
-rw-r--r--plugins/loot/loot.h16
-rw-r--r--plugins/sword/Makefile2
-rw-r--r--plugins/sword/sword.c8
14 files changed, 125 insertions, 4 deletions
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 <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,
+ });
+}
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,
+ });
}