20 static int menuscr_start(void);
21 static void menuscr_stop(void);
22 static void menuscr_frame(void);
23 static void menuscr_vblank(void);
25 static struct screen menuscr = {
34 static int cur_x, cur_y;
38 static const short pos[][2] = {{76, 88}, {87, 108}, {29, 128}, {75, 148}};
41 struct screen *init_menu_screen(void)
46 static void setup_palette(void)
49 unsigned char *cmap = gba_colors ? menuscr_gba_cmap : menuscr_cmap;
51 for(i=0; i<256; i++) {
53 int g = cmap[i * 3 + 1];
54 int b = cmap[i * 3 + 2];
55 gba_bgpal[i] = RGB555(r, g, b);
59 static int menuscr_start(void)
61 gba_setmode(4, DISPCNT_BG2 | DISPCNT_OBJ);
62 dma_copy16(3, gba_vram_lfb0, menuscr_pixels, 240 * 160 / 2, 0);
66 spr_setup(16, 4, spr_menu_pixels, spr_menu_cmap);
71 cur_x = pos[sel][0] - CUR_XOFFS;
78 static void menuscr_stop(void)
85 static void menuscr_frame(void)
89 if(KEYPRESS(BN_START)) {
90 change_screen(find_screen("game"));
97 change_screen(find_screen("game"));
100 change_screen(find_screen("controls"));
107 if(KEYPRESS(BN_DOWN) && sel <= NUM_MENU_ITEMS) {
108 cur_x = pos[++sel][0] - CUR_XOFFS;
111 if(KEYPRESS(BN_UP) && sel > 0) {
112 cur_x = pos[--sel][0] - CUR_XOFFS;
115 if((KEYPRESS(BN_LEFT) || KEYPRESS(BN_RIGHT)) && sel == MENU_COLORS) {
118 scores[10].score = (scores[10].score & ~1) | (gba_colors & 1);
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)
130 #define MENU_COLOR_FBPTR (void*)(VRAM_LFB_FB0_ADDR + 117 * 240)
132 static void menuscr_vblank(void)
135 unsigned int flags = SPR_SZ32 | SPR_HRECT | SPR_256COL;
140 anm = (num_vbl++ >> 3) & 0xf;
143 if(anm >= 8) flags |= SPR_VFLIP;
145 spr_oam(0, 0, curspr[frm], cur_x - 16, cur_y - 8, flags);
147 src = menuscr_pixels + (gba_colors ? 160 : 117) * 240;
148 dma_copy32(3, MENU_COLOR_FBPTR, src, 16 * 240 / 4, 0);