From f652b2a9c76194ee285e001e6b04a7dc585e8993 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Fri, 23 Apr 2021 23:05:06 +0200 Subject: First steps to replace the input overlay VRAM and rom consumption was too big with the previous input overlay. Trying to separate button sprites into multiple states. Sprites can now be composed of multiple objects. --- src/gba-buttons.c | 616 +++++++++--------------------------------------------- src/main.c | 415 ++++++++++++++++++++---------------- 2 files changed, 341 insertions(+), 690 deletions(-) diff --git a/src/gba-buttons.c b/src/gba-buttons.c index 7d40031..cbf6f8b 100644 --- a/src/gba-buttons.c +++ b/src/gba-buttons.c @@ -1,536 +1,66 @@ // 1bpp packed u32 gba_btn_a_data[] = { - 0x00000000, 0x00000000, 0x00000000, 0x000000c0, - 0x00000000, 0x00000003, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x30080484, 0x4242c242, - 0x0c102021, 0x42424342, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x42060c34, 0xc830c000, - 0x4260302c, 0x130c0300, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0xc0300804, 0x844242c2, - 0x030c1020, 0x21424243, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x4242040c, 0x38f0c000, - 0x42422030, 0x1c0f0300, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000080, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00c43008, 0x04844242, - 0x00230c10, 0x20214242, 0x00000000, 0x00000000, - 0x80000000, 0x00000000, 0xc2424404, 0x0832c000, - 0x43422220, 0x104c0300, 0x01000000, 0x00000000, - 0x00000000, 0x00000000, 0x80000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00408000, 0x00000080, 0x80800001, - 0x00000000, 0x00000080, 0x00000000, 0x00020100, - 0x00000000, 0x00000000, 0x00c03008, 0x04844242, - 0x00030c10, 0x20214242, 0x00000000, 0x00000000, - 0x38000000, 0x00000080, 0xc2424404, 0x0830c000, - 0x43422220, 0x100c0300, 0x1c000000, 0x00000001, - 0x40200000, 0x00000000, 0x00008080, 0x80000000, - 0x00000000, 0x00000000, 0x02040000, 0x00000000, - 0x00000000, 0x20400000, 0x00008080, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x04020000, - 0x00000000, 0x00000000, 0x00c03008, 0x04844242, - 0x00030c10, 0x20214242, 0x00000000, 0x00000000, - 0x0c000000, 0x00000000, 0xc2424404, 0x0830c000, - 0x43422220, 0x100c0300, 0x30000000, 0x00000000, - 0x00201000, 0x00000000, 0x00000080, 0x80000000, - 0x00000000, 0x00000000, 0x00040800, 0x00000000, - 0x00000000, 0x20000000, 0x00008000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x04000000, - 0x00000000, 0x00000000, 0x00c03008, 0x04844242, - 0x00030c10, 0x20214242, 0x00000000, 0x00000000, - 0x04000000, 0x00000000, 0xc2424404, 0x0830c000, - 0x43422220, 0x100c0300, 0x20000000, 0x00000000, - 0x00001000, 0x00000000, 0x00000000, 0x80000000, - 0x00000000, 0x00000000, 0x00000800, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00c03008, 0x04844242, - 0x00030c10, 0x20214242, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0xc2424404, 0x0830c000, - 0x43422220, 0x100c0300, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xc0300804, 0x844242c2, 0x030c1020, 0x21424243, + 0x42440408, 0x30c00000, 0x42222010, 0x0c030000, }; u32 gba_btn_b_data[] = { - 0x00000000, 0x00000000, 0x00000000, 0x000000c0, - 0x00000000, 0x00000003, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x300804c4, 0x42c24242, - 0x0c102021, 0x42414242, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0xc2060c34, 0xc830c000, - 0x4160302c, 0x130c0300, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0xc0300804, 0xc442c242, - 0x030c1020, 0x21424142, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x42c2040c, 0x38f0c000, - 0x42412030, 0x1c0f0300, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000080, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00c43008, 0x04c442c2, - 0x00230c10, 0x20214241, 0x00000000, 0x00000000, - 0x80000000, 0x00000000, 0x4242c404, 0x0832c000, - 0x42422120, 0x104c0300, 0x01000000, 0x00000000, - 0x00000000, 0x00000000, 0x80000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00408000, 0x00000080, 0x80800001, - 0x00000000, 0x00000080, 0x00000000, 0x00020100, - 0x00000000, 0x00000000, 0x00c03008, 0x04c442c2, - 0x00030c10, 0x20214241, 0x00000000, 0x00000000, - 0x38000000, 0x00000080, 0x4242c404, 0x0830c000, - 0x42422120, 0x100c0300, 0x1c000000, 0x00000001, - 0x40200000, 0x00000000, 0x00008080, 0x80000000, - 0x00000000, 0x00000000, 0x02040000, 0x00000000, - 0x00000000, 0x20400000, 0x00808000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x04020000, - 0x00000000, 0x00000000, 0x00c03008, 0x04c442c2, - 0x00030c10, 0x20214241, 0x00000000, 0x00000000, - 0x0c000000, 0x00000000, 0x4242c404, 0x0830c000, - 0x42422120, 0x100c0300, 0x30000000, 0x00000000, - 0x00201000, 0x00000000, 0x00000000, 0x80800000, - 0x00000000, 0x00000000, 0x00040800, 0x00000000, - 0x00000000, 0x20000000, 0x00800000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x04000000, - 0x00000000, 0x00000000, 0x00c03008, 0x04c442c2, - 0x00030c10, 0x20214241, 0x00000000, 0x00000000, - 0x04000000, 0x00000000, 0x4242c404, 0x0830c000, - 0x42422120, 0x100c0300, 0x20000000, 0x00000000, - 0x00001000, 0x00000000, 0x00000000, 0x00800000, - 0x00000000, 0x00000000, 0x00000800, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00c03008, 0x04c442c2, - 0x00030c10, 0x20214241, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x4242c404, 0x0830c000, - 0x42422120, 0x100c0300, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xc0300804, 0xc442c242, 0x030c1020, 0x21424142, + 0x42c40408, 0x30c00000, 0x42212010, 0x0c030000, }; -u32 gba_btn_up_data[] = { - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0xf80888c8, 0xe8888888, - 0x0f080809, 0x0b080808, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x8818e810, 0xe0000000, - 0x080c0b04, 0x03000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00f80888, 0xc8e88888, - 0x000f0808, 0x090b0808, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x888818f0, 0xe0000000, - 0x08080c07, 0x03000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000080, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x0002f808, 0x88c8e888, - 0x00200f08, 0x08090b08, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x88888810, 0xe0000000, - 0x08080804, 0x03000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000080, 0x00000000, 0x00808000, - 0x00000000, 0x00000080, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x0100f808, 0x88c8e888, - 0x40000f08, 0x08090b08, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x88888810, 0xe0000000, - 0x08080804, 0x03000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00004080, 0x00000000, 0x80800000, - 0x00000000, 0x00000080, 0x00000000, 0x00000100, - 0x00000000, 0x00000000, 0x0000f808, 0x88c8e888, - 0x00000f08, 0x08090b08, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x88888810, 0xe0000000, - 0x08080804, 0x03000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00200000, 0x00000080, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00020000, - 0x00000000, 0x00000000, 0x0000f808, 0x88c8e888, - 0x00000f08, 0x08090b08, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x88888810, 0xe0000000, - 0x08080804, 0x03000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x0000f808, 0x88c8e888, - 0x00000f08, 0x08090b08, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x88888810, 0xe0000000, - 0x08080804, 0x03000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, +u32 gba_btn_updown_data[] = { + 0x00f01010, 0x90d01010, 0x001f1011, 0x13171111, + 0x101020c0, 0x00000000, 0x11110807, 0x00000000, }; -u32 gba_btn_down_data[] = { - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00e01088, 0x888888e8, - 0x00030408, 0x0808080b, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0xc88808f8, 0x08f80000, - 0x0908080f, 0x080f0000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x0000e010, 0x88888888, - 0x00000304, 0x08080808, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0xe8c88808, 0xf8f80000, - 0x0b090808, 0x0f0f0000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x000000e0, 0x10888888, - 0x00000003, 0x04080808, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x88e8c888, 0x08f80200, - 0x080b0908, 0x080f2000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x80000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x000000e0, 0x10888888, - 0x00000003, 0x04080808, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x88e8c888, 0x08f80001, - 0x080b0908, 0x080f0040, 0x00000000, 0x00000000, - 0x80000000, 0x00000000, 0x00808000, 0x00000000, - 0x80000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x000000e0, 0x10888888, - 0x00000003, 0x04080808, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x88e8c888, 0x08f80000, - 0x080b0908, 0x080f0000, 0x00000000, 0x00000000, - 0x80400000, 0x00000000, 0x00008080, 0x00000000, - 0x80000000, 0x00000000, 0x00010000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x000000e0, 0x10888888, - 0x00000003, 0x04080808, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x88e8c888, 0x08f80000, - 0x080b0908, 0x080f0000, 0x00000000, 0x00000000, - 0x00002000, 0x00000000, 0x00000000, 0x80000000, - 0x00000000, 0x00000000, 0x00000200, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x000000e0, 0x10888888, - 0x00000003, 0x04080808, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x88e8c888, 0x08f80000, - 0x080b0908, 0x080f0000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, +u32 gba_btn_leftright_data[] = { + 0x000000f8, 0x0888c8e8, 0x0000000f, 0x1020202f, + 0xc88808f8, 0x00000000, 0x2020100f, 0x00000000, }; -u32 gba_btn_left_data[] = { - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x0000f808, 0x88c8e8c8, - 0x00000f10, 0x20202f20, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x8808f808, 0xf8000000, - 0x20302f10, 0x0f000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x000000f8, 0x0888c8e8, - 0x0000000f, 0x1020202f, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0xc88808f8, 0xf8000000, - 0x2020301f, 0x0f000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000400, 0xf80888c8, - 0x00000000, 0x0f102020, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0xe9c88808, 0xf8000400, - 0x2f202010, 0x0f000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x01020000, 0xf80888c8, - 0x00000000, 0x0f102020, 0x00000000, 0x00000000, - 0xc0000000, 0x00000000, 0xe8c88808, 0xf8000002, - 0x2f202010, 0x0f000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x01000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000080, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x01000000, 0xf80888c8, - 0x00000000, 0x0f102020, 0x00000000, 0x00000000, - 0x60000000, 0x00000000, 0xe8c88808, 0xf8000000, - 0x2f202010, 0x0f000000, 0x00000000, 0x00000000, - 0x00800000, 0x00000000, 0x01000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00004000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0xf80888c8, - 0x00000000, 0x0f102020, 0x00000000, 0x00000000, - 0x10000000, 0x00000000, 0xe8c88808, 0xf8000000, - 0x2f202010, 0x0f000000, 0x00000000, 0x00000000, - 0x00004000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0xf80888c8, - 0x00000000, 0x0f102020, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0xe8c88808, 0xf8000000, - 0x2f202010, 0x0f000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, +u32 gba_btn_l_data[] = { + 0xfc028181, 0x818101ff, 0xff808080, 0x808380ff, }; -u32 gba_btn_right_data[] = { - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x0000f008, 0x0404f404, - 0x00001f10, 0x11131713, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x040cf408, 0xf0000000, - 0x11101f10, 0x1f000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x000000f0, 0x080404f4, - 0x0000001f, 0x10111317, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x04040cf8, 0xf0000000, - 0x1311101f, 0x1f000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0xf0080404, - 0x00002000, 0x1f101113, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0xf4040408, 0xf0000000, - 0x97131110, 0x1f002000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0xf0080404, - 0x80400000, 0x1f101113, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0xf4040408, 0xf0000000, - 0x17131110, 0x1f000040, 0x03000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x80000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000001, - 0x00000000, 0x00000000, 0x00000000, 0xf0080404, - 0x80000000, 0x1f101113, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0xf4040408, 0xf0000000, - 0x17131110, 0x1f000000, 0x06000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x80000000, 0x00000000, 0x00010000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000200, - 0x00000000, 0x00000000, 0x00000000, 0xf0080404, - 0x00000000, 0x1f101113, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0xf4040408, 0xf0000000, - 0x17131110, 0x1f000000, 0x08000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000200, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0xf0080404, - 0x00000000, 0x1f101113, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0xf4040408, 0xf0000000, - 0x17131110, 0x1f000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, +u32 gba_btn_r_data[] = { + 0xff018181, 0x818101ff, 0x3f408182, 0x818280ff, }; -u32 gba_btn_l_data[] = { - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x0000fc02, 0x01010101, - 0x0000ff00, 0x01010107, 0x00000302, 0x02020202, - 0x00000000, 0x00000000, 0x01ff01ff, 0x00000000, - 0x00ff00ff, 0x00000000, 0x02030203, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x000000fc, 0x02010101, - 0x000000ff, 0x00010101, 0x00000003, 0x02020202, - 0x00000000, 0x00000000, 0x0101ffff, 0x00000000, - 0x0700ffff, 0x00000000, 0x02020303, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000080, 0x00000040, 0x00001000, 0xfc020101, - 0x00000000, 0xff000101, 0x00000000, 0x03020202, - 0x00000000, 0x00000000, 0x010101ff, 0x00000000, - 0x010700ff, 0x00000000, 0x02020203, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00204000, 0x00000030, 0x10100000, 0xfc020101, - 0x00000000, 0xff000101, 0x00000000, 0x03020202, - 0x00000000, 0x00000000, 0x010101ff, 0x00000000, - 0x010700ff, 0x00000000, 0x02020203, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000010, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x10200000, 0x00000018, 0x10000000, 0xfc020101, - 0x00000000, 0xff000101, 0x00000000, 0x03020202, - 0x00000000, 0x00000000, 0x010101ff, 0x00000000, - 0x010700ff, 0x00000000, 0x02020203, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000010, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x10000000, 0x00000004, 0x00000000, 0xfc020101, - 0x00000000, 0xff000101, 0x00000000, 0x03020202, - 0x00000000, 0x00000000, 0x010101ff, 0x00000000, - 0x010700ff, 0x00000000, 0x02020203, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0xfc020101, - 0x00000000, 0xff000101, 0x00000000, 0x03020202, - 0x00000000, 0x00000000, 0x010101ff, 0x00000000, - 0x010700ff, 0x00000000, 0x02020203, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, +u32 gba_btn_ab_shadow_data[] = { + 0x00020204, 0x040830c0, 0x00404020, 0x20100c03, }; -u32 gba_btn_r_data[] = { - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x0000c040, 0x40404040, 0x0000ff00, 0x60a060a0, - 0x00003f40, 0x80808080, 0x00000000, 0x00000000, - 0x40c040c0, 0x00000000, 0x00ff00ff, 0x00000000, - 0x80ff80ff, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x000000c0, 0x40404040, 0x000000ff, 0x0060a060, - 0x0000003f, 0x40808080, 0x00000000, 0x00000000, - 0x4040c0c0, 0x00000000, 0xa000ffff, 0x00000000, - 0x8080ffff, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0xc0404040, 0x00000000, 0xff0060a0, - 0x00000800, 0x3f408080, 0x00000001, 0x00000002, - 0x404040c0, 0x00000000, 0x60a000ff, 0x00000000, - 0x808080ff, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0xc0404040, 0x00000000, 0xff0060a0, - 0x08080000, 0x3f408080, 0x00040200, 0x0000000c, - 0x404040c0, 0x00000000, 0x60a000ff, 0x00000000, - 0x808080ff, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000008, 0x00000000, 0x00000000, - 0x00000000, 0xc0404040, 0x00000000, 0xff0060a0, - 0x08000000, 0x3f408080, 0x08040000, 0x00000018, - 0x404040c0, 0x00000000, 0x60a000ff, 0x00000000, - 0x808080ff, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000008, 0x00000000, 0x00000000, - 0x00000000, 0xc0404040, 0x00000000, 0xff0060a0, - 0x00000000, 0x3f408080, 0x08000000, 0x00000020, - 0x404040c0, 0x00000000, 0x60a000ff, 0x00000000, - 0x808080ff, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0xc0404040, 0x00000000, 0xff0060a0, - 0x00000000, 0x3f408080, 0x00000000, 0x00000000, - 0x404040c0, 0x00000000, 0x60a000ff, 0x00000000, - 0x808080ff, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, +u32 gba_btn_up_shadow_data[] = { + 0x00000010, 0x1020c000, 0x00000010, 0x10080700, }; -u32 gba_btn_start_data[] = { - 0x00000000, 0x00000000, 0x00000000, 0x0000f008, - 0x00000000, 0x00001f20, 0x00000000, 0x00000000, - 0x00000080, 0x80008000, 0xf8f000bb, 0x91929300, - 0x3f1f009b, 0x2a1b2a00, 0x00000003, 0x01010100, - 0x00000000, 0x00000000, 0x00000000, 0x000000f0, - 0x00000000, 0x0000001f, 0x00000000, 0x00000000, - 0x00000080, 0x80008000, 0x08f000bb, 0x91929300, - 0x201f009b, 0x2a1b2a00, 0x00000003, 0x01010100, - 0x00000000, 0x00000000, 0x00000000, 0x001000f0, - 0x00000000, 0x0110001f, 0x00000000, 0x00000000, - 0x00000080, 0x80008000, 0x0af000bb, 0x91929300, - 0xa01f009b, 0x2a1b2a00, 0x00000003, 0x01010100, - 0x00000000, 0x00000000, 0x00000004, 0x080000f0, - 0x00000141, 0x2000001f, 0x00000000, 0x00000000, - 0x80000080, 0x80008000, 0x09f000bb, 0x91929300, - 0x201f009b, 0x2a1b2a00, 0x03000003, 0x01010100, - 0x00000000, 0x00000000, 0x00000204, 0x000000f0, - 0x00018140, 0x0000001f, 0x00000000, 0x00000000, - 0xc0000080, 0x80008000, 0x08f000bb, 0x91929300, - 0x201f009b, 0x2a1b2a00, 0x06000003, 0x01010100, - 0x00000000, 0x00000000, 0x00000200, 0x000000f0, - 0x00018000, 0x0000001f, 0x00000000, 0x00000000, - 0x40000080, 0x80008000, 0x08f000bb, 0x91929300, - 0x201f009b, 0x2a1b2a00, 0x04000003, 0x01010100, - 0x00000000, 0x00000000, 0x00000000, 0x000000f0, - 0x00000000, 0x0000001f, 0x00000000, 0x00000000, - 0x00000080, 0x80008000, 0x08f000bb, 0x91929300, - 0x201f009b, 0x2a1b2a00, 0x00000003, 0x01010100, +u32 gba_btn_down_shadow_data[] = { + 0x00000000, 0x10f00000, 0x00000000, 0x101f0000, }; -u32 gba_btn_select_data[] = { - 0x00000000, 0x00000000, 0x00000000, 0x0000f008, - 0x00000000, 0x00001f20, 0x00000000, 0x00000000, - 0x000000e0, 0x6080e000, 0xf8f0002e, 0x2622ee00, - 0x3f1f00ee, 0x2622ee00, 0x0000000e, 0x04040400, - 0x00000000, 0x00000000, 0x00000000, 0x000000f0, - 0x00000000, 0x0000001f, 0x00000000, 0x00000000, - 0x000000e0, 0x6080e000, 0x08f0002e, 0x2622ee00, - 0x201f00ee, 0x2622ee00, 0x0000000e, 0x04040400, - 0x00000000, 0x00000000, 0x00000000, 0x001000f0, - 0x00000000, 0x0110001f, 0x00000000, 0x00000000, - 0x000000e0, 0x6080e000, 0x0af0002e, 0x2622ee00, - 0xa01f00ee, 0x2622ee00, 0x0000000e, 0x04040400, - 0x00000000, 0x00000000, 0x00000004, 0x080000f0, - 0x00000141, 0x2000001f, 0x00000000, 0x00000000, - 0x800000e0, 0x6080e000, 0x09f0002e, 0x2622ee00, - 0x201f00ee, 0x2622ee00, 0x0300000e, 0x04040400, - 0x00000000, 0x00000000, 0x00000204, 0x000000f0, - 0x00018140, 0x0000001f, 0x00000000, 0x00000000, - 0xc00000e0, 0x6080e000, 0x08f0002e, 0x2622ee00, - 0x201f00ee, 0x2622ee00, 0x0600000e, 0x04040400, - 0x00000000, 0x00000000, 0x00000200, 0x000000f0, - 0x00018000, 0x0000001f, 0x00000000, 0x00000000, - 0x400000e0, 0x6080e000, 0x08f0002e, 0x2622ee00, - 0x201f00ee, 0x2622ee00, 0x0400000e, 0x04040400, - 0x00000000, 0x00000000, 0x00000000, 0x000000f0, - 0x00000000, 0x0000001f, 0x00000000, 0x00000000, - 0x000000e0, 0x6080e000, 0x08f0002e, 0x2622ee00, - 0x201f00ee, 0x2622ee00, 0x0000000e, 0x04040400, +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_fx_downup[] = { + 0x00000000, 0x00000000, 0x04000000, 0x00000000, + 0x40000100, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000201, 0x00000000, + 0x00008000, 0x01010000, 0x00000001, 0x00000000, + 0x00000000, 0x80000000, 0x00000001, 0x00000000, + 0x00000000, 0x00010100, 0x00000001, 0x02000000, + 0x00000000, 0x00400000, 0x00000000, 0x00000000, + 0x00000000, 0x00000001, 0x00000000, 0x00040000, }; typedef struct SpriteAnimation { @@ -538,10 +68,11 @@ typedef struct SpriteAnimation { size_t n_frames; } SpriteAnimation; -typedef enum {BTN_STATE_IDLE, BTN_STATE_PRESSED} BtnState; +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[] = {16, 16, 32, 32, 48, 48, 64, 64, 80, 96}; +static size_t btn_state_pressed[] = {0}; static SpriteAnimation *animation_states[] = { &(SpriteAnimation){ @@ -553,3 +84,60 @@ static SpriteAnimation *animation_states[] = { .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_down_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, 11, 0, 0}, + {0, 11, 0, 0}, + {0, 11, 0, 0}, + {0, 11, 0, 0}, + {0, 11, 0, 0}, + {0, 11, 0, 0}, + {0, 11, 0, 0}, + {0, 11, 0, 0}, + }, + &(AnimationEntry[]){ + {-8, 17, 0, 1}, + {-8, 17, 0, 0}, + {-8, 17, 4, 0}, + {-8, 17, 4, 0}, + {-8, 17, 8, 0}, + {-8, 17, 8, 0}, + {-8, 17, 12, 0}, + {-8, 17, 12, 1}, + }, +}; diff --git a/src/main.c b/src/main.c index 4dd2554..e74df00 100644 --- a/src/main.c +++ b/src/main.c @@ -142,6 +142,33 @@ rgb15(u32 red, u32 green, u32 blue ) { #define OBJ_AFFINE_PC(N) *((vs16*)(MEM_OAM + 6 + 8 * 2 + 8 * 4 * (N))) #define OBJ_AFFINE_PD(N) *((vs16*)(MEM_OAM + 6 + 8 * 3 + 8 * 4 * (N))) +// OBJ_ATTR_0 parameters +#define OBJ_Y_COORD(N) ((N) & 0xFF) +#define OBJ_NORMAL (0x00 << 0x8) +#define OBJ_AFFINE (0x01 << 0x8) +#define OBJ_HIDDEN (0x02 << 0x8) +#define OBJ_AFFINE_2X (0x03 << 0x8) +#define OBJ_ALPHA_BLEND (0x01 << 0xA) +#define OBJ_WINDOW (0x02 << 0xA) +#define OBJ_SHAPE_SQUARE (0x00 << 0xE) +#define OBJ_SHAPE_WIDE (0x01 << 0xE) +#define OBJ_SHAPE_TALL (0x02 << 0xE) + +// OBJ_ATTR_1 parameters +#define OBJ_X_COORD(N) ((N) & 0x1FF) +#define OBJ_AFFINE_IDX(N) ((N) << 0x9) +#define OBJ_H_FLIP (0x01 << 0xC) +#define OBJ_V_FLIP (0x01 << 0xD) +#define OBJ_SIZE_SMALL (0x00 << 0xE) +#define OBJ_SIZE_MID (0x01 << 0xE) +#define OBJ_SIZE_BIG (0x02 << 0xE) +#define OBJ_SIZE_HUGE (0x03 << 0xE) + +// OBJ_ATTR_2 parameters +#define OBJ_TILE_INDEX(N) ((N) & 0x3FF) +#define OBJ_PRIORITY(N) ((N) << 0xA) +#define OBJ_PAL_BANK(N) ((N) << 0xC) + // Using bd-font, an 8x8 bitmap font. static void put_char(int x, int y, Color clr, u8 chr) { @@ -504,6 +531,15 @@ typedef struct ButtonSprite { BtnState state; } ButtonSprite; +typedef struct MultiSprite { + ObjState *sprites; + AnimationEntry **animations; + int frame; + size_t n_obj; + size_t n_frames; + BtnState state; +} MultiSprite; + #define NUM_SPRITES 128 Sprite sprites[NUM_SPRITES]; @@ -550,6 +586,73 @@ load_packed_sprite_data(u32 *sprite_data, size_t n_tiles, size_t n_frames) { return sprite_counter++; } +void +init_button_sprite(MultiSprite *btn) { + for (size_t i = 0; i < btn->n_obj; ++i) { + btn->sprites[i].id = load_packed_sprite_data( + btn->sprites[i].data, + btn->sprites[i].n_tiles, + btn->sprites[i].frames); + btn->sprites[i].base_tile = sprites[btn->sprites[i].id].tile_start; + } +} + +void +button_tick(MultiSprite *btn) { + // Nothing to do here. + if (btn->state == BTN_STATE_IDLE) { + return; + } + + // Reset animation state. + if (btn->state == BTN_STATE_PRESSED && btn->frame != 0) { + btn->frame = 0; + } + + // Continue the animation. + if (btn->state == BTN_STATE_HOLD || btn->state == BTN_STATE_PRESSED ) { + if(btn->frame < btn->n_frames - 1) { + btn->frame++; + } + } + + // Finish the animation and return to idle. + if (btn->state == BTN_STATE_RELEASED) { + if (btn->frame > 0 && btn->frame < btn->n_frames - 1) { + btn->frame++; + } else { + btn->frame = 0; + btn->state = BTN_STATE_IDLE; + } + } + for (size_t i = 0; i < btn->n_obj; ++i) { + AnimationEntry anim_frame = btn->animations[i][btn->frame]; + int x = btn->sprites[i].x + anim_frame.x_offset; + int y = btn->sprites[i].y + anim_frame.y_offset; + int base_tile = btn->sprites[i].base_tile + anim_frame.tile_offset; + + // Clear the previous x/y coordinate and base tiles. + btn->sprites[i].obj_attr_0 &= ~0xFF; + btn->sprites[i].obj_attr_1 &= ~0x1FF; + btn->sprites[i].obj_attr_2 &= ~0x3FF; + + // Update x/y/tile and hidden state from the animations. + btn->sprites[i].obj_attr_0 |= OBJ_Y_COORD(y); + btn->sprites[i].obj_attr_1 |= OBJ_X_COORD(x); + btn->sprites[i].obj_attr_2 |= base_tile; + if (anim_frame.hidden) { + btn->sprites[i].obj_attr_0 |= OBJ_HIDDEN; + } else { + btn->sprites[i].obj_attr_0 &= ~OBJ_HIDDEN; + } + + // Update OBJ attributes. + OBJ_ATTR_0(btn->sprites[i].id) = btn->sprites[i].obj_attr_0; + OBJ_ATTR_1(btn->sprites[i].id) = btn->sprites[i].obj_attr_1; + OBJ_ATTR_2(btn->sprites[i].id) = btn->sprites[i].obj_attr_2; + } +} + int main(void) { // Add colors to the sprite color palette. Tiles with color number 0 are @@ -586,93 +689,152 @@ int main(void) { int buttons_x = SCREEN_WIDTH / 2; int buttons_y = SCREEN_HEIGHT / 2; ButtonSprite btn_b = { - .id = load_packed_sprite_data(&gba_btn_b_data, 16, 7), + .id = load_packed_sprite_data(&gba_btn_b_data, 4, 1), .x = buttons_x + 32, .y = buttons_y + 32, .frame = 0, .state = BTN_STATE_IDLE, }; OBJ_ATTR_0(btn_b.id) = btn_b.y; - OBJ_ATTR_1(btn_b.id) = btn_b.x | (1 << 0xF); + OBJ_ATTR_1(btn_b.id) = btn_b.x | (1 << 0xE); OBJ_ATTR_2(btn_b.id) = sprites[btn_b.id].tile_start; ButtonSprite btn_a = { - .id = load_packed_sprite_data(&gba_btn_a_data, 16, 7), + .id = load_packed_sprite_data(&gba_btn_a_data, 4, 1), .x = buttons_x + 32 + 20, .y = buttons_y + 32 - 16, .frame = 0, .state = BTN_STATE_IDLE, }; OBJ_ATTR_0(btn_a.id) = btn_a.y; - OBJ_ATTR_1(btn_a.id) = btn_a.x | (1 << 0xF); + OBJ_ATTR_1(btn_a.id) = btn_a.x | (1 << 0xE); OBJ_ATTR_2(btn_a.id) = sprites[btn_a.id].tile_start; - ButtonSprite btn_down = { - .id = load_packed_sprite_data(&gba_btn_down_data, 16, 7), - .x = buttons_x - 64 - 16, - .y = buttons_y + 32, - .frame = 0, - .state = BTN_STATE_IDLE, - }; - OBJ_ATTR_0(btn_down.id) = btn_down.y; - OBJ_ATTR_1(btn_down.id) = btn_down.x | (1 << 0xF); - OBJ_ATTR_2(btn_down.id) = sprites[btn_down.id].tile_start; - ButtonSprite btn_up = { - .id = load_packed_sprite_data(&gba_btn_up_data, 16, 7), + .id = load_packed_sprite_data(&gba_btn_updown_data, 4, 1), .x = buttons_x - 64 - 16, .y = buttons_y + 32 - 18, .frame = 0, .state = BTN_STATE_IDLE, }; OBJ_ATTR_0(btn_up.id) = btn_up.y; - OBJ_ATTR_1(btn_up.id) = btn_up.x | (1 << 0xF); + OBJ_ATTR_1(btn_up.id) = btn_up.x | (1 << 0xE); OBJ_ATTR_2(btn_up.id) = sprites[btn_up.id].tile_start; ButtonSprite btn_left = { - .id = load_packed_sprite_data(&gba_btn_left_data, 16, 7), - .x = buttons_x - 64 - 16 - 12, + .id = load_packed_sprite_data(&gba_btn_leftright_data, 4, 1), + .x = buttons_x - 64 - 16 - 10, .y = buttons_y + 32 - 10, .frame = 0, .state = BTN_STATE_IDLE, }; OBJ_ATTR_0(btn_left.id) = btn_left.y; - OBJ_ATTR_1(btn_left.id) = btn_left.x | (1 << 0xF); + OBJ_ATTR_1(btn_left.id) = btn_left.x | (1 << 0xE); OBJ_ATTR_2(btn_left.id) = sprites[btn_left.id].tile_start; ButtonSprite btn_right = { - .id = load_packed_sprite_data(&gba_btn_right_data, 16, 7), + .id = load_packed_sprite_data(&gba_btn_leftright_data, 4, 1), .x = buttons_x - 64 - 16 + 11, .y = buttons_y + 32 - 10, .frame = 0, .state = BTN_STATE_IDLE, }; OBJ_ATTR_0(btn_right.id) = btn_right.y; - OBJ_ATTR_1(btn_right.id) = btn_right.x | (1 << 0xF); + OBJ_ATTR_1(btn_right.id) = btn_right.x | (1 << 0xE) | (1 << 0xC); OBJ_ATTR_2(btn_right.id) = sprites[btn_right.id].tile_start; ButtonSprite btn_l = { - .id = load_packed_sprite_data(&gba_btn_l_data, 16, 7), + .id = load_packed_sprite_data(&gba_btn_l_data, 2, 1), .x = buttons_x - 64 - 28, .y = buttons_y - 32 - 20, .frame = 0, .state = BTN_STATE_IDLE, }; - OBJ_ATTR_0(btn_l.id) = btn_l.y; - OBJ_ATTR_1(btn_l.id) = btn_l.x | (1 << 0xF); + OBJ_ATTR_0(btn_l.id) = btn_l.y | (1 << 0xE); + OBJ_ATTR_1(btn_l.id) = btn_l.x; OBJ_ATTR_2(btn_l.id) = sprites[btn_l.id].tile_start; ButtonSprite btn_r = { - .id = load_packed_sprite_data(&gba_btn_r_data, 16, 7), + .id = load_packed_sprite_data(&gba_btn_r_data, 2, 1), .x = buttons_x + 32 + 20, .y = buttons_y - 32 - 20, .frame = 0, .state = BTN_STATE_IDLE, }; - OBJ_ATTR_0(btn_r.id) = btn_r.y; - OBJ_ATTR_1(btn_r.id) = btn_r.x | (1 << 0xF); + OBJ_ATTR_0(btn_r.id) = btn_r.y | (1 << 0xE); + OBJ_ATTR_1(btn_r.id) = btn_r.x; OBJ_ATTR_2(btn_r.id) = sprites[btn_r.id].tile_start; + ButtonSprite btn_start = { + .id = load_packed_sprite_data(&gba_btn_startselect_data, 2, 2), + .x = buttons_x - 10, + .y = buttons_y + 40, + .frame = 0, + .state = BTN_STATE_IDLE, + }; + OBJ_ATTR_0(btn_start.id) = btn_start.y | (1 << 0xE); + OBJ_ATTR_1(btn_start.id) = btn_start.x; + OBJ_ATTR_2(btn_start.id) = sprites[btn_start.id].tile_start; + + ButtonSprite btn_select = { + .id = load_packed_sprite_data(&gba_btn_startselect_data, 2, 2), + .x = buttons_x - 32, + .y = buttons_y + 40, + .frame = 0, + .state = BTN_STATE_IDLE, + }; + OBJ_ATTR_0(btn_select.id) = btn_select.y | (1 << 0xE); + OBJ_ATTR_1(btn_select.id) = btn_select.x; + OBJ_ATTR_2(btn_select.id) = sprites[btn_select.id].tile_start; + + MultiSprite buttons[] = { + { + .frame = 0, + .n_obj = 3, + .n_frames = 8, + .state = BTN_STATE_RELEASED, + .animations = &btn_down_animation, + .sprites = &(ObjState[]){ + { + .id = 0, + .x = buttons_x - 64 - 16, + .y = buttons_y + 29, + .data = &gba_btn_updown_data, + .n_tiles = 4, + .frames = 1, + .obj_attr_0 = 0, + .obj_attr_1 = OBJ_V_FLIP | OBJ_SIZE_MID, + .obj_attr_2 = 0 + }, + { + .id = 0, + .x = buttons_x - 64 - 16, + .y = buttons_y + 29, + .data = &gba_btn_down_shadow_data, + .n_tiles = 2, + .frames = 1, + .obj_attr_0 = OBJ_SHAPE_WIDE, + .obj_attr_1 = OBJ_SIZE_SMALL, + .obj_attr_2 = 0 + }, + { + .id = 0, + .x = buttons_x - 64 - 16, + .y = buttons_y + 29, + .data = &gba_btn_fx_downup, + .n_tiles = 4, + .frames = 4, + .obj_attr_0 = OBJ_SHAPE_WIDE, + .obj_attr_1 = OBJ_SIZE_MID, + .obj_attr_2 = 0 + }, + }, + }, + }; + for (size_t i = 0; i < sizeof(buttons) / sizeof(MultiSprite); ++i) { + init_button_sprite(&buttons[i]); + } + int frame_counter = 0; int x = 0; int y = 0; @@ -680,149 +842,46 @@ int main(void) { wait_vsync(); poll_keys(); - if (key_pressed(KEY_B)) { - btn_b.frame = 0; - btn_b.state = BTN_STATE_PRESSED; - } else if (key_hold(KEY_B)) { - size_t n_frames = animation_states[btn_b.state]->n_frames; - if (btn_b.frame < n_frames - 1) { - btn_b.frame++; - } - } else { - // Finish the animation and reset idle state. - size_t n_frames = animation_states[btn_b.state]->n_frames; - if (btn_b.frame > 0 && btn_b.frame < n_frames - 1) { - btn_b.frame++; - } else { - btn_b.frame = 0; - btn_b.state = BTN_STATE_IDLE; - } - } - if (key_pressed(KEY_A)) { - btn_a.frame = 0; - btn_a.state = BTN_STATE_PRESSED; - } else if (key_hold(KEY_A)) { - size_t n_frames = animation_states[btn_a.state]->n_frames; - if (btn_a.frame < n_frames - 1) { - btn_a.frame++; - } - } else { - // Finish the animation and reset idle state. - size_t n_frames = animation_states[btn_a.state]->n_frames; - if (btn_a.frame > 0 && btn_a.frame < n_frames - 1) { - btn_a.frame++; - } else { - btn_a.frame = 0; - btn_a.state = BTN_STATE_IDLE; - } - } + // if (key_pressed(KEY_B)) { + // btn_b.frame = 0; + // btn_b.state = BTN_STATE_PRESSED; + // } else if (key_hold(KEY_B)) { + // if (btn_b.frame < btn_b.n_frames - 1) { + // btn_b.frame++; + // } + // } else { + // // Finish the animation and reset idle state. + // if (btn_b.frame > 0 && btn_b.frame < btn_b.n_frames - 1) { + // btn_b.frame++; + // } else { + // btn_b.frame = 0; + // btn_b.state = BTN_STATE_IDLE; + // } + // } + // if (key_pressed(KEY_A)) { + // btn_a.frame = 0; + // btn_a.state = BTN_STATE_PRESSED; + // } else if (key_hold(KEY_A)) { + // size_t n_frames = animation_states[btn_a.state]->n_frames; + // if (btn_a.frame < n_frames - 1) { + // btn_a.frame++; + // } + // } else { + // // Finish the animation and reset idle state. + // size_t n_frames = animation_states[btn_a.state]->n_frames; + // if (btn_a.frame > 0 && btn_a.frame < n_frames - 1) { + // btn_a.frame++; + // } else { + // btn_a.frame = 0; + // btn_a.state = BTN_STATE_IDLE; + // } + // } if (key_pressed(KEY_DOWN)) { - btn_down.frame = 0; - btn_down.state = BTN_STATE_PRESSED; + buttons[0].state = BTN_STATE_PRESSED; } else if (key_hold(KEY_DOWN)) { - size_t n_frames = animation_states[btn_down.state]->n_frames; - if (btn_down.frame < n_frames - 1) { - btn_down.frame++; - } - } else { - // Finish the animation and reset idle state. - size_t n_frames = animation_states[btn_down.state]->n_frames; - if (btn_down.frame > 0 && btn_down.frame < n_frames - 1) { - btn_down.frame++; - } else { - btn_down.frame = 0; - btn_down.state = BTN_STATE_IDLE; - } - } - if (key_pressed(KEY_UP)) { - btn_up.frame = 0; - btn_up.state = BTN_STATE_PRESSED; - } else if (key_hold(KEY_UP)) { - size_t n_frames = animation_states[btn_up.state]->n_frames; - if (btn_up.frame < n_frames - 1) { - btn_up.frame++; - } - } else { - // Finish the animation and reset idle state. - size_t n_frames = animation_states[btn_up.state]->n_frames; - if (btn_up.frame > 0 && btn_up.frame < n_frames - 1) { - btn_up.frame++; - } else { - btn_up.frame = 0; - btn_up.state = BTN_STATE_IDLE; - } - } - if (key_pressed(KEY_LEFT)) { - btn_left.frame = 0; - btn_left.state = BTN_STATE_PRESSED; - } else if (key_hold(KEY_LEFT)) { - size_t n_frames = animation_states[btn_left.state]->n_frames; - if (btn_left.frame < n_frames - 1) { - btn_left.frame++; - } - } else { - // Finish the animation and reset idle state. - size_t n_frames = animation_states[btn_left.state]->n_frames; - if (btn_left.frame > 0 && btn_left.frame < n_frames - 1) { - btn_left.frame++; - } else { - btn_left.frame = 0; - btn_left.state = BTN_STATE_IDLE; - } - } - if (key_pressed(KEY_RIGHT)) { - btn_right.frame = 0; - btn_right.state = BTN_STATE_PRESSED; - } else if (key_hold(KEY_RIGHT)) { - size_t n_frames = animation_states[btn_right.state]->n_frames; - if (btn_right.frame < n_frames - 1) { - btn_right.frame++; - } - } else { - // Finish the animation and reset idle state. - size_t n_frames = animation_states[btn_right.state]->n_frames; - if (btn_right.frame > 0 && btn_right.frame < n_frames - 1) { - btn_right.frame++; - } else { - btn_right.frame = 0; - btn_right.state = BTN_STATE_IDLE; - } - } - if (key_pressed(KEY_L)) { - btn_l.frame = 0; - btn_l.state = BTN_STATE_PRESSED; - } else if (key_hold(KEY_L)) { - size_t n_frames = animation_states[btn_l.state]->n_frames; - if (btn_l.frame < n_frames - 1) { - btn_l.frame++; - } + buttons[0].state = BTN_STATE_HOLD; } else { - // Finish the animation and reset idle state. - size_t n_frames = animation_states[btn_l.state]->n_frames; - if (btn_l.frame > 0 && btn_l.frame < n_frames - 1) { - btn_l.frame++; - } else { - btn_l.frame = 0; - btn_l.state = BTN_STATE_IDLE; - } - } - if (key_pressed(KEY_R)) { - btn_r.frame = 0; - btn_r.state = BTN_STATE_PRESSED; - } else if (key_hold(KEY_R)) { - size_t n_frames = animation_states[btn_r.state]->n_frames; - if (btn_r.frame < n_frames - 1) { - btn_r.frame++; - } - } else { - // Finish the animation and reset idle state. - size_t n_frames = animation_states[btn_r.state]->n_frames; - if (btn_r.frame > 0 && btn_r.frame < n_frames - 1) { - btn_r.frame++; - } else { - btn_r.frame = 0; - btn_r.state = BTN_STATE_IDLE; - } + buttons[0].state = BTN_STATE_RELEASED; } if (key_hold(KEY_DOWN)) { @@ -838,17 +897,21 @@ int main(void) { x += 3; } - OBJ_ATTR_2(btn_b.id) = sprites[btn_b.id].tile_start + animation_states[btn_b.state]->tile_offsets[btn_b.frame]; - OBJ_ATTR_2(btn_a.id) = sprites[btn_a.id].tile_start + animation_states[btn_a.state]->tile_offsets[btn_a.frame]; - OBJ_ATTR_2(btn_up.id) = sprites[btn_up.id].tile_start + animation_states[btn_up.state]->tile_offsets[btn_up.frame]; - OBJ_ATTR_2(btn_down.id) = sprites[btn_down.id].tile_start + animation_states[btn_down.state]->tile_offsets[btn_down.frame]; - OBJ_ATTR_2(btn_left.id) = sprites[btn_left.id].tile_start + animation_states[btn_left.state]->tile_offsets[btn_left.frame]; - OBJ_ATTR_2(btn_right.id) = sprites[btn_right.id].tile_start + animation_states[btn_right.state]->tile_offsets[btn_right.frame]; - OBJ_ATTR_2(btn_l.id) = sprites[btn_l.id].tile_start + animation_states[btn_l.state]->tile_offsets[btn_l.frame]; - OBJ_ATTR_2(btn_r.id) = sprites[btn_r.id].tile_start + animation_states[btn_r.state]->tile_offsets[btn_r.frame]; + // OBJ_ATTR_2(btn_b.id) = sprites[btn_b.id].tile_start + animation_states[btn_b.state]->tile_offsets[btn_b.frame]; + // OBJ_ATTR_2(btn_a.id) = sprites[btn_a.id].tile_start + animation_states[btn_a.state]->tile_offsets[btn_a.frame]; + // OBJ_ATTR_2(btn_up.id) = sprites[btn_up.id].tile_start + animation_states[btn_up.state]->tile_offsets[btn_up.frame]; + // // OBJ_ATTR_2(btn_down.id) = sprites[btn_down.id].tile_start + animation_states[btn_down.state]->tile_offsets[btn_down.frame]; + // OBJ_ATTR_2(btn_left.id) = sprites[btn_left.id].tile_start + animation_states[btn_left.state]->tile_offsets[btn_left.frame]; + // OBJ_ATTR_2(btn_right.id) = sprites[btn_right.id].tile_start + animation_states[btn_right.state]->tile_offsets[btn_right.frame]; + // OBJ_ATTR_2(btn_l.id) = sprites[btn_l.id].tile_start + animation_states[btn_l.state]->tile_offsets[btn_l.frame]; + // OBJ_ATTR_2(btn_r.id) = sprites[btn_r.id].tile_start + animation_states[btn_r.state]->tile_offsets[btn_r.frame]; frame_counter++; BG_H_SCROLL_0 = x; BG_V_SCROLL_0 = y; + + for (size_t i = 0; i < sizeof(buttons) / sizeof(MultiSprite); ++i) { + button_tick(&buttons[i]); + } }; return 0; -- cgit v1.2.1