Files
sm-vita/src/sm_81.c
snesrev 0b58368de0 Lots of code cleanup (#32)
### Description
<!-- What is the purpose of this PR and what it adds? -->

### Will this Pull Request break anything? 
<!-- Will it break the compiling? -->

### Suggested Testing Steps
<!-- See if the compiling fails/break anything in the game. -->
2023-04-03 21:56:08 +02:00

2567 lines
78 KiB
C

// SRAM, spritemap processing & menus
#include "sm_rtl.h"
#include "ida_types.h"
#include "variables.h"
#include "funcs.h"
#include "enemy_types.h"
#define kOffsetToSaveSlot ((uint16*)RomFixedPtr(0x81812b))
#define kPackedBytesPerArea_Count ((uint8*)RomFixedPtr(0x818131))
#define kPackedBytesPerArea_PackedOffs ((uint16*)RomFixedPtr(0x818138))
#define kPackedBytesPerArea_UnpackedOffs ((uint16*)RomFixedPtr(0x8182d6))
#define kMenuPalettes ((uint16*)RomFixedPtr(0x8ee400))
#define kZebesAndStarsTilemap ((uint16*)RomFixedPtr(0x8edc00))
#define kAreaMapForegroundSetDefs ((uint16*)RomFixedPtr(0x81a4e6))
#define kAreaMapForegroundColors ((uint16*)RomFixedPtr(0x81a40e))
#define kBg2RoomSelectMapTilemap ((uint16*)RomFixedPtr(0xb6e000))
#define kFileSelectExpandingSquareTilemap ((uint16*)RomFixedPtr(0x81b14b))
#define kMapIconDataPointers ((MapIconDataPointers*)RomFixedPtr(0x82c7cb))
#define g_word_82C749 ((uint16*)RomFixedPtr(0x82c749))
#define kRoomState_aa82_aa8f (*(RoomDefRoomstate*)RomFixedPtr(0x8faa8f))
#define kLeftMapScrollArrowData (*(MapScrollArrowData*)RomFixedPtr(0x81af32))
#define kRightMapScrollArrowData (*(MapScrollArrowData*)RomFixedPtr(0x81af3c))
#define kUpMapScrollArrowData (*(MapScrollArrowData*)RomFixedPtr(0x81af46))
#define kDownMapScrollArrowData (*(MapScrollArrowData*)RomFixedPtr(0x81af50))
#define g_off_82C569 ((uint16*)RomFixedPtr(0x82c569))
#define kSamusSpritemapTable ((uint16*)RomFixedPtr(0x92808d))
#define g_off_93A1A1 ((uint16*)RomFixedPtr(0x93a1a1))
#define kExpandingSquareVels ((ExpandingSquareVels*)RomFixedPtr(0x81aa34))
static const uint16 kFileSelectMap_AreaIndexes[6] = { 0, 3, 5, 1, 4, 2 };
void SoftReset(void) {
game_state = 0xffff;
}
void SaveToSram(uint16 a) { // 0x818000
uint16 v7;
uint16 v11;
uint16 r20 = 0;
uint16 r18 = 2 * (a & 3);
for (int i = 94; i >= 0; i -= 2)
player_data_saved[i >> 1] = *(uint16 *)((uint8 *)&equipped_items + i);
uint16 v3 = area_index * 256;
uint16 v4 = 0;
do {
explored_map_tiles_saved[v3 >> 1] = *(uint16 *)&map_tiles_explored[v4];
v4 += 2;
v3 += 2;
} while ((int16)(v4 - 256) < 0);
PackMapToSave();
sram_save_station_index = load_station_index;
sram_area_index = area_index;
uint16 v5 = kOffsetToSaveSlot[r18 >> 1];
uint16 *v6 = player_data_saved;
do {
v7 = *v6++;
*(uint16 *)(&g_sram[2 * (v5 >> 1)]) = v7;
r20 += v7;
v5 += 2;
} while (v6 != plm_instruction_timer);
uint16 v8 = r18;
uint16 v9 = r20;
int v10 = r18 >> 1;
*(uint16 *)(&g_sram[2 * v10]) = r20;
*(uint16 *)(&g_sram[2 * v10 + 0x1FF0]) = v9;
v11 = ~v9;
*(uint16 *)(&g_sram[2 * v10 + 8]) = v11;
*(uint16 *)(&g_sram[2 * v10 + 0x1FF8]) = v11;
RtlWriteSram();
}
uint8 LoadFromSram(uint16 a) { // 0x818085
uint16 r20 = 0;
uint16 r18 = 2 * (a & 3);
uint16 v1 = kOffsetToSaveSlot[a & 3];
uint16 *v2 = player_data_saved;
do {
uint16 v3 = kSramChecksum[v1 >> 1];
*v2++ = v3;
r20 += v3;
v1 += 2;
} while (v2 != plm_instruction_timer);
int v4 = r18 >> 1;
if (r20 == kSramChecksum[v4] && (r20 ^ 0xffff) == kSramChecksumInverted[v4]
|| r20 == kSramChecksumUpper[v4] && (r20 ^ 0xffff) == kSramChecksumInvertedUpper[v4]) {
for (int i = 94; i >= 0; i -= 2)
*(uint16 *)((uint8 *)&equipped_items + i) = player_data_saved[i >> 1];
UnpackMapFromSave();
load_station_index = sram_save_station_index;
area_index = sram_area_index;
return 0;
} else {
r20 = 0;
uint16 v7 = kOffsetToSaveSlot[r18 >> 1];
uint16 v8 = ADDR16_OF_RAM(*player_data_saved);
uint16 v9 = 0;
do {
kSramChecksum[v7 >> 1] = v9;
v9 += r20;
r20 = v9;
v7 += 2;
v8 += 2;
} while (v8 != ADDR16_OF_RAM(*plm_instruction_timer)); // 0xDE1C
load_station_index = 0;
area_index = 0;
return 1;
}
}
void UnpackMapFromSave(void) { // 0x8182E4
for (int i = 1792; i >= 0; i -= 2)
explored_map_tiles_saved[i >> 1] = 0;
for(int i = 0; i < 6; i++) {
uint16 r20 = swap16(i);
int n = kPackedBytesPerArea_Count[i];
uint16 r0 = kPackedBytesPerArea_UnpackedOffs[i];
int v3 = kPackedBytesPerArea_PackedOffs[i];
LongPtr r3 = { ADDR16_OF_RAM(*explored_map_tiles_saved), 126};
do {
uint16 v4 = r20 + *RomPtr_81(r0);
IndirWriteByte(r3, v4, compressed_map_data[v3]);
++r0;
++v3;
} while (--n);
}
}
void PackMapToSave(void) { // 0x81834B
uint16 r26 = 0;
do {
int n = kPackedBytesPerArea_Count[r26];
int v0 = r26;
uint16 r0 = kPackedBytesPerArea_UnpackedOffs[v0];
int v1 = kPackedBytesPerArea_PackedOffs[v0];
uint16 r24 = swap16(r26);
LongPtr r3 = { ADDR16_OF_RAM(*explored_map_tiles_saved), 126 };
do {
int v3 = r24 + *RomPtr_81(r0);
compressed_map_data[v1] = IndirReadByte(r3, v3);
++r0;
++v1;
} while (--n);
++r26;
} while (sign16(r26 - 6));
}
void DrawSpritemap(uint8 db, uint16 j, uint16 x_r20, uint16 y_r18, uint16 chr_r22) { // 0x81879F
const uint8 *pp = RomPtrWithBank(db, j);
int n = GET_WORD(pp);
pp += 2;
int idx = oam_next_ptr;
for (; (n != 0) && (idx < 0x200); n--) {
OamEnt *oam = gOamEnt(idx);
int x = x_r20 + GET_WORD(pp);
int y = (uint8)y_r18 + pp[2];
// can this be simplified?
if (!sign8(pp[2]) ? (y >= 0xe0) : (y & 0x100) ? ((uint8)y >= 0xe0) : ((uint8)y < 0xe0))
x = 0x180, y = 0xe0;
oam->xcoord = x;
oam->ycoord = y;
*(uint16 *)&oam->charnum = chr_r22 | GET_WORD(pp + 3) & 0xF1FF;
oam_ext[idx >> 5] |= (((x & 0x100) >> 8) | (*(int16 *)pp < 0) * 2) << (2 * ((idx >> 2) & 7));
idx += 4;
pp += 5;
}
oam_next_ptr = idx;
}
void DrawSpritemapOffScreen(uint16 j, uint16 x_r20, uint16 y_r18, uint16 chr_r22) { // 0x818853
const uint8 *pp = RomPtr_8C(j);
int n = GET_WORD(pp);
pp += 2;
int idx = oam_next_ptr;
for (; (n != 0) && (idx < 0x200); n--) {
OamEnt *oam = gOamEnt(idx);
int x = x_r20 + GET_WORD(pp);
int y = (uint8)y_r18 + pp[2];
// can this be simplified?
if (!sign8(pp[2]) ? (y < 0xe0) : (y & 0x100) ? ((uint8)y < 0xe0) : ((uint8)y >= 0xe0))
x = 0x180, y = 0xe0;
oam->xcoord = x;
oam->ycoord = y;
*(uint16 *)&oam->charnum = chr_r22 | *(uint16 *)(pp + 3) & 0xF1FF;
oam_ext[idx >> 5] |= (((x & 0x100) >> 8) | (*(int16 *)pp < 0) * 2) << (2 * ((idx >> 2) & 7));
idx += 4;
pp += 5;
}
oam_next_ptr = idx;
}
void DrawMenuSpritemap(uint16 a, uint16 k, uint16 j, uint16 chr_r3) { // 0x81891F
const uint8 *pp = RomPtr_82(g_off_82C569[a]);
int n = GET_WORD(pp);
pp += 2;
int idx = oam_next_ptr;
for (; n != 0; n--) {
OamEnt *oam = gOamEnt(idx);
uint16 x = k + GET_WORD(pp);
oam->xcoord = x;
oam_ext[idx >> 5] |= (((x & 0x100) >> 8) | (*(int16 *)pp < 0) * 2) << (2 * ((idx >> 2) & 7));
oam->ycoord = j + pp[2];
*(uint16 *)&oam->charnum = chr_r3 | GET_WORD(pp + 3) & 0xF1FF;
pp += 5;
idx = (idx + 4) & 0x1FF;
}
oam_next_ptr = idx;
}
void DrawSamusSpritemap(uint16 a, uint16 x_pos, uint16 y_pos) { // 0x8189AE
if (kSamusSpritemapTable[a] == 0)
return;
const uint8 *pp = RomPtr_92(kSamusSpritemapTable[a]);
int idx = oam_next_ptr;
int n = GET_WORD(pp);
pp += 2;
for(; n != 0; n--) {
uint16 x = x_pos + GET_WORD(pp);
OamEnt *v9 = gOamEnt(idx);
v9->xcoord = x;
oam_ext[idx >> 5] |= (((x & 0x100) >> 8) | (*(int16 *)pp < 0) * 2) << (2 * ((idx >> 2) & 7));
v9->ycoord = y_pos + pp[2];
*(uint16 *)&v9->charnum = GET_WORD(pp + 3);
pp += 5;
idx = (idx + 4) & 0x1FF;
}
oam_next_ptr = idx;
}
void DrawBeamGrappleSpritemap(uint16 a, uint16 x_r20, uint16 y_r18) { // 0x818A37
DrawGrappleOrProjectileSpritemap(RomPtr_93(g_off_93A1A1[a]), x_r20, y_r18);
}
void DrawProjectileSpritemap(uint16 k, uint16 x_r20, uint16 y_r18) { // 0x818A4B
DrawGrappleOrProjectileSpritemap(RomPtr_93(projectile_spritemap_pointers[k >> 1]), x_r20, y_r18);
}
void DrawGrappleOrProjectileSpritemap(const uint8 *pp, uint16 x_r20, uint16 y_r18) { // 0x818A5F
int idx = oam_next_ptr;
int n = GET_WORD(pp);
pp += 2;
for (; n != 0; n--) {
uint16 x = x_r20 + GET_WORD(pp);
OamEnt *v4 = gOamEnt(idx);
v4->xcoord = x;
oam_ext[idx >> 5] |= (((x & 0x100) >> 8) | (*(int16 *)pp < 0) * 2) << (2 * ((idx >> 2) & 7));
v4->ycoord = y_r18 + pp[2];
*(uint16 *)&v4->charnum = GET_WORD(pp + 3);
pp += 5;
idx = (idx + 4) & 0x1FF;
}
oam_next_ptr = idx;
}
void DrawSpritemapWithBaseTile(uint8 db, uint16 j, uint16 r20_x, uint16 r18_y, uint16 r3, uint16 r0) { // 0x818AB8
if (j == 0)
return; // bug fix
uint8 *pp = (uint8 *)RomPtrWithBank(db, j);
int idx = oam_next_ptr;
int n = GET_WORD(pp);
pp += 2;
for(; n != 0; n--) {
OamEnt *oam = gOamEnt(idx);
uint16 x = r20_x + GET_WORD(pp + 0);
oam->xcoord = x;
oam_ext[idx >> 5] |= (((x & 0x100) >> 8) | (*(int16 *)pp < 0) * 2) << (2 * ((idx >> 2) & 7));
oam->ycoord = r18_y + pp[2];
*(uint16 *)&oam->charnum = r3 | (r0 + GET_WORD(pp + 3));
pp += 5;
idx = (idx + 4) & 0x1FF;
}
oam_next_ptr = idx;
}
void DrawSpritemapWithBaseTile2(uint8 db, uint16 j, uint16 r20_x, uint16 r18_y, uint16 r3, uint16 r0) { // 0x818B22
const uint8 *pp = RomPtrWithBank(db, j);
int idx = oam_next_ptr;
int n = GET_WORD(pp);
pp += 2;
for (; n != 0; n--) {
OamEnt *oam = gOamEnt(idx);
uint16 x = r20_x + GET_WORD(pp);
oam->xcoord = x;
oam_ext[idx >> 5] |= (((x & 0x100) >> 8) | (*(int16 *)pp < 0) * 2) << (2 * ((idx >> 2) & 7));
int y = pp[2] + (uint8)r18_y;
oam->ycoord = (!(y & 0x100) == !sign8(pp[2])) ? y : 0xf0;
*(uint16 *)&oam->charnum = r3 | (r0 + GET_WORD(pp + 3));
pp += 5;
idx = (idx + 4) & 0x1FF;
}
oam_next_ptr = idx;
}
void DrawSpritemapWithBaseTileOffscreen(uint8 db, uint16 j, uint16 r20_x, uint16 r18_y, uint16 r3, uint16 r0) { // 0x818B96
const uint8 *pp = RomPtrWithBank(db, j);
int idx = oam_next_ptr;
int n = GET_WORD(pp);
pp += 2;
for (; n != 0; n--) {
OamEnt *oam = gOamEnt(idx);
int x = r20_x + GET_WORD(pp);
oam->xcoord = x;
oam_ext[idx >> 5] |= (((x & 0x100) >> 8) | (*(int16 *)pp < 0) * 2) << (2 * ((idx >> 2) & 7));
int y = pp[2] + (uint8)r18_y;
oam->ycoord = (!(y & 0x100) != !sign8(pp[2])) ? y : 0xf0;
*(uint16 *)&oam->charnum = r3 | (r0 + GET_WORD(pp + 3));
pp += 5;
idx = (idx + 4) & 0x1FF;
}
oam_next_ptr = idx;
}
void DrawEnemyProjectileSpritemapWithBaseTile(uint8 db, uint16 j, uint16 x_r20, uint16 y_r18, uint16 chr_r26, uint16 chr_r28) { // 0x818C0A
const uint8 *pp = RomPtrWithBank(db, j);
int idx = oam_next_ptr;
int n = GET_WORD(pp);
pp += 2;
for (; n != 0; n--) {
OamEnt *oam = gOamEnt(idx);
uint16 x = x_r20 + GET_WORD(pp);
oam->xcoord = x;
oam_ext[idx >> 5] |= (((x & 0x100) >> 8) | (*(int16 *)pp < 0) * 2) << (2 * ((idx >> 2) & 7));
int y = pp[2] + (uint8)y_r18;
oam->ycoord = (!(y & 0x100) == !sign8(pp[2])) ? y : 0xf0;
*(uint16 *)&oam->charnum = chr_r28 | (chr_r26 + GET_WORD(pp + 3));
idx = (idx + 4) & 0x1FF;
pp += 5;
}
oam_next_ptr = idx;
}
void DrawEnemyProjectileSpritemapWithBaseTileOffscreen(uint8 db, uint16 j, uint16 x_r20, uint16 y_r18, uint16 chr_r26, uint16 chr_r28) { // 0x818C7F
const uint8 *pp = RomPtrWithBank(db, j);
int idx = oam_next_ptr;
int n = GET_WORD(pp);
pp += 2;
for (; n != 0; n--) {
OamEnt *oam = gOamEnt(idx);
uint16 x = x_r20 + GET_WORD(pp);
oam->xcoord = x;
oam_ext[idx >> 5] |= (((x & 0x100) >> 8) | (*(int16 *)pp < 0) * 2) << (2 * ((idx >> 2) & 7));
int y = pp[2] + (uint8)y_r18;
oam->ycoord = (!(y & 0x100) != !sign8(pp[2])) ? y : 0xf0;
*(uint16 *)&oam->charnum = chr_r28 | (chr_r26 + GET_WORD(pp + 3));
idx = (idx + 4) & 0x1FF;
pp += 5;
}
oam_next_ptr = idx;
}
void GameOverMenu_0_FadeOutConfigGfx(void) { // 0x818D0F
HandleFadeOut();
if ((reg_INIDISP & 0xF) == 0) {
ScreenOff();
QueueSfx3_Max6(1);
DisableHdmaObjects();
WaitUntilEndOfVblankAndClearHdma();
uint16 v0 = 0;
do {
ram3000.pause_menu_map_tilemap[v0 + 384] = palette_buffer[v0];
++v0;
} while ((int16)(v0 * 2 - 512) < 0);
uint16 v1 = 0;
do {
ram3000.pause_menu_map_tilemap[v1 + 640] = *(uint16 *)(&reg_INIDISP + v1 * 2);
++v1;
} while ((int16)(v1 * 2 - 54) < 0);
MapVramForMenu();
LoadInitialMenuTiles();
reg_BG1HOFS = 0;
reg_BG2HOFS = 0;
reg_BG3HOFS = 0;
reg_BG1VOFS = 0;
reg_BG2VOFS = 0;
reg_BG3VOFS = 0;
LoadMenuPalettes();
++menu_index;
}
}
void GameOverMenu_24_FadeIn(void) { // 0x818DA6
HandleFadeIn();
if ((reg_INIDISP & 0xF) == 15)
++menu_index;
}
void MapVramForMenu(void) { // 0x818DBA
reg_TS = 0;
reg_OBSEL = 3;
reg_BG1SC = 81;
reg_BG2SC = 88;
reg_BG3SC = 92;
reg_BG12NBA = 0;
reg_BG34NBA = 4;
reg_TM = 19;
}
void LoadInitialMenuTiles(void) { // 0x818DDB
WriteReg(VMADDL, 0);
WriteReg(VMADDH, 0);
WriteReg(VMAIN, 0x80);
static const StartDmaCopy unk_818DF1 = { 1, 1, 0x18, LONGPTR(0x8e8000), 0x5600 };
SetupDmaTransfer(&unk_818DF1);
WriteReg(MDMAEN, 2);
WriteReg(VMADDL, 0);
WriteReg(VMADDH, 0x30);
WriteReg(VMAIN, 0x80);
static const StartDmaCopy unk_818E11 = { 1, 1, 0x18, LONGPTR(0xb68000), 0x2000 };
SetupDmaTransfer(&unk_818E11);
WriteReg(MDMAEN, 2);
WriteReg(VMADDL, 0);
WriteReg(VMADDH, 0x60);
WriteReg(VMAIN, 0x80);
static const StartDmaCopy unk_818E31 = { 1, 1, 0x18, LONGPTR(0xb6c000), 0x2000 };
SetupDmaTransfer(&unk_818E31);
WriteReg(MDMAEN, 2);
WriteReg(VMADDL, 0);
WriteReg(VMADDH, 0x40);
WriteReg(VMAIN, 0x80);
static const StartDmaCopy unk_818E51 = { 1, 1, 0x18, LONGPTR(0x8ed600), 0x0600 };
SetupDmaTransfer(&unk_818E51);
WriteReg(MDMAEN, 2);
}
void LoadMenuPalettes(void) { // 0x818E60
uint16 v0 = 0;
do {
int v1 = v0 >> 1;
palette_buffer[v1] = kMenuPalettes[v1];
palette_buffer[v1 + 1] = kMenuPalettes[v1 + 1];
v0 += 4;
} while ((int16)(v0 - 512) < 0);
}
void GameOverMenu_3_Main(void) { // 0x819003
int16 v0;
int16 v1;
if ((joypad1_newkeys & kButton_Select) != 0
|| (joypad1_newkeys & kButton_Up) != 0
|| (joypad1_newkeys & kButton_Down) != 0) {
file_select_map_area_index ^= 1;
} else if ((joypad1_newkeys & (uint16)(kButton_B | kButton_Start | kButton_A)) != 0) {
if (file_select_map_area_index) {
++menu_index;
} else {
SaveToSram(selected_save_slot);
SoftReset();
}
return;
}
v0 = 30720;
if (file_select_map_area_index)
v0 = -30720;
v1 = v0 | 0x28;
OamEnt *v3 = gOamEnt(oam_next_ptr);
*(uint16 *)&v3->xcoord = v1;
*(uint16 *)&v3->charnum = 182;
oam_next_ptr += 4;
}
void RestorePalettesAndIoAfterDebugGameover(void) { // 0x81905B
int v0 = 0;
do {
palette_buffer[v0] = ram3000.pause_menu_map_tilemap[v0 + 384];
++v0;
} while ((int16)(v0 * 2 - 512) < 0);
int v1 = 0;
do {
*(uint16 *)(&reg_INIDISP + v1 * 2) = ram3000.pause_menu_map_tilemap[v1 + 640];
++v1;
} while ((int16)(v1 * 2 - 54) < 0);
}
void GameOverMenu_5_Continue(void) { // 0x81907E
WriteReg(VMADDL, 0);
WriteReg(VMADDH, 0x40);
WriteReg(VMAIN, 0x80);
static const StartDmaCopy unk_819093 = { 1, 1, 0x18, LONGPTR(0x9ab200), 0x2000 };
SetupDmaTransfer(&unk_819093);
WriteReg(MDMAEN, 2);
game_state = 16;
file_select_map_area_index = 0;
RestorePalettesAndIoAfterDebugGameover();
}
static Func_V *const kGameOverMenuFuncs[8] = { // 0x8190AE
GameOverMenu_0_FadeOutConfigGfx,
GameOverMenu_1_Init,
GameOverMenu_2_PlayMusic,
GameOverMenu_3_FadeIn,
GameOverMenu_4_Main,
GameOverMenu_5_FadeOutToGameMap,
GameOverMenu_6_LoadGameMapView,
GameOverMenu_7_FadeOutToSoftReset,
};
void GameOverMenu(void) {
kGameOverMenuFuncs[menu_index]();
}
void GameOverMenu_3_FadeIn(void) { // 0x8190CD
HandleGameOverBabyMetroid();
DrawMenuSelectionMissile();
HandleFadeIn();
if ((reg_INIDISP & 0xF) == 15)
++menu_index;
}
void GameOverMenu_5_FadeOutToGameMap(void) { // 0x8190E7
HandleGameOverBabyMetroid();
DrawMenuSelectionMissile();
HandleFadeOut();
if ((reg_INIDISP & 0xF) == 0)
++menu_index;
}
void GameOverMenu_7_FadeOutToSoftReset(void) { // 0x8190FE
DrawMenuSelectionMissile();
HandleGameOverBabyMetroid();
HandleFadeOut();
if ((reg_INIDISP & 0xF) == 0)
SoftReset();
}
void GameOverMenu_6_LoadGameMapView(void) { // 0x819116
DisableHdmaObjects();
WaitUntilEndOfVblankAndClearHdma();
game_state = kGameState_5_FileSelectMap;
menu_index = 0;
}
void GameOverMenu_4_Main(void) { // 0x81912B
HandleGameOverBabyMetroid();
DrawMenuSelectionMissile();
if ((joypad1_newkeys & kButton_Select) != 0
|| (joypad1_newkeys & kButton_Up) != 0
|| (joypad1_newkeys & kButton_Down) != 0) {
QueueSfx1_Max6(0x37);
file_select_map_area_index ^= 1;
} else if ((joypad1_newkeys & kButton_A) != 0) {
enemy_data[0].instruction_timer = 180;
if (file_select_map_area_index) {
menu_index = 7;
} else {
if (loading_game_state == kGameState_31_SetUpNewGame)
game_state = loading_game_state;
else
++menu_index;
LoadFromSram(selected_save_slot);
}
return;
}
uint16 v0 = 160;
if (file_select_map_area_index)
v0 = 192;
enemy_projectile_id[5] = 40;
enemy_projectile_id[10] = v0;
}
void GameOverMenu_1_Init(void) { // 0x8191A4
reg_TM = 17;
reg_COLDATA[0] = 32;
reg_COLDATA[1] = 64;
reg_COLDATA[2] = 0x80;
QueueMusic_Delayed8(0);
QueueMusic_Delayed8(0xFF03);
enemy_projectile_enable_flag = 1;
enemy_projectile_id[0] = 0;
int v0 = 0;
do {
((uint16*)ram3000.menu.menu_tilemap)[v0] = 15;
++v0;
} while ((int16)(v0 * 2 - 2048) < 0);
int v1 = vram_write_queue_tail;
VramWriteEntry *v2 = gVramWriteEntry(vram_write_queue_tail);
v2->size = 2048;
v2->src.addr = ADDR16_OF_RAM(ram3000.menu.menu_tilemap);
*(uint16 *)&v2->src.bank = 126;
v2->vram_dst = (reg_BG1SC & 0xFC) << 8;
vram_write_queue_tail = v1 + 7;
enemy_data[0].palette_index = 0;
LoadMenuTilemap(0x156, addr_kMenuTilemap_GameOver);
LoadMenuTilemap(0x38A, addr_kMenuTilemap_FindMetroidLarva);
LoadMenuTilemap(0x414, addr_kMenuTilemap_TryAgain);
LoadMenuTilemap(0x4CE, addr_kMenuTilemap_YesReturnToGame);
LoadMenuTilemap(0x5CE, addr_kMenuTilemap_NoGoToTitle);
enemy_data[0].current_instruction = 0;
enemy_data[0].instruction_timer = 0;
HandleGameOverBabyMetroid();
*(uint16 *)&reg_CGWSEL = gameplay_CGWSEL << 8;
DisableHdmaObjects();
WaitUntilEndOfVblankAndClearHdma();
EnableHdmaObjects();
static const SpawnHdmaObject_Args unk_819254 = { 0x00, 0x32, 0x927d };
static const SpawnHdmaObject_Args unk_81925C = { 0x00, 0x31, 0x928d };
SpawnHdmaObject(0x81, &unk_819254);
SpawnHdmaObject(0x81, &unk_81925C);
ScreenOn();
++menu_index;
screen_fade_delay = 0;
screen_fade_counter = 0;
file_select_map_area_index = 0;
enemy_projectile_id[5] = 40;
enemy_projectile_id[10] = 160;
}
void GameOverMenu_2_PlayMusic(void) { // 0x8193E8
if (!(HasQueuedMusic())) {
++menu_index;
QueueMusic_Delayed8(4);
}
}
static Func_V *const kFileSelectMenuFuncs[34] = { // 0x8193FB
FileSelectMenu_0_FadeOutConfigGfx,
FileSelectMenu_1_LoadFileSelectMenuBG2,
FileSelectMenu_2_InitMain,
FileSelectMenu_3_FadeInToMain,
FileSelectMenu_4_Main,
FileSelectMenu_5_FadeOutFromMain,
FileSelectMenu_6_FileCopyInit,
FileSelectMenu_7_FadeInFromMain,
FileSelectMenu_8,
FileSelectMenu_9_InitializeSelectDest,
FileSelectMenu_10_FileCopySelectDest,
FileSelectMenu_11_InitializeConfirm,
FileSelectMenu_12_FileCopyConfirm,
FileSelectMenu_13_FileCopyDoIt,
FileSelectMenu_14_CopyCompleted,
FileSelectMenu_15_FadeOutToMain,
FileSelectMenu_16,
FileSelectMenu_17_FadeInToMain,
FileSelectMenu_18,
FileSelectMenu_5_FadeOutFromMain,
FileSelectMenu_20_FileClearInit,
FileSelectMenu_7_FadeInFromMain,
FileSelectMenu_22_FileClearSelectSlot,
FileSelectMenu_23_FileClearInitConfirm,
FileSelectMenu_24_FileClearConfirm,
FileSelectMenu_25_FileClearDoClear,
FileSelectMenu_26_ClearCompleted,
FileSelectMenu_15_FadeOutToMain,
FileSelectMenu_16,
FileSelectMenu_17_FadeInToMain,
FileSelectMenu_30,
FileSelectMenu_31_TurnSamusHelmet,
FileSelectMenu_32_FadeOutToOptions,
FileSelectMenu_33_FadeOutToTitle,
};
void FileSelectMenu(void) {
kFileSelectMenuFuncs[menu_index]();
}
void FileSelectMenu_0_FadeOutConfigGfx(void) { // 0x81944E
HandleFadeOut();
if ((reg_INIDISP & 0xF) != 0)
return;
ScreenOff();
QueueSfx3_Max6(1);
DisableHdmaObjects();
WaitUntilEndOfVblankAndClearHdma();
++menu_index;
MapVramForMenu();
LoadInitialMenuTiles();
reg_BG1HOFS = 0;
reg_BG2HOFS = 0;
reg_BG3HOFS = 0;
reg_BG1VOFS = 0;
reg_BG2VOFS = 0;
reg_BG3VOFS = 0;
LoadFileSelectPalettes();
}
void LoadFileSelectPalettes(void) { // 0x819486
int v0 = 0;
do {
int v1 = v0 >> 1;
palette_buffer[v1] = kMenuPalettes[v1];
palette_buffer[v1 + 1] = kMenuPalettes[v1 + 1];
v0 += 4;
} while ((int16)(v0 - 512) < 0);
}
void FileSelectMenu_32_FadeOutToOptions(void) { // 0x8194A3
DrawMenuSelectionMissile();
DrawBorderAroundSamusData();
DrawFileSelectSamusHelmets();
HandleFadeOut();
if ((reg_INIDISP & 0xF) == 0) {
game_state = kGameState_2_GameOptionsMenu;
menu_index = 0;
int v0 = 0;
do {
*(uint16 *)((uint8 *)&enemy_projectile_enable_flag + v0) = 0;
v0 += 2;
} while ((int16)(v0 - 48) < 0);
}
}
void FileSelectMenu_33_FadeOutToTitle(void) { // 0x8194D5
DrawBorderAroundSamusData();
DrawFileSelectSamusHelmets();
HandleFadeOut();
if ((reg_INIDISP & 0xF) == 0)
SoftReset();
}
void FileSelectMenu_5_FadeOutFromMain(void) { // 0x8194EE
DrawMenuSelectionMissile();
FileSelectMenu_15_FadeOutToMain();
}
void FileSelectMenu_15_FadeOutToMain(void) { // 0x8194F4
HandleFadeOut();
reg_MOSAIC = reg_MOSAIC & 0x0F | (16 * (reg_INIDISP & 0xF)) ^ 0xF0;
if ((reg_INIDISP & 0xF) == 0) {
ScreenOff();
++menu_index;
}
}
static const uint16 kMenuSelectionMissileXY[12] = { // 0x81951E
0x30, 0xe,
0x58, 0xe,
0x80, 0xe,
0xa3, 0xe,
0xbb, 0xe,
0xd3, 0xe,
};
void FileSelectMenu_17_FadeInToMain(void) {
int v0 = (uint16)(4 * selected_save_slot) >> 1;
enemy_projectile_id[10] = kMenuSelectionMissileXY[v0];
enemy_projectile_id[5] = kMenuSelectionMissileXY[v0 + 1];
FileSelectMenu_7_FadeInFromMain();
}
void FileSelectMenu_7_FadeInFromMain(void) { // 0x819532
DrawMenuSelectionMissile();
HandleFadeIn();
reg_MOSAIC = reg_MOSAIC & 0x0F | (16 * (reg_INIDISP & 0xF)) ^ 0xF0;
if ((reg_INIDISP & 0xF) == 15)
++menu_index;
}
void FileSelectMenu_6_FileCopyInit(void) { // 0x819561
++menu_index;
FileSelectMenu_Func1();
}
void FileSelectMenu_Func1(void) { // 0x819566
ClearMenuTilemap();
enemy_data[0].palette_index = 0;
LoadMenuTilemap(0x52, addr_kMenuTilemap_DataCopyMode);
LoadMenuTilemap(0x150, addr_kMenuTilemap_CopyWhichData);
LoadMenuExitTilemap();
DrawFileCopySaveFileInfo();
SetInitialFileCopyMenuSelection();
SetFileCopyMenuSelectionMissilePosition();
enemy_projectile_id[16] = 0;
enemy_projectile_id[17] = 0;
}
void sub_819591(void) { // 0x819591
SetInitialFileCopyMenuSelection();
}
void SetInitialFileCopyMenuSelection(void) { // 0x819593
int v0 = nonempty_save_slots;
int v1 = 0;
do {
if (v0 & 1)
break;
v0 >>= 1;
++v1;
} while ((int16)(v1 - 3) < 0);
enemy_projectile_id[15] = v1;
}
void ClearMenuTilemap(void) { // 0x8195A6
for (int i = 2046; i >= 0; i -= 2)
*(uint16 *)((uint8 *)&ram3000.pause_menu_map_tilemap[768] + (uint16)i) = 15;
}
void LoadMenuExitTilemap(void) { // 0x8195B5
LoadMenuTilemap(0x688, addr_kMenuTilemap_Exit);
}
void DrawFileCopySaveFileInfo(void) { // 0x8195BE
LoadFromSram_(0);
enemy_data[0].palette_index = 0;
if ((nonempty_save_slots & 1) == 0)
enemy_data[0].palette_index = 1024;
DrawFileCopySaveSlotAInfo();
LoadFromSram_(1);
enemy_data[0].palette_index = 0;
if ((nonempty_save_slots & 2) == 0)
enemy_data[0].palette_index = 1024;
DrawFileCopySaveSlotBInfo();
LoadFromSram_(2);
enemy_data[0].palette_index = 0;
if ((nonempty_save_slots & 4) == 0)
enemy_data[0].palette_index = 1024;
DrawFileCopySaveSlotCInfo();
QueueTransferOfMenuTilemapToVramBG1();
}
void DrawFileCopySaveSlotAInfo(void) { // 0x81960F
DrawFileSelectionHealth((nonempty_save_slots & 1) == 0, 0x218);
DrawFileSelectionTime((nonempty_save_slots & 1) == 0, 0x272);
LoadMenuTilemap(0x234, addr_kMenuTilemap_TIME);
LoadMenuTilemap(0x208, addr_kMenuTilemap_SamusA);
}
void DrawFileCopySaveSlotBInfo(void) { // 0x81963F
DrawFileSelectionHealth(~nonempty_save_slots & 2, 0x318);
DrawFileSelectionTime(~nonempty_save_slots & 2, 0x372);
LoadMenuTilemap(0x334, addr_kMenuTilemap_TIME);
LoadMenuTilemap(0x308, addr_kMenuTilemap_SamusB);
}
void DrawFileCopySaveSlotCInfo(void) { // 0x81966F
DrawFileSelectionHealth(~nonempty_save_slots & 4, 0x418);
DrawFileSelectionTime(~nonempty_save_slots & 4, 0x472);
LoadMenuTilemap(0x434, addr_kMenuTilemap_TIME);
LoadMenuTilemap(0x408, addr_kMenuTilemap_SamusC);
}
void QueueTransferOfMenuTilemapToVramBG1(void) { // 0x81969F
uint16 v0 = vram_write_queue_tail;
VramWriteEntry *v1 = gVramWriteEntry(vram_write_queue_tail);
v1->size = 2048;
v1->src.addr = ADDR16_OF_RAM(ram3000.menu.menu_tilemap);
*(uint16 *)&v1->src.bank = 126;
v1->vram_dst = (reg_BG1SC & 0xFC) << 8;
vram_write_queue_tail = v0 + 7;
}
static const uint8 kBitShl[3] = { // 0x8196C2
1,
2,
4,
};
void FileSelectMenu_8(void) {
uint8 v0;
DrawBorderAroundDataCopyMode();
DrawMenuSelectionMissile();
if ((joypad1_newkeys & (kButton_Start | kButton_A)) != 0) {
QueueSfx1_Max6(0x37);
if (enemy_projectile_id[15] == 3) {
menu_index += 7;
} else {
enemy_projectile_id[16] = enemy_projectile_id[15];
++menu_index;
}
} else if ((joypad1_newkeys & 0x8000) != 0) {
menu_index += 7;
QueueSfx1_Max6(0x37);
} else {
if ((joypad1_newkeys & kButton_Up) != 0) {
v0 = enemy_projectile_id[15];
while ((--v0 & 0x80) == 0) {
if ((kBitShl[v0] & nonempty_save_slots) != 0) {
LABEL_16:
LOBYTE(enemy_projectile_id[15]) = v0;
QueueSfx1_Max6(0x37);
SetFileCopyMenuSelectionMissilePosition();
return;
}
}
} else if ((joypad1_newkeys & kButton_Down) != 0) {
v0 = enemy_projectile_id[15];
while ((int8)(++v0 - 4) < 0) {
if (v0 == 3 || (kBitShl[v0] & nonempty_save_slots) != 0)
goto LABEL_16;
}
}
SetFileCopyMenuSelectionMissilePosition();
}
}
void SetFileCopyMenuSelectionMissilePosition(void) { // 0x81975E
static const uint16 kFileCopyMissileY[4] = { 72, 104, 136, 211 };
enemy_projectile_id[10] = kFileCopyMissileY[enemy_projectile_id[15]];
enemy_projectile_id[5] = 22;
}
void FileSelectMenu_9_InitializeSelectDest(void) { // 0x81977A
DrawBorderAroundDataCopyMode();
DrawFileCopySelectDestinationSaveFileInfo();
++menu_index;
uint16 v0 = 0;
do {
if (v0 != enemy_projectile_id[16])
break;
++v0;
} while (sign16(v0 - 3));
enemy_projectile_id[15] = v0;
SetFileCopyMenuSelectionMissilePosition();
}
void DrawFileCopySelectDestinationSaveFileInfo(void) { // 0x819799
ClearMenuTilemap();
enemy_data[0].palette_index = 0;
LoadMenuTilemap(0x52, addr_kMenuTilemap_DataCopyMode);
enemy_data[0].palette_index = 0;
LoadMenuTilemap(0x148, addr_kMenuTilemap_CopySamusToWhere);
ram3000.pause_menu_map_tilemap[944] = enemy_projectile_id[16] + 8298;
LoadMenuExitTilemap();
LoadFromSram_(0);
uint16 v0 = 1024;
if (enemy_projectile_id[16])
v0 = 0;
enemy_data[0].palette_index = v0;
DrawFileCopySaveSlotAInfo();
LoadFromSram_(1);
uint16 v1 = 1024;
if (enemy_projectile_id[16] != 1)
v1 = 0;
enemy_data[0].palette_index = v1;
DrawFileCopySaveSlotBInfo();
LoadFromSram_(2);
uint16 v2 = 1024;
if (enemy_projectile_id[16] != 2)
v2 = 0;
enemy_data[0].palette_index = v2;
DrawFileCopySaveSlotCInfo();
QueueTransferOfMenuTilemapToVramBG1();
}
void FileSelectMenu_10_FileCopySelectDest(void) { // 0x819813
static const uint16 kFileCopySelectDest_MissileY[4] = { 72, 104, 136, 212 };
uint16 v0;
DrawBorderAroundDataCopyMode();
DrawMenuSelectionMissile();
if ((joypad1_newkeys & (kButton_Start | kButton_A)) != 0) {
QueueSfx1_Max6(0x37);
if (enemy_projectile_id[15] != 3) {
enemy_projectile_id[17] = enemy_projectile_id[15];
++menu_index;
LABEL_9:
enemy_projectile_id[10] = kFileCopySelectDest_MissileY[enemy_projectile_id[15]];
enemy_projectile_id[5] = 22;
return;
}
menu_index += 5;
} else {
if ((joypad1_newkeys & 0x8000) == 0) {
if ((joypad1_newkeys & kButton_Up) != 0) {
QueueSfx1_Max6(0x37);
v0 = enemy_projectile_id[15];
while ((--v0 & 0x8000) == 0) {
if (v0 != enemy_projectile_id[16]) {
LABEL_8:
enemy_projectile_id[15] = v0;
goto LABEL_9;
}
}
} else if ((joypad1_newkeys & kButton_Down) != 0) {
QueueSfx1_Max6(0x37);
v0 = enemy_projectile_id[15];
while (++v0 != 4) {
if (v0 != enemy_projectile_id[16])
goto LABEL_8;
}
}
goto LABEL_9;
}
menu_index -= 2;
enemy_projectile_id[15] = enemy_projectile_id[16];
QueueSfx1_Max6(0x37);
FileSelectMenu_Func1();
}
}
void FileSelectMenu_11_InitializeConfirm(void) { // 0x8198B7
DrawBorderAroundDataCopyMode();
enemy_data[0].palette_index = 0;
LoadMenuTilemap(0x144, addr_kMenuTilemap_CopySamusToSamus);
ram3000.pause_menu_map_tilemap[942] = enemy_projectile_id[16] + 8298;
ram3000.pause_menu_map_tilemap[955] = enemy_projectile_id[17] + 8298;
DrawFileCopyClearConfirmation();
++menu_index;
enemy_projectile_id[15] = 0;
enemy_projectile_unk198F = 8;
}
void DrawFileCopyClearConfirmation(void) { // 0x8198ED
enemy_data[0].palette_index = 0;
LoadMenuTilemap(0x514, addr_kMenuTilemap_IsThisOk);
enemy_data[0].palette_index = 0;
LoadMenuTilemap(0x59C, addr_kMenuTilemap_Yes);
int v0 = 832;
do {
ram3000.pause_menu_map_tilemap[v0 + 768] = 15;
++v0;
} while ((int16)(v0 * 2 - 1728) < 0);
enemy_data[0].palette_index = 0;
LoadMenuTilemap(0x65C, addr_kMenuTilemap_No);
DrawFileCopyConfirmationSaveFileInfo();
}
void DrawFileCopyConfirmationSaveFileInfo(void) { // 0x819922
LoadFromSram_(0);
int v0 = 0;
if (enemy_projectile_id[16] && enemy_projectile_id[17])
v0 = 1024;
enemy_data[0].palette_index = v0;
DrawFileCopySaveSlotAInfo();
LoadFromSram_(1);
int v1 = 0;
if (enemy_projectile_id[16] != 1 && enemy_projectile_id[17] != 1)
v1 = 1024;
enemy_data[0].palette_index = v1;
DrawFileCopySaveSlotBInfo();
LoadFromSram_(2);
int v2 = 0;
if (enemy_projectile_id[16] != 2 && enemy_projectile_id[17] != 2)
v2 = 1024;
enemy_data[0].palette_index = v2;
DrawFileCopySaveSlotCInfo();
QueueTransferOfMenuTilemapToVramBG1();
}
void FileSelectMenu_12_FileCopyConfirm(void) { // 0x819984
DrawBorderAroundDataCopyMode();
DrawMenuSelectionMissile();
HandleFileCopyArrowPalette();
DrawFileCopyArrow();
if ((joypad1_newkeys & (kButton_Up | kButton_Down)) != 0) {
enemy_projectile_id[15] ^= 1;
QueueSfx1_Max6(0x37);
} else {
if ((joypad1_newkeys & 0x8000) != 0) {
menu_index -= 3;
enemy_projectile_id[15] = enemy_projectile_id[17];
QueueSfx1_Max6(0x37);
return;
}
if ((joypad1_newkeys & (kButton_Start | kButton_A)) != 0) {
QueueSfx1_Max6(0x38);
if (enemy_projectile_id[15]) {
menu_index -= 4;
FileSelectMenu_Func1();
} else {
++menu_index;
}
return;
}
}
uint16 v0 = 184;
if (enemy_projectile_id[15])
v0 = 208;
enemy_projectile_id[10] = v0;
enemy_projectile_id[5] = 94;
}
void HandleFileCopyArrowPalette(void) { // 0x8199FE
if (enemy_projectile_unk198F) {
if (!--enemy_projectile_unk198F) {
enemy_projectile_unk198F = 4;
uint16 v0 = palette_buffer[145];
uint16 v1 = 0;
do {
palette_buffer[(v1 >> 1) + 145] = palette_buffer[(v1 >> 1) + 146];
v1 += 2;
} while ((int16)(v1 - 12) < 0);
palette_buffer[151] = v0;
}
}
}
void FileSelectMenu_13_FileCopyDoIt(void) { // 0x819A2C
static const uint16 kBitShl_16bit[3] = { 1, 2, 4 };
DrawBorderAroundDataCopyMode();
DrawMenuSelectionMissile();
HandleFileCopyArrowPalette();
DrawFileCopyArrow();
uint16 src_addr = kOffsetToSaveSlot[enemy_projectile_id[16]];
uint16 dst_addr = kOffsetToSaveSlot[enemy_projectile_id[17]];
memcpy(&g_sram[dst_addr], &g_sram[src_addr], 1628);
int v2 = enemy_projectile_id[16];
int v10 = *(uint16 *)(&g_sram[2 * v2 + 0x1FF0]);
int v9 = *(uint16 *)(&g_sram[2 * v2 + 0x1FF8]);
int v8 = *(uint16 *)(&g_sram[2 * v2 + 0]);
int v4 = enemy_projectile_id[17];
*(uint16 *)(&g_sram[2 * v4 + 8]) = *(uint16 *)&g_sram[2 * v2 + 8];
*(uint16 *)(&g_sram[2 * v4]) = v8;
*(uint16 *)(&g_sram[2 * v4 + 0x1FF8]) = v9;
*(uint16 *)(&g_sram[2 * v4 + 0x1FF0]) = v10;
++menu_index;
int v5 = 640;
do {
ram3000.pause_menu_map_tilemap[v5 + 768] = 15;
++v5;
} while ((int16)(v5 * 2 - 1856) < 0);
nonempty_save_slots |= kBitShl_16bit[enemy_projectile_id[17]];
int v6 = ((4 * enemy_projectile_id[17] + 9) << 6) + 24;
int v7 = 0;
do {
*(uint16 *)((uint8 *)&ram3000.pause_menu_map_tilemap[768] + v6) = 15;
*(uint16 *)((uint8 *)&ram3000.pause_menu_map_tilemap[736] + v6) = 15;
v6 += 2;
v7 += 2;
} while ((int16)(v7 - 22) < 0);
enemy_data[0].palette_index = 0;
LoadMenuTilemap(0x510, addr_kMenuTilemap_CopyCompleted);
DrawFileCopyConfirmationSaveFileInfo();
RtlWriteSram();
}
void FileSelectMenu_14_CopyCompleted(void) { // 0x819AFA
DrawBorderAroundDataCopyMode();
if (joypad1_newkeys) {
QueueSfx1_Max6(0x37);
++menu_index;
int slot = sram_save_slot_selected;
if (sign16(slot) || !sign16(sram_save_slot_selected - 3) ||
(slot & sram_save_slot_selected_complement)) {
slot = 0;
}
selected_save_slot = slot;
}
}
void FileSelectMenu_18(void) { // 0x819B28
menu_index -= 14;
}
void FileSelectMenu_20_FileClearInit(void) { // 0x819B33
DrawBorderAroundDataClearMode();
++menu_index;
InitFileSelectMenuFileClear();
}
void InitFileSelectMenuFileClear(void) { // 0x819B3C
ClearMenuTilemap();
enemy_data[0].palette_index = 0;
LoadMenuTilemap(0x50, addr_kMenuTilemap_DataClearMode);
LoadMenuTilemap(0x140, addr_kMenuTilemap_ClearWhichData);
LoadMenuExitTilemap();
DrawFileCopySaveFileInfo();
enemy_projectile_id[16] = 0;
SetInitialFileCopyMenuSelection();
SetFileClearMenuMissilePos();
}
void FileSelectMenu_22_FileClearSelectSlot(void) { // 0x819B64
static const uint8 kBitShl_[3] = { 1, 2, 4 };
uint16 v0;
uint8 v1;
DrawBorderAroundDataClearMode();
DrawMenuSelectionMissile();
HIBYTE(v0) = HIBYTE(joypad1_newkeys);
if ((joypad1_newkeys & (kButton_Start | kButton_A)) != 0) {
QueueSfx1_Max6(0x37);
if (enemy_projectile_id[15] != 3) {
enemy_projectile_id[16] = enemy_projectile_id[15];
++menu_index;
return;
}
LABEL_11:
QueueSfx1_Max6(0x37);
menu_index += 5;
return;
}
if ((joypad1_newkeys & 0x8000) != 0)
goto LABEL_11;
if ((joypad1_newkeys & kButton_Up) != 0) {
v1 = enemy_projectile_id[15];
while ((--v1 & 0x80) == 0) {
if ((kBitShl_[v1] & nonempty_save_slots) != 0) {
LABEL_16:
LOBYTE(enemy_projectile_id[15]) = v1;
LOBYTE(v0) = 55;
QueueSfx1_Max6(v0);
SetFileClearMenuMissilePos();
return;
}
}
} else if ((joypad1_newkeys & kButton_Down) != 0) {
v1 = enemy_projectile_id[15];
while ((int8)(++v1 - 4) < 0) {
if (v1 == 3 || (kBitShl_[v1] & nonempty_save_slots) != 0)
goto LABEL_16;
}
}
SetFileClearMenuMissilePos();
}
void SetFileClearMenuMissilePos(void) { // 0x819BEF
static const uint16 kFileClear_MissileY[4] = { 72, 104, 136, 211 };
enemy_projectile_id[10] = kFileClear_MissileY[enemy_projectile_id[15]];
enemy_projectile_id[5] = 22;
}
void FileSelectMenu_23_FileClearInitConfirm(void) { // 0x819C0B
DrawBorderAroundDataClearMode();
enemy_data[0].palette_index = 0;
LoadMenuTilemap(0x140, addr_kMenuTilemap_ClearSamusA);
ram3000.pause_menu_map_tilemap[949] = enemy_projectile_id[16] + 8298;
enemy_projectile_id[17] = 3;
DrawFileCopyClearConfirmation();
++menu_index;
enemy_projectile_id[15] = 0;
}
void FileSelectMenu_24_FileClearConfirm(void) { // 0x819C36
uint16 v0;
DrawBorderAroundDataClearMode();
DrawMenuSelectionMissile();
if ((joypad1_newkeys & (kButton_Up | kButton_Down)) != 0) {
enemy_projectile_id[15] ^= 1;
QueueSfx1_Max6(0x37);
LABEL_8:
v0 = 184;
if (enemy_projectile_id[15])
v0 = 208;
enemy_projectile_id[10] = v0;
enemy_projectile_id[5] = 94;
return;
}
if ((joypad1_newkeys & 0x8000) != 0) {
LABEL_5:
menu_index -= 2;
enemy_projectile_id[15] = enemy_projectile_id[16];
QueueSfx1_Max6(0x37);
InitFileSelectMenuFileClear();
return;
}
if ((joypad1_newkeys & (kButton_Start | kButton_A)) == 0)
goto LABEL_8;
QueueSfx1_Max6(0x38);
if (enemy_projectile_id[15])
goto LABEL_5;
++menu_index;
}
void FileSelectMenu_25_FileClearDoClear(void) { // 0x819C9E
static const uint16 kBitShl_Not[3] = { 0xfffe, 0xfffd, 0xfffb };
DrawBorderAroundDataClearMode();
int sram_addr = kOffsetToSaveSlot[enemy_projectile_id[16]];
memset(&g_sram[sram_addr], 0, 1628);
uint16 v1 = 2 * enemy_projectile_id[16];
int v2 = enemy_projectile_id[16];
*(uint16 *)(&g_sram[2 * v2]) = 0;
*(uint16 *)(&g_sram[2 * v2 + 8]) = 0;
*(uint16 *)(&g_sram[2 * v2 + 0x1FF0]) = 0;
*(uint16 *)(&g_sram[2 * v2 + 0x1FF8]) = 0;
++menu_index;
NewSaveFile();
LoadFromSram(enemy_projectile_id[16]);
area_index = enemy_projectile_id[16];
LoadMirrorOfExploredMapTiles();
uint16 v3 = 640;
do {
ram3000.pause_menu_map_tilemap[v3 + 768] = 15;
++v3;
} while ((int16)(v3 * 2 - 1856) < 0);
nonempty_save_slots &= kBitShl_Not[enemy_projectile_id[16]];
enemy_data[0].palette_index = 0;
LoadMenuTilemap(0x500, addr_kMenuTilemap_DataCleared);
DrawFileCopyConfirmationSaveFileInfo();
RtlWriteSram();
}
void FileSelectMenu_26_ClearCompleted(void) { // 0x819D26
DrawBorderAroundDataClearMode();
if (joypad1_newkeys) {
QueueSfx1_Max6(0x37);
++menu_index;
if (!(LoadFromSram(0))) {
LABEL_3:
selected_save_slot = 0;
return;
}
if (LoadFromSram(1)) {
if (LoadFromSram(2))
goto LABEL_3;
selected_save_slot = 2;
} else {
selected_save_slot = 1;
}
}
}
void FileSelectMenu_30(void) { // 0x819D68
DrawBorderAroundSamusData();
menu_index -= 26;
}
void FileSelectMenu_31_TurnSamusHelmet(void) { // 0x819D77
DrawMenuSelectionMissile();
DrawBorderAroundSamusData();
DrawFileSelectSlotSamusHelmet(4);
DrawFileSelectSlotSamusHelmet(6);
DrawFileSelectSlotSamusHelmet(8);
if ((joypad1_newkeys & (kButton_Start | kButton_A)) != 0
|| enemy_projectile_id[2] == 7 && !enemy_projectile_index
|| enemy_projectile_id[3] == 7 && !enemy_projectile_init_param_1
|| enemy_projectile_id[4] == 7 && !enemy_projectile_unk1995) {
++menu_index;
}
}
void DrawFileSelectSamusHelmets(void) { // 0x819DC3
enemy_projectile_index = 0;
DrawFileSelectSlotSamusHelmet(4);
enemy_projectile_init_param_1 = 0;
DrawFileSelectSlotSamusHelmet(6);
enemy_projectile_unk1995 = 0;
DrawFileSelectSlotSamusHelmet(8);
}
void DrawFileSelectSlotSamusHelmet(uint16 k) { // 0x819DE4
uint16 v0 = k;
int16 v1;
v1 = *(uint16 *)((uint8 *)&enemy_projectile_enable_flag + v0);
if (v1) {
uint16 v2 = v1 - 1;
*(uint16 *)((uint8 *)&enemy_projectile_enable_flag + v0) = v2;
if (!v2) {
*(uint16 *)((uint8 *)&enemy_projectile_enable_flag + v0) = 8;
int v3 = v0 >> 1;
uint16 v4 = enemy_projectile_id[v3] + 1;
if (!sign16(enemy_projectile_id[v3] - 7)) {
*(uint16 *)((uint8 *)&enemy_projectile_enable_flag + v0) = 0;
v4 = 7;
}
enemy_projectile_id[v3] = v4;
}
}
int v5 = v0 >> 1;
uint16 v6 = 2 * enemy_projectile_id[v5];
static const uint16 kDrawFileSlotHelmet_Spritemaps[9] = { 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x33 };
DrawMenuSpritemap(kDrawFileSlotHelmet_Spritemaps[v6 >> 1], enemy_projectile_id[v5 + 5], enemy_projectile_id[v5 + 10], 3584);
}
static Func_V *const kFileSelectMapFuncs[23] = { // 0x819E3E
FileSelectMap_0,
FileSelectMap_1,
FileSelectMap_2_LoadAreaSelectForegroundTilemap,
FileSelectMap_3_LoadAreaSelectBackgroundTilemap,
FileSelectMap_4_SetupExpandingSquareTransition,
FileSelectMap_5_ExpandingSquare,
FileSelectMap_6_AreaSelectMap,
FileSelectMap_7_PrepExpandSquareTransToRoomMap,
FileSelectMap_8_ExpandSquareTransToRoomSelectMap,
FileSelectMap_9_InitRoomSelectMap,
FileSelectMap_10_RoomSelectMap,
FileSelectMap_11,
FileSelectMap_11,
FileSelectMap_13,
FileSelectMap_14,
FileSelectMap_15_ClearTileMap,
FileSelectMap_16_LoadPalettes,
FileSelectMap_2_LoadAreaSelectForegroundTilemap,
FileSelectMap_18,
FileSelectMap_4_SetupExpandingSquareTransition,
FileSelectMap_20_SetupExpandingSquare,
FileSelectMap_21_MoveExpandingSquare,
FileSelectMap_22,
};
void FileSelectMap(void) {
kFileSelectMapFuncs[menu_index]();
}
void FileSelectMap_22(void) { // 0x819E7B
DrawAreaSelectMapLabels();
HandleFadeOut();
if ((reg_INIDISP & 0xF) == 0) {
game_state = kGameState_2_GameOptionsMenu;
menu_index = 0;
}
}
void FileSelectMenu_1_LoadFileSelectMenuBG2(void) { // 0x819E93
VramWriteEntry *v2;
for (int i = 1023; i >= 0; --i)
ram3000.pause_menu_map_tilemap[i + 768] = kZebesAndStarsTilemap[i];
uint16 v1 = vram_write_queue_tail;
v2 = gVramWriteEntry(vram_write_queue_tail);
v2->size = 2048;
v2->src.addr = ADDR16_OF_RAM(ram3000.menu.menu_tilemap);
*(uint16 *)&v2->src.bank = 126;
v2->vram_dst = (reg_BG2SC & 0xFC) << 8;
vram_write_queue_tail = v1 + 7;
++menu_index;
enemy_projectile_enable_flag = 1;
enemy_projectile_id[0] = 0;
}
void FileSelectMenu_2_InitMain(void) { // 0x819ED6
uint16 v0;
if (sign16(sram_save_slot_selected)
|| !sign16(sram_save_slot_selected - 3)
|| (v0 = sram_save_slot_selected, (sram_save_slot_selected_complement & sram_save_slot_selected) != 0)) {
v0 = 0;
}
selected_save_slot = v0;
FileSelectMenu_16();
}
void FileSelectMenu_16(void) { // 0x819EF3
for (int i = 2046; i >= 0; i -= 2)
*(uint16 *)((uint8 *)&ram3000.pause_menu_map_tilemap[768] + (uint16)i) = 15;
nonempty_save_slots = -1;
enemy_data[0].palette_index = 0;
LoadMenuTilemap(0x56, addr_kMenuTilemap_SamusData);
LoadMenuTilemap(0x146, addr_kMenuTilemap_SamusA);
uint8 c = LoadFromSram_(0);
nonempty_save_slots = (nonempty_save_slots >> 1) | (c << 15);
DrawFileSelectionHealth(nonempty_save_slots & 0x8000, 0x15C);
DrawFileSelectionTime(nonempty_save_slots & 0x8000, 0x1B4);
LoadMenuTilemap(0x176, addr_kMenuTilemap_TIME);
enemy_data[0].palette_index = 0;
LoadMenuTilemap(0x286, addr_kMenuTilemap_SamusB);
c = LoadFromSram_(1);
nonempty_save_slots = (nonempty_save_slots >> 1) | (c << 15);
DrawFileSelectionHealth(nonempty_save_slots & 0x8000, 0x29C);
DrawFileSelectionTime(nonempty_save_slots & 0x8000, 0x2F4);
LoadMenuTilemap(0x2B6, addr_kMenuTilemap_TIME);
enemy_data[0].palette_index = 0;
LoadMenuTilemap(0x3C6, addr_kMenuTilemap_SamusC);
c = LoadFromSram_(2);
nonempty_save_slots = (nonempty_save_slots >> 1) | (c << 15);
DrawFileSelectionHealth(nonempty_save_slots & 0x8000, 0x3DC);
DrawFileSelectionTime(nonempty_save_slots & 0x8000, 0x434);
LoadMenuTilemap(0x3F6, addr_kMenuTilemap_TIME);
nonempty_save_slots = swap16(~nonempty_save_slots) >> 5;
if (nonempty_save_slots) {
enemy_data[0].palette_index = 0;
LoadMenuTilemap(0x508, addr_kMenuTilemap_DataCopy);
enemy_data[0].palette_index = 0;
LoadMenuTilemap(0x5C8, addr_kMenuTilemap_DataClear);
}
enemy_data[0].palette_index = 0;
LoadMenuTilemap(0x688, addr_kMenuTilemap_Exit);
QueueTransferOfMenuTilemapToVramBG1();
enemy_projectile_enable_flag = 1;
enemy_projectile_unk198F = 0;
enemy_projectile_index = 0;
enemy_projectile_init_param_1 = 0;
enemy_projectile_unk1995 = 0;
enemy_projectile_id[0] = 0;
enemy_projectile_id[1] = 0;
enemy_projectile_id[2] = 0;
enemy_projectile_id[3] = 0;
enemy_projectile_id[4] = 0;
enemy_projectile_id[5] = 0;
enemy_projectile_id[10] = 0;
enemy_projectile_id[6] = 0;
enemy_projectile_id[11] = 0;
enemy_projectile_id[7] = 100;
enemy_projectile_id[8] = 100;
enemy_projectile_id[9] = 100;
enemy_projectile_id[12] = 47;
enemy_projectile_id[13] = 87;
enemy_projectile_id[14] = 127;
screen_fade_delay = 1;
screen_fade_counter = 1;
ScreenOn();
++menu_index;
enemy_projectile_id[15] = 0;
enemy_projectile_id[16] = 0;
enemy_projectile_id[17] = 0;
}
uint8 LoadFromSram_(uint16 a) { // 0x81A053
return LoadFromSram(a);
}
void FileSelectMenu_3_FadeInToMain(void) { // 0x81A058
DrawFileSelectSamusHelmets();
int v0 = (uint16)(4 * selected_save_slot) >> 1;
enemy_projectile_id[10] = kMenuSelectionMissileXY[v0];
enemy_projectile_id[5] = kMenuSelectionMissileXY[v0 + 1];
DrawMenuSelectionMissile();
DrawBorderAroundSamusData();
HandleFadeIn();
if ((reg_INIDISP & 0xF) == 15)
++menu_index;
}
void DrawFileSelectionHealth(uint16 a, uint16 k) { // 0x81A087
int16 v2;
int16 v4;
if (a) {
FileSelectClearRestOfMenuTilemapRow(k);
LoadMenuTilemap(k + 64, addr_kMenuTilemap_NoData);
} else {
LoadMenuTilemap(k, addr_kMenuTilemap_Energy);
v2 = k + 8;
int n = samus_health / 100;
int q = samus_health % 100;
int mh = samus_max_health / 100;
int m = 7;
uint16 v3 = v2 + 64;
while (--mh >= 0) {
v4 = 153;
if (n) {
--n;
v4 = 152;
}
*(uint16 *)((uint8 *)&ram3000.pause_menu_map_tilemap[768] + v3) = enemy_data[0].palette_index | v4;
v3 += 2;
if (!--m) {
v3 -= 78;
m = 8;
}
}
n = q / 10;
q = q % 10;
*(uint16 *)((uint8 *)&ram3000.pause_menu_map_tilemap[802] + k) = enemy_data[0].palette_index | (q + 8288);
*(uint16 *)((uint8 *)&ram3000.pause_menu_map_tilemap[801] + k) = enemy_data[0].palette_index | (n + 8288);
}
}
void DrawFileSelectionTime(uint16 a, uint16 k) { // 0x81A14E
if (!a) {
uint16 r26 = k;
int div_val = game_time_hours / 10;
int mod_val = game_time_hours % 10;
uint16 v2 = r26;
*(uint16 *)((uint8 *)&ram3000.pause_menu_map_tilemap[769] + v2) = enemy_data[0].palette_index | (mod_val + 8288);
*(uint16 *)((uint8 *)&ram3000.pause_menu_map_tilemap[768] + v2) = enemy_data[0].palette_index | (div_val + 8288);
LoadMenuTilemap(r26 + 4, addr_word_81B4A8);
int div_min = game_time_minutes / 10;
int mod_min = game_time_minutes % 10;
uint16 v3 = r26;
*(uint16 *)((uint8 *)&ram3000.pause_menu_map_tilemap[772] + v3) = enemy_data[0].palette_index | (mod_min + 8288);
*(uint16 *)((uint8 *)&ram3000.pause_menu_map_tilemap[771] + v3) = enemy_data[0].palette_index | (div_min + 8288);
}
}
void FileSelectMenu_4_Main(void) { // 0x81A1C2
int16 v0;
uint16 v1, v2;
int v3;
DrawBorderAroundSamusData();
DrawMenuSelectionMissile();
DrawFileSelectSlotSamusHelmet(4);
DrawFileSelectSlotSamusHelmet(6);
DrawFileSelectSlotSamusHelmet(8);
if ((joypad1_newkeys & (kButton_Start | kButton_A)) == 0) {
if ((joypad1_newkeys & kButton_Up) != 0) {
if (nonempty_save_slots) {
v1 = selected_save_slot - 1;
if ((int16)(selected_save_slot - 1) < 0)
v1 = 5;
} else {
v1 = selected_save_slot - 1;
if ((int16)(selected_save_slot - 1) >= 0) {
if (!sign16(selected_save_slot - 5))
v1 = 2;
} else {
v1 = 5;
}
}
selected_save_slot = v1;
} else {
if ((joypad1_newkeys & kButton_Down) == 0) {
if ((joypad1_newkeys & kButton_B) != 0) {
QueueSfx1_Max6(0x37);
menu_index = 33;
QueueSfx1_Max6(0x37);
}
goto LABEL_28;
}
if (nonempty_save_slots) {
v2 = selected_save_slot + 1;
if (!sign16(selected_save_slot - 5))
v2 = 0;
} else {
v2 = selected_save_slot + 1;
if (!sign16(selected_save_slot - 2)) {
if (sign16(selected_save_slot - 5))
v2 = 5;
else
v2 = 0;
}
}
selected_save_slot = v2;
}
QueueSfx1_Max6(0x37);
LABEL_28:
v3 = (uint16)(4 * selected_save_slot) >> 1;
enemy_projectile_id[10] = kMenuSelectionMissileXY[v3];
enemy_projectile_id[5] = kMenuSelectionMissileXY[v3 + 1];
return;
}
v0 = selected_save_slot;
if (sign16(selected_save_slot - 3)) {
QueueSfx1_Max6(0x2A);
menu_index += 27;
*(uint16 *)((uint8 *)&enemy_projectile_enable_flag + (uint16)(2 * (selected_save_slot + 2))) = 1;
*(uint16 *)&g_sram[0x1FEC] = selected_save_slot;
*(uint16 *)&g_sram[0x1FEE] = ~selected_save_slot;
RtlWriteSram();
if (LoadFromSram(selected_save_slot)) {
NewSaveFile();
has_area_map = 0;
} else {
LoadMirrorOfExploredMapTiles();
}
goto LABEL_28;
}
if (selected_save_slot == 3) {
QueueSfx1_Max6(0x37);
++menu_index;
*(uint16 *)&reg_MOSAIC = *(uint16 *)&reg_MOSAIC & 0xFF0C | 3;
} else {
if (selected_save_slot == 4) {
QueueSfx1_Max6(0x37);
menu_index += 15;
v0 = *(uint16 *)&reg_MOSAIC & 0xFF0C | 3;
*(uint16 *)&reg_MOSAIC = v0;
}
if (v0 == 5)
menu_index = 33;
}
}
void FileSelectMap_0(void) { // 0x81A32A
VramWriteEntry *v1;
ClearMenuTilemap();
uint16 v0 = vram_write_queue_tail;
v1 = gVramWriteEntry(vram_write_queue_tail);
v1->size = 2048;
v1->src.addr = ADDR16_OF_RAM(ram3000.menu.menu_tilemap);
*(uint16 *)&v1->src.bank = 126;
v1->vram_dst = (reg_BG2SC & 0xFC) << 8;
vram_write_queue_tail = v0 + 7;
palette_change_num = 0;
LoadFileSelectPalettes();
uint16 v2 = 0;
do {
target_palettes[v2 >> 1] = palette_buffer[v2 >> 1];
v2 += 2;
} while ((int16)(v2 - 64) < 0);
target_palettes[14] = 0;
target_palettes[30] = 0;
++menu_index;
}
void FileSelectMap_1(void) { // 0x81A37C
int16 v1;
int16 v2;
if (AdvanceGradualColorChangeOfPalette(0, 0x40)) {
reg_BG1VOFS = 0;
reg_BG1HOFS = 0;
reg_BG2VOFS = 0;
reg_BG2HOFS = 0;
uint16 v0 = 0;
while (area_index != kFileSelectMap_AreaIndexes[v0 >> 1]) {
v0 += 2;
if ((int16)(v0 - 12) >= 0) {
v0 = 0;
break;
}
}
file_select_map_area_index = v0 >> 1;
v1 = 0;
do {
v2 = v1;
if (v1 == area_index)
LoadActiveAreaMapForegroundColors(v1);
else
LoadInactiveAreaMapForegroundColors(v1);
++v1;
} while ((int16)(v2 - 5) < 0);
++menu_index;
g_word_7E0787 = 0;
reg_TM = 2;
}
}
void sub_81A3D1(uint16 k) { // 0x81A3D1
LoadActiveAreaMapForegroundColors(k);
}
static const uint16 kActiveAreaMapForegroundColors[6] = { 0, 0xa, 0x10, 0x16, 0x24, 0x2a };
static const uint16 kInactiveAreaMapForegroundColors[6] = { // 0x81A3D3
0x30, 0x3a,
0x40, 0x46,
0x54, 0x5a,
};
void LoadActiveAreaMapForegroundColors(uint16 v0) {
LoadAreaMapForegroundColors(kActiveAreaMapForegroundColors[v0]);
}
void LoadInactiveAreaMapForegroundColors(uint16 v0) { // 0x81A3DC
LoadAreaMapForegroundColors(kInactiveAreaMapForegroundColors[v0]);
}
void LoadAreaMapForegroundColors(uint16 j) { // 0x81A3E3
while (1) {
int v1 = j >> 1;
if (kAreaMapForegroundSetDefs[v1] == 0xFFFF)
break;
uint16 v4 = j;
uint16 v2 = kAreaMapForegroundSetDefs[v1 + 1];
uint16 v3 = kAreaMapForegroundSetDefs[v1];
int n = 5;
do {
palette_buffer[v2 >> 1] = kAreaMapForegroundColors[v3 >> 1];
v2 += 2;
v3 += 2;
} while (--n);
j = v4 + 4;
}
}
void FileSelectMap_2_LoadAreaSelectForegroundTilemap(void) { // 0x81A546
VramWriteEntry *v1;
uint16 v0 = vram_write_queue_tail;
v1 = gVramWriteEntry(vram_write_queue_tail);
v1->size = 2048;
v1->src.addr = addr_kAreaSelectForegroundTilemap;
*(uint16 *)&v1->src.bank = 129;
v1->vram_dst = (reg_BG1SC & 0xFC) << 8;
vram_write_queue_tail = v0 + 7;
*(uint16 *)&reg_INIDISP = (reg_OBSEL << 8) | 0xF;
++menu_index;
}
void FileSelectMap_18(void) { // 0x81A578
++menu_index;
LoadAreaSelectBackgroundTilemap(area_index);
}
void FileSelectMap_3_LoadAreaSelectBackgroundTilemap(void) { // 0x81A582
++menu_index;
LoadAreaSelectBackgroundTilemap(area_index);
}
void LoadAreaSelectBackgroundTilemap(uint16 j) { // 0x81A58A
uint16 v1 = vram_write_queue_tail;
VramWriteEntry *v2 = gVramWriteEntry(vram_write_queue_tail);
v2->size = 2048;
v2->src.addr = 8 * 256 * j + addr_kAreaSelectBackgroundTilemaps;
v2->src.bank = 0x81;
v2->vram_dst = (reg_BG3SC & 0xFC) << 8;
vram_write_queue_tail = v1 + 7;
}
void FileSelectMap_4_SetupExpandingSquareTransition(void) { // 0x81A5B3
reg_TS = 4;
WriteReg(TS, 4);
reg_TSW = 4;
WriteReg(TSW, 4);
reg_CGWSEL = 2;
WriteReg(CGWSEL, 2);
reg_CGADSUB = 37;
WriteReg(CGADSUB, 0x25);
reg_COLDATA[2] = 0x80;
reg_COLDATA[1] = 64;
reg_COLDATA[0] = 32;
SetupInitialExpandingSquareHDMA();
reg_HDMAEN = 12;
WriteReg(HDMAEN, 0xC);
ConfigureWindow1ForExpandingSquare();
hdma_objects_enable_flag = 0;
LOBYTE(menu_index) = menu_index + 1;
}
void ConfigureWindow1ForExpandingSquare(void) { // 0x81A5F6
reg_TM = 19;
WriteReg(TM, 0x13);
reg_TMW = 19;
WriteReg(TMW, 0x13);
reg_W12SEL = 35;
WriteReg(W12SEL, 0x23);
reg_W34SEL = 3;
WriteReg(W34SEL, 3);
reg_WOBJSEL = 35;
WriteReg(WOBJSEL, 0x23);
}
void SetupInitialExpandingSquareHDMA(void) { // 0x81A61C
expanding_square_topbottom_margin_right_pos = 0;
expanding_square_topbottom_margin_left_pos = -1;
LOBYTE(expanding_square_left_pos) = 127;
LOBYTE(expanding_square_right_pos) = -127;
hdma_window_1_left_pos[0].field_0 = 111;
hdma_window_1_left_pos[0].field_1 = 34;
hdma_window_1_left_pos[0].field_2 = -98;
hdma_window_1_left_pos[1].field_0 = 1;
hdma_window_1_left_pos[1].field_1 = 50;
hdma_window_1_left_pos[1].field_2 = -98;
hdma_window_1_left_pos[2].field_0 = 1;
hdma_window_1_left_pos[2].field_1 = 50;
hdma_window_1_left_pos[2].field_2 = -98;
hdma_window_1_left_pos[3].field_0 = 111;
hdma_window_1_left_pos[3].field_1 = 32;
hdma_window_1_left_pos[3].field_2 = -98;
WriteReg(DMAP2, 0x40);
WriteReg(BBAD2, 0x26);
WriteReg(A1T2L, 0);
WriteReg(A1T2H, 0x9E);
WriteReg(A1B2, 0x7E);
WriteReg(DAS20, 0x7E);
WriteReg(DAS2L, 0);
WriteReg(DAS2H, 0);
WriteReg(A2A2L, 0);
WriteReg(A2A2H, 0);
WriteReg(NTRL2, 0);
hdma_window_1_right_pos[0].field_0 = 111;
hdma_window_1_right_pos[0].field_1 = 32;
hdma_window_1_right_pos[0].field_2 = -98;
hdma_window_1_right_pos[1].field_0 = 1;
hdma_window_1_right_pos[1].field_1 = 54;
hdma_window_1_right_pos[1].field_2 = -98;
hdma_window_1_right_pos[2].field_0 = 1;
hdma_window_1_right_pos[2].field_1 = 54;
hdma_window_1_right_pos[2].field_2 = -98;
hdma_window_1_right_pos[3].field_0 = 111;
hdma_window_1_right_pos[3].field_1 = 32;
hdma_window_1_right_pos[3].field_2 = -98;
WriteReg(DMAP3, 0x40);
WriteReg(BBAD3, 0x27);
WriteReg(A1T3L, 0x10);
WriteReg(A1T3H, 0x9E);
WriteReg(A1B3, 0x7E);
WriteReg(DAS30, 0x7E);
WriteReg(DAS3L, 0);
WriteReg(DAS3H, 0);
WriteReg(A2A3L, 0);
WriteReg(A2A3H, 0);
WriteReg(NTRL3, 0);
}
static const uint8 kExpandingSquareTransitionSpeed = 4;
void FileSelectMap_5_ExpandingSquare(void) { // 0x81A725
VramWriteEntry *v5;
DrawAreaSelectMapLabels();
uint8 v0 = hdma_window_1_left_pos[0].field_0 - kExpandingSquareTransitionSpeed;
if ((int8)(hdma_window_1_left_pos[0].field_0 - kExpandingSquareTransitionSpeed) < 0) {
LOBYTE(menu_index) = menu_index + 1;
reg_TM &= ~2;
reg_TMW = 0;
reg_TSW = 0;
reg_BG2VOFS = 24;
pausemenu_palette_animation_timer = 1;
uint16 v1 = 0;
do {
ram4000.xray_tilemaps[v1] = kBg2RoomSelectMapTilemap[v1];
++v1;
} while ((int16)(v1 * 2 - 1600) < 0);
do
ram4000.xray_tilemaps[v1++] = 10241;
while ((int16)(v1 * 2 - 2048) < 0);
DrawRoomSelectMapAreaLabel((LongPtr) { ADDR16_OF_RAM(ram4000) + 340, 0x7e });
uint16 v2 = 320;
uint16 v3 = 959;
do {
ram4000.xray_tilemaps[v3--] = kFileSelectExpandingSquareTilemap[v2 >> 1];
v2 -= 2;
} while (v2);
uint16 v4 = vram_write_queue_tail;
v5 = gVramWriteEntry(vram_write_queue_tail);
v5->size = 2048;
v5->src.addr = ADDR16_OF_RAM(ram4000);
v5->src.bank = 126;
v5->vram_dst = (reg_BG2SC & 0xFC) << 8;
vram_write_queue_tail = v4 + 7;
} else {
hdma_window_1_left_pos[0].field_0 -= kExpandingSquareTransitionSpeed;
hdma_window_1_left_pos[3].field_0 = v0;
hdma_window_1_right_pos[0].field_0 = v0;
hdma_window_1_right_pos[3].field_0 = v0;
hdma_window_1_left_pos[1].field_0 += kExpandingSquareTransitionSpeed;
hdma_window_1_left_pos[2].field_0 = hdma_window_1_left_pos[1].field_0;
hdma_window_1_right_pos[1].field_0 = hdma_window_1_left_pos[1].field_0;
hdma_window_1_right_pos[2].field_0 = hdma_window_1_left_pos[1].field_0;
LOBYTE(expanding_square_left_pos) = expanding_square_left_pos - kExpandingSquareTransitionSpeed;
LOBYTE(expanding_square_right_pos) = kExpandingSquareTransitionSpeed + expanding_square_right_pos;
}
}
void FileSelectMap_6_AreaSelectMap(void) { // 0x81A800
int16 v0;
v0 = joypad1_newkeys;
if ((joypad1_newkeys & (kButton_Up | kButton_Left)) != 0) {
v0 = enable_debug;
if (enable_debug) {
//?? r24 = R22_;
uint16 R28 = DecAndWraparoundTo5(file_select_map_area_index);
if (CheckIfFileSelectMapAreaCanBeSelected(R28)
|| (R28 = DecAndWraparoundTo5(R28), CheckIfFileSelectMapAreaCanBeSelected(R28))
|| (R28 = DecAndWraparoundTo5(R28), CheckIfFileSelectMapAreaCanBeSelected(R28))) {
QueueSfx1_Max6(0x37);
SwitchActiveFileSelectMapArea(R28);
DrawAreaSelectMapLabels();
return;
}
goto LABEL_18;
}
LABEL_6:
if (v0 < 0) {
menu_index = 22;
DrawAreaSelectMapLabels();
return;
}
if ((v0 & (kButton_Start | kButton_A)) != 0) {
QueueSfx1_Max6(0x38);
SelectFileSelectMapArea();
return;
}
LABEL_18:
DrawAreaSelectMapLabels();
return;
}
if ((joypad1_newkeys & (kButton_Select | kButton_Down | kButton_Right)) == 0)
goto LABEL_6;
v0 = enable_debug;
if (!enable_debug)
goto LABEL_6;
int n = 6;
uint16 R28 = file_select_map_area_index;
while (1) {
R28 = WraparoundFrom6to0(R28);
if (CheckIfFileSelectMapAreaCanBeSelected(R28))
break;
if (!--n)
goto LABEL_18;
}
SwitchActiveFileSelectMapArea(R28);
QueueSfx1_Max6(0x37);
DrawAreaSelectMapLabels();
}
uint16 DecAndWraparoundTo5(uint16 a) { // 0x81A898
uint16 result = a - 1;
if ((result & 0x8000) != 0)
return 5;
return result;
}
uint16 WraparoundFrom6to0(uint16 a) { // 0x81A89F
uint16 result = a + 1;
if (!sign16(result - 6))
return 0;
return result;
}
void SelectFileSelectMapArea(void) { // 0x81A8A9
int8 v2; // cf
int16 v3;
int16 v4;
++menu_index;
if (!enable_debug) {
area_index = sram_area_index;
load_station_index = sram_save_station_index;
DrawAreaSelectMapLabels();
return;
}
area_index = kFileSelectMap_AreaIndexes[file_select_map_area_index];
uint16 q = *(uint16 *)&used_save_stations_and_elevators[2 * area_index];
uint16 v0 = 0;
LongPtr r0 = { addr_kMapIconDataPointers + 64, 0x82};
r0.addr = IndirReadWord(r0, 2 * area_index);
if (!r0.addr)
InvalidInterrupt_Crash();
uint16 r20 = 16;
while (1) {
v2 = q & 1;
q >>= 1;
if (!v2)
goto LABEL_10;
v3 = IndirReadWord(r0, 4 * v0);
if (v3 == -2)
goto LABEL_10;
if (v3 != -1)
break;
v0 = -1;
LABEL_10:
++v0;
if (!--r20) {
while (1) {
v4 = IndirReadWord(r0, 4 * v0);
if (v4 != -2) {
if (v4 != -1)
goto LABEL_16;
v0 = -1;
}
++v0;
if (!--r20) {
Unreachable();
}
}
}
}
LABEL_16:
load_station_index = v0;
DrawAreaSelectMapLabels();
}
uint16 CheckIfFileSelectMapAreaCanBeSelected(uint16 a) { // 0x81A931
int v1 = 2 * kFileSelectMap_AreaIndexes[a];
if (*(uint16 *)&used_save_stations_and_elevators[v1])
return true;
uint16 t = *(uint16 *)((uint8 *)&kMapIconDataPointers[4].crateria + v1) + 64;
return t != 0xffff;
}
void SwitchActiveFileSelectMapArea(uint16 R28) { // 0x81A958
LoadInactiveAreaMapForegroundColors(kFileSelectMap_AreaIndexes[file_select_map_area_index]);
file_select_map_area_index = R28;
LoadActiveAreaMapForegroundColors(kFileSelectMap_AreaIndexes[R28]);
LoadAreaSelectBackgroundTilemap(kFileSelectMap_AreaIndexes[file_select_map_area_index]);
}
static const uint16 kAreaSelectMapLabelPositions[12] = { // 0x81A97E
0x5b, 0x32,
0x2a, 0x7f,
0x5e, 0xb5,
0xce, 0x50,
0xce, 0x9f,
0x87, 0x8b,
};
void DrawAreaSelectMapLabels(void) {
uint16 r3 = 0;
DrawMenuSpritemap(g_word_82C749[0], 0x80, 0x10, r3);
for(int i = 0; i < 6; i++) {
r3 = (i == file_select_map_area_index) ? 0 : 512;
uint16 v1 = 2 * kFileSelectMap_AreaIndexes[i];
uint16 r36 = *(uint16 *)&used_save_stations_and_elevators[v1];
const uint16 *v2 = (const uint16 *)RomPtr_82(*(VoidP *)((uint8 *)&kMapIconDataPointers[4].crateria + v1));
int R30 = 16;
while (*v2 != 0xffff) {
int v4 = r36 & 1;
r36 >>= 1;
if (v4 && *v2 != 0xfffe)
goto LABEL_11;
v2 += 2;
if (!--R30) {
if (enable_debug && *v2 != 0xFFFF) {
LABEL_11:;
int j = 4 * kFileSelectMap_AreaIndexes[i] >> 1;
DrawMenuSpritemap(
g_word_82C749[0] + kFileSelectMap_AreaIndexes[i] + 1,
kAreaSelectMapLabelPositions[j],
kAreaSelectMapLabelPositions[j + 1], r3);
break;
}
break;
}
}
}
}
static const uint16 kRoomSelectMapExpandingSquareTimers[6] = { 0x33, 0x35, 0x2d, 0x33, 0x33, 0x22 };
void FileSelectMap_7_PrepExpandSquareTransToRoomMap(void) { // 0x81AAAC
DrawAreaSelectMapLabels();
SetupInitialExpandingSquareHDMA();
reg_TM = 19;
reg_TMW = 19;
reg_W12SEL = 50;
WriteReg(W12SEL, 0x32);
reg_W34SEL = 2;
WriteReg(W34SEL, 2);
reg_CGADSUB = 5;
WriteReg(CGADSUB, 5);
reg_WOBJSEL = 34;
WriteReg(WOBJSEL, 0x22);
reg_BG12NBA = 48;
hdma_window_1_left_pos[3].field_0 = 0;
hdma_window_1_right_pos[3].field_0 = 0;
DrawRoomSelectMapAreaLabel((LongPtr) { ADDR16_OF_RAM(ram4000) + 340, 0x7e });
uint16 v0 = vram_write_queue_tail;
VramWriteEntry *v1 = gVramWriteEntry(vram_write_queue_tail);
v1->size = 512;
v1->src.addr = ADDR16_OF_RAM(ram4000);
v1->src.bank = 126;
v1->vram_dst = (reg_BG2SC & 0xFC) << 8;
vram_write_queue_tail = v0 + 7;
expanding_square_timer = kRoomSelectMapExpandingSquareTimers[area_index];
int v2 = (uint16)(4 * area_index) >> 1;
expanding_square_left_pos = kAreaSelectMapLabelPositions[v2];
expanding_square_right_pos = expanding_square_left_pos;
expanding_square_top_pos = kAreaSelectMapLabelPositions[v2 + 1];
expanding_square_bottom_pos = expanding_square_top_pos;
expanding_square_left_subpos = 0;
expanding_square_right_subpos = 0;
expanding_square_top_subpos = 0;
expanding_square_bottom_subpos = 0;
const ExpandingSquareVels *vels = &kExpandingSquareVels[area_index];
expanding_square_left_subvel = vels->left_subvel;
expanding_square_left_vel = vels->left_vel;
expanding_square_right_subvel = vels->right_subvel;
expanding_square_right_vel = vels->right_vel;
expanding_square_top_subvel = vels->top_subvel;
expanding_square_top_vel = vels->top_vel;
expanding_square_bottom_subvel = vels->bottom_subvel;
expanding_square_bottom_vel = vels->bottom_vel;
SetupRoomSelectMapExpandingSquareTransHDMA();
reg_HDMAEN = 12;
WriteReg(HDMAEN, 0xC);
++menu_index;
QueueSfx1_Max6(0x3B);
}
void SetupRoomSelectMapExpandingSquareTransHDMA(void) { // 0x81ABA7
uint16 k = 0;
uint16 v0 = expanding_square_top_pos;
AddExpandingSqTransLeftIndirHDMA(v0, k, 0x9E22);
k = AddExpandingSqTransRightIndirHDMA(v0, k, 0x9E20);
uint16 v2 = expanding_square_bottom_pos - expanding_square_top_pos;
if ((uint8)expanding_square_bottom_pos == (uint8)expanding_square_top_pos)
v2 = 1;
AddExpandingSqTransLeftIndirHDMA(v2, k, 0x9E32);
k = AddExpandingSqTransRightIndirHDMA(v2, k, 0x9E36);
uint16 v4 = -32 - expanding_square_bottom_pos;
if ((uint8)expanding_square_bottom_pos == 0xE0)
v4 = 1;
AddExpandingSqTransLeftIndirHDMA(v4, k, 0x9E22);
k = AddExpandingSqTransRightIndirHDMA(v4, k, 0x9E20);
*(&hdma_window_1_left_pos[0].field_0 + k) = 0;
*(&hdma_window_1_right_pos[0].field_0 + k) = 0;
}
void AddExpandingSqTransLeftIndirHDMA(uint16 a, uint16 k, uint16 j) { // 0x81ABF7
if ((a & 0x80) != 0) {
*(&hdma_window_1_left_pos[0].field_0 + k) = a - 127;
*(&hdma_window_1_left_pos[1].field_0 + k) = 127;
*(uint16 *)(&hdma_window_1_left_pos[0].field_1 + k) = j;
*(uint16 *)(&hdma_window_1_left_pos[1].field_1 + k) = j;
} else {
*(&hdma_window_1_left_pos[0].field_0 + k) = a;
*(uint16 *)(&hdma_window_1_left_pos[0].field_1 + k) = j;
}
}
uint16 AddExpandingSqTransRightIndirHDMA(uint16 a, uint16 k, uint16 j) { // 0x81AC2D
if ((a & 0x80) != 0) {
*(&hdma_window_1_right_pos[0].field_0 + k) = a - 127;
*(&hdma_window_1_right_pos[1].field_0 + k) = 127;
*(uint16 *)(&hdma_window_1_right_pos[0].field_1 + k) = j;
*(uint16 *)(&hdma_window_1_right_pos[1].field_1 + k) = j;
return k + 6;
} else {
*(&hdma_window_1_right_pos[0].field_0 + k) = a;
*(uint16 *)(&hdma_window_1_right_pos[0].field_1 + k) = j;
return k + 3;
}
}
void FileSelectMap_8_ExpandSquareTransToRoomSelectMap(void) { // 0x81AC66
if ((HandleRoomSelectMapExpandingSquareTrans() & 0x8000) != 0) {
++menu_index;
reg_TM = 2;
reg_TMW = 0;
reg_TSW = 0;
reg_TS = 0;
}
DrawAreaSelectMapLabels();
}
uint16 HandleRoomSelectMapExpandingSquareTrans(void) { // 0x81AC84
uint16 v0 = (__PAIR32__(expanding_square_left_vel, expanding_square_left_subvel)
+ __PAIR32__(expanding_square_left_pos, expanding_square_left_subpos)) >> 16;
expanding_square_left_subpos += expanding_square_left_subvel;
if (sign16(v0 - 1))
v0 = 1;
expanding_square_left_pos = v0;
uint16 v1 = (__PAIR32__(expanding_square_right_vel, expanding_square_right_subvel)
+ __PAIR32__(expanding_square_right_pos, expanding_square_right_subpos)) >> 16;
expanding_square_right_subpos += expanding_square_right_subvel;
if (!sign16(v1 - 256))
v1 = 255;
expanding_square_right_pos = v1;
uint16 v2 = (__PAIR32__(expanding_square_top_vel, expanding_square_top_subvel)
+ __PAIR32__(expanding_square_top_pos, expanding_square_top_subpos)) >> 16;
expanding_square_top_subpos += expanding_square_top_subvel;
if (sign16(v2 - 1))
v2 = 1;
expanding_square_top_pos = v2;
uint16 v3 = (__PAIR32__(expanding_square_bottom_vel, expanding_square_bottom_subvel)
+ __PAIR32__(expanding_square_bottom_pos, expanding_square_bottom_subpos)) >> 16;
expanding_square_bottom_subpos += expanding_square_bottom_subvel;
if (!sign16(v3 - 224))
v3 = 224;
expanding_square_bottom_pos = v3;
SetupRoomSelectMapExpandingSquareTransHDMA();
return --expanding_square_timer;
}
void FileSelectMap_9_InitRoomSelectMap(void) { // 0x81AD17
LoadMirrorOfExploredMapTiles();
DrawRoomSelectMap();
LoadFromLoadStation();
DisableHdmaObjects();
WaitUntilEndOfVblankAndClearHdma();
RoomDefHeader *RoomDefHeader = get_RoomDefHeader(room_ptr);
LOBYTE(area_index) = RoomDefHeader->area_index_;
LOBYTE(room_x_coordinate_on_map) = RoomDefHeader->x_coordinate_on_map;
LOBYTE(room_y_coordinate_on_map) = RoomDefHeader->y_coordinate_on_map;
SetupMapScrollingForFileSelectMap();
map_min_y_scroll += 24;
reg_BG2VOFS = 24;
*(uint16 *)&reg_TM &= ~4;
++menu_index;
map_scrolling_direction = 0;
map_scrolling_speed_index = 0;
samus_position_indicator_animation_frame = 0;
samus_position_indicator_animation_timer = 0;
samus_position_indicator_animation_loop_counter = 0;
}
void FileSelectMap_10_RoomSelectMap(void) { // 0x81AD7F
int16 v1;
VoidP *v2;
int16 v3;
int8 v4; // cf
int16 v5;
int16 v8;
DrawFileSelectMapIcons();
HandleFileSelectMapScrollArrows();
MapScrolling();
DisplayMapElevatorDestinations();
if (enable_debug && (joypad2_new_keys & kButton_Select) != 0) {
QueueSfx1_Max6(0x38);
uint16 r24 = *(uint16 *)&used_save_stations_and_elevators[2 * area_index];
v1 = load_station_index;
do {
r24 >>= 1;
--v1;
} while (v1 >= 0);
v2 = (VoidP *)RomPtr_82(2 * area_index + 0xC80B);
if (!*v2)
Unreachable();
LongPtr r0 = { *v2, 0x82 };
v3 = 4 * load_station_index;
uint16 r18 = IndirReadWord(r0, v3);
uint16 r20 = IndirReadWord(r0, v3 + 2);
if (!sign16(load_station_index - 16))
goto LABEL_23;
do {
if (!sign16(++load_station_index - 16)) {
while (1) {
v5 = IndirReadWord(r0, 4 * load_station_index);
if (v5 == -1)
break;
if (v5 != -2)
goto LABEL_25;
LABEL_23:
++load_station_index;
}
load_station_index = 0;
r24 = *(uint16 *)&used_save_stations_and_elevators[2 * area_index];
}
v4 = r24 & 1;
r24 >>= 1;
} while (!v4 || IndirReadWord(r0, 4 * load_station_index) >= 0xFFFE);
LABEL_25:;
uint16 v6 = 4 * load_station_index;
uint16 w7 = IndirReadWord(r0, 4 * load_station_index);
if (sign16(w7 - reg_BG1HOFS) || !sign16(w7 - 256 - reg_BG1HOFS)) {
v8 = reg_BG1HOFS + IndirReadWord(r0, v6) - r18;
if (v8 >= 0) {
if ((int16)(v8 - map_min_x_scroll) >= 0)
v8 = map_min_x_scroll;
} else {
v8 = 0;
}
reg_BG1HOFS = v8;
}
uint16 v9 = v6 + 2;
uint16 v10 = IndirReadWord(r0, v9);
if (sign16(v10 - reg_BG1VOFS) || !sign16(v10 - 161 - reg_BG1VOFS)) {
uint16 v11 = reg_BG1VOFS + IndirReadWord(r0, v9) - r20;
if ((int16)(v11 - map_min_y_scroll) >= 0)
v11 = map_min_y_scroll;
reg_BG1VOFS = v11;
}
} else if ((joypad1_newkeys & 0x8000) != 0) {
menu_index += 5;
uint16 v0 = 0;
while (area_index != kFileSelectMap_AreaIndexes[v0 >> 1]) {
v0 += 2;
if ((int16)(v0 - 12) >= 0) {
file_select_map_area_index = 0;
return;
}
}
file_select_map_area_index = v0 >> 1;
QueueSfx1_Max6(0x3C);
} else if ((joypad1_newkeys & (kButton_Start | kButton_A)) != 0) {
++menu_index;
QueueSfx1_Max6(0x38);
}
}
void sub_81AEC8(void) { // 0x81AEC8
HandleFileSelectMapScrollArrows();
}
void HandleFileSelectMapScrollArrows(void) { // 0x81AECA
if (sign16(map_min_x_scroll - 24 - reg_BG1HOFS))
DrawMapScrollArrowAndCheckToScroll(0x81, addr_kLeftMapScrollArrowData);
if (!sign16(map_max_x_scroll - 232 - reg_BG1HOFS))
DrawMapScrollArrowAndCheckToScroll(0x81, addr_kRightMapScrollArrowData);
if (sign16(map_min_y_scroll - 64 - reg_BG1VOFS))
DrawMapScrollArrowAndCheckToScroll(0x81, addr_kUpMapScrollArrowData);
if (sign16(map_max_y_scroll - 145 - reg_BG1VOFS)) {
if (map_scrolling_direction == kDownMapScrollArrowData.map_scroll_dir) {
map_scrolling_gear_switch_timer = 0;
map_scrolling_direction = 0;
map_scrolling_speed_index = 0;
}
} else {
DrawMapScrollArrowAndCheckToScroll(0x81, addr_kDownMapScrollArrowData);
}
}
void FileSelectMap_11(void) { // 0x81AF5A
DrawFileSelectMapIcons();
DisplayMapElevatorDestinations();
++menu_index;
}
void FileSelectMap_13(void) { // 0x81AF66
DrawFileSelectMapIcons();
DisplayMapElevatorDestinations();
HandleFadeOut();
if ((reg_INIDISP & 0xF) == 0) {
++menu_index;
enemy_data[0].x_pos = 32;
}
}
void FileSelectMap_14(void) { // 0x81AF83
if (!--enemy_data[0].x_pos) {
ScreenOff();
++game_state;
menu_index = 0;
}
}
void FileSelectMap_15_ClearTileMap(void) { // 0x81AF97
reg_TM = 18;
for (int i = 2046; i >= 0; i -= 2)
*(uint16 *)((uint8 *)ram3000.pause_menu_map_tilemap + (uint16)i) = 15;
uint16 v1 = vram_write_queue_tail;
VramWriteEntry *v2 = gVramWriteEntry(vram_write_queue_tail);
v2->size = 2048;
v2->src.addr = ADDR16_OF_RAM(ram3000.pause_menu_map_tilemap);
*(uint16 *)&v2->src.bank = 126;
v2->vram_dst = (reg_BG1SC & 0xFC) << 8;
vram_write_queue_tail = v1 + 7;
++menu_index;
}
void FileSelectMap_16_LoadPalettes(void) { // 0x81AFD3
int16 v0;
int16 v1;
LoadMenuPalettes();
v0 = 0;
do {
v1 = v0;
LoadInactiveAreaMapForegroundColors(v0++);
} while ((int16)(v1 - 5) < 0);
LoadActiveAreaMapForegroundColors(area_index);
LoadAreaSelectBackgroundTilemap(area_index);
++menu_index;
}
void FileSelectMap_20_SetupExpandingSquare(void) { // 0x81AFF6
reg_HDMAEN = 0;
QueueSfx1_Max6(0x3C);
expanding_square_timer = kRoomSelectMapExpandingSquareTimers[area_index] - 12;
expanding_square_left_subvel = *(uint16 *)((uint8 *)&kExpandingSquareVels[0].left_subvel
+ (uint16)(16 * area_index));
expanding_square_left_vel = *(uint16 *)((uint8 *)&kExpandingSquareVels[0].left_vel + (uint16)(16 * area_index));
expanding_square_right_subvel = *(uint16 *)((uint8 *)&kExpandingSquareVels[0].right_subvel
+ (uint16)(16 * area_index));
expanding_square_right_vel = *(uint16 *)((uint8 *)&kExpandingSquareVels[0].right_vel
+ (uint16)(16 * area_index));
expanding_square_top_subvel = *(uint16 *)((uint8 *)&kExpandingSquareVels[0].top_subvel
+ (uint16)(16 * area_index));
expanding_square_top_vel = *(uint16 *)((uint8 *)&kExpandingSquareVels[0].top_vel + (uint16)(16 * area_index));
expanding_square_bottom_subvel = *(uint16 *)((uint8 *)&kExpandingSquareVels[0].bottom_subvel
+ (uint16)(16 * area_index));
expanding_square_bottom_vel = *(uint16 *)((uint8 *)&kExpandingSquareVels[0].bottom_vel
+ (uint16)(16 * area_index));
expanding_square_left_pos = 8;
expanding_square_right_pos = 248;
expanding_square_top_pos = 8;
expanding_square_bottom_pos = 216;
expanding_square_left_subpos = 0;
expanding_square_right_subpos = 0;
expanding_square_top_subpos = 0;
expanding_square_bottom_subpos = 0;
SetupRoomSelectMapExpandingSquareTransHDMA();
++menu_index;
reg_HDMAEN = 12;
WriteReg(HDMAEN, 0xC);
reg_W12SEL = 50;
WriteReg(W12SEL, 0x32);
reg_W34SEL = 2;
WriteReg(W34SEL, 2);
reg_BG12NBA = 48;
reg_WOBJSEL = 34;
hdma_window_1_left_pos[3].field_0 = 0;
hdma_window_1_right_pos[3].field_0 = 0;
reg_BG1VOFS = 0;
reg_BG1HOFS = 0;
}
void FileSelectMap_21_MoveExpandingSquare(void) { // 0x81B0BB
uint16 v0 = (__PAIR32__(expanding_square_left_pos, expanding_square_left_subpos)
- __PAIR32__(expanding_square_left_vel, expanding_square_left_subvel)) >> 16;
expanding_square_left_subpos -= expanding_square_left_subvel;
expanding_square_left_pos = v0;
uint16 v1 = (__PAIR32__(expanding_square_right_pos, expanding_square_right_subpos)
- __PAIR32__(expanding_square_right_vel, expanding_square_right_subvel)) >> 16;
expanding_square_right_subpos -= expanding_square_right_subvel;
expanding_square_right_pos = v1;
uint16 v2 = (__PAIR32__(expanding_square_top_pos, expanding_square_top_subpos)
- __PAIR32__(expanding_square_top_vel, expanding_square_top_subvel)) >> 16;
expanding_square_top_subpos -= expanding_square_top_subvel;
expanding_square_top_pos = v2;
uint16 v3 = (__PAIR32__(expanding_square_bottom_pos, expanding_square_bottom_subpos)
- __PAIR32__(expanding_square_bottom_vel, expanding_square_bottom_subvel)) >> 16;
expanding_square_bottom_subpos -= expanding_square_bottom_subvel;
expanding_square_bottom_pos = v3;
SetupRoomSelectMapExpandingSquareTransHDMA();
DrawAreaSelectMapLabels();
if ((--expanding_square_timer & 0x8000) != 0) {
menu_index -= 15;
reg_TM = 17;
reg_TMW = 0;
reg_TSW = 0;
}
}
void NewSaveFile(void) { // 0x81B2CB
samus_max_health = 99;
samus_health = 99;
samus_max_missiles = 0;
samus_missiles = 0;
samus_max_super_missiles = 0;
samus_super_missiles = 0;
samus_max_power_bombs = 0;
samus_power_bombs = 0;
hud_item_index = 0;
collected_beams = 0;
equipped_beams = 0;
collected_items = 0;
equipped_items = 0;
reserve_health_mode = 0;
samus_max_reserve_health = 0;
samus_reserve_health = 0;
samus_reserve_missiles = 0;
button_config_up = kButton_Up;
button_config_down = kButton_Down;
button_config_left = kButton_Left;
button_config_right = kButton_Right;
button_config_jump_a = kButton_A;
button_config_run_b = kButton_B;
button_config_shoot_x = kButton_X;
button_config_itemcancel_y = kButton_Y;
button_config_itemswitch = kButton_Select;
button_config_aim_up_R = kButton_R;
button_config_aim_down_L = kButton_L;
game_time_frames = 0;
game_time_seconds = 0;
game_time_minutes = 0;
game_time_hours = 0;
japanese_text_flag = 0;
moonwalk_flag = 0;
hud_auto_cancel_flag = 0;
debug_flag = 1;
UNUSED_word_7E09E8 = 1;
uint16 v0 = 0;
do {
int v1 = v0 >> 1;
WORD(room_chozo_bits[v0]) = 0;
*(uint16 *)&item_bit_array[v0] = 0;
*(uint16 *)&item_bit_array[v0] = 0;
WORD(opened_door_bit_array[v0]) = 0;
UNUSED_word_7ED8F0[v1] = 0;
*(uint16 *)&map_station_byte_array[v0] = 0;
*(uint16 *)&used_save_stations_and_elevators[v0] = 0;
*(uint16 *)&used_save_stations_and_elevators[v0 + 8] = 0;
v0 += 2;
} while ((int16)(v0 - 8) < 0);
do {
int v2 = v0 >> 1;
WORD(room_chozo_bits[v0]) = 0;
*(uint16 *)&item_bit_array[v0] = 0;
*(uint16 *)&item_bit_array[v0] = 0;
WORD(opened_door_bit_array[v0]) = 0;
v0 += 2;
} while ((int16)(v0 - 64) < 0);
uint16 v3 = 0;
do {
explored_map_tiles_saved[v3 >> 1] = 0;
v3 += 2;
} while ((int16)(v3 - 1792) < 0);
}
void FileSelectClearRestOfMenuTilemapRow(uint16 v0) { // 0x81B3C5
int n = 32 - ((v0 & 0x3F) >> 1);
do {
*(uint16 *)((uint8 *)&ram3000.pause_menu_map_tilemap[768] + v0) = 15;
v0 += 2;
} while (--n);
}
void LoadMenuTilemap(uint16 k, uint16 j) { // 0x81B3E2
int16 v2;
int k_bak = k;
while (1) {
while (1) {
v2 = *(uint16 *)RomPtr_81(j);
if (v2 != -2)
break;
j += 2;
k = (k_bak += 64);
}
if (v2 == -1)
break;
*(uint16 *)((uint8 *)&ram3000.pause_menu_map_tilemap[768] + k) = enemy_data[0].palette_index | v2;
k += 2;
j += 2;
}
}