diff options
Diffstat (limited to 'src/main.c')
-rw-r--r-- | src/main.c | 281 |
1 files changed, 202 insertions, 79 deletions
@@ -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; |