add missing tools/pngdump to the repo
[gbajam22] / src / menuscr.c
1 #include "game.h"
2 #include "data.h"
3 #include "gba.h"
4 #include "util.h"
5 #include "dma.h"
6 #include "input.h"
7 #include "sprite.h"
8 #include "debug.h"
9 #include "scoredb.h"
10
11 enum {
12         MENU_START,
13         MENU_CTRL,
14         MENU_COLORS,
15         MENU_SCORE,
16
17         NUM_MENU_ITEMS
18 };
19
20 static int menuscr_start(void);
21 static void menuscr_stop(void);
22 static void menuscr_frame(void);
23 static void menuscr_vblank(void);
24
25 static struct screen menuscr = {
26         "menu",
27         menuscr_start,
28         menuscr_stop,
29         menuscr_frame,
30         menuscr_vblank
31 };
32
33 static int num_vbl;
34 static int cur_x, cur_y;
35 static int sel;
36 static int running;
37
38 static const short pos[][2] = {{76, 88}, {87, 108}, {29, 128}, {75, 148}};
39 #define CUR_XOFFS       16
40
41 struct screen *init_menu_screen(void)
42 {
43         return &menuscr;
44 }
45
46 static void setup_palette(void)
47 {
48         int i;
49         unsigned char *cmap = gba_colors ? menuscr_gba_cmap : menuscr_cmap;
50
51         for(i=0; i<256; i++) {
52                 int r = cmap[i * 3];
53                 int g = cmap[i * 3 + 1];
54                 int b = cmap[i * 3 + 2];
55                 gba_bgpal[i] = RGB555(r, g, b);
56         }
57 }
58
59 static int menuscr_start(void)
60 {
61         gba_setmode(4, DISPCNT_BG2 | DISPCNT_OBJ);
62         dma_copy16(3, gba_vram_lfb0, menuscr_pixels, 240 * 160 / 2, 0);
63
64         setup_palette();
65
66         spr_setup(16, 4, spr_menu_pixels, spr_menu_cmap);
67
68         wait_vblank();
69         spr_clear();
70
71         cur_x = pos[sel][0] - CUR_XOFFS;
72         cur_y = pos[sel][1];
73
74         running = 1;
75         return 0;
76 }
77
78 static void menuscr_stop(void)
79 {
80         running = 0;
81         wait_vblank();
82         spr_clear();
83 }
84
85 static void menuscr_frame(void)
86 {
87         update_keyb();
88
89         if(KEYPRESS(BN_START)) {
90                 change_screen(find_screen("game"));
91                 return;
92         }
93
94         if(KEYPRESS(BN_A)) {
95                 switch(sel) {
96                 case MENU_START:
97                         change_screen(find_screen("game"));
98                         return;
99                 case MENU_CTRL:
100                         change_screen(find_screen("controls"));
101                         return;
102                 default:
103                         break;
104                 }
105         }
106
107         if(KEYPRESS(BN_DOWN) && sel <= NUM_MENU_ITEMS) {
108                 cur_x = pos[++sel][0] - CUR_XOFFS;
109                 cur_y = pos[sel][1];
110         }
111         if(KEYPRESS(BN_UP) && sel > 0) {
112                 cur_x = pos[--sel][0] - CUR_XOFFS;
113                 cur_y = pos[sel][1];
114         }
115         if((KEYPRESS(BN_LEFT) || KEYPRESS(BN_RIGHT)) && sel == MENU_COLORS) {
116                 gba_colors ^= 1;
117                 setup_palette();
118                 scores[10].score = (scores[10].score & ~1) | (gba_colors & 1);
119                 save_scores();
120         }
121
122         wait_vblank();
123 }
124
125 static const int curspr[] = {
126         SPRID(0, 0), SPRID(32, 0), SPRID(64, 0), SPRID(96, 0),
127         SPRID(0, 16), SPRID(32, 16), SPRID(64, 16), SPRID(96, 16)
128 };
129
130 #define MENU_COLOR_FBPTR                (void*)(VRAM_LFB_FB0_ADDR + 117 * 240)
131
132 static void menuscr_vblank(void)
133 {
134         int anm, frm;
135         unsigned int flags = SPR_SZ32 | SPR_HRECT | SPR_256COL;
136         void *src;
137
138         if(!running) return;
139
140         anm = (num_vbl++ >> 3) & 0xf;
141         frm = anm & 7;
142
143         if(anm >= 8) flags |= SPR_VFLIP;
144
145         spr_oam(0, 0, curspr[frm], cur_x - 16, cur_y - 8, flags);
146
147         src = menuscr_pixels + (gba_colors ? 160 : 117) * 240;
148         dma_copy32(3, MENU_COLOR_FBPTR, src, 16 * 240 / 4, 0);
149 }