Ground main clean

This commit is contained in:
Kermalis 2025-12-07 22:16:44 -05:00
parent 7894c3a3e9
commit 6b72605b99
12 changed files with 363 additions and 285 deletions

View File

@ -49,5 +49,6 @@ s32 GetFirstIndexofMailType(u8 mailType);
void sub_8095824(DataSerializer *a, unkStruct_203B480 *b);
void sub_8095774(DataSerializer *a, unkStruct_203B480 *b);
void sub_809542C(DungeonMailSeed *param_1);
void sub_8095494(DungeonMailSeed *param_1, u8 index);
#endif // GUARD_CODE_8094F88_H

View File

@ -107,6 +107,11 @@ enum StartModeVal
STARTMODE_10,
STARTMODE_11,
STARTMODE_DUNGEON_LOST,
STARTMODE_13,
STARTMODE_14,
STARTMODE_15,
STARTMODE_16,
STARTMODE_17,
};
// SCENARIO_MAIN:

View File

@ -4,21 +4,26 @@
#include "constants/rescue_dungeon_id.h"
#include "structs/str_dungeon_setup.h"
u32 xxx_script_related_8098468(s32 param_1);
// startMode: See enum "StartModeVal"
u32 xxx_script_related_8098468(s32 startMode);
void sub_8098C58(void);
void sub_8098CC8(void);
bool8 GroundMainGroundRequest(s32 r0, s32 r1, s32 r2);
bool8 sub_8098D80(u32 speed);
bool8 sub_8098DCC(u32 speed);
bool8 GroundMainRescueRequest(s32 dungeonId_, s32 r1);
// scriptDungeon: See enum "ScriptDungeonId"
bool8 GroundMainRescueRequest(s32 scriptDungeon, s32 r1);
bool32 GroundMainGameEndRequest(u32 r0);
bool32 GroundMainGameCancelRequest(u32 r0);
bool8 sub_8098F88(void);
bool8 GetScriptMode(void);
const char *GetCurrentGroundPlaceName(void);
u8 sub_80990EC(struct DungeonSetupInfo *param_1, s32 param_2);
u8 sub_80991E0(struct DungeonSetupInfo *param_1, s16 *param_2);
void sub_8099220(struct DungeonSetupInfo *param_1, s32 param_2);
// scriptDungeon: See enum "ScriptDungeonId"
u8 sub_80990EC(DungeonSetupInfo *param_1, s32 scriptDungeon);
// scriptDungeon: See enum "ScriptDungeonId"
u8 sub_80991E0(DungeonSetupInfo *param_1, s16 *scriptDungeon);
// scriptDungeon: See enum "ScriptDungeonId"
void sub_8099220(DungeonSetupInfo *param_1, s32 scriptDungeon);
void sub_809927C(u8 param_1);
// See enum "RescueDungeonId"
bool8 sub_80992E0(s16 *param_1, s16 *rescueDungeonId);

View File

@ -80,7 +80,7 @@ typedef struct BmaHeader
/* 0x6 */ u16 numLayers; // Number of layers in this map. Must match BPC layer size. Allowed values are only 1 or 2.
/* 0x8 */ s16 hasDataLayer; // Seems to be a boolean flag (0 or 1). If >0, the Unknown Data Layer exists.
/* 0xA */ u16 hasCollision; // Number of Collision layers. 0, 1 or 2.
/* 0xA */ s16 hasCollision; // Number of Collision layers. 0, 1 or 2.
} BmaHeader;
// size: 0x18?

View File

