Merge branch 'master' into fix-eventobj
This commit is contained in:
@@ -2676,8 +2676,9 @@ static void PlayerHandleHealthBarUpdate(void)
|
||||
LoadBattleBarGfx(0);
|
||||
hpVal = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);
|
||||
|
||||
// gPlayerPartyLostHP used by Battle Dome, but never read
|
||||
if (hpVal > 0)
|
||||
gUnknown_0203CD70 += hpVal;
|
||||
gPlayerPartyLostHP += hpVal;
|
||||
|
||||
if (hpVal != INSTANT_HP_BAR_DROP)
|
||||
{
|
||||
|
||||
+2598
-2597
File diff suppressed because it is too large
Load Diff
@@ -12,6 +12,7 @@
|
||||
#include "constants/battle_ai.h"
|
||||
#include "constants/battle_factory.h"
|
||||
#include "constants/battle_frontier.h"
|
||||
#include "constants/battle_frontier_mons.h"
|
||||
#include "constants/frontier_util.h"
|
||||
#include "constants/layouts.h"
|
||||
#include "constants/trainers.h"
|
||||
@@ -304,7 +305,7 @@ static void GenerateOpponentMons(void)
|
||||
|
||||
do
|
||||
{
|
||||
trainerId = sub_8162548(challengeNum, gSaveBlock2Ptr->frontier.curChallengeBattleNum);
|
||||
trainerId = GetRandomScaledFrontierTrainerId(challengeNum, gSaveBlock2Ptr->frontier.curChallengeBattleNum);
|
||||
for (i = 0; i < gSaveBlock2Ptr->frontier.curChallengeBattleNum; i++)
|
||||
{
|
||||
if (gSaveBlock2Ptr->frontier.trainerIds[i] == trainerId)
|
||||
@@ -331,7 +332,7 @@ static void GenerateOpponentMons(void)
|
||||
if (j != 6)
|
||||
continue;
|
||||
|
||||
if (lvlMode == FRONTIER_LVL_50 && monSetId > 849)
|
||||
if (lvlMode == FRONTIER_LVL_50 && monSetId > FRONTIER_MONS_HIGH_TIER)
|
||||
continue;
|
||||
|
||||
for (k = firstMonId; k < firstMonId + i; k++)
|
||||
@@ -727,7 +728,7 @@ void FillFactoryBrainParty(void)
|
||||
|
||||
if (gFacilityTrainerMons[monSetId].species == SPECIES_UNOWN)
|
||||
continue;
|
||||
if (monLevel == 50 && monSetId > 849)
|
||||
if (monLevel == 50 && monSetId > FRONTIER_MONS_HIGH_TIER)
|
||||
continue;
|
||||
|
||||
for (j = 0; j < 6; j++)
|
||||
|
||||
+35
-275
@@ -761,62 +761,52 @@ static s32 DummiedOutFunction(s16 unused1, s16 unused2, s32 unused3)
|
||||
{
|
||||
return 9;
|
||||
}
|
||||
|
||||
#ifdef NONMATCHING
|
||||
static void sub_8072308(s16 arg0, u16 *arg1, u8 arg2)
|
||||
void sub_8072308(s16 number, u16 *dest, bool8 unk)
|
||||
{
|
||||
s8 i, j;
|
||||
u8 array[4];
|
||||
u8 *arrayPtr;
|
||||
s32 r9, vaaa;
|
||||
u8 buff[4];
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
array[i] = 0;
|
||||
|
||||
i = 3;
|
||||
r9 = -1;
|
||||
arrayPtr = array;
|
||||
while (1)
|
||||
{
|
||||
if (arg0 > 0)
|
||||
buff[i] = 0;
|
||||
}
|
||||
|
||||
for (i = 3; ; i--)
|
||||
{
|
||||
if (number > 0)
|
||||
{
|
||||
array[i] = arg0 % 10;
|
||||
arg0 = arg0 / 10;
|
||||
i--;
|
||||
buff[i] = number % 10;
|
||||
number /= 10;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (; i > -1; i--)
|
||||
{
|
||||
buff[i] = 0xFF;
|
||||
}
|
||||
if (buff[3] == 0xFF)
|
||||
buff[3] = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (; i > -1; i--)
|
||||
{
|
||||
array[i] = 0xFF;
|
||||
}
|
||||
|
||||
if (arrayPtr[3] == 0xFF)
|
||||
arrayPtr[3] = 0;
|
||||
|
||||
if (arg2 == 0)
|
||||
if (!unk)
|
||||
{
|
||||
for (i = 0, j = 0; i < 4; i++)
|
||||
{
|
||||
if (array[j] == 0xFF)
|
||||
if (buff[j] == 0xFF)
|
||||
{
|
||||
arg1[j] &= 0xFC00;
|
||||
arg1[j] |= 0x1E;
|
||||
|
||||
arg1[i + 0x20] &= 0xFC00;
|
||||
arg1[i + 0x20] |= 0x1E;
|
||||
dest[j + 0x00] &= 0xFC00;
|
||||
dest[j + 0x00] |= 0x1E;
|
||||
dest[i + 0x20] &= 0xFC00;
|
||||
dest[i + 0x20] |= 0x1E;
|
||||
}
|
||||
else
|
||||
{
|
||||
arg1[j] &= 0xFC00;
|
||||
arg1[j] |= array[j] + 0x14;
|
||||
|
||||
arg1[i + 0x20] &= 0xFC00;
|
||||
arg1[i + 0x20] |= array[i] + 0x34;
|
||||
dest[j + 0x00] &= 0xFC00;
|
||||
dest[j + 0x00] |= 0x14 + buff[j];
|
||||
dest[i + 0x20] &= 0xFC00;
|
||||
dest[i + 0x20] |= 0x34 + buff[i];
|
||||
}
|
||||
j++;
|
||||
}
|
||||
@@ -825,254 +815,24 @@ static void sub_8072308(s16 arg0, u16 *arg1, u8 arg2)
|
||||
{
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
if (array[i] == 0xFF)
|
||||
if (buff[i] == 0xFF)
|
||||
{
|
||||
arg1[i] &= 0xFC00;
|
||||
arg1[i] |= 0x1E;
|
||||
|
||||
arg1[i + 0x20] &= 0xFC00;
|
||||
arg1[i + 0x20] |= 0x1E;
|
||||
dest[i + 0x00] &= 0xFC00;
|
||||
dest[i + 0x00] |= 0x1E;
|
||||
dest[i + 0x20] &= 0xFC00;
|
||||
dest[i + 0x20] |= 0x1E;
|
||||
}
|
||||
else
|
||||
{
|
||||
arg1[i] &= 0xFC00;
|
||||
arg1[i] |= array[i] + 0x14;
|
||||
|
||||
arg1[i + 0x20] &= 0xFC00;
|
||||
arg1[i + 0x20] |= array[i] + 0x34;
|
||||
dest[i + 0x00] &= 0xFC00;
|
||||
dest[i + 0x00] |= 0x14 + buff[i];
|
||||
dest[i + 0x20] &= 0xFC00;
|
||||
dest[i + 0x20] |= 0x34 + buff[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
NAKED
|
||||
static void sub_8072308(s16 arg0, u16 *arg1, u8 arg2)
|
||||
{
|
||||
asm(".syntax unified\n\
|
||||
push {r4-r7,lr}\n\
|
||||
mov r7, r10\n\
|
||||
mov r6, r9\n\
|
||||
mov r5, r8\n\
|
||||
push {r5-r7}\n\
|
||||
sub sp, 0x4\n\
|
||||
adds r7, r1, 0\n\
|
||||
lsls r0, 16\n\
|
||||
lsrs r5, r0, 16\n\
|
||||
lsls r2, 24\n\
|
||||
lsrs r2, 24\n\
|
||||
mov r10, r2\n\
|
||||
movs r3, 0\n\
|
||||
movs r2, 0\n\
|
||||
_08072324:\n\
|
||||
lsls r0, r3, 24\n\
|
||||
asrs r0, 24\n\
|
||||
mov r3, sp\n\
|
||||
adds r1, r3, r0\n\
|
||||
strb r2, [r1]\n\
|
||||
adds r0, 0x1\n\
|
||||
lsls r0, 24\n\
|
||||
lsrs r3, r0, 24\n\
|
||||
asrs r0, 24\n\
|
||||
cmp r0, 0x3\n\
|
||||
ble _08072324\n\
|
||||
movs r3, 0x3\n\
|
||||
movs r0, 0x1\n\
|
||||
negs r0, r0\n\
|
||||
mov r9, r0\n\
|
||||
mov r8, sp\n\
|
||||
_08072344:\n\
|
||||
lsls r0, r5, 16\n\
|
||||
asrs r6, r0, 16\n\
|
||||
cmp r6, 0\n\
|
||||
ble _08072372\n\
|
||||
lsls r4, r3, 24\n\
|
||||
asrs r4, 24\n\
|
||||
mov r1, sp\n\
|
||||
adds r5, r1, r4\n\
|
||||
adds r0, r6, 0\n\
|
||||
movs r1, 0xA\n\
|
||||
bl __modsi3\n\
|
||||
strb r0, [r5]\n\
|
||||
adds r0, r6, 0\n\
|
||||
movs r1, 0xA\n\
|
||||
bl __divsi3\n\
|
||||
lsls r0, 16\n\
|
||||
lsrs r5, r0, 16\n\
|
||||
subs r4, 0x1\n\
|
||||
lsls r4, 24\n\
|
||||
lsrs r3, r4, 24\n\
|
||||
b _08072344\n\
|
||||
_08072372:\n\
|
||||
lsls r1, r3, 24\n\
|
||||
asrs r0, r1, 24\n\
|
||||
cmp r0, r9\n\
|
||||
ble _08072396\n\
|
||||
movs r4, 0xFF\n\
|
||||
movs r3, 0x1\n\
|
||||
negs r3, r3\n\
|
||||
_08072380:\n\
|
||||
asrs r2, r1, 24\n\
|
||||
mov r5, sp\n\
|
||||
adds r1, r5, r2\n\
|
||||
ldrb r0, [r1]\n\
|
||||
orrs r0, r4\n\
|
||||
strb r0, [r1]\n\
|
||||
subs r2, 0x1\n\
|
||||
lsls r1, r2, 24\n\
|
||||
asrs r0, r1, 24\n\
|
||||
cmp r0, r3\n\
|
||||
bgt _08072380\n\
|
||||
_08072396:\n\
|
||||
mov r1, r8\n\
|
||||
ldrb r0, [r1, 0x3]\n\
|
||||
cmp r0, 0xFF\n\
|
||||
bne _080723A2\n\
|
||||
movs r0, 0\n\
|
||||
strb r0, [r1, 0x3]\n\
|
||||
_080723A2:\n\
|
||||
mov r2, r10\n\
|
||||
cmp r2, 0\n\
|
||||
bne _08072432\n\
|
||||
movs r3, 0\n\
|
||||
movs r1, 0\n\
|
||||
movs r6, 0xFC\n\
|
||||
lsls r6, 8\n\
|
||||
movs r5, 0x1E\n\
|
||||
mov r12, r5\n\
|
||||
_080723B4:\n\
|
||||
lsls r1, 24\n\
|
||||
asrs r2, r1, 24\n\
|
||||
mov r0, sp\n\
|
||||
adds r5, r0, r2\n\
|
||||
ldrb r0, [r5]\n\
|
||||
mov r8, r1\n\
|
||||
cmp r0, 0xFF\n\
|
||||
bne _080723EA\n\
|
||||
lsls r1, r2, 1\n\
|
||||
adds r1, r7\n\
|
||||
ldrh r2, [r1]\n\
|
||||
adds r0, r6, 0\n\
|
||||
ands r0, r2\n\
|
||||
mov r2, r12\n\
|
||||
orrs r0, r2\n\
|
||||
strh r0, [r1]\n\
|
||||
lsls r3, 24\n\
|
||||
asrs r1, r3, 23\n\
|
||||
adds r1, r7\n\
|
||||
adds r1, 0x40\n\
|
||||
ldrh r2, [r1]\n\
|
||||
adds r0, r6, 0\n\
|
||||
ands r0, r2\n\
|
||||
mov r5, r12\n\
|
||||
orrs r0, r5\n\
|
||||
strh r0, [r1]\n\
|
||||
b _0807241A\n\
|
||||
_080723EA:\n\
|
||||
lsls r2, 1\n\
|
||||
adds r2, r7\n\
|
||||
ldrh r0, [r2]\n\
|
||||
adds r1, r6, 0\n\
|
||||
ands r1, r0\n\
|
||||
ldrb r0, [r5]\n\
|
||||
adds r0, 0x14\n\
|
||||
orrs r1, r0\n\
|
||||
strh r1, [r2]\n\
|
||||
lsls r4, r3, 24\n\
|
||||
asrs r3, r4, 24\n\
|
||||
lsls r2, r3, 1\n\
|
||||
adds r2, r7\n\
|
||||
adds r2, 0x40\n\
|
||||
ldrh r0, [r2]\n\
|
||||
adds r1, r6, 0\n\
|
||||
ands r1, r0\n\
|
||||
mov r5, sp\n\
|
||||
adds r0, r5, r3\n\
|
||||
ldrb r0, [r0]\n\
|
||||
adds r0, 0x34\n\
|
||||
orrs r1, r0\n\
|
||||
strh r1, [r2]\n\
|
||||
adds r3, r4, 0\n\
|
||||
_0807241A:\n\
|
||||
movs r0, 0x80\n\
|
||||
lsls r0, 17\n\
|
||||
add r0, r8\n\
|
||||
lsrs r1, r0, 24\n\
|
||||
movs r2, 0x80\n\
|
||||
lsls r2, 17\n\
|
||||
adds r0, r3, r2\n\
|
||||
lsrs r3, r0, 24\n\
|
||||
asrs r0, 24\n\
|
||||
cmp r0, 0x3\n\
|
||||
ble _080723B4\n\
|
||||
b _08072496\n\
|
||||
_08072432:\n\
|
||||
movs r3, 0\n\
|
||||
movs r4, 0xFC\n\
|
||||
lsls r4, 8\n\
|
||||
movs r6, 0x1E\n\
|
||||
_0807243A:\n\
|
||||
lsls r1, r3, 24\n\
|
||||
asrs r2, r1, 24\n\
|
||||
mov r3, sp\n\
|
||||
adds r5, r3, r2\n\
|
||||
ldrb r0, [r5]\n\
|
||||
adds r3, r1, 0\n\
|
||||
cmp r0, 0xFF\n\
|
||||
bne _08072466\n\
|
||||
lsls r1, r2, 1\n\
|
||||
adds r1, r7\n\
|
||||
ldrh r2, [r1]\n\
|
||||
adds r0, r4, 0\n\
|
||||
ands r0, r2\n\
|
||||
orrs r0, r6\n\
|
||||
strh r0, [r1]\n\
|
||||
adds r1, 0x40\n\
|
||||
ldrh r2, [r1]\n\
|
||||
adds r0, r4, 0\n\
|
||||
ands r0, r2\n\
|
||||
orrs r0, r6\n\
|
||||
strh r0, [r1]\n\
|
||||
b _08072488\n\
|
||||
_08072466:\n\
|
||||
lsls r2, 1\n\
|
||||
adds r2, r7\n\
|
||||
ldrh r0, [r2]\n\
|
||||
adds r1, r4, 0\n\
|
||||
ands r1, r0\n\
|
||||
ldrb r0, [r5]\n\
|
||||
adds r0, 0x14\n\
|
||||
orrs r1, r0\n\
|
||||
strh r1, [r2]\n\
|
||||
adds r2, 0x40\n\
|
||||
ldrh r0, [r2]\n\
|
||||
adds r1, r4, 0\n\
|
||||
ands r1, r0\n\
|
||||
ldrb r0, [r5]\n\
|
||||
adds r0, 0x34\n\
|
||||
orrs r1, r0\n\
|
||||
strh r1, [r2]\n\
|
||||
_08072488:\n\
|
||||
movs r5, 0x80\n\
|
||||
lsls r5, 17\n\
|
||||
adds r0, r3, r5\n\
|
||||
lsrs r3, r0, 24\n\
|
||||
asrs r0, 24\n\
|
||||
cmp r0, 0x3\n\
|
||||
ble _0807243A\n\
|
||||
_08072496:\n\
|
||||
add sp, 0x4\n\
|
||||
pop {r3-r5}\n\
|
||||
mov r8, r3\n\
|
||||
mov r9, r4\n\
|
||||
mov r10, r5\n\
|
||||
pop {r4-r7}\n\
|
||||
pop {r0}\n\
|
||||
bx r0\n\
|
||||
.syntax divided");
|
||||
}
|
||||
|
||||
#endif // NONMATCHING
|
||||
|
||||
void sub_80724A8(s16 arg0, s16 arg1, u16 *arg2)
|
||||
{
|
||||
|
||||
+1
-1
@@ -159,7 +159,7 @@ static void SetPalaceOpponent(void)
|
||||
|
||||
static void BufferOpponentIntroSpeech(void)
|
||||
{
|
||||
if (gTrainerBattleOpponent_A < TRAINER_RECORD_MIXING_FRIEND)
|
||||
if (gTrainerBattleOpponent_A < FRONTIER_TRAINERS_COUNT)
|
||||
FrontierSpeechToString(gFacilityTrainers[gTrainerBattleOpponent_A].speechBefore);
|
||||
}
|
||||
|
||||
|
||||
+5
-5
@@ -1400,7 +1400,7 @@ static void PrepareOneTrainer(bool8 difficult)
|
||||
challengeNum = gSaveBlock2Ptr->frontier.pikeWinStreaks[lvlMode] / 14;
|
||||
do
|
||||
{
|
||||
trainerId = sub_8162548(challengeNum, battleNum);
|
||||
trainerId = GetRandomScaledFrontierTrainerId(challengeNum, battleNum);
|
||||
for (i = 0; i < gSaveBlock2Ptr->frontier.curChallengeBattleNum - 1; i++)
|
||||
{
|
||||
if (gSaveBlock2Ptr->frontier.trainerIds[i] == trainerId)
|
||||
@@ -1425,7 +1425,7 @@ static void PrepareTwoTrainers(void)
|
||||
gFacilityTrainers = gBattleFrontierTrainers;
|
||||
do
|
||||
{
|
||||
trainerId = sub_8162548(challengeNum, 1);
|
||||
trainerId = GetRandomScaledFrontierTrainerId(challengeNum, 1);
|
||||
for (i = 0; i < gSaveBlock2Ptr->frontier.curChallengeBattleNum - 1; i++)
|
||||
{
|
||||
if (gSaveBlock2Ptr->frontier.trainerIds[i] == trainerId)
|
||||
@@ -1440,7 +1440,7 @@ static void PrepareTwoTrainers(void)
|
||||
|
||||
do
|
||||
{
|
||||
trainerId = sub_8162548(challengeNum, 1);
|
||||
trainerId = GetRandomScaledFrontierTrainerId(challengeNum, 1);
|
||||
for (i = 0; i < gSaveBlock2Ptr->frontier.curChallengeBattleNum; i++)
|
||||
{
|
||||
if (gSaveBlock2Ptr->frontier.trainerIds[i] == trainerId)
|
||||
@@ -1466,12 +1466,12 @@ static void BufferTrainerIntro(void)
|
||||
{
|
||||
if (gSpecialVar_0x8005 == 0)
|
||||
{
|
||||
if (gTrainerBattleOpponent_A < TRAINER_RECORD_MIXING_FRIEND)
|
||||
if (gTrainerBattleOpponent_A < FRONTIER_TRAINERS_COUNT)
|
||||
FrontierSpeechToString(gFacilityTrainers[gTrainerBattleOpponent_A].speechBefore);
|
||||
}
|
||||
else if (gSpecialVar_0x8005 == 1)
|
||||
{
|
||||
if (gTrainerBattleOpponent_B < TRAINER_RECORD_MIXING_FRIEND)
|
||||
if (gTrainerBattleOpponent_B < FRONTIER_TRAINERS_COUNT)
|
||||
FrontierSpeechToString(gFacilityTrainers[gTrainerBattleOpponent_B].speechBefore);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1493,7 +1493,7 @@ static u16 GetUniqueTrainerId(u8 objectEventId)
|
||||
{
|
||||
do
|
||||
{
|
||||
trainerId = sub_8162548(challengeNum + 1, battleNum);
|
||||
trainerId = GetRandomScaledFrontierTrainerId(challengeNum + 1, battleNum);
|
||||
for (i = 0; i < objectEventId; i++)
|
||||
{
|
||||
if (gSaveBlock2Ptr->frontier.trainerIds[i] == trainerId)
|
||||
@@ -1505,7 +1505,7 @@ static u16 GetUniqueTrainerId(u8 objectEventId)
|
||||
{
|
||||
do
|
||||
{
|
||||
trainerId = sub_8162548(challengeNum, battleNum);
|
||||
trainerId = GetRandomScaledFrontierTrainerId(challengeNum, battleNum);
|
||||
for (i = 0; i < objectEventId; i++)
|
||||
{
|
||||
if (gSaveBlock2Ptr->frontier.trainerIds[i] == trainerId)
|
||||
|
||||
+6
-6
@@ -961,12 +961,12 @@ static u8 TrainerBattleLoadArg8(const u8 *ptr)
|
||||
|
||||
static u16 GetTrainerAFlag(void)
|
||||
{
|
||||
return FLAG_TRAINER_FLAG_START + gTrainerBattleOpponent_A;
|
||||
return TRAINER_FLAGS_START + gTrainerBattleOpponent_A;
|
||||
}
|
||||
|
||||
static u16 GetTrainerBFlag(void)
|
||||
{
|
||||
return FLAG_TRAINER_FLAG_START + gTrainerBattleOpponent_B;
|
||||
return TRAINER_FLAGS_START + gTrainerBattleOpponent_B;
|
||||
}
|
||||
|
||||
static bool32 IsPlayerDefeated(u32 battleOutcome)
|
||||
@@ -1193,7 +1193,7 @@ void SetUpTwoTrainersBattle(void)
|
||||
bool32 GetTrainerFlagFromScriptPointer(const u8 *data)
|
||||
{
|
||||
u32 flag = TrainerBattleLoadArg16(data + 2);
|
||||
return FlagGet(FLAG_TRAINER_FLAG_START + flag);
|
||||
return FlagGet(TRAINER_FLAGS_START + flag);
|
||||
}
|
||||
|
||||
void SetUpTrainerMovement(void)
|
||||
@@ -1232,17 +1232,17 @@ static void SetBattledTrainerFlag(void)
|
||||
|
||||
bool8 HasTrainerBeenFought(u16 trainerId)
|
||||
{
|
||||
return FlagGet(FLAG_TRAINER_FLAG_START + trainerId);
|
||||
return FlagGet(TRAINER_FLAGS_START + trainerId);
|
||||
}
|
||||
|
||||
void SetTrainerFlag(u16 trainerId)
|
||||
{
|
||||
FlagSet(FLAG_TRAINER_FLAG_START + trainerId);
|
||||
FlagSet(TRAINER_FLAGS_START + trainerId);
|
||||
}
|
||||
|
||||
void ClearTrainerFlag(u16 trainerId)
|
||||
{
|
||||
FlagClear(FLAG_TRAINER_FLAG_START + trainerId);
|
||||
FlagClear(TRAINER_FLAGS_START + trainerId);
|
||||
}
|
||||
|
||||
void BattleSetup_StartTrainerBattle(void)
|
||||
|
||||
+13
-11
@@ -12,6 +12,8 @@
|
||||
#include "frontier_util.h"
|
||||
#include "string_util.h"
|
||||
#include "constants/battle_tent.h"
|
||||
#include "constants/battle_tent_trainers.h"
|
||||
#include "constants/battle_tent_mons.h"
|
||||
#include "constants/items.h"
|
||||
#include "constants/layouts.h"
|
||||
#include "constants/region_map_sections.h"
|
||||
@@ -134,7 +136,7 @@ static void SetVerdanturfTentTrainerGfx(void)
|
||||
|
||||
static void BufferVerdanturfTentTrainerIntro(void)
|
||||
{
|
||||
if (gTrainerBattleOpponent_A < TRAINER_RECORD_MIXING_FRIEND)
|
||||
if (gTrainerBattleOpponent_A < FRONTIER_TRAINERS_COUNT)
|
||||
FrontierSpeechToString(gFacilityTrainers[gTrainerBattleOpponent_A].speechBefore);
|
||||
}
|
||||
|
||||
@@ -311,7 +313,7 @@ static void GenerateInitialRentalMons(void)
|
||||
while (i != PARTY_SIZE)
|
||||
{
|
||||
// Cannot have two pokemon of the same species.
|
||||
monSetId = Random() % 70;
|
||||
monSetId = Random() % NUM_SLATEPORT_TENT_MONS;
|
||||
for (j = firstMonId; j < firstMonId + i; j++)
|
||||
{
|
||||
u16 monId = monIds[j];
|
||||
@@ -353,10 +355,10 @@ static void GenerateOpponentMons(void)
|
||||
{
|
||||
u16 trainerId;
|
||||
s32 i, j, k;
|
||||
register const u16 *monSets asm("r9"); // Fix me. Compiler insists on moving that variable into stack.
|
||||
register const u16 *monSet asm("r9"); // Fix me. Compiler insists on moving that variable into stack.
|
||||
u16 species[FRONTIER_PARTY_SIZE];
|
||||
u16 heldItems[FRONTIER_PARTY_SIZE];
|
||||
s32 setsCount = 0;
|
||||
s32 monId = 0;
|
||||
|
||||
gFacilityTrainers = gSlateportBattleTentTrainers;
|
||||
gFacilityTrainerMons = gSlateportBattleTentMons;
|
||||
@@ -365,7 +367,7 @@ static void GenerateOpponentMons(void)
|
||||
{
|
||||
do
|
||||
{
|
||||
trainerId = Random() % 30;
|
||||
trainerId = Random() % NUM_BATTLE_TENT_TRAINERS;
|
||||
for (i = 0; i < gSaveBlock2Ptr->frontier.curChallengeBattleNum; i++)
|
||||
{
|
||||
if (gSaveBlock2Ptr->frontier.trainerIds[i] == trainerId)
|
||||
@@ -374,21 +376,21 @@ static void GenerateOpponentMons(void)
|
||||
} while (i != gSaveBlock2Ptr->frontier.curChallengeBattleNum);
|
||||
|
||||
gTrainerBattleOpponent_A = trainerId;
|
||||
while (gFacilityTrainers[gTrainerBattleOpponent_A].monSets[setsCount] != 0xFFFF)
|
||||
setsCount++;
|
||||
if (setsCount > 8)
|
||||
while (gFacilityTrainers[gTrainerBattleOpponent_A].monSet[monId] != 0xFFFF)
|
||||
monId++;
|
||||
if (monId > 8)
|
||||
break;
|
||||
setsCount = 0;
|
||||
monId = 0;
|
||||
}
|
||||
|
||||
if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < 2)
|
||||
gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = gTrainerBattleOpponent_A;
|
||||
|
||||
monSets = gFacilityTrainers[gTrainerBattleOpponent_A].monSets;
|
||||
monSet = gFacilityTrainers[gTrainerBattleOpponent_A].monSet;
|
||||
i = 0;
|
||||
while (i != FRONTIER_PARTY_SIZE)
|
||||
{
|
||||
sRandMonSetId = monSets[Random() % setsCount];
|
||||
sRandMonSetId = monSet[Random() % monId];
|
||||
for (j = 0; j < 6; j++)
|
||||
{
|
||||
if (gFacilityTrainerMons[sRandMonSetId].species == gFacilityTrainerMons[gSaveBlock2Ptr->frontier.rentalMons[j].monId].species)
|
||||
|
||||
+185
-168
@@ -25,6 +25,9 @@
|
||||
#include "battle_factory.h"
|
||||
#include "constants/apprentice.h"
|
||||
#include "constants/battle_frontier.h"
|
||||
#include "constants/battle_frontier_mons.h"
|
||||
#include "constants/battle_tent_mons.h"
|
||||
#include "constants/battle_tent_trainers.h"
|
||||
#include "constants/battle_tower.h"
|
||||
#include "constants/frontier_util.h"
|
||||
#include "constants/items.h"
|
||||
@@ -849,30 +852,37 @@ static const u8 sBattleTowerPartySizes2[] =
|
||||
[FRONTIER_MODE_LINK_MULTIS] = FRONTIER_MULTI_PARTY_SIZE,
|
||||
};
|
||||
|
||||
static const u16 gUnknown_085DF9FA[][2] =
|
||||
// Trainer ID ranges for possible frontier trainers to encounter on particular challenges
|
||||
// Trainers are scaled by difficulty, so higher trainer IDs have better teams
|
||||
static const u16 sFrontierTrainerIdRanges[][2] =
|
||||
{
|
||||
{0x0000, 0x0063},
|
||||
{0x0050, 0x0077},
|
||||
{0x0064, 0x008b},
|
||||
{0x0078, 0x009f},
|
||||
{0x008c, 0x00b3},
|
||||
{0x00a0, 0x00c7},
|
||||
{0x00b4, 0x00db},
|
||||
{0x00c8, 0x012b},
|
||||
{FRONTIER_TRAINER_BRADY, FRONTIER_TRAINER_JILL}, // 0 - 99
|
||||
{FRONTIER_TRAINER_TREVIN, FRONTIER_TRAINER_CHLOE}, // 80 - 119
|
||||
{FRONTIER_TRAINER_ERIK, FRONTIER_TRAINER_SOFIA}, // 100 - 139
|
||||
{FRONTIER_TRAINER_NORTON, FRONTIER_TRAINER_JAZLYN}, // 120 - 159
|
||||
{FRONTIER_TRAINER_BRADEN, FRONTIER_TRAINER_ALISON}, // 140 - 179
|
||||
{FRONTIER_TRAINER_ZACHERY, FRONTIER_TRAINER_LAMAR}, // 160 - 199
|
||||
{FRONTIER_TRAINER_HANK, FRONTIER_TRAINER_TESS}, // 180 - 219
|
||||
{FRONTIER_TRAINER_JAXON, FRONTIER_TRAINER_GRETEL}, // 200 - 299
|
||||
};
|
||||
|
||||
static const u16 gUnknown_085DFA1A[][2] =
|
||||
static const u16 sFrontierTrainerIdRangesHard[][2] =
|
||||
{
|
||||
{0x0064, 0x0077},
|
||||
{0x0078, 0x008b},
|
||||
{0x008c, 0x009f},
|
||||
{0x00a0, 0x00b3},
|
||||
{0x00b4, 0x00c7},
|
||||
{0x00c8, 0x00db},
|
||||
{0x00dc, 0x00ef},
|
||||
{0x00c8, 0x012b},
|
||||
{0x00b3, 0x008d},
|
||||
{0x00c8, 0x00b7},
|
||||
{FRONTIER_TRAINER_ERIK, FRONTIER_TRAINER_CHLOE}, // 100 - 119
|
||||
{FRONTIER_TRAINER_NORTON, FRONTIER_TRAINER_SOFIA}, // 120 - 139
|
||||
{FRONTIER_TRAINER_BRADEN, FRONTIER_TRAINER_JAZLYN}, // 140 - 159
|
||||
{FRONTIER_TRAINER_ZACHERY, FRONTIER_TRAINER_ALISON}, // 160 - 179
|
||||
{FRONTIER_TRAINER_HANK, FRONTIER_TRAINER_LAMAR}, // 180 - 199
|
||||
{FRONTIER_TRAINER_JAXON, FRONTIER_TRAINER_TESS}, // 200 - 219
|
||||
{FRONTIER_TRAINER_LEON, FRONTIER_TRAINER_RAUL}, // 220 - 239
|
||||
{FRONTIER_TRAINER_JAXON, FRONTIER_TRAINER_GRETEL}, // 200 - 299
|
||||
};
|
||||
|
||||
// Trainer IDs? Don't make sense as part of previous array, min/max relationship reversed and never accessed
|
||||
static const u16 sUnused_085DFA1A[][2] =
|
||||
{
|
||||
{179, 141}, // FRONTIER_TRAINER_ALISON - FRONTIER_TRAINER_KAYDEN
|
||||
{200, 183}, // FRONTIER_TRAINER_JAXON - FRONTIER_TRAINER_HUNTER
|
||||
};
|
||||
|
||||
static const u8 sBattleTowerPartySizes[FRONTIER_MODE_COUNT] =
|
||||
@@ -1077,7 +1087,7 @@ static void SetNextFacilityOpponent(void)
|
||||
s32 i;
|
||||
while (1)
|
||||
{
|
||||
id = sub_8162548(challengeNum, gSaveBlock2Ptr->frontier.curChallengeBattleNum);
|
||||
id = GetRandomScaledFrontierTrainerId(challengeNum, gSaveBlock2Ptr->frontier.curChallengeBattleNum);
|
||||
|
||||
// Ensure trainer wasn't previously fought in this challenge.
|
||||
for (i = 0; i < gSaveBlock2Ptr->frontier.curChallengeBattleNum; i++)
|
||||
@@ -1097,7 +1107,7 @@ static void SetNextFacilityOpponent(void)
|
||||
}
|
||||
}
|
||||
|
||||
u16 sub_8162548(u8 challengeNum, u8 battleNum)
|
||||
u16 GetRandomScaledFrontierTrainerId(u8 challengeNum, u8 battleNum)
|
||||
{
|
||||
u16 trainerId;
|
||||
|
||||
@@ -1105,49 +1115,54 @@ u16 sub_8162548(u8 challengeNum, u8 battleNum)
|
||||
{
|
||||
if (battleNum == 6)
|
||||
{
|
||||
trainerId = (gUnknown_085DFA1A[challengeNum][1] - gUnknown_085DFA1A[challengeNum][0]) + 1;
|
||||
trainerId = gUnknown_085DFA1A[challengeNum][0] + (Random() % trainerId);
|
||||
// The last battle in each challenge has a jump in difficulty, pulls from a table with higher ranges
|
||||
trainerId = (sFrontierTrainerIdRangesHard[challengeNum][1] - sFrontierTrainerIdRangesHard[challengeNum][0]) + 1;
|
||||
trainerId = sFrontierTrainerIdRangesHard[challengeNum][0] + (Random() % trainerId);
|
||||
}
|
||||
else
|
||||
{
|
||||
trainerId = (gUnknown_085DF9FA[challengeNum][1] - gUnknown_085DF9FA[challengeNum][0]) + 1;
|
||||
trainerId = gUnknown_085DF9FA[challengeNum][0] + (Random() % trainerId);
|
||||
trainerId = (sFrontierTrainerIdRanges[challengeNum][1] - sFrontierTrainerIdRanges[challengeNum][0]) + 1;
|
||||
trainerId = sFrontierTrainerIdRanges[challengeNum][0] + (Random() % trainerId);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
trainerId = (gUnknown_085DF9FA[7][1] - gUnknown_085DF9FA[7][0]) + 1;
|
||||
trainerId = gUnknown_085DF9FA[7][0] + (Random() % trainerId);
|
||||
// After challenge 7, trainer IDs always come from the last, hardest range, which is the same for both trainer ID tables
|
||||
trainerId = (sFrontierTrainerIdRanges[7][1] - sFrontierTrainerIdRanges[7][0]) + 1;
|
||||
trainerId = sFrontierTrainerIdRanges[7][0] + (Random() % trainerId);
|
||||
}
|
||||
|
||||
return trainerId;
|
||||
}
|
||||
|
||||
static void sub_81625B4(u8 challengeNum, u8 battleNum, u16 *trainerIdPtr, u8 *arg3) // Unused
|
||||
// Unused
|
||||
static void GetRandomScaledFrontierTrainerIdRange(u8 challengeNum, u8 battleNum, u16 *trainerIdPtr, u8 *rangePtr)
|
||||
{
|
||||
u16 trainerId, count;
|
||||
u16 trainerId, range;
|
||||
|
||||
if (challengeNum <= 7)
|
||||
{
|
||||
if (battleNum == 6)
|
||||
{
|
||||
count = (gUnknown_085DFA1A[challengeNum][1] - gUnknown_085DFA1A[challengeNum][0]) + 1;
|
||||
trainerId = gUnknown_085DFA1A[challengeNum][0];
|
||||
// The last battle in each challenge has a jump in difficulty, pulls from a table with higher ranges
|
||||
range = (sFrontierTrainerIdRangesHard[challengeNum][1] - sFrontierTrainerIdRangesHard[challengeNum][0]) + 1;
|
||||
trainerId = sFrontierTrainerIdRangesHard[challengeNum][0];
|
||||
}
|
||||
else
|
||||
{
|
||||
count = (gUnknown_085DF9FA[challengeNum][1] - gUnknown_085DF9FA[challengeNum][0]) + 1;
|
||||
trainerId = gUnknown_085DF9FA[challengeNum][0];
|
||||
range = (sFrontierTrainerIdRanges[challengeNum][1] - sFrontierTrainerIdRanges[challengeNum][0]) + 1;
|
||||
trainerId = sFrontierTrainerIdRanges[challengeNum][0];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
count = (gUnknown_085DF9FA[7][1] - gUnknown_085DF9FA[7][0]) + 1;
|
||||
trainerId = gUnknown_085DF9FA[7][0];
|
||||
// After challenge 7, trainer IDs always come from the last, hardest range, which is the same for both trainer ID tables
|
||||
range = (sFrontierTrainerIdRanges[7][1] - sFrontierTrainerIdRanges[7][0]) + 1;
|
||||
trainerId = sFrontierTrainerIdRanges[7][0];
|
||||
}
|
||||
|
||||
*trainerIdPtr = trainerId;
|
||||
*arg3 = count;
|
||||
*rangePtr = range;
|
||||
}
|
||||
|
||||
void SetBattleFacilityTrainerGfxId(u16 trainerId, u8 tempVarId)
|
||||
@@ -1166,7 +1181,7 @@ void SetBattleFacilityTrainerGfxId(u16 trainerId, u8 tempVarId)
|
||||
SetFrontierBrainObjEventGfx_2();
|
||||
return;
|
||||
}
|
||||
else if (trainerId < TRAINER_RECORD_MIXING_FRIEND)
|
||||
else if (trainerId < FRONTIER_TRAINERS_COUNT)
|
||||
{
|
||||
facilityClass = gFacilityTrainers[trainerId].facilityClass;
|
||||
}
|
||||
@@ -1258,7 +1273,7 @@ u8 GetBattleFacilityTrainerGfxId(u16 trainerId)
|
||||
{
|
||||
facilityClass = gSaveBlock2Ptr->frontier.ereaderTrainer.facilityClass;
|
||||
}
|
||||
else if (trainerId < TRAINER_RECORD_MIXING_FRIEND)
|
||||
else if (trainerId < FRONTIER_TRAINERS_COUNT)
|
||||
{
|
||||
facilityClass = gFacilityTrainers[trainerId].facilityClass;
|
||||
}
|
||||
@@ -1400,7 +1415,7 @@ u8 GetFrontierTrainerFrontSpriteId(u16 trainerId)
|
||||
{
|
||||
return GetFrontierBrainTrainerPicIndex();
|
||||
}
|
||||
else if (trainerId < TRAINER_RECORD_MIXING_FRIEND)
|
||||
else if (trainerId < FRONTIER_TRAINERS_COUNT)
|
||||
{
|
||||
return gFacilityClassToPicIndex[gFacilityTrainers[trainerId].facilityClass];
|
||||
}
|
||||
@@ -1437,7 +1452,7 @@ u8 GetFrontierOpponentClass(u16 trainerId)
|
||||
{
|
||||
trainerClass = gTrainers[TRAINER_STEVEN].trainerClass;
|
||||
}
|
||||
else if (trainerId < TRAINER_RECORD_MIXING_FRIEND)
|
||||
else if (trainerId < FRONTIER_TRAINERS_COUNT)
|
||||
{
|
||||
trainerClass = gFacilityClassToTrainerClass[gFacilityTrainers[trainerId].facilityClass];
|
||||
}
|
||||
@@ -1478,7 +1493,7 @@ static u8 GetFrontierTrainerFacilityClass(u16 trainerId)
|
||||
{
|
||||
facilityClass = gSaveBlock2Ptr->frontier.ereaderTrainer.facilityClass;
|
||||
}
|
||||
else if (trainerId < TRAINER_RECORD_MIXING_FRIEND)
|
||||
else if (trainerId < FRONTIER_TRAINERS_COUNT)
|
||||
{
|
||||
facilityClass = gFacilityTrainers[trainerId].facilityClass;
|
||||
}
|
||||
@@ -1520,7 +1535,7 @@ void GetFrontierTrainerName(u8 *dst, u16 trainerId)
|
||||
for (i = 0; i < PLAYER_NAME_LENGTH; i++)
|
||||
dst[i] = gTrainers[TRAINER_STEVEN].trainerName[i];
|
||||
}
|
||||
else if (trainerId < TRAINER_RECORD_MIXING_FRIEND)
|
||||
else if (trainerId < FRONTIER_TRAINERS_COUNT)
|
||||
{
|
||||
for (i = 0; i < PLAYER_NAME_LENGTH; i++)
|
||||
dst[i] = gFacilityTrainers[trainerId].trainerName[i];
|
||||
@@ -1575,7 +1590,7 @@ static bool8 IsFrontierTrainerFemale(u16 trainerId)
|
||||
{
|
||||
return IsFrontierBrainFemale();
|
||||
}
|
||||
else if (trainerId < TRAINER_RECORD_MIXING_FRIEND)
|
||||
else if (trainerId < FRONTIER_TRAINERS_COUNT)
|
||||
{
|
||||
facilityClass = gFacilityTrainers[trainerId].facilityClass;
|
||||
}
|
||||
@@ -1623,18 +1638,18 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount)
|
||||
{
|
||||
s32 i, j;
|
||||
u16 chosenMonIndices[4];
|
||||
u8 friendship = 0xFF;
|
||||
u8 friendship = MAX_FRIENDSHIP;
|
||||
u8 level = SetFacilityPtrsGetLevel();
|
||||
u8 fixedIV = 0;
|
||||
u8 bfMonCount;
|
||||
const u16 *monSets = NULL;
|
||||
const u16 *monSet = NULL;
|
||||
u32 otID = 0;
|
||||
|
||||
if (trainerId < TRAINER_RECORD_MIXING_FRIEND)
|
||||
if (trainerId < FRONTIER_TRAINERS_COUNT)
|
||||
{
|
||||
// Normal battle frontier trainer.
|
||||
fixedIV = GetFrontierTrainerFixedIvs(trainerId);
|
||||
monSets = gFacilityTrainers[gTrainerBattleOpponent_A].monSets;
|
||||
monSet = gFacilityTrainers[gTrainerBattleOpponent_A].monSet;
|
||||
}
|
||||
else if (trainerId == TRAINER_EREADER)
|
||||
{
|
||||
@@ -1672,20 +1687,20 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount)
|
||||
// Attempt to fill the trainer's party with random Pokemon until 3 have been
|
||||
// successfully chosen. The trainer's party may not have duplicate pokemon species
|
||||
// or duplicate held items.
|
||||
for (bfMonCount = 0; monSets[bfMonCount] != 0xFFFF; bfMonCount++)
|
||||
for (bfMonCount = 0; monSet[bfMonCount] != 0xFFFF; bfMonCount++)
|
||||
;
|
||||
i = 0;
|
||||
otID = Random32();
|
||||
while (i != monCount)
|
||||
{
|
||||
u16 monSetId = monSets[Random() % bfMonCount];
|
||||
if ((level == 50 || level == 20) && monSetId > 849)
|
||||
u16 monId = monSet[Random() % bfMonCount];
|
||||
if ((level == 50 || level == 20) && monId > FRONTIER_MONS_HIGH_TIER)
|
||||
continue;
|
||||
|
||||
// Ensure this pokemon species isn't a duplicate.
|
||||
for (j = 0; j < i + firstMonId; j++)
|
||||
{
|
||||
if (GetMonData(&gEnemyParty[j], MON_DATA_SPECIES, NULL) == gFacilityTrainerMons[monSetId].species)
|
||||
if (GetMonData(&gEnemyParty[j], MON_DATA_SPECIES, NULL) == gFacilityTrainerMons[monId].species)
|
||||
break;
|
||||
}
|
||||
if (j != i + firstMonId)
|
||||
@@ -1695,7 +1710,7 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount)
|
||||
for (j = 0; j < i + firstMonId; j++)
|
||||
{
|
||||
if (GetMonData(&gEnemyParty[j], MON_DATA_HELD_ITEM, NULL) != 0
|
||||
&& GetMonData(&gEnemyParty[j], MON_DATA_HELD_ITEM, NULL) == gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId])
|
||||
&& GetMonData(&gEnemyParty[j], MON_DATA_HELD_ITEM, NULL) == gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId])
|
||||
break;
|
||||
}
|
||||
if (j != i + firstMonId)
|
||||
@@ -1705,34 +1720,34 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount)
|
||||
// because the species and held items were already checked directly above.
|
||||
for (j = 0; j < i; j++)
|
||||
{
|
||||
if (chosenMonIndices[j] == monSetId)
|
||||
if (chosenMonIndices[j] == monId)
|
||||
break;
|
||||
}
|
||||
if (j != i)
|
||||
continue;
|
||||
|
||||
chosenMonIndices[i] = monSetId;
|
||||
chosenMonIndices[i] = monId;
|
||||
|
||||
// Place the chosen pokemon into the trainer's party.
|
||||
CreateMonWithEVSpreadNatureOTID(&gEnemyParty[i + firstMonId],
|
||||
gFacilityTrainerMons[monSetId].species,
|
||||
gFacilityTrainerMons[monId].species,
|
||||
level,
|
||||
gFacilityTrainerMons[monSetId].nature,
|
||||
gFacilityTrainerMons[monId].nature,
|
||||
fixedIV,
|
||||
gFacilityTrainerMons[monSetId].evSpread,
|
||||
gFacilityTrainerMons[monId].evSpread,
|
||||
otID);
|
||||
|
||||
friendship = 255;
|
||||
friendship = MAX_FRIENDSHIP;
|
||||
// Give the chosen pokemon its specified moves.
|
||||
for (j = 0; j < MAX_MON_MOVES; j++)
|
||||
{
|
||||
SetMonMoveSlot(&gEnemyParty[i + firstMonId], gFacilityTrainerMons[monSetId].moves[j], j);
|
||||
if (gFacilityTrainerMons[monSetId].moves[j] == MOVE_FRUSTRATION)
|
||||
SetMonMoveSlot(&gEnemyParty[i + firstMonId], gFacilityTrainerMons[monId].moves[j], j);
|
||||
if (gFacilityTrainerMons[monId].moves[j] == MOVE_FRUSTRATION)
|
||||
friendship = 0; // Frustration is more powerful the lower the pokemon's friendship is.
|
||||
}
|
||||
|
||||
SetMonData(&gEnemyParty[i + firstMonId], MON_DATA_FRIENDSHIP, &friendship);
|
||||
SetMonData(&gEnemyParty[i + firstMonId], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
|
||||
SetMonData(&gEnemyParty[i + firstMonId], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId]);
|
||||
|
||||
// The pokemon was successfully added to the trainer's party, so it's safe to move on to
|
||||
// the next party slot.
|
||||
@@ -1744,7 +1759,7 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount)
|
||||
static void Unused_CreateApprenticeMons(u16 trainerId, u8 firstMonId)
|
||||
{
|
||||
s32 i, j;
|
||||
u8 friendship = 0xFF;
|
||||
u8 friendship = MAX_FRIENDSHIP;
|
||||
u8 level = 0;
|
||||
u8 fixedIV = 0;
|
||||
struct Apprentice *apprentice = &gSaveBlock2Ptr->apprentices[0];
|
||||
@@ -1762,7 +1777,7 @@ static void Unused_CreateApprenticeMons(u16 trainerId, u8 firstMonId)
|
||||
for (i = 0; i != 3; i++)
|
||||
{
|
||||
CreateMonWithEVSpread(&gEnemyParty[firstMonId + i], apprentice->party[i].species, level, fixedIV, 8);
|
||||
friendship = 0xFF;
|
||||
friendship = MAX_FRIENDSHIP;
|
||||
for (j = 0; j < MAX_MON_MOVES; j++)
|
||||
{
|
||||
if (apprentice->party[i].moves[j] == MOVE_FRUSTRATION)
|
||||
@@ -1773,27 +1788,27 @@ static void Unused_CreateApprenticeMons(u16 trainerId, u8 firstMonId)
|
||||
}
|
||||
}
|
||||
|
||||
u16 RandomizeFacilityTrainerMonSet(u16 trainerId)
|
||||
u16 GetRandomFrontierMonFromSet(u16 trainerId)
|
||||
{
|
||||
u8 level = SetFacilityPtrsGetLevel();
|
||||
const u16 *monSets = gFacilityTrainers[trainerId].monSets;
|
||||
u8 bfMonCount = 0;
|
||||
u32 monSetId = monSets[bfMonCount];
|
||||
const u16 *monSet = gFacilityTrainers[trainerId].monSet;
|
||||
u8 numMons = 0;
|
||||
u32 monId = monSet[numMons];
|
||||
|
||||
while (monSetId != 0xFFFF)
|
||||
while (monId != 0xFFFF)
|
||||
{
|
||||
bfMonCount++;
|
||||
monSetId = monSets[bfMonCount];
|
||||
if (monSetId == 0xFFFF)
|
||||
numMons++;
|
||||
monId = monSet[numMons];
|
||||
if (monId == 0xFFFF)
|
||||
break;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
monSetId = monSets[Random() % bfMonCount];
|
||||
} while((level == 50 || level == 20) && monSetId > 849);
|
||||
monId = monSet[Random() % numMons];
|
||||
} while((level == 50 || level == 20) && monId > FRONTIER_MONS_HIGH_TIER);
|
||||
|
||||
return monSetId;
|
||||
return monId;
|
||||
}
|
||||
|
||||
static void FillFactoryTrainerParty(void)
|
||||
@@ -1813,7 +1828,7 @@ static void FillFactoryFrontierTrainerParty(u16 trainerId, u8 firstMonId)
|
||||
u8 fixedIV;
|
||||
u32 otID;
|
||||
|
||||
if (trainerId < TRAINER_RECORD_MIXING_FRIEND)
|
||||
if (trainerId < FRONTIER_TRAINERS_COUNT)
|
||||
{
|
||||
u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; // Unused variable.
|
||||
u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
|
||||
@@ -1843,21 +1858,21 @@ static void FillFactoryFrontierTrainerParty(u16 trainerId, u8 firstMonId)
|
||||
otID = T1_READ_32(gSaveBlock2Ptr->playerTrainerId);
|
||||
for (i = 0; i < FRONTIER_PARTY_SIZE; i++)
|
||||
{
|
||||
u16 monSetId = gUnknown_03006298[i];
|
||||
u16 monId = gUnknown_03006298[i];
|
||||
CreateMonWithEVSpreadNatureOTID(&gEnemyParty[firstMonId + i],
|
||||
gFacilityTrainerMons[monSetId].species,
|
||||
gFacilityTrainerMons[monId].species,
|
||||
level,
|
||||
gFacilityTrainerMons[monSetId].nature,
|
||||
gFacilityTrainerMons[monId].nature,
|
||||
fixedIV,
|
||||
gFacilityTrainerMons[monSetId].evSpread,
|
||||
gFacilityTrainerMons[monId].evSpread,
|
||||
otID);
|
||||
|
||||
friendship = 0;
|
||||
for (j = 0; j < MAX_MON_MOVES; j++)
|
||||
SetMonMoveAvoidReturn(&gEnemyParty[firstMonId + i], gFacilityTrainerMons[monSetId].moves[j], j);
|
||||
SetMonMoveAvoidReturn(&gEnemyParty[firstMonId + i], gFacilityTrainerMons[monId].moves[j], j);
|
||||
|
||||
SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_FRIENDSHIP, &friendship);
|
||||
SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
|
||||
SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1871,25 +1886,25 @@ static void FillFactoryTentTrainerParty(u16 trainerId, u8 firstMonId)
|
||||
|
||||
for (i = 0; i < FRONTIER_PARTY_SIZE; i++)
|
||||
{
|
||||
u16 monSetId = gUnknown_03006298[i];
|
||||
u16 monId = gUnknown_03006298[i];
|
||||
CreateMonWithEVSpreadNatureOTID(&gEnemyParty[firstMonId + i],
|
||||
gFacilityTrainerMons[monSetId].species,
|
||||
gFacilityTrainerMons[monId].species,
|
||||
level,
|
||||
gFacilityTrainerMons[monSetId].nature,
|
||||
gFacilityTrainerMons[monId].nature,
|
||||
fixedIV,
|
||||
gFacilityTrainerMons[monSetId].evSpread,
|
||||
gFacilityTrainerMons[monId].evSpread,
|
||||
otID);
|
||||
|
||||
friendship = 0;
|
||||
for (j = 0; j < MAX_MON_MOVES; j++)
|
||||
{
|
||||
SetMonMoveAvoidReturn(&gEnemyParty[firstMonId + i], gFacilityTrainerMons[monSetId].moves[j], j);
|
||||
if (gFacilityTrainerMons[monSetId].moves[j] == MOVE_FRUSTRATION)
|
||||
SetMonMoveAvoidReturn(&gEnemyParty[firstMonId + i], gFacilityTrainerMons[monId].moves[j], j);
|
||||
if (gFacilityTrainerMons[monId].moves[j] == MOVE_FRUSTRATION)
|
||||
friendship = 0;
|
||||
}
|
||||
|
||||
SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_FRIENDSHIP, &friendship);
|
||||
SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
|
||||
SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1922,7 +1937,7 @@ static void GetOpponentIntroSpeech(void)
|
||||
|
||||
if (trainerId == TRAINER_EREADER)
|
||||
FrontierSpeechToString(gSaveBlock2Ptr->frontier.ereaderTrainer.greeting);
|
||||
else if (trainerId < TRAINER_RECORD_MIXING_FRIEND)
|
||||
else if (trainerId < FRONTIER_TRAINERS_COUNT)
|
||||
FrontierSpeechToString(gFacilityTrainers[trainerId].speechBefore);
|
||||
else if (trainerId < TRAINER_RECORD_MIXING_APPRENTICE)
|
||||
FrontierSpeechToString(gSaveBlock2Ptr->frontier.towerRecords[trainerId - TRAINER_RECORD_MIXING_FRIEND].greeting);
|
||||
@@ -2150,7 +2165,7 @@ static void sub_8163EE4(void)
|
||||
StringCopy7(playerRecord->name, gSaveBlock2Ptr->playerName);
|
||||
playerRecord->winStreak = GetCurrentBattleTowerWinStreak(lvlMode, battleMode);
|
||||
|
||||
for (i = 0; i < 6; i++)
|
||||
for (i = 0; i < EASY_CHAT_BATTLE_WORDS_COUNT; i++)
|
||||
{
|
||||
playerRecord->greeting[i] = gSaveBlock1Ptr->easyChatBattleStart[i];
|
||||
playerRecord->speechWon[i] = gSaveBlock1Ptr->easyChatBattleWon[i];
|
||||
@@ -2252,7 +2267,7 @@ static void LoadMultiPartnerCandidatesData(void)
|
||||
u32 spArray[5];
|
||||
s32 r10;
|
||||
u16 trainerId;
|
||||
u16 monSetId;
|
||||
u16 monId;
|
||||
u32 lvlMode, battleMode;
|
||||
s32 challengeNum;
|
||||
u32 species1, species2;
|
||||
@@ -2272,7 +2287,7 @@ static void LoadMultiPartnerCandidatesData(void)
|
||||
{
|
||||
do
|
||||
{
|
||||
trainerId = sub_8162548(challengeNum, 0);
|
||||
trainerId = GetRandomScaledFrontierTrainerId(challengeNum, 0);
|
||||
for (i = 0; i < j; i++)
|
||||
{
|
||||
if (gSaveBlock2Ptr->frontier.trainerIds[i] == trainerId)
|
||||
@@ -2294,24 +2309,24 @@ static void LoadMultiPartnerCandidatesData(void)
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
monSetId = RandomizeFacilityTrainerMonSet(trainerId);
|
||||
if (j % 2 != 0 && gFacilityTrainerMons[gSaveBlock2Ptr->frontier.trainerIds[r10 - 1]].itemTableId == gFacilityTrainerMons[monSetId].itemTableId)
|
||||
monId = GetRandomFrontierMonFromSet(trainerId);
|
||||
if (j % 2 != 0 && gFacilityTrainerMons[gSaveBlock2Ptr->frontier.trainerIds[r10 - 1]].itemTableId == gFacilityTrainerMons[monId].itemTableId)
|
||||
continue;
|
||||
|
||||
for (k = 8; k < r10; k++)
|
||||
{
|
||||
if (gFacilityTrainerMons[gSaveBlock2Ptr->frontier.trainerIds[k]].species == gFacilityTrainerMons[monSetId].species)
|
||||
if (gFacilityTrainerMons[gSaveBlock2Ptr->frontier.trainerIds[k]].species == gFacilityTrainerMons[monId].species)
|
||||
break;
|
||||
if (species1 == gFacilityTrainerMons[monSetId].species)
|
||||
if (species1 == gFacilityTrainerMons[monId].species)
|
||||
break;
|
||||
if (species2 == gFacilityTrainerMons[monSetId].species)
|
||||
if (species2 == gFacilityTrainerMons[monId].species)
|
||||
break;
|
||||
}
|
||||
if (k == r10)
|
||||
break;
|
||||
}
|
||||
|
||||
gSaveBlock2Ptr->frontier.trainerIds[r10] = monSetId;
|
||||
gSaveBlock2Ptr->frontier.trainerIds[r10] = monId;
|
||||
r10++;
|
||||
}
|
||||
}
|
||||
@@ -2392,7 +2407,7 @@ static void LoadMultiPartnerCandidatesData(void)
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_81646BC(u16 trainerId, u16 monSetId)
|
||||
static void sub_81646BC(u16 trainerId, u16 monId)
|
||||
{
|
||||
u16 move = 0;
|
||||
u16 species = 0;
|
||||
@@ -2400,10 +2415,10 @@ static void sub_81646BC(u16 trainerId, u16 monSetId)
|
||||
|
||||
if (trainerId != TRAINER_EREADER)
|
||||
{
|
||||
if (trainerId < TRAINER_RECORD_MIXING_FRIEND)
|
||||
if (trainerId < FRONTIER_TRAINERS_COUNT)
|
||||
{
|
||||
move = gFacilityTrainerMons[monSetId].moves[0];
|
||||
species = gFacilityTrainerMons[monSetId].species;
|
||||
move = gFacilityTrainerMons[monId].moves[0];
|
||||
species = gFacilityTrainerMons[monId].species;
|
||||
}
|
||||
else if (trainerId < TRAINER_RECORD_MIXING_APPRENTICE)
|
||||
{
|
||||
@@ -2430,7 +2445,7 @@ static void sub_81646BC(u16 trainerId, u16 monSetId)
|
||||
static void ShowPartnerCandidateMessage(void)
|
||||
{
|
||||
s32 i, j, partnerId;
|
||||
s32 monSetId;
|
||||
s32 monId;
|
||||
s32 level = SetFacilityPtrsGetLevel();
|
||||
u16 winStreak = GetCurrentFacilityWinStreak();
|
||||
s32 challengeNum = winStreak / 7;
|
||||
@@ -2448,7 +2463,7 @@ static void ShowPartnerCandidateMessage(void)
|
||||
case PARTNER_MSGID_INTRO:
|
||||
if (trainerId == TRAINER_EREADER)
|
||||
return;
|
||||
if (trainerId < TRAINER_RECORD_MIXING_FRIEND)
|
||||
if (trainerId < FRONTIER_TRAINERS_COUNT)
|
||||
{
|
||||
GetFrontierTrainerName(gStringVar1, trainerId);
|
||||
}
|
||||
@@ -2468,16 +2483,16 @@ static void ShowPartnerCandidateMessage(void)
|
||||
}
|
||||
break;
|
||||
case PARTNER_MSGID_MON1:
|
||||
monSetId = gSaveBlock2Ptr->frontier.trainerIds[8 + k * 2];
|
||||
sub_81646BC(trainerId, monSetId);
|
||||
monId = gSaveBlock2Ptr->frontier.trainerIds[8 + k * 2];
|
||||
sub_81646BC(trainerId, monId);
|
||||
break;
|
||||
case PARTNER_MSGID_MON2_ASK:
|
||||
monSetId = gSaveBlock2Ptr->frontier.trainerIds[9 + k * 2];
|
||||
sub_81646BC(trainerId, monSetId);
|
||||
monId = gSaveBlock2Ptr->frontier.trainerIds[9 + k * 2];
|
||||
sub_81646BC(trainerId, monId);
|
||||
break;
|
||||
case PARTNER_MSGID_ACCEPT:
|
||||
gPartnerTrainerId = trainerId;
|
||||
if (trainerId < TRAINER_RECORD_MIXING_FRIEND)
|
||||
if (trainerId < FRONTIER_TRAINERS_COUNT)
|
||||
{
|
||||
gSaveBlock2Ptr->frontier.trainerIds[18] = gSaveBlock2Ptr->frontier.trainerIds[8 + k * 2];
|
||||
gSaveBlock2Ptr->frontier.trainerIds[19] = gSaveBlock2Ptr->frontier.trainerIds[9 + k * 2];
|
||||
@@ -2496,7 +2511,7 @@ static void ShowPartnerCandidateMessage(void)
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
i = sub_8162548(challengeNum, k / 2);
|
||||
i = GetRandomScaledFrontierTrainerId(challengeNum, k / 2);
|
||||
if (gPartnerTrainerId == i)
|
||||
continue;
|
||||
|
||||
@@ -2520,7 +2535,7 @@ static void ShowPartnerCandidateMessage(void)
|
||||
return;
|
||||
|
||||
// First check is redundant, only needs to make sure it's not an Apprentice
|
||||
if (trainerId < TRAINER_RECORD_MIXING_FRIEND)
|
||||
if (trainerId < FRONTIER_TRAINERS_COUNT)
|
||||
{
|
||||
ShowFieldMessage(sPartnerTrainerTextTables[partnerId].strings[gSpecialVar_0x8005]);
|
||||
}
|
||||
@@ -2575,7 +2590,7 @@ static void LoadLinkMultiOpponentsData(void)
|
||||
{
|
||||
do
|
||||
{
|
||||
trainerId = sub_8162548(challengeNum, i / 2);
|
||||
trainerId = GetRandomScaledFrontierTrainerId(challengeNum, i / 2);
|
||||
for (j = 0; j < i; j++)
|
||||
{
|
||||
if (gSaveBlock2Ptr->frontier.trainerIds[j] == trainerId)
|
||||
@@ -2908,13 +2923,13 @@ static void CopyEReaderTrainerFarewellMessage(void)
|
||||
FrontierSpeechToString(gSaveBlock2Ptr->frontier.ereaderTrainer.farewellPlayerLost);
|
||||
}
|
||||
|
||||
void sub_81653CC(void)
|
||||
void TryHideBattleTowerReporter(void)
|
||||
{
|
||||
if (gSaveBlock2Ptr->frontier.challengeStatus == CHALLENGE_STATUS_SAVING)
|
||||
sub_80F01B8();
|
||||
HideBattleTowerReporter();
|
||||
if (FlagGet(FLAG_CANCEL_BATTLE_ROOM_CHALLENGE) == TRUE)
|
||||
{
|
||||
sub_80F01B8();
|
||||
HideBattleTowerReporter();
|
||||
FlagClear(FLAG_CANCEL_BATTLE_ROOM_CHALLENGE);
|
||||
}
|
||||
}
|
||||
@@ -2926,7 +2941,7 @@ static void FillPartnerParty(u16 trainerId)
|
||||
s32 i, j;
|
||||
u32 ivs, level;
|
||||
u32 friendship;
|
||||
u16 monSetId;
|
||||
u16 monId;
|
||||
u32 otID;
|
||||
u8 trainerName[PLAYER_NAME_LENGTH + 1];
|
||||
SetFacilityPtrsGetLevel();
|
||||
@@ -2960,30 +2975,30 @@ static void FillPartnerParty(u16 trainerId)
|
||||
// Scrapped, lol.
|
||||
trainerName[0] = gGameLanguage;
|
||||
}
|
||||
else if (trainerId < TRAINER_RECORD_MIXING_FRIEND)
|
||||
else if (trainerId < FRONTIER_TRAINERS_COUNT)
|
||||
{
|
||||
level = SetFacilityPtrsGetLevel();
|
||||
ivs = GetFrontierTrainerFixedIvs(trainerId);
|
||||
otID = Random32();
|
||||
for (i = 0; i < 2; i++)
|
||||
{
|
||||
monSetId = gSaveBlock2Ptr->frontier.trainerIds[i + 18];
|
||||
monId = gSaveBlock2Ptr->frontier.trainerIds[i + 18];
|
||||
CreateMonWithEVSpreadNatureOTID(&gPlayerParty[3 + i],
|
||||
gFacilityTrainerMons[monSetId].species,
|
||||
gFacilityTrainerMons[monId].species,
|
||||
level,
|
||||
gFacilityTrainerMons[monSetId].nature,
|
||||
gFacilityTrainerMons[monId].nature,
|
||||
ivs,
|
||||
gFacilityTrainerMons[monSetId].evSpread,
|
||||
gFacilityTrainerMons[monId].evSpread,
|
||||
otID);
|
||||
friendship = 0xFF;
|
||||
friendship = MAX_FRIENDSHIP;
|
||||
for (j = 0; j < MAX_MON_MOVES; j++)
|
||||
{
|
||||
SetMonMoveSlot(&gPlayerParty[3 + i], gFacilityTrainerMons[monSetId].moves[j], j);
|
||||
if (gFacilityTrainerMons[monSetId].moves[j] == MOVE_FRUSTRATION)
|
||||
SetMonMoveSlot(&gPlayerParty[3 + i], gFacilityTrainerMons[monId].moves[j], j);
|
||||
if (gFacilityTrainerMons[monId].moves[j] == MOVE_FRUSTRATION)
|
||||
friendship = 0;
|
||||
}
|
||||
SetMonData(&gPlayerParty[3 + i], MON_DATA_FRIENDSHIP, &friendship);
|
||||
SetMonData(&gPlayerParty[3 + i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
|
||||
SetMonData(&gPlayerParty[3 + i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId]);
|
||||
for (j = 0; j < PLAYER_NAME_LENGTH + 1; j++)
|
||||
trainerName[j] = gFacilityTrainers[trainerId].trainerName[j];
|
||||
SetMonData(&gPlayerParty[3 + i], MON_DATA_OT_NAME, &trainerName);
|
||||
@@ -3164,7 +3179,7 @@ void GetBattleTowerTrainerLanguage(u8 *dst, u16 trainerId)
|
||||
{
|
||||
*dst = gGameLanguage;
|
||||
}
|
||||
else if (trainerId < TRAINER_RECORD_MIXING_FRIEND)
|
||||
else if (trainerId < FRONTIER_TRAINERS_COUNT)
|
||||
{
|
||||
*dst = gGameLanguage;
|
||||
}
|
||||
@@ -3237,28 +3252,30 @@ s32 GetHighestLevelInPlayerParty(void)
|
||||
return highestLevel;
|
||||
}
|
||||
|
||||
// Frontier Trainer parties are roughly scaled in difficulty with higher trainer IDs, so scale IVs as well
|
||||
// Duplicated in Battle Dome as GetDomeTrainerMonIvs
|
||||
static u8 GetFrontierTrainerFixedIvs(u16 trainerId)
|
||||
{
|
||||
u8 fixedIV = 0;
|
||||
u8 fixedIv;
|
||||
|
||||
if (trainerId < 100)
|
||||
fixedIV = 3;
|
||||
else if (trainerId < 120)
|
||||
fixedIV = 6;
|
||||
else if (trainerId < 140)
|
||||
fixedIV = 9;
|
||||
else if (trainerId < 160)
|
||||
fixedIV = 12;
|
||||
else if (trainerId < 180)
|
||||
fixedIV = 15;
|
||||
else if (trainerId < 200)
|
||||
fixedIV = 18;
|
||||
else if (trainerId < 220)
|
||||
fixedIV = 21;
|
||||
else
|
||||
fixedIV = 31;
|
||||
if (trainerId <= FRONTIER_TRAINER_JILL) // 0 - 99
|
||||
fixedIv = 3;
|
||||
else if (trainerId <= FRONTIER_TRAINER_CHLOE) // 100 - 119
|
||||
fixedIv = 6;
|
||||
else if (trainerId <= FRONTIER_TRAINER_SOFIA) // 120 - 139
|
||||
fixedIv = 9;
|
||||
else if (trainerId <= FRONTIER_TRAINER_JAZLYN) // 140 - 159
|
||||
fixedIv = 12;
|
||||
else if (trainerId <= FRONTIER_TRAINER_ALISON) // 160 - 179
|
||||
fixedIv = 15;
|
||||
else if (trainerId <= FRONTIER_TRAINER_LAMAR) // 180 - 199
|
||||
fixedIv = 18;
|
||||
else if (trainerId <= FRONTIER_TRAINER_TESS) // 200 - 219
|
||||
fixedIv = 21;
|
||||
else // 220+ (- 299)
|
||||
fixedIv = 31;
|
||||
|
||||
return fixedIV;
|
||||
return fixedIv;
|
||||
}
|
||||
|
||||
static u16 sub_8165D40(void)
|
||||
@@ -3280,19 +3297,19 @@ static u16 sub_8165D40(void)
|
||||
static u8 SetTentPtrsGetLevel(void)
|
||||
{
|
||||
u8 level = 30;
|
||||
u32 tentFacility = VarGet(VAR_FRONTIER_FACILITY);
|
||||
u32 facility = VarGet(VAR_FRONTIER_FACILITY);
|
||||
|
||||
if (tentFacility == TENT_SLATEPORT)
|
||||
if (facility == FRONTIER_FACILITY_FACTORY)
|
||||
{
|
||||
gFacilityTrainers = gSlateportBattleTentTrainers;
|
||||
gFacilityTrainerMons = gSlateportBattleTentMons;
|
||||
}
|
||||
else if (tentFacility == TENT_VERDANTURF)
|
||||
else if (facility == FRONTIER_FACILITY_PALACE)
|
||||
{
|
||||
gFacilityTrainers = gVerdanturfBattleTentTrainers;
|
||||
gFacilityTrainerMons = gVerdanturfBattleTentMons;
|
||||
}
|
||||
else if (tentFacility == TENT_FALLARBOR)
|
||||
else if (facility == FRONTIER_FACILITY_ARENA)
|
||||
{
|
||||
gFacilityTrainers = gFallarborBattleTentTrainers;
|
||||
gFacilityTrainerMons = gFallarborBattleTentMons;
|
||||
@@ -3339,19 +3356,19 @@ static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount)
|
||||
u8 level = SetTentPtrsGetLevel();
|
||||
u8 fixedIV = 0;
|
||||
u8 bfMonCount;
|
||||
const u16 *monSets = NULL;
|
||||
const u16 *monSet = NULL;
|
||||
u32 otID = 0;
|
||||
u16 monSetId;
|
||||
u16 monId;
|
||||
|
||||
monSets = gFacilityTrainers[gTrainerBattleOpponent_A].monSets;
|
||||
monSet = gFacilityTrainers[gTrainerBattleOpponent_A].monSet;
|
||||
|
||||
bfMonCount = 0;
|
||||
monSetId = monSets[bfMonCount];
|
||||
while (monSetId != 0xFFFF)
|
||||
monId = monSet[bfMonCount];
|
||||
while (monId != 0xFFFF)
|
||||
{
|
||||
bfMonCount++;
|
||||
monSetId = monSets[bfMonCount];
|
||||
if (monSetId == 0xFFFF)
|
||||
monId = monSet[bfMonCount];
|
||||
if (monId == 0xFFFF)
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -3359,12 +3376,12 @@ static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount)
|
||||
otID = Random32();
|
||||
while (i != monCount)
|
||||
{
|
||||
u16 monSetId = monSets[Random() % bfMonCount];
|
||||
u16 monId = monSet[Random() % bfMonCount];
|
||||
|
||||
// Ensure this pokemon species isn't a duplicate.
|
||||
for (j = 0; j < i + firstMonId; j++)
|
||||
{
|
||||
if (GetMonData(&gEnemyParty[j], MON_DATA_SPECIES, NULL) == gFacilityTrainerMons[monSetId].species)
|
||||
if (GetMonData(&gEnemyParty[j], MON_DATA_SPECIES, NULL) == gFacilityTrainerMons[monId].species)
|
||||
break;
|
||||
}
|
||||
if (j != i + firstMonId)
|
||||
@@ -3374,7 +3391,7 @@ static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount)
|
||||
for (j = 0; j < i + firstMonId; j++)
|
||||
{
|
||||
if (GetMonData(&gEnemyParty[j], MON_DATA_HELD_ITEM, NULL) != 0
|
||||
&& GetMonData(&gEnemyParty[j], MON_DATA_HELD_ITEM, NULL) == gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId])
|
||||
&& GetMonData(&gEnemyParty[j], MON_DATA_HELD_ITEM, NULL) == gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId])
|
||||
break;
|
||||
}
|
||||
if (j != i + firstMonId)
|
||||
@@ -3384,34 +3401,34 @@ static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount)
|
||||
// because the species and held items were already checked directly above.
|
||||
for (j = 0; j < i; j++)
|
||||
{
|
||||
if (chosenMonIndices[j] == monSetId)
|
||||
if (chosenMonIndices[j] == monId)
|
||||
break;
|
||||
}
|
||||
if (j != i)
|
||||
continue;
|
||||
|
||||
chosenMonIndices[i] = monSetId;
|
||||
chosenMonIndices[i] = monId;
|
||||
|
||||
// Place the chosen pokemon into the trainer's party.
|
||||
CreateMonWithEVSpreadNatureOTID(&gEnemyParty[i + firstMonId],
|
||||
gFacilityTrainerMons[monSetId].species,
|
||||
gFacilityTrainerMons[monId].species,
|
||||
level,
|
||||
gFacilityTrainerMons[monSetId].nature,
|
||||
gFacilityTrainerMons[monId].nature,
|
||||
fixedIV,
|
||||
gFacilityTrainerMons[monSetId].evSpread,
|
||||
gFacilityTrainerMons[monId].evSpread,
|
||||
otID);
|
||||
|
||||
friendship = 255;
|
||||
friendship = MAX_FRIENDSHIP;
|
||||
// Give the chosen pokemon its specified moves.
|
||||
for (j = 0; j < MAX_MON_MOVES; j++)
|
||||
{
|
||||
SetMonMoveSlot(&gEnemyParty[i + firstMonId], gFacilityTrainerMons[monSetId].moves[j], j);
|
||||
if (gFacilityTrainerMons[monSetId].moves[j] == MOVE_FRUSTRATION)
|
||||
SetMonMoveSlot(&gEnemyParty[i + firstMonId], gFacilityTrainerMons[monId].moves[j], j);
|
||||
if (gFacilityTrainerMons[monId].moves[j] == MOVE_FRUSTRATION)
|
||||
friendship = 0; // Frustration is more powerful the lower the pokemon's friendship is.
|
||||
}
|
||||
|
||||
SetMonData(&gEnemyParty[i + firstMonId], MON_DATA_FRIENDSHIP, &friendship);
|
||||
SetMonData(&gEnemyParty[i + firstMonId], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
|
||||
SetMonData(&gEnemyParty[i + firstMonId], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId]);
|
||||
|
||||
// The pokemon was successfully added to the trainer's party, so it's safe to move on to
|
||||
// the next party slot.
|
||||
|
||||
+5
-4
@@ -592,7 +592,7 @@ void TryTradeLinkup(void)
|
||||
sub_80B236C(2, 2);
|
||||
}
|
||||
|
||||
void sub_80B2E74(void)
|
||||
void TryRecordMixLinkup(void)
|
||||
{
|
||||
gSpecialVar_Result = 0;
|
||||
gLinkType = LINKTYPE_0x3311;
|
||||
@@ -784,7 +784,8 @@ static void sub_80B3220(u8 taskId)
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80B3254(void)
|
||||
// Unused
|
||||
void CableClubSaveGame(void)
|
||||
{
|
||||
SaveGame();
|
||||
}
|
||||
@@ -1298,10 +1299,10 @@ void sub_80B3AF8(u8 taskId)
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80B3BC4(void)
|
||||
void TrySetBattleTowerLinkType(void)
|
||||
{
|
||||
if (gWirelessCommType == 0)
|
||||
{
|
||||
gLinkType = LINKTYPE_0x2288;
|
||||
gLinkType = LINKTYPE_BATTLE_TOWER;
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -5093,7 +5093,7 @@ static void sub_80DE864(u8 a)
|
||||
gContestResources->field_18->unk4_0 = 1;
|
||||
break;
|
||||
case MOVE_RETURN:
|
||||
gAnimFriendship = 0xFF;
|
||||
gAnimFriendship = MAX_FRIENDSHIP;
|
||||
break;
|
||||
case MOVE_FRUSTRATION:
|
||||
gAnimFriendship = 0;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+1035
-1035
File diff suppressed because it is too large
Load Diff
+2
-1
@@ -2154,7 +2154,8 @@ void sub_8129708(void)
|
||||
}
|
||||
}
|
||||
|
||||
void sub_81297AC(void)
|
||||
// Unused
|
||||
void GetEventObjectLocalIdByFlag(void)
|
||||
{
|
||||
u8 i;
|
||||
|
||||
|
||||
+3
-3
@@ -25,12 +25,12 @@ void InitDewfordTrend(void)
|
||||
|
||||
for (i = 0; i < 5; i++)
|
||||
{
|
||||
gSaveBlock1Ptr->easyChatPairs[i].words[0] = sub_811EE38(EC_GROUP_CONDITIONS);
|
||||
gSaveBlock1Ptr->easyChatPairs[i].words[0] = GetRandomEasyChatWordFromGroup(EC_GROUP_CONDITIONS);
|
||||
|
||||
if (Random() & 1)
|
||||
gSaveBlock1Ptr->easyChatPairs[i].words[1] = sub_811EE38(EC_GROUP_LIFESTYLE);
|
||||
gSaveBlock1Ptr->easyChatPairs[i].words[1] = GetRandomEasyChatWordFromGroup(EC_GROUP_LIFESTYLE);
|
||||
else
|
||||
gSaveBlock1Ptr->easyChatPairs[i].words[1] = sub_811EE38(EC_GROUP_HOBBIES);
|
||||
gSaveBlock1Ptr->easyChatPairs[i].words[1] = GetRandomEasyChatWordFromGroup(EC_GROUP_HOBBIES);
|
||||
|
||||
gSaveBlock1Ptr->easyChatPairs[i].unk1_6 = Random() & 1;
|
||||
sub_8122B28(&(gSaveBlock1Ptr->easyChatPairs[i]));
|
||||
|
||||
+16
-15
@@ -222,7 +222,7 @@ static void sub_811E1A4(s8, s8);
|
||||
static void sub_811E2DC(struct Sprite *);
|
||||
static void sub_811E34C(u8, u8);
|
||||
static bool8 EasyChatIsNationalPokedexEnabled(void);
|
||||
static u16 sub_811F108(void);
|
||||
static u16 GetRandomUnlockedEasyChatPokemon(void);
|
||||
static void sub_811F2D4(void);
|
||||
static void sub_811F46C(void);
|
||||
static u8 *CopyEasyChatWordPadded(u8 *, u16, u16);
|
||||
@@ -5039,24 +5039,24 @@ static u16 GetEasyChatWordStringLength(u16 easyChatWord)
|
||||
}
|
||||
}
|
||||
|
||||
bool8 sub_811EDC4(const u16 *easyChatWords, u8 arg1, u8 arg2, u16 arg3)
|
||||
static bool8 CanPhraseFitInXRowsYCols(const u16 *easyChatWords, u8 numRows, u8 numColumns, u16 maxLength)
|
||||
{
|
||||
u8 i, j;
|
||||
|
||||
for (i = 0; i < arg2; i++)
|
||||
for (i = 0; i < numColumns; i++)
|
||||
{
|
||||
u16 totalLength = arg1 - 1;
|
||||
for (j = 0; j < arg1; j++)
|
||||
u16 totalLength = numRows - 1;
|
||||
for (j = 0; j < numRows; j++)
|
||||
totalLength += GetEasyChatWordStringLength(*(easyChatWords++));
|
||||
|
||||
if (totalLength > arg3)
|
||||
if (totalLength > maxLength)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
u16 sub_811EE38(u16 groupId)
|
||||
u16 GetRandomEasyChatWordFromGroup(u16 groupId)
|
||||
{
|
||||
u16 index = Random() % gEasyChatGroups[groupId].numWords;
|
||||
if (groupId == EC_GROUP_POKEMON
|
||||
@@ -5070,18 +5070,18 @@ u16 sub_811EE38(u16 groupId)
|
||||
return EC_WORD(groupId, index);
|
||||
}
|
||||
|
||||
u16 sub_811EE90(u16 groupId)
|
||||
u16 GetRandomEasyChatWordFromUnlockedGroup(u16 groupId)
|
||||
{
|
||||
if (!IsEasyChatGroupUnlocked(groupId))
|
||||
return 0xFFFF;
|
||||
|
||||
if (groupId == EC_GROUP_POKEMON)
|
||||
return sub_811F108();
|
||||
return GetRandomUnlockedEasyChatPokemon();
|
||||
|
||||
return sub_811EE38(groupId);
|
||||
return GetRandomEasyChatWordFromGroup(groupId);
|
||||
}
|
||||
|
||||
void sub_811EECC(void)
|
||||
void ShowEasyChatProfile(void)
|
||||
{
|
||||
u16 *easyChatWords;
|
||||
int columns, rows;
|
||||
@@ -5094,7 +5094,7 @@ void sub_811EECC(void)
|
||||
break;
|
||||
case 1:
|
||||
easyChatWords = gSaveBlock1Ptr->easyChatBattleStart;
|
||||
if (sub_811EDC4(gSaveBlock1Ptr->easyChatBattleStart, 3, 2, 18))
|
||||
if (CanPhraseFitInXRowsYCols(gSaveBlock1Ptr->easyChatBattleStart, 3, 2, 18))
|
||||
{
|
||||
columns = 2;
|
||||
rows = 3;
|
||||
@@ -5123,10 +5123,11 @@ void sub_811EECC(void)
|
||||
ShowFieldAutoScrollMessage(gStringVar4);
|
||||
}
|
||||
|
||||
void sub_811EF6C(void)
|
||||
// The phrase that a man in Dewford Hall suggests has a "deep link" to the current trendy phrase
|
||||
void BufferDeepLinkPhrase(void)
|
||||
{
|
||||
int groupId = Random() & 1 ? EC_GROUP_HOBBIES : EC_GROUP_LIFESTYLE;
|
||||
u16 easyChatWord = sub_811EE90(groupId);
|
||||
u16 easyChatWord = GetRandomEasyChatWordFromUnlockedGroup(groupId);
|
||||
CopyEasyChatWord(gStringVar2, easyChatWord);
|
||||
}
|
||||
|
||||
@@ -5217,7 +5218,7 @@ static bool8 EasyChatIsNationalPokedexEnabled(void)
|
||||
return IsNationalPokedexEnabled();
|
||||
}
|
||||
|
||||
static u16 sub_811F108(void)
|
||||
static u16 GetRandomUnlockedEasyChatPokemon(void)
|
||||
{
|
||||
u16 i;
|
||||
u16 numWords;
|
||||
|
||||
@@ -473,7 +473,7 @@ static bool32 TryWriteTrainerHill_r(struct EReaderTrainerHillSet *ttdata, struct
|
||||
}
|
||||
|
||||
buffer2->checksum = CalcByteArraySum((u8 *)buffer2->floors, 4 * sizeof(struct TrHillFloor));
|
||||
if (TryWriteSpecialSaveSection(SECTOR_ID_TRAINER_HILL, (u8 *)buffer2) != 1)
|
||||
if (TryWriteSpecialSaveSection(SECTOR_ID_TRAINER_HILL, (u8 *)buffer2) != SAVE_STATUS_OK)
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
@@ -487,13 +487,13 @@ bool32 TryWriteTrainerHill(struct EReaderTrainerHillSet *arg0)
|
||||
return result;
|
||||
}
|
||||
|
||||
static bool32 TryReadTrainerHill_r(struct EReaderTrainerHillSet *arg0, u8 *arg1)
|
||||
static bool32 TryReadTrainerHill_r(struct EReaderTrainerHillSet *dst, u8 *buffer)
|
||||
{
|
||||
if (TryReadSpecialSaveSection(SECTOR_ID_TRAINER_HILL, arg1) != 1)
|
||||
if (TryReadSpecialSaveSection(SECTOR_ID_TRAINER_HILL, buffer) != SAVE_STATUS_OK)
|
||||
return FALSE;
|
||||
|
||||
memcpy(arg0, arg1, sizeof(struct EReaderTrainerHillSet));
|
||||
if (!TrainerHill_VerifyChecksum(arg0))
|
||||
memcpy(dst, buffer, sizeof(struct EReaderTrainerHillSet));
|
||||
if (!TrainerHill_VerifyChecksum(dst))
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
|
||||
@@ -423,23 +423,23 @@ static const u8 *GetInteractedMetatileScript(struct MapPosition *position, u8 me
|
||||
return SecretBase_EventScript_ShieldOrToyTV;
|
||||
if (MetatileBehavior_IsMB_C6(metatileBehavior) == TRUE)
|
||||
{
|
||||
SetSecretBaseSecretsTvFlags_MiscFurnature();
|
||||
CheckInteractedWithFriendsFurnitureBottom();
|
||||
return NULL;
|
||||
}
|
||||
if (MetatileBehavior_HoldsLargeDecoration(metatileBehavior) == TRUE)
|
||||
{
|
||||
SetSecretBaseSecretsTvFlags_LargeDecorationSpot();
|
||||
CheckInteractedWithFriendsFurnitureMiddle();
|
||||
return NULL;
|
||||
}
|
||||
if (MetatileBehavior_HoldsSmallDecoration(metatileBehavior) == TRUE)
|
||||
{
|
||||
SetSecretBaseSecretsTvFlags_SmallDecorationSpot();
|
||||
CheckInteractedWithFriendsFurnitureTop();
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
else if (MetatileBehavior_IsSecretBasePoster(metatileBehavior) == TRUE)
|
||||
{
|
||||
SetSecretBaseSecretsTvFlags_Poster();
|
||||
CheckInteractedWithFriendsPosterDecor();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -995,7 +995,7 @@ u16 GetWeekCount(void)
|
||||
u8 GetLeadMonFriendshipScore(void)
|
||||
{
|
||||
struct Pokemon *pokemon = &gPlayerParty[GetLeadMonIndex()];
|
||||
if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) == 255)
|
||||
if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) == MAX_FRIENDSHIP)
|
||||
{
|
||||
return 6;
|
||||
}
|
||||
@@ -1221,18 +1221,18 @@ void EndLotteryCornerComputerEffect(void)
|
||||
DrawWholeMapView();
|
||||
}
|
||||
|
||||
void SetTrickHouseEndRoomFlag(void)
|
||||
void SetTrickHouseNuggetFlag(void)
|
||||
{
|
||||
u16 *specVar = &gSpecialVar_0x8004;
|
||||
u16 flag = FLAG_TRICK_HOUSE_END_ROOM;
|
||||
u16 flag = FLAG_HIDDEN_ITEM_TRICK_HOUSE_NUGGET;
|
||||
*specVar = flag;
|
||||
FlagSet(flag);
|
||||
}
|
||||
|
||||
void ResetTrickHouseEndRoomFlag(void)
|
||||
void ResetTrickHouseNuggetFlag(void)
|
||||
{
|
||||
u16 *specVar = &gSpecialVar_0x8004;
|
||||
u16 flag = FLAG_TRICK_HOUSE_END_ROOM;
|
||||
u16 flag = FLAG_HIDDEN_ITEM_TRICK_HOUSE_NUGGET;
|
||||
*specVar = flag;
|
||||
FlagClear(flag);
|
||||
}
|
||||
|
||||
+43
-41
@@ -20,9 +20,11 @@
|
||||
#include "string_util.h"
|
||||
#include "constants/field_effects.h"
|
||||
#include "constants/metatile_behaviors.h"
|
||||
#include "constants/songs.h"
|
||||
#include "constants/vars.h"
|
||||
#include "constants/metatile_labels.h"
|
||||
#include "constants/songs.h"
|
||||
#include "constants/tv.h"
|
||||
#include "constants/vars.h"
|
||||
|
||||
|
||||
EWRAM_DATA struct MapPosition gPlayerFacingPosition = {0};
|
||||
|
||||
@@ -801,16 +803,16 @@ static void Task_SecretBasePCTurnOn(u8 taskId)
|
||||
{
|
||||
case 4:
|
||||
case 12:
|
||||
MapGridSetMetatileIdAt(data[0], data[1], 0x224);
|
||||
MapGridSetMetatileIdAt(data[0], data[1], METATILE_SecretBase_PC_On);
|
||||
CurrentMapDrawMetatileAt(data[0], data[1]);
|
||||
break;
|
||||
case 8:
|
||||
case 16:
|
||||
MapGridSetMetatileIdAt(data[0], data[1], 0x220);
|
||||
MapGridSetMetatileIdAt(data[0], data[1], METATILE_SecretBase_PC);
|
||||
CurrentMapDrawMetatileAt(data[0], data[1]);
|
||||
break;
|
||||
case 20:
|
||||
MapGridSetMetatileIdAt(data[0], data[1], 0x224);
|
||||
MapGridSetMetatileIdAt(data[0], data[1], METATILE_SecretBase_PC_On);
|
||||
CurrentMapDrawMetatileAt(data[0], data[1]);
|
||||
FieldEffectActiveListRemove(FLDEFF_PCTURN_ON);
|
||||
EnableBothScriptContexts();
|
||||
@@ -829,9 +831,9 @@ void DoSecretBasePCTurnOffEffect(void)
|
||||
PlaySE(SE_PC_OFF);
|
||||
|
||||
if (!VarGet(VAR_CURRENT_SECRET_BASE))
|
||||
MapGridSetMetatileIdAt(x, y, 0x220 | METATILE_COLLISION_MASK);
|
||||
MapGridSetMetatileIdAt(x, y, METATILE_SecretBase_PC | METATILE_COLLISION_MASK);
|
||||
else
|
||||
MapGridSetMetatileIdAt(x, y, 0x221 | METATILE_COLLISION_MASK);
|
||||
MapGridSetMetatileIdAt(x, y, METATILE_SecretBase_RegisterPC | METATILE_COLLISION_MASK);
|
||||
|
||||
CurrentMapDrawMetatileAt(x, y);
|
||||
}
|
||||
@@ -875,16 +877,16 @@ static void DoBalloonSoundEffect(s16 metatileId)
|
||||
{
|
||||
switch (metatileId)
|
||||
{
|
||||
case 824:
|
||||
case METATILE_SecretBase_RedBalloon:
|
||||
PlaySE(SE_FUUSEN1);
|
||||
break;
|
||||
case 828:
|
||||
case METATILE_SecretBase_BlueBalloon:
|
||||
PlaySE(SE_FUUSEN2);
|
||||
break;
|
||||
case 832:
|
||||
case METATILE_SecretBase_YellowBalloon:
|
||||
PlaySE(SE_FUUSEN3);
|
||||
break;
|
||||
case 552:
|
||||
case METATILE_SecretBase_MudBall:
|
||||
PlaySE(SE_TOY_DANGO);
|
||||
break;
|
||||
}
|
||||
@@ -903,8 +905,8 @@ bool8 FldEff_NopA700(void)
|
||||
static void DoSecretBaseBreakableDoorEffect(s16 x, s16 y)
|
||||
{
|
||||
PlaySE(SE_TOY_KABE);
|
||||
MapGridSetMetatileIdAt(x, y, 0x276);
|
||||
MapGridSetMetatileIdAt(x, y - 1, 0x26E);
|
||||
MapGridSetMetatileIdAt(x, y, METATILE_SecretBase_BreakableDoor_BottomOpen);
|
||||
MapGridSetMetatileIdAt(x, y - 1, METATILE_SecretBase_BreakableDoor_TopOpen);
|
||||
CurrentMapDrawMetatileAt(x, y);
|
||||
CurrentMapDrawMetatileAt(x, y - 1);
|
||||
}
|
||||
@@ -946,28 +948,28 @@ static void Task_SecretBaseMusicNoteMatSound(u8 taskId)
|
||||
{
|
||||
switch (gTasks[taskId].tMetatileID)
|
||||
{
|
||||
case 632:
|
||||
case METATILE_SecretBase_NoteMat_C:
|
||||
PlaySE(SE_TOY_C);
|
||||
break;
|
||||
case 633:
|
||||
case METATILE_SecretBase_NoteMat_D:
|
||||
PlaySE(SE_TOY_D);
|
||||
break;
|
||||
case 634:
|
||||
case METATILE_SecretBase_NoteMat_E:
|
||||
PlaySE(SE_TOY_E);
|
||||
break;
|
||||
case 635:
|
||||
case METATILE_SecretBase_NoteMat_F:
|
||||
PlaySE(SE_TOY_F);
|
||||
break;
|
||||
case 636:
|
||||
case METATILE_SecretBase_NoteMat_G:
|
||||
PlaySE(SE_TOY_G);
|
||||
break;
|
||||
case 637:
|
||||
case METATILE_SecretBase_NoteMat_A:
|
||||
PlaySE(SE_TOY_A);
|
||||
break;
|
||||
case 638:
|
||||
case METATILE_SecretBase_NoteMat_B:
|
||||
PlaySE(SE_TOY_B);
|
||||
break;
|
||||
case 691:
|
||||
case METATILE_SecretBase_NoteMat_C_Sharp:
|
||||
PlaySE(SE_TOY_C1);
|
||||
break;
|
||||
}
|
||||
@@ -1071,12 +1073,12 @@ static void SpriteCB_SandPillar_0(struct Sprite *sprite)
|
||||
{
|
||||
PlaySE(SE_W088);
|
||||
|
||||
if (MapGridGetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1) == 646)
|
||||
MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1, 3586);
|
||||
if (MapGridGetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1) == METATILE_SecretBase_SandOrnament_TopWall)
|
||||
MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1, METATILE_SecretBase_Wall_TopMid | METATILE_COLLISION_MASK);
|
||||
else
|
||||
MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1, 644);
|
||||
MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1, METATILE_SecretBase_SandOrnament_BrokenTop);
|
||||
|
||||
MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6], 522);
|
||||
MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6], METATILE_SecretBase_Ground);
|
||||
CurrentMapDrawMetatileAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1);
|
||||
CurrentMapDrawMetatileAt(gFieldEffectArguments[5], gFieldEffectArguments[6]);
|
||||
|
||||
@@ -1092,7 +1094,7 @@ static void SpriteCB_SandPillar_1(struct Sprite *sprite)
|
||||
}
|
||||
else
|
||||
{
|
||||
MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6], 3724);
|
||||
MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6], METATILE_SecretBase_SandOrnament_BrokenBase | METATILE_COLLISION_MASK);
|
||||
CurrentMapDrawMetatileAt(gFieldEffectArguments[5], gFieldEffectArguments[6]);
|
||||
sprite->data[0] = 0;
|
||||
sprite->callback = SpriteCB_SandPillar_2;
|
||||
@@ -1105,7 +1107,7 @@ static void SpriteCB_SandPillar_2(struct Sprite *sprite)
|
||||
EnableBothScriptContexts();
|
||||
}
|
||||
|
||||
void GetShieldToyTVDecorationInfo(void)
|
||||
void InteractWithShieldOrTVDecoration(void)
|
||||
{
|
||||
s16 x, y;
|
||||
s32 metatileId;
|
||||
@@ -1116,7 +1118,7 @@ void GetShieldToyTVDecorationInfo(void)
|
||||
|
||||
switch (metatileId)
|
||||
{
|
||||
case 822:
|
||||
case METATILE_SecretBase_GoldShield_Base1:
|
||||
ConvertIntToDecimalStringN(gStringVar1, 100, STR_CONV_MODE_LEFT_ALIGN, 3);
|
||||
StringCopy(gStringVar2, gText_Gold);
|
||||
|
||||
@@ -1125,9 +1127,9 @@ void GetShieldToyTVDecorationInfo(void)
|
||||
if (!VarGet(VAR_CURRENT_SECRET_BASE))
|
||||
return;
|
||||
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | 0x10);
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | SECRET_BASE_USED_GOLD_SHIELD);
|
||||
break;
|
||||
case 734:
|
||||
case METATILE_SecretBase_SilverShield_Base1:
|
||||
ConvertIntToDecimalStringN(gStringVar1, 50, STR_CONV_MODE_LEFT_ALIGN, 2);
|
||||
StringCopy(gStringVar2, gText_Silver);
|
||||
|
||||
@@ -1136,31 +1138,31 @@ void GetShieldToyTVDecorationInfo(void)
|
||||
if (!VarGet(VAR_CURRENT_SECRET_BASE))
|
||||
return;
|
||||
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | 0x20);
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | SECRET_BASE_USED_SILVER_SHIELD);
|
||||
break;
|
||||
case 756:
|
||||
case METATILE_SecretBase_TV:
|
||||
gSpecialVar_Result = 1;
|
||||
|
||||
if (!VarGet(VAR_CURRENT_SECRET_BASE))
|
||||
return;
|
||||
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | 0x80);
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | SECRET_BASE_USED_TV);
|
||||
break;
|
||||
case 757:
|
||||
case METATILE_SecretBase_RoundTV:
|
||||
gSpecialVar_Result = 2;
|
||||
|
||||
if (!VarGet(VAR_CURRENT_SECRET_BASE))
|
||||
return;
|
||||
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | 0x80);
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | SECRET_BASE_USED_TV);
|
||||
break;
|
||||
case 758:
|
||||
case METATILE_SecretBase_CuteTV:
|
||||
gSpecialVar_Result = 3;
|
||||
|
||||
if (!VarGet(VAR_CURRENT_SECRET_BASE))
|
||||
return;
|
||||
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | 0x80);
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | SECRET_BASE_USED_TV);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1172,16 +1174,16 @@ bool8 sub_80FADE4(u16 metatileId, u8 arg1)
|
||||
|
||||
if (!arg1)
|
||||
{
|
||||
if (metatileId == 0x285 || metatileId == 0x286)
|
||||
if (metatileId == METATILE_SecretBase_SandOrnament_Top || metatileId == METATILE_SecretBase_SandOrnament_TopWall)
|
||||
return TRUE;
|
||||
if (metatileId == 0x237)
|
||||
if (metatileId == METATILE_SecretBase_BreakableDoor_TopClosed)
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (metatileId == 0x28d)
|
||||
if (metatileId == METATILE_SecretBase_SandOrnament_Base1)
|
||||
return TRUE;
|
||||
if (metatileId == 0x23F)
|
||||
if (metatileId == METATILE_SecretBase_BreakableDoor_BottomClosed)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
+10
-10
@@ -1701,7 +1701,7 @@ void CopyFrontierTrainerText(u8 whichText, u16 trainerId)
|
||||
FrontierSpeechToString(gSaveBlock2Ptr->frontier.ereaderTrainer.greeting);
|
||||
else if (trainerId == TRAINER_FRONTIER_BRAIN)
|
||||
CopyFrontierBrainText(FALSE);
|
||||
else if (trainerId < TRAINER_RECORD_MIXING_FRIEND)
|
||||
else if (trainerId < FRONTIER_TRAINERS_COUNT)
|
||||
FrontierSpeechToString(gFacilityTrainers[trainerId].speechBefore);
|
||||
else if (trainerId < TRAINER_RECORD_MIXING_APPRENTICE)
|
||||
FrontierSpeechToString(gSaveBlock2Ptr->frontier.towerRecords[trainerId - TRAINER_RECORD_MIXING_FRIEND].greeting);
|
||||
@@ -1717,7 +1717,7 @@ void CopyFrontierTrainerText(u8 whichText, u16 trainerId)
|
||||
{
|
||||
CopyFrontierBrainText(FALSE);
|
||||
}
|
||||
else if (trainerId < TRAINER_RECORD_MIXING_FRIEND)
|
||||
else if (trainerId < FRONTIER_TRAINERS_COUNT)
|
||||
{
|
||||
FrontierSpeechToString(gFacilityTrainers[trainerId].speechWin);
|
||||
}
|
||||
@@ -1745,7 +1745,7 @@ void CopyFrontierTrainerText(u8 whichText, u16 trainerId)
|
||||
{
|
||||
CopyFrontierBrainText(TRUE);
|
||||
}
|
||||
else if (trainerId < TRAINER_RECORD_MIXING_FRIEND)
|
||||
else if (trainerId < FRONTIER_TRAINERS_COUNT)
|
||||
{
|
||||
FrontierSpeechToString(gFacilityTrainers[trainerId].speechLose);
|
||||
}
|
||||
@@ -2490,7 +2490,7 @@ void SetFrontierBrainObjEventGfx_2(void)
|
||||
void CreateFrontierBrainPokemon(void)
|
||||
{
|
||||
s32 i, j;
|
||||
s32 monCountInBits;
|
||||
s32 selectedMonBits;
|
||||
s32 monPartyId;
|
||||
s32 monLevel = 0;
|
||||
u8 friendship;
|
||||
@@ -2498,16 +2498,16 @@ void CreateFrontierBrainPokemon(void)
|
||||
s32 symbol = GetFronterBrainSymbol();
|
||||
|
||||
if (facility == FRONTIER_FACILITY_DOME)
|
||||
monCountInBits = GetDomeTrainerMonCountInBits(TrainerIdToDomeTournamentId(TRAINER_FRONTIER_BRAIN));
|
||||
selectedMonBits = GetDomeTrainerSelectedMons(TrainerIdToDomeTournamentId(TRAINER_FRONTIER_BRAIN));
|
||||
else
|
||||
monCountInBits = 7;
|
||||
selectedMonBits = (1 << FRONTIER_PARTY_SIZE) - 1; // all 3 mons selected
|
||||
|
||||
ZeroEnemyPartyMons();
|
||||
monPartyId = 0;
|
||||
monLevel = SetFacilityPtrsGetLevel();
|
||||
for (i = 0; i < 3; monCountInBits >>= 1, i++)
|
||||
for (i = 0; i < FRONTIER_PARTY_SIZE; selectedMonBits >>= 1, i++)
|
||||
{
|
||||
if (!(monCountInBits & 1))
|
||||
if (!(selectedMonBits & 1))
|
||||
continue;
|
||||
|
||||
do
|
||||
@@ -2523,7 +2523,7 @@ void CreateFrontierBrainPokemon(void)
|
||||
SetMonData(&gEnemyParty[monPartyId], MON_DATA_HELD_ITEM, &sFrontierBrainsMons[facility][symbol][i].heldItem);
|
||||
for (j = 0; j < NUM_STATS; j++)
|
||||
SetMonData(&gEnemyParty[monPartyId], MON_DATA_HP_EV + j, &sFrontierBrainsMons[facility][symbol][i].evs[j]);
|
||||
friendship = 0xFF;
|
||||
friendship = MAX_FRIENDSHIP;
|
||||
for (j = 0; j < MAX_MON_MOVES; j++)
|
||||
{
|
||||
SetMonMoveSlot(&gEnemyParty[monPartyId], sFrontierBrainsMons[facility][symbol][i].moves[j], j);
|
||||
@@ -2560,7 +2560,7 @@ void CreateFrontierBrainPokemon(void)
|
||||
bl TrainerIdToDomeTournamentId\n\
|
||||
lsls r0, 16\n\
|
||||
lsrs r0, 16\n\
|
||||
bl GetDomeTrainerMonCountInBits\n\
|
||||
bl GetDomeTrainerSelectedMons\n\
|
||||
adds r4, r0, 0\n\
|
||||
b _081A4E46\n\
|
||||
.pool\n\
|
||||
|
||||
+13
-19
@@ -964,25 +964,19 @@ const u32 gVsLettersGfx[] = INCBIN_U32("graphics/battle_transitions/vs.4bpp.lz")
|
||||
|
||||
#include "data/graphics/battle_terrain.h"
|
||||
|
||||
const u32 gUnknown_08D82F10[] = INCBIN_U32("graphics/battle_frontier/tourney_bg.4bpp.lz");
|
||||
const u32 gUnknown_08D834FC[] = INCBIN_U32("graphics/battle_frontier/tourney_line.4bpp.lz"); // the red glow mask for the tourney advancement lines
|
||||
|
||||
const u32 gUnknown_08D83900[] = INCBIN_U32("graphics/unknown/unknown_D83900.bin.lz"); // tilemaps likely
|
||||
|
||||
const u32 gUnknown_08D83B2C[] = INCBIN_U32("graphics/unknown/unknown_D83B2C.bin.lz");
|
||||
|
||||
const u32 gUnknown_08D83C3C[] = INCBIN_U32("graphics/unknown/unknown_D83C3C.bin.lz");
|
||||
|
||||
const u32 gUnknown_08D83D50[] = INCBIN_U32("graphics/battle_frontier/misc1.4bpp.lz");
|
||||
|
||||
const u32 gUnknown_08D84970[] = INCBIN_U32("graphics/unknown/unknown_D84970.bin.lz");
|
||||
|
||||
const u32 gUnknown_08D84F00[] = INCBIN_U32("graphics/unknown/unknown_D84F00.bin.lz");
|
||||
|
||||
const u32 gBattleFrontierGfx_DomeOptions[] = INCBIN_U32("graphics/battle_frontier/options.4bpp.lz");
|
||||
const u32 gUnknown_08D85358[] = INCBIN_U32("graphics/battle_frontier/options_pal1.gbapal.lz");
|
||||
const u32 gUnknown_08D85444[] = INCBIN_U32("graphics/battle_frontier/options_pal2.gbapal.lz"); // pokeball pal
|
||||
const u32 gUnknown_08D854C8[] = INCBIN_U32("graphics/battle_frontier/options_pal3.gbapal.lz"); // arrow pal
|
||||
// Battle Dome
|
||||
const u32 gDomeTourneyBg_Gfx[] = INCBIN_U32("graphics/battle_frontier/tourney_bg.4bpp.lz");
|
||||
const u32 gDomeTourneyLine_Gfx[] = INCBIN_U32("graphics/battle_frontier/tourney_line.4bpp.lz"); // the red glow mask for the tourney advancement lines
|
||||
const u32 gDomeTourneyLineMask_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_line_mask_map.bin.lz");
|
||||
const u32 gDomeTourneyLineDown_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_line_down_map.bin.lz");
|
||||
const u32 gDomeTourneyLineUp_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_line_up_map.bin.lz");
|
||||
const u32 gDomeTourneyInfoCard_Gfx[] = INCBIN_U32("graphics/battle_frontier/tourney_info_card.4bpp.lz");
|
||||
const u32 gDomeTourneyInfoCard_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_info_card_tilemap.bin.lz");
|
||||
const u32 gDomeTourneyInfoCardBg_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_info_card_bg.bin.lz");
|
||||
const u32 gDomeTourneyTreeButtons_Gfx[] = INCBIN_U32("graphics/battle_frontier/tourney_buttons.4bpp.lz"); // exit/cancel and pokeball buttons
|
||||
const u32 gDomeTourneyTree_Pal[] = INCBIN_U32("graphics/battle_frontier/tourney.gbapal.lz");
|
||||
const u32 gDomeTourneyTreeButtons_Pal[] = INCBIN_U32("graphics/battle_frontier/tourney_buttons.gbapal.lz");
|
||||
const u32 gDomeTourneyMatchCardBg_Pal[] = INCBIN_U32("graphics/battle_frontier/tourney_match_card_bg.gbapal.lz");
|
||||
|
||||
const u32 gBattleArenaJudgementSymbolsGfx[] = INCBIN_U32("graphics/battle_frontier/arena_judgement_symbols.4bpp.lz");
|
||||
const u32 gBattleArenaJudgementSymbolsPalette[] = INCBIN_U32("graphics/battle_frontier/arena_judgement_symbols.gbapal.lz");
|
||||
|
||||
+11
-10
@@ -101,7 +101,7 @@ static void SpriteCB_GetOnScreenAndAnimate(struct Sprite *sprite);
|
||||
static void HallOfFame_PrintMonInfo(struct HallofFameMon* currMon, u8 unused1, u8 unused2);
|
||||
static void HallOfFame_PrintWelcomeText(u8 unusedPossiblyWindowId, u8 unused2);
|
||||
static void HallOfFame_PrintPlayerInfo(u8 unused1, u8 unused2);
|
||||
static void sub_8175364(u8 taskId);
|
||||
static void Task_DoConfettiEffect(u8 taskId);
|
||||
static void sub_81751A4(struct Sprite* sprite);
|
||||
|
||||
// const rom data
|
||||
@@ -467,7 +467,7 @@ static void Task_Hof_InitTeamSaveData(u8 taskId)
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Save_LoadGameData(3) != TRUE)
|
||||
if (Save_LoadGameData(SAVE_HALL_OF_FAME) != SAVE_STATUS_OK)
|
||||
memset(gDecompressionBuffer, 0, 0x2000);
|
||||
}
|
||||
|
||||
@@ -498,7 +498,7 @@ static void Task_Hof_InitTeamSaveData(u8 taskId)
|
||||
static void Task_Hof_TrySaveData(u8 taskId)
|
||||
{
|
||||
gGameContinueCallback = CB2_DoHallOfFameScreenDontSaveData;
|
||||
if (TrySavingData(SAVE_HALL_OF_FAME) == 0xFF && gDamagedSaveSectors != 0)
|
||||
if (TrySavingData(SAVE_HALL_OF_FAME) == SAVE_STATUS_ERROR && gDamagedSaveSectors != 0)
|
||||
{
|
||||
UnsetBgTilemapBuffer(1);
|
||||
UnsetBgTilemapBuffer(3);
|
||||
@@ -836,7 +836,7 @@ void CB2_DoHallOfFamePC(void)
|
||||
static void Task_HofPC_CopySaveData(u8 taskId)
|
||||
{
|
||||
sub_81980F0(0, 0x1E, 0, 0xC, 0x226);
|
||||
if (Save_LoadGameData(3) != 1)
|
||||
if (Save_LoadGameData(SAVE_HALL_OF_FAME) != SAVE_STATUS_OK)
|
||||
{
|
||||
gTasks[taskId].func = Task_HofPC_PrintDataIsCorrupted;
|
||||
}
|
||||
@@ -1387,12 +1387,13 @@ static bool8 sub_81751FC(void)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void sub_8175280(void)
|
||||
// Used when a Battle Dome tourney is won
|
||||
void DoConfettiEffect(void)
|
||||
{
|
||||
u8 taskId;
|
||||
|
||||
gSpecialVar_0x8004 = 180;
|
||||
taskId = CreateTask(sub_8175364, 0);
|
||||
taskId = CreateTask(Task_DoConfettiEffect, 0);
|
||||
if (taskId != 0xFF)
|
||||
{
|
||||
gTasks[taskId].data[1] = gSpecialVar_0x8004;
|
||||
@@ -1400,11 +1401,11 @@ void sub_8175280(void)
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_81752C0(void)
|
||||
static void StopConfettiEffect(void)
|
||||
{
|
||||
u8 taskId;
|
||||
|
||||
if ((taskId = FindTaskIdByFunc(sub_8175364)) != 0xFF)
|
||||
if ((taskId = FindTaskIdByFunc(Task_DoConfettiEffect)) != 0xFF)
|
||||
DestroyTask(taskId);
|
||||
|
||||
sub_8152254();
|
||||
@@ -1437,7 +1438,7 @@ static void sub_81752F4(struct UnkStruct_81520A8 *structPtr)
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_8175364(u8 taskId)
|
||||
static void Task_DoConfettiEffect(u8 taskId)
|
||||
{
|
||||
u32 var = 0;
|
||||
u16 *data = gTasks[taskId].data;
|
||||
@@ -1475,7 +1476,7 @@ static void sub_8175364(u8 taskId)
|
||||
data[0] = 0xFF;
|
||||
break;
|
||||
case 0xFF:
|
||||
sub_81752C0();
|
||||
StopConfettiEffect();
|
||||
gSpecialVar_0x8004 = var;
|
||||
gSpecialVar_0x8005 = 0xFFFF;
|
||||
break;
|
||||
|
||||
+1
-1
@@ -1070,7 +1070,7 @@ void CB2_InitCopyrightScreenAfterBootup(void)
|
||||
ResetMenuAndMonGlobals();
|
||||
Save_ResetSaveCounters();
|
||||
Save_LoadGameData(SAVE_NORMAL);
|
||||
if (gSaveFileStatus == 0 || gSaveFileStatus == 2)
|
||||
if (gSaveFileStatus == SAVE_STATUS_EMPTY || gSaveFileStatus == SAVE_STATUS_CORRUPT)
|
||||
Sav2_ClearSetDefault();
|
||||
SetPokemonCryStereo(gSaveBlock2Ptr->optionsSound);
|
||||
InitHeap(gHeap, HEAP_SIZE);
|
||||
|
||||
+2
-1
@@ -14,6 +14,7 @@
|
||||
#include "battle_pyramid_bag.h"
|
||||
#include "constants/items.h"
|
||||
#include "constants/hold_effects.h"
|
||||
#include "constants/tv.h"
|
||||
|
||||
extern u16 gUnknown_0203CF30[];
|
||||
|
||||
@@ -542,7 +543,7 @@ bool8 RemoveBagItem(u16 itemId, u16 count)
|
||||
|
||||
if (CurMapIsSecretBase() == TRUE)
|
||||
{
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | 0x200);
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | SECRET_BASE_USED_BAG);
|
||||
VarSet(VAR_SECRET_BASE_LAST_ITEM_USED, itemId);
|
||||
}
|
||||
|
||||
|
||||
+3
-2
@@ -1349,7 +1349,7 @@ bool8 sub_800AA60(void)
|
||||
{
|
||||
if (gLinkPlayers[i].trainerId == gSavedLinkPlayers[i].trainerId)
|
||||
{
|
||||
if (gLinkType == LINKTYPE_0x2288)
|
||||
if (gLinkType == LINKTYPE_BATTLE_TOWER)
|
||||
{
|
||||
if (gLinkType == gLinkPlayers[i].linkType)
|
||||
{
|
||||
@@ -1902,7 +1902,8 @@ bool32 sub_800B504(void)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
u8 sub_800B518(void)
|
||||
// Unused
|
||||
u8 GetWirelessCommType(void)
|
||||
{
|
||||
return gWirelessCommType;
|
||||
}
|
||||
|
||||
+1
-1
@@ -542,7 +542,7 @@ static void CB2_ExitMailReadFreeVars(void)
|
||||
case 1:
|
||||
case 2:
|
||||
FreeMonIconPalette(sub_80D2E84(sMailRead->mail->species));
|
||||
sub_80D2EF8(&gSprites[sMailRead->monIconSprite]);
|
||||
FreeAndDestroyMonIconSprite(&gSprites[sMailRead->monIconSprite]);
|
||||
}
|
||||
memset(sMailRead, 0, sizeof(*sMailRead));
|
||||
ResetPaletteFade();
|
||||
|
||||
+5
-5
@@ -643,30 +643,30 @@ static void Task_MainMenuCheckSaveFile(u8 taskId)
|
||||
tWirelessAdapterConnected = TRUE;
|
||||
switch (gSaveFileStatus)
|
||||
{
|
||||
case 1:
|
||||
case SAVE_STATUS_OK:
|
||||
tMenuType = HAS_SAVED_GAME;
|
||||
if (IsMysteryGiftEnabled())
|
||||
tMenuType++;
|
||||
gTasks[taskId].func = Task_MainMenuCheckBattery;
|
||||
break;
|
||||
case 2:
|
||||
case SAVE_STATUS_CORRUPT:
|
||||
CreateMainMenuErrorWindow(gText_SaveFileErased);
|
||||
tMenuType = HAS_NO_SAVED_GAME;
|
||||
gTasks[taskId].func = Task_WaitForSaveFileErrorWindow;
|
||||
break;
|
||||
case 0xFF:
|
||||
case SAVE_STATUS_ERROR:
|
||||
CreateMainMenuErrorWindow(gText_SaveFileCorrupted);
|
||||
gTasks[taskId].func = Task_WaitForSaveFileErrorWindow;
|
||||
tMenuType = HAS_SAVED_GAME;
|
||||
if (IsMysteryGiftEnabled() == TRUE)
|
||||
tMenuType++;
|
||||
break;
|
||||
case 0:
|
||||
case SAVE_STATUS_EMPTY:
|
||||
default:
|
||||
tMenuType = HAS_NO_SAVED_GAME;
|
||||
gTasks[taskId].func = Task_MainMenuCheckBattery;
|
||||
break;
|
||||
case 4:
|
||||
case SAVE_STATUS_NO_FLASH:
|
||||
CreateMainMenuErrorWindow(gJPText_No1MSubCircuit);
|
||||
gTasks[taskId].tMenuType = HAS_NO_SAVED_GAME;
|
||||
gTasks[taskId].func = Task_WaitForSaveFileErrorWindow;
|
||||
|
||||
@@ -360,7 +360,7 @@ static void InitGiddyTaleList(void)
|
||||
break;
|
||||
if (r1 == 6)
|
||||
r1 = 0;
|
||||
giddy->randomWords[i] = sub_811EE90(arr[r1][0]);
|
||||
giddy->randomWords[i] = GetRandomEasyChatWordFromUnlockedGroup(arr[r1][0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -445,7 +445,7 @@ void sub_801C61C(void)
|
||||
{
|
||||
u8 r6 = 0;
|
||||
if (sWonderCardData->unk_017C != 0xFF)
|
||||
sub_80D2EF8(&gSprites[sWonderCardData->unk_017C]);
|
||||
FreeAndDestroyMonIconSprite(&gSprites[sWonderCardData->unk_017C]);
|
||||
if (sWonderCardData->unk_0000.unk_09 != 0 && sWonderCardData->unk_0000.unk_08_0 == 1)
|
||||
{
|
||||
for (; r6 < sWonderCardData->unk_0000.unk_09; r6++)
|
||||
@@ -456,7 +456,7 @@ void sub_801C61C(void)
|
||||
}
|
||||
if (sWonderCardData->unk_017D[r6][1] != 0xFF)
|
||||
{
|
||||
sub_80D2EF8(&gSprites[sWonderCardData->unk_017D[r6][1]]);
|
||||
FreeAndDestroyMonIconSprite(&gSprites[sWonderCardData->unk_017D[r6][1]]);
|
||||
}
|
||||
}
|
||||
FreeSpriteTilesByTag(0x8000);
|
||||
|
||||
@@ -53,6 +53,7 @@ void sub_801DBDC(void)
|
||||
}
|
||||
}
|
||||
|
||||
// Unused
|
||||
u16 sub_801DC20(void)
|
||||
{
|
||||
u16 *r6 = &gSpecialVar_Result;
|
||||
|
||||
+1
-1
@@ -150,7 +150,7 @@ void ResetMenuAndMonGlobals(void)
|
||||
|
||||
void NewGameInitData(void)
|
||||
{
|
||||
if (gSaveFileStatus == 0 || gSaveFileStatus == 2)
|
||||
if (gSaveFileStatus == SAVE_STATUS_EMPTY || gSaveFileStatus == SAVE_STATUS_CORRUPT)
|
||||
RtcReset();
|
||||
|
||||
gDifferentSaveFile = 1;
|
||||
|
||||
+2
-2
@@ -863,7 +863,7 @@ static void mli0_load_map(u32 a1)
|
||||
isOutdoors = IsMapTypeOutdoors(gMapHeader.mapType);
|
||||
isIndoors = IsMapTypeIndoors(gMapHeader.mapType);
|
||||
|
||||
sub_80EB218();
|
||||
CheckLeftFriendsSecretBase();
|
||||
TrySetMapSaveWarpStatus();
|
||||
ClearTempFieldEventData();
|
||||
ResetCyclingRoadChallengeData();
|
||||
@@ -1714,7 +1714,7 @@ void CB2_ContinueSavedGame(void)
|
||||
FieldClearVBlankHBlankCallbacks();
|
||||
StopMapMusic();
|
||||
ResetSafariZoneFlag_();
|
||||
if (gSaveFileStatus == 0xFF)
|
||||
if (gSaveFileStatus == SAVE_STATUS_ERROR)
|
||||
ResetWinStreaks();
|
||||
|
||||
LoadSaveblockMapHeader();
|
||||
|
||||
+11
-10
@@ -1334,7 +1334,7 @@ const struct SpindaSpot gSpindaSpotGraphics[] =
|
||||
|
||||
#include "data/pokemon/item_effects.h"
|
||||
|
||||
const s8 gNatureStatTable[][5] =
|
||||
const s8 gNatureStatTable[][NUM_EV_STATS] =
|
||||
{
|
||||
// Atk Def Spd Sp.Atk Sp.Def
|
||||
{ 0, 0, 0, 0, 0}, // Hardy
|
||||
@@ -5086,8 +5086,8 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
|
||||
}
|
||||
if (friendship < 0)
|
||||
friendship = 0;
|
||||
if (friendship > 255)
|
||||
friendship = 255;
|
||||
if (friendship > MAX_FRIENDSHIP)
|
||||
friendship = MAX_FRIENDSHIP;
|
||||
SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship);
|
||||
retVal = FALSE;
|
||||
}
|
||||
@@ -5112,8 +5112,8 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
|
||||
}
|
||||
if (friendship < 0)
|
||||
friendship = 0;
|
||||
if (friendship > 255)
|
||||
friendship = 255;
|
||||
if (friendship > MAX_FRIENDSHIP)
|
||||
friendship = MAX_FRIENDSHIP;
|
||||
SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship);
|
||||
retVal = FALSE;
|
||||
}
|
||||
@@ -5137,8 +5137,8 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
|
||||
}
|
||||
if (friendship < 0)
|
||||
friendship = 0;
|
||||
if (friendship > 255)
|
||||
friendship = 255;
|
||||
if (friendship > MAX_FRIENDSHIP)
|
||||
friendship = MAX_FRIENDSHIP;
|
||||
SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship);
|
||||
retVal = FALSE;
|
||||
}
|
||||
@@ -5717,7 +5717,8 @@ u8 GetTrainerEncounterMusicId(u16 trainerOpponentId)
|
||||
|
||||
u16 ModifyStatByNature(u8 nature, u16 n, u8 statIndex)
|
||||
{
|
||||
if (statIndex < 1 || statIndex > 5)
|
||||
// Dont modify HP, Accuracy, or Evasion by nature
|
||||
if (statIndex <= STAT_HP || statIndex > NUM_EV_STATS)
|
||||
{
|
||||
// Should just be "return n", but it wouldn't match without this.
|
||||
u16 retVal = n;
|
||||
@@ -5788,8 +5789,8 @@ void AdjustFriendship(struct Pokemon *mon, u8 event)
|
||||
}
|
||||
if (friendship < 0)
|
||||
friendship = 0;
|
||||
if (friendship > 255)
|
||||
friendship = 255;
|
||||
if (friendship > MAX_FRIENDSHIP)
|
||||
friendship = MAX_FRIENDSHIP;
|
||||
SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship);
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -1128,7 +1128,7 @@ const u8 *GetMonIconPtr(u16 species, u32 personality, bool32 handleDeoxys)
|
||||
return GetMonIconTiles(GetIconSpecies(species, personality), handleDeoxys);
|
||||
}
|
||||
|
||||
void sub_80D2EF8(struct Sprite *sprite)
|
||||
void FreeAndDestroyMonIconSprite(struct Sprite *sprite)
|
||||
{
|
||||
sub_80D328C(sprite);
|
||||
}
|
||||
|
||||
@@ -323,7 +323,7 @@ static bool32 RecordedBattleToSave(struct RecordedBattleSave *battleSave, struct
|
||||
|
||||
saveSection->checksum = CalcByteArraySum((void*)(saveSection), sizeof(*saveSection) - 4);
|
||||
|
||||
if (TryWriteSpecialSaveSection(SECTOR_ID_RECORDED_BATTLE, (void*)(saveSection)) != 1)
|
||||
if (TryWriteSpecialSaveSection(SECTOR_ID_RECORDED_BATTLE, (void*)(saveSection)) != SAVE_STATUS_OK)
|
||||
return FALSE;
|
||||
else
|
||||
return TRUE;
|
||||
@@ -492,7 +492,7 @@ bool32 MoveRecordedBattleToSaveData(void)
|
||||
|
||||
static bool32 TryCopyRecordedBattleSaveData(struct RecordedBattleSave *dst, struct SaveSection *saveBuffer)
|
||||
{
|
||||
if (TryReadSpecialSaveSection(SECTOR_ID_RECORDED_BATTLE, (void*)(saveBuffer)) != 1)
|
||||
if (TryReadSpecialSaveSection(SECTOR_ID_RECORDED_BATTLE, (void*)(saveBuffer)) != SAVE_STATUS_OK)
|
||||
return FALSE;
|
||||
|
||||
memcpy(dst, saveBuffer, sizeof(struct RecordedBattleSave));
|
||||
|
||||
@@ -559,7 +559,7 @@ static void Task_ResetRtcScreen(u8 taskId)
|
||||
case 1:
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
if (gSaveFileStatus == 0 || gSaveFileStatus == 2)
|
||||
if (gSaveFileStatus == SAVE_STATUS_EMPTY || gSaveFileStatus == SAVE_STATUS_CORRUPT)
|
||||
{
|
||||
ShowMessage(gText_NoSaveFileCantSetTime);
|
||||
data[0] = 5;
|
||||
@@ -608,7 +608,7 @@ static void Task_ResetRtcScreen(u8 taskId)
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if (TrySavingData(SAVE_NORMAL) == 1)
|
||||
if (TrySavingData(SAVE_NORMAL) == SAVE_STATUS_OK)
|
||||
{
|
||||
ShowMessage(gText_SaveCompleted);
|
||||
PlaySE(SE_PINPON);
|
||||
|
||||
@@ -21,8 +21,8 @@ void sub_81700F8(void)
|
||||
SetSaveBlocksPointers(sub_815355C());
|
||||
ResetMenuAndMonGlobals();
|
||||
Save_ResetSaveCounters();
|
||||
Save_LoadGameData(0);
|
||||
if (gSaveFileStatus == 0 || gSaveFileStatus == 2)
|
||||
Save_LoadGameData(SAVE_NORMAL);
|
||||
if (gSaveFileStatus == SAVE_STATUS_EMPTY || gSaveFileStatus == SAVE_STATUS_CORRUPT)
|
||||
Sav2_ClearSetDefault();
|
||||
SetPokemonCryStereo(gSaveBlock2Ptr->optionsSound);
|
||||
InitHeap(gHeap, HEAP_SIZE);
|
||||
|
||||
+148
-147
@@ -14,7 +14,7 @@
|
||||
#include "constants/game_stat.h"
|
||||
|
||||
static u16 CalculateChecksum(void *data, u16 size);
|
||||
static u8 DoReadFlashWholeSection(u8 sector, struct SaveSection *section);
|
||||
static bool8 DoReadFlashWholeSection(u8 sector, struct SaveSection *section);
|
||||
static u8 GetSaveValidStatus(const struct SaveSectionLocation *location);
|
||||
static u8 sub_8152E10(u16 a1, const struct SaveSectionLocation *location);
|
||||
static u8 ClearSaveData_2(u16 a1, const struct SaveSectionLocation *location);
|
||||
@@ -53,7 +53,7 @@ static u8 HandleWriteSector(u16 a1, const struct SaveSectionLocation *location);
|
||||
min(sizeof(structure) - chunkNum * SECTOR_DATA_SIZE, SECTOR_DATA_SIZE) \
|
||||
} \
|
||||
|
||||
const struct SaveSectionOffsets gSaveSectionOffsets[] =
|
||||
static const struct SaveSectionOffsets sSaveSectionOffsets[] =
|
||||
{
|
||||
SAVEBLOCK_CHUNK(gSaveblock2, 0),
|
||||
|
||||
@@ -84,9 +84,9 @@ u16 gUnknown_03006208;
|
||||
u16 gSaveUnusedVar;
|
||||
u16 gSaveFileStatus;
|
||||
void (*gGameContinueCallback)(void);
|
||||
struct SaveSectionLocation gRamSaveSectionLocations[0xE];
|
||||
struct SaveSectionLocation gRamSaveSectionLocations[SECTOR_SAVE_SLOT_LENGTH];
|
||||
u16 gSaveUnusedVar2;
|
||||
u16 gUnknown_03006294;
|
||||
u16 gSaveAttemptStatus;
|
||||
|
||||
EWRAM_DATA struct SaveSection gSaveDataBuffer = {0};
|
||||
EWRAM_DATA static u8 sUnusedVar = 0;
|
||||
@@ -130,16 +130,16 @@ static bool32 SetDamagedSectorBits(u8 op, u8 bit)
|
||||
return retVal;
|
||||
}
|
||||
|
||||
static u8 save_write_to_flash(u16 a1, const struct SaveSectionLocation *location)
|
||||
static u8 SaveWriteToFlash(u16 a1, const struct SaveSectionLocation *location)
|
||||
{
|
||||
u32 retVal;
|
||||
u32 status;
|
||||
u16 i;
|
||||
|
||||
gFastSaveSection = &gSaveDataBuffer;
|
||||
|
||||
if (a1 != 0xFFFF) // for link
|
||||
{
|
||||
retVal = HandleWriteSector(a1, location);
|
||||
status = HandleWriteSector(a1, location);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -148,41 +148,41 @@ static u8 save_write_to_flash(u16 a1, const struct SaveSectionLocation *location
|
||||
gLastWrittenSector++;
|
||||
gLastWrittenSector = gLastWrittenSector % SECTOR_SAVE_SLOT_LENGTH; // array count save sector locations
|
||||
gSaveCounter++;
|
||||
retVal = 1;
|
||||
status = SAVE_STATUS_OK;
|
||||
|
||||
for (i = 0; i < SECTOR_SAVE_SLOT_LENGTH; i++)
|
||||
HandleWriteSector(i, location);
|
||||
|
||||
if (gDamagedSaveSectors != 0) // skip the damaged sector.
|
||||
{
|
||||
retVal = 0xFF;
|
||||
status = SAVE_STATUS_ERROR;
|
||||
gLastWrittenSector = gLastKnownGoodSector;
|
||||
gSaveCounter = gLastSaveCounter;
|
||||
}
|
||||
}
|
||||
|
||||
return retVal;
|
||||
return status;
|
||||
}
|
||||
|
||||
static u8 HandleWriteSector(u16 a1, const struct SaveSectionLocation *location)
|
||||
static u8 HandleWriteSector(u16 sectorId, const struct SaveSectionLocation *location)
|
||||
{
|
||||
u16 i;
|
||||
u16 sector;
|
||||
u8 *data;
|
||||
u16 size;
|
||||
|
||||
sector = a1 + gLastWrittenSector;
|
||||
sector = sectorId + gLastWrittenSector;
|
||||
sector %= SECTOR_SAVE_SLOT_LENGTH;
|
||||
sector += SECTOR_SAVE_SLOT_LENGTH * (gSaveCounter % 2);
|
||||
|
||||
data = location[a1].data;
|
||||
size = location[a1].size;
|
||||
data = location[sectorId].data;
|
||||
size = location[sectorId].size;
|
||||
|
||||
// clear save section.
|
||||
for (i = 0; i < sizeof(struct SaveSection); i++)
|
||||
((char *)gFastSaveSection)[i] = 0;
|
||||
|
||||
gFastSaveSection->id = a1;
|
||||
gFastSaveSection->id = sectorId;
|
||||
gFastSaveSection->security = UNKNOWN_CHECK_VALUE;
|
||||
gFastSaveSection->counter = gSaveCounter;
|
||||
|
||||
@@ -215,12 +215,12 @@ static u8 TryWriteSector(u8 sector, u8 *data)
|
||||
if (ProgramFlashSectorAndVerify(sector, data) != 0) // is damaged?
|
||||
{
|
||||
SetDamagedSectorBits(ENABLE, sector); // set damaged sector bits.
|
||||
return 0xFF;
|
||||
return SAVE_STATUS_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
SetDamagedSectorBits(DISABLE, sector); // unset damaged sector bits. it's safe now.
|
||||
return 1;
|
||||
return SAVE_STATUS_OK;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -247,46 +247,46 @@ static u32 RestoreSaveBackupVars(const struct SaveSectionLocation *location) //
|
||||
return 0;
|
||||
}
|
||||
|
||||
static u8 sub_81529D4(u16 a1, const struct SaveSectionLocation *location)
|
||||
static u8 sub_81529D4(u16 sectorId, const struct SaveSectionLocation *location)
|
||||
{
|
||||
u8 retVal;
|
||||
u8 status;
|
||||
|
||||
if (gUnknown_03006208 < a1 - 1)
|
||||
if (gUnknown_03006208 < sectorId - 1)
|
||||
{
|
||||
retVal = 1;
|
||||
status = SAVE_STATUS_OK;
|
||||
HandleWriteSector(gUnknown_03006208, location);
|
||||
gUnknown_03006208++;
|
||||
if (gDamagedSaveSectors)
|
||||
{
|
||||
retVal = 0xFF;
|
||||
status = SAVE_STATUS_ERROR;
|
||||
gLastWrittenSector = gLastKnownGoodSector;
|
||||
gSaveCounter = gLastSaveCounter;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
retVal = 0xFF;
|
||||
status = SAVE_STATUS_ERROR;
|
||||
}
|
||||
|
||||
return retVal;
|
||||
return status;
|
||||
}
|
||||
|
||||
static u8 sub_8152A34(u16 a1, const struct SaveSectionLocation *location)
|
||||
static u8 sub_8152A34(u16 sectorId, const struct SaveSectionLocation *location)
|
||||
{
|
||||
u8 retVal = 1;
|
||||
u8 status = SAVE_STATUS_OK;
|
||||
|
||||
ClearSaveData_2(a1 - 1, location);
|
||||
ClearSaveData_2(sectorId - 1, location);
|
||||
|
||||
if (gDamagedSaveSectors)
|
||||
{
|
||||
retVal = 0xFF;
|
||||
status = SAVE_STATUS_ERROR;
|
||||
gLastWrittenSector = gLastKnownGoodSector;
|
||||
gSaveCounter = gLastSaveCounter;
|
||||
}
|
||||
return retVal;
|
||||
return status;
|
||||
}
|
||||
|
||||
static u8 ClearSaveData_2(u16 a1, const struct SaveSectionLocation *location)
|
||||
static u8 ClearSaveData_2(u16 sectorId, const struct SaveSectionLocation *location)
|
||||
{
|
||||
u16 i;
|
||||
u16 sector;
|
||||
@@ -294,18 +294,18 @@ static u8 ClearSaveData_2(u16 a1, const struct SaveSectionLocation *location)
|
||||
u16 size;
|
||||
u8 status;
|
||||
|
||||
sector = a1 + gLastWrittenSector;
|
||||
sector = sectorId + gLastWrittenSector;
|
||||
sector %= SECTOR_SAVE_SLOT_LENGTH;
|
||||
sector += SECTOR_SAVE_SLOT_LENGTH * (gSaveCounter % 2);
|
||||
|
||||
data = location[a1].data;
|
||||
size = location[a1].size;
|
||||
data = location[sectorId].data;
|
||||
size = location[sectorId].size;
|
||||
|
||||
// clear temp save section.
|
||||
for (i = 0; i < sizeof(struct SaveSection); i++)
|
||||
((char *)gFastSaveSection)[i] = 0;
|
||||
|
||||
gFastSaveSection->id = a1;
|
||||
gFastSaveSection->id = sectorId;
|
||||
gFastSaveSection->security = UNKNOWN_CHECK_VALUE;
|
||||
gFastSaveSection->counter = gSaveCounter;
|
||||
|
||||
@@ -318,53 +318,53 @@ static u8 ClearSaveData_2(u16 a1, const struct SaveSectionLocation *location)
|
||||
|
||||
EraseFlashSector(sector);
|
||||
|
||||
status = 1;
|
||||
status = SAVE_STATUS_OK;
|
||||
|
||||
for (i = 0; i < sizeof(struct UnkSaveSection); i++)
|
||||
{
|
||||
if (ProgramFlashByte(sector, i, ((u8 *)gFastSaveSection)[i]))
|
||||
{
|
||||
status = 0xFF;
|
||||
status = SAVE_STATUS_ERROR;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (status == 0xFF)
|
||||
if (status == SAVE_STATUS_ERROR)
|
||||
{
|
||||
SetDamagedSectorBits(ENABLE, sector);
|
||||
return 0xFF;
|
||||
return SAVE_STATUS_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
status = 1;
|
||||
status = SAVE_STATUS_OK;
|
||||
|
||||
for (i = 0; i < 7; i++)
|
||||
{
|
||||
if (ProgramFlashByte(sector, 0xFF9 + i, ((u8 *)gFastSaveSection)[0xFF9 + i]))
|
||||
{
|
||||
status = 0xFF;
|
||||
status = SAVE_STATUS_ERROR;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (status == 0xFF)
|
||||
if (status == SAVE_STATUS_ERROR)
|
||||
{
|
||||
SetDamagedSectorBits(ENABLE, sector);
|
||||
return 0xFF;
|
||||
return SAVE_STATUS_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
SetDamagedSectorBits(DISABLE, sector);
|
||||
return 1;
|
||||
return SAVE_STATUS_OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static u8 sav12_xor_get(u16 a1, const struct SaveSectionLocation *location)
|
||||
static u8 sav12_xor_get(u16 sectorId, const struct SaveSectionLocation *location)
|
||||
{
|
||||
u16 sector;
|
||||
|
||||
sector = a1 + gLastWrittenSector; // no sub 1?
|
||||
sector = sectorId + gLastWrittenSector; // no sub 1?
|
||||
sector %= SECTOR_SAVE_SLOT_LENGTH;
|
||||
sector += SECTOR_SAVE_SLOT_LENGTH * (gSaveCounter % 2);
|
||||
|
||||
@@ -374,20 +374,20 @@ static u8 sav12_xor_get(u16 a1, const struct SaveSectionLocation *location)
|
||||
SetDamagedSectorBits(ENABLE, sector);
|
||||
gLastWrittenSector = gLastKnownGoodSector;
|
||||
gSaveCounter = gLastSaveCounter;
|
||||
return 0xFF;
|
||||
return SAVE_STATUS_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
SetDamagedSectorBits(DISABLE, sector);
|
||||
return 1;
|
||||
return SAVE_STATUS_OK;
|
||||
}
|
||||
}
|
||||
|
||||
static u8 sub_8152CAC(u16 a1, const struct SaveSectionLocation *location)
|
||||
static u8 sub_8152CAC(u16 sectorId, const struct SaveSectionLocation *location)
|
||||
{
|
||||
u16 sector;
|
||||
|
||||
sector = a1 + gLastWrittenSector - 1;
|
||||
sector = sectorId + gLastWrittenSector - 1;
|
||||
sector %= SECTOR_SAVE_SLOT_LENGTH;
|
||||
sector += SECTOR_SAVE_SLOT_LENGTH * (gSaveCounter % 2);
|
||||
|
||||
@@ -397,20 +397,20 @@ static u8 sub_8152CAC(u16 a1, const struct SaveSectionLocation *location)
|
||||
SetDamagedSectorBits(ENABLE, sector);
|
||||
gLastWrittenSector = gLastKnownGoodSector;
|
||||
gSaveCounter = gLastSaveCounter;
|
||||
return 0xFF;
|
||||
return SAVE_STATUS_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
SetDamagedSectorBits(DISABLE, sector);
|
||||
return 1;
|
||||
return SAVE_STATUS_OK;
|
||||
}
|
||||
}
|
||||
|
||||
static u8 sub_8152D44(u16 a1, const struct SaveSectionLocation *location)
|
||||
static u8 sub_8152D44(u16 sectorId, const struct SaveSectionLocation *location)
|
||||
{
|
||||
u16 sector;
|
||||
|
||||
sector = a1 + gLastWrittenSector - 1; // no sub 1?
|
||||
sector = sectorId + gLastWrittenSector - 1; // no sub 1?
|
||||
sector %= SECTOR_SAVE_SLOT_LENGTH;
|
||||
sector += SECTOR_SAVE_SLOT_LENGTH * (gSaveCounter % 2);
|
||||
|
||||
@@ -420,30 +420,30 @@ static u8 sub_8152D44(u16 a1, const struct SaveSectionLocation *location)
|
||||
SetDamagedSectorBits(ENABLE, sector);
|
||||
gLastWrittenSector = gLastKnownGoodSector;
|
||||
gSaveCounter = gLastSaveCounter;
|
||||
return 0xFF;
|
||||
return SAVE_STATUS_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
SetDamagedSectorBits(DISABLE, sector);
|
||||
return 1;
|
||||
return SAVE_STATUS_OK;
|
||||
}
|
||||
}
|
||||
|
||||
static u8 sub_8152DD0(u16 a1, const struct SaveSectionLocation *location)
|
||||
{
|
||||
u8 retVal;
|
||||
u8 status;
|
||||
gFastSaveSection = &gSaveDataBuffer;
|
||||
if (a1 != 0xFFFF)
|
||||
{
|
||||
retVal = 0xFF;
|
||||
status = SAVE_STATUS_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
retVal = GetSaveValidStatus(location);
|
||||
status = GetSaveValidStatus(location);
|
||||
sub_8152E10(0xFFFF, location);
|
||||
}
|
||||
|
||||
return retVal;
|
||||
return status;
|
||||
}
|
||||
|
||||
static u8 sub_8152E10(u16 a1, const struct SaveSectionLocation *location)
|
||||
@@ -469,7 +469,7 @@ static u8 sub_8152E10(u16 a1, const struct SaveSectionLocation *location)
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
return SAVE_STATUS_OK;
|
||||
}
|
||||
|
||||
static u8 GetSaveValidStatus(const struct SaveSectionLocation *location)
|
||||
@@ -502,13 +502,13 @@ static u8 GetSaveValidStatus(const struct SaveSectionLocation *location)
|
||||
if (securityPassed)
|
||||
{
|
||||
if (slotCheckField == 0x3FFF)
|
||||
saveSlot1Status = 1;
|
||||
saveSlot1Status = SAVE_STATUS_OK;
|
||||
else
|
||||
saveSlot1Status = 255;
|
||||
saveSlot1Status = SAVE_STATUS_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
saveSlot1Status = 0;
|
||||
saveSlot1Status = SAVE_STATUS_EMPTY;
|
||||
}
|
||||
|
||||
slotCheckField = 0;
|
||||
@@ -533,16 +533,16 @@ static u8 GetSaveValidStatus(const struct SaveSectionLocation *location)
|
||||
if (securityPassed)
|
||||
{
|
||||
if (slotCheckField == 0x3FFF)
|
||||
saveSlot2Status = 1;
|
||||
saveSlot2Status = SAVE_STATUS_OK;
|
||||
else
|
||||
saveSlot2Status = 255;
|
||||
saveSlot2Status = SAVE_STATUS_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
saveSlot2Status = 0;
|
||||
saveSlot2Status = SAVE_STATUS_EMPTY;
|
||||
}
|
||||
|
||||
if (saveSlot1Status == 1 && saveSlot2Status == 1)
|
||||
if (saveSlot1Status == SAVE_STATUS_OK && saveSlot2Status == SAVE_STATUS_OK)
|
||||
{
|
||||
if ((saveSlot1Counter == -1 && saveSlot2Counter == 0) || (saveSlot1Counter == 0 && saveSlot2Counter == -1))
|
||||
{
|
||||
@@ -558,42 +558,42 @@ static u8 GetSaveValidStatus(const struct SaveSectionLocation *location)
|
||||
else
|
||||
gSaveCounter = saveSlot1Counter;
|
||||
}
|
||||
return 1;
|
||||
return SAVE_STATUS_OK;
|
||||
}
|
||||
|
||||
if (saveSlot1Status == 1)
|
||||
if (saveSlot1Status == SAVE_STATUS_OK)
|
||||
{
|
||||
gSaveCounter = saveSlot1Counter;
|
||||
if (saveSlot2Status == 255)
|
||||
return 255;
|
||||
return 1;
|
||||
if (saveSlot2Status == SAVE_STATUS_ERROR)
|
||||
return SAVE_STATUS_ERROR;
|
||||
return SAVE_STATUS_OK;
|
||||
}
|
||||
|
||||
if (saveSlot2Status == 1)
|
||||
if (saveSlot2Status == SAVE_STATUS_OK)
|
||||
{
|
||||
gSaveCounter = saveSlot2Counter;
|
||||
if (saveSlot1Status == 255)
|
||||
return 255;
|
||||
return 1;
|
||||
if (saveSlot1Status == SAVE_STATUS_ERROR)
|
||||
return SAVE_STATUS_ERROR;
|
||||
return SAVE_STATUS_OK;
|
||||
}
|
||||
|
||||
if (saveSlot1Status == 0 && saveSlot2Status == 0)
|
||||
if (saveSlot1Status == SAVE_STATUS_EMPTY && saveSlot2Status == SAVE_STATUS_EMPTY)
|
||||
{
|
||||
gSaveCounter = 0;
|
||||
gLastWrittenSector = 0;
|
||||
return 0;
|
||||
return SAVE_STATUS_EMPTY;
|
||||
}
|
||||
|
||||
gSaveCounter = 0;
|
||||
gLastWrittenSector = 0;
|
||||
return 2;
|
||||
return SAVE_STATUS_CORRUPT;
|
||||
}
|
||||
|
||||
static u8 sub_81530DC(u8 a1, u8 *data, u16 size)
|
||||
static u8 sub_81530DC(u8 sectorId, u8 *data, u16 size)
|
||||
{
|
||||
u16 i;
|
||||
struct SaveSection *section = &gSaveDataBuffer;
|
||||
DoReadFlashWholeSection(a1, section);
|
||||
DoReadFlashWholeSection(sectorId, section);
|
||||
if (section->security == UNKNOWN_CHECK_VALUE)
|
||||
{
|
||||
u16 checksum = CalculateChecksum(section->data, size);
|
||||
@@ -601,23 +601,24 @@ static u8 sub_81530DC(u8 a1, u8 *data, u16 size)
|
||||
{
|
||||
for (i = 0; i < size; i++)
|
||||
data[i] = section->data[i];
|
||||
return 1;
|
||||
return SAVE_STATUS_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 2;
|
||||
return SAVE_STATUS_CORRUPT;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
return SAVE_STATUS_EMPTY;
|
||||
}
|
||||
}
|
||||
|
||||
static u8 DoReadFlashWholeSection(u8 sector, struct SaveSection *section)
|
||||
// Return value always ignored
|
||||
static bool8 DoReadFlashWholeSection(u8 sector, struct SaveSection *section)
|
||||
{
|
||||
ReadFlash(sector, 0, section->data, sizeof(struct SaveSection));
|
||||
return 1;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static u16 CalculateChecksum(void *data, u16 size)
|
||||
@@ -638,19 +639,19 @@ static void UpdateSaveAddresses(void)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
gRamSaveSectionLocations[i].data = (void*)(gSaveBlock2Ptr) + gSaveSectionOffsets[i].toAdd;
|
||||
gRamSaveSectionLocations[i].size = gSaveSectionOffsets[i].size;
|
||||
gRamSaveSectionLocations[i].data = (void*)(gSaveBlock2Ptr) + sSaveSectionOffsets[i].toAdd;
|
||||
gRamSaveSectionLocations[i].size = sSaveSectionOffsets[i].size;
|
||||
|
||||
for (i = 1; i < 5; i++)
|
||||
for (i = SECTOR_ID_SAVEBLOCK1_START; i <= SECTOR_ID_SAVEBLOCK1_END; i++)
|
||||
{
|
||||
gRamSaveSectionLocations[i].data = (void*)(gSaveBlock1Ptr) + gSaveSectionOffsets[i].toAdd;
|
||||
gRamSaveSectionLocations[i].size = gSaveSectionOffsets[i].size;
|
||||
gRamSaveSectionLocations[i].data = (void*)(gSaveBlock1Ptr) + sSaveSectionOffsets[i].toAdd;
|
||||
gRamSaveSectionLocations[i].size = sSaveSectionOffsets[i].size;
|
||||
}
|
||||
|
||||
for (i = 5; i < 14; i++)
|
||||
for (i = SECTOR_ID_PKMN_STORAGE_START; i <= SECTOR_ID_PKMN_STORAGE_END; i++)
|
||||
{
|
||||
gRamSaveSectionLocations[i].data = (void*)(gPokemonStoragePtr) + gSaveSectionOffsets[i].toAdd;
|
||||
gRamSaveSectionLocations[i].size = gSaveSectionOffsets[i].size;
|
||||
gRamSaveSectionLocations[i].data = (void*)(gPokemonStoragePtr) + sSaveSectionOffsets[i].toAdd;
|
||||
gRamSaveSectionLocations[i].size = sSaveSectionOffsets[i].size;
|
||||
|
||||
i++;i--; // needed to match
|
||||
}
|
||||
@@ -673,36 +674,36 @@ u8 HandleSavingData(u8 saveType)
|
||||
if (GetGameStat(GAME_STAT_ENTERED_HOF) < 999)
|
||||
IncrementGameStat(GAME_STAT_ENTERED_HOF);
|
||||
SaveSerializedGame();
|
||||
save_write_to_flash(0xFFFF, gRamSaveSectionLocations);
|
||||
SaveWriteToFlash(0xFFFF, gRamSaveSectionLocations);
|
||||
tempAddr = gDecompressionBuffer;
|
||||
HandleWriteSectorNBytes(SECTOR_ID_HOF_1, tempAddr, 0xF80);
|
||||
HandleWriteSectorNBytes(SECTOR_ID_HOF_2, tempAddr + 0xF80, 0xF80);
|
||||
HandleWriteSectorNBytes(SECTOR_ID_HOF_1, tempAddr, SECTOR_DATA_SIZE);
|
||||
HandleWriteSectorNBytes(SECTOR_ID_HOF_2, tempAddr + SECTOR_DATA_SIZE, SECTOR_DATA_SIZE);
|
||||
break;
|
||||
case SAVE_NORMAL: // normal save. also called by overwriting your own save.
|
||||
default:
|
||||
SaveSerializedGame();
|
||||
save_write_to_flash(0xFFFF, gRamSaveSectionLocations);
|
||||
SaveWriteToFlash(0xFFFF, gRamSaveSectionLocations);
|
||||
break;
|
||||
case SAVE_LINK: // Link and Battle Frontier
|
||||
case SAVE_LINK2: // Unused
|
||||
SaveSerializedGame();
|
||||
for(i = 0; i < 5; i++)
|
||||
for(i = SECTOR_ID_SAVEBLOCK2; i <= SECTOR_ID_SAVEBLOCK1_END; i++)
|
||||
ClearSaveData_2(i, gRamSaveSectionLocations);
|
||||
for(i = 0; i < 5; i++)
|
||||
for(i = SECTOR_ID_SAVEBLOCK2; i <= SECTOR_ID_SAVEBLOCK1_END; i++)
|
||||
sav12_xor_get(i, gRamSaveSectionLocations);
|
||||
break;
|
||||
// Support for Ereader was removed in Emerald.
|
||||
/*
|
||||
case EREADER_SAVE: // used in mossdeep "game corner" before/after battling old man e-reader trainer
|
||||
SaveSerializedGame();
|
||||
save_write_to_flash(0, gRamSaveSectionLocations);
|
||||
SaveWriteToFlash(0, gRamSaveSectionLocations);
|
||||
break;
|
||||
*/
|
||||
case SAVE_OVERWRITE_DIFFERENT_FILE:
|
||||
for (i = SECTOR_ID_HOF_1; i < SECTORS_COUNT; i++)
|
||||
EraseFlashSector(i); // erase HOF.
|
||||
SaveSerializedGame();
|
||||
save_write_to_flash(0xFFFF, gRamSaveSectionLocations);
|
||||
SaveWriteToFlash(0xFFFF, gRamSaveSectionLocations);
|
||||
break;
|
||||
}
|
||||
gTrainerHillVBlankCounter = backupVar;
|
||||
@@ -713,25 +714,25 @@ u8 TrySavingData(u8 saveType)
|
||||
{
|
||||
if (gFlashMemoryPresent != TRUE)
|
||||
{
|
||||
gUnknown_03006294 = 0xFF;
|
||||
return 0xFF;
|
||||
gSaveAttemptStatus = SAVE_STATUS_ERROR;
|
||||
return SAVE_STATUS_ERROR;
|
||||
}
|
||||
|
||||
HandleSavingData(saveType);
|
||||
if (!gDamagedSaveSectors)
|
||||
{
|
||||
gUnknown_03006294 = 1;
|
||||
return 1;
|
||||
gSaveAttemptStatus = SAVE_STATUS_OK;
|
||||
return SAVE_STATUS_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
DoSaveFailedScreen(saveType);
|
||||
gUnknown_03006294 = 0xFF;
|
||||
return 0xFF;
|
||||
gSaveAttemptStatus = SAVE_STATUS_ERROR;
|
||||
return SAVE_STATUS_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
bool8 sub_8153380(void) // trade.s save
|
||||
bool8 sub_8153380(void) // trade.c
|
||||
{
|
||||
if (gFlashMemoryPresent != TRUE)
|
||||
return TRUE;
|
||||
@@ -741,92 +742,92 @@ bool8 sub_8153380(void) // trade.s save
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool8 sub_81533AC(void) // trade.s save
|
||||
bool8 sub_81533AC(void) // trade.c
|
||||
{
|
||||
u8 retVal = sub_81529D4(SECTOR_SAVE_SLOT_LENGTH, gRamSaveSectionLocations);
|
||||
u8 status = sub_81529D4(SECTOR_SAVE_SLOT_LENGTH, gRamSaveSectionLocations);
|
||||
if (gDamagedSaveSectors)
|
||||
DoSaveFailedScreen(0);
|
||||
if (retVal == 0xFF)
|
||||
DoSaveFailedScreen(SAVE_NORMAL);
|
||||
if (status == SAVE_STATUS_ERROR)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
u8 sub_81533E0(void) // trade.s save
|
||||
bool8 sub_81533E0(void) // trade.c
|
||||
{
|
||||
sub_8152A34(SECTOR_SAVE_SLOT_LENGTH, gRamSaveSectionLocations);
|
||||
if (gDamagedSaveSectors)
|
||||
DoSaveFailedScreen(0);
|
||||
return 0;
|
||||
DoSaveFailedScreen(SAVE_NORMAL);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
u8 sub_8153408(void) // trade.s save
|
||||
bool8 sub_8153408(void) // trade.c
|
||||
{
|
||||
sub_8152CAC(SECTOR_SAVE_SLOT_LENGTH, gRamSaveSectionLocations);
|
||||
if (gDamagedSaveSectors)
|
||||
DoSaveFailedScreen(0);
|
||||
return 0;
|
||||
DoSaveFailedScreen(SAVE_NORMAL);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
u8 FullSaveGame(void)
|
||||
{
|
||||
if (gFlashMemoryPresent != TRUE)
|
||||
return 1;
|
||||
return TRUE;
|
||||
|
||||
UpdateSaveAddresses();
|
||||
SaveSerializedGame();
|
||||
RestoreSaveBackupVars(gRamSaveSectionLocations);
|
||||
sub_8152A34(gUnknown_03006208 + 1, gRamSaveSectionLocations);
|
||||
return 0;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool8 CheckSaveFile(void)
|
||||
{
|
||||
u8 retVal = FALSE;
|
||||
u16 val = ++gUnknown_03006208;
|
||||
if (val <= 4)
|
||||
u16 sectorId = ++gUnknown_03006208;
|
||||
if (sectorId <= SECTOR_ID_SAVEBLOCK1_END)
|
||||
{
|
||||
sub_8152A34(gUnknown_03006208 + 1, gRamSaveSectionLocations);
|
||||
sub_8152D44(val, gRamSaveSectionLocations);
|
||||
sub_8152D44(sectorId, gRamSaveSectionLocations);
|
||||
}
|
||||
else
|
||||
{
|
||||
sub_8152D44(val, gRamSaveSectionLocations);
|
||||
sub_8152D44(sectorId, gRamSaveSectionLocations);
|
||||
retVal = TRUE;
|
||||
}
|
||||
if (gDamagedSaveSectors)
|
||||
DoSaveFailedScreen(1);
|
||||
DoSaveFailedScreen(SAVE_LINK);
|
||||
return retVal;
|
||||
}
|
||||
|
||||
u8 Save_LoadGameData(u8 a1)
|
||||
u8 Save_LoadGameData(u8 saveType)
|
||||
{
|
||||
u8 result;
|
||||
u8 status;
|
||||
|
||||
if (gFlashMemoryPresent != TRUE)
|
||||
{
|
||||
gSaveFileStatus = 4;
|
||||
return 0xFF;
|
||||
gSaveFileStatus = SAVE_STATUS_NO_FLASH;
|
||||
return SAVE_STATUS_ERROR;
|
||||
}
|
||||
|
||||
UpdateSaveAddresses();
|
||||
switch (a1)
|
||||
switch (saveType)
|
||||
{
|
||||
case 0:
|
||||
case SAVE_NORMAL:
|
||||
default:
|
||||
result = sub_8152DD0(0xFFFF, gRamSaveSectionLocations);
|
||||
status = sub_8152DD0(0xFFFF, gRamSaveSectionLocations);
|
||||
LoadSerializedGame();
|
||||
gSaveFileStatus = result;
|
||||
gSaveFileStatus = status;
|
||||
gGameContinueCallback = 0;
|
||||
break;
|
||||
case 3:
|
||||
result = sub_81530DC(0x1C, gDecompressionBuffer, 0xF80);
|
||||
if(result == 1)
|
||||
result = sub_81530DC(0x1D, gDecompressionBuffer + 0xF80, 0xF80);
|
||||
case SAVE_HALL_OF_FAME:
|
||||
status = sub_81530DC(SECTOR_ID_HOF_1, gDecompressionBuffer, SECTOR_DATA_SIZE);
|
||||
if (status == SAVE_STATUS_OK)
|
||||
status = sub_81530DC(SECTOR_ID_HOF_2, gDecompressionBuffer + SECTOR_DATA_SIZE, SECTOR_DATA_SIZE);
|
||||
break;
|
||||
}
|
||||
|
||||
return result;
|
||||
return status;
|
||||
}
|
||||
|
||||
u16 sub_815355C(void)
|
||||
@@ -836,7 +837,7 @@ u16 sub_815355C(void)
|
||||
|
||||
savSection = gFastSaveSection = &gSaveDataBuffer;
|
||||
if (gFlashMemoryPresent != TRUE)
|
||||
return 0;
|
||||
return SAVE_STATUS_EMPTY;
|
||||
UpdateSaveAddresses();
|
||||
GetSaveValidStatus(gRamSaveSectionLocations);
|
||||
v3 = SECTOR_SAVE_SLOT_LENGTH * (gSaveCounter % 2);
|
||||
@@ -849,7 +850,7 @@ u16 sub_815355C(void)
|
||||
savSection->data[12] +
|
||||
savSection->data[13];
|
||||
}
|
||||
return 0;
|
||||
return SAVE_STATUS_EMPTY;
|
||||
}
|
||||
|
||||
u32 TryReadSpecialSaveSection(u8 sector, u8* dst)
|
||||
@@ -859,17 +860,17 @@ u32 TryReadSpecialSaveSection(u8 sector, u8* dst)
|
||||
u8* savData;
|
||||
|
||||
if (sector != SECTOR_ID_TRAINER_HILL && sector != SECTOR_ID_RECORDED_BATTLE)
|
||||
return 0xFF;
|
||||
return SAVE_STATUS_ERROR;
|
||||
ReadFlash(sector, 0, (u8 *)&gSaveDataBuffer, sizeof(struct SaveSection));
|
||||
if (*(u32*)(&gSaveDataBuffer.data[0]) != SPECIAL_SECTION_SENTINEL)
|
||||
return 0xFF;
|
||||
return SAVE_STATUS_ERROR;
|
||||
// copies whole save section except u32 counter
|
||||
i = 0;
|
||||
size = 0xFFB;
|
||||
savData = &gSaveDataBuffer.data[4];
|
||||
for (; i <= size; i++)
|
||||
dst[i] = savData[i];
|
||||
return 1;
|
||||
return SAVE_STATUS_OK;
|
||||
}
|
||||
|
||||
u32 TryWriteSpecialSaveSection(u8 sector, u8* src)
|
||||
@@ -880,7 +881,7 @@ u32 TryWriteSpecialSaveSection(u8 sector, u8* src)
|
||||
void* savDataBuffer;
|
||||
|
||||
if (sector != SECTOR_ID_TRAINER_HILL && sector != SECTOR_ID_RECORDED_BATTLE)
|
||||
return 0xFF;
|
||||
return SAVE_STATUS_ERROR;
|
||||
|
||||
savDataBuffer = &gSaveDataBuffer;
|
||||
*(u32*)(savDataBuffer) = SPECIAL_SECTION_SENTINEL;
|
||||
@@ -892,8 +893,8 @@ u32 TryWriteSpecialSaveSection(u8 sector, u8* src)
|
||||
for (; i <= size; i++)
|
||||
savData[i] = src[i];
|
||||
if (ProgramFlashSectorAndVerify(sector, savDataBuffer) != 0)
|
||||
return 0xFF;
|
||||
return 1;
|
||||
return SAVE_STATUS_ERROR;
|
||||
return SAVE_STATUS_OK;
|
||||
}
|
||||
|
||||
void sub_8153688(u8 taskId)
|
||||
|
||||
@@ -52,6 +52,7 @@ void SetContestTrainerGfxIds(void)
|
||||
gSaveBlock1Ptr->vars[VAR_OBJ_GFX_ID_2 - VARS_START] = gContestMons[2].trainerGfxId;
|
||||
}
|
||||
|
||||
// Unused
|
||||
void sub_80F8814(void)
|
||||
{
|
||||
u16 var1;
|
||||
@@ -82,7 +83,8 @@ void BufferContestTrainerAndMonNames(void)
|
||||
BufferContestantMonSpecies();
|
||||
}
|
||||
|
||||
void sub_80F8864(void)
|
||||
// Unused
|
||||
void DoesContestCategoryHaveWinner(void)
|
||||
{
|
||||
int contestWinner;
|
||||
switch (gSpecialVar_ContestCategory)
|
||||
@@ -105,10 +107,10 @@ void sub_80F8864(void)
|
||||
break;
|
||||
}
|
||||
|
||||
if (!gSaveBlock1Ptr->contestWinners[contestWinner].species)
|
||||
gSpecialVar_0x8004 = 0;
|
||||
if (gSaveBlock1Ptr->contestWinners[contestWinner].species == SPECIES_NONE)
|
||||
gSpecialVar_0x8004 = FALSE;
|
||||
else
|
||||
gSpecialVar_0x8004 = 1;
|
||||
gSpecialVar_0x8004 = TRUE;
|
||||
}
|
||||
|
||||
void SaveMuseumContestPainting(void)
|
||||
@@ -144,9 +146,10 @@ u8 CountPlayerContestPaintings(void)
|
||||
return count;
|
||||
}
|
||||
|
||||
// Unused
|
||||
void sub_80F8970(void)
|
||||
{
|
||||
s16 sp[4];
|
||||
s16 conditions[CONTESTANT_COUNT];
|
||||
int i, j;
|
||||
s16 condition;
|
||||
s8 var0;
|
||||
@@ -154,28 +157,27 @@ void sub_80F8970(void)
|
||||
u8 r8;
|
||||
u8 r7;
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
sp[i] = gContestMonConditions[i];
|
||||
for (i = 0; i < CONTESTANT_COUNT; i++)
|
||||
conditions[i] = gContestMonConditions[i];
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
for (i = 0; i < CONTESTANT_COUNT - 1; i++)
|
||||
{
|
||||
for (j = 3; j > i; j--)
|
||||
for (j = CONTESTANT_COUNT - 1; j > i; j--)
|
||||
{
|
||||
if (sp[j - 1] < sp[j])
|
||||
if (conditions[j - 1] < conditions[j])
|
||||
{
|
||||
int temp = sp[j];
|
||||
sp[j] = sp[j - 1];
|
||||
sp[j - 1] = temp;
|
||||
int temp;
|
||||
SWAP(conditions[j], conditions[j - 1], temp)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
condition = sp[gSpecialVar_0x8006];
|
||||
condition = conditions[gSpecialVar_0x8006];
|
||||
var0 = 0;
|
||||
r8 = 0;
|
||||
for (i = 0; i < 4; i++)
|
||||
for (i = 0; i < CONTESTANT_COUNT; i++)
|
||||
{
|
||||
if (sp[i] == condition)
|
||||
if (conditions[i] == condition)
|
||||
{
|
||||
var0++;
|
||||
if (i == gSpecialVar_0x8006)
|
||||
@@ -183,15 +185,15 @@ void sub_80F8970(void)
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
for (i = 0; i < CONTESTANT_COUNT; i++)
|
||||
{
|
||||
if (sp[i] == condition)
|
||||
if (conditions[i] == condition)
|
||||
break;
|
||||
}
|
||||
|
||||
r7 = i;
|
||||
var2 = r8;
|
||||
for (i = 0; i < 4; i++)
|
||||
for (i = 0; i < CONTESTANT_COUNT; i++)
|
||||
{
|
||||
if (condition == gContestMonConditions[i])
|
||||
{
|
||||
@@ -704,20 +706,20 @@ static void CB2_ReturnFromChooseBattleFrontierParty(void)
|
||||
|
||||
void ReducePlayerPartyToSelectedMons(void)
|
||||
{
|
||||
struct Pokemon party[4];
|
||||
struct Pokemon party[MAX_FRONTIER_PARTY_SIZE];
|
||||
int i;
|
||||
|
||||
CpuFill32(0, party, sizeof party);
|
||||
|
||||
// copy the selected pokemon according to the order.
|
||||
for (i = 0; i < 4; i++)
|
||||
for (i = 0; i < MAX_FRONTIER_PARTY_SIZE; i++)
|
||||
if (gSelectedOrderFromParty[i]) // as long as the order keeps going (did the player select 1 mon? 2? 3?), do not stop
|
||||
party[i] = gPlayerParty[gSelectedOrderFromParty[i] - 1]; // index is 0 based, not literal
|
||||
|
||||
CpuFill32(0, gPlayerParty, sizeof gPlayerParty);
|
||||
|
||||
// overwrite the first 4 with the order copied to.
|
||||
for (i = 0; i < 4; i++)
|
||||
for (i = 0; i < MAX_FRONTIER_PARTY_SIZE; i++)
|
||||
gPlayerParty[i] = party[i];
|
||||
|
||||
CalculatePlayerPartyCount();
|
||||
|
||||
+238
-244
@@ -41,11 +41,13 @@
|
||||
#include "constants/maps.h"
|
||||
#include "constants/map_types.h"
|
||||
#include "constants/metatile_behaviors.h"
|
||||
#include "constants/metatile_labels.h"
|
||||
#include "constants/moves.h"
|
||||
#include "constants/secret_bases.h"
|
||||
#include "constants/songs.h"
|
||||
#include "constants/species.h"
|
||||
#include "constants/trainers.h"
|
||||
#include "constants/tv.h"
|
||||
|
||||
struct SecretBaseRegistryMenu
|
||||
{
|
||||
@@ -88,13 +90,13 @@ static u8 GetSecretBaseOwnerType(u8 secretBaseId);
|
||||
|
||||
static const struct SecretBaseEntranceMetatiles sSecretBaseEntranceMetatiles[] =
|
||||
{
|
||||
{.closedMetatileId = 0x0026, .openMetatileId = 0x0036},
|
||||
{.closedMetatileId = 0x0027, .openMetatileId = 0x0037},
|
||||
{.closedMetatileId = 0x01a0, .openMetatileId = 0x01a1},
|
||||
{.closedMetatileId = 0x01a8, .openMetatileId = 0x01a9},
|
||||
{.closedMetatileId = 0x01b0, .openMetatileId = 0x01b1},
|
||||
{.closedMetatileId = 0x0208, .openMetatileId = 0x0210},
|
||||
{.closedMetatileId = 0x0271, .openMetatileId = 0x0278},
|
||||
{.closedMetatileId = METATILE_General_SecretBase_TreeLeft, .openMetatileId = METATILE_General_SecretBase_VineLeft},
|
||||
{.closedMetatileId = METATILE_General_SecretBase_TreeRight, .openMetatileId = METATILE_General_SecretBase_VineRight},
|
||||
{.closedMetatileId = METATILE_General_RedCaveIndent, .openMetatileId = METATILE_General_RedCaveOpen},
|
||||
{.closedMetatileId = METATILE_General_YellowCaveIndent, .openMetatileId = METATILE_General_YellowCaveOpen},
|
||||
{.closedMetatileId = METATILE_General_BlueCaveIndent, .openMetatileId = METATILE_General_BlueCaveOpen},
|
||||
{.closedMetatileId = METATILE_Fallarbor_BrownCaveIndent, .openMetatileId = METATILE_Fallarbor_BrownCaveOpen},
|
||||
{.closedMetatileId = METATILE_Fortree_SecretBase_Shrub, .openMetatileId = METATILE_Fortree_SecretBase_ShrubOpen},
|
||||
};
|
||||
|
||||
// mapNum, warpId, x, y
|
||||
@@ -452,10 +454,10 @@ static void EnterNewlyCreatedSecretBase_StartFadeIn(void)
|
||||
|
||||
ScriptContext2_Enable();
|
||||
HideMapNamePopUpWindow();
|
||||
FindMetatileIdMapCoords(&x, &y, 0x220);
|
||||
FindMetatileIdMapCoords(&x, &y, METATILE_SecretBase_PC);
|
||||
x += 7;
|
||||
y += 7;
|
||||
MapGridSetMetatileIdAt(x, y, 0x220 | METATILE_COLLISION_MASK);
|
||||
MapGridSetMetatileIdAt(x, y, METATILE_SecretBase_PC | METATILE_COLLISION_MASK);
|
||||
CurrentMapDrawMetatileAt(x, y);
|
||||
FadeInFromBlack();
|
||||
CreateTask(EnterNewlyCreatedSecretBase_WaitFadeIn, 0);
|
||||
@@ -506,7 +508,7 @@ void InitSecretBaseAppearance(bool8 hidePC)
|
||||
secretBaseId = VarGet(VAR_CURRENT_SECRET_BASE);
|
||||
decorations = gSaveBlock1Ptr->secretBases[secretBaseId].decorations;
|
||||
decorPos = gSaveBlock1Ptr->secretBases[secretBaseId].decorationPositions;
|
||||
for (x = 0; x < 16; x++)
|
||||
for (x = 0; x < DECOR_MAX_SECRET_BASE; x++)
|
||||
{
|
||||
if (decorations[x] > 0 && decorations[x] <= NUM_DECORATIONS && gDecorations[decorations[x]].permission != DECORPERM_SPRITE)
|
||||
ShowDecorationOnMap((decorPos[x] >> 4) + 7, (decorPos[x] & 0xF) + 7, decorations[x]);
|
||||
@@ -515,14 +517,14 @@ void InitSecretBaseAppearance(bool8 hidePC)
|
||||
if (secretBaseId != 0)
|
||||
{
|
||||
// Another player's secret base. Change PC type to the "Register" PC.
|
||||
FindMetatileIdMapCoords(&x, &y, 0x220);
|
||||
MapGridSetMetatileIdAt(x + 7, y + 7, 0x221 | METATILE_COLLISION_MASK);
|
||||
FindMetatileIdMapCoords(&x, &y, METATILE_SecretBase_PC);
|
||||
MapGridSetMetatileIdAt(x + 7, y + 7, METATILE_SecretBase_RegisterPC | METATILE_COLLISION_MASK);
|
||||
}
|
||||
else if (hidePC == TRUE && VarGet(VAR_SECRET_BASE_INITIALIZED) == 1)
|
||||
{
|
||||
// Change PC to regular ground tile.
|
||||
FindMetatileIdMapCoords(&x, &y, 0x220);
|
||||
MapGridSetMetatileIdAt(x + 7, y + 7, 0x20a | METATILE_COLLISION_MASK);
|
||||
FindMetatileIdMapCoords(&x, &y, METATILE_SecretBase_PC);
|
||||
MapGridSetMetatileIdAt(x + 7, y + 7, METATILE_SecretBase_Ground | METATILE_COLLISION_MASK);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1174,48 +1176,60 @@ void SecretBasePerStepCallback(u8 taskId)
|
||||
VarSet(VAR_SECRET_BASE_STEP_COUNTER, VarGet(VAR_SECRET_BASE_STEP_COUNTER) + 1);
|
||||
behavior = MapGridGetMetatileBehaviorAt(x, y);
|
||||
tileId = MapGridGetMetatileIdAt(x, y);
|
||||
if (tileId == 0x234 || tileId == 0x23C)
|
||||
if (tileId == METATILE_SecretBase_Board_Top || tileId == METATILE_SecretBase_Board_Bottom)
|
||||
{
|
||||
if (sInFriendSecretBase == TRUE)
|
||||
{
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | 0x20);
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | SECRET_BASE_USED_SOLID_BOARD);
|
||||
}
|
||||
}
|
||||
else if (tileId == 0x2b8 || tileId == 0x2b9 || tileId == 0x2ba || tileId == 0x2c0 || tileId == 0x2c1 || tileId == 0x2c2 || tileId == 0x2c8 || tileId == 0x2c9 || tileId == 0x2ca)
|
||||
else if (tileId == METATILE_SecretBase_SmallChair
|
||||
|| tileId == METATILE_SecretBase_PokemonChair
|
||||
|| tileId == METATILE_SecretBase_HeavyChair
|
||||
|| tileId == METATILE_SecretBase_PrettyChair
|
||||
|| tileId == METATILE_SecretBase_ComfortChair
|
||||
|| tileId == METATILE_SecretBase_RaggedChair
|
||||
|| tileId == METATILE_SecretBase_BrickChair
|
||||
|| tileId == METATILE_SecretBase_CampChair
|
||||
|| tileId == METATILE_SecretBase_HardChair)
|
||||
{
|
||||
if (sInFriendSecretBase == TRUE)
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | 0x01);
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | SECRET_BASE_USED_CHAIR);
|
||||
}
|
||||
else if (tileId == 0x239 || tileId == 0x241 || tileId == 0x251 || tileId == 0x259)
|
||||
else if (tileId == METATILE_SecretBase_RedTent_DoorTop
|
||||
|| tileId == METATILE_SecretBase_RedTent_Door
|
||||
|| tileId == METATILE_SecretBase_BlueTent_DoorTop
|
||||
|| tileId == METATILE_SecretBase_BlueTent_Door)
|
||||
{
|
||||
if (sInFriendSecretBase == TRUE)
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | 0x04);
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | SECRET_BASE_USED_TENT);
|
||||
}
|
||||
else if ((behavior == 0x34 && tileId == 0x26d) || (behavior == 0x35 && MapGridGetMetatileIdAt(x, y) == 0x26a))
|
||||
else if ((behavior == MB_IMPASSABLE_NORTHEAST && tileId == METATILE_SecretBase_Stand_RightCorner)
|
||||
|| (behavior == MB_IMPASSABLE_NORTHWEST && MapGridGetMetatileIdAt(x, y) == METATILE_SecretBase_Stand_LeftCorner))
|
||||
{
|
||||
if (sInFriendSecretBase == TRUE)
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | 0x200);
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | SECRET_BASE_USED_STAND);
|
||||
}
|
||||
else if (behavior == 0xc1 && tileId == 0x23d)
|
||||
else if (behavior == MB_IMPASSABLE_WEST_AND_EAST && tileId == METATILE_SecretBase_Slide_Stairs)
|
||||
{
|
||||
if (sInFriendSecretBase == TRUE)
|
||||
{
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) ^ 0x1000);
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | 0x2000);
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) ^ SECRET_BASE_USED_SLIDE);
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | SECRET_BASE_DECLINED_SLIDE);
|
||||
}
|
||||
}
|
||||
else if (behavior == 0x47 && tileId == 0x23e)
|
||||
else if (behavior == MB_SLIDE_SOUTH && tileId == METATILE_SecretBase_Slide)
|
||||
{
|
||||
if (sInFriendSecretBase == TRUE)
|
||||
{
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | 0x1000);
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) ^ 0x2000);
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | SECRET_BASE_USED_SLIDE);
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) ^ SECRET_BASE_DECLINED_SLIDE);
|
||||
}
|
||||
}
|
||||
else if (MetatileBehavior_IsSecretBaseGlitterMat(behavior) == TRUE)
|
||||
{
|
||||
if (sInFriendSecretBase == TRUE)
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | 0x80);
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | SECRET_BASE_USED_GLITTER_MAT);
|
||||
}
|
||||
else if (MetatileBehavior_IsSecretBaseBalloon(behavior) == TRUE)
|
||||
{
|
||||
@@ -1224,13 +1238,13 @@ void SecretBasePerStepCallback(u8 taskId)
|
||||
{
|
||||
switch ((int)MapGridGetMetatileIdAt(x, y))
|
||||
{
|
||||
case 0x338:
|
||||
case 0x33c:
|
||||
case 0x340:
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | 0x02);
|
||||
case METATILE_SecretBase_RedBalloon:
|
||||
case METATILE_SecretBase_BlueBalloon:
|
||||
case METATILE_SecretBase_YellowBalloon:
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | SECRET_BASE_USED_BALLOON);
|
||||
break;
|
||||
case 0x228:
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | 0x100);
|
||||
case METATILE_SecretBase_MudBall:
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | SECRET_BASE_USED_MUD_BALL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1238,23 +1252,23 @@ void SecretBasePerStepCallback(u8 taskId)
|
||||
else if (MetatileBehavior_IsSecretBaseBreakableDoor(behavior) == TRUE)
|
||||
{
|
||||
if (sInFriendSecretBase == TRUE)
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | 0x400);
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | SECRET_BASE_USED_BREAKABLE_DOOR);
|
||||
|
||||
ShatterSecretBaseBreakableDoor(x, y);
|
||||
}
|
||||
else if (MetatileBehavior_IsSecretBaseSoundMat(behavior) == TRUE){
|
||||
if (sInFriendSecretBase == TRUE)
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | 0x8000);
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | SECRET_BASE_USED_NOTE_MAT);
|
||||
}
|
||||
else if (MetatileBehavior_IsSecretBaseJumpMat(behavior) == TRUE)
|
||||
{
|
||||
if (sInFriendSecretBase == TRUE)
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | 0x4000);
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | SECRET_BASE_USED_JUMP_MAT);
|
||||
}
|
||||
else if (MetatileBehavior_IsSecretBaseSpinMat(behavior) == TRUE)
|
||||
{
|
||||
if (sInFriendSecretBase == TRUE)
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | 0x02);
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | SECRET_BASE_USED_SPIN_MAT);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -1417,9 +1431,8 @@ static void SortSecretBasesByRegistryStatus(void)
|
||||
{
|
||||
if ((secretBases[i].registryStatus == 0 && secretBases[j].registryStatus == 1) || (secretBases[i].registryStatus == 2 && secretBases[j].registryStatus != 2))
|
||||
{
|
||||
struct SecretBase temp = secretBases[i];
|
||||
secretBases[i] = secretBases[j];
|
||||
secretBases[j] = temp;
|
||||
struct SecretBase temp;
|
||||
SWAP(secretBases[i], secretBases[j], temp)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1461,48 +1474,57 @@ bool8 SecretBaseBelongsToPlayer(struct SecretBase *secretBase)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#define DELETED_BASE_A (1 << 0)
|
||||
#define DELETED_BASE_B (1 << 1)
|
||||
#define DELETED_BASE_C (1 << 2)
|
||||
|
||||
void DeleteFirstOldBaseFromPlayerInRecordMixingFriendsRecords(struct SecretBase *basesA, struct SecretBase *basesB, struct SecretBase *basesC)
|
||||
{
|
||||
u8 i;
|
||||
u8 sbFlags = 0x0;
|
||||
u8 sbFlags = 0;
|
||||
|
||||
for (i = 0; i < SECRET_BASES_COUNT; i++)
|
||||
{
|
||||
if (!(sbFlags & 0x1)) // 001
|
||||
if (!(sbFlags & DELETED_BASE_A))
|
||||
{
|
||||
if (SecretBaseBelongsToPlayer(&basesA[i]) == TRUE)
|
||||
{
|
||||
ClearSecretBase(&basesA[i]);
|
||||
sbFlags |= 1;
|
||||
sbFlags |= DELETED_BASE_A;
|
||||
}
|
||||
}
|
||||
|
||||
if (!(sbFlags & 0x2)) // 010
|
||||
if (!(sbFlags & DELETED_BASE_B))
|
||||
{
|
||||
if (SecretBaseBelongsToPlayer(&basesB[i]) == TRUE)
|
||||
{
|
||||
ClearSecretBase(&basesB[i]);
|
||||
sbFlags |= 2;
|
||||
sbFlags |= DELETED_BASE_B;
|
||||
}
|
||||
}
|
||||
|
||||
if (!(sbFlags & 0x4)) // 100
|
||||
if (!(sbFlags & DELETED_BASE_C))
|
||||
{
|
||||
if (SecretBaseBelongsToPlayer(&basesC[i]) == TRUE)
|
||||
{
|
||||
ClearSecretBase(&basesC[i]);
|
||||
sbFlags |= 4;
|
||||
sbFlags |= DELETED_BASE_C;
|
||||
}
|
||||
}
|
||||
|
||||
if (sbFlags == 0x7) // 111
|
||||
if (sbFlags == (DELETED_BASE_A | DELETED_BASE_B | DELETED_BASE_C))
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool8 sub_80EAD14(struct SecretBase *secretBase, struct SecretBase *secretBases, u8 c)
|
||||
#undef DELETED_BASE_A
|
||||
#undef DELETED_BASE_B
|
||||
#undef DELETED_BASE_C
|
||||
|
||||
// returns TRUE if secretBase was deleted, FALSE otherwise
|
||||
static bool8 ClearDuplicateOwnedSecretBases(struct SecretBase *secretBase, struct SecretBase *secretBases, u8 c)
|
||||
{
|
||||
u8 i;
|
||||
|
||||
@@ -1546,11 +1568,11 @@ void sub_80EAD94(struct SecretBase *basesA, struct SecretBase *basesB, struct Se
|
||||
{
|
||||
basesA[i].sbr_field_1_0 = 1;
|
||||
}
|
||||
if (!sub_80EAD14(&basesA[i], basesB, i))
|
||||
if (!ClearDuplicateOwnedSecretBases(&basesA[i], basesB, i))
|
||||
{
|
||||
if (!sub_80EAD14(&basesA[i], basesC, i))
|
||||
if (!ClearDuplicateOwnedSecretBases(&basesA[i], basesC, i))
|
||||
{
|
||||
sub_80EAD14(&basesA[i], basesD, i);
|
||||
ClearDuplicateOwnedSecretBases(&basesA[i], basesD, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1560,9 +1582,9 @@ void sub_80EAD94(struct SecretBase *basesA, struct SecretBase *basesB, struct Se
|
||||
if (basesB[i].secretBaseId)
|
||||
{
|
||||
basesB[i].battledOwnerToday = 0;
|
||||
if (!sub_80EAD14(&basesB[i], basesC, i))
|
||||
if (!ClearDuplicateOwnedSecretBases(&basesB[i], basesC, i))
|
||||
{
|
||||
sub_80EAD14(&basesB[i], basesD, i);
|
||||
ClearDuplicateOwnedSecretBases(&basesB[i], basesD, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1571,7 +1593,7 @@ void sub_80EAD94(struct SecretBase *basesA, struct SecretBase *basesB, struct Se
|
||||
if (basesC[i].secretBaseId)
|
||||
{
|
||||
basesC[i].battledOwnerToday = 0;
|
||||
sub_80EAD14(&basesC[i], basesD, i);
|
||||
ClearDuplicateOwnedSecretBases(&basesC[i], basesD, i);
|
||||
}
|
||||
if (basesD[i].secretBaseId)
|
||||
{
|
||||
@@ -1617,6 +1639,17 @@ void sub_80EAEF4(struct SecretBaseRecordMixer *mixers)
|
||||
sub_80EABA4(&mixers[2], 0);
|
||||
}
|
||||
|
||||
#define INIT_SECRET_BASE_RECORD_MIXER(linkId1, linkId2, linkId3) \
|
||||
mixers[0].secretBases = secretBases + linkId1 * recordSize; \
|
||||
mixers[0].version = gLinkPlayers[linkId1].version & 0xFF; \
|
||||
mixers[0].language = gLinkPlayers[linkId1].language; \
|
||||
mixers[1].secretBases = secretBases + linkId2 * recordSize; \
|
||||
mixers[1].version = gLinkPlayers[linkId2].version & 0xFF; \
|
||||
mixers[1].language = gLinkPlayers[linkId2].language; \
|
||||
mixers[2].secretBases = secretBases + linkId3 * recordSize; \
|
||||
mixers[2].version = gLinkPlayers[linkId3].version & 0xFF; \
|
||||
mixers[2].language = gLinkPlayers[linkId3].language;
|
||||
|
||||
void ReceiveSecretBasesData(void *secretBases, size_t recordSize, u8 linkIdx)
|
||||
{
|
||||
struct SecretBaseRecordMixer mixers[3];
|
||||
@@ -1638,48 +1671,16 @@ void ReceiveSecretBasesData(void *secretBases, size_t recordSize, u8 linkIdx)
|
||||
switch (linkIdx)
|
||||
{
|
||||
case 0:
|
||||
mixers[0].secretBases = secretBases + 1 * recordSize;
|
||||
mixers[0].version = gLinkPlayers[1].version & 0xFF;
|
||||
mixers[0].language = gLinkPlayers[1].language;
|
||||
mixers[1].secretBases = secretBases + 2 * recordSize;
|
||||
mixers[1].version = gLinkPlayers[2].version & 0xFF;
|
||||
mixers[1].language = gLinkPlayers[2].language;
|
||||
mixers[2].secretBases = secretBases + 3 * recordSize;
|
||||
mixers[2].version = gLinkPlayers[3].version & 0xFF;
|
||||
mixers[2].language = gLinkPlayers[3].language;
|
||||
INIT_SECRET_BASE_RECORD_MIXER(1, 2, 3)
|
||||
break;
|
||||
case 1:
|
||||
mixers[0].secretBases = secretBases + 2 * recordSize;
|
||||
mixers[0].version = gLinkPlayers[2].version & 0xFF;
|
||||
mixers[0].language = gLinkPlayers[2].language;
|
||||
mixers[1].secretBases = secretBases + 3 * recordSize;
|
||||
mixers[1].version = gLinkPlayers[3].version & 0xFF;
|
||||
mixers[1].language = gLinkPlayers[3].language;
|
||||
mixers[2].secretBases = secretBases + 0 * recordSize;
|
||||
mixers[2].version = gLinkPlayers[0].version & 0xFF;
|
||||
mixers[2].language = gLinkPlayers[0].language;
|
||||
INIT_SECRET_BASE_RECORD_MIXER(2, 3, 0)
|
||||
break;
|
||||
case 2:
|
||||
mixers[0].secretBases = secretBases + 3 * recordSize;
|
||||
mixers[0].version = gLinkPlayers[3].version & 0xFF;
|
||||
mixers[0].language = gLinkPlayers[3].language;
|
||||
mixers[1].secretBases = secretBases + 0 * recordSize;
|
||||
mixers[1].version = gLinkPlayers[0].version & 0xFF;
|
||||
mixers[1].language = gLinkPlayers[0].language;
|
||||
mixers[2].secretBases = secretBases + 1 * recordSize;
|
||||
mixers[2].version = gLinkPlayers[1].version & 0xFF;
|
||||
mixers[2].language = gLinkPlayers[1].language;
|
||||
INIT_SECRET_BASE_RECORD_MIXER(3, 0, 1)
|
||||
break;
|
||||
case 3:
|
||||
mixers[0].secretBases = secretBases + 0 * recordSize;
|
||||
mixers[0].version = gLinkPlayers[0].version & 0xFF;
|
||||
mixers[0].language = gLinkPlayers[0].language;
|
||||
mixers[1].secretBases = secretBases + 1 * recordSize;
|
||||
mixers[1].version = gLinkPlayers[1].version & 0xFF;
|
||||
mixers[1].language = gLinkPlayers[1].language;
|
||||
mixers[2].secretBases = secretBases + 2 * recordSize;
|
||||
mixers[2].version = gLinkPlayers[2].version & 0xFF;
|
||||
mixers[2].language = gLinkPlayers[2].language;
|
||||
INIT_SECRET_BASE_RECORD_MIXER(0, 1, 2)
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1734,13 +1735,13 @@ void InitSecretBaseVars(void)
|
||||
sInFriendSecretBase = FALSE;
|
||||
}
|
||||
|
||||
void sub_80EB218(void)
|
||||
void CheckLeftFriendsSecretBase(void)
|
||||
{
|
||||
if (VarGet(VAR_SECRET_BASE_IS_NOT_LOCAL) && sInFriendSecretBase == TRUE && !CurMapIsSecretBase())
|
||||
{
|
||||
VarSet(VAR_SECRET_BASE_IS_NOT_LOCAL, FALSE);
|
||||
sInFriendSecretBase = FALSE;
|
||||
sub_80EEA70();
|
||||
TryPutSecretBaseSecretsOnAir();
|
||||
VarSet(VAR_SECRET_BASE_STEP_COUNTER, 0);
|
||||
VarSet(VAR_SECRET_BASE_LAST_ITEM_USED, 0);
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, 0);
|
||||
@@ -1749,252 +1750,245 @@ void sub_80EB218(void)
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80EB290(void)
|
||||
void CheckInteractedWithFriendsDollDecor(void)
|
||||
{
|
||||
if (VarGet(VAR_CURRENT_SECRET_BASE) != 0)
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | 0x800);
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | SECRET_BASE_USED_DOLL);
|
||||
}
|
||||
|
||||
void sub_80EB2C8(void)
|
||||
void CheckInteractedWithFriendsCushionDecor(void)
|
||||
{
|
||||
if (VarGet(VAR_CURRENT_SECRET_BASE) != 0)
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | 0x400);
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | SECRET_BASE_USED_CUSHION);
|
||||
}
|
||||
|
||||
void sub_80EB300(void)
|
||||
void DeclinedSecretBaseBattle(void)
|
||||
{
|
||||
if (VarGet(VAR_CURRENT_SECRET_BASE) != 0)
|
||||
{
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) & ~0x3800);
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) & ~0x001);
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | 0x2000);
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) & ~(SECRET_BASE_BATTLED_WON | SECRET_BASE_BATTLED_LOST | SECRET_BASE_DECLINED_BATTLE));
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) & ~(SECRET_BASE_BATTLED_DRAW));
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | SECRET_BASE_DECLINED_BATTLE);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80EB368(void)
|
||||
void WonSecretBaseBattle(void)
|
||||
{
|
||||
if (VarGet(VAR_CURRENT_SECRET_BASE) != 0)
|
||||
{
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) & ~0x3800);
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) & ~0x001);
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | 0x800);
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) & ~(SECRET_BASE_BATTLED_WON | SECRET_BASE_BATTLED_LOST | SECRET_BASE_DECLINED_BATTLE));
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) & ~(SECRET_BASE_BATTLED_DRAW));
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | SECRET_BASE_BATTLED_WON);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80EB3D0(void)
|
||||
void LostSecretBaseBattle(void)
|
||||
{
|
||||
if (VarGet(VAR_CURRENT_SECRET_BASE) != 0)
|
||||
{
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) & ~0x3800);
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) & ~0x001);
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | 0x1000);
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) & ~(SECRET_BASE_BATTLED_WON | SECRET_BASE_BATTLED_LOST | SECRET_BASE_DECLINED_BATTLE));
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) & ~(SECRET_BASE_BATTLED_DRAW));
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | SECRET_BASE_BATTLED_LOST);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80EB438(void)
|
||||
void DrewSecretBaseBattle(void)
|
||||
{
|
||||
if (VarGet(VAR_CURRENT_SECRET_BASE) != 0)
|
||||
{
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) & ~0x3800);
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) & ~0x001);
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | 0x001);
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) & ~(SECRET_BASE_BATTLED_WON | SECRET_BASE_BATTLED_LOST | SECRET_BASE_DECLINED_BATTLE));
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) & ~(SECRET_BASE_BATTLED_DRAW));
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | SECRET_BASE_BATTLED_DRAW);
|
||||
}
|
||||
}
|
||||
|
||||
void SetSecretBaseSecretsTvFlags_Poster(void)
|
||||
void CheckInteractedWithFriendsPosterDecor(void)
|
||||
{
|
||||
s16 x, y;
|
||||
|
||||
GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
|
||||
switch (MapGridGetMetatileIdAt(x, y))
|
||||
{
|
||||
case 0x31C:
|
||||
case 0x31D:
|
||||
case 0x31E:
|
||||
case 0x31F:
|
||||
case 0x324:
|
||||
case 0x325:
|
||||
case 0x326:
|
||||
case 0x327:
|
||||
case 0x32C:
|
||||
case 0x32D:
|
||||
case 0x330:
|
||||
case 0x331:
|
||||
case 0x332:
|
||||
case 0x333:
|
||||
case 0x334:
|
||||
case METATILE_SecretBase_PikaPoster_Left:
|
||||
case METATILE_SecretBase_PikaPoster_Right:
|
||||
case METATILE_SecretBase_LongPoster_Left:
|
||||
case METATILE_SecretBase_LongPoster_Right:
|
||||
case METATILE_SecretBase_SeaPoster_Left:
|
||||
case METATILE_SecretBase_SeaPoster_Right:
|
||||
case METATILE_SecretBase_SkyPoster_Left:
|
||||
case METATILE_SecretBase_SkyPoster_Right:
|
||||
case METATILE_SecretBase_KissPoster_Left:
|
||||
case METATILE_SecretBase_KissPoster_Right:
|
||||
case METATILE_SecretBase_BallPoster:
|
||||
case METATILE_SecretBase_GreenPoster:
|
||||
case METATILE_SecretBase_RedPoster:
|
||||
case METATILE_SecretBase_BluePoster:
|
||||
case METATILE_SecretBase_CutePoster:
|
||||
if (VarGet(VAR_CURRENT_SECRET_BASE) != 0)
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | 0x4000);
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | SECRET_BASE_USED_POSTER);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetSecretBaseSecretsTvFlags_MiscFurnature(void)
|
||||
void CheckInteractedWithFriendsFurnitureBottom(void)
|
||||
{
|
||||
s16 x, y;
|
||||
|
||||
GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
|
||||
switch (MapGridGetMetatileIdAt(x, y))
|
||||
{
|
||||
case 0x28a:
|
||||
case 0x28b:
|
||||
// Bird Statue
|
||||
case METATILE_SecretBase_GlassOrnament_Base1:
|
||||
case METATILE_SecretBase_GlassOrnament_Base2:
|
||||
if (VarGet(VAR_CURRENT_SECRET_BASE) != 0)
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | 0x40);
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | SECRET_BASE_USED_GLASS_ORNAMENT);
|
||||
break;
|
||||
case 0x2d8:
|
||||
case 0x2d9:
|
||||
case 0x2da:
|
||||
case 0x2db:
|
||||
case 0x2dc:
|
||||
case 0x2dd:
|
||||
case 0x2e8:
|
||||
case 0x2e9:
|
||||
case 0x2ea:
|
||||
case 0x2eb:
|
||||
case 0x2ec:
|
||||
case 0x2ed:
|
||||
case 0x2ee:
|
||||
case 0x2ef:
|
||||
case 0x2f8:
|
||||
case 0x2f9:
|
||||
case 0x2fa:
|
||||
case 0x2fb:
|
||||
// Plants
|
||||
case METATILE_SecretBase_RedPlant_Base1:
|
||||
case METATILE_SecretBase_RedPlant_Base2:
|
||||
case METATILE_SecretBase_TropicalPlant_Base1:
|
||||
case METATILE_SecretBase_TropicalPlant_Base2:
|
||||
case METATILE_SecretBase_PrettyFlower_Base1:
|
||||
case METATILE_SecretBase_PrettyFlower_Base2:
|
||||
case METATILE_SecretBase_ColorfulFlowers_BaseLeft1:
|
||||
case METATILE_SecretBase_ColorfulFlowers_BaseRight1:
|
||||
case METATILE_SecretBase_ColorfulFlowers_BaseLeft2:
|
||||
case METATILE_SecretBase_ColorfulFlowers_BaseRight2:
|
||||
case METATILE_SecretBase_BigPlant_BaseLeft1:
|
||||
case METATILE_SecretBase_BigPlant_BaseRight1:
|
||||
case METATILE_SecretBase_BigPlant_BaseLeft2:
|
||||
case METATILE_SecretBase_BigPlant_BaseRight2:
|
||||
case METATILE_SecretBase_GorgeousPlant_BaseLeft1:
|
||||
case METATILE_SecretBase_GorgeousPlant_BaseRight1:
|
||||
case METATILE_SecretBase_GorgeousPlant_BaseLeft2:
|
||||
case METATILE_SecretBase_GorgeousPlant_BaseRight2:
|
||||
if (VarGet(VAR_CURRENT_SECRET_BASE) != 0)
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | 0x8);
|
||||
VarSet(VAR_SECRET_BASE_LOW_TV_FLAGS, VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) | SECRET_BASE_USED_PLANT);
|
||||
break;
|
||||
case 0x22c:
|
||||
case 0x233:
|
||||
// Fence
|
||||
case METATILE_SecretBase_Fence_Horizontal:
|
||||
case METATILE_SecretBase_Fence_Vertical:
|
||||
if (VarGet(VAR_CURRENT_SECRET_BASE) != 0)
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | 0x40);
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | SECRET_BASE_USED_FENCE);
|
||||
break;
|
||||
case 0x288:
|
||||
case 0x289:
|
||||
// Tire
|
||||
case METATILE_SecretBase_Tire_BottomLeft:
|
||||
case METATILE_SecretBase_Tire_BottomRight:
|
||||
if (VarGet(VAR_CURRENT_SECRET_BASE) != 0)
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | 0x100);
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | SECRET_BASE_USED_TIRE);
|
||||
break;
|
||||
case 0x22d:
|
||||
case 0x22e:
|
||||
case 0x22f:
|
||||
// Bricks
|
||||
case METATILE_SecretBase_RedBrick_Bottom:
|
||||
case METATILE_SecretBase_YellowBrick_Bottom:
|
||||
case METATILE_SecretBase_BlueBrick_Bottom:
|
||||
if (VarGet(VAR_CURRENT_SECRET_BASE) != 0)
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | 0x10);
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | SECRET_BASE_USED_BRICK);
|
||||
break;
|
||||
case 0x287:
|
||||
case 0x28f:
|
||||
case 0x298:
|
||||
case 0x299:
|
||||
case 0x29a:
|
||||
case 0x29b:
|
||||
case 0x29c:
|
||||
case 0x29d:
|
||||
case 0x29e:
|
||||
case 0x29f:
|
||||
case 0x2ab:
|
||||
case 0x2b0:
|
||||
case 0x2b1:
|
||||
case 0x2b2:
|
||||
case 0x2b4:
|
||||
case 0x2b5:
|
||||
case 0x2b6:
|
||||
case 0x2b7:
|
||||
case 0x2cb:
|
||||
case 0x2cc:
|
||||
case 0x2cd:
|
||||
case 0x2ce:
|
||||
case 0x2cf:
|
||||
// Tables
|
||||
case METATILE_SecretBase_SmallDesk:
|
||||
case METATILE_SecretBase_PokemonDesk:
|
||||
case METATILE_SecretBase_HeavyDesk_BottomLeft:
|
||||
case METATILE_SecretBase_HeavyDesk_BottomMid:
|
||||
case METATILE_SecretBase_HeavyDesk_BottomRight:
|
||||
case METATILE_SecretBase_RaggedDesk_BottomLeft:
|
||||
case METATILE_SecretBase_RaggedDesk_BottomMid:
|
||||
case METATILE_SecretBase_RaggedDesk_BottomRight:
|
||||
case METATILE_SecretBase_ComfortDesk_BottomLeft:
|
||||
case METATILE_SecretBase_ComfortDesk_BottomMid:
|
||||
case METATILE_SecretBase_ComfortDesk_BottomRight:
|
||||
case METATILE_SecretBase_BrickDesk_BottomLeft:
|
||||
case METATILE_SecretBase_BrickDesk_BottomMid:
|
||||
case METATILE_SecretBase_BrickDesk_BottomRight:
|
||||
case METATILE_SecretBase_CampDesk_BottomLeft:
|
||||
case METATILE_SecretBase_CampDesk_BottomMid:
|
||||
case METATILE_SecretBase_CampDesk_BottomRight:
|
||||
case METATILE_SecretBase_HardDesk_BottomLeft:
|
||||
case METATILE_SecretBase_HardDesk_BottomMid:
|
||||
case METATILE_SecretBase_HardDesk_BottomRight:
|
||||
case METATILE_SecretBase_PrettyDesk_BottomLeft:
|
||||
case METATILE_SecretBase_PrettyDesk_BottomMid:
|
||||
case METATILE_SecretBase_PrettyDesk_BottomRight:
|
||||
if (VarGet(VAR_CURRENT_SECRET_BASE) != 0)
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | 0x8);
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | SECRET_BASE_USED_DESK);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetSecretBaseSecretsTvFlags_LargeDecorationSpot(void)
|
||||
void CheckInteractedWithFriendsFurnitureMiddle(void)
|
||||
{
|
||||
s16 x, y;
|
||||
|
||||
GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
|
||||
switch (MapGridGetMetatileIdAt(x, y))
|
||||
{
|
||||
case 0x291:
|
||||
case 0x294:
|
||||
case 0x297:
|
||||
case 0x2a1:
|
||||
case 0x2a5:
|
||||
case 0x2a9:
|
||||
case 0x2ad:
|
||||
case 0x2bb:
|
||||
case 0x2be:
|
||||
case 0x2c3:
|
||||
case 0x2c6:
|
||||
case METATILE_SecretBase_HeavyDesk_TopMid:
|
||||
case METATILE_SecretBase_RaggedDesk_TopMid:
|
||||
case METATILE_SecretBase_ComfortDesk_TopMid:
|
||||
case METATILE_SecretBase_BrickDesk_TopMid:
|
||||
case METATILE_SecretBase_BrickDesk_Center:
|
||||
case METATILE_SecretBase_CampDesk_TopMid:
|
||||
case METATILE_SecretBase_CampDesk_Center:
|
||||
case METATILE_SecretBase_HardDesk_TopMid:
|
||||
case METATILE_SecretBase_HardDesk_Center:
|
||||
case METATILE_SecretBase_PrettyDesk_TopMid:
|
||||
case METATILE_SecretBase_PrettyDesk_Center:
|
||||
if (VarGet(VAR_CURRENT_SECRET_BASE) != 0)
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | 0x8);
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | SECRET_BASE_USED_DESK);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetSecretBaseSecretsTvFlags_SmallDecorationSpot(void)
|
||||
void CheckInteractedWithFriendsFurnitureTop(void)
|
||||
{
|
||||
s16 x, y;
|
||||
|
||||
GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
|
||||
switch (MapGridGetMetatileIdAt(x, y))
|
||||
{
|
||||
case 0x290:
|
||||
case 0x292:
|
||||
case 0x293:
|
||||
case 0x295:
|
||||
case 0x296:
|
||||
case 0x2a0:
|
||||
case 0x2a2:
|
||||
case 0x2a3:
|
||||
case 0x2a4:
|
||||
case 0x2a6:
|
||||
case 0x2a7:
|
||||
case 0x2a8:
|
||||
case 0x2aa:
|
||||
case 0x2ac:
|
||||
case 0x2ae:
|
||||
case 0x2af:
|
||||
case 0x2bc:
|
||||
case 0x2bd:
|
||||
case 0x2bf:
|
||||
case 0x2c4:
|
||||
case 0x2c5:
|
||||
case 0x2c7:
|
||||
case METATILE_SecretBase_HeavyDesk_TopLeft:
|
||||
case METATILE_SecretBase_HeavyDesk_TopRight:
|
||||
case METATILE_SecretBase_RaggedDesk_TopLeft:
|
||||
case METATILE_SecretBase_RaggedDesk_TopRight:
|
||||
case METATILE_SecretBase_ComfortDesk_TopLeft:
|
||||
case METATILE_SecretBase_ComfortDesk_TopRight:
|
||||
case METATILE_SecretBase_BrickDesk_TopLeft:
|
||||
case METATILE_SecretBase_BrickDesk_TopRight:
|
||||
case METATILE_SecretBase_BrickDesk_MidLeft:
|
||||
case METATILE_SecretBase_BrickDesk_MidRight:
|
||||
case METATILE_SecretBase_CampDesk_TopLeft:
|
||||
case METATILE_SecretBase_CampDesk_TopRight:
|
||||
case METATILE_SecretBase_CampDesk_MidLeft:
|
||||
case METATILE_SecretBase_CampDesk_MidRight:
|
||||
case METATILE_SecretBase_HardDesk_TopLeft:
|
||||
case METATILE_SecretBase_HardDesk_TopRight:
|
||||
case METATILE_SecretBase_HardDesk_MidLeft:
|
||||
case METATILE_SecretBase_HardDesk_MidRight:
|
||||
case METATILE_SecretBase_PrettyDesk_TopLeft:
|
||||
case METATILE_SecretBase_PrettyDesk_TopRight:
|
||||
case METATILE_SecretBase_PrettyDesk_MidLeft:
|
||||
case METATILE_SecretBase_PrettyDesk_MidRight:
|
||||
if (VarGet(VAR_CURRENT_SECRET_BASE) != 0)
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | 0x8);
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | SECRET_BASE_USED_DESK);
|
||||
break;
|
||||
case 0x280:
|
||||
case 0x281:
|
||||
case METATILE_SecretBase_Tire_TopLeft:
|
||||
case METATILE_SecretBase_Tire_TopRight:
|
||||
if (VarGet(VAR_CURRENT_SECRET_BASE) != 0)
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | 0x100);
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | SECRET_BASE_USED_TIRE);
|
||||
break;
|
||||
case 0x225:
|
||||
case 0x226:
|
||||
case 0x227:
|
||||
case METATILE_SecretBase_RedBrick_Top:
|
||||
case METATILE_SecretBase_YellowBrick_Top:
|
||||
case METATILE_SecretBase_BlueBrick_Top:
|
||||
if (VarGet(VAR_CURRENT_SECRET_BASE) != 0)
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | 0x10);
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | SECRET_BASE_USED_BRICK);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetSecretBaseSecretsTvFlags_SandOrnament(void)
|
||||
void CheckInteractedWithFriendsSandOrnament(void)
|
||||
{
|
||||
s16 x, y;
|
||||
|
||||
GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
|
||||
switch ((int)MapGridGetMetatileIdAt(x, y))
|
||||
{
|
||||
case 0x28d:
|
||||
case 0x28e:
|
||||
// Sand Ornament
|
||||
case METATILE_SecretBase_SandOrnament_Base1:
|
||||
case METATILE_SecretBase_SandOrnament_Base2:
|
||||
if (VarGet(VAR_CURRENT_SECRET_BASE) != 0)
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | 0x4);
|
||||
VarSet(VAR_SECRET_BASE_HIGH_TV_FLAGS, VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) | SECRET_BASE_USED_SAND_ORNAMENT);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
+4
-8
@@ -966,8 +966,8 @@ static u8 SaveConfirmInputCallback(void)
|
||||
case 0: // Yes
|
||||
switch (gSaveFileStatus)
|
||||
{
|
||||
case 0:
|
||||
case 2:
|
||||
case SAVE_STATUS_EMPTY:
|
||||
case SAVE_STATUS_CORRUPT:
|
||||
if (gDifferentSaveFile == FALSE)
|
||||
{
|
||||
sSaveDialogCallback = SaveFileExistsCallback;
|
||||
@@ -1059,14 +1059,10 @@ static u8 SaveDoSaveCallback(void)
|
||||
saveStatus = TrySavingData(SAVE_NORMAL);
|
||||
}
|
||||
|
||||
if (saveStatus == 1) // Save succeded
|
||||
{
|
||||
if (saveStatus == SAVE_STATUS_OK)
|
||||
ShowSaveMessage(gText_PlayerSavedGame, SaveSuccessCallback);
|
||||
}
|
||||
else // Save error
|
||||
{
|
||||
else
|
||||
ShowSaveMessage(gText_SaveError, SaveErrorCallback);
|
||||
}
|
||||
|
||||
SaveStartTimer();
|
||||
return SAVE_IN_PROGRESS;
|
||||
|
||||
+4
-4
@@ -217,7 +217,7 @@ static void sub_807E55C(struct Sprite *sprite);
|
||||
static void sub_807E5D8(struct Sprite *sprite);
|
||||
static void sub_807E64C(struct Sprite *sprite);
|
||||
static void sub_807E6AC(struct Sprite *sprite);
|
||||
static void BuffeInGameTradeMonName(void);
|
||||
static void BufferInGameTradeMonName(void);
|
||||
static void SetInGameTradeMail(struct MailStruct *mail, const struct InGameTrade *trade);
|
||||
static void CB2_UpdateLinkTrade(void);
|
||||
static void CB2_TryFinishTrade(void);
|
||||
@@ -3761,7 +3761,7 @@ static bool8 AnimateTradeSequenceCable(void)
|
||||
FREE_AND_SET_NULL(sTradeData);
|
||||
}
|
||||
SetMainCallback2(CB2_ReturnToField);
|
||||
BuffeInGameTradeMonName();
|
||||
BufferInGameTradeMonName();
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -4276,7 +4276,7 @@ static bool8 AnimateTradeSequenceWireless(void)
|
||||
FREE_AND_SET_NULL(sTradeData);
|
||||
}
|
||||
SetMainCallback2(CB2_ReturnToField);
|
||||
BuffeInGameTradeMonName();
|
||||
BufferInGameTradeMonName();
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -4418,7 +4418,7 @@ u16 GetInGameTradeSpeciesInfo(void)
|
||||
return inGameTrade->requestedSpecies;
|
||||
}
|
||||
|
||||
static void BuffeInGameTradeMonName(void)
|
||||
static void BufferInGameTradeMonName(void)
|
||||
{
|
||||
u8 nickname[32];
|
||||
const struct InGameTrade *inGameTrade = &sIngameTrades[gSpecialVar_0x8004];
|
||||
|
||||
@@ -637,50 +637,51 @@ static const u8 *const sTVWhatsNo1InHoennTodayTextGroup[] = {
|
||||
gTVWhatsNo1InHoennTodayText08
|
||||
};
|
||||
|
||||
static const u8 *const sTVSecretBaseSecretsTextGroup[] = {
|
||||
gTVSecretBaseSecretsText00,
|
||||
gTVSecretBaseSecretsText01,
|
||||
gTVSecretBaseSecretsText02,
|
||||
gTVSecretBaseSecretsText03,
|
||||
gTVSecretBaseSecretsText04,
|
||||
gTVSecretBaseSecretsText05,
|
||||
gTVSecretBaseSecretsText06,
|
||||
gTVSecretBaseSecretsText07,
|
||||
gTVSecretBaseSecretsText08,
|
||||
gTVSecretBaseSecretsText09,
|
||||
gTVSecretBaseSecretsText10,
|
||||
gTVSecretBaseSecretsText11,
|
||||
gTVSecretBaseSecretsText12,
|
||||
gTVSecretBaseSecretsText13,
|
||||
gTVSecretBaseSecretsText14,
|
||||
gTVSecretBaseSecretsText15,
|
||||
gTVSecretBaseSecretsText16,
|
||||
gTVSecretBaseSecretsText17,
|
||||
gTVSecretBaseSecretsText18,
|
||||
gTVSecretBaseSecretsText19,
|
||||
gTVSecretBaseSecretsText20,
|
||||
gTVSecretBaseSecretsText21,
|
||||
gTVSecretBaseSecretsText22,
|
||||
gTVSecretBaseSecretsText23,
|
||||
gTVSecretBaseSecretsText24,
|
||||
gTVSecretBaseSecretsText25,
|
||||
gTVSecretBaseSecretsText26,
|
||||
gTVSecretBaseSecretsText27,
|
||||
gTVSecretBaseSecretsText28,
|
||||
gTVSecretBaseSecretsText29,
|
||||
gTVSecretBaseSecretsText30,
|
||||
gTVSecretBaseSecretsText31,
|
||||
gTVSecretBaseSecretsText32,
|
||||
gTVSecretBaseSecretsText33,
|
||||
gTVSecretBaseSecretsText34,
|
||||
gTVSecretBaseSecretsText35,
|
||||
gTVSecretBaseSecretsText36,
|
||||
gTVSecretBaseSecretsText37,
|
||||
gTVSecretBaseSecretsText38,
|
||||
gTVSecretBaseSecretsText39,
|
||||
gTVSecretBaseSecretsText40,
|
||||
gTVSecretBaseSecretsText41,
|
||||
gTVSecretBaseSecretsText42
|
||||
static const u8 *const sTVSecretBaseSecretsTextGroup[SBSECRETS_NUM_STATES] =
|
||||
{
|
||||
[SBSECRETS_STATE_INTRO] = TVSecretBaseSecrets_Text_Intro,
|
||||
[SBSECRETS_STATE_DO_NEXT1] = TVSecretBaseSecrets_Text_WhatWillPlayerDoNext1,
|
||||
[SBSECRETS_STATE_DO_NEXT2] = TVSecretBaseSecrets_Text_WhatWillPlayerDoNext2,
|
||||
[SBSECRETS_STATE_TOOK_X_STEPS] = TVSecretBaseSecrets_Text_TookXStepsBeforeLeaving,
|
||||
[SBSECRETS_STATE_BASE_INTEREST_LOW] = TVSecretBaseSecrets_Text_BaseFailedToInterestPlayer,
|
||||
[SBSECRETS_STATE_BASE_INTEREST_MED] = TVSecretBaseSecrets_Text_PlayerEnjoyedBase,
|
||||
[SBSECRETS_STATE_BASE_INTEREST_HIGH] = TVSecretBaseSecrets_Text_PlayerHugeFanOfBase,
|
||||
[SBSECRETS_STATE_OUTRO] = TVSecretBaseSecrets_Text_Outro,
|
||||
[SBSECRETS_STATE_NOTHING_USED1] = TVSecretBaseSecrets_Text_StoppedMoving1,
|
||||
[SBSECRETS_STATE_NOTHING_USED2] = TVSecretBaseSecrets_Text_StoppedMoving2,
|
||||
[SBSECRETS_STATE_USED_CHAIR] = TVSecretBaseSecrets_Text_UsedChair,
|
||||
[SBSECRETS_STATE_USED_BALLOON] = TVSecretBaseSecrets_Text_UsedBalloon,
|
||||
[SBSECRETS_STATE_USED_TENT] = TVSecretBaseSecrets_Text_UsedTent,
|
||||
[SBSECRETS_STATE_USED_PLANT] = TVSecretBaseSecrets_Text_UsedPlant,
|
||||
[SBSECRETS_STATE_USED_GOLD_SHIELD] = TVSecretBaseSecrets_Text_UsedGoldShield,
|
||||
[SBSECRETS_STATE_USED_SILVER_SHIELD] = TVSecretBaseSecrets_Text_UsedSilverShield,
|
||||
[SBSECRETS_STATE_USED_GLASS_ORNAMENT] = TVSecretBaseSecrets_Text_UsedGlassOrnament,
|
||||
[SBSECRETS_STATE_USED_TV] = TVSecretBaseSecrets_Text_UsedTV,
|
||||
[SBSECRETS_STATE_USED_MUD_BALL] = TVSecretBaseSecrets_Text_UsedMudBall,
|
||||
[SBSECRETS_STATE_USED_BAG] = TVSecretBaseSecrets_Text_UsedBag,
|
||||
[SBSECRETS_STATE_USED_CUSHION] = TVSecretBaseSecrets_Text_UsedCushion,
|
||||
[SBSECRETS_STATE_HIT_CUSHION] = TVSecretBaseSecrets_Text_HitCushion,
|
||||
[SBSECRETS_STATE_HUGGED_CUSHION] = TVSecretBaseSecrets_Text_HuggedCushion,
|
||||
[SBSECRETS_STATE_BATTLED_WON] = TVSecretBaseSecrets_Text_BattledWon,
|
||||
[SBSECRETS_STATE_BATTLED_LOST] = TVSecretBaseSecrets_Text_BattledLost,
|
||||
[SBSECRETS_STATE_DECLINED_BATTLE] = TVSecretBaseSecrets_Text_DeclinedBattle,
|
||||
[SBSECRETS_STATE_USED_POSTER] = TVSecretBaseSecrets_Text_UsedPoster,
|
||||
[SBSECRETS_STATE_USED_NOTE_MAT] = TVSecretBaseSecrets_Text_UsedNoteMat,
|
||||
[SBSECRETS_STATE_BATTLED_DRAW] = TVSecretBaseSecrets_Text_BattledDraw,
|
||||
[SBSECRETS_STATE_USED_SPIN_MAT] = TVSecretBaseSecrets_Text_UsedSpinMat,
|
||||
[SBSECRETS_STATE_USED_SAND_ORNAMENT] = TVSecretBaseSecrets_Text_UsedSandOrnament,
|
||||
[SBSECRETS_STATE_USED_DESK] = TVSecretBaseSecrets_Text_UsedDesk,
|
||||
[SBSECRETS_STATE_USED_BRICK] = TVSecretBaseSecrets_Text_UsedBrick,
|
||||
[SBSECRETS_STATE_USED_SOLID_BOARD] = TVSecretBaseSecrets_Text_UsedSolidBoard,
|
||||
[SBSECRETS_STATE_USED_FENCE] = TVSecretBaseSecrets_Text_UsedFence,
|
||||
[SBSECRETS_STATE_USED_GLITTER_MAT] = TVSecretBaseSecrets_Text_UsedGlitterMat,
|
||||
[SBSECRETS_STATE_USED_TIRE] = TVSecretBaseSecrets_Text_UsedTire,
|
||||
[SBSECRETS_STATE_USED_STAND] = TVSecretBaseSecrets_Text_UsedStand,
|
||||
[SBSECRETS_STATE_USED_BREAKABLE_DOOR] = TVSecretBaseSecrets_Text_BrokeDoor,
|
||||
[SBSECRETS_STATE_USED_DOLL] = TVSecretBaseSecrets_Text_UsedDoll,
|
||||
[SBSECRETS_STATE_USED_SLIDE] = TVSecretBaseSecrets_Text_UsedSlide,
|
||||
[SBSECRETS_STATE_DECLINED_SLIDE] = TVSecretBaseSecrets_Text_UsedSlideButDidntGoDown,
|
||||
[SBSECRETS_STATE_USED_JUMP_MAT] = TVSecretBaseSecrets_Text_UsedJumpMat
|
||||
};
|
||||
|
||||
static const u8 *const sTVSafariFanClubTextGroup[] = {
|
||||
@@ -709,39 +710,42 @@ static const u8 *const sTVInSearchOfTrainersTextGroup[] = {
|
||||
gTVInSearchOfTrainersText08
|
||||
};
|
||||
|
||||
const u8 sTVSecretBaseSecretsStateLookup[] = {
|
||||
0x0a,
|
||||
0x0b,
|
||||
0x0c,
|
||||
0x0d,
|
||||
0x0e,
|
||||
0x0f,
|
||||
0x10,
|
||||
0x11,
|
||||
0x12,
|
||||
0x13,
|
||||
0x14,
|
||||
0x17,
|
||||
0x18,
|
||||
0x19,
|
||||
0x1a,
|
||||
0x1b,
|
||||
0x1c,
|
||||
0x1d,
|
||||
0x1e,
|
||||
0x1f,
|
||||
0x20,
|
||||
0x21,
|
||||
0x22,
|
||||
0x23,
|
||||
0x24,
|
||||
0x25,
|
||||
0x26,
|
||||
0x27,
|
||||
0x28,
|
||||
0x29,
|
||||
0x2a,
|
||||
0x2b
|
||||
// Secret Base Secrets TV Show states for actions that can be taken in a secret base
|
||||
// The flags that determine whether or not the action was taken are commented
|
||||
const u8 sTVSecretBaseSecretsActions[NUM_SECRET_BASE_FLAGS] =
|
||||
{
|
||||
SBSECRETS_STATE_USED_CHAIR, // SECRET_BASE_USED_CHAIR
|
||||
SBSECRETS_STATE_USED_BALLOON, // SECRET_BASE_USED_BALLOON
|
||||
SBSECRETS_STATE_USED_TENT, // SECRET_BASE_USED_TENT
|
||||
SBSECRETS_STATE_USED_PLANT, // SECRET_BASE_USED_PLANT
|
||||
SBSECRETS_STATE_USED_GOLD_SHIELD, // SECRET_BASE_USED_GOLD_SHIELD
|
||||
SBSECRETS_STATE_USED_SILVER_SHIELD, // SECRET_BASE_USED_SILVER_SHIELD
|
||||
SBSECRETS_STATE_USED_GLASS_ORNAMENT, // SECRET_BASE_USED_GLASS_ORNAMENT
|
||||
SBSECRETS_STATE_USED_TV, // SECRET_BASE_USED_TV
|
||||
SBSECRETS_STATE_USED_MUD_BALL, // SECRET_BASE_USED_MUD_BALL
|
||||
SBSECRETS_STATE_USED_BAG, // SECRET_BASE_USED_BAG
|
||||
SBSECRETS_STATE_USED_CUSHION, // SECRET_BASE_USED_CUSHION
|
||||
SBSECRETS_STATE_BATTLED_WON, // SECRET_BASE_BATTLED_WON
|
||||
SBSECRETS_STATE_BATTLED_LOST, // SECRET_BASE_BATTLED_LOST
|
||||
SBSECRETS_STATE_DECLINED_BATTLE, // SECRET_BASE_DECLINED_BATTLE
|
||||
SBSECRETS_STATE_USED_POSTER, // SECRET_BASE_USED_POSTER
|
||||
SBSECRETS_STATE_USED_NOTE_MAT, // SECRET_BASE_USED_NOTE_MAT
|
||||
SBSECRETS_STATE_BATTLED_DRAW, // SECRET_BASE_BATTLED_DRAW
|
||||
SBSECRETS_STATE_USED_SPIN_MAT, // SECRET_BASE_USED_SPIN_MAT
|
||||
SBSECRETS_STATE_USED_SAND_ORNAMENT, // SECRET_BASE_USED_SAND_ORNAMENT
|
||||
SBSECRETS_STATE_USED_DESK, // SECRET_BASE_USED_DESK
|
||||
SBSECRETS_STATE_USED_BRICK, // SECRET_BASE_USED_BRICK
|
||||
SBSECRETS_STATE_USED_SOLID_BOARD, // SECRET_BASE_USED_SOLID_BOARD
|
||||
SBSECRETS_STATE_USED_FENCE, // SECRET_BASE_USED_FENCE
|
||||
SBSECRETS_STATE_USED_GLITTER_MAT, // SECRET_BASE_USED_GLITTER_MAT
|
||||
SBSECRETS_STATE_USED_TIRE, // SECRET_BASE_USED_TIRE
|
||||
SBSECRETS_STATE_USED_STAND, // SECRET_BASE_USED_STAND
|
||||
SBSECRETS_STATE_USED_BREAKABLE_DOOR, // SECRET_BASE_USED_BREAKABLE_DOOR
|
||||
SBSECRETS_STATE_USED_DOLL, // SECRET_BASE_USED_DOLL
|
||||
SBSECRETS_STATE_USED_SLIDE, // SECRET_BASE_USED_SLIDE
|
||||
SBSECRETS_STATE_DECLINED_SLIDE, // SECRET_BASE_DECLINED_SLIDE
|
||||
SBSECRETS_STATE_USED_JUMP_MAT, // SECRET_BASE_USED_JUMP_MAT
|
||||
SBSECRETS_NUM_STATES // SECRET_BASE_UNUSED_FLAG. Odd that this is included, if it were used it would overflow sTVSecretBaseSecretsTextGroup
|
||||
};
|
||||
|
||||
// .text
|
||||
@@ -2544,7 +2548,7 @@ void TryPutFrontierTVShowOnAir(u16 winStreak, u8 facilityAndMode)
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80EEA70(void)
|
||||
void TryPutSecretBaseSecretsOnAir(void)
|
||||
{
|
||||
TVShow *show;
|
||||
u8 strbuf[32];
|
||||
@@ -3591,7 +3595,7 @@ void GetMomOrDadStringForTVMessage(void)
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80F01B8(void)
|
||||
void HideBattleTowerReporter(void)
|
||||
{
|
||||
VarSet(VAR_BRAVO_TRAINER_BATTLE_TOWER_ON, 0);
|
||||
RemoveObjectEventByLocalIdAndMap(5, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
|
||||
@@ -7340,35 +7344,32 @@ static void DoTVShowWhatsNo1InHoennToday(void)
|
||||
ShowFieldMessage(sTVWhatsNo1InHoennTodayTextGroup[state]);
|
||||
}
|
||||
|
||||
u8 TVShowGetFlagCount(TVShow *show)
|
||||
u8 SecretBaseSecrets_GetNumActionsTaken(TVShow *show)
|
||||
{
|
||||
u8 i;
|
||||
u8 tot;
|
||||
u8 flagsSet;
|
||||
|
||||
for (i = 0, tot = 0; i < 32; i ++)
|
||||
for (i = 0, flagsSet = 0; i < NUM_SECRET_BASE_FLAGS; i ++)
|
||||
{
|
||||
if ((show->secretBaseSecrets.flags >> i) & 1)
|
||||
{
|
||||
tot ++;
|
||||
}
|
||||
flagsSet++;
|
||||
}
|
||||
return tot;
|
||||
return flagsSet;
|
||||
}
|
||||
|
||||
static u8 SecretBaseSecrets_GetStateForFlagNumber(TVShow *show, u8 a1)
|
||||
static u8 SecretBaseSecrets_GetStateByFlagNumber(TVShow *show, u8 flagId)
|
||||
{
|
||||
u8 i;
|
||||
u8 tot;
|
||||
u8 flagsSet;
|
||||
|
||||
for (i = 0, tot = 0; i < 32; i ++)
|
||||
for (i = 0, flagsSet = 0; i < NUM_SECRET_BASE_FLAGS; i ++)
|
||||
{
|
||||
if ((show->secretBaseSecrets.flags >> i) & 1)
|
||||
{
|
||||
if (tot == a1)
|
||||
{
|
||||
return sTVSecretBaseSecretsStateLookup[i];
|
||||
}
|
||||
tot ++;
|
||||
if (flagsSet == flagId)
|
||||
return sTVSecretBaseSecretsActions[i];
|
||||
|
||||
flagsSet++;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
@@ -7378,7 +7379,7 @@ static void DoTVShowSecretBaseSecrets(void)
|
||||
{
|
||||
TVShow *show;
|
||||
u8 state;
|
||||
u8 bitCount;
|
||||
u8 numActions;
|
||||
u16 i;
|
||||
|
||||
show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
|
||||
@@ -7386,226 +7387,128 @@ static void DoTVShowSecretBaseSecrets(void)
|
||||
state = sTVShowState;
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
case SBSECRETS_STATE_INTRO:
|
||||
TVShowConvertInternationalString(gStringVar1, show->secretBaseSecrets.baseOwnersName, show->secretBaseSecrets.baseOwnersNameLanguage);
|
||||
TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language);
|
||||
bitCount = TVShowGetFlagCount(show);
|
||||
if (bitCount == 0)
|
||||
numActions = SecretBaseSecrets_GetNumActionsTaken(show);
|
||||
if (numActions == 0)
|
||||
{
|
||||
sTVShowState = 8;
|
||||
sTVShowState = SBSECRETS_STATE_NOTHING_USED1;
|
||||
}
|
||||
else
|
||||
{
|
||||
show->secretBaseSecrets.savedState = 1;
|
||||
sTVSecretBaseSecretsRandomValues[0] = Random() % bitCount;
|
||||
sTVShowState = SecretBaseSecrets_GetStateForFlagNumber(show, sTVSecretBaseSecretsRandomValues[0]);
|
||||
show->secretBaseSecrets.savedState = SBSECRETS_STATE_DO_NEXT1;
|
||||
sTVSecretBaseSecretsRandomValues[0] = Random() % numActions;
|
||||
sTVShowState = SecretBaseSecrets_GetStateByFlagNumber(show, sTVSecretBaseSecretsRandomValues[0]);
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
case SBSECRETS_STATE_DO_NEXT1:
|
||||
TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language);
|
||||
bitCount = TVShowGetFlagCount(show);
|
||||
switch (bitCount)
|
||||
numActions = SecretBaseSecrets_GetNumActionsTaken(show);
|
||||
switch (numActions)
|
||||
{
|
||||
case 1:
|
||||
sTVShowState = 9;
|
||||
sTVShowState = SBSECRETS_STATE_NOTHING_USED2;
|
||||
break;
|
||||
case 2:
|
||||
show->secretBaseSecrets.savedState = 2;
|
||||
show->secretBaseSecrets.savedState = SBSECRETS_STATE_DO_NEXT2;
|
||||
if (sTVSecretBaseSecretsRandomValues[0] == 0)
|
||||
{
|
||||
sTVShowState = SecretBaseSecrets_GetStateForFlagNumber(show, 1);
|
||||
sTVShowState = SecretBaseSecrets_GetStateByFlagNumber(show, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
sTVShowState = SecretBaseSecrets_GetStateForFlagNumber(show, 0);
|
||||
sTVShowState = SecretBaseSecrets_GetStateByFlagNumber(show, 0);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
for (i = 0; i < 0xFFFF; i ++)
|
||||
{
|
||||
sTVSecretBaseSecretsRandomValues[1] = Random() % bitCount;
|
||||
sTVSecretBaseSecretsRandomValues[1] = Random() % numActions;
|
||||
if (sTVSecretBaseSecretsRandomValues[1] != sTVSecretBaseSecretsRandomValues[0])
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
show->secretBaseSecrets.savedState = 2;
|
||||
sTVShowState = SecretBaseSecrets_GetStateForFlagNumber(show, sTVSecretBaseSecretsRandomValues[1]);
|
||||
show->secretBaseSecrets.savedState = SBSECRETS_STATE_DO_NEXT2;
|
||||
sTVShowState = SecretBaseSecrets_GetStateByFlagNumber(show, sTVSecretBaseSecretsRandomValues[1]);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
case SBSECRETS_STATE_DO_NEXT2:
|
||||
TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language);
|
||||
bitCount = TVShowGetFlagCount(show);
|
||||
if (bitCount == 2)
|
||||
numActions = SecretBaseSecrets_GetNumActionsTaken(show);
|
||||
if (numActions == 2)
|
||||
{
|
||||
sTVShowState = 9;
|
||||
sTVShowState = SBSECRETS_STATE_NOTHING_USED2;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < 0xFFFF; i ++)
|
||||
{
|
||||
sTVSecretBaseSecretsRandomValues[2] = Random() % bitCount;
|
||||
sTVSecretBaseSecretsRandomValues[2] = Random() % numActions;
|
||||
if (sTVSecretBaseSecretsRandomValues[2] != sTVSecretBaseSecretsRandomValues[0] && sTVSecretBaseSecretsRandomValues[2] != sTVSecretBaseSecretsRandomValues[1])
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
show->secretBaseSecrets.savedState = 3;
|
||||
sTVShowState = SecretBaseSecrets_GetStateForFlagNumber(show, sTVSecretBaseSecretsRandomValues[2]);
|
||||
show->secretBaseSecrets.savedState = SBSECRETS_STATE_TOOK_X_STEPS;
|
||||
sTVShowState = SecretBaseSecrets_GetStateByFlagNumber(show, sTVSecretBaseSecretsRandomValues[2]);
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
case SBSECRETS_STATE_TOOK_X_STEPS:
|
||||
TVShowConvertInternationalString(gStringVar1, show->secretBaseSecrets.baseOwnersName, show->secretBaseSecrets.baseOwnersNameLanguage);
|
||||
TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language);
|
||||
TV_PrintIntToStringVar(2, show->secretBaseSecrets.stepsInBase);
|
||||
if (show->secretBaseSecrets.stepsInBase <= 30)
|
||||
{
|
||||
sTVShowState = 4;
|
||||
sTVShowState = SBSECRETS_STATE_BASE_INTEREST_LOW;
|
||||
}
|
||||
else if (show->secretBaseSecrets.stepsInBase <= 100)
|
||||
{
|
||||
sTVShowState = 5;
|
||||
sTVShowState = SBSECRETS_STATE_BASE_INTEREST_MED;
|
||||
}
|
||||
else
|
||||
{
|
||||
sTVShowState = 6;
|
||||
sTVShowState = SBSECRETS_STATE_BASE_INTEREST_HIGH;
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
case SBSECRETS_STATE_BASE_INTEREST_LOW ... SBSECRETS_STATE_BASE_INTEREST_HIGH:
|
||||
TVShowConvertInternationalString(gStringVar1, show->secretBaseSecrets.baseOwnersName, show->secretBaseSecrets.baseOwnersNameLanguage);
|
||||
TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language);
|
||||
sTVShowState = 7;
|
||||
sTVShowState = SBSECRETS_STATE_OUTRO;
|
||||
break;
|
||||
case 5:
|
||||
TVShowConvertInternationalString(gStringVar1, show->secretBaseSecrets.baseOwnersName, show->secretBaseSecrets.baseOwnersNameLanguage);
|
||||
TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language);
|
||||
sTVShowState = 7;
|
||||
break;
|
||||
case 6:
|
||||
TVShowConvertInternationalString(gStringVar1, show->secretBaseSecrets.baseOwnersName, show->secretBaseSecrets.baseOwnersNameLanguage);
|
||||
TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language);
|
||||
sTVShowState = 7;
|
||||
break;
|
||||
case 7:
|
||||
case SBSECRETS_STATE_OUTRO:
|
||||
TVShowConvertInternationalString(gStringVar1, show->secretBaseSecrets.baseOwnersName, show->secretBaseSecrets.baseOwnersNameLanguage);
|
||||
TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language);
|
||||
TVShowDone();
|
||||
break;
|
||||
case 8:
|
||||
sTVShowState = 3;
|
||||
// All below states are descriptions of what the player interacted with while in the secret base
|
||||
case SBSECRETS_STATE_NOTHING_USED1:
|
||||
sTVShowState = SBSECRETS_STATE_TOOK_X_STEPS;
|
||||
break;
|
||||
case 9:
|
||||
sTVShowState = 3;
|
||||
case SBSECRETS_STATE_NOTHING_USED2:
|
||||
sTVShowState = SBSECRETS_STATE_TOOK_X_STEPS;
|
||||
break;
|
||||
case 10:
|
||||
case SBSECRETS_STATE_USED_CHAIR ... SBSECRETS_STATE_USED_MUD_BALL:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 11:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 12:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 13:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 14:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 15:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 16:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 17:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 18:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 19:
|
||||
case SBSECRETS_STATE_USED_BAG:
|
||||
StringCopy(gStringVar2, ItemId_GetName(show->secretBaseSecrets.item));
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 20:
|
||||
case SBSECRETS_STATE_USED_CUSHION:
|
||||
// Randomly decide based on trainer ID if the player hugged or hit the cushion
|
||||
if (show->common.trainerIdLo & 1)
|
||||
{
|
||||
sTVShowState = 22;
|
||||
sTVShowState = SBSECRETS_STATE_HUGGED_CUSHION;
|
||||
}
|
||||
else
|
||||
{
|
||||
sTVShowState = 21;
|
||||
sTVShowState = SBSECRETS_STATE_HIT_CUSHION;
|
||||
}
|
||||
break;
|
||||
case 21:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 22:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 23:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 24:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 25:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 26:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 27:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 28:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 29:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 30:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 31:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 32:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 33:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 34:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 35:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 36:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 37:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 38:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 39:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 40:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 41:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 42:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
case 43:
|
||||
case SBSECRETS_STATE_HIT_CUSHION ... SBSECRETS_NUM_STATES:
|
||||
sTVShowState = show->secretBaseSecrets.savedState;
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user