mirror of
https://github.com/pret/pmd-red.git
synced 2026-06-16 05:30:20 -05:00
697 lines
15 KiB
C
697 lines
15 KiB
C
#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_movement.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 sub_8040A84(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;
|
|
sub_8040A84();
|
|
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++;
|
|
}
|
|
}
|