diff --git a/include/code_8094F88.h b/include/code_8094F88.h index cd7c61e50..006f79b20 100644 --- a/include/code_8094F88.h +++ b/include/code_8094F88.h @@ -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 \ No newline at end of file diff --git a/include/constants/event_flag.h b/include/constants/event_flag.h index 3229300c8..5e42f0112 100644 --- a/include/constants/event_flag.h +++ b/include/constants/event_flag.h @@ -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: diff --git a/include/ground_main.h b/include/ground_main.h index 3152f03b1..4072feab8 100644 --- a/include/ground_main.h +++ b/include/ground_main.h @@ -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); diff --git a/include/structs/str_ground_bg.h b/include/structs/str_ground_bg.h index 5804080c2..83c9b1ef0 100644 --- a/include/structs/str_ground_bg.h +++ b/include/structs/str_ground_bg.h @@ -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? diff --git a/src/data/event_flag.h b/src/data/event_flag.h index 37831a738..68794ddf0 100644 --- a/src/data/event_flag.h +++ b/src/data/event_flag.h @@ -95,7 +95,7 @@ const u8 *const gUnknown_80B71A0[4] = { struct MapIdToFriendAreaIdStruct { - s16 mapId; + s16 mapId; // See enum "GroundMapID" u8 friendAreaId; }; diff --git a/src/ground_main.c b/src/ground_main.c index edaa01dd7..21d18fc73 100644 --- a/src/ground_main.c +++ b/src/ground_main.c @@ -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) diff --git a/src/ground_map.c b/src/ground_map.c index fb6423952..0b47a4c98 100644 --- a/src/ground_map.c +++ b/src/ground_map.c @@ -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) { diff --git a/src/ground_script.c b/src/ground_script.c index 36b8abfef..57c84f909 100644 --- a/src/ground_script.c +++ b/src/ground_script.c @@ -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); diff --git a/src/main_loops.c b/src/main_loops.c index 30044e03d..eb08da710 100644 --- a/src/main_loops.c +++ b/src/main_loops.c @@ -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 diff --git a/src/run_dungeon.c b/src/run_dungeon.c index 775e2091f..0e5ad1a5a 100644 --- a/src/run_dungeon.c +++ b/src/run_dungeon.c @@ -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); diff --git a/src/textbox.c b/src/textbox.c index 4fc65586d..07292a558 100644 --- a/src/textbox.c +++ b/src/textbox.c @@ -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) diff --git a/src/unk_ds_only_feature.c b/src/unk_ds_only_feature.c index 082444d8e..0aae24c98 100644 --- a/src/unk_ds_only_feature.c +++ b/src/unk_ds_only_feature.c @@ -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); }