mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2024-11-16 19:47:35 +01:00
213 lines
6.8 KiB
C
213 lines
6.8 KiB
C
#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"
|
|
#include "string_util.h"
|
|
#include "constants/items.h"
|
|
#include "constants/battle_frontier.h"
|
|
#include "constants/battle_palace.h"
|
|
#include "constants/frontier_util.h"
|
|
#include "constants/trainers.h"
|
|
|
|
// This file's functions.
|
|
static void InitPalaceChallenge(void);
|
|
static void GetPalaceData(void);
|
|
static void SetPalaceData(void);
|
|
static void GetPalaceCommentId(void);
|
|
static void SetPalaceOpponent(void);
|
|
static void BufferOpponentIntroSpeech(void);
|
|
static void IncrementPalaceStreak(void);
|
|
static void SavePalaceChallenge(void);
|
|
static void SetRandomPalacePrize(void);
|
|
static void GivePalacePrize(void);
|
|
|
|
// Const rom data.
|
|
static void (* const sBattlePalaceFunctions[])(void) =
|
|
{
|
|
[BATTLE_PALACE_FUNC_INIT] = InitPalaceChallenge,
|
|
[BATTLE_PALACE_FUNC_GET_DATA] = GetPalaceData,
|
|
[BATTLE_PALACE_FUNC_SET_DATA] = SetPalaceData,
|
|
[BATTLE_PALACE_FUNC_GET_COMMENT_ID] = GetPalaceCommentId,
|
|
[BATTLE_PALACE_FUNC_SET_OPPONENT] = SetPalaceOpponent,
|
|
[BATTLE_PALACE_FUNC_GET_OPPONENT_INTRO] = BufferOpponentIntroSpeech,
|
|
[BATTLE_PALACE_FUNC_INCREMENT_STREAK] = IncrementPalaceStreak,
|
|
[BATTLE_PALACE_FUNC_SAVE] = SavePalaceChallenge,
|
|
[BATTLE_PALACE_FUNC_SET_PRIZE] = SetRandomPalacePrize,
|
|
[BATTLE_PALACE_FUNC_GIVE_PRIZE] = GivePalacePrize,
|
|
};
|
|
|
|
static const u16 sBattlePalaceEarlyPrizes[] =
|
|
{
|
|
ITEM_HP_UP,
|
|
ITEM_PROTEIN,
|
|
ITEM_IRON,
|
|
ITEM_CALCIUM,
|
|
ITEM_CARBOS,
|
|
ITEM_ZINC
|
|
};
|
|
|
|
static const u16 sBattlePalaceLatePrizes[] =
|
|
{
|
|
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
|
|
};
|
|
|
|
static const u32 sWinStreakFlags[][2] =
|
|
{
|
|
{STREAK_PALACE_SINGLES_50, STREAK_PALACE_SINGLES_OPEN},
|
|
{STREAK_PALACE_DOUBLES_50, STREAK_PALACE_DOUBLES_OPEN},
|
|
};
|
|
|
|
static const u32 sWinStreakMasks[][2] =
|
|
{
|
|
{~(STREAK_PALACE_SINGLES_50), ~(STREAK_PALACE_SINGLES_OPEN)},
|
|
{~(STREAK_PALACE_DOUBLES_50), ~(STREAK_PALACE_DOUBLES_OPEN)},
|
|
};
|
|
|
|
// code
|
|
void CallBattlePalaceFunction(void)
|
|
{
|
|
sBattlePalaceFunctions[gSpecialVar_0x8004]();
|
|
}
|
|
|
|
static void InitPalaceChallenge(void)
|
|
{
|
|
u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
|
|
u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
|
|
|
|
gSaveBlock2Ptr->frontier.challengeStatus = 0;
|
|
gSaveBlock2Ptr->frontier.curChallengeBattleNum = 0;
|
|
gSaveBlock2Ptr->frontier.challengePaused = FALSE;
|
|
gSaveBlock2Ptr->frontier.disableRecordBattle = FALSE;
|
|
if (!(gSaveBlock2Ptr->frontier.winStreakActiveFlags & sWinStreakFlags[battleMode][lvlMode]))
|
|
gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] = 0;
|
|
|
|
SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, WARP_ID_NONE);
|
|
gTrainerBattleOpponent_A = 0;
|
|
}
|
|
|
|
static void GetPalaceData(void)
|
|
{
|
|
u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
|
|
u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
|
|
|
|
switch (gSpecialVar_0x8005)
|
|
{
|
|
case PALACE_DATA_PRIZE:
|
|
gSpecialVar_Result = gSaveBlock2Ptr->frontier.palacePrize;
|
|
break;
|
|
case PALACE_DATA_WIN_STREAK:
|
|
gSpecialVar_Result = gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode];
|
|
break;
|
|
case PALACE_DATA_WIN_STREAK_ACTIVE:
|
|
gSpecialVar_Result = ((gSaveBlock2Ptr->frontier.winStreakActiveFlags & sWinStreakFlags[battleMode][lvlMode]) != 0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void SetPalaceData(void)
|
|
{
|
|
u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
|
|
u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
|
|
|
|
switch (gSpecialVar_0x8005)
|
|
{
|
|
case PALACE_DATA_PRIZE:
|
|
gSaveBlock2Ptr->frontier.palacePrize = gSpecialVar_0x8006;
|
|
break;
|
|
case PALACE_DATA_WIN_STREAK:
|
|
gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] = gSpecialVar_0x8006;
|
|
break;
|
|
case PALACE_DATA_WIN_STREAK_ACTIVE:
|
|
if (gSpecialVar_0x8006)
|
|
gSaveBlock2Ptr->frontier.winStreakActiveFlags |= sWinStreakFlags[battleMode][lvlMode];
|
|
else
|
|
gSaveBlock2Ptr->frontier.winStreakActiveFlags &= sWinStreakMasks[battleMode][lvlMode];
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void GetPalaceCommentId(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 SetPalaceOpponent(void)
|
|
{
|
|
gTrainerBattleOpponent_A = 5 *(Random() % 255) / 64u;
|
|
SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0);
|
|
}
|
|
|
|
static void BufferOpponentIntroSpeech(void)
|
|
{
|
|
if (gTrainerBattleOpponent_A < FRONTIER_TRAINERS_COUNT)
|
|
FrontierSpeechToString(gFacilityTrainers[gTrainerBattleOpponent_A].speechBefore);
|
|
}
|
|
|
|
static void IncrementPalaceStreak(void)
|
|
{
|
|
u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
|
|
u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
|
|
|
|
if (gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] < MAX_STREAK)
|
|
{
|
|
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 SavePalaceChallenge(void)
|
|
{
|
|
gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005;
|
|
VarSet(VAR_TEMP_0, 0);
|
|
gSaveBlock2Ptr->frontier.challengePaused = TRUE;
|
|
SaveGameFrontier();
|
|
}
|
|
|
|
static void SetRandomPalacePrize(void)
|
|
{
|
|
u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
|
|
u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
|
|
|
|
if (gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] > 41)
|
|
gSaveBlock2Ptr->frontier.palacePrize = sBattlePalaceLatePrizes[Random() % ARRAY_COUNT(sBattlePalaceLatePrizes)];
|
|
else
|
|
gSaveBlock2Ptr->frontier.palacePrize = sBattlePalaceEarlyPrizes[Random() % ARRAY_COUNT(sBattlePalaceEarlyPrizes)];
|
|
}
|
|
|
|
static void GivePalacePrize(void)
|
|
{
|
|
if (AddBagItem(gSaveBlock2Ptr->frontier.palacePrize, 1) == TRUE)
|
|
{
|
|
CopyItemName(gSaveBlock2Ptr->frontier.palacePrize, gStringVar1);
|
|
gSaveBlock2Ptr->frontier.palacePrize = 0;
|
|
gSpecialVar_Result = TRUE;
|
|
}
|
|
else
|
|
{
|
|
gSpecialVar_Result = FALSE;
|
|
}
|
|
}
|