]> 4ch.mooo.com Git - 16.git/blob - src/lib/16_sprite.c
wwwwwwwwwwwwwwwwwwwwwwwwwwww vrstest.c works wwwwww yakui-lover wwwww look! wwww
[16.git] / src / lib / 16_sprite.c
1 #include "src/lib/16_sprite.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 *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                 printf("%d, ", iter_id);
76         }
77 }
78
79
80 void animate_spri(struct sprite *spri)
81 {
82         // Events go here
83         
84         // Draw sprite
85         get_vrl_by_id(spri->spritesheet, spri->curr_spri_id, spri->sprite_vrl_cont);
86         draw_vrl1_vgax_modex(   spri->x, spri->y, 
87                                 spri->sprite_vrl_cont->vrl_header, spri->sprite_vrl_cont->line_offsets, 
88                                 spri->sprite_vrl_cont->buffer + sizeof(struct vrl1_vgax_header), 
89                                 spri->sprite_vrl_cont->data_size);
90
91         // Depending on delay, update indices
92         switch(spri->delay){
93                 // Delay = 0 means that sprite should loop. Nothing to change here
94                 case 0:
95                         break;
96
97                 // Delay = 1 means that on next time unit sprite should be changed
98                 case 1:
99                         spri->curr_anim_spri++;
100
101                         // If we hit the end of an animation sequence, restart it
102                         if(!(spri->curr_spri_id = spri->curr_anim_list[spri->curr_anim_spri].sprite_id)){
103                                 spri->curr_anim_spri = 0;
104                                 spri->curr_spri_id = spri->curr_anim_list[spri->curr_anim_spri].sprite_id;
105                         }
106                         spri->delay = spri->curr_anim_list[spri->curr_anim_spri].delay;
107
108                 // Delay > 1 means that we should not change sprite yet. Decrease delay
109                 default:
110                         spri->delay--;
111                         break;
112         }
113 }