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