#include "global.h" #include "constants/weather.h" #include "constants/dungeon.h" #include "structs/str_dungeon.h" #include "dungeon_cutscenes.h" #include "dungeon_music.h" #include "dungeon_logic.h" #include "dungeon_util_1.h" #include "exclusive_pokemon.h" #include "weather.h" #include "pokemon.h" #include "dungeon_util.h" #include "dungeon_map_access.h" #include "structs/str_806B7F8.h" extern const DungeonPos gUnknown_80F4598[]; extern void ShowWholeRevealedDungeonMap(void); struct unkData_8107234 { u8 unk0[8]; }; extern struct unkData_8107234 gUnknown_8107234[]; void sub_8084854(struct unkData_8107234 *); void sub_80847D4(void) { u32 fixedRoomNumber; s32 index; gDungeon->unk3A0D = 0; gDungeon->unk1356C = 0; ShowWholeRevealedDungeonMap(); for(index = 0; index < 0x3e7 && gUnknown_8107234[index].unk0[0] != 0; index++) { fixedRoomNumber = gDungeon->fixedRoomNumber; if (fixedRoomNumber - 0x1c < 0x16) { fixedRoomNumber = 0x1b; } if (fixedRoomNumber == gUnknown_8107234[index].unk0[0]) { sub_8084854(&gUnknown_8107234[index]); break; } } sub_8097FF8(); } void sub_8084854(struct unkData_8107234 *param_1) { if (gDungeon->unk644.unk34 != 0) { gDungeon->unk3A0D = param_1->unk0[5]; } else { if (sub_8098100(param_1->unk0[4]) != 0) { gDungeon->unk3A0D = param_1->unk0[5]; } else { if (sub_8098100(param_1->unk0[2]) != 0) { gDungeon->unk3A0D = param_1->unk0[3]; } else { gDungeon->unk3A0D = param_1->unk0[1]; if (param_1->unk0[2] != 0x40) { sub_8097FA8(param_1->unk0[2]); } } } } gDungeon->unk644.unk31 = 1; sub_807E5E4(WEATHER_CLEAR); } u32 sub_80848EC(void) { return 1; } void sub_80848F0(void) { gDungeon->unk1356C = 1; switch(gDungeon->unk3A0D) { case 0: case 0x3c: gDungeon->unk1356C = 0; break; case 1: case 2: sub_8086B14(); break; case 3: sub_8086B94(); break; case 4: case 5: sub_8086E9C(); break; case 6: sub_8086F00(); break; case 7: case 8: sub_8087230(); break; case 9: sub_808729C(); break; case 10: case 0xb: sub_80877E8(); break; case 0xc: sub_8087848(); break; case 0xd: sub_8087F54(); break; case 0xe: sub_8087FB4(); break; case 0xf: sub_8087FF8(); break; case 0x10: sub_80885A0(); break; case 0x11: sub_80885C4(); break; case 0x12: sub_808862C(); break; case 0x13: sub_80886C4(); break; case 0x14: sub_808875C(); break; case 0x15: sub_8088DC0(); break; case 0x16: sub_8088E5C(); break; case 0x17: case 0x18: sub_80892C8(); break; case 0x19: sub_8089328(); break; case 0x1a: case 0x1b: sub_808970C(); break; case 0x1c: sub_808974C(); break; case 0x1d: case 0x1e: sub_8089914(); break; case 0x1f: sub_8089978(); break; case 0x20: case 0x21: sub_8089C44(); break; case 0x22: sub_8089C90(); break; case 0x23: sub_8089EFC(); break; case 0x24: sub_8089F44(); break; case 0x25: sub_8089F8C(); break; case 0x26: sub_808A264(); break; case 0x27: sub_808A2C0(); break; case 0x28: sub_808A308(); break; case 0x29: sub_808A608(); break; case 0x2a: sub_808A668(); break; case 0x2b: sub_808A9E4(); break; case 0x2c: sub_808AA3C(); break; case 0x2d: sub_808AA94(); break; case 0x2e: sub_808ACC0(); break; case 0x2f: sub_808AD48(); break; case 0x30: sub_808ADCC(); break; case 0x31: sub_808B2F4(); break; case 0x32: sub_808B35C(); break; case 0x33: sub_808BDEC(); break; case 0x34: sub_808C10C(); break; case 0x35: sub_808C3A0(); break; case 0x36: sub_808C5C0(); break; case 0x37: sub_808C938(); break; case 0x38: sub_808C9C4(); break; case 0x39: sub_808CB5C(); break; case 0x3a: sub_808CBB0(); break; case 0x3b: sub_808CD44(); break; } sub_8097FF8(); } void DisplayPreFightDialogue(void) { switch(gDungeon->unk3A0D) { case 0: break; case 1: SkarmoryPreFightDialogue(); break; case 2: SkarmoryReFightDialogue(); break; case 3: sub_8086E40(); break; case 4: TeamMeaniesPreFightDialogue(); break; case 5: TeamMeaniesReFightDialogue(); break; case 6: sub_8087130(); break; case 7: ZapdosPreFightDialogue(); break; case 8: ZapdosReFightDialogue(); break; case 9: ZapdosPostStoryPreFightDialogue(); break; case 10: MoltresPreFightDialogue(); break; case 0xb: MoltresReFightDialogue(); break; case 0xc: MoltresPostStoryPreFightDialogue(); break; case 0xd: ArticunoPreFightDialogue(); break; case 0xe: ArticunoReFightDialogue(); break; case 0xf: ArticunoPostStoryPreFightDialogue(); break; case 0x10: sub_8088608(); break; case 0x11: sub_8088618(); break; case 0x12: GroudonPreFightDialogue(); break; case 0x13: GroudonReFightDialogue(); break; case 0x14: GroudonPostStoryPreFightDialogue(); break; case 0x15: MagmaCavernMidDialogue(); break; case 0x16: sub_8089168(); break; case 0x17: RayquazaPreFightDialogue(); break; case 0x18: RayquazaReFightDialogue(); break; case 0x19: RayquazaPostStoryPreFightDialogue(); break; case 0x1a: sub_80897F0(); break; case 0x1b: sub_8089878(); break; case 0x1c: sub_80898E4(); break; case 0x1d: case 0x1e: MewtwoPreFightDialogue(); break; case 0x1f: MewtwoReFightDialogue(); break; case 0x20: EnteiPreFightDialogue(); break; case 0x21: EnteiReFightDialogue(); break; case 0x22: EnteiPostStoryPreFightDialogue(); break; case 0x23: RaikouPreFightDialogue(); break; case 0x24: RaikouReFightDialogue(); break; case 0x25: RaikouPostStoryPreFightDialogue(); break; case 0x26: SuicunePreFightDialogue(); break; case 0x27: SuicuneReFightDialogue(); break; case 0x28: SuicunePostStoryPreFightDialogue(); break; case 0x29: HoOhPreFightDialogue(); break; case 0x2a: HoOhReFightDialogue(); break; case 0x2b: LatiosPreFightDialogue(); break; case 0x2c: LatiosReFightDialogue(); break; case 0x2d: sub_808AC3C(); break; case 0x2e: RegirockPreFightDialogue(); break; case 0x2f: RegicePreFightDialogue(); break; case 0x30: RegisteelPreFightDialogue(); break; case 0x31: JirachiPreFightDialogue(); break; case 0x32: JirachiReFightDialogue(); break; case 0x33: LugiaPreFightDialogue(); break; case 0x34: KyogrePreFightDialogue(); break; case 0x35: DeoxysPreFightDialogue(); break; case 0x36: CelebiJoinDialogue(); break; case 0x37: sub_808C998(); break; case 0x38: MedichamRescueDialogue(); break; case 0x39: DummyFightDialogue(); break; case 0x3a: SmeargleRescueDialogue(); break; case 0x3b: sub_808CD9C(); break; case 0x3C: break; } sub_8085764(); sub_80857B8(); gDungeon->unk1356C = 0; sub_8097FF8(); } void sub_8084E00(Entity *entity, u8 param_2, u8 param_3) { if (param_2 != 0) { switch(gDungeon->unk3A0D) { case 0: break; case 1: case 2: sub_8086BDC(param_2,gDungeon->unk3A0D); break; case 4: case 5: sub_8086F54(param_2,gDungeon->unk3A0D); break; case 7: case 8: case 9: sub_8087334(param_2,gDungeon->unk3A0D); break; case 10: case 0xb: case 0xc: sub_80878F4(param_2,gDungeon->unk3A0D); break; case 0xd: case 0xe: case 0xf: sub_8088088(param_2,gDungeon->unk3A0D); break; case 0x12: case 0x13: case 0x14: sub_8088818(param_2,gDungeon->unk3A0D); break; case 0x17: case 0x18: case 0x19: sub_80893B4(param_2,gDungeon->unk3A0D); break; case 0x1a: case 0x1b: sub_8089788(entity,param_2,gDungeon->unk3A0D); break; case 0x1d: case 0x1e: case 0x1f: sub_8089A00(param_2,gDungeon->unk3A0D); break; case 0x20: case 0x21: case 0x22: sub_8089CFC(param_2,gDungeon->unk3A0D); break; case 0x23: case 0x24: case 0x25: sub_8089FF0(param_2,gDungeon->unk3A0D); break; case 0x26: case 0x27: case 0x28: sub_808A36C(param_2,gDungeon->unk3A0D); break; case 0x29: case 0x2a: sub_808A6E8(param_2,gDungeon->unk3A0D); break; case 0x2b: case 0x2c: case 0x2d: sub_808AAF0(param_2,gDungeon->unk3A0D); break; case 0x2e: sub_808AE54(param_2,gDungeon->unk3A0D,&entity->pos); break; case 0x2f: sub_808AEC8(param_2,gDungeon->unk3A0D,&entity->pos); break; case 0x30: sub_808AF3C(param_2,gDungeon->unk3A0D,&entity->pos); break; case 0x31: case 0x32: sub_808B3E4(param_2,gDungeon->unk3A0D,param_3); break; case 0x33: sub_808BE70(param_2,gDungeon->unk3A0D,param_3); break; case 0x34: sub_808C1A4(param_2,gDungeon->unk3A0D,param_3); break; case 0x35: sub_808C414(param_2,gDungeon->unk3A0D,param_3); break; case 0x36: nullsub_100(param_2,gDungeon->unk3A0D,param_3); break; case 0x37: sub_808C948(entity,gDungeon->unk3A0D); break; case 0x38: case 0x39: case 0x3A: case 0x3B: case 0x3C: break; } if ((param_3 == 0) && (gDungeon->unk2 != 0)) { DungeonStartNewBGM(999); } } } void sub_8085140(void) { switch(gDungeon->unk3A0D) { // NOTE: shortcut way to generate all cases from 0 - 0x3C properly default: case 0: case 1: case 0x3C: break; case 0x2e: sub_808AFB0(gDungeon->unk3A0D); break; case 0x2f: sub_808B030(gDungeon->unk3A0D); break; case 0x30: sub_808B0B0(gDungeon->unk3A0D); break; } } u8 sub_808529C(s32 speciesId_) { s32 r3; s32 speciesId = 0; // This line serves no purpose other than generating the right asm. Feel free to remove it. speciesId += (s16) speciesId_; speciesId = (s16) speciesId_; r3 = 0x40; switch (speciesId) { case MONSTER_SKARMORY: r3 = 1; break; case MONSTER_EKANS: r3 = 3; break; case MONSTER_GENGAR: r3 = 3; break; case MONSTER_MEDICHAM: r3 = 3; break; case MONSTER_ZAPDOS: r3 = 5; break; case MONSTER_MOLTRES: r3 = 7; break; case MONSTER_ARTICUNO: r3 = 9; break; case MONSTER_GROUDON: r3 = 0xC; break; case MONSTER_RAYQUAZA: r3 = 0xF; break; case MONSTER_MEWTWO: r3 = 0x13; break; case MONSTER_ENTEI: r3 = 0x15; break; case MONSTER_RAIKOU: r3 = 0x17; break; case MONSTER_SUICUNE: r3 = 0x19; break; case MONSTER_HO_OH: r3 = 0x1A; break; case MONSTER_MANKEY: r3 = 0x11; break; case MONSTER_REGIROCK: r3 = 0x1D; break; case MONSTER_REGICE: r3 = 0x1D; break; case MONSTER_REGISTEEL: r3 = 0x1D; break; } if (r3 != 0x40 && !sub_8098100(r3)) return FALSE; return TRUE; } void sub_8085374(void) { const Tile *tile; Entity *entity; DungeonPos pos; s32 i, j; s32 temp; Entity *leaderEntity = NULL; Entity *partnerEntity = NULL; s32 species = sub_808D3F8()->speciesNum; for (i = 0; i < MAX_TEAM_MEMBERS; i++) { entity = gDungeon->teamPokemon[i]; if (EntityIsValid(entity)) { if (GetEntInfo(entity)->isTeamLeader) leaderEntity = entity; if (GetEntInfo(entity)->joinedAt.id == DUNGEON_JOIN_LOCATION_PARTNER) partnerEntity = entity; } } if (leaderEntity == NULL || partnerEntity != NULL || gDungeon->unk644.unk18 != 0) return; j = 0; while ((pos = gUnknown_80F4598[j]).x != 99) { pos.x += leaderEntity->pos.x; pos.y += leaderEntity->pos.y; tile = GetTile(pos.x, pos.y); temp = sub_807034C(species, tile); if (temp == 0) { struct unkStruct_806B7F8 local_30; local_30.species = species; local_30.level = 1; local_30.unk2 = 2; local_30.pos = pos; local_30.unk4 = temp; local_30.unk10 = 0; sub_806B7F8(&local_30, 1); break; } j++; } }