From c3135b53ebb11524c5697a4766dca73e6bb56f0b Mon Sep 17 00:00:00 2001 From: Koji Ikarashi Date: Tue, 24 Nov 2015 15:50:00 -0800 Subject: [PATCH] New weapon select screen (beta) --- game.c | 116 ++++++++++++++++++++++++++++---------------------- metasprites.h | 17 ++++++++ splatood.nes | Bin 40976 -> 40976 bytes 3 files changed, 82 insertions(+), 51 deletions(-) diff --git a/game.c b/game.c index 38e0190..9d9a43a 100644 --- a/game.c +++ b/game.c @@ -158,13 +158,7 @@ const unsigned char* const levelList[LEVELS_ALL*4]={ }; /* Weapon Select */ -const unsigned char select_weapon_1[] = "Player 1 Select Weapon"; -const unsigned char select_weapon_2[] = "Player 2 Select Weapon"; -const unsigned char* const select_weapon[] = { select_weapon_1, select_weapon_2 }; -const unsigned char weapon_roller[] = "Roller"; -const unsigned char weapon_charger[] = "Charger"; -// Order weapons by their constants (see WPN_ROLLER, etc above) -const unsigned char* const weapon_list[NUM_WPNS] = { weapon_roller, weapon_charger }; +const unsigned char select_weapon[] = "Select Weapon"; const unsigned int projectile_speed[] = { PROJECTILE_SPEED_ROLLER, PROJECTILE_SPEED_CHARGER }; const unsigned char weapon_ranges[] = { PROJECTILE_DISTANCE_ROLLER, PROJECTILE_DISTANCE_CHARGER }; const unsigned char weapon_cooldown[] = { PROJECTILE_WAIT_TIME_ROLLER, PROJECTILE_WAIT_TIME_CHARGER }; @@ -184,7 +178,7 @@ static unsigned char palette_state[64]; #pragma bssseg (push,"ZEROPAGE") #pragma dataseg(push,"ZEROPAGE") -static unsigned char i,j,k; +static unsigned char i,j; static unsigned char ptr,spr; static unsigned char px,py; static unsigned char wait; @@ -518,58 +512,80 @@ void show_select_map() { } } -/** - * Weapon select screen. +/* + * Two-player weapon select. + * + * This needs to be expanded to support more than two players, + * but I leave that as an exercise for later. */ -void show_select_weapon(unsigned char player_id) { - player_wpn[player_id] = WPN_ROLLER; +void show_select_weapon(void) { + int player_id; + player_wpn[0] = WPN_ROLLER; + player_wpn[1] = WPN_ROLLER; + + ppu_off(); + pal_bg(palEndgame); + pal_spr(palCharacters); + + /* We don't use an existing nametable, but instead clear out NAMETABLE_A */ + vram_adr(NAMETABLE_A); + vram_fill(0xa0,1024-64); + vram_fill(0,64); + + print_str(NAMETABLE_A+0x0E9,select_weapon); + + oam_clear(); + + ppu_on_all(); + while (1) { - /* We disable the PPU while we draw text. */ - ppu_off(); - pal_bg(palEndgame); +next: - /* We don't use an existing nametable, but instead clear out NAMETABLE_A */ - vram_adr(NAMETABLE_A); - vram_fill(0xa0,1024-64); - vram_fill(0,64); +#define A_HEIGHT 80 +#define B_HEIGHT 120 +#define LEFT 100 +#define RIGHT 140 - print_str(NAMETABLE_A+0x0E7,select_weapon[player_id]); - - /* Weapon names */ - for (i = 0; i < NUM_WPNS; ++i) { - print_str(NAMETABLE_A+0x148+0x20*i,weapon_list[i]); + if (player_wpn[0] == WPN_ROLLER) { + oam_meta_spr(LEFT, A_HEIGHT, 0<<4, SprPlayers[0][WPN_ROLLER][0][0]); + oam_meta_spr(RIGHT, A_HEIGHT, 1<<4, unselected_charger); + } else { + oam_meta_spr(LEFT, A_HEIGHT, 0<<4, unselected_roller); + oam_meta_spr(RIGHT, A_HEIGHT, 1<<4, SprPlayers[0][WPN_CHARGER][0][0]); } - /* - * A squid represents the current selection. - */ - print_str(NAMETABLE_A+0x146+0x20*player_wpn[player_id],selector); - ppu_on_bg(); + if (player_wpn[1] == WPN_ROLLER) { + oam_meta_spr(LEFT, B_HEIGHT, 2<<4, SprPlayers[1][WPN_ROLLER][0][0]); + oam_meta_spr(RIGHT, B_HEIGHT, 3<<4, unselected_charger); + } else { + oam_meta_spr(LEFT, B_HEIGHT, 2<<4, unselected_roller); + oam_meta_spr(RIGHT, B_HEIGHT, 3<<4, SprPlayers[1][WPN_CHARGER][0][0]); + } - /* Loop waiting for input. */ while (1) { ppu_wait_frame(); - j = pad_trigger(player_id); - /* Start - Select weapon */ - if (j & PAD_START) return; - /* Up - move cursor up */ - if (j & PAD_UP) { - if (player_wpn[player_id] == 0) { - player_wpn[player_id] = NUM_WPNS-1; - } else { - player_wpn[player_id] -= 1; - } + for (player_id = 0; player_id < 2; player_id++) { + j = pad_trigger(player_id); + /* Start - Select weapon */ + if (j & PAD_START) return; + /* Up - move cursor up */ + if (j & PAD_UP) { + if (player_wpn[player_id] == 0) { + player_wpn[player_id] = NUM_WPNS-1; + } else { + player_wpn[player_id] -= 1; + } - break; - } - /* Select or Down - move cursor down */ - if (j & PAD_SELECT || j & PAD_DOWN) { - player_wpn[player_id] += 1; - if (player_wpn[player_id] == NUM_WPNS) player_wpn[player_id] = 0; - break; + goto next; + } + /* Select or Down - move cursor down */ + if (j & PAD_SELECT || j & PAD_LEFT || j & PAD_RIGHT) { + player_wpn[player_id] += 1; + if (player_wpn[player_id] == NUM_WPNS) player_wpn[player_id] = 0; + goto next; + } } } - } } @@ -1246,9 +1262,7 @@ void main(void) { show_select_map(); /* Select weapons */ - for (k = 0; k < NUM_WPNS; ++k) { - show_select_weapon(k); - } + show_select_weapon(); /* Start the game. */ game_loop(); diff --git a/metasprites.h b/metasprites.h index 5ddbf7a..2a79b62 100644 --- a/metasprites.h +++ b/metasprites.h @@ -384,3 +384,20 @@ const unsigned char judd_right[] = { 128, }; + +/* Sprites for unselected stuff */ +const unsigned char unselected_roller[] = { + 0,-1,0x40,2, + 8,-1,0x41,2, + 0, 7,0x50,2, + 8, 7,0x51,2, + 128 +}; + +const unsigned char unselected_charger[] = { + 0,-1,0x00,2, + 8,-1,0x01,2, + 0, 7,0x10,2, + 8, 7,0x11,2, + 128 +}; diff --git a/splatood.nes b/splatood.nes index 5fcb1f88e666479ecc5c52fec70c86f52f8be8e3..249738f3b09fe09f4e4a2423d948a88cc0dc8446 100644 GIT binary patch delta 10831 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 JQi>D#{|A=^7uWy* delta 10613 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