summaryrefslogtreecommitdiffstats
path: root/src/gba-buttons.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-04-26 11:11:36 +0200
committerBad Diode <bd@badd10de.dev>2021-04-26 11:11:36 +0200
commit24887f28c3eb6d67a7c1a0803520b3fb728ee4f3 (patch)
tree3816d8f7f4e1d3d6c4bb6caf084cbb06d93e941c /src/gba-buttons.c
parent0f16e5bfb1738330a33b300067f86d363fd250bf (diff)
downloadgba-experiments-24887f28c3eb6d67a7c1a0803520b3fb728ee4f3.tar.gz
gba-experiments-24887f28c3eb6d67a7c1a0803520b3fb728ee4f3.zip
Move code to relevant files for organization
Diffstat (limited to 'src/gba-buttons.c')
-rw-r--r--src/gba-buttons.c602
1 files changed, 597 insertions, 5 deletions
diff --git a/src/gba-buttons.c b/src/gba-buttons.c
index 951b4dc..dd06351 100644
--- a/src/gba-buttons.c
+++ b/src/gba-buttons.c
@@ -1,3 +1,6 @@
1#include "common.h"
2#include "sprites.h"
3
1// 1bpp packed 4// 1bpp packed
2u32 gba_btn_a_data[] = { 5u32 gba_btn_a_data[] = {
3 0xc0300804, 0x844242c2, 0x030c1020, 0x21424243, 6 0xc0300804, 0x844242c2, 0x030c1020, 0x21424243,
@@ -133,11 +136,6 @@ u32 gba_btn_fx_startselect[] = {
133 0x01800000, 0x00000000, 0x00000000, 0x00000004, 136 0x01800000, 0x00000000, 0x00000000, 0x00000004,
134}; 137};
135 138
136typedef struct SpriteAnimation {
137 size_t *tile_offsets;
138 size_t n_frames;
139} SpriteAnimation;
140
141typedef enum {BTN_STATE_IDLE, BTN_STATE_PRESSED, BTN_STATE_RELEASED, BTN_STATE_HOLD} BtnState; 139typedef enum {BTN_STATE_IDLE, BTN_STATE_PRESSED, BTN_STATE_RELEASED, BTN_STATE_HOLD} BtnState;
142 140
143typedef struct AnimationEntry { 141typedef struct AnimationEntry {
@@ -262,3 +260,597 @@ AnimationEntry *btn_animation_startselect[] = {
262 {0, 0, 12, 1}, 260 {0, 0, 12, 1},
263 }, 261 },
264}; 262};
263
264typedef struct ButtonSprite {
265 ObjState *sprites;
266 AnimationEntry **animations;
267 size_t frame;
268 size_t n_obj;
269 size_t n_frames;
270 BtnState state;
271} ButtonSprite;
272
273void
274init_button_sprite(ButtonSprite *btn) {
275 for (size_t i = 0; i < btn->n_obj; ++i) {
276 btn->sprites[i].id = load_packed_sprite_data(
277 btn->sprites[i].data,
278 btn->sprites[i].n_tiles,
279 btn->sprites[i].frames);
280 btn->sprites[i].base_tile = sprites[btn->sprites[i].id].tile_start;
281 }
282}
283
284void
285button_tick(ButtonSprite *btn) {
286 // Nothing to do here.
287 if (btn->state == BTN_STATE_IDLE) {
288 return;
289 }
290
291 // Reset animation state.
292 if (btn->state == BTN_STATE_PRESSED && btn->frame != 0) {
293 btn->frame = 0;
294 }
295
296 // Continue the animation.
297 if (btn->state == BTN_STATE_HOLD || btn->state == BTN_STATE_PRESSED ) {
298 if(btn->frame < btn->n_frames - 1) {
299 btn->frame++;
300 }
301 }
302
303 // Finish the animation and return to idle.
304 if (btn->state == BTN_STATE_RELEASED) {
305 if (btn->frame > 0 && btn->frame < btn->n_frames - 1) {
306 btn->frame++;
307 } else {
308 btn->frame = 0;
309 btn->state = BTN_STATE_IDLE;
310 }
311 }
312 for (size_t i = 0; i < btn->n_obj; ++i) {
313 AnimationEntry anim_frame = btn->animations[i][btn->frame];
314 int x = btn->sprites[i].x + anim_frame.x_offset;
315 int y = btn->sprites[i].y + anim_frame.y_offset;
316 int base_tile = btn->sprites[i].base_tile + anim_frame.tile_offset;
317
318 // Clear the previous x/y coordinate and base tiles.
319 btn->sprites[i].obj_attr_0 &= ~0xFF;
320 btn->sprites[i].obj_attr_1 &= ~0x1FF;
321 btn->sprites[i].obj_attr_2 &= ~0x3FF;
322
323 // Update x/y/tile and hidden state from the animations.
324 btn->sprites[i].obj_attr_0 |= OBJ_Y_COORD(y);
325 btn->sprites[i].obj_attr_1 |= OBJ_X_COORD(x);
326 btn->sprites[i].obj_attr_2 |= base_tile;
327 if (anim_frame.hidden) {
328 btn->sprites[i].obj_attr_0 |= OBJ_HIDDEN;
329 } else {
330 btn->sprites[i].obj_attr_0 &= ~OBJ_HIDDEN;
331 }
332
333 // Update OBJ attributes.
334 OBJ_ATTR_0(btn->sprites[i].id) = btn->sprites[i].obj_attr_0;
335 OBJ_ATTR_1(btn->sprites[i].id) = btn->sprites[i].obj_attr_1;
336 OBJ_ATTR_2(btn->sprites[i].id) = btn->sprites[i].obj_attr_2;
337 }
338}
339
340ButtonSprite buttons[] = {
341 // DOWN.
342 {
343 .frame = 0,
344 .n_obj = 3,
345 .n_frames = 8,
346 .state = BTN_STATE_RELEASED,
347 .animations = &btn_animation,
348 .sprites = &(ObjState[]){
349 {
350 .id = 0,
351 .x = SCREEN_WIDTH / 2 - 64 - 16,
352 .y = SCREEN_HEIGHT / 2 + 29,
353 .data = &gba_btn_updown_data,
354 .n_tiles = 4,
355 .frames = 1,
356 .obj_attr_0 = 0,
357 .obj_attr_1 = OBJ_V_FLIP | OBJ_SIZE_MID,
358 .obj_attr_2 = 0
359 },
360 {
361 .id = 0,
362 .x = SCREEN_WIDTH / 2 - 64 - 16,
363 .y = SCREEN_HEIGHT / 2 + 29 + 11,
364 .data = &gba_btn_down_shadow_data,
365 .n_tiles = 2,
366 .frames = 1,
367 .obj_attr_0 = OBJ_SHAPE_WIDE,
368 .obj_attr_1 = OBJ_SIZE_SMALL,
369 .obj_attr_2 = 0
370 },
371 {
372 .id = 0,
373 .x = SCREEN_WIDTH / 2 - 64 - 16 - 8,
374 .y = SCREEN_HEIGHT / 2 + 29 + 17,
375 .data = &gba_btn_fx_downup,
376 .n_tiles = 4,
377 .frames = 4,
378 .obj_attr_0 = OBJ_SHAPE_WIDE,
379 .obj_attr_1 = OBJ_SIZE_MID,
380 .obj_attr_2 = 0
381 },
382 },
383 },
384 // UP.
385 {
386 .frame = 0,
387 .n_obj = 3,
388 .n_frames = 8,
389 .state = BTN_STATE_RELEASED,
390 .animations = &btn_animation,
391 .sprites = &(ObjState[]){
392 {
393 .id = 0,
394 .x = SCREEN_WIDTH / 2 - 64 - 16,
395 .y = SCREEN_HEIGHT / 2 + 32 - 18,
396 .data = &gba_btn_updown_data,
397 .n_tiles = 4,
398 .frames = 1,
399 .obj_attr_0 = 0,
400 .obj_attr_1 = OBJ_SIZE_MID,
401 .obj_attr_2 = 0
402 },
403 {
404 .id = 0,
405 .x = SCREEN_WIDTH / 2 - 64 - 16,
406 .y = SCREEN_HEIGHT / 2 + 32 - 18 + 7,
407 .data = &gba_btn_up_shadow_data,
408 .n_tiles = 2,
409 .frames = 1,
410 .obj_attr_0 = OBJ_SHAPE_WIDE,
411 .obj_attr_1 = OBJ_SIZE_SMALL,
412 .obj_attr_2 = 0
413 },
414 {
415 .id = 0,
416 .x = SCREEN_WIDTH / 2 - 64 - 16 - 8,
417 .y = SCREEN_HEIGHT / 2 + 32 - 18 - 7,
418 .data = &gba_btn_fx_downup,
419 .n_tiles = 4,
420 .frames = 4,
421 .obj_attr_0 = OBJ_SHAPE_WIDE,
422 .obj_attr_1 = OBJ_V_FLIP | OBJ_SIZE_MID,
423 .obj_attr_2 = 0
424 },
425 },
426 },
427 // LEFT
428 {
429 .frame = 0,
430 .n_obj = 3,
431 .n_frames = 8,
432 .state = BTN_STATE_RELEASED,
433 .animations = &btn_animation,
434 .sprites = &(ObjState[]){
435 {
436 .id = 0,
437 .x = SCREEN_WIDTH / 2 - 64 - 16 - 10,
438 .y = SCREEN_HEIGHT / 2 + 32 - 10,
439 .data = &gba_btn_leftright_data,
440 .n_tiles = 4,
441 .frames = 1,
442 .obj_attr_0 = 0,
443 .obj_attr_1 = OBJ_SIZE_MID,
444 .obj_attr_2 = 0
445 },
446 {
447 .id = 0,
448 .x = SCREEN_WIDTH / 2 - 64 - 16 - 10,
449 .y = SCREEN_HEIGHT / 2 + 32 - 10 + 6,
450 .data = &gba_btn_leftright_shadow_data,
451 .n_tiles = 2,
452 .frames = 1,
453 .obj_attr_0 = OBJ_SHAPE_WIDE,
454 .obj_attr_1 = OBJ_SIZE_SMALL,
455 .obj_attr_2 = 0
456 },
457 {
458 .id = 0,
459 .x = SCREEN_WIDTH / 2 - 64 - 16 - 10 - 6,
460 .y = SCREEN_HEIGHT / 2 + 32 - 10 - 8,
461 .data = &gba_btn_fx_leftright,
462 .n_tiles = 4,
463 .frames = 4,
464 .obj_attr_0 = OBJ_SHAPE_TALL,
465 .obj_attr_1 = OBJ_H_FLIP | OBJ_SIZE_MID,
466 .obj_attr_2 = 0
467 },
468 },
469 },
470 // RIGHT.
471 {
472 .frame = 0,
473 .n_obj = 3,
474 .n_frames = 8,
475 .state = BTN_STATE_RELEASED,
476 .animations = &btn_animation,
477 .sprites = &(ObjState[]){
478 {
479 .id = 0,
480 .x = SCREEN_WIDTH / 2 - 64 - 16 + 11,
481 .y = SCREEN_HEIGHT / 2 + 32 - 10,
482 .data = &gba_btn_leftright_data,
483 .n_tiles = 4,
484 .frames = 1,
485 .obj_attr_0 = 0,
486 .obj_attr_1 = OBJ_H_FLIP | OBJ_SIZE_MID,
487 .obj_attr_2 = 0
488 },
489 {
490 .id = 0,
491 .x = SCREEN_WIDTH / 2 - 64 - 16 + 11,
492 .y = SCREEN_HEIGHT / 2 + 32 - 10 + 6,
493 .data = &gba_btn_leftright_shadow_data,
494 .n_tiles = 2,
495 .frames = 1,
496 .obj_attr_0 = OBJ_SHAPE_WIDE,
497 .obj_attr_1 = OBJ_H_FLIP | OBJ_SIZE_SMALL,
498 .obj_attr_2 = 0
499 },
500 {
501 .id = 0,
502 .x = SCREEN_WIDTH / 2 - 64 - 16 + 11 + 14,
503 .y = SCREEN_HEIGHT / 2 + 32 - 10 - 8,
504 .data = &gba_btn_fx_leftright,
505 .n_tiles = 4,
506 .frames = 4,
507 .obj_attr_0 = OBJ_SHAPE_TALL,
508 .obj_attr_1 = OBJ_SIZE_MID,
509 .obj_attr_2 = 0
510 },
511 },
512 },
513 // L.
514 {
515 .frame = 0,
516 .n_obj = 3,
517 .n_frames = 8,
518 .state = BTN_STATE_RELEASED,
519 .animations = &btn_animation,
520 .sprites = &(ObjState[]){
521 {
522 .id = 0,
523 .x = SCREEN_WIDTH / 2 - 64 - 28,
524 .y = SCREEN_HEIGHT / 2 - 32 - 20,
525 .data = &gba_btn_l_data,
526 .n_tiles = 2,
527 .frames = 1,
528 .obj_attr_0 = OBJ_SHAPE_WIDE,
529 .obj_attr_1 = OBJ_SIZE_SMALL,
530 .obj_attr_2 = 0
531 },
532 {
533 .id = 0,
534 .x = SCREEN_WIDTH / 2 - 64 - 28,
535 .y = SCREEN_HEIGHT / 2 - 32 - 20 + 2,
536 .data = &gba_btn_lr_shadow_data,
537 .n_tiles = 2,
538 .frames = 1,
539 .obj_attr_0 = OBJ_SHAPE_WIDE,
540 .obj_attr_1 = OBJ_SIZE_SMALL,
541 .obj_attr_2 = 0
542 },
543 {
544 .id = 0,
545 .x = SCREEN_WIDTH / 2 - 64 - 28 - 12,
546 .y = SCREEN_HEIGHT / 2 - 32 - 20 - 12,
547 .data = &gba_btn_fx_lr,
548 .n_tiles = 4,
549 .frames = 4,
550 .obj_attr_0 = OBJ_SHAPE_SQUARE,
551 .obj_attr_1 = OBJ_SIZE_MID,
552 .obj_attr_2 = 0
553 },
554 },
555 },
556 // R.
557 {
558 .frame = 0,
559 .n_obj = 3,
560 .n_frames = 8,
561 .state = BTN_STATE_RELEASED,
562 .animations = &btn_animation,
563 .sprites = &(ObjState[]){
564 {
565 .id = 0,
566 .x = SCREEN_WIDTH / 2 + 32 + 20 + 24,
567 .y = SCREEN_HEIGHT / 2 - 32 - 20,
568 .data = &gba_btn_r_data,
569 .n_tiles = 2,
570 .frames = 1,
571 .obj_attr_0 = OBJ_SHAPE_WIDE,
572 .obj_attr_1 = OBJ_SIZE_SMALL,
573 .obj_attr_2 = 0
574 },
575 {
576 .id = 0,
577 .x = SCREEN_WIDTH / 2 + 32 + 20 + 24,
578 .y = SCREEN_HEIGHT / 2 - 32 - 20 + 2,
579 .data = &gba_btn_lr_shadow_data,
580 .n_tiles = 2,
581 .frames = 1,
582 .obj_attr_0 = OBJ_SHAPE_WIDE,
583 .obj_attr_1 = OBJ_SIZE_SMALL,
584 .obj_attr_2 = 0
585 },
586 {
587 .id = 0,
588 .x = SCREEN_WIDTH / 2 + 32 + 20 + 12 + 24,
589 .y = SCREEN_HEIGHT / 2 - 32 - 20 - 12,
590 .data = &gba_btn_fx_lr,
591 .n_tiles = 4,
592 .frames = 4,
593 .obj_attr_0 = OBJ_SHAPE_SQUARE,
594 .obj_attr_1 = OBJ_H_FLIP | OBJ_SIZE_MID,
595 .obj_attr_2 = 0
596 },
597 },
598 },
599 // A.
600 {
601 .frame = 0,
602 .n_obj = 3,
603 .n_frames = 8,
604 .state = BTN_STATE_RELEASED,
605 .animations = &btn_animation_ab,
606 .sprites = &(ObjState[]){
607 {
608 .id = 0,
609 .x = SCREEN_WIDTH / 2 + 32 + 20 + 20,
610 .y = SCREEN_HEIGHT / 2 + 32 - 16,
611 .data = &gba_btn_a_data,
612 .n_tiles = 4,
613 .frames = 1,
614 .obj_attr_0 = OBJ_SHAPE_SQUARE,
615 .obj_attr_1 = OBJ_SIZE_MID,
616 .obj_attr_2 = 0
617 },
618 {
619 .id = 0,
620 .x = SCREEN_WIDTH / 2 + 32 + 20 + 20,
621 .y = SCREEN_HEIGHT / 2 + 32 - 16 + 8,
622 .data = &gba_btn_ab_shadow_data,
623 .n_tiles = 2,
624 .frames = 1,
625 .obj_attr_0 = OBJ_SHAPE_WIDE,
626 .obj_attr_1 = OBJ_SIZE_SMALL,
627 .obj_attr_2 = 0
628 },
629 {
630 .id = 0,
631 .x = SCREEN_WIDTH / 2 + 32 + 19 - 7 + 20,
632 .y = SCREEN_HEIGHT / 2 + 32 - 23,
633 .data = &gba_btn_fx_ab,
634 .n_tiles = 16,
635 .frames = 3,
636 .obj_attr_0 = OBJ_SHAPE_SQUARE,
637 .obj_attr_1 = OBJ_SIZE_BIG,
638 .obj_attr_2 = 0
639 },
640 },
641 },
642 // B.
643 {
644 .frame = 0,
645 .n_obj = 3,
646 .n_frames = 8,
647 .state = BTN_STATE_RELEASED,
648 .animations = &btn_animation_ab,
649 .sprites = &(ObjState[]){
650 {
651 .id = 0,
652 .x = SCREEN_WIDTH / 2 + 32 + 20,
653 .y = SCREEN_HEIGHT / 2 + 32,
654 .data = &gba_btn_b_data,
655 .n_tiles = 4,
656 .frames = 1,
657 .obj_attr_0 = OBJ_SHAPE_SQUARE,
658 .obj_attr_1 = OBJ_SIZE_MID,
659 .obj_attr_2 = 0
660 },
661 {
662 .id = 0,
663 .x = SCREEN_WIDTH / 2 + 32 + 20,
664 .y = SCREEN_HEIGHT / 2 + 32 + 8,
665 .data = &gba_btn_ab_shadow_data,
666 .n_tiles = 2,
667 .frames = 1,
668 .obj_attr_0 = OBJ_SHAPE_WIDE,
669 .obj_attr_1 = OBJ_SIZE_SMALL,
670 .obj_attr_2 = 0
671 },
672 {
673 .id = 0,
674 .x = SCREEN_WIDTH / 2 + 32 - 8 + 20,
675 .y = SCREEN_HEIGHT / 2 + 33 + 8 - 16,
676 .data = &gba_btn_fx_ab,
677 .n_tiles = 16,
678 .frames = 3,
679 .obj_attr_0 = OBJ_SHAPE_SQUARE,
680 .obj_attr_1 = OBJ_SIZE_BIG,
681 .obj_attr_2 = 0
682 },
683 },
684 },
685 // START.
686 {
687 .frame = 0,
688 .n_obj = 3,
689 .n_frames = 8,
690 .state = BTN_STATE_RELEASED,
691 .animations = &btn_animation_startselect,
692 .sprites = &(ObjState[]){
693 {
694 .id = 0,
695 .x = SCREEN_WIDTH / 2 - 10 + 26 - 14,
696 .y = SCREEN_HEIGHT / 2 + 40 + 10,
697 .data = &gba_btn_startselect_data,
698 .n_tiles = 2,
699 .frames = 2,
700 .obj_attr_0 = OBJ_SHAPE_WIDE,
701 .obj_attr_1 = OBJ_SIZE_SMALL,
702 .obj_attr_2 = 0
703 },
704 {
705 .id = 0,
706 .x = SCREEN_WIDTH / 2 - 18 + 26 - 14,
707 .y = SCREEN_HEIGHT / 2 + 46 + 10,
708 .data = &gba_btn_start_text,
709 .n_tiles = 4,
710 .frames = 1,
711 .obj_attr_0 = OBJ_SHAPE_WIDE,
712 .obj_attr_1 = OBJ_SIZE_MID,
713 .obj_attr_2 = 0
714 },
715 {
716 .id = 0,
717 .x = SCREEN_WIDTH / 2 - 19 + 26 - 14,
718 .y = SCREEN_HEIGHT / 2 + 37 + 10,
719 .data = &gba_btn_fx_startselect,
720 .n_tiles = 4,
721 .frames = 4,
722 .obj_attr_0 = OBJ_SHAPE_WIDE,
723 .obj_attr_1 = OBJ_SIZE_MID,
724 .obj_attr_2 = 0
725 },
726 },
727 },
728 // SELECT.
729 {
730 .frame = 0,
731 .n_obj = 3,
732 .n_frames = 8,
733 .state = BTN_STATE_RELEASED,
734 .animations = &btn_animation_startselect,
735 .sprites = &(ObjState[]){
736 {
737 .id = 0,
738 .x = SCREEN_WIDTH / 2 - 10 - 14,
739 .y = SCREEN_HEIGHT / 2 + 40 + 10,
740 .data = &gba_btn_startselect_data,
741 .n_tiles = 2,
742 .frames = 2,
743 .obj_attr_0 = OBJ_SHAPE_WIDE,
744 .obj_attr_1 = OBJ_SIZE_SMALL,
745 .obj_attr_2 = 0
746 },
747 {
748 .id = 0,
749 .x = SCREEN_WIDTH / 2 - 18 - 14,
750 .y = SCREEN_HEIGHT / 2 + 46 + 10,
751 .data = &gba_btn_select_text,
752 .n_tiles = 4,
753 .frames = 1,
754 .obj_attr_0 = OBJ_SHAPE_WIDE,
755 .obj_attr_1 = OBJ_SIZE_MID,
756 .obj_attr_2 = 0
757 },
758 {
759 .id = 0,
760 .x = SCREEN_WIDTH / 2 - 19 - 14,
761 .y = SCREEN_HEIGHT / 2 + 37 + 10,
762 .data = &gba_btn_fx_startselect,
763 .n_tiles = 4,
764 .frames = 4,
765 .obj_attr_0 = OBJ_SHAPE_WIDE,
766 .obj_attr_1 = OBJ_SIZE_MID,
767 .obj_attr_2 = 0
768 },
769 },
770 },
771};
772
773static inline void
774init_button_sprites(void) {
775 for (size_t i = 0; i < sizeof(buttons) / sizeof(ButtonSprite); ++i) {
776 init_button_sprite(&buttons[i]);
777 }
778}
779
780static inline void
781update_button_sprites(void) {
782 if (key_pressed(KEY_DOWN)) {
783 buttons[0].state = BTN_STATE_PRESSED;
784 } else if (key_hold(KEY_DOWN)) {
785 buttons[0].state = BTN_STATE_HOLD;
786 } else {
787 buttons[0].state = BTN_STATE_RELEASED;
788 }
789 if (key_pressed(KEY_UP)) {
790 buttons[1].state = BTN_STATE_PRESSED;
791 } else if (key_hold(KEY_UP)) {
792 buttons[1].state = BTN_STATE_HOLD;
793 } else {
794 buttons[1].state = BTN_STATE_RELEASED;
795 }
796 if (key_pressed(KEY_LEFT)) {
797 buttons[2].state = BTN_STATE_PRESSED;
798 } else if (key_hold(KEY_LEFT)) {
799 buttons[2].state = BTN_STATE_HOLD;
800 } else {
801 buttons[2].state = BTN_STATE_RELEASED;
802 }
803 if (key_pressed(KEY_RIGHT)) {
804 buttons[3].state = BTN_STATE_PRESSED;
805 } else if (key_hold(KEY_RIGHT)) {
806 buttons[3].state = BTN_STATE_HOLD;
807 } else {
808 buttons[3].state = BTN_STATE_RELEASED;
809 }
810 if (key_pressed(KEY_L)) {
811 buttons[4].state = BTN_STATE_PRESSED;
812 } else if (key_hold(KEY_L)) {
813 buttons[4].state = BTN_STATE_HOLD;
814 } else {
815 buttons[4].state = BTN_STATE_RELEASED;
816 }
817 if (key_pressed(KEY_R)) {
818 buttons[5].state = BTN_STATE_PRESSED;
819 } else if (key_hold(KEY_R)) {
820 buttons[5].state = BTN_STATE_HOLD;
821 } else {
822 buttons[5].state = BTN_STATE_RELEASED;
823 }
824 if (key_pressed(KEY_A)) {
825 buttons[6].state = BTN_STATE_PRESSED;
826 } else if (key_hold(KEY_A)) {
827 buttons[6].state = BTN_STATE_HOLD;
828 } else {
829 buttons[6].state = BTN_STATE_RELEASED;
830 }
831 if (key_pressed(KEY_B)) {
832 buttons[7].state = BTN_STATE_PRESSED;
833 } else if (key_hold(KEY_B)) {
834 buttons[7].state = BTN_STATE_HOLD;
835 } else {
836 buttons[7].state = BTN_STATE_RELEASED;
837 }
838 if (key_pressed(KEY_START)) {
839 buttons[8].state = BTN_STATE_PRESSED;
840 } else if (key_hold(KEY_START)) {
841 buttons[8].state = BTN_STATE_HOLD;
842 } else {
843 buttons[8].state = BTN_STATE_RELEASED;
844 }
845 if (key_pressed(KEY_SELECT)) {
846 buttons[9].state = BTN_STATE_PRESSED;
847 } else if (key_hold(KEY_SELECT)) {
848 buttons[9].state = BTN_STATE_HOLD;
849 } else {
850 buttons[9].state = BTN_STATE_RELEASED;
851 }
852
853 for (size_t i = 0; i < sizeof(buttons) / sizeof(ButtonSprite); ++i) {
854 button_tick(&buttons[i]);
855 }
856}