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 struct itemstack *buf = make_buffer(&stack, sizeof(struct itemstack));
33 *ptr = add_element(*ptr, buf);
35 if (buf->item->on_create)
36 buf->item->on_create(buf);
41 bool inventory_remove(struct inventory *self, struct itemstack *stack)
43 stack.count = -stack.count;
45 for (struct list **ptr = &self->stacks; *ptr != NULL; ) {
46 struct itemstack *other = (*ptr)->element;
48 if (other->item == stack.item) {
49 stack.count += other->count;
51 if (stack.count > 0) {
52 other->count = stack.count;
55 struct list *next = ptr->next;
59 if (other->item->on_destroy)
60 other->item->on_destroy(other);
78 static void decrease_item_count(struct list **ptr)
80 struct itemstack *stack = (*ptr)->element;
84 if (stack->count == 0) {
85 struct list *next = (*ptr)->next;
87 if (stack->item->on_destroy)
88 stack->item->on_destroy(stack);
100 static struct list **find_item(struct inventory *self, struct item *item)
102 for (struct list **ptr = &self->stacks; *ptr != NULL; ptr = &(*ptr)->next) {
103 struct itemstack *stack = (*ptr)->element;
105 if (stack->item == item)
112 bool inventory_remove(struct inventory *self, struct item *item)
114 struct list **ptr = find_item(self, item);
117 decrease_item_count(ptr);
124 struct itemstack *inventory_find(struct inventory *self, struct item *item)
126 struct list **ptr = find_item(self, item);
127 return ptr ? (*ptr)->element : NULL;
130 static void handle_enter()
134 for (struct list **ptr = &player_inventory.stacks; *ptr != NULL; ptr = &(*ptr)->next, i++) {
135 if (i == selected_index) {
136 struct itemstack *stack = (*ptr)->element;
138 if (stack->item->on_use && stack->item->on_use(stack))
139 decrease_item_count(ptr);
146 static void handle_arrow()
148 char c = fgetc(stdin);
150 char dir = fgetc(stdin);
154 for (struct list *ptr = player_inventory.stacks; ptr != NULL; ptr = ptr->next)
164 if (selected_index < 0)
165 selected_index = count - 1;
170 if (selected_index >= count)
180 static void render_inventory(struct winsize ws)
184 printf(" \e[1mInventory\e[21m\n");
186 set_color(gray, false);
189 for (struct list *ptr = player_inventory.stacks; ptr != NULL; ptr = ptr->next, i++) {
190 struct itemstack *stack = ptr->element;
192 if (i == selected_index) {
194 set_color(gray, false);
199 printf("%s", stack->item->name);
201 if (stack->count > 1) {
202 set_color(darkgray, false);
203 printf(" (x%u)", stack->count);
204 set_color(gray, false);
211 __attribute__ ((constructor)) static void init()
213 gray = get_color("#9E9E9E");
214 darkgray = get_color("#555555");
216 register_render_component(&render_inventory);
218 register_input_handler('\033', (struct input_handler) {
219 .run_if_dead = false,
220 .callback = &handle_arrow,
223 register_input_handler('\n', (struct input_handler) {
224 .run_if_dead = false,
225 .callback = &handle_enter,