sovereignx/src/battle_palace.c

191 lines
5.8 KiB
C
Raw Normal View History

2018-11-12 14:41:19 +00:00
#include "global.h"
#include "event_data.h"
#include "battle_setup.h"
#include "overworld.h"
#include "random.h"
#include "battle_tower.h"
#include "frontier_util.h"
#include "item.h"
2018-11-19 17:14:28 +00:00
#include "string_util.h"
2018-11-12 14:41:19 +00:00
#include "constants/items.h"
2019-11-24 21:58:40 +00:00
#include "constants/battle_frontier.h"
#include "constants/frontier_util.h"
2018-11-12 14:41:19 +00:00
// This file's functions.
static void sub_8195980(void);
static void sub_8195A38(void);
static void sub_8195AE4(void);
static void sub_8195BB0(void);
static void sub_8195C20(void);
static void sub_8195C50(void);
static void sub_8195C7C(void);
static void sub_8195CE4(void);
static void sub_8195D28(void);
static void sub_8195DB8(void);
// Const rom data.
static void (* const sBattlePalaceFunctions[])(void) =
{
sub_8195980,
sub_8195A38,
sub_8195AE4,
sub_8195BB0,
sub_8195C20,
sub_8195C50,
sub_8195C7C,
sub_8195CE4,
sub_8195D28,
sub_8195DB8,
};
static const u16 gUnknown_0860DE78[] = {ITEM_HP_UP, ITEM_PROTEIN, ITEM_IRON, ITEM_CALCIUM, ITEM_CARBOS, ITEM_ZINC};
static const u16 gUnknown_0860DE84[] = {ITEM_BRIGHT_POWDER, ITEM_WHITE_HERB, ITEM_QUICK_CLAW, ITEM_LEFTOVERS, ITEM_MENTAL_HERB, ITEM_KINGS_ROCK, ITEM_FOCUS_BAND, ITEM_SCOPE_LENS, ITEM_CHOICE_BAND};
2019-11-24 21:58:40 +00:00
static const u32 sWinStreakFlags[][2] =
2018-11-12 14:41:19 +00:00
{
2019-11-24 21:58:40 +00:00
{STREAK_PALACE_SINGLES_50, STREAK_PALACE_SINGLES_OPEN},
{STREAK_PALACE_DOUBLES_50, STREAK_PALACE_DOUBLES_OPEN},
2018-11-12 14:41:19 +00:00
};
2019-11-24 21:58:40 +00:00
static const u32 sWinStreakMasks[][2] =
2018-11-12 14:41:19 +00:00
{
2019-11-24 21:58:40 +00:00
{~(STREAK_PALACE_SINGLES_50), ~(STREAK_PALACE_SINGLES_OPEN)},
{~(STREAK_PALACE_DOUBLES_50), ~(STREAK_PALACE_DOUBLES_OPEN)},
2018-11-12 14:41:19 +00:00
};
// code
void CallBattlePalaceFunction(void)
{
sBattlePalaceFunctions[gSpecialVar_0x8004]();
}
static void sub_8195980(void)
{
u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
2019-11-24 21:58:40 +00:00
gSaveBlock2Ptr->frontier.challengeStatus = 0;
2018-11-12 14:41:19 +00:00
gSaveBlock2Ptr->frontier.curChallengeBattleNum = 0;
2019-11-24 21:58:40 +00:00
gSaveBlock2Ptr->frontier.challengePaused = FALSE;
2018-11-12 14:41:19 +00:00
gSaveBlock2Ptr->frontier.field_CA9_b = 0;
2019-11-24 21:58:40 +00:00
if (!(gSaveBlock2Ptr->frontier.winStreakActiveFlags & sWinStreakFlags[battleMode][lvlMode]))
2018-11-12 14:41:19 +00:00
gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] = 0;
2018-12-27 22:30:47 +00:00
SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
2018-11-12 14:41:19 +00:00
gTrainerBattleOpponent_A = 0;
}
static void sub_8195A38(void)
{
u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
switch (gSpecialVar_0x8005)
{
case 0:
gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_DC6;
break;
case 1:
gSpecialVar_Result = gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode];
break;
case 2:
2019-11-24 21:58:40 +00:00
gSpecialVar_Result = ((gSaveBlock2Ptr->frontier.winStreakActiveFlags & sWinStreakFlags[battleMode][lvlMode]) != 0);
2018-11-12 14:41:19 +00:00
break;
}
}
static void sub_8195AE4(void)
{
u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
switch (gSpecialVar_0x8005)
{
case 0:
gSaveBlock2Ptr->frontier.field_DC6 = gSpecialVar_0x8006;
break;
case 1:
gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] = gSpecialVar_0x8006;
break;
case 2:
if (gSpecialVar_0x8006)
2019-11-24 21:58:40 +00:00
gSaveBlock2Ptr->frontier.winStreakActiveFlags |= sWinStreakFlags[battleMode][lvlMode];
2018-11-12 14:41:19 +00:00
else
2019-11-24 21:58:40 +00:00
gSaveBlock2Ptr->frontier.winStreakActiveFlags &= sWinStreakMasks[battleMode][lvlMode];
2018-11-12 14:41:19 +00:00
break;
}
}
static void sub_8195BB0(void)
{
u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
if (gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] < 50)
gSpecialVar_Result = Random() % 3;
else if (gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] < 99)
gSpecialVar_Result = 3;
else
gSpecialVar_Result = 4;
}
static void sub_8195C20(void)
{
gTrainerBattleOpponent_A = 5 *(Random() % 255) / 64u;
SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0);
}
static void sub_8195C50(void)
{
if (gTrainerBattleOpponent_A < 300)
FrontierSpeechToString(gFacilityTrainers[gTrainerBattleOpponent_A].speechBefore);
}
static void sub_8195C7C(void)
{
u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
2019-11-24 21:58:40 +00:00
if (gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] < MAX_STREAK)
2018-11-12 14:41:19 +00:00
{
gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode]++;
// Whatever GF planned to do here, they messed up big time.
if (gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][(lvlMode > gSaveBlock2Ptr->frontier.palaceRecordWinStreaks[battleMode][lvlMode]) ? 1 : 0])
gSaveBlock2Ptr->frontier.palaceRecordWinStreaks[battleMode][lvlMode] = gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode];
}
}
static void sub_8195CE4(void)
{
2019-11-24 21:58:40 +00:00
gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005;
2018-11-12 14:41:19 +00:00
VarSet(VAR_TEMP_0, 0);
2019-11-24 21:58:40 +00:00
gSaveBlock2Ptr->frontier.challengePaused = TRUE;
SaveGameFrontier();
2018-11-12 14:41:19 +00:00
}
static void sub_8195D28(void)
{
u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
if (gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] > 41)
gSaveBlock2Ptr->frontier.field_DC6 = gUnknown_0860DE84[Random() % ARRAY_COUNT(gUnknown_0860DE84)];
else
gSaveBlock2Ptr->frontier.field_DC6 = gUnknown_0860DE78[Random() % ARRAY_COUNT(gUnknown_0860DE78)];
}
static void sub_8195DB8(void)
{
if (AddBagItem(gSaveBlock2Ptr->frontier.field_DC6, 1) == TRUE)
{
CopyItemName(gSaveBlock2Ptr->frontier.field_DC6, gStringVar1);
gSaveBlock2Ptr->frontier.field_DC6 = 0;
gSpecialVar_Result = TRUE;
}
else
{
gSpecialVar_Result = FALSE;
}
}