summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-04-24 16:09:29 +0200
committerBad Diode <bd@badd10de.dev>2021-04-24 16:09:29 +0200
commita910bccb3e2f70865d4a2f4d2991b864a97bebed (patch)
treef30bcc5394765a8a2aa49ae5e15a0bfd4a77e419
parent4c39f45406b12ab536ad22275eb160a368f380ff (diff)
downloadgba-experiments-a910bccb3e2f70865d4a2f4d2991b864a97bebed.tar.gz
gba-experiments-a910bccb3e2f70865d4a2f4d2991b864a97bebed.zip
Add the rest of the buttons
-rw-r--r--src/gba-buttons.c127
-rw-r--r--src/main.c281
2 files changed, 328 insertions, 80 deletions
diff --git a/src/gba-buttons.c b/src/gba-buttons.c
index 5a2a6e2..7f13676 100644
--- a/src/gba-buttons.c
+++ b/src/gba-buttons.c
@@ -24,7 +24,7 @@ u32 gba_btn_l_data[] = {
24}; 24};
25 25
26u32 gba_btn_r_data[] = { 26u32 gba_btn_r_data[] = {
27 0xff018181, 0x818101ff, 0x3f408182, 0x818280ff, 27 0xff01c141, 0xc14101ff, 0x3f408081, 0x808180ff,
28}; 28};
29 29
30u32 gba_btn_ab_shadow_data[] = { 30u32 gba_btn_ab_shadow_data[] = {
@@ -52,6 +52,16 @@ u32 gba_btn_startselect_data[] = {
52 0x000000f8, 0x04f80000, 0x0000001f, 0x201f0000, 52 0x000000f8, 0x04f80000, 0x0000001f, 0x201f0000,
53}; 53};
54 54
55u32 gba_btn_start_text[] = {
56 0x00008080, 0x00800000, 0x0000bb91, 0x92930000,
57 0x00009b2a, 0x1b2a0000, 0x00000301, 0x01010000,
58};
59
60u32 gba_btn_select_text[] = {
61 0x0000e060, 0x80e00000, 0x00002e26, 0x22ee0000,
62 0x0000ee26, 0x22ee0000, 0x00000e04, 0x04040000,
63};
64
55u32 gba_btn_fx_downup[] = { 65u32 gba_btn_fx_downup[] = {
56 0x00000000, 0x00000000, 0x04000000, 0x00000000, 66 0x00000000, 0x00000000, 0x04000000, 0x00000000,
57 0x40000100, 0x00000000, 0x00000000, 0x00000000, 67 0x40000100, 0x00000000, 0x00000000, 0x00000000,
@@ -74,6 +84,55 @@ u32 gba_btn_fx_leftright[] = {
74 0x40000000, 0x00000000, 0x00001000, 0x00000000, 84 0x40000000, 0x00000000, 0x00001000, 0x00000000,
75}; 85};
76 86
87u32 gba_btn_fx_lr[] = {
88 0x00000000, 0x00000000, 0x00000000, 0x00000000,
89 0x00000000, 0x00000000, 0x00008004, 0x00000002,
90 0x00000000, 0x00000000, 0x00000000, 0x00000000,
91 0x00000000, 0x00000080, 0x80810200, 0x00000001,
92 0x00000000, 0x00000000, 0x00000000, 0x00000080,
93 0x80000000, 0x000000c0, 0x80010000, 0x00000000,
94 0x00000000, 0x00000000, 0x00000000, 0x00000080,
95 0x80000000, 0x00000020, 0x00000000, 0x00000000,
96};
97
98u32 gba_btn_fx_ab[] = {
99 0x00000000, 0x00408000, 0x00000080, 0x80800001,
100 0x00000000, 0x00000080, 0x00000000, 0x00020100,
101 0x00000000, 0x00000000, 0x00000000, 0x00000000,
102 0x00000000, 0x00000000, 0x00000000, 0x00000000,
103 0x38000000, 0x00000080, 0x00000000, 0x00000000,
104 0x00000000, 0x00000000, 0x1c000000, 0x00000001,
105 0x40200000, 0x00000000, 0x00008080, 0x80000000,
106 0x00000000, 0x00000000, 0x02040000, 0x00000000,
107 0x00000000, 0x20400000, 0x00808000, 0x00000000,
108 0x00000000, 0x00000000, 0x00000000, 0x04020000,
109 0x00000000, 0x00000000, 0x00000000, 0x00000000,
110 0x00000000, 0x00000000, 0x00000000, 0x00000000,
111 0x0c000000, 0x00000000, 0x00000000, 0x00000000,
112 0x00000000, 0x00000000, 0x30000000, 0x00000000,
113 0x00201000, 0x00000000, 0x00000000, 0x80800000,
114 0x00000000, 0x00000000, 0x00040800, 0x00000000,
115 0x00000000, 0x20000000, 0x00800000, 0x00000000,
116 0x00000000, 0x00000000, 0x00000000, 0x04000000,
117 0x00000000, 0x00000000, 0x00000000, 0x00000000,
118 0x00000000, 0x00000000, 0x00000000, 0x00000000,
119 0x04000000, 0x00000000, 0x00000000, 0x00000000,
120 0x00000000, 0x00000000, 0x20000000, 0x00000000,
121 0x00001000, 0x00000000, 0x00000000, 0x00800000,
122 0x00000000, 0x00000000, 0x00000800, 0x00000000,
123};
124
125u32 gba_btn_fx_startselect[] = {
126 0x00000000, 0x00000000, 0x00000000, 0x10000002,
127 0x00000001, 0x10000080, 0x00000000, 0x00000000,
128 0x00000000, 0x00000080, 0x00000408, 0x00000001,
129 0x00014120, 0x00000000, 0x00000000, 0x00000003,
130 0x00000000, 0x000000c0, 0x00020400, 0x00000000,
131 0x01814000, 0x00000000, 0x00000000, 0x00000006,
132 0x00000000, 0x00000040, 0x00020000, 0x00000000,
133 0x01800000, 0x00000000, 0x00000000, 0x00000004,
134};
135
77typedef struct SpriteAnimation { 136typedef struct SpriteAnimation {
78 size_t *tile_offsets; 137 size_t *tile_offsets;
79 size_t n_frames; 138 size_t n_frames;
@@ -152,3 +211,69 @@ AnimationEntry *btn_animation[] = {
152 {0, 0, 12, 1}, 211 {0, 0, 12, 1},
153 }, 212 },
154}; 213};
214
215AnimationEntry *btn_animation_ab[] = {
216 &(AnimationEntry[]){
217 {0, 0, 0, 0},
218 {0, 0, 0, 0},
219 {0, 1, 0, 0},
220 {0, 1, 0, 0},
221 {0, 2, 0, 0},
222 {0, 2, 0, 0},
223 {0, 2, 0, 0},
224 {0, 2, 0, 0},
225 },
226 &(AnimationEntry[]){
227 {0, 0, 0, 0},
228 {0, 0, 0, 0},
229 {0, 0, 0, 0},
230 {0, 0, 0, 0},
231 {0, 0, 0, 0},
232 {0, 0, 0, 0},
233 {0, 0, 0, 0},
234 {0, 0, 0, 0},
235 },
236 &(AnimationEntry[]){
237 {0, 0, 0, 1},
238 {0, 0, 0, 1},
239 {0, 0, 0, 0},
240 {0, 0, 0, 0},
241 {0, 0, 16, 0},
242 {0, 0, 16, 0},
243 {0, 0, 32, 0},
244 {0, 0, 32, 1},
245 },
246};
247
248AnimationEntry *btn_animation_startselect[] = {
249 &(AnimationEntry[]){
250 {0, 0, 0, 0},
251 {0, 0, 0, 0},
252 {0, 0, 2, 0},
253 {0, 0, 2, 0},
254 {0, 0, 2, 0},
255 {0, 0, 2, 0},
256 {0, 0, 2, 0},
257 {0, 0, 2, 0},
258 },
259 &(AnimationEntry[]){
260 {0, 0, 0, 0},
261 {0, 0, 0, 0},
262 {0, 0, 0, 0},
263 {0, 0, 0, 0},
264 {0, 0, 0, 0},
265 {0, 0, 0, 0},
266 {0, 0, 0, 0},
267 {0, 0, 0, 0},
268 },
269 &(AnimationEntry[]){
270 {0, 0, 0, 1},
271 {0, 0, 4, 0},
272 {0, 0, 4, 0},
273 {0, 0, 8, 0},
274 {0, 0, 8, 0},
275 {0, 0, 12, 0},
276 {0, 0, 12, 0},
277 {0, 0, 12, 1},
278 },
279};
diff --git a/src/main.c b/src/main.c
index 8008c32..2876e18 100644
--- a/src/main.c
+++ b/src/main.c
@@ -688,49 +688,6 @@ int main(void) {
688 // Initialize the A/B button sprites. 688 // Initialize the A/B button sprites.
689 int buttons_x = SCREEN_WIDTH / 2; 689 int buttons_x = SCREEN_WIDTH / 2;
690 int buttons_y = SCREEN_HEIGHT / 2; 690 int buttons_y = SCREEN_HEIGHT / 2;
691 ButtonSprite btn_b = {
692 .id = load_packed_sprite_data(&gba_btn_b_data, 4, 1),
693 .x = buttons_x + 32,
694 .y = buttons_y + 32,
695 .frame = 0,
696 .state = BTN_STATE_IDLE,
697 };
698 OBJ_ATTR_0(btn_b.id) = btn_b.y;
699 OBJ_ATTR_1(btn_b.id) = btn_b.x | (1 << 0xE);
700 OBJ_ATTR_2(btn_b.id) = sprites[btn_b.id].tile_start;
701
702 ButtonSprite btn_a = {
703 .id = load_packed_sprite_data(&gba_btn_a_data, 4, 1),
704 .x = buttons_x + 32 + 20,
705 .y = buttons_y + 32 - 16,
706 .frame = 0,
707 .state = BTN_STATE_IDLE,
708 };
709 OBJ_ATTR_0(btn_a.id) = btn_a.y;
710 OBJ_ATTR_1(btn_a.id) = btn_a.x | (1 << 0xE);
711 OBJ_ATTR_2(btn_a.id) = sprites[btn_a.id].tile_start;
712
713 ButtonSprite btn_start = {
714 .id = load_packed_sprite_data(&gba_btn_startselect_data, 2, 2),
715 .x = buttons_x - 10,
716 .y = buttons_y + 40,
717 .frame = 0,
718 .state = BTN_STATE_IDLE,
719 };
720 OBJ_ATTR_0(btn_start.id) = btn_start.y | (1 << 0xE);
721 OBJ_ATTR_1(btn_start.id) = btn_start.x;
722 OBJ_ATTR_2(btn_start.id) = sprites[btn_start.id].tile_start;
723
724 ButtonSprite btn_select = {
725 .id = load_packed_sprite_data(&gba_btn_startselect_data, 2, 2),
726 .x = buttons_x - 32,
727 .y = buttons_y + 40,
728 .frame = 0,
729 .state = BTN_STATE_IDLE,
730 };
731 OBJ_ATTR_0(btn_select.id) = btn_select.y | (1 << 0xE);
732 OBJ_ATTR_1(btn_select.id) = btn_select.x;
733 OBJ_ATTR_2(btn_select.id) = sprites[btn_select.id].tile_start;
734 691
735 MultiSprite buttons[] = { 692 MultiSprite buttons[] = {
736 // DOWN. 693 // DOWN.
@@ -918,7 +875,7 @@ int main(void) {
918 .x = buttons_x - 64 - 28, 875 .x = buttons_x - 64 - 28,
919 .y = buttons_y - 32 - 20, 876 .y = buttons_y - 32 - 20,
920 .data = &gba_btn_l_data, 877 .data = &gba_btn_l_data,
921 .n_tiles = 4, 878 .n_tiles = 2,
922 .frames = 1, 879 .frames = 1,
923 .obj_attr_0 = OBJ_SHAPE_WIDE, 880 .obj_attr_0 = OBJ_SHAPE_WIDE,
924 .obj_attr_1 = OBJ_SIZE_SMALL, 881 .obj_attr_1 = OBJ_SIZE_SMALL,
@@ -961,7 +918,7 @@ int main(void) {
961 .x = buttons_x + 32 + 20 + 24, 918 .x = buttons_x + 32 + 20 + 24,
962 .y = buttons_y - 32 - 20, 919 .y = buttons_y - 32 - 20,
963 .data = &gba_btn_r_data, 920 .data = &gba_btn_r_data,
964 .n_tiles = 4, 921 .n_tiles = 2,
965 .frames = 1, 922 .frames = 1,
966 .obj_attr_0 = OBJ_SHAPE_WIDE, 923 .obj_attr_0 = OBJ_SHAPE_WIDE,
967 .obj_attr_1 = OBJ_SIZE_SMALL, 924 .obj_attr_1 = OBJ_SIZE_SMALL,
@@ -991,6 +948,178 @@ int main(void) {
991 }, 948 },
992 }, 949 },
993 }, 950 },
951 // A.
952 {
953 .frame = 0,
954 .n_obj = 3,
955 .n_frames = 8,
956 .state = BTN_STATE_RELEASED,
957 .animations = &btn_animation_ab,
958 .sprites = &(ObjState[]){
959 {
960 .id = 0,
961 .x = buttons_x + 32 + 20 + 20,
962 .y = buttons_y + 32 - 16,
963 .data = &gba_btn_a_data,
964 .n_tiles = 4,
965 .frames = 1,
966 .obj_attr_0 = OBJ_SHAPE_SQUARE,
967 .obj_attr_1 = OBJ_SIZE_MID,
968 .obj_attr_2 = 0
969 },
970 {
971 .id = 0,
972 .x = buttons_x + 32 + 20 + 20,
973 .y = buttons_y + 32 - 16 + 8,
974 .data = &gba_btn_ab_shadow_data,
975 .n_tiles = 2,
976 .frames = 1,
977 .obj_attr_0 = OBJ_SHAPE_WIDE,
978 .obj_attr_1 = OBJ_SIZE_SMALL,
979 .obj_attr_2 = 0
980 },
981 {
982 .id = 0,
983 .x = buttons_x + 32 + 19 - 7 + 20,
984 .y = buttons_y + 32 - 23,
985 .data = &gba_btn_fx_ab,
986 .n_tiles = 16,
987 .frames = 3,
988 .obj_attr_0 = OBJ_SHAPE_SQUARE,
989 .obj_attr_1 = OBJ_SIZE_BIG,
990 .obj_attr_2 = 0
991 },
992 },
993 },
994 // B.
995 {
996 .frame = 0,
997 .n_obj = 3,
998 .n_frames = 8,
999 .state = BTN_STATE_RELEASED,
1000 .animations = &btn_animation_ab,
1001 .sprites = &(ObjState[]){
1002 {
1003 .id = 0,
1004 .x = buttons_x + 32 + 20,
1005 .y = buttons_y + 32,
1006 .data = &gba_btn_b_data,
1007 .n_tiles = 4,
1008 .frames = 1,
1009 .obj_attr_0 = OBJ_SHAPE_SQUARE,
1010 .obj_attr_1 = OBJ_SIZE_MID,
1011 .obj_attr_2 = 0
1012 },
1013 {
1014 .id = 0,
1015 .x = buttons_x + 32 + 20,
1016 .y = buttons_y + 32 + 8,
1017 .data = &gba_btn_ab_shadow_data,
1018 .n_tiles = 2,
1019 .frames = 1,
1020 .obj_attr_0 = OBJ_SHAPE_WIDE,
1021 .obj_attr_1 = OBJ_SIZE_SMALL,
1022 .obj_attr_2 = 0
1023 },
1024 {
1025 .id = 0,
1026 .x = buttons_x + 32 - 8 + 20,
1027 .y = buttons_y + 33 + 8 - 16,
1028 .data = &gba_btn_fx_ab,
1029 .n_tiles = 16,
1030 .frames = 3,
1031 .obj_attr_0 = OBJ_SHAPE_SQUARE,
1032 .obj_attr_1 = OBJ_SIZE_BIG,
1033 .obj_attr_2 = 0
1034 },
1035 },
1036 },
1037 // START.
1038 {
1039 .frame = 0,
1040 .n_obj = 3,
1041 .n_frames = 8,
1042 .state = BTN_STATE_RELEASED,
1043 .animations = &btn_animation_startselect,
1044 .sprites = &(ObjState[]){
1045 {
1046 .id = 0,
1047 .x = buttons_x - 10 - 14,
1048 .y = buttons_y + 40 + 10,
1049 .data = &gba_btn_startselect_data,
1050 .n_tiles = 2,
1051 .frames = 2,
1052 .obj_attr_0 = OBJ_SHAPE_WIDE,
1053 .obj_attr_1 = OBJ_SIZE_SMALL,
1054 .obj_attr_2 = 0
1055 },
1056 {
1057 .id = 0,
1058 .x = buttons_x - 18 - 14,
1059 .y = buttons_y + 46 + 10,
1060 .data = &gba_btn_start_text,
1061 .n_tiles = 4,
1062 .frames = 1,
1063 .obj_attr_0 = OBJ_SHAPE_WIDE,
1064 .obj_attr_1 = OBJ_SIZE_MID,
1065 .obj_attr_2 = 0
1066 },
1067 {
1068 .id = 0,
1069 .x = buttons_x - 19 - 14,
1070 .y = buttons_y + 37 + 10,
1071 .data = &gba_btn_fx_startselect,
1072 .n_tiles = 4,
1073 .frames = 4,
1074 .obj_attr_0 = OBJ_SHAPE_WIDE,
1075 .obj_attr_1 = OBJ_SIZE_MID,
1076 .obj_attr_2 = 0
1077 },
1078 },
1079 },
1080 // SELECT.
1081 {
1082 .frame = 0,
1083 .n_obj = 3,
1084 .n_frames = 8,
1085 .state = BTN_STATE_RELEASED,
1086 .animations = &btn_animation_startselect,
1087 .sprites = &(ObjState[]){
1088 {
1089 .id = 0,
1090 .x = buttons_x - 10 + 26 - 14,
1091 .y = buttons_y + 40 + 10,
1092 .data = &gba_btn_startselect_data,
1093 .n_tiles = 2,
1094 .frames = 2,
1095 .obj_attr_0 = OBJ_SHAPE_WIDE,
1096 .obj_attr_1 = OBJ_SIZE_SMALL,
1097 .obj_attr_2 = 0
1098 },
1099 {
1100 .id = 0,
1101 .x = buttons_x - 18 + 26 - 14,
1102 .y = buttons_y + 46 + 10,
1103 .data = &gba_btn_select_text,
1104 .n_tiles = 4,
1105 .frames = 1,
1106 .obj_attr_0 = OBJ_SHAPE_WIDE,
1107 .obj_attr_1 = OBJ_SIZE_MID,
1108 .obj_attr_2 = 0
1109 },
1110 {
1111 .id = 0,
1112 .x = buttons_x - 19 + 26 - 14,
1113 .y = buttons_y + 37 + 10,
1114 .data = &gba_btn_fx_startselect,
1115 .n_tiles = 4,
1116 .frames = 4,
1117 .obj_attr_0 = OBJ_SHAPE_WIDE,
1118 .obj_attr_1 = OBJ_SIZE_MID,
1119 .obj_attr_2 = 0
1120 },
1121 },
1122 },
994 }; 1123 };
995 for (size_t i = 0; i < sizeof(buttons) / sizeof(MultiSprite); ++i) { 1124 for (size_t i = 0; i < sizeof(buttons) / sizeof(MultiSprite); ++i) {
996 init_button_sprite(&buttons[i]); 1125 init_button_sprite(&buttons[i]);
@@ -1003,40 +1132,6 @@ int main(void) {
1003 wait_vsync(); 1132 wait_vsync();
1004 poll_keys(); 1133 poll_keys();
1005 1134
1006 // if (key_pressed(KEY_B)) {
1007 // btn_b.frame = 0;
1008 // btn_b.state = BTN_STATE_PRESSED;
1009 // } else if (key_hold(KEY_B)) {
1010 // if (btn_b.frame < btn_b.n_frames - 1) {
1011 // btn_b.frame++;
1012 // }
1013 // } else {
1014 // // Finish the animation and reset idle state.
1015 // if (btn_b.frame > 0 && btn_b.frame < btn_b.n_frames - 1) {
1016 // btn_b.frame++;
1017 // } else {
1018 // btn_b.frame = 0;
1019 // btn_b.state = BTN_STATE_IDLE;
1020 // }
1021 // }
1022 // if (key_pressed(KEY_A)) {
1023 // btn_a.frame = 0;
1024 // btn_a.state = BTN_STATE_PRESSED;
1025 // } else if (key_hold(KEY_A)) {
1026 // size_t n_frames = animation_states[btn_a.state]->n_frames;
1027 // if (btn_a.frame < n_frames - 1) {
1028 // btn_a.frame++;
1029 // }
1030 // } else {
1031 // // Finish the animation and reset idle state.
1032 // size_t n_frames = animation_states[btn_a.state]->n_frames;
1033 // if (btn_a.frame > 0 && btn_a.frame < n_frames - 1) {
1034 // btn_a.frame++;
1035 // } else {
1036 // btn_a.frame = 0;
1037 // btn_a.state = BTN_STATE_IDLE;
1038 // }
1039 // }
1040 if (key_pressed(KEY_DOWN)) { 1135 if (key_pressed(KEY_DOWN)) {
1041 buttons[0].state = BTN_STATE_PRESSED; 1136 buttons[0].state = BTN_STATE_PRESSED;
1042 } else if (key_hold(KEY_DOWN)) { 1137 } else if (key_hold(KEY_DOWN)) {
@@ -1079,6 +1174,34 @@ int main(void) {
1079 } else { 1174 } else {
1080 buttons[5].state = BTN_STATE_RELEASED; 1175 buttons[5].state = BTN_STATE_RELEASED;
1081 } 1176 }
1177 if (key_pressed(KEY_A)) {
1178 buttons[6].state = BTN_STATE_PRESSED;
1179 } else if (key_hold(KEY_A)) {
1180 buttons[6].state = BTN_STATE_HOLD;
1181 } else {
1182 buttons[6].state = BTN_STATE_RELEASED;
1183 }
1184 if (key_pressed(KEY_B)) {
1185 buttons[7].state = BTN_STATE_PRESSED;
1186 } else if (key_hold(KEY_B)) {
1187 buttons[7].state = BTN_STATE_HOLD;
1188 } else {
1189 buttons[7].state = BTN_STATE_RELEASED;
1190 }
1191 if (key_pressed(KEY_START)) {
1192 buttons[8].state = BTN_STATE_PRESSED;
1193 } else if (key_hold(KEY_START)) {
1194 buttons[8].state = BTN_STATE_HOLD;
1195 } else {
1196 buttons[8].state = BTN_STATE_RELEASED;
1197 }
1198 if (key_pressed(KEY_SELECT)) {
1199 buttons[9].state = BTN_STATE_PRESSED;
1200 } else if (key_hold(KEY_SELECT)) {
1201 buttons[9].state = BTN_STATE_HOLD;
1202 } else {
1203 buttons[9].state = BTN_STATE_RELEASED;
1204 }
1082 1205
1083 if (key_hold(KEY_DOWN)) { 1206 if (key_hold(KEY_DOWN)) {
1084 y += 3; 1207 y += 3;