Files
Pokemon-Firered/src/quest_log_battle.c
T
2020-01-15 16:00:45 -05:00

168 lines
5.9 KiB
C

#include "global.h"
#include "constants/species.h"
#include "malloc.h"
#include "battle.h"
#include "battle_anim.h"
#include "link.h"
#include "overworld.h"
#include "quest_log.h"
#include "constants/trainer_classes.h"
struct QuestLogStruct_TrainerBattleRecord
{
u16 v0;
u16 v2;
u16 v4;
u8 v6;
u8 v7;
};
struct QuestLogStruct_WildBattleRecord
{
u16 defeatedSpecies;
u16 caughtSpecies;
u8 mapSec;
};
static void sub_812C334(s32 *, s32 *);
void TrySetQuestLogBattleEvent(void)
{
if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_OLD_MAN_TUTORIAL | BATTLE_TYPE_POKEDUDE)) && (gBattleOutcome == B_OUTCOME_WON || gBattleOutcome == B_OUTCOME_CAUGHT))
{
struct QuestLogStruct_TrainerBattleRecord * questLogTrainerBattleRecord = Alloc(sizeof(struct QuestLogStruct_TrainerBattleRecord));
struct QuestLogStruct_WildBattleRecord * questLogWildBattleRecord = Alloc(sizeof(struct QuestLogStruct_WildBattleRecord));
u16 eventId;
u16 playerEndingHP;
u16 playerMaxHP;
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
{
switch (gTrainers[gTrainerBattleOpponent_A].trainerClass)
{
case CLASS_LEADER_2:
eventId = QL_EVENT_DEFEATED_GYM_LEADER;
break;
case CLASS_CHAMPION_2:
eventId = QL_EVENT_DEFEATED_CHAMPION;
break;
case CLASS_ELITE_FOUR_2:
eventId = QL_EVENT_DEFEATED_E4_MEMBER;
break;
default:
eventId = QL_EVENT_DEFEATED_TRAINER;
break;
}
questLogTrainerBattleRecord->v0 = gTrainerBattleOpponent_A;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
questLogTrainerBattleRecord->v2 = gBattleResults.lastOpponentSpecies;
if (GetBattlerSide(gBattleStruct->field_182) == B_SIDE_PLAYER)
questLogTrainerBattleRecord->v4 = gBattleMons[gBattleStruct->field_182].species;
else if (gBattleMons[GetBattlerAtPosition(0)].hp != 0)
questLogTrainerBattleRecord->v4 = gBattleMons[GetBattlerAtPosition(0)].species;
else
questLogTrainerBattleRecord->v4 = gBattleMons[GetBattlerAtPosition(2)].species;
playerEndingHP = gBattleMons[GetBattlerAtPosition(0)].hp + gBattleMons[GetBattlerAtPosition(2)].hp;
playerMaxHP = gBattleMons[GetBattlerAtPosition(0)].maxHP + gBattleMons[GetBattlerAtPosition(2)].maxHP;
}
else
{
questLogTrainerBattleRecord->v2 = gBattleResults.lastOpponentSpecies;
questLogTrainerBattleRecord->v4 = gBattleMons[GetBattlerAtPosition(0)].species;
playerEndingHP = gBattleMons[GetBattlerAtPosition(0)].hp;
playerMaxHP = gBattleMons[GetBattlerAtPosition(0)].maxHP;
}
questLogTrainerBattleRecord->v7 = GetCurrentRegionMapSectionId();
questLogTrainerBattleRecord->v6 = 0;
if (playerEndingHP < playerMaxHP / 3 * 2)
questLogTrainerBattleRecord->v6 = 1;
if (playerEndingHP < playerMaxHP / 3)
questLogTrainerBattleRecord->v6++;
SetQuestLogEvent(eventId, (const u16 *)questLogTrainerBattleRecord);
}
else
{
if (gBattleOutcome == B_OUTCOME_WON)
{
questLogWildBattleRecord->defeatedSpecies = GetMonData(gEnemyParty, MON_DATA_SPECIES);
questLogWildBattleRecord->caughtSpecies = SPECIES_NONE;
}
else // gBattleOutcome == B_OUTCOME_CAUGHT
{
questLogWildBattleRecord->defeatedSpecies = SPECIES_NONE;
questLogWildBattleRecord->caughtSpecies = GetMonData(gEnemyParty, MON_DATA_SPECIES);
}
questLogWildBattleRecord->mapSec = GetCurrentRegionMapSectionId();
SetQuestLogEvent(QL_EVENT_DEFEATED_WILD_MON, (const u16 *)questLogWildBattleRecord);
}
Free(questLogTrainerBattleRecord);
Free(questLogWildBattleRecord);
}
}
struct QuestLogStruct_LinkBattleRecord
{
u8 v0;
u8 v1[3][7];
};
void TrySetQuestLogLinkBattleEvent(void)
{
s32 sp0;
s32 sp4[2];
u16 eventId;
s32 r3;
bool32 inUnionRoom;
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
struct QuestLogStruct_LinkBattleRecord * r5 = Alloc(sizeof(struct QuestLogStruct_LinkBattleRecord));
r5->v0 = gBattleOutcome - 1; // 0 = won, 1 = lost, 2 = drew
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
eventId = QL_EVENT_LINK_BATTLED_MULTI;
sub_812C334(&sp0, sp4);
for (r3 = 0; r3 < 7; r3++)
{
r5->v1[0][r3] = gLinkPlayers[sp0].name[r3];
r5->v1[1][r3] = gLinkPlayers[sp4[0]].name[r3];
r5->v1[2][r3] = gLinkPlayers[sp4[1]].name[r3];
}
}
else
{
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
eventId = QL_EVENT_LINK_BATTLED_DOUBLE;
else
{
inUnionRoom = InUnionRoom();
eventId = QL_EVENT_LINK_BATTLED_SINGLE;
if (inUnionRoom == TRUE)
eventId = QL_EVENT_LINK_BATTLED_UNION;
}
for (r3 = 0; r3 < 7; r3++)
{
r5->v1[0][r3] = gLinkPlayers[gBattleStruct->multiplayerId ^ 1].name[r3];
}
}
SetQuestLogEvent(eventId, (const u16 *)r5);
Free(r5);
}
}
static void sub_812C334(s32 * a0, s32 * a1)
{
s32 r5;
s32 _optimized_out = 0;
u8 r2 = gLinkPlayers[gBattleStruct->multiplayerId].id ^ 2;
for (r5 = 0; r5 < 4; r5++)
{
if (r2 == gLinkPlayers[r5].id)
a0[0] = r5;
else if (r5 != gBattleStruct->multiplayerId)
a1[_optimized_out++] = r5;
}
}