// 1bpp packed u32 gba_btn_a_data[] = { 0xc0300804, 0x844242c2, 0x030c1020, 0x21424243, 0x42440408, 0x30c00000, 0x42222010, 0x0c030000, }; u32 gba_btn_b_data[] = { 0xc0300804, 0xc442c242, 0x030c1020, 0x21424142, 0x42c40408, 0x30c00000, 0x42212010, 0x0c030000, }; u32 gba_btn_updown_data[] = { 0x00f01010, 0x90d01010, 0x001f1011, 0x13171111, 0x101020c0, 0x00000000, 0x11110807, 0x00000000, }; u32 gba_btn_leftright_data[] = { 0x000000f8, 0x0888c8e8, 0x0000000f, 0x1020202f, 0xc88808f8, 0x00000000, 0x2020100f, 0x00000000, }; u32 gba_btn_l_data[] = { 0xfc028181, 0x818101ff, 0xff808080, 0x808380ff, }; u32 gba_btn_r_data[] = { 0xff01c141, 0xc14101ff, 0x3f408081, 0x808180ff, }; u32 gba_btn_ab_shadow_data[] = { 0x00020204, 0x040830c0, 0x00404020, 0x20100c03, }; u32 gba_btn_up_shadow_data[] = { 0x00000010, 0x1020c000, 0x00000010, 0x10080700, }; u32 gba_btn_down_shadow_data[] = { 0x00000000, 0x10f00000, 0x00000000, 0x101f0000, }; u32 gba_btn_leftright_shadow_data[] = { 0x00000000, 0x000008f8, 0x00000000, 0x2020100f, }; u32 gba_btn_lr_shadow_data[] = { 0x00000000, 0x000001ff, 0x00000000, 0x000080ff, }; u32 gba_btn_startselect_data[] = { 0x0000f804, 0xfcf80000, 0x00001f20, 0x3f1f0000, 0x000000f8, 0x04f80000, 0x0000001f, 0x201f0000, }; u32 gba_btn_start_text[] = { 0x00008080, 0x00800000, 0x0000bb91, 0x92930000, 0x00009b2a, 0x1b2a0000, 0x00000301, 0x01010000, }; u32 gba_btn_select_text[] = { 0x0000e060, 0x80e00000, 0x00002e26, 0x22ee0000, 0x0000ee26, 0x22ee0000, 0x00000e04, 0x04040000, }; u32 gba_btn_fx_downup[] = { 0x00000000, 0x00000000, 0x04000000, 0x00000000, 0x40000100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00020100, 0x00000000, 0x00800001, 0x01000000, 0x00000100, 0x00000000, 0x00000080, 0x00000000, 0x00000100, 0x00000000, 0x00000000, 0x01010000, 0x00000102, 0x00000000, 0x00000000, 0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x00000100, 0x00000000, 0x04000000, }; u32 gba_btn_fx_leftright[] = { 0x00000000, 0x00000000, 0x00000100, 0x00000000, 0x04000000, 0x00000100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x04020000, 0x00000000, 0x18000000, 0x00000002, 0x04000000, 0x00000000, 0x00000000, 0x00000008, 0x04000000, 0x00000000, 0x30000000, 0x00000000, 0x04080000, 0x00000000, 0x00000000, 0x00001000, 0x00000000, 0x00000000, 0x40000000, 0x00000000, 0x00001000, 0x00000000, }; u32 gba_btn_fx_lr[] = { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00008004, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000080, 0x80810200, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000080, 0x80000000, 0x000000c0, 0x80010000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000080, 0x80000000, 0x00000020, 0x00000000, 0x00000000, }; u32 gba_btn_fx_ab[] = { 0x00000000, 0x00408000, 0x00000080, 0x80800001, 0x00000000, 0x00000080, 0x00000000, 0x00020100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x38000000, 0x00000080, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x1c000000, 0x00000001, 0x40200000, 0x00000000, 0x00008080, 0x80000000, 0x00000000, 0x00000000, 0x02040000, 0x00000000, 0x00000000, 0x20400000, 0x00808000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x04020000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0c000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x30000000, 0x00000000, 0x00201000, 0x00000000, 0x00000000, 0x80800000, 0x00000000, 0x00000000, 0x00040800, 0x00000000, 0x00000000, 0x20000000, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x04000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x04000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x20000000, 0x00000000, 0x00001000, 0x00000000, 0x00000000, 0x00800000, 0x00000000, 0x00000000, 0x00000800, 0x00000000, }; u32 gba_btn_fx_startselect[] = { 0x00000000, 0x00000000, 0x00000000, 0x10000002, 0x00000001, 0x10000080, 0x00000000, 0x00000000, 0x00000000, 0x00000080, 0x00000408, 0x00000001, 0x00014120, 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x000000c0, 0x00020400, 0x00000000, 0x01814000, 0x00000000, 0x00000000, 0x00000006, 0x00000000, 0x00000040, 0x00020000, 0x00000000, 0x01800000, 0x00000000, 0x00000000, 0x00000004, }; typedef struct SpriteAnimation { size_t *tile_offsets; size_t n_frames; } SpriteAnimation; typedef enum {BTN_STATE_IDLE, BTN_STATE_PRESSED, BTN_STATE_RELEASED, BTN_STATE_HOLD} BtnState; static size_t btn_state_idle[] = {0}; // static size_t btn_state_pressed[] = {16, 16, 32, 32, 48, 48, 64, 64, 80, 96}; static size_t btn_state_pressed[] = {0}; static SpriteAnimation *animation_states[] = { &(SpriteAnimation){ .tile_offsets = &btn_state_idle, .n_frames = sizeof(btn_state_idle) / sizeof(size_t), }, &(SpriteAnimation){ .tile_offsets = &btn_state_pressed, .n_frames = sizeof(btn_state_pressed) / sizeof(size_t), }, }; typedef struct AnimationEntry { int x_offset; int y_offset; int tile_offset; // NOTE: Maybe this should be a part of an animation? // For example, hidden state, h/v flip. u16 hidden; // u16 obj_attr_1; // u16 obj_attr_2; } AnimationEntry; typedef struct ObjState { size_t id; int x; int y; u32 *data; size_t base_tile; size_t n_tiles; size_t frames; u16 obj_attr_0; u16 obj_attr_1; u16 obj_attr_2; } ObjState; AnimationEntry *btn_animation[] = { &(AnimationEntry[]){ {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 1, 0, 0}, {0, 1, 0, 0}, {0, 2, 0, 0}, {0, 2, 0, 0}, {0, 2, 0, 0}, {0, 2, 0, 0}, }, &(AnimationEntry[]){ {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, }, &(AnimationEntry[]){ {0, 0, 0, 1}, {0, 0, 0, 0}, {0, 0, 4, 0}, {0, 0, 4, 0}, {0, 0, 8, 0}, {0, 0, 8, 0}, {0, 0, 12, 0}, {0, 0, 12, 1}, }, }; AnimationEntry *btn_animation_ab[] = { &(AnimationEntry[]){ {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 1, 0, 0}, {0, 1, 0, 0}, {0, 2, 0, 0}, {0, 2, 0, 0}, {0, 2, 0, 0}, {0, 2, 0, 0}, }, &(AnimationEntry[]){ {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, }, &(AnimationEntry[]){ {0, 0, 0, 1}, {0, 0, 0, 1}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 16, 0}, {0, 0, 16, 0}, {0, 0, 32, 0}, {0, 0, 32, 1}, }, }; AnimationEntry *btn_animation_startselect[] = { &(AnimationEntry[]){ {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 2, 0}, {0, 0, 2, 0}, {0, 0, 2, 0}, {0, 0, 2, 0}, {0, 0, 2, 0}, {0, 0, 2, 0}, }, &(AnimationEntry[]){ {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, }, &(AnimationEntry[]){ {0, 0, 0, 1}, {0, 0, 4, 0}, {0, 0, 4, 0}, {0, 0, 8, 0}, {0, 0, 8, 0}, {0, 0, 12, 0}, {0, 0, 12, 0}, {0, 0, 12, 1}, }, };