keep scores and settings in SRAM
[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[0][0] - CUR_XOFFS;
72         cur_y = pos[0][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) || (sel == 0 && KEYPRESS(BN_A))) {
90                 change_screen(find_screen("game"));
91                 return;
92         }
93
94         if(KEYPRESS(BN_DOWN) && sel <= NUM_MENU_ITEMS) {
95                 cur_x = pos[++sel][0] - CUR_XOFFS;
96                 cur_y = pos[sel][1];
97         }
98         if(KEYPRESS(BN_UP) && sel > 0) {
99                 cur_x = pos[--sel][0] - CUR_XOFFS;
100                 cur_y = pos[sel][1];
101         }
102         if((KEYPRESS(BN_LEFT) || KEYPRESS(BN_RIGHT)) && sel == MENU_COLORS) {
103                 gba_colors ^= 1;
104                 setup_palette();
105                 scores[10].score = (scores[10].score & ~1) | (gba_colors & 1);
106                 save_scores();
107         }
108
109         wait_vblank();
110 }
111
112 static const int curspr[] = {
113         SPRID(0, 0), SPRID(32, 0), SPRID(64, 0), SPRID(96, 0),
114         SPRID(0, 16), SPRID(32, 16), SPRID(64, 16), SPRID(96, 16)
115 };
116
117 #define MENU_COLOR_FBPTR                (void*)(VRAM_LFB_FB0_ADDR + 117 * 240)
118
119 static void menuscr_vblank(void)
120 {
121         int anm, frm;
122         unsigned int flags = SPR_SZ32 | SPR_HRECT | SPR_256COL;
123         void *src;
124
125         if(!running) return;
126
127         anm = (num_vbl++ >> 3) & 0xf;
128         frm = anm & 7;
129
130         if(anm >= 8) flags |= SPR_VFLIP;
131
132         spr_oam(0, 0, curspr[frm], cur_x - 16, cur_y - 8, flags);
133
134         src = menuscr_pixels + (gba_colors ? 160 : 117) * 240;
135         dma_copy32(3, MENU_COLOR_FBPTR, src, 16 * 240 / 4, 0);
136 }