@ -95,7 +95,7 @@ const u8 *const gUnknown_80B71A0[4] = {
struct MapIdToFriendAreaIdStruct
{
s16 mapId;
s16 mapId; // See enum "GroundMapID"
u8 friendAreaId;
};

View File

@ -1,129 +1,173 @@
#include "global.h"
#include "globaldata.h"
#include "ground_main.h"
#include "constants/dungeon.h"
#include "constants/move_id.h"
#include "structs/str_wonder_mail.h"
#include "structs/str_dungeon_setup.h"
#include "graphics_memory.h"
#include "adventure_info.h"
#include "code_800558C.h"
#include "code_800C9CC.h"
#include "music_util.h"
#include "code_8094F88.h"
#include "code_80958E8.h"
#include "code_8099360.h"
#include "code_809D148.h"
#include "code_80A26CC.h"
#include "ground_place.h"
#include "decompress_sir.h"
#include "debug.h"
#include "event_flag.h"
#include "graphics_memory.h"
#include "ground_effect.h"
#include "ground_event.h"
#include "ground_lives.h"
#include "ground_lives_helper.h"
#include "ground_main.h"
#include "ground_map.h"
#include "ground_map_conversion_table.h"
#include "ground_object.h"
#include "ground_place.h"
#include "ground_script.h"
#include "ground_script_file.h"
#include "ground_sprite.h"
#include "input.h"
#include "music_util.h"
#include "palette_util.h"
#include "play_time.h"
#include "pokemon.h"
#include "text_util.h"
#include "ground_map_conversion_table.h"
#include "ground_lives_helper.h"
#include "ground_script_file.h"
#include "script_item.h"
#include "unk_ds_only_feature.h"
#include "text_1.h"
#include "text_util.h"
#include "textbox.h"
#include "ground_lives.h"
#include "ground_event.h"
#include "ground_sprite.h"
#include "ground_effect.h"
#include "ground_object.h"
#include "ground_script.h"
#include "code_809D148.h"
#include "adventure_info.h"
#include "palette_util.h"
#include "code_800558C.h"
#include "unk_ds_only_feature.h"
EWRAM_DATA u32 gUnknown_20398A8 = {0};
EWRAM_DATA s32 gUnknown_20398AC = {0};
EWRAM_DATA u32 gUnknown_20398B0 = {0};
EWRAM_DATA u32 gUnknown_20398B4 = {0};
EWRAM_DATA u8 gUnknown_20398B8 = {0};
EWRAM_DATA bool8 gUnknown_20398B9 = {0};
EWRAM_DATA bool8 gScriptMode = {0};
UNUSED EWRAM_DATA static u8 gUnknown_20398BB = {0};
EWRAM_DATA u16 gUnknown_20398BC = {0};
EWRAM_DATA s16 gUnknown_20398BE = {0};
EWRAM_DATA u32 gUnknown_20398C0 = {0};
EWRAM_DATA s16 gUnknown_20398C4 = {0}; // See enum "ScriptDungeonId"
EWRAM_DATA struct DungeonSetupInfo gUnknown_20398C8 = {0};
EWRAM_DATA u8 gUnknown_2039950 = 0;
enum Unk_20398A8_Kind
{
Unk_20398A8_UNK0,
Unk_20398A8_UNK1,
Unk_20398A8_UNK2,
Unk_20398A8_UNK3,
Unk_20398A8_UNK4,
Unk_20398A8_UNK5,
Unk_20398A8_UNK6,
Unk_20398A8_UNK7,
Unk_20398A8_UNK8,
Unk_20398A8_UNK9,
Unk_20398A8_UNK10,
};
EWRAM_INIT bool8 gUnknown_203B49C = {0};
EWRAM_INIT u8 gUnknown_203B49D = {0};
static EWRAM_DATA u32 sUnknown_20398A8 = { Unk_20398A8_UNK0 }; // See enum "Unk_20398A8_Kind"
static EWRAM_DATA s32 sUnknown_20398AC = { 0 };
static EWRAM_DATA u32 sUnknown_20398B0 = { 0 };
static EWRAM_DATA u32 sUnknown_20398B4 = { STARTMODE_NEW_GAME }; // See enum "StartModeVal"
static EWRAM_DATA bool8 sUnknown_20398B8 = { FALSE };
static EWRAM_DATA bool8 sUnknown_20398B9 = { FALSE };
static EWRAM_DATA bool8 sScriptMode = { FALSE };
UNUSED static EWRAM_DATA u8 sUnused1 = { 0 };
static EWRAM_DATA u16 sUnknown_20398BC = { MAP_SQUARE }; // See enum "GroundMapID". Set but never read
static EWRAM_DATA s16 sUnknown_20398BE = { MAP_SQUARE }; // See enum "GroundMapID"
static EWRAM_DATA u32 sUnknown_20398C0 = { 0 }; // Related to GROUND_ENTER_LINK
static EWRAM_DATA s16 sUnknown_20398C4 = { SCRIPT_DUNGEON_TINY_WOODS }; // See enum "ScriptDungeonId"
static EWRAM_DATA DungeonSetupInfo sUnknown_20398C8 = { 0 };
static EWRAM_DATA u8 sUnknown_2039950 = 0; // Related to DUNGEON_ENTER_INDEX
extern void sub_809D25C();
extern void sub_809CA20();
extern void sub_80A6E80();
extern void nullsub_106();
extern void sub_80A73EC();
extern void sub_8095494(DungeonMailSeed *param_1, u8 index);
// TODO: Move these externs to headers
extern bool8 sub_80048BC(void);
extern void sub_8099768(void);
extern void sub_809975C(void);
extern void sub_8099BE4(void);
extern void nullsub_16(void);
extern void sub_80060EC(void);
extern void sub_809977C(void);
extern void UpdateFadeInTile(s32);
static EWRAM_INIT bool8 sUnknown_203B49C = { FALSE };
static EWRAM_INIT bool8 sUnknown_203B49D = { FALSE };
static s16 sub_8098FCC(u32 unused);
UNUSED static const u8 sUnusedConstData[] = {
0, 0, 0, 0, 0x01, 0, 0, 0, 0x69, 0, 0, 0, 0x09, 0, 0, 0, 0x0c, 0, 0, 0, 0x01, 0, 0, 0, 0xb2, 0, 0, 0,
0xb4, 0, 0, 0, 0xb6, 0, 0, 0, 0xb8, 0, 0, 0, 0xba, 0, 0, 0, 0xbc, 0, 0, 0, 0xbf, 0, 0, 0, 0xc1, 0, 0, 0, 0xc3,
0, 0, 0, 0xc6, 0, 0, 0, 0xc9, 0, 0, 0, 0xcc, 0, 0, 0, 0xcf, 0, 0, 0, 0xa2, 0, 0, 0, 0xa2, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
UNUSED static const u8 sUnusedConstData[154] = {
0, 0, 0, 0,
1, 0, 0, 0,
105, 0, 0, 0,
9, 0, 0, 0,
12, 0, 0, 0,
1, 0, 0, 0,
178, 0, 0, 0,
180, 0, 0, 0,
182, 0, 0, 0,
184, 0, 0, 0,
186, 0, 0, 0,
188, 0, 0, 0,
191, 0, 0, 0,
193, 0, 0, 0,
195, 0, 0, 0,
198, 0, 0, 0,
201, 0, 0, 0,
204, 0, 0, 0,
207, 0, 0, 0,
162, 0, 0, 0,
162, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0
};
u32 xxx_script_related_8098468(s32 param_1)
u32 xxx_script_related_8098468(s32 startMode)
{
s32 scriptID;
s32 varE;
gUnknown_20398B4 = param_1;
gUnknown_20398B9 = 0;
gUnknown_20398B8 = 1;
gScriptMode = 0;
sUnknown_20398B4 = startMode;
sUnknown_20398B9 = FALSE;
sUnknown_20398B8 = TRUE;
sScriptMode = FALSE;
switch (param_1) {
case 0xd:
gScriptMode = 1;
gUnknown_20398B8 = 0;
gUnknown_20398B9 = 1;
break;
case 0xe:
gUnknown_20398B8 = 1;
gUnknown_20398B9 = 1;
break;
case 0xf:
gUnknown_20398B8 = 1;
gUnknown_20398B9 = 1;
break;
case 0x10: {
s32 local_1c;
u32 auStack24;
GetScriptVarScenario(SCENARIO_MAIN,&local_1c,&auStack24);
gUnknown_20398B8 = local_1c == 0;
gUnknown_20398B9 = 1;
switch (startMode) {
case STARTMODE_13: {
sScriptMode = TRUE;
sUnknown_20398B8 = FALSE;
sUnknown_20398B9 = TRUE;
break;
}
case 0x11:
gUnknown_20398B8 = 0;
gUnknown_20398B9 = 1;
case STARTMODE_14: {
sUnknown_20398B8 = TRUE;
sUnknown_20398B9 = TRUE;
break;
default:
}
case STARTMODE_15: {
sUnknown_20398B8 = TRUE;
sUnknown_20398B9 = TRUE;
break;
}
case STARTMODE_16: {
s32 main;
u32 sub;
GetScriptVarScenario(SCENARIO_MAIN, &main, &sub);
sUnknown_20398B8 = main == 0; // Basically checking new game
sUnknown_20398B9 = TRUE;
break;
}
case STARTMODE_17: {
sUnknown_20398B8 = FALSE;
sUnknown_20398B9 = TRUE;
break;
}
default: {
break;
}
}
ResetSoundEffectCounters();
if (gUnknown_20398B9 == 0 && !CheckQuest(QUEST_IN_WORLD_CALAMITY)) {
FadeOutAllMusic(0x10);
if (!sUnknown_20398B9 && !CheckQuest(QUEST_IN_WORLD_CALAMITY)) {
FadeOutAllMusic(16);
}
gUnknown_2026E4E = 0x808;
UpdateFadeInTile(0);
sub_8099648();
@ -142,39 +186,40 @@ u32 xxx_script_related_8098468(s32 param_1)
AllocGroundObjects();
AllocGroundEffects();
TextboxResetAll();
gUnknown_203B49C = 0;
gUnknown_203B49D = 0;
gUnknown_20398A8 = 1;
gUnknown_20398AC = 0;
gUnknown_20398B0 = -1;
gUnknown_20398BE = GetScriptVarValue(NULL,GROUND_ENTER);
varE = GetScriptVarValue(NULL,GROUND_ENTER_LINK);
gUnknown_20398C0 = varE;
gUnknown_20398C4 = -1;
sUnknown_203B49C = FALSE;
sUnknown_203B49D = FALSE;
sUnknown_20398A8 = Unk_20398A8_UNK1;
sUnknown_20398AC = 0;
sUnknown_20398B0 = -1;
sUnknown_20398BE = GetScriptVarValue(NULL, GROUND_ENTER);
varE = GetScriptVarValue(NULL, GROUND_ENTER_LINK);
sUnknown_20398C0 = varE;
sUnknown_20398C4 = -1;
scriptID = -1;
while (gUnknown_20398A8 - 1 <= 1) {
while (sUnknown_20398A8 == Unk_20398A8_UNK1 || sUnknown_20398A8 == Unk_20398A8_UNK2) {
SetAutoPressTextboxFrames(-1);
ScriptClearTextbox();
sub_809977C();
switch (gUnknown_20398B4) {
case 0:
switch (sUnknown_20398B4) {
case STARTMODE_NEW_GAME:
sub_8098C58();
gUnknown_20398B4 = 1;
sUnknown_20398B4 = STARTMODE_CONTINUE_GAME;
break;
case 2:
case 3:
case STARTMODE_GROUND:
case STARTMODE_3:
sub_8001D88();
break;
case 5:
case STARTMODE_DUNGEON_FROM_WORLD_MAP:
scriptID = EVENT_RESCUE;
break;
case 9:
case 10:
case 11:
case 12: {
case STARTMODE_DUNGEON_WON:
case STARTMODE_10:
case STARTMODE_11:
case STARTMODE_DUNGEON_LOST: {
s32 scriptVar13;
SetScriptVarValue(NULL,DUNGEON_RESULT,gUnknown_20398B4);
SetScriptVarValue(NULL,DUNGEON_RESULT,sUnknown_20398B4);
SetScriptVarValue(NULL,WARP_LOCK,0);
sub_8098C58();
UpdateScriptVarWithImmediate(0,DUNGEON_ENTER_FREQUENCY,1,2);
@ -189,59 +234,59 @@ u32 xxx_script_related_8098468(s32 param_1)
dungInfo = GetScriptDungeonInfo(scriptVar13);
}
scriptID = dungInfo->scriptID3;
if (gUnknown_20398B4 == 9) {
if (sUnknown_20398B4 == STARTMODE_DUNGEON_WON) {
SetScriptVarArrayValue(NULL,DUNGEON_CLEAR_LIST,(u16) scriptVar13,1);
}
var = sub_8098FCC(gUnknown_20398B4);
var = sub_8098FCC(sUnknown_20398B4);
if (var != -1) {
gUnknown_20398BE = var;
gUnknown_20398C0 = 0;
sUnknown_20398BE = var;
sUnknown_20398C0 = 0;
}
}
break;
}
case 13:
case STARTMODE_13:
sub_8098C58();
gUnknown_20398B4 = 1;
sUnknown_20398B4 = STARTMODE_CONTINUE_GAME;
SetScriptVarValue(NULL,START_MODE,1);
SetScriptVarValue(NULL,GROUND_GETOUT,0);
SetScriptVarValue(NULL,GROUND_ENTER,0);
SetScriptVarValue(NULL,GROUND_ENTER_LINK,0);
scriptID = DEBUG_SCRIPT;
break;
case 14:
case STARTMODE_14:
scriptID = DEMO_01;
break;
case 15:
case STARTMODE_15:
scriptID = DEMO_02;
break;
case 16:
case STARTMODE_16:
scriptID = DEMO_03;
break;
case 17:
case STARTMODE_17:
scriptID = DEMO_04;
break;
}
if (gUnknown_20398B9 == 0) {
if (!sUnknown_20398B9) {
s32 var = GetScriptVarValue(NULL,GROUND_ENTER);
SetScriptVarValue(NULL,START_MODE,gUnknown_20398B4);
if (gUnknown_20398B4 != 1) {
if (gUnknown_20398B4 == 3) {
SetScriptVarValue(NULL,GROUND_GETOUT,gUnknown_20398BE);
SetScriptVarValue(NULL,START_MODE,sUnknown_20398B4);
if (sUnknown_20398B4 != STARTMODE_CONTINUE_GAME) {
if (sUnknown_20398B4 == STARTMODE_3) {
SetScriptVarValue(NULL, GROUND_GETOUT, sUnknown_20398BE);
}
else {
SetScriptVarValue(NULL,GROUND_GETOUT,var);
SetScriptVarValue(NULL, GROUND_GETOUT, var);
}
}
SetScriptVarValue(NULL,GROUND_ENTER,gUnknown_20398BE);
SetScriptVarValue(NULL,GROUND_ENTER_LINK,gUnknown_20398C0);
SetScriptVarValue(NULL, GROUND_ENTER, sUnknown_20398BE);
SetScriptVarValue(NULL, GROUND_ENTER_LINK, sUnknown_20398C0);
}
gUnknown_20398B4 = 2;
gUnknown_20398A8 = 0;
gUnknown_20398AC = 0;
gUnknown_20398B0 = -1;
gUnknown_20398BC = gUnknown_20398BE;
gUnknown_20398BE = -1;
sUnknown_20398B4 = STARTMODE_GROUND;
sUnknown_20398A8 = Unk_20398A8_UNK0;
sUnknown_20398AC = 0;
sUnknown_20398B0 = -1;
sUnknown_20398BC = sUnknown_20398BE;
sUnknown_20398BE = -1;
sub_809977C();
sub_809D4B0();
GroundSprite_Reset(-1);
@ -269,11 +314,11 @@ u32 xxx_script_related_8098468(s32 param_1)
while ( 1 ) {
xxx_call_update_bg_sound_input();
sub_80A6E68();
if (gUnknown_20398A8 != 0) {
if (gUnknown_20398AC > 0) {
gUnknown_20398AC--;
if (gUnknown_20398AC < 1) {
sub_80999D4(gUnknown_20398B0);
if (sUnknown_20398A8 != Unk_20398A8_UNK0) {
if (sUnknown_20398AC > 0) {
sUnknown_20398AC--;
if (sUnknown_20398AC < 1) {
sub_80999D4(sUnknown_20398B0);
}
}
else if (!sub_8099B94()) {
@ -281,7 +326,7 @@ u32 xxx_script_related_8098468(s32 param_1)
break;
}
}
else if (gUnknown_20398B9 != 0 && gUnknown_20398B8 == 0 && !sub_809AFAC()) {
else if (sUnknown_20398B9 && !sUnknown_20398B8 && !sub_809AFAC()) {
u16 pressed = gRealInputs.pressed;
if ((pressed & (A_BUTTON | B_BUTTON | SELECT_BUTTON | START_BUTTON | R_BUTTON | L_BUTTON)) || sub_80048BC()) {
GroundMap_ExecuteEvent(DEMO_CANCEL, FALSE);
@ -337,12 +382,13 @@ u32 xxx_script_related_8098468(s32 param_1)
sub_8099768();
nullsub_103();
nullsub_16();
if (gUnknown_20398B9 != 0) {
if (gUnknown_20398A8 == 9) {
if (sUnknown_20398B9) {
if (sUnknown_20398A8 == Unk_20398A8_UNK9) {
FadeOutAllMusic(30);
return 15;
}
else if (gUnknown_20398A8 == 10) {
else if (sUnknown_20398A8 == Unk_20398A8_UNK10) {
return 16;
}
else {
@ -351,25 +397,25 @@ u32 xxx_script_related_8098468(s32 param_1)
}
}
else {
switch (gUnknown_20398A8) {
case 3:
switch (sUnknown_20398A8) {
case Unk_20398A8_UNK3:
SetScriptVarValue(NULL,DUNGEON_ENTER,-1);
SetScriptVarValue(NULL,DUNGEON_ENTER_INDEX,-1);
SetScriptVarValue(NULL,START_MODE,4);
SetScriptVarValue(NULL,DUNGEON_RESULT,4);
SetScriptVarValue(NULL,GROUND_GETOUT,GetScriptVarValue(NULL,GROUND_ENTER));
return 5;
case 4:
case Unk_20398A8_UNK4:
SetScriptVarValue(NULL,DUNGEON_ENTER,0);
SetScriptVarValue(NULL,START_MODE,5);
SetScriptVarValue(NULL,DUNGEON_RESULT,5);
SetScriptVarValue(NULL,DUNGEON_ENTER,-1);
return 6;
case 5: {
s32 rescueDungeonID = ScriptDungeonIDToRescueDungeonID(gUnknown_20398C4);
SetScriptVarValue(NULL,DUNGEON_ENTER,gUnknown_20398C4);
case Unk_20398A8_UNK5: {
s32 rescueDungeonID = ScriptDungeonIDToRescueDungeonID(sUnknown_20398C4);
SetScriptVarValue(NULL,DUNGEON_ENTER,sUnknown_20398C4);
SetScriptVarValue(NULL, DUNGEON_ENTER_INDEX, rescueDungeonID);
SetScriptVarArrayValue(NULL,DUNGEON_ENTER_LIST,(u16) gUnknown_20398C4,1);
SetScriptVarArrayValue(NULL,DUNGEON_ENTER_LIST,(u16) sUnknown_20398C4,1);
SetScriptVarValue(NULL,START_MODE,7);
SetScriptVarValue(NULL,DUNGEON_RESULT,7);
if ((s16)GetScriptVarValue(NULL,GROUND_PLACE) == 10) {
@ -377,24 +423,24 @@ u32 xxx_script_related_8098468(s32 param_1)
}
return 7;
}
case 6:
case Unk_20398A8_UNK6:
SetScriptVarValue(NULL,DUNGEON_ENTER,81);
SetScriptVarValue(NULL,DUNGEON_ENTER_INDEX,gUnknown_20398C4);
SetScriptVarValue(NULL,DUNGEON_ENTER_INDEX,sUnknown_20398C4);
SetScriptVarValue(NULL,START_MODE,7);
SetScriptVarValue(NULL,DUNGEON_RESULT,7);
if ((s16)GetScriptVarValue(NULL,GROUND_PLACE) == 10) {
SetScriptVarValue(NULL,GROUND_PLACE,0);
}
return 8;
case 7:
case Unk_20398A8_UNK7:
SetScriptVarValue(NULL,DUNGEON_ENTER,80);
SetScriptVarValue(NULL,DUNGEON_ENTER_INDEX,gUnknown_2039950);
SetScriptVarValue(NULL,DUNGEON_ENTER_INDEX, sUnknown_2039950);
SetScriptVarValue(NULL,START_MODE,7);
SetScriptVarValue(NULL,DUNGEON_RESULT,7);
return 9;
case 8:
case Unk_20398A8_UNK8:
SetScriptVarValue(NULL,DUNGEON_ENTER,82);
SetScriptVarValue(NULL,DUNGEON_ENTER_INDEX,gUnknown_20398C4);
SetScriptVarValue(NULL,DUNGEON_ENTER_INDEX,sUnknown_20398C4);
SetScriptVarValue(NULL,START_MODE,7);
SetScriptVarValue(NULL,DUNGEON_RESULT,7);
return 10;
@ -490,134 +536,141 @@ void sub_8098CC8(void)
}
// arm9.bin::0206C1A4
// r0: enum "GroundMapID"
bool8 GroundMainGroundRequest(s32 r0, s32 r1, s32 r2)
{
s32 temp = (s16) r0; // force a asr shift
if(gUnknown_20398A8 == 0)
{
if (sUnknown_20398A8 == Unk_20398A8_UNK0) {
Log(0, "GroundMain ground request %3d %3d", temp, r2);
gUnknown_20398A8 = 1;
gUnknown_20398AC = 1;
gUnknown_20398B0 = r2;
gUnknown_20398B4 = 2;
gUnknown_20398BE = temp;
gUnknown_20398C0 = r1;
sUnknown_20398A8 = Unk_20398A8_UNK1;
sUnknown_20398AC = 1;
sUnknown_20398B0 = r2;
sUnknown_20398B4 = STARTMODE_GROUND;
sUnknown_20398BE = temp;
sUnknown_20398C0 = r1;
return TRUE;
}
return FALSE;
}
bool8 sub_8098D80(u32 speed)
{
if(gUnknown_20398A8 == 0)
{
gUnknown_20398A8 = 3;
gUnknown_20398AC = 1;
gUnknown_20398B0 = speed;
if (sUnknown_20398A8 == Unk_20398A8_UNK0) {
sUnknown_20398A8 = Unk_20398A8_UNK3;
sUnknown_20398AC = 1;
sUnknown_20398B0 = speed;
sub_809C730();
if(!CheckQuest(QUEST_IN_WORLD_CALAMITY))
{
if (!CheckQuest(QUEST_IN_WORLD_CALAMITY))
FadeOutAllMusic(speed);
}
return TRUE;
}
return FALSE;
}
bool8 sub_8098DCC(u32 speed)
{
if(gUnknown_20398A8 == 0)
{
gUnknown_20398A8 = 4;
gUnknown_20398AC = 1;
gUnknown_20398B0 = speed;
if (sUnknown_20398A8 == Unk_20398A8_UNK0) {
sUnknown_20398A8 = Unk_20398A8_UNK4;
sUnknown_20398AC = 1;
sUnknown_20398B0 = speed;
sub_809C730();
if(!CheckQuest(QUEST_IN_WORLD_CALAMITY))
{
FadeOutAllMusic(speed);
}
return TRUE;
}
return FALSE;
}
bool8 GroundMainRescueRequest(s32 dungeonId_, s32 r1)
bool8 GroundMainRescueRequest(s32 scriptDungeon, s32 r1)
{
// Needed to match
s32 dungeonId = (s16) dungeonId_;
s32 dungeonId = (s16)scriptDungeon;
s32 _dungeonId = dungeonId;
if (gUnknown_20398A8 == 0) {
if (sUnknown_20398A8 == Unk_20398A8_UNK0) {
Log(0, "GroundMain recue request %3d %3d", dungeonId, r1);
if (gUnknown_203B49D != 0) {
gUnknown_20398A8 = 7;
if (sUnknown_203B49D) {
sUnknown_20398A8 = Unk_20398A8_UNK7;
}
else {
if (!gUnknown_203B49C) {
gUnknown_20398C4 = _dungeonId;
}
switch (sub_80A2750(gUnknown_20398C4)) {
case 4: gUnknown_20398A8 = 8; break;
case 1: gUnknown_20398A8 = 5; break;
case 2: gUnknown_20398A8 = 6; break;
if (!sUnknown_203B49C)
sUnknown_20398C4 = _dungeonId;
switch (sub_80A2750(sUnknown_20398C4)) {
case 4: sUnknown_20398A8 = Unk_20398A8_UNK8; break;
case 1: sUnknown_20398A8 = Unk_20398A8_UNK5; break;
case 2: sUnknown_20398A8 = Unk_20398A8_UNK6; break;
}
}
gUnknown_20398AC = 1;
gUnknown_20398B0 = r1;
sUnknown_20398AC = 1;
sUnknown_20398B0 = r1;
sub_809C730();
return TRUE;
}
return FALSE;
}
UNUSED static bool8 GroundMainUserRescueRequest(u32 r0)
{
if (gUnknown_20398A8 == 0) {
if(gUnknown_203B49D != 0) {
Log(0, "GroundMain user rescue request %3d", r0);
gUnknown_20398A8 = 7;
gUnknown_20398AC = 1;
gUnknown_20398B0 = r0;
sub_809C730();
return TRUE;
}
if (sUnknown_20398A8 == Unk_20398A8_UNK0 && sUnknown_203B49D) {
Log(0, "GroundMain user rescue request %3d", r0);
sUnknown_20398A8 = Unk_20398A8_UNK7;
sUnknown_20398AC = 1;
sUnknown_20398B0 = r0;
sub_809C730();
return TRUE;
}
return FALSE;
}
bool32 GroundMainGameEndRequest(u32 r0)
{
if (gUnknown_20398A8 == 0) {
if (sUnknown_20398A8 == Unk_20398A8_UNK0) {
Log(0, "GroundMain game end request %3d", r0);
gUnknown_20398A8 = 9;
gUnknown_20398AC = 1;
gUnknown_20398B0 = r0;
sUnknown_20398A8 = Unk_20398A8_UNK9;
sUnknown_20398AC = 1;
sUnknown_20398B0 = r0;
sub_809C730();
return TRUE;
}
return FALSE;
}
bool32 GroundMainGameCancelRequest(u32 r0)
{
if (gUnknown_20398A8 == 0) {
if (sUnknown_20398A8 == Unk_20398A8_UNK0) {
Log(0, "GroundMain game cancel request %3d", r0);
gUnknown_20398A8 = 10;
gUnknown_20398AC = 1;
gUnknown_20398B0 = r0;
sUnknown_20398A8 = Unk_20398A8_UNK10;
sUnknown_20398AC = 1;
sUnknown_20398B0 = r0;
sub_809C730();
return TRUE;
}
return FALSE;
}
bool8 sub_8098F88(void)
{
return gUnknown_20398B9;
return sUnknown_20398B9;
}
bool8 GetScriptMode(void)
{
return gScriptMode;
return sScriptMode;
}
UNUSED static s16 sub_8098FA0(void)
@ -649,7 +702,7 @@ static s16 sub_8098FCC(u32 unused)
scriptDungeon = scriptDungeon_;
di = GetScriptDungeonInfo(scriptDungeon);
if (gUnknown_20398B4 == 9)
if (sUnknown_20398B4 == STARTMODE_DUNGEON_WON)
return di->mapID2;
switch (di->mapID3) {
@ -684,25 +737,28 @@ UNUSED static const char *sub_80990B8(void)
}
}
static inline bool8 sub_80990EC_sub(struct DungeonSetupInfo *iVar1, u32 iVar2)
static inline bool8 sub_80990EC_sub(DungeonSetupInfo *iVar1, u32 scriptDungeon)
{
bool8 flag = FALSE;
iVar1->sub0.missionKind = DUNGEON_MISSION_UNK0;
if ((u16)(iVar2 - 37) < 3)
/*if (scriptDungeon == SCRIPT_DUNGEON_MT_FREEZE_2
|| scriptDungeon == SCRIPT_DUNGEON_MT_FREEZE_PEAK_2
|| scriptDungeon == SCRIPT_DUNGEON_MURKY_CAVE)*/
if ((u16)(scriptDungeon - SCRIPT_DUNGEON_MT_FREEZE_2) < 3)
flag = TRUE;
else
flag = FALSE;
return flag;
}
u8 sub_80990EC(struct DungeonSetupInfo *param_1, s32 param_2)
u8 sub_80990EC(DungeonSetupInfo *param_1, s32 scriptDungeon)
{
const DungeonInfo *iVar1;
u8 auStack_98 [24];
u8 nameBuffer [24];
u8 dungeonIndex;
s32 param2 = (s16) param_2;
s32 param2 = (s16)scriptDungeon;
iVar1 = GetScriptDungeonInfo(param2);
dungeonIndex = iVar1->dungeonID;
@ -749,47 +805,47 @@ u8 sub_80990EC(struct DungeonSetupInfo *param_1, s32 param_2)
return iVar1->unk11;
}
u8 sub_80991E0(struct DungeonSetupInfo *param_1, s16 *param_2)
u8 sub_80991E0(DungeonSetupInfo *param_1, s16 *scriptDungeon)
{
*param_2 = gUnknown_20398C4;
if (gUnknown_203B49C) {
memcpy(param_1, &gUnknown_20398C8, sizeof(struct DungeonSetupInfo));
*scriptDungeon = sUnknown_20398C4;
if (sUnknown_203B49C) {
memcpy(param_1, &sUnknown_20398C8, sizeof(DungeonSetupInfo));
return TRUE;
}
else {
return sub_80990EC(param_1,gUnknown_20398C4);
return sub_80990EC(param_1,sUnknown_20398C4);
}
}
void sub_8099220(struct DungeonSetupInfo *param_1, s32 param_2)
void sub_8099220(DungeonSetupInfo *param_1, s32 scriptDungeon)
{
s32 param_2_s32 = (s16) param_2;
s32 param_2_s32 = (s16)scriptDungeon;
if (param_1 != NULL) {
gUnknown_203B49C = TRUE;
gUnknown_203B49D = 0;
gUnknown_20398C4 = param_2_s32;
memcpy(&gUnknown_20398C8, param_1, sizeof(struct DungeonSetupInfo));
sUnknown_203B49C = TRUE;
sUnknown_203B49D = FALSE;
sUnknown_20398C4 = param_2_s32;
memcpy(&sUnknown_20398C8, param_1, sizeof(DungeonSetupInfo));
}
else {
gUnknown_203B49C = FALSE;
gUnknown_203B49D = 0;
gUnknown_20398C4 = -1;
sUnknown_203B49C = FALSE;
sUnknown_203B49D = FALSE;
sUnknown_20398C4 = -1;
}
}
void sub_809927C(u8 param_1)
{
gUnknown_203B49C = 1;
gUnknown_203B49D = 1;
gUnknown_20398C4 = 80;
gUnknown_2039950 = param_1;
SetScriptVarValue(NULL,DUNGEON_ENTER,80);
SetScriptVarValue(NULL,DUNGEON_ENTER_INDEX,gUnknown_2039950);
sub_8095494(&gUnknown_20398C8.dungeonSeed,param_1);
gUnknown_20398C8.sub0.missionKind = DUNGEON_MISSION_OUTONRESCUE;
gUnknown_20398C8.sub0.unkC = 0;
gUnknown_20398C8.sub0.unk4 = 0;
gUnknown_20398C8.sub0.unkD = 0;
sUnknown_203B49C = TRUE;
sUnknown_203B49D = TRUE;
sUnknown_20398C4 = SCRIPT_DUNGEON_80;
sUnknown_2039950 = param_1;
SetScriptVarValue(NULL,DUNGEON_ENTER,sUnknown_20398C4);
SetScriptVarValue(NULL,DUNGEON_ENTER_INDEX,sUnknown_2039950);
sub_8095494(&sUnknown_20398C8.dungeonSeed, param_1);
sUnknown_20398C8.sub0.missionKind = DUNGEON_MISSION_OUTONRESCUE;
sUnknown_20398C8.sub0.unkC = 0;
sUnknown_20398C8.sub0.unk4 = 0;
sUnknown_20398C8.sub0.unkD = 0;
}
bool8 sub_80992E0(s16 *param_1, s16 *rescueDungeonId)
@ -854,7 +910,7 @@ bool8 sub_8099394(u8 *param)
void sub_80993C0(bool8 param)
{
gUnknown_20398B8 = (param == FALSE);
sUnknown_20398B8 = (param == FALSE);
}
void sub_80993D8(void)

View File

@ -493,6 +493,7 @@ void GroundMap_Select(s32 mapId_)
sub_80A56D8(&(const PixelPos) {0});
}
// overlay_0000.bin::0215556C
void GroundMap_SelectDungeon(s32 mapId_, const DungeonLocation *loc, u32 param_2)
{
const GroundConversionStruct *ptr;
@ -534,6 +535,7 @@ void GroundMap_SelectDungeon(s32 mapId_, const DungeonLocation *loc, u32 param_2
sub_80A56D8(&(const PixelPos) {0, 0});
}
// overlay_0000.bin::02154FAC
NAKED
static u8* sub_80A5204(void *a, const u8 *b, BmaHeader *c, s32 d)
{

View File

@ -1006,13 +1006,13 @@ s16 HandleAction(Action *action, const DebugLocation *debug)
}
case CMD_BYTE_07: {
if (action->scriptData.branchDiscriminant == 1) {
s32 dungeonEnter;
s32 scriptDungeon;
u32 res;
struct DungeonSetupInfo unkStruct;
dungeonEnter = (s16)GetScriptVarValue(NULL, 19);
if (sub_80990EC(&unkStruct, dungeonEnter)) {
DungeonSetupInfo unkStruct;
scriptDungeon = (s16)GetScriptVarValue(NULL, 19);
if (sub_80990EC(&unkStruct, scriptDungeon)) {
s32 val;
sub_8099220(&unkStruct, dungeonEnter);
sub_8099220(&unkStruct, scriptDungeon);
val = CheckQuest(QUEST_REACHED_POSTGAME);
res = BufferDungeonRequirementsText(unkStruct.sub0.unk0.id, 0, gUnknown_203B4B0, val, FALSE);
gUnknown_2039DA4 = res;
@ -1127,7 +1127,7 @@ s16 HandleAction(Action *action, const DebugLocation *debug)
break;
}
sub_8099220(0, 0);
sub_8099220(0, SCRIPT_DUNGEON_TINY_WOODS);
SetScriptVarValue(NULL, 19, -1);
action->scriptData.script.ptr = ResolveJump(action, -1);
action->scriptData.savedState = ESC_RET_03;
@ -1521,25 +1521,33 @@ static s32 ExecuteScriptCommand(Action *action)
curCmd = *scriptData->script.ptr++;
switch (scriptData->curScriptOp = curCmd.op) {
case CMD_BYTE_01: {
u32 arg = (s16)curCmd.arg1;
u32 argCopy = arg;
u32 groundMap_ = (s16)curCmd.arg1;
u32 groundMap = groundMap_;
u32 byte = (u8)curCmd.argByte;
if (ScriptLoggingEnabled(TRUE)) {
Log(1, " ground select %3d[%s] %3d", arg, gGroundMapConversionTable[arg].text, byte);
Log(1, " ground select %3d[%s] %3d",
groundMap_, gGroundMapConversionTable[groundMap_].text, byte);
}
GroundMainGroundRequest(argCopy, byte, curCmd.argShort);
GroundMainGroundRequest(groundMap, byte, curCmd.argShort);
break;
}
case CMD_BYTE_02: {
s32 dungeonId = (s16)curCmd.arg1;
if (dungeonId == -1) dungeonId = (s16)GetScriptVarValue(NULL, DUNGEON_ENTER);
s32 scriptDungeon = (s16)curCmd.arg1;
if (scriptDungeon == -1)
scriptDungeon = (s16)GetScriptVarValue(NULL, DUNGEON_ENTER);
if (ScriptLoggingEnabled(TRUE)) {
Log(1, " dungeon select %3d", dungeonId);
Log(1, " dungeon select %3d", scriptDungeon);
}
if (dungeonId != -1) {
GroundMainRescueRequest(dungeonId, curCmd.argShort);
if (scriptDungeon != -1) {
GroundMainRescueRequest(scriptDungeon, curCmd.argShort);
action->scriptData.script.ptr = ResolveJump(action, 1);
} else {
}
else {
action->scriptData.script.ptr = ResolveJump(action, 0);
}
break;
@ -1832,9 +1840,9 @@ static s32 ExecuteScriptCommand(Action *action)
s32 a = (s16)GetScriptVarValue(NULL, DUNGEON_ENTER);
const DungeonInfo *ret1 = GetScriptDungeonInfo(a);
s32 scriptIndex = GetScriptVarArrayValue(NULL, DUNGEON_ENTER_LIST, (u16)a) == 0 ? ret1->scriptID1 : ret1->scriptID2;
// fakematch: this is almost certainly a range check of the form 0x37 <= a && a < 0x48
// fakematch: this is almost certainly a range check of the form SCRIPT_DUNGEON_NORMAL_MAZE_2 <= a && a <= SCRIPT_DUNGEON_STEEL_MAZE
// but that loses the s32 -> u16 cast. Inlines, macros, or other shenanigans are likely involved
if (!((u16)(a - 0x37) < 0x11) && (s16)sub_80A2750(a) == 1) {
if (!((u16)(a - SCRIPT_DUNGEON_NORMAL_MAZE_2) < 17) && (s16)sub_80A2750(a) == 1) {
if (scriptIndex == -1) {
if (ScriptLoggingEnabled(TRUE))
Log(1, " dungeon rescue select %3d", a);
@ -4062,7 +4070,7 @@ static s32 sub_80A14E8(Action *action, u8 idx, u32 r2, s32 r3)
break;
case 0x40:
sub_80993C0(r2 == 0 ? 0 : 1);
sub_80993C0(r2 != 0);
return 0;
case 0x42:
sub_8011C28(1);

View File

@ -83,7 +83,7 @@ static u8 sub_8001170(void);
static void RemoveMoneyAndRandomItems(void);
static void RemoveAllMoneyAndItems(void);
static void LoadAndRunDungeon_Async(DungeonSetupStruct *r0);
static u32 xxx_script_related_8001334(u32 r0);
static u32 xxx_script_related_8001334(u32 startMode);
static void MainLoops_RunFrameActions(u32 unused);
extern bool8 sub_8096A08(u8 dungeon, Pokemon *pokemon);
@ -153,13 +153,13 @@ void GameLoop_Async(void)
if (ReadSaveFromPak(&tmp))
ThoroughlyResetScriptVars();
xxx_script_related_8001334(14);
xxx_script_related_8001334(15);
xxx_script_related_8001334(STARTMODE_14);
xxx_script_related_8001334(STARTMODE_15);
ClearScriptVarArray(NULL, EVENT_LOCAL);
xxx_script_related_8001334(16);
xxx_script_related_8001334(STARTMODE_16);
if (GetScriptVarValue(NULL, EVENT_LOCAL) == 0)
xxx_script_related_8001334(17);
xxx_script_related_8001334(STARTMODE_17);
while (TRUE) {
sUnknown_203B03C = 0;
@ -570,7 +570,7 @@ static u32 RunGameMode_Async(u32 a0)
struct FriendAreasMapSetupStruct friendAreasSetup;
struct WorldMapSetupStruct worldMapSetup;
DungeonSetupStruct dungeonSetup;
s16 sp552;
s16 scriptDungeon;
if (mode == STARTMODE_FRIEND_AREAS) {
u8 friendAreaId = MapIdToFriendAreaId(GetScriptVarValue(NULL,GROUND_ENTER));
@ -639,7 +639,7 @@ static u32 RunGameMode_Async(u32 a0)
SetScriptVarValue(NULL, DUNGEON_ENTER, scriptDungeonId);
sUnknown_203B03C = 2;
sub_800A8F8(4);
r5 = xxx_script_related_8001334(5);
r5 = xxx_script_related_8001334(STARTMODE_DUNGEON_FROM_WORLD_MAP);
}
else if (mode == STARTMODE_8) {
r5 = 0;
@ -675,13 +675,13 @@ static u32 RunGameMode_Async(u32 a0)
MemoryFill8(&dungeonSetup.info.mon, 0, sizeof(dungeonSetup.info.mon));
dungeonSetup.info.mon.speciesNum = 0;
if (r5 == 7) {
if (!sub_80991E0(&dungeonSetup.info, &sp552)) {
if (!sub_80991E0(&dungeonSetup.info, &scriptDungeon)) {
r5 = 13;
mode = STARTMODE_DUNGEON_WON;
}
}
else if (r5 == 8) {
if (!sub_80991E0(&dungeonSetup.info, &sp552)) {
if (!sub_80991E0(&dungeonSetup.info, &scriptDungeon)) {
r5 = 13;
mode = STARTMODE_DUNGEON_WON;
}
@ -690,13 +690,13 @@ static u32 RunGameMode_Async(u32 a0)
}
}
else if (r5 == 10) {
if (!sub_80991E0(&dungeonSetup.info, &sp552)) {
if (!sub_80991E0(&dungeonSetup.info, &scriptDungeon)) {
r5 = 13;
mode = STARTMODE_DUNGEON_WON;
}
}
else if (r5 == 9) {
if (!sub_80991E0(&dungeonSetup.info, &sp552)) {
if (!sub_80991E0(&dungeonSetup.info, &scriptDungeon)) {
r5 = 11;
mode = STARTMODE_DUNGEON_LOST;
}
@ -1096,9 +1096,10 @@ static void nullsub_2(DungeonSetupStruct *r0)
}
// arm9.bin::0200CAD0
static u32 xxx_script_related_8001334(u32 r0)
// startMode: See enum "StartModeVal"
static u32 xxx_script_related_8001334(u32 startMode)
{
return xxx_script_related_8098468(r0);
return xxx_script_related_8098468(startMode);
}
// arm9.bin::0200CA1C

View File

@ -63,6 +63,7 @@
#include "ground_main.h"
#include "dungeon_mon_sprite_render.h"
#include "adventure_info.h"
#include "decompress_sir.h"
EWRAM_INIT struct UnkStruct_203B414 *gUnknown_203B414 = NULL;
EWRAM_INIT Dungeon *gDungeon = NULL;
@ -75,7 +76,6 @@ extern void sub_8043D60(void);
extern void sub_80840A4(void);
extern void sub_806AB2C(void);
extern void sub_807E5AC(void);
extern void nullsub_16(void);
extern void sub_80521D0(void);
extern void sub_8068A84(Pokemon *pokemon);
extern void sub_806AA70(void);

View File

@ -1959,7 +1959,7 @@ static void sub_809C478(void)
sub_8035758();
GetScriptVarScenario(SCENARIO_MAIN, &temp, &temp1);
sub_80993C0(0);
sub_80993C0(FALSE);
}
static void sub_809C4B0(void)

View File

@ -120,7 +120,7 @@ void sub_809C6CC(u16 param_1)
void sub_809C6EC(void)
{
if (sub_8098F88() == 0) {
if (!sub_8098F88()) {
if (gGameOptionsRef->unkC == 0) {
sub_809C6CC(4);
}