]> 4ch.mooo.com Git - 16.git/blob - src/lib/16_sprit.c
See WHAT_WAS_CHANGED for details
[16.git] / src / lib / 16_sprit.c
1 #include "src/lib/16_sprit.h"\r
2 \r
3 char* get_curr_anim_name(struct sprite *spri)\r
4 {\r
5         // Retrive animation name list\r
6         struct vrs_header huge *vrs = spri->spritesheet->vrs_hdr;\r
7         uint32_t huge *anim_names_offsets =     (uint32_t huge *)\r
8                                                 ((byte huge *)vrs +\r
9                                                  vrs->offset_table[VRS_HEADER_OFFSET_ANIMATION_NAME_LIST]);\r
10 \r
11         return (char *)(vrs + anim_names_offsets[spri->curr_anim]);\r
12 }\r
13 \r
14 void init_anim(struct sprite *spri, int anim_index)\r
15 {\r
16         struct vrs_header huge *vrs = spri->spritesheet->vrs_hdr;\r
17         uint32_t huge *anim_lists_offsets =     (uint32_t huge *)\r
18                                                 ((byte huge *)vrs +\r
19                                                  vrs->offset_table[VRS_HEADER_OFFSET_ANIMATION_LIST]);\r
20         struct vrs_animation_list_entry_t huge *anim_list =     (struct vrs_animation_list_entry_t huge *)\r
21                                                                 ((byte huge *)vrs +\r
22                                                                  anim_lists_offsets[anim_index]);\r
23 \r
24         // Upon new animation, start from the first sprite in it\r
25         spri->curr_anim = anim_index;\r
26         spri->curr_anim_spri = 0;\r
27         spri->curr_spri_id = anim_list[0].sprite_id;\r
28         spri->delay = anim_list[0].delay;\r
29 \r
30         spri->curr_anim_list = anim_list;\r
31 }\r
32 \r
33 \r
34 int set_anim_by_id(struct sprite *spri, int anim_id)\r
35 {\r
36         int new_anim_index = 0;\r
37         int iter_id;\r
38         struct vrs_header huge *vrs = spri->spritesheet->vrs_hdr;\r
39         // Retruve animation ids list\r
40         uint16_t huge *anim_ids =       (uint16_t huge *)\r
41                                         ((byte huge *)vrs +\r
42                                          vrs->offset_table[VRS_HEADER_OFFSET_ANIMATION_ID_LIST]);\r
43 \r
44         // Loop through animation id untill match or end of list\r
45         while(iter_id = anim_ids[new_anim_index])\r
46         {\r
47                 // Return on successful match\r
48                 if (iter_id == anim_id)\r
49                 {\r
50                         init_anim(spri, new_anim_index);\r
51                         return 0;\r
52                 }\r
53                 new_anim_index++;\r
54         }\r
55         return -1;\r
56 }\r
57 \r
58 void print_anim_ids(struct sprite *spri)\r
59 {\r
60         int new_anim_index = 0;\r
61         int iter_id;\r
62         struct vrs_header huge *vrs = spri->spritesheet->vrs_hdr;\r
63         // Retruve animation ids list\r
64         uint16_t huge *anim_ids =       (uint16_t huge *)\r
65                                         ((byte huge *)vrs +\r
66                                          vrs->offset_table[VRS_HEADER_OFFSET_ANIMATION_ID_LIST]);\r
67 \r
68         if(!anim_ids[new_anim_index])\r
69                 return;\r
70         // Loop through animation id untill match or end of list\r
71         while(iter_id = anim_ids[new_anim_index])\r
72         {\r
73                 printf("s%d ", iter_id);\r
74                 new_anim_index++;\r
75         }\r
76 }\r
77 \r
78 \r
79 void animate_spri(struct sprite *spri)\r
80 {\r
81         int i;\r
82         // Events go here\r
83 \r
84         // Draw sprite\r
85         i = get_vrl_by_id(spri->spritesheet, spri->curr_spri_id, spri->sprite_vrl_cont);\r
86         if(i < 0)\r
87         {\r
88                 printf("Error retriving required sprite");\r
89                 exit(-1);\r
90         }\r
91         draw_vrl1_vgax_modex(   spri->x, spri->y,\r
92                                 spri->sprite_vrl_cont->vrl_header, spri->sprite_vrl_cont->line_offsets,\r
93                                 spri->sprite_vrl_cont->buffer + sizeof(struct vrl1_vgax_header),\r
94                                 spri->sprite_vrl_cont->data_size);\r
95 \r
96         // Depending on delay, update indices\r
97         switch(spri->delay){\r
98                 // Delay = 0 means that sprite should loop. Nothing to change here\r
99                 case 0:\r
100                         break;\r
101 \r
102                 // Delay = 1 means that on next time unit sprite should be changed\r
103                 case 1:\r
104                         spri->curr_anim_spri++;\r
105 \r
106                         // If we hit the end of an animation sequence, restart it\r
107                         if(!(spri->curr_spri_id = spri->curr_anim_list[spri->curr_anim_spri].sprite_id)){\r
108                                 spri->curr_anim_spri = 0;\r
109                                 spri->curr_spri_id = spri->curr_anim_list[spri->curr_anim_spri].sprite_id;\r
110                         }\r
111                         spri->delay = spri->curr_anim_list[spri->curr_anim_spri].delay;\r
112 \r
113                 // Delay > 1 means that we should not change sprite yet. Decrease delay\r
114                 default:\r
115                         spri->delay--;\r
116                         break;\r
117         }\r
118 }\r