]> git.lizzy.rs Git - dragonblocks_alpha.git/blob - src/common/item.c
Rework structure
[dragonblocks_alpha.git] / src / common / item.c
1 #include <stdlib.h>
2 #include "common/item.h"
3
4 void item_stack_initialize(ItemStack *stack)
5 {
6         stack->type = ITEM_NONE;
7         stack->count = 1;
8         stack->data = NULL;
9
10         if (item_def[stack->type].callbacks.create)
11                 item_def[stack->type].callbacks.create(stack);
12 }
13
14 void item_stack_destroy(ItemStack *stack)
15 {
16         if (item_def[stack->type].callbacks.delete)
17                 item_def[stack->type].callbacks.delete(stack);
18
19         if (stack->data) {
20                 free(stack->data);
21                 stack->data = NULL;
22         }
23 }
24
25 void item_stack_set(ItemStack *stack, ItemType type, u32 count, Blob buffer)
26 {
27         item_stack_destroy(stack);
28
29         stack->type = type;
30         stack->count = count;
31         stack->data = item_def[stack->type].data_size > 0 ?
32                 malloc(item_def[stack->type].data_size) : NULL;
33
34         if (item_def[stack->type].callbacks.create)
35                 item_def[stack->type].callbacks.create(stack);
36
37         if (item_def[stack->type].callbacks.deserialize)
38                 item_def[stack->type].callbacks.deserialize(&buffer, stack->data);
39 }
40
41 void item_stack_serialize(ItemStack *stack, SerializedItemStack *serialized)
42 {
43         serialized->type = stack->type;
44         serialized->count = stack->count;
45         serialized->data = (Blob) {0, NULL};
46
47         if (item_def[stack->type].callbacks.serialize)
48                 item_def[stack->type].callbacks.serialize(&serialized->data, stack->data);
49 }
50
51 void item_stack_deserialize(ItemStack *stack, SerializedItemStack *serialized)
52 {
53         ItemType type = serialized->type;
54
55         if (type >= COUNT_ITEM)
56                 type = ITEM_UNKNOWN;
57
58         item_stack_set(stack, type, serialized->count, serialized->data);
59 }
60
61 ItemDef item_def[COUNT_ITEM] = {
62         // unknown
63         {
64                 .stackable = false,
65                 .data_size = 0,
66                 .dig_class = DIG_NONE,
67                 .callbacks = {NULL},
68         },
69         // none
70         {
71                 .stackable = false,
72                 .data_size = 0,
73                 .dig_class = DIG_NONE,
74                 .callbacks = {NULL},
75         },
76         // pickaxe
77         {
78                 .stackable = false,
79                 .data_size = 0,
80                 .dig_class = DIG_STONE,
81                 .callbacks = {NULL},
82         },
83         // axe
84         {
85                 .stackable = false,
86                 .data_size = 0,
87                 .dig_class = DIG_WOOD,
88                 .callbacks = {NULL},
89         },
90         // shovel
91         {
92                 .stackable = false,
93                 .data_size = 0,
94                 .dig_class = DIG_DIRT,
95                 .callbacks = {NULL},
96         },
97 };