3 #include "../inventory/inventory.h"
5 static struct color gray;
6 static struct color darkgray;
8 static bool use_item(struct itemstack *stack)
14 struct inventory player_inventory = {NULL};
16 static int selected_index = 0;
18 void inventory_add(struct inventory *self, struct itemstack stack)
20 struct list **ptr = &self->stacks;
22 if (stack.item->stackable) {
23 for (; *ptr != NULL; ptr = &(*ptr)->next) {
24 struct itemstack *other = (*ptr)->element;
25 if (other->item == stack.item) {
26 other->count += stack.count;
32 *ptr = add_element(*ptr, make_buffer(&stack, sizeof(struct itemstack)));
37 bool inventory_remove(struct inventory *self, struct itemstack *stack)
39 stack.count = -stack.count;
41 for (struct list **ptr = &self->stacks; *ptr != NULL; ) {
42 struct itemstack *other = (*ptr)->element;
44 if (other->item == stack.item) {
45 stack.count += other->count;
47 if (stack.count > 0) {
48 other->count = stack.count;
51 struct list *next = ptr->next;
55 if (other->item->on_destroy)
56 other->item->on_destroy(other);
74 static void decrease_item_count(struct list **ptr, struct itemstack *stack)
78 if (stack->count == 0) {
79 struct list *next = (*ptr)->next;
81 if (stack->item->on_destroy)
82 stack->item->on_destroy(stack);
91 bool inventory_remove(struct inventory *self, struct item *item)
93 for (struct list **ptr = &self->stacks; *ptr != NULL; ptr = &(*ptr)->next) {
94 struct itemstack *stack = (*ptr)->element;
96 if (stack->item == item) {
97 decrease_item_count(ptr, stack);
106 static void handle_enter()
110 for (struct list **ptr = &player_inventory.stacks; *ptr != NULL; ptr = &(*ptr)->next, i++) {
111 if (i == selected_index) {
112 struct itemstack *stack = (*ptr)->element;
114 if (stack->item->on_use && stack->item->on_use(stack))
115 decrease_item_count(ptr, stack);
122 static void handle_arrow()
124 char c = fgetc(stdin);
126 char dir = fgetc(stdin);
130 for (struct list *ptr = player_inventory.stacks; ptr != NULL; ptr = ptr->next)
140 if (selected_index < 0)
141 selected_index = count - 1;
146 if (selected_index >= count)
156 static void render_inventory(struct winsize ws)
160 printf(" \e[1mInventory\e[21m\n");
162 set_color(gray, false);
165 for (struct list *ptr = player_inventory.stacks; ptr != NULL; ptr = ptr->next, i++) {
166 struct itemstack *stack = ptr->element;
168 if (i == selected_index) {
170 set_color(gray, false);
175 printf("%s", stack->item->name);
177 if (stack->count > 1) {
178 set_color(darkgray, false);
179 printf(" (x%u)", stack->count);
180 set_color(gray, false);
187 __attribute__ ((constructor)) static void init()
189 gray = get_color("#9E9E9E");
190 darkgray = get_color("#555555");
192 register_render_component(&render_inventory);
194 register_input_handler('\033', (struct input_handler) {
195 .run_if_dead = false,
196 .callback = &handle_arrow,
199 register_input_handler('\n', (struct input_handler) {
200 .run_if_dead = false,
201 .callback = &handle_enter,