summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle_2.c66
-rw-r--r--src/battle_ai_script_commands.c842
-rw-r--r--src/battle_ai_switch_items.c951
-rw-r--r--src/battle_dome_cards.c4
-rw-r--r--src/battle_message.c2333
-rw-r--r--src/battle_script_commands.c37
-rw-r--r--src/battle_util.c3276
-rwxr-xr-xsrc/braille_puzzles.c8
-rw-r--r--src/coins.c2
-rwxr-xr-xsrc/diploma.c29
-rw-r--r--src/egg_hatch.c6
-rw-r--r--src/event_data.c52
-rwxr-xr-xsrc/field_map_obj.c28
-rwxr-xr-xsrc/field_special_scene.c18
-rw-r--r--src/lilycove_lady.c2
-rw-r--r--src/money.c4
-rw-r--r--src/new_game.c6
-rw-r--r--src/palette.c6
-rw-r--r--src/pokemon_2.c8
-rw-r--r--src/reset_save_heap.c2
-rw-r--r--src/reshow_battle_screen.c354
-rw-r--r--src/safari_zone.c4
-rwxr-xr-xsrc/save_location.c13
-rw-r--r--src/scrcmd.c2451
-rw-r--r--src/script.c4
-rw-r--r--src/start_menu.c4
-rw-r--r--src/string_util.c2
-rw-r--r--src/text.c2
-rw-r--r--src/tv.c7927
-rw-r--r--src/util.c2
30 files changed, 14387 insertions, 4056 deletions
diff --git a/src/battle_2.c b/src/battle_2.c
index fd7cf6863..aeba69213 100644
--- a/src/battle_2.c
+++ b/src/battle_2.c
@@ -40,7 +40,9 @@
#include "trainer_classes.h"
#include "evolution_scene.h"
#include "roamer.h"
+#include "tv.h"
#include "safari_zone.h"
+#include "battle_string_ids.h"
struct UnknownStruct6
{
@@ -63,7 +65,6 @@ struct UnknownPokemonStruct2
/*0x1D*/ u8 language;
};
-extern u32 gBattleTypeFlags;
extern u8 gBattleCommunication[];
extern u8 gBattleTerrain;
extern u16 gBattle_BG0_X;
@@ -87,7 +88,6 @@ extern void (*gBattleMainFunc)(void);
extern void (*gUnknown_030061E8)(void);
extern struct UnknownPokemonStruct2 gUnknown_02022FF8[3]; // what is it used for?
extern struct UnknownPokemonStruct2* gUnknown_02023058; // what is it used for?
-extern u8 gBattleOutcome;
extern u8 gUnknown_02039B28[]; // possibly a struct?
extern struct UnknownStruct6 gUnknown_02038C28; // todo: identify & document
extern struct MusicPlayerInfo gMPlay_SE1;
@@ -138,7 +138,6 @@ extern u8 gActionForBanks[BATTLE_BANKS_COUNT];
extern u16 gChosenMovesByBanks[BATTLE_BANKS_COUNT];
extern u8 gCurrentActionFuncId;
extern u8 gLastUsedAbility;
-extern u16 gLastUsedItem;
extern u8 gUnknown_0203CF00[];
extern const u8* gBattlescriptPtrsForSelection[BATTLE_BANKS_COUNT];
extern const u8* gBattlescriptCurrInstr;
@@ -151,7 +150,6 @@ extern u8 gCurrMovePos;
extern u8 gUnknown_020241E9;
extern u16 gLastUsedMove;
-extern const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1];
extern const struct BattleMove gBattleMoves[];
extern const u16 gUnknown_08C004E0[]; // battle textbox palette
extern const struct BgTemplate gUnknown_0831AA08[];
@@ -219,14 +217,12 @@ extern void sub_81B9150(void);
extern void sub_800AC34(void);
extern void sub_80B3AF8(u8 taskId); // cable club
extern void sub_8076918(u8 bank);
-extern void sub_80729D0(u8 healthoxSpriteId);
+extern void SetHealthboxSpriteVisible(u8 healthoxSpriteId);
extern void sub_81A56B4(void); // battle frontier 2
extern u8 sub_81A9E28(void); // battle frontier 2
extern void sub_81A56E8(u8 bank); // battle frontier 2
extern void sub_81B8FB0(u8, u8); // party menu
extern u8 pokemon_order_func(u8); // party menu
-extern void sub_80EC728(void); // tv
-extern void sub_80EE184(void); // tv
extern bool8 InBattlePyramid(void);
// this file's functions
@@ -245,7 +241,7 @@ static void sub_8038F34(void);
static void sub_80392A8(void);
static void sub_803937C(void);
static void sub_803939C(void);
-static void oac_poke_opponent(struct Sprite *sprite);
+void oac_poke_opponent(struct Sprite *sprite);
static void sub_803980C(struct Sprite *sprite);
static void sub_8039838(struct Sprite *sprite);
static void sub_8039894(struct Sprite *sprite);
@@ -343,7 +339,7 @@ const u8 gStatusConditionString_IceJpn[8] = _("こおり$$$$");
const u8 gStatusConditionString_ConfusionJpn[8] = _("こんらん$$$");
const u8 gStatusConditionString_LoveJpn[8] = _("メロメロ$$$");
-const u8 * const gStatusConditionStringsTable[][2] =
+const u8 * const gStatusConditionStringsTable[7][2] =
{
{gStatusConditionString_PoisonJpn, gText_Poison},
{gStatusConditionString_SleepJpn, gText_Sleep},
@@ -858,7 +854,7 @@ static void CB2_HandleStartBattle(void)
{
s32 i;
- for (i = 0; i < 2 && (gLinkPlayers[i].version & 0xFF) == 3; i++);
+ for (i = 0; i < 2 && (gLinkPlayers[i].version & 0xFF) == VERSION_EMERALD; i++);
if (i == 2)
gBattleCommunication[MULTIUSE_STATE] = 16;
@@ -1650,7 +1646,7 @@ void CB2_QuitRecordedBattle(void)
}
}
-static void sub_8038528(struct Sprite* sprite)
+void sub_8038528(struct Sprite* sprite)
{
sprite->data0 = 0;
sprite->callback = sub_8038538;
@@ -2072,7 +2068,7 @@ static void sub_8038F34(void)
else
monsCount = 2;
- for (i = 0; i < monsCount && (gLinkPlayers[i].version & 0xFF) == 3; i++);
+ for (i = 0; i < monsCount && (gLinkPlayers[i].version & 0xFF) == VERSION_EMERALD; i++);
if (!gSaveBlock2Ptr->field_CA9_b && i == monsCount)
{
@@ -2417,7 +2413,7 @@ u32 sub_80397C4(u32 setId, u32 tableId)
#define tBank data0
#define tSpeciesId data2
-static void oac_poke_opponent(struct Sprite *sprite)
+void oac_poke_opponent(struct Sprite *sprite)
{
sprite->callback = sub_803980C;
StartSpriteAnimIfDifferent(sprite, 0);
@@ -2441,7 +2437,7 @@ static void sub_8039838(struct Sprite *sprite)
if (sprite->animEnded)
{
sub_8076918(sprite->tBank);
- sub_80729D0(gHealthBoxesIds[sprite->tBank]);
+ SetHealthboxSpriteVisible(gHealthBoxesIds[sprite->tBank]);
sprite->callback = sub_8039894;
StartSpriteAnimIfDifferent(sprite, 0);
BeginNormalPaletteFade(0x20000, 0, 10, 0, 0x2108);
@@ -3299,7 +3295,7 @@ static void BattleIntroPrintTrainerWantsToBattle(void)
if (gBattleExecBuffer == 0)
{
gActiveBank = GetBankByIdentity(IDENTITY_OPPONENT_MON1);
- PrepareStringBattle(0, gActiveBank);
+ PrepareStringBattle(STRINGID_INTROMSG, gActiveBank);
gBattleMainFunc = BattleIntroPrintOpponentSendsOut;
}
}
@@ -3309,7 +3305,7 @@ static void BattleIntroPrintWildMonAttacked(void)
if (gBattleExecBuffer == 0)
{
gBattleMainFunc = BattleIntroPrintPlayerSendsOut;
- PrepareStringBattle(0, 0);
+ PrepareStringBattle(STRINGID_INTROMSG, 0);
}
}
@@ -3332,7 +3328,7 @@ static void BattleIntroPrintOpponentSendsOut(void)
else
identity = IDENTITY_OPPONENT_MON1;
- PrepareStringBattle(1, GetBankByIdentity(identity));
+ PrepareStringBattle(STRINGID_INTROSENDOUT, GetBankByIdentity(identity));
gBattleMainFunc = BattleIntroOpponent1SendsOutMonAnimation;
}
@@ -3535,7 +3531,7 @@ static void BattleIntroPrintPlayerSendsOut(void)
identity = IDENTITY_PLAYER_MON1;
if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI))
- PrepareStringBattle(1, GetBankByIdentity(identity));
+ PrepareStringBattle(STRINGID_INTROSENDOUT, GetBankByIdentity(identity));
gBattleMainFunc = BattleIntroPlayer1SendsOutMonAnimation;
}
@@ -4006,8 +4002,8 @@ static void HandleTurnActionSelectionState(void)
for (i = 0; i < 4; i++)
{
moveInfo.moves[i] = gBattleMons[gActiveBank].moves[i];
- moveInfo.ppNumbers[i] = gBattleMons[gActiveBank].pp[i];
- moveInfo.ppWithBonusNumbers[i] = CalculatePPWithBonus(
+ moveInfo.currentPp[i] = gBattleMons[gActiveBank].pp[i];
+ moveInfo.maxPp[i] = CalculatePPWithBonus(
gBattleMons[gActiveBank].moves[i],
gBattleMons[gActiveBank].ppBonuses,
i);
@@ -4926,7 +4922,7 @@ static void HandleEndTurn_FinishBattle(void)
}
}
}
- sub_80EC728();
+ PutPokemonTodayCaughtOnAir();
}
if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK
@@ -5323,30 +5319,30 @@ static void HandleAction_UseItem(void)
{
gBattleScripting.bank = gBankAttacker;
- switch (*(gBattleStruct->field_C4 + (gBankAttacker >> 1)))
+ switch (*(gBattleStruct->AI_itemType + (gBankAttacker >> 1)))
{
- case 1:
- case 2:
+ case AI_ITEM_FULL_RESTORE:
+ case AI_ITEM_HEAL_HP:
break;
- case 3:
+ case AI_ITEM_CURE_CONDITION:
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
- if (*(gBattleStruct->field_C6 + gBankAttacker / 2) & 1)
+ if (*(gBattleStruct->AI_itemFlags + gBankAttacker / 2) & 1)
{
- if (*(gBattleStruct->field_C6 + gBankAttacker / 2) & 0x3E)
+ if (*(gBattleStruct->AI_itemFlags + gBankAttacker / 2) & 0x3E)
gBattleCommunication[MULTISTRING_CHOOSER] = 5;
}
else
{
- while (!(*(gBattleStruct->field_C6 + gBankAttacker / 2) & 1))
+ while (!(*(gBattleStruct->AI_itemFlags + gBankAttacker / 2) & 1))
{
- *(gBattleStruct->field_C6 + gBankAttacker / 2) >>= 1;
+ *(gBattleStruct->AI_itemFlags + gBankAttacker / 2) >>= 1;
gBattleCommunication[MULTISTRING_CHOOSER]++;
}
}
break;
- case 4:
+ case AI_ITEM_X_STAT:
gBattleCommunication[MULTISTRING_CHOOSER] = 4;
- if (*(gBattleStruct->field_C6 + (gBankAttacker >> 1)) & 0x80)
+ if (*(gBattleStruct->AI_itemFlags + (gBankAttacker >> 1)) & 0x80)
{
gBattleCommunication[MULTISTRING_CHOOSER] = 5;
}
@@ -5355,9 +5351,9 @@ static void HandleAction_UseItem(void)
PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK)
PREPARE_STRING_BUFFER(gBattleTextBuff2, 0xD2)
- while (!((*(gBattleStruct->field_C6 + (gBankAttacker >> 1))) & 1))
+ while (!((*(gBattleStruct->AI_itemFlags + (gBankAttacker >> 1))) & 1))
{
- *(gBattleStruct->field_C6 + gBankAttacker / 2) >>= 1;
+ *(gBattleStruct->AI_itemFlags + gBankAttacker / 2) >>= 1;
gBattleTextBuff1[2]++;
}
@@ -5365,7 +5361,7 @@ static void HandleAction_UseItem(void)
gBattleScripting.animArg2 = 0;
}
break;
- case 5:
+ case AI_ITEM_GUARD_SPECS:
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
gBattleCommunication[MULTISTRING_CHOOSER] = 2;
else
@@ -5373,7 +5369,7 @@ static void HandleAction_UseItem(void)
break;
}
- gBattlescriptCurrInstr = gUnknown_082DBD3C[*(gBattleStruct->field_C4 + gBankAttacker / 2)];
+ gBattlescriptCurrInstr = gUnknown_082DBD3C[*(gBattleStruct->AI_itemType + gBankAttacker / 2)];
}
gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT;
}
diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c
index 92126e40c..24377eacc 100644
--- a/src/battle_ai_script_commands.c
+++ b/src/battle_ai_script_commands.c
@@ -7,11 +7,13 @@
#include "rng.h"
#include "item.h"
#include "battle_move_effects.h"
+#include "moves.h"
+#include "util.h"
#define AIScriptRead32(ptr) ((ptr)[0] | (ptr)[1] << 8 | (ptr)[2] << 16 | (ptr)[3] << 24)
#define AIScriptRead16(ptr) ((ptr)[0] | (ptr)[1] << 8)
#define AIScriptRead8(ptr) ((ptr)[0])
-#define AIScriptReadPtr(ptr) (u8*) AIScriptRead32(ptr)
+#define AIScriptReadPtr(ptr) (const u8*) AIScriptRead32(ptr)
#define AI_ACTION_DONE 0x0001
#define AI_ACTION_FLEE 0x0002
@@ -52,16 +54,16 @@ AI scripts.
extern u32 gBattleTypeFlags;
extern u8 gActiveBank;
-extern struct BattlePokemon gBattleMons[4];
+extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT];
extern u16 gCurrentMove;
extern u8 gBankTarget;
extern u8 gAbsentBankFlags;
-extern u16 gLastUsedMovesByBanks[4];
+extern u16 gLastUsedMovesByBanks[BATTLE_BANKS_COUNT];
extern u16 gTrainerBattleOpponent_A;
extern u16 gTrainerBattleOpponent_B;
-extern u32 gStatuses3[4];
+extern u32 gStatuses3[BATTLE_BANKS_COUNT];
extern u16 gSideAffecting[2];
-extern u16 gBattlePartyID[4];
+extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
extern u16 gDynamicBasePower;
extern u8 gBattleMoveFlags;
extern s32 gBattleMoveDamage;
@@ -70,13 +72,8 @@ extern u16 gBattleWeather;
extern const struct BattleMove gBattleMoves[];
extern const struct BaseStats gBaseStats[];
-extern const u32 gBitTable[];
-extern u8 * const gBattleAI_ScriptsTable[];
+extern const u8 * const gBattleAI_ScriptsTable[];
-extern u8 GetWhoStrikesFirst(u8, u8, u8);
-extern void AI_CalcDmg(u8, u8);
-
-extern u8 CheckMoveLimitations();
extern u32 GetAiScriptsInRecordedBattle();
extern u32 GetAiScriptsInBattleFactory();
@@ -116,8 +113,8 @@ static void BattleAICmd_if_move(void);
static void BattleAICmd_if_not_move(void);
static void BattleAICmd_if_in_bytes(void);
static void BattleAICmd_if_not_in_bytes(void);
-static void BattleAICmd_if_in_words(void);
-static void BattleAICmd_if_not_in_words(void);
+static void BattleAICmd_if_in_hwords(void);
+static void BattleAICmd_if_not_in_hwords(void);
static void BattleAICmd_if_user_can_damage(void);
static void BattleAICmd_if_user_cant_damage(void);
static void BattleAICmd_get_turn_count(void);
@@ -227,8 +224,8 @@ static const BattleAICmdFunc sBattleAICmdTable[] =
BattleAICmd_if_not_move, // 0x1A
BattleAICmd_if_in_bytes, // 0x1B
BattleAICmd_if_not_in_bytes, // 0x1C
- BattleAICmd_if_in_words, // 0x1D
- BattleAICmd_if_not_in_words, // 0x1E
+ BattleAICmd_if_in_hwords, // 0x1D
+ BattleAICmd_if_not_in_hwords, // 0x1E
BattleAICmd_if_user_can_damage, // 0x1F
BattleAICmd_if_user_cant_damage, // 0x20
BattleAICmd_get_turn_count, // 0x21
@@ -334,7 +331,7 @@ void BattleAI_HandleItemUseBeforeAISetup(u8 defaultScoreMoves)
{
if (gTrainers[gTrainerBattleOpponent_A].items[i] != 0)
{
- gBattleResources->battleHistory->TrainerItems[gBattleResources->battleHistory->itemsNo] = gTrainers[gTrainerBattleOpponent_A].items[i];
+ gBattleResources->battleHistory->trainerItems[gBattleResources->battleHistory->itemsNo] = gTrainers[gTrainerBattleOpponent_A].items[i];
gBattleResources->battleHistory->itemsNo++;
}
}
@@ -472,13 +469,11 @@ static u8 BattleAI_ChooseMoveOrAction_Singles(void)
return consideredMoveArray[Random() % numOfBestMoves];
}
-#ifdef NONMATCHING
static u8 BattleAI_ChooseMoveOrAction_Doubles(void)
{
s32 i;
s32 j;
s32 scriptsToRun;
- s16 mostMovePoints;
s16 bestMovePointsForTarget[4];
s8 mostViableTargetsArray[4];
u8 actionOrMoveIndex[4];
@@ -486,27 +481,27 @@ static u8 BattleAI_ChooseMoveOrAction_Doubles(void)
u8 mostViableMovesIndices[4];
s32 mostViableTargetsNo;
s32 mostViableMovesNo;
+ s16 mostMovePoints;
- for (i = 0; i < 4; i++) //08130D14
+ for (i = 0; i < 4; i++)
{
if (i == sBank_AI || gBattleMons[i].hp == 0)
{
- //_08130D2E
actionOrMoveIndex[i] = -1;
bestMovePointsForTarget[i] = -1;
}
- //_08130D48
else
{
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
BattleAI_SetupAIData(gBattleStruct->field_92 >> 4);
else
BattleAI_SetupAIData(0xF);
- //_08130D76
+
gBankTarget = i;
- if ((i & 1) != (sBank_AI & 1))
+
+ if ((i & BIT_SIDE) != (sBank_AI & BIT_SIDE))
RecordLastUsedMoveByTarget();
- //_08130D90
+
AI_THINKING_STRUCT->aiLogicId = 0;
AI_THINKING_STRUCT->movesetIndex = 0;
scriptsToRun = AI_THINKING_STRUCT->aiFlags;
@@ -521,14 +516,12 @@ static u8 BattleAI_ChooseMoveOrAction_Doubles(void)
AI_THINKING_STRUCT->aiLogicId++;
AI_THINKING_STRUCT->movesetIndex = 0;
}
- //_08130DD8
if (AI_THINKING_STRUCT->aiAction & AI_ACTION_FLEE)
actionOrMoveIndex[i] = 4;
else if (AI_THINKING_STRUCT->aiAction & AI_ACTION_WATCH)
actionOrMoveIndex[i] = 5;
else
{
- //_08130E10
mostViableMovesScores[0] = AI_THINKING_STRUCT->score[0];
mostViableMovesIndices[0] = 0;
mostViableMovesNo = 1;
@@ -555,17 +548,20 @@ static u8 BattleAI_ChooseMoveOrAction_Doubles(void)
bestMovePointsForTarget[i] = mostViableMovesScores[0];
// don't use a move against ally if it has less than 100 pts
- if (i == (sBank_AI ^ 2) && bestMovePointsForTarget[i] < 100)
+ if (i == (sBank_AI ^ BIT_MON) && bestMovePointsForTarget[i] < 100)
+ {
bestMovePointsForTarget[i] = -1;
+ mostViableMovesScores[0] = mostViableMovesScores[0]; // needed to match
+ }
+
}
}
- //_08130EAE
}
- //08130EC4
mostMovePoints = bestMovePointsForTarget[0];
mostViableTargetsArray[0] = 0;
mostViableTargetsNo = 1;
+
for (i = 1; i < 4; i++)
{
//_08130EDA
@@ -582,305 +578,10 @@ static u8 BattleAI_ChooseMoveOrAction_Doubles(void)
mostViableTargetsNo = 1;
}
}
+
gBankTarget = mostViableTargetsArray[Random() % mostViableTargetsNo];
return actionOrMoveIndex[gBankTarget];
}
-#else
-__attribute__((naked))
-static u8 BattleAI_ChooseMoveOrAction_Doubles(void)
-{
- 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, 0x24\n\
- movs r0, 0\n\
- mov r8, r0\n\
- mov r1, sp\n\
- adds r1, 0xC\n\
- str r1, [sp, 0x1C]\n\
- mov r2, sp\n\
- adds r2, 0x8\n\
- str r2, [sp, 0x18]\n\
- str r1, [sp, 0x20]\n\
- mov r10, sp\n\
-_08130D14:\n\
- ldr r0, =sBank_AI\n\
- ldrb r0, [r0]\n\
- cmp r8, r0\n\
- beq _08130D2E\n\
- movs r0, 0x58\n\
- mov r7, r8\n\
- muls r7, r0\n\
- adds r0, r7, 0\n\
- ldr r1, =gBattleMons\n\
- adds r0, r1\n\
- ldrh r0, [r0, 0x28]\n\
- cmp r0, 0\n\
- bne _08130D48\n\
-_08130D2E:\n\
- movs r0, 0xFF\n\
- ldr r2, [sp, 0x20]\n\
- strb r0, [r2]\n\
- ldr r0, =0x0000ffff\n\
- mov r7, r10\n\
- strh r0, [r7]\n\
- b _08130EAE\n\
- .pool\n\
-_08130D48:\n\
- ldr r0, =gBattleTypeFlags\n\
- ldr r0, [r0]\n\
- movs r1, 0x80\n\
- lsls r1, 10\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08130D70\n\
- ldr r0, =gBattleStruct\n\
- ldr r0, [r0]\n\
- adds r0, 0x92\n\
- ldrb r0, [r0]\n\
- lsrs r0, 4\n\
- bl BattleAI_SetupAIData\n\
- b _08130D76\n\
- .pool\n\
-_08130D70:\n\
- movs r0, 0xF\n\
- bl BattleAI_SetupAIData\n\
-_08130D76:\n\
- ldr r0, =gBankTarget\n\
- mov r1, r8\n\
- strb r1, [r0]\n\
- movs r1, 0x1\n\
- mov r2, r8\n\
- ands r2, r1\n\
- ldr r0, =sBank_AI\n\
- ldrb r0, [r0]\n\
- ands r1, r0\n\
- cmp r2, r1\n\
- beq _08130D90\n\
- bl RecordLastUsedMoveByTarget\n\
-_08130D90:\n\
- ldr r2, =gBattleResources\n\
- ldr r0, [r2]\n\
- ldr r0, [r0, 0x14]\n\
- movs r1, 0\n\
- strb r1, [r0, 0x11]\n\
- ldr r0, [r2]\n\
- ldr r0, [r0, 0x14]\n\
- strb r1, [r0, 0x1]\n\
- ldr r0, [r2]\n\
- ldr r0, [r0, 0x14]\n\
- ldr r4, [r0, 0xC]\n\
- mov r9, r2\n\
- cmp r4, 0\n\
- beq _08130DD8\n\
- mov r5, r9\n\
- movs r6, 0\n\
-_08130DB0:\n\
- movs r0, 0x1\n\
- ands r0, r4\n\
- cmp r0, 0\n\
- beq _08130DC2\n\
- ldr r0, [r5]\n\
- ldr r0, [r0, 0x14]\n\
- strb r6, [r0]\n\
- bl BattleAI_DoAIProcessing\n\
-_08130DC2:\n\
- asrs r4, 1\n\
- ldr r0, [r5]\n\
- ldr r1, [r0, 0x14]\n\
- ldrb r0, [r1, 0x11]\n\
- adds r0, 0x1\n\
- strb r0, [r1, 0x11]\n\
- ldr r0, [r5]\n\
- ldr r0, [r0, 0x14]\n\
- strb r6, [r0, 0x1]\n\
- cmp r4, 0\n\
- bne _08130DB0\n\
-_08130DD8:\n\
- mov r2, r9\n\
- ldr r0, [r2]\n\
- ldr r3, [r0, 0x14]\n\
- ldrb r1, [r3, 0x10]\n\
- movs r0, 0x2\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08130DFC\n\
- movs r0, 0x4\n\
- ldr r7, [sp, 0x20]\n\
- strb r0, [r7]\n\
- b _08130EAE\n\
- .pool\n\
-_08130DFC:\n\
- movs r0, 0x4\n\
- ands r0, r1\n\
- lsls r0, 24\n\
- lsrs r2, r0, 24\n\
- cmp r2, 0\n\
- beq _08130E10\n\
- movs r0, 0x5\n\
- ldr r1, [sp, 0x20]\n\
- strb r0, [r1]\n\
- b _08130EAE\n\
-_08130E10:\n\
- add r1, sp, 0x10\n\
- ldrb r0, [r3, 0x4]\n\
- strb r0, [r1]\n\
- add r0, sp, 0x14\n\
- strb r2, [r0]\n\
- movs r5, 0x1\n\
- movs r3, 0x1\n\
- adds r6, r1, 0\n\
- ldr r0, =sBank_AI\n\
- ldrb r1, [r0]\n\
- movs r0, 0x58\n\
- muls r0, r1\n\
- ldr r2, =gBattleMons + 0xC\n\
- adds r0, r2\n\
- adds r4, r0, 0x2\n\
- add r7, sp, 0x14\n\
-_08130E30:\n\
- ldrh r0, [r4]\n\
- cmp r0, 0\n\
- beq _08130E72\n\
- ldrb r1, [r6]\n\
- mov r2, r9\n\
- ldr r0, [r2]\n\
- ldr r0, [r0, 0x14]\n\
- adds r0, 0x4\n\
- adds r2, r0, r3\n\
- movs r0, 0\n\
- ldrsb r0, [r2, r0]\n\
- cmp r1, r0\n\
- bne _08130E56\n\
- adds r0, r6, r5\n\
- ldrb r1, [r2]\n\
- strb r1, [r0]\n\
- adds r0, r7, r5\n\
- strb r3, [r0]\n\
- adds r5, 0x1\n\
-_08130E56:\n\
- ldrb r1, [r6]\n\
- mov r2, r9\n\
- ldr r0, [r2]\n\
- ldr r0, [r0, 0x14]\n\
- adds r0, 0x4\n\
- adds r2, r0, r3\n\
- movs r0, 0\n\
- ldrsb r0, [r2, r0]\n\
- cmp r1, r0\n\
- bge _08130E72\n\
- ldrb r0, [r2]\n\
- strb r0, [r6]\n\
- strb r3, [r7]\n\
- movs r5, 0x1\n\
-_08130E72:\n\
- adds r4, 0x2\n\
- adds r3, 0x1\n\
- cmp r3, 0x3\n\
- ble _08130E30\n\
- bl Random\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- adds r1, r5, 0\n\
- bl __modsi3\n\
- add r0, sp\n\
- adds r0, 0x14\n\
- ldrb r0, [r0]\n\
- ldr r7, [sp, 0x20]\n\
- strb r0, [r7]\n\
- ldrb r2, [r6]\n\
- mov r0, r10\n\
- strh r2, [r0]\n\
- ldr r0, =sBank_AI\n\
- ldrb r1, [r0]\n\
- movs r0, 0x2\n\
- eors r0, r1\n\
- cmp r8, r0\n\
- bne _08130EAE\n\
- cmp r2, 0x63\n\
- bgt _08130EAE\n\
- ldr r0, =0x0000ffff\n\
- mov r1, r10\n\
- strh r0, [r1]\n\
-_08130EAE:\n\
- ldr r2, [sp, 0x20]\n\
- adds r2, 0x1\n\
- str r2, [sp, 0x20]\n\
- movs r7, 0x2\n\
- add r10, r7\n\
- movs r0, 0x1\n\
- add r8, r0\n\
- mov r1, r8\n\
- cmp r1, 0x3\n\
- bgt _08130EC4\n\
- b _08130D14\n\
-_08130EC4:\n\
- mov r0, sp\n\
- ldrh r5, [r0]\n\
- movs r0, 0\n\
- ldr r2, [sp, 0x18]\n\
- strb r0, [r2]\n\
- movs r4, 0x1\n\
- mov r8, r4\n\
- ldr r6, =gBankTarget\n\
- ldr r3, [sp, 0x18]\n\
- mov r1, sp\n\
- adds r1, 0x2\n\
-_08130EDA:\n\
- lsls r0, r5, 16\n\
- asrs r2, r0, 16\n\
- movs r7, 0\n\
- ldrsh r0, [r1, r7]\n\
- cmp r2, r0\n\
- bne _08130EEE\n\
- adds r0, r3, r4\n\
- mov r7, r8\n\
- strb r7, [r0]\n\
- adds r4, 0x1\n\
-_08130EEE:\n\
- movs r7, 0\n\
- ldrsh r0, [r1, r7]\n\
- cmp r2, r0\n\
- bge _08130EFE\n\
- ldrh r5, [r1]\n\
- mov r0, r8\n\
- strb r0, [r3]\n\
- movs r4, 0x1\n\
-_08130EFE:\n\
- adds r1, 0x2\n\
- movs r2, 0x1\n\
- add r8, r2\n\
- mov r7, r8\n\
- cmp r7, 0x3\n\
- ble _08130EDA\n\
- bl Random\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- adds r1, r4, 0\n\
- bl __modsi3\n\
- ldr r1, [sp, 0x18]\n\
- adds r0, r1, r0\n\
- ldrb r0, [r0]\n\
- strb r0, [r6]\n\
- ldrb r0, [r6]\n\
- ldr r2, [sp, 0x1C]\n\
- adds r0, r2, r0\n\
- ldrb r0, [r0]\n\
- add sp, 0x24\n\
- pop {r3-r5}\n\
- mov r8, r3\n\
- mov r9, r4\n\
- mov r10, r5\n\
- pop {r4-r7}\n\
- pop {r1}\n\
- bx r1\n\
- .pool\n\
- .syntax divided\n");
-}
-#endif
static void BattleAI_DoAIProcessing(void)
{
@@ -888,7 +589,7 @@ static void BattleAI_DoAIProcessing(void)
{
switch (AI_THINKING_STRUCT->aiState)
{
- case AIState_DoNotProcess: //Needed to match.
+ case AIState_DoNotProcess: // Needed to match.
break;
case AIState_SettingUp:
gAIScriptPtr = gBattleAI_ScriptsTable[AI_THINKING_STRUCT->aiLogicId]; // set AI ptr to logic ID.
@@ -904,7 +605,7 @@ static void BattleAI_DoAIProcessing(void)
break;
case AIState_Processing:
if (AI_THINKING_STRUCT->moveConsidered != 0)
- sBattleAICmdTable[*gAIScriptPtr](); // run AI command.
+ sBattleAICmdTable[*gAIScriptPtr](); // Run AI command.
else
{
AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] = 0;
@@ -934,7 +635,7 @@ static void RecordLastUsedMoveByTarget(void)
{
if (gBattleResources->battleHistory->usedMoves[gBankTarget].moves[i] == gLastUsedMovesByBanks[gBankTarget])
break;
- if (gBattleResources->battleHistory->usedMoves[gBankTarget].moves[i] != gLastUsedMovesByBanks[gBankTarget] //HACK: This redundant condition is a hack to make the asm match.
+ if (gBattleResources->battleHistory->usedMoves[gBankTarget].moves[i] != gLastUsedMovesByBanks[gBankTarget] // HACK: This redundant condition is a hack to make the asm match.
&& gBattleResources->battleHistory->usedMoves[gBankTarget].moves[i] == 0)
{
gBattleResources->battleHistory->usedMoves[gBankTarget].moves[i] = gLastUsedMovesByBanks[gBankTarget];
@@ -1261,7 +962,7 @@ static void BattleAICmd_if_not_equal(void)
static void BattleAICmd_if_less_than_32(void)
{
- u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1);
+ const u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1);
if (AI_THINKING_STRUCT->funcResult < *temp)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5);
@@ -1271,7 +972,7 @@ static void BattleAICmd_if_less_than_32(void)
static void BattleAICmd_if_more_than_32(void)
{
- u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1);
+ const u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1);
if (AI_THINKING_STRUCT->funcResult > *temp)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5);
@@ -1281,7 +982,7 @@ static void BattleAICmd_if_more_than_32(void)
static void BattleAICmd_if_equal_32(void)
{
- u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1);
+ const u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1);
if (AI_THINKING_STRUCT->funcResult == *temp)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5);
@@ -1291,7 +992,7 @@ static void BattleAICmd_if_equal_32(void)
static void BattleAICmd_if_not_equal_32(void)
{
- u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1);
+ const u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1);
if (AI_THINKING_STRUCT->funcResult != *temp)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5);
@@ -1321,7 +1022,7 @@ static void BattleAICmd_if_not_move(void)
static void BattleAICmd_if_in_bytes(void)
{
- u8 *ptr = AIScriptReadPtr(gAIScriptPtr + 1);
+ const u8 *ptr = AIScriptReadPtr(gAIScriptPtr + 1);
while (*ptr != 0xFF)
{
@@ -1337,7 +1038,7 @@ static void BattleAICmd_if_in_bytes(void)
static void BattleAICmd_if_not_in_bytes(void)
{
- u8 *ptr = AIScriptReadPtr(gAIScriptPtr + 1);
+ const u8 *ptr = AIScriptReadPtr(gAIScriptPtr + 1);
while (*ptr != 0xFF)
{
@@ -1351,9 +1052,9 @@ static void BattleAICmd_if_not_in_bytes(void)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5);
}
-static void BattleAICmd_if_in_words(void)
+static void BattleAICmd_if_in_hwords(void)
{
- u16 *ptr = (u16 *)AIScriptReadPtr(gAIScriptPtr + 1);
+ const u16 *ptr = (const u16 *)AIScriptReadPtr(gAIScriptPtr + 1);
while (*ptr != 0xFFFF)
{
@@ -1367,9 +1068,9 @@ static void BattleAICmd_if_in_words(void)
gAIScriptPtr += 9;
}
-static void BattleAICmd_if_not_in_words(void)
+static void BattleAICmd_if_not_in_hwords(void)
{
- u16 *ptr = (u16 *)AIScriptReadPtr(gAIScriptPtr + 1);
+ const u16 *ptr = (u16 *)AIScriptReadPtr(gAIScriptPtr + 1);
while (*ptr != 0xFFFF)
{
@@ -1456,9 +1157,9 @@ static u8 BattleAI_GetWantedBank(u8 index)
default:
return gBankTarget;
case AI_USER_PARTNER:
- return sBank_AI ^ 2;
+ return sBank_AI ^ BIT_MON;
case AI_TARGET_PARTNER:
- return gBankTarget ^ 2;
+ return gBankTarget ^ BIT_MON;
}
}
@@ -1484,248 +1185,68 @@ static void BattleAICmd_get_last_used_bank_move_power(void)
gAIScriptPtr += 1;
}
-__attribute__((naked)) // not even going to try. if it doesnt match in ruby, it wont match in emerald (yet).
static void BattleAICmd_is_most_powerful_move(void)
{
- 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, 0x14\n\
- movs r3, 0\n\
- ldr r0, =sDiscouragedPowerfulMoveEffects\n\
- ldrh r1, [r0]\n\
- ldr r5, =0x0000ffff\n\
- ldr r6, =gBattleMoves\n\
- ldr r2, =gBattleResources\n\
- cmp r1, r5\n\
- beq _08131F86\n\
- ldr r0, [r2]\n\
- ldr r0, [r0, 0x14]\n\
- ldrh r1, [r0, 0x2]\n\
- lsls r0, r1, 1\n\
- adds r0, r1\n\
- lsls r0, 2\n\
- adds r0, r6\n\
- ldrb r4, [r0]\n\
- ldr r1, =sDiscouragedPowerfulMoveEffects\n\
-_08131F76:\n\
- ldrh r0, [r1]\n\
- cmp r4, r0\n\
- beq _08131F86\n\
- adds r1, 0x2\n\
- adds r3, 0x1\n\
- ldrh r0, [r1]\n\
- cmp r0, r5\n\
- bne _08131F76\n\
-_08131F86:\n\
- ldr r0, [r2]\n\
- ldr r0, [r0, 0x14]\n\
- ldrh r1, [r0, 0x2]\n\
- lsls r0, r1, 1\n\
- adds r0, r1\n\
- lsls r0, 2\n\
- adds r0, r6\n\
- ldrb r0, [r0, 0x1]\n\
- cmp r0, 0x1\n\
- bhi _08131F9C\n\
- b _08132126\n\
-_08131F9C:\n\
- lsls r0, r3, 1\n\
- ldr r1, =sDiscouragedPowerfulMoveEffects\n\
- adds r0, r1\n\
- ldrh r3, [r0]\n\
- ldr r0, =0x0000ffff\n\
- cmp r3, r0\n\
- beq _08131FAC\n\
- b _08132126\n\
-_08131FAC:\n\
- ldr r0, =gDynamicBasePower\n\
- movs r1, 0\n\
- strh r1, [r0]\n\
- ldr r0, =gBattleStruct\n\
- ldr r0, [r0]\n\
- strb r1, [r0, 0x13]\n\
- ldr r0, =gBattleScripting\n\
- movs r2, 0x1\n\
- strb r2, [r0, 0xE]\n\
- ldr r0, =gBattleMoveFlags\n\
- strb r1, [r0]\n\
- ldr r0, =gCritMultiplier\n\
- strb r2, [r0]\n\
- movs r6, 0\n\
- mov r9, r3\n\
- ldr r2, =sDiscouragedPowerfulMoveEffects\n\
- ldrh r2, [r2]\n\
- str r2, [sp, 0x10]\n\
-_08131FD0:\n\
- movs r3, 0\n\
- ldr r5, =gBattleMons\n\
- lsls r4, r6, 1\n\
- ldr r7, =sBank_AI\n\
- lsls r0, r6, 2\n\
- mov r8, r0\n\
- adds r1, r6, 0x1\n\
- mov r10, r1\n\
- ldr r2, [sp, 0x10]\n\
- cmp r2, r9\n\
- beq _08132014\n\
- ldr r2, =gBattleMoves\n\
- ldrb r1, [r7]\n\
- movs r0, 0x58\n\
- muls r0, r1\n\
- adds r0, r4, r0\n\
- adds r1, r5, 0\n\
- adds r1, 0xC\n\
- adds r0, r1\n\
- ldrh r1, [r0]\n\
- lsls r0, r1, 1\n\
- adds r0, r1\n\
- lsls r0, 2\n\
- adds r0, r2\n\
- ldrb r2, [r0]\n\
- ldr r1, =sDiscouragedPowerfulMoveEffects\n\
-_08132004:\n\
- ldrh r0, [r1]\n\
- cmp r2, r0\n\
- beq _08132014\n\
- adds r1, 0x2\n\
- adds r3, 0x1\n\
- ldrh r0, [r1]\n\
- cmp r0, r9\n\
- bne _08132004\n\
-_08132014:\n\
- ldrb r1, [r7]\n\
- movs r0, 0x58\n\
- muls r0, r1\n\
- adds r0, r4, r0\n\
- adds r1, r5, 0\n\
- adds r1, 0xC\n\
- adds r1, r0, r1\n\
- ldrh r0, [r1]\n\
- cmp r0, 0\n\
- beq _081320C0\n\
- lsls r0, r3, 1\n\
- ldr r2, =sDiscouragedPowerfulMoveEffects\n\
- adds r0, r2\n\
- ldrh r0, [r0]\n\
- cmp r0, r9\n\
- bne _081320C0\n\
- ldr r0, =gBattleMoves\n\
- ldrh r2, [r1]\n\
- lsls r1, r2, 1\n\
- adds r1, r2\n\
- lsls r1, 2\n\
- adds r1, r0\n\
- ldrb r0, [r1, 0x1]\n\
- cmp r0, 0x1\n\
- bls _081320C0\n\
- ldr r5, =gCurrentMove\n\
- strh r2, [r5]\n\
- ldrb r0, [r7]\n\
- ldr r4, =gBankTarget\n\
- ldrb r1, [r4]\n\
- bl AI_CalcDmg\n\
- ldrh r0, [r5]\n\
- ldrb r1, [r7]\n\
- ldrb r2, [r4]\n\
- bl TypeCalc\n\
- mov r4, sp\n\
- add r4, r8\n\
- ldr r2, =gBattleMoveDamage\n\
- ldr r0, =gBattleResources\n\
- ldr r0, [r0]\n\
- ldr r0, [r0, 0x14]\n\
- adds r0, 0x18\n\
- adds r0, r6\n\
- ldrb r1, [r0]\n\
- ldr r0, [r2]\n\
- muls r0, r1\n\
- movs r1, 0x64\n\
- bl __divsi3\n\
- str r0, [r4]\n\
- cmp r0, 0\n\
- bne _081320C8\n\
- movs r0, 0x1\n\
- str r0, [r4]\n\
- b _081320C8\n\
- .pool\n\
-_081320C0:\n\
- mov r1, sp\n\
- add r1, r8\n\
- movs r0, 0\n\
- str r0, [r1]\n\
-_081320C8:\n\
- mov r6, r10\n\
- cmp r6, 0x3\n\
- bgt _081320D0\n\
- b _08131FD0\n\
-_081320D0:\n\
- movs r6, 0\n\
- ldr r2, =gBattleResources\n\
- ldr r0, [r2]\n\
- ldr r0, [r0, 0x14]\n\
- ldrb r0, [r0, 0x1]\n\
- lsls r0, 2\n\
- add r0, sp\n\
- ldr r1, [sp]\n\
- ldr r0, [r0]\n\
- ldr r5, =gAIScriptPtr\n\
- cmp r1, r0\n\
- bgt _08132106\n\
- adds r4, r2, 0\n\
- mov r3, sp\n\
-_081320EC:\n\
- adds r3, 0x4\n\
- adds r6, 0x1\n\
- cmp r6, 0x3\n\
- bgt _08132106\n\
- ldr r0, [r4]\n\
- ldr r0, [r0, 0x14]\n\
- ldrb r0, [r0, 0x1]\n\
- lsls r0, 2\n\
- add r0, sp\n\
- ldr r1, [r3]\n\
- ldr r0, [r0]\n\
- cmp r1, r0\n\
- ble _081320EC\n\
-_08132106:\n\
- cmp r6, 0x4\n\
- bne _0813211C\n\
- ldr r0, [r2]\n\
- ldr r1, [r0, 0x14]\n\
- movs r0, 0x2\n\
- str r0, [r1, 0x8]\n\
- b _08132130\n\
- .pool\n\
-_0813211C:\n\
- ldr r0, [r2]\n\
- ldr r1, [r0, 0x14]\n\
- movs r0, 0x1\n\
- str r0, [r1, 0x8]\n\
- b _08132130\n\
-_08132126:\n\
- ldr r0, [r2]\n\
- ldr r1, [r0, 0x14]\n\
- movs r0, 0\n\
- str r0, [r1, 0x8]\n\
- ldr r5, =gAIScriptPtr\n\
-_08132130:\n\
- ldr r0, [r5]\n\
- adds r0, 0x1\n\
- str r0, [r5]\n\
- add sp, 0x14\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\
- .pool\n\
- .syntax divided");
+ s32 i, checkedMove;
+ s32 moveDmgs[4];
+
+ for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++)
+ {
+ if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == sDiscouragedPowerfulMoveEffects[i])
+ break;
+ }
+
+ if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power > 1
+ && sDiscouragedPowerfulMoveEffects[i] == 0xFFFF)
+ {
+ gDynamicBasePower = 0;
+ *(&gBattleStruct->dynamicMoveType) = 0;
+ gBattleScripting.dmgMultiplier = 1;
+ gBattleMoveFlags = 0;
+ gCritMultiplier = 1;
+
+ for (checkedMove = 0; checkedMove < 4; checkedMove++)
+ {
+ for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++)
+ {
+ if (gBattleMoves[gBattleMons[sBank_AI].moves[checkedMove]].effect == sDiscouragedPowerfulMoveEffects[i])
+ break;
+ }
+
+ if (gBattleMons[sBank_AI].moves[checkedMove] != MOVE_NONE
+ && sDiscouragedPowerfulMoveEffects[i] == 0xFFFF
+ && gBattleMoves[gBattleMons[sBank_AI].moves[checkedMove]].power > 1)
+ {
+ gCurrentMove = gBattleMons[sBank_AI].moves[checkedMove];
+ AI_CalcDmg(sBank_AI, gBankTarget);
+ TypeCalc(gCurrentMove, sBank_AI, gBankTarget);
+ moveDmgs[checkedMove] = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[checkedMove] / 100;
+ if (moveDmgs[checkedMove] == 0)
+ moveDmgs[checkedMove] = 1;
+ }
+ else
+ {
+ moveDmgs[checkedMove] = 0;
+ }
+ }
+
+ for (checkedMove = 0; checkedMove < 4; checkedMove++)
+ {
+ if (moveDmgs[checkedMove] > moveDmgs[AI_THINKING_STRUCT->movesetIndex])
+ break;
+ }
+
+ if (checkedMove == 4)
+ AI_THINKING_STRUCT->funcResult = 2; // is the most powerful
+ else
+ AI_THINKING_STRUCT->funcResult = 1; // not most powerful
+ }
+ else
+ {
+ AI_THINKING_STRUCT->funcResult = 0; // highly discouraged in terms of power
+ }
+
+ gAIScriptPtr++;
}
static void BattleAICmd_get_last_used_bank_move(void)
@@ -1756,7 +1277,7 @@ static void BattleAICmd_if_arg_not_equal(void)
static void BattleAICmd_if_would_go_first(void)
{
- if (GetWhoStrikesFirst(sBank_AI, gBankTarget, 1) == gAIScriptPtr[1])
+ if (GetWhoStrikesFirst(sBank_AI, gBankTarget, TRUE) == gAIScriptPtr[1])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
@@ -1764,7 +1285,7 @@ static void BattleAICmd_if_would_go_first(void)
static void BattleAICmd_if_would_not_go_first(void)
{
- if (GetWhoStrikesFirst(sBank_AI, gBankTarget, 1) != gAIScriptPtr[1])
+ if (GetWhoStrikesFirst(sBank_AI, gBankTarget, TRUE) != gAIScriptPtr[1])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
@@ -1792,7 +1313,7 @@ static void BattleAICmd_count_alive_pokemon(void)
else
index = gBankTarget;
- if (GetBankSide(index) == 0)
+ if (GetBankSide(index) == SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
@@ -1896,11 +1417,10 @@ static void BattleAICmd_get_ability(void)
gAIScriptPtr += 2;
}
-#ifdef NONMATCHING
static void BattleAICmd_check_ability(void)
{
- u8 bank = BattleAI_GetWantedBank(gAIScriptPtr[1]);
- u8 ability = gAIScriptPtr[2];
+ u32 bank = BattleAI_GetWantedBank(gAIScriptPtr[1]);
+ u32 ability = gAIScriptPtr[2];
if (gAIScriptPtr[1] == AI_TARGET || gAIScriptPtr[1] == AI_TARGET_PARTNER)
{
@@ -1920,8 +1440,9 @@ static void BattleAICmd_check_ability(void)
{
if (gBaseStats[gBattleMons[bank].species].ability2 != ABILITY_NONE)
{
- if (gBaseStats[gBattleMons[bank].species].ability1 != ability
- && gBaseStats[gBattleMons[bank].species].ability2 != ability)
+ u8 abilityDummyVariable = ability; // needed to match
+ if (gBaseStats[gBattleMons[bank].species].ability1 != abilityDummyVariable
+ && gBaseStats[gBattleMons[bank].species].ability2 != abilityDummyVariable)
{
ability = gBaseStats[gBattleMons[bank].species].ability1;
}
@@ -1957,137 +1478,6 @@ static void BattleAICmd_check_ability(void)
}
gAIScriptPtr += 3;
}
-#else
-__attribute__((naked))
-static void BattleAICmd_check_ability(void)
-{
- asm(".syntax unified\n\
- push {r4-r6,lr}\n\
- ldr r4, =gAIScriptPtr\n\
- ldr r0, [r4]\n\
- ldrb r0, [r0, 0x1]\n\
- bl BattleAI_GetWantedBank\n\
- lsls r0, 24\n\
- lsrs r5, r0, 24\n\
- ldr r0, [r4]\n\
- ldrb r3, [r0, 0x2]\n\
- ldrb r0, [r0, 0x1]\n\
- cmp r0, 0\n\
- beq _0813253A\n\
- cmp r0, 0x2\n\
- bne _081325BC\n\
-_0813253A:\n\
- ldr r0, =gBattleResources\n\
- ldr r4, [r0]\n\
- ldr r1, [r4, 0x18]\n\
- adds r1, 0x40\n\
- adds r2, r1, r5\n\
- ldrb r1, [r2]\n\
- adds r6, r0, 0\n\
- cmp r1, 0\n\
- beq _0813255C\n\
- adds r3, r1, 0\n\
- ldr r0, [r4, 0x14]\n\
- str r3, [r0, 0x8]\n\
- b _081325CA\n\
- .pool\n\
-_0813255C:\n\
- ldr r1, =gBattleMons\n\
- movs r0, 0x58\n\
- muls r0, r5\n\
- adds r4, r0, r1\n\
- adds r0, r4, 0\n\
- adds r0, 0x20\n\
- ldrb r0, [r0]\n\
- cmp r0, 0x17\n\
- beq _08132576\n\
- cmp r0, 0x2A\n\
- beq _08132576\n\
- cmp r0, 0x47\n\
- bne _08132588\n\
-_08132576:\n\
- movs r0, 0x58\n\
- muls r0, r5\n\
- adds r0, r1\n\
- adds r0, 0x20\n\
- ldrb r3, [r0]\n\
- b _081325CA\n\
- .pool\n\
-_08132588:\n\
- ldr r2, =gBaseStats\n\
- ldrh r1, [r4]\n\
- lsls r0, r1, 3\n\
- subs r0, r1\n\
- lsls r0, 2\n\
- adds r1, r0, r2\n\
- ldrb r4, [r1, 0x16]\n\
- cmp r4, 0\n\
- beq _081325B8\n\
- ldrb r2, [r1, 0x17]\n\
- cmp r2, 0\n\
- beq _081325B4\n\
- adds r0, r3, 0\n\
- cmp r4, r0\n\
- beq _081325CE\n\
- cmp r2, r0\n\
- beq _081325CE\n\
- adds r3, r4, 0\n\
- b _081325CA\n\
- .pool\n\
-_081325B4:\n\
- ldrb r3, [r1, 0x16]\n\
- b _081325CA\n\
-_081325B8:\n\
- ldrb r3, [r1, 0x17]\n\
- b _081325CA\n\
-_081325BC:\n\
- ldr r1, =gBattleMons\n\
- movs r0, 0x58\n\
- muls r0, r5\n\
- adds r0, r1\n\
- adds r0, 0x20\n\
- ldrb r3, [r0]\n\
- ldr r6, =gBattleResources\n\
-_081325CA:\n\
- cmp r3, 0\n\
- bne _081325E8\n\
-_081325CE:\n\
- ldr r0, [r6]\n\
- ldr r1, [r0, 0x14]\n\
- movs r0, 0x2\n\
- str r0, [r1, 0x8]\n\
- ldr r2, =gAIScriptPtr\n\
- b _08132608\n\
- .pool\n\
-_081325E8:\n\
- ldr r0, =gAIScriptPtr\n\
- ldr r1, [r0]\n\
- adds r2, r0, 0\n\
- ldrb r1, [r1, 0x2]\n\
- cmp r3, r1\n\
- bne _08132600\n\
- ldr r0, [r6]\n\
- ldr r1, [r0, 0x14]\n\
- movs r0, 0x1\n\
- b _08132606\n\
- .pool\n\
-_08132600:\n\
- ldr r0, [r6]\n\
- ldr r1, [r0, 0x14]\n\
- movs r0, 0\n\
-_08132606:\n\
- str r0, [r1, 0x8]\n\
-_08132608:\n\
- ldr r0, [r2]\n\
- adds r0, 0x3\n\
- str r0, [r2]\n\
- pop {r4-r6}\n\
- pop {r0}\n\
- bx r0\n\
- .pool\n\
- .syntax divided");
-}
-#endif
static void BattleAICmd_get_highest_type_effectiveness(void)
{
@@ -2184,7 +1574,7 @@ static void BattleAICmd_if_status_in_party(void)
switch(gAIScriptPtr[1])
{
- case 1:
+ case AI_USER:
index = sBank_AI;
break;
default:
@@ -2397,7 +1787,7 @@ static void BattleAICmd_if_cant_faint(void)
static void BattleAICmd_if_has_move(void)
{
int i;
- u16 *temp_ptr = (u16 *)(gAIScriptPtr + 2);
+ const u16 *temp_ptr = (u16 *)(gAIScriptPtr + 2);
switch(gAIScriptPtr[1])
{
@@ -2464,7 +1854,7 @@ static void BattleAICmd_if_has_move(void)
static void BattleAICmd_if_dont_have_move(void)
{
int i;
- u16 *temp_ptr = (u16 *)(gAIScriptPtr + 2);
+ const u16 *temp_ptr = (u16 *)(gAIScriptPtr + 2);
switch(gAIScriptPtr[1])
{
@@ -2631,7 +2021,7 @@ static void BattleAICmd_if_curr_move_disabled_or_encored(void)
static void BattleAICmd_flee(void)
{
- AI_THINKING_STRUCT->aiAction |= (AI_ACTION_DONE | AI_ACTION_FLEE | AI_ACTION_DO_NOT_ATTACK); // what matters is UNK2 being enabled.
+ AI_THINKING_STRUCT->aiAction |= (AI_ACTION_DONE | AI_ACTION_FLEE | AI_ACTION_DO_NOT_ATTACK);
}
static void BattleAICmd_if_random_100(void)
@@ -2646,7 +2036,7 @@ static void BattleAICmd_if_random_100(void)
static void BattleAICmd_watch(void)
{
- AI_THINKING_STRUCT->aiAction |= (AI_ACTION_DONE | AI_ACTION_WATCH | AI_ACTION_DO_NOT_ATTACK); // what matters is UNK3 being enabled.
+ AI_THINKING_STRUCT->aiAction |= (AI_ACTION_DONE | AI_ACTION_WATCH | AI_ACTION_DO_NOT_ATTACK);
}
static void BattleAICmd_get_hold_effect(void)
@@ -2675,7 +2065,7 @@ static void BattleAICmd_if_holds_item(void)
u16 item;
u8 var1, var2;
- if ((bank & 1) == (sBank_AI & 1))
+ if ((bank & BIT_SIDE) == (sBank_AI & BIT_SIDE))
item = gBattleMons[bank].item;
else
item = BATTLE_HISTORY->itemEffects[bank];
@@ -2752,7 +2142,7 @@ static void BattleAICmd_get_used_held_item(void)
#ifdef NONMATCHING
AI_THINKING_STRUCT->funcResult = gBattleStruct->usedHeldItems[bank];
#else
- AI_THINKING_STRUCT->funcResult = *(u8*)((u8*)(gBattleStruct) + 0xB8 + (bank * 2));
+ AI_THINKING_STRUCT->funcResult = *(u8*)((u8*)(gBattleStruct) + offsetof(struct BattleStruct, usedHeldItems) + (bank * 2));
#endif // NONMATCHING
gAIScriptPtr += 2;
diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c
new file mode 100644
index 000000000..661759a98
--- /dev/null
+++ b/src/battle_ai_switch_items.c
@@ -0,0 +1,951 @@
+#include "global.h"
+#include "battle.h"
+#include "battle_controllers.h"
+#include "abilities.h"
+#include "moves.h"
+#include "pokemon.h"
+#include "species.h"
+#include "rng.h"
+#include "util.h"
+#include "items.h"
+#include "pokemon_item_effects.h"
+
+extern u8 gActiveBank;
+extern u8 gAbsentBankFlags;
+extern u32 gBattleTypeFlags;
+extern u32 gStatuses3[BATTLE_BANKS_COUNT];
+extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT];
+extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
+extern u16 gUnknown_02024250[BATTLE_BANKS_COUNT];
+extern u8 gUnknown_02024270[BATTLE_BANKS_COUNT];
+extern u16 gDynamicBasePower;
+extern u8 gBattleMoveFlags;
+extern u8 gCritMultiplier;
+extern s32 gBattleMoveDamage;
+
+extern const struct BattleMove gBattleMoves[];
+extern const struct BaseStats gBaseStats[];
+extern const u8 gTypeEffectiveness[];
+extern const u8 * const gItemEffectTable[]; // todo: fix once struct is declared
+
+// this file's functions
+static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng);
+static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent);
+static bool8 ShouldUseItem(void);
+
+static bool8 ShouldSwitchIfPerishSong(void)
+{
+ if (gStatuses3[gActiveBank] & STATUS3_PERISH_SONG
+ && gDisableStructs[gActiveBank].perishSong1 == 0)
+ {
+ *(gBattleStruct->field_294 + gActiveBank) = 6;
+ EmitCmd_x21(1, 2, 0);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static bool8 ShouldSwitchIfWonderGuard(void)
+{
+ u8 opposingIdentity;
+ u8 opposingBank;
+ u8 moveFlags;
+ s32 i, j;
+ s32 firstId;
+ s32 lastId; // + 1
+ struct Pokemon *party = NULL;
+ u16 move;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
+ return FALSE;
+
+ opposingIdentity = GetBankIdentity(gActiveBank) ^ BIT_SIDE;
+
+ if (gBattleMons[GetBankByIdentity(opposingIdentity)].ability != ABILITY_WONDER_GUARD)
+ return FALSE;
+
+ // check if pokemon has a super effective move
+ for (opposingBank = GetBankByIdentity(opposingIdentity), i = 0; i < 4; i++)
+ {
+ move = gBattleMons[gActiveBank].moves[i];
+ if (move == MOVE_NONE)
+ continue;
+
+ moveFlags = AI_TypeCalc(move, gBattleMons[opposingBank].species, gBattleMons[opposingBank].ability);
+ if (moveFlags & MOVESTATUS_SUPEREFFECTIVE)
+ return FALSE;
+ }
+
+ // get party information
+ if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
+ {
+ if ((gActiveBank & BIT_MON) == 0)
+ firstId = 0, lastId = 3;
+ else
+ firstId = 3, lastId = 6;
+ }
+ else
+ {
+ firstId = 0, lastId = 6;
+ }
+
+ if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ party = gPlayerParty;
+ else
+ party = gEnemyParty;
+
+ // find a pokemon in the party that has a super effective move
+ for (i = firstId; i < lastId; i++)
+ {
+ if (GetMonData(&party[i], MON_DATA_HP) == 0)
+ continue;
+ if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_NONE)
+ continue;
+ if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG)
+ continue;
+ if (i == gBattlePartyID[gActiveBank])
+ continue;
+
+ GetMonData(&party[i], MON_DATA_SPECIES); // unused return value
+ GetMonData(&party[i], MON_DATA_ALT_ABILITY); // unused return value
+
+ for (opposingBank = GetBankByIdentity(opposingIdentity), j = 0; j < 4; j++)
+ {
+ move = GetMonData(&party[i], MON_DATA_MOVE1 + j);
+ if (move == MOVE_NONE)
+ continue;
+
+ moveFlags = AI_TypeCalc(move, gBattleMons[opposingBank].species, gBattleMons[opposingBank].ability);
+ if (moveFlags & MOVESTATUS_SUPEREFFECTIVE && Random() % 3 < 2)
+ {
+ // we found a mon
+ *(gBattleStruct->field_294 + gActiveBank) = i;
+ EmitCmd_x21(1, 2, 0);
+ return TRUE;
+ }
+ }
+ }
+
+ return FALSE; // at this point there is not a single pokemon in the party that has a super effective move against a pokemon with wonder guard
+}
+
+static bool8 FindMonThatAbsorbsOpponentsMove(void)
+{
+ u8 bankIn1, bankIn2;
+ u8 absorbingTypeAbility;
+ s32 firstId;
+ s32 lastId; // + 1
+ struct Pokemon *party;
+ s32 i;
+
+ if (HasSuperEffectiveMoveAgainstOpponents(TRUE) && Random() % 3 != 0)
+ return FALSE;
+ if (gUnknown_02024250[gActiveBank] == 0)
+ return FALSE;
+ if (gUnknown_02024250[gActiveBank] == 0xFFFF)
+ return FALSE;
+ if (gBattleMoves[gUnknown_02024250[gActiveBank]].power == 0)
+ return FALSE;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
+ {
+ bankIn1 = gActiveBank;
+ if (gAbsentBankFlags & gBitTable[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)])
+ bankIn2 = gActiveBank;
+ else
+ bankIn2 = GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON);
+ }
+ else
+ {
+ bankIn1 = gActiveBank;
+ bankIn2 = gActiveBank;
+ }
+
+ if (gBattleMoves[gUnknown_02024250[gActiveBank]].type == TYPE_FIRE)
+ absorbingTypeAbility = ABILITY_FLASH_FIRE;
+ else if (gBattleMoves[gUnknown_02024250[gActiveBank]].type == TYPE_WATER)
+ absorbingTypeAbility = ABILITY_WATER_ABSORB;
+ else if (gBattleMoves[gUnknown_02024250[gActiveBank]].type == TYPE_ELECTRIC)
+ absorbingTypeAbility = ABILITY_VOLT_ABSORB;
+ else
+ return FALSE;
+
+ if (gBattleMons[gActiveBank].ability == absorbingTypeAbility)
+ return FALSE;
+
+ if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
+ {
+ if ((gActiveBank & BIT_MON) == 0)
+ firstId = 0, lastId = 3;
+ else
+ firstId = 3, lastId = 6;
+ }
+ else
+ {
+ firstId = 0, lastId = 6;
+ }
+
+ if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ party = gPlayerParty;
+ else
+ party = gEnemyParty;
+
+ for (i = firstId; i < lastId; i++)
+ {
+ u16 species;
+ u8 monAbility;
+
+ if (GetMonData(&party[i], MON_DATA_HP) == 0)
+ continue;
+ if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_NONE)
+ continue;
+ if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG)
+ continue;
+ if (i == gBattlePartyID[bankIn1])
+ continue;
+ if (i == gBattlePartyID[bankIn2])
+ continue;
+ if (i == *(gBattleStruct->field_5C + bankIn1))
+ continue;
+ if (i == *(gBattleStruct->field_5C + bankIn2))
+ continue;
+
+ species = GetMonData(&party[i], MON_DATA_SPECIES);
+ if (GetMonData(&party[i], MON_DATA_ALT_ABILITY) != 0)
+ monAbility = gBaseStats[species].ability2;
+ else
+ monAbility = gBaseStats[species].ability1;
+
+ if (absorbingTypeAbility == monAbility && Random() & 1)
+ {
+ // we found a mon
+ *(gBattleStruct->field_294 + gActiveBank) = i;
+ EmitCmd_x21(1, 2, 0);
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static bool8 ShouldSwitchIfNaturalCure(void)
+{
+ if (!(gBattleMons[gActiveBank].status1 & STATUS_SLEEP))
+ return FALSE;
+ if (gBattleMons[gActiveBank].ability != ABILITY_NATURAL_CURE)
+ return FALSE;
+ if (gBattleMons[gActiveBank].hp < gBattleMons[gActiveBank].maxHP / 2)
+ return FALSE;
+
+ if ((gUnknown_02024250[gActiveBank] == 0 || gUnknown_02024250[gActiveBank] == 0xFFFF) && Random() & 1)
+ {
+ *(gBattleStruct->field_294 + gActiveBank) = 6;
+ EmitCmd_x21(1, 2, 0);
+ return TRUE;
+ }
+ else if (gBattleMoves[gUnknown_02024250[gActiveBank]].power == 0 && Random() & 1)
+ {
+ *(gBattleStruct->field_294 + gActiveBank) = 6;
+ EmitCmd_x21(1, 2, 0);
+ return TRUE;
+ }
+
+ if (FindMonWithFlagsAndSuperEffective(MOVESTATUS_NOTAFFECTED, 1))
+ return TRUE;
+ if (FindMonWithFlagsAndSuperEffective(MOVESTATUS_NOTVERYEFFECTIVE, 1))
+ return TRUE;
+ if (Random() & 1)
+ {
+ *(gBattleStruct->field_294 + gActiveBank) = 6;
+ EmitCmd_x21(1, 2, 0);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng)
+{
+ u8 opposingIdentity;
+ u8 opposingBank;
+ s32 i;
+ u8 moveFlags;
+ u16 move;
+
+ opposingIdentity = GetBankIdentity(gActiveBank) ^ BIT_SIDE;
+ opposingBank = GetBankByIdentity(opposingIdentity);
+
+ if (!(gAbsentBankFlags & gBitTable[opposingBank]))
+ {
+ for (i = 0; i < 4; i++)
+ {
+ move = gBattleMons[gActiveBank].moves[i];
+ if (move == MOVE_NONE)
+ continue;
+
+ moveFlags = AI_TypeCalc(move, gBattleMons[opposingBank].species, gBattleMons[opposingBank].ability);
+ if (moveFlags & MOVESTATUS_SUPEREFFECTIVE)
+ {
+ if (noRng)
+ return TRUE;
+ if (Random() % 10 != 0)
+ return TRUE;
+ }
+ }
+ }
+ if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
+ return FALSE;
+
+ opposingBank = GetBankByIdentity(opposingIdentity ^ BIT_MON);
+
+ if (!(gAbsentBankFlags & gBitTable[opposingBank]))
+ {
+ for (i = 0; i < 4; i++)
+ {
+ move = gBattleMons[gActiveBank].moves[i];
+ if (move == MOVE_NONE)
+ continue;
+
+ moveFlags = AI_TypeCalc(move, gBattleMons[opposingBank].species, gBattleMons[opposingBank].ability);
+ if (moveFlags & MOVESTATUS_SUPEREFFECTIVE)
+ {
+ if (noRng)
+ return TRUE;
+ if (Random() % 10 != 0)
+ return TRUE;
+ }
+ }
+ }
+
+ return FALSE;
+}
+
+static bool8 AreStatsRaised(void)
+{
+ u8 buffedStatsValue = 0;
+ s32 i;
+
+ for (i = 0; i < BATTLE_STATS_NO; i++)
+ {
+ if (gBattleMons[gActiveBank].statStages[i] > 6)
+ buffedStatsValue += gBattleMons[gActiveBank].statStages[i] - 6;
+ }
+
+ return (buffedStatsValue > 3);
+}
+
+static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent)
+{
+ u8 bankIn1, bankIn2;
+ s32 firstId;
+ s32 lastId; // + 1
+ struct Pokemon *party;
+ s32 i, j;
+ u16 move;
+ u8 moveFlags;
+
+ if (gUnknown_02024250[gActiveBank] == 0)
+ return FALSE;
+ if (gUnknown_02024250[gActiveBank] == 0xFFFF)
+ return FALSE;
+ if (gUnknown_02024270[gActiveBank] == 0xFF)
+ return FALSE;
+ if (gBattleMoves[gUnknown_02024250[gActiveBank]].power == 0)
+ return FALSE;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
+ {
+ bankIn1 = gActiveBank;
+ if (gAbsentBankFlags & gBitTable[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)])
+ bankIn2 = gActiveBank;
+ else
+ bankIn2 = GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON);
+ }
+ else
+ {
+ bankIn1 = gActiveBank;
+ bankIn2 = gActiveBank;
+ }
+
+ if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
+ {
+ if ((gActiveBank & BIT_MON) == 0)
+ firstId = 0, lastId = 3;
+ else
+ firstId = 3, lastId = 6;
+ }
+ else
+ {
+ firstId = 0, lastId = 6;
+ }
+
+ if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ party = gPlayerParty;
+ else
+ party = gEnemyParty;
+
+ for (i = firstId; i < lastId; i++)
+ {
+ u16 species;
+ u8 monAbility;
+
+ if (GetMonData(&party[i], MON_DATA_HP) == 0)
+ continue;
+ if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_NONE)
+ continue;
+ if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG)
+ continue;
+ if (i == gBattlePartyID[bankIn1])
+ continue;
+ if (i == gBattlePartyID[bankIn2])
+ continue;
+ if (i == *(gBattleStruct->field_5C + bankIn1))
+ continue;
+ if (i == *(gBattleStruct->field_5C + bankIn2))
+ continue;
+
+ species = GetMonData(&party[i], MON_DATA_SPECIES);
+ if (GetMonData(&party[i], MON_DATA_ALT_ABILITY) != 0)
+ monAbility = gBaseStats[species].ability2;
+ else
+ monAbility = gBaseStats[species].ability1;
+
+ moveFlags = AI_TypeCalc(gUnknown_02024250[gActiveBank], species, monAbility);
+ if (moveFlags & flags)
+ {
+ bankIn1 = gUnknown_02024270[gActiveBank];
+
+ for (j = 0; j < 4; j++)
+ {
+ move = GetMonData(&party[i], MON_DATA_MOVE1 + j);
+ if (move == 0)
+ continue;
+
+ moveFlags = AI_TypeCalc(move, gBattleMons[bankIn1].species, gBattleMons[bankIn1].ability);
+ if (moveFlags & MOVESTATUS_SUPEREFFECTIVE && Random() % moduloPercent == 0)
+ {
+ *(gBattleStruct->field_294 + gActiveBank) = i;
+ EmitCmd_x21(1, 2, 0);
+ return TRUE;
+ }
+ }
+ }
+ }
+
+ return FALSE;
+}
+
+static bool8 ShouldSwitch(void)
+{
+ u8 bankIn1, bankIn2;
+ u8 *activeBankPtr; // needed to match
+ s32 firstId;
+ s32 lastId; // + 1
+ struct Pokemon *party;
+ s32 i;
+ s32 availableToSwitch;
+
+ if (gBattleMons[*(activeBankPtr = &gActiveBank)].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION))
+ return FALSE;
+ if (gStatuses3[gActiveBank] & STATUS3_ROOTED)
+ return FALSE;
+ if (AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gActiveBank, ABILITY_SHADOW_TAG, 0, 0))
+ return FALSE;
+ if (AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gActiveBank, ABILITY_ARENA_TRAP, 0, 0))
+ return FALSE; // misses the flying or levitate check
+ if (AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_MAGNET_PULL, 0, 0))
+ {
+ if (gBattleMons[gActiveBank].type1 == TYPE_STEEL)
+ return FALSE;
+ if (gBattleMons[gActiveBank].type2 == TYPE_STEEL)
+ return FALSE;
+ }
+ if (gBattleTypeFlags & BATTLE_TYPE_ARENA)
+ return FALSE;
+
+ availableToSwitch = 0;
+ if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
+ {
+ bankIn1 = *activeBankPtr;
+ if (gAbsentBankFlags & gBitTable[GetBankByIdentity(GetBankIdentity(*activeBankPtr) ^ BIT_MON)])
+ bankIn2 = *activeBankPtr;
+ else
+ bankIn2 = GetBankByIdentity(GetBankIdentity(*activeBankPtr) ^ BIT_MON);
+ }
+ else
+ {
+ bankIn1 = *activeBankPtr;
+ bankIn2 = *activeBankPtr;
+ }
+
+ if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
+ {
+ if ((gActiveBank & BIT_MON) == 0)
+ firstId = 0, lastId = 3;
+ else
+ firstId = 3, lastId = 6;
+ }
+ else
+ {
+ firstId = 0, lastId = 6;
+ }
+
+ if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ party = gPlayerParty;
+ else
+ party = gEnemyParty;
+
+ for (i = firstId; i < lastId; i++)
+ {
+ if (GetMonData(&party[i], MON_DATA_HP) == 0)
+ continue;
+ if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_NONE)
+ continue;
+ if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG)
+ continue;
+ if (i == gBattlePartyID[bankIn1])
+ continue;
+ if (i == gBattlePartyID[bankIn2])
+ continue;
+ if (i == *(gBattleStruct->field_5C + bankIn1))
+ continue;
+ if (i == *(gBattleStruct->field_5C + bankIn2))
+ continue;
+
+ availableToSwitch++;
+ }
+
+ if (availableToSwitch == 0)
+ return FALSE;
+ if (ShouldSwitchIfPerishSong())
+ return TRUE;
+ if (ShouldSwitchIfWonderGuard())
+ return TRUE;
+ if (FindMonThatAbsorbsOpponentsMove())
+ return TRUE;
+ if (ShouldSwitchIfNaturalCure())
+ return TRUE;
+ if (HasSuperEffectiveMoveAgainstOpponents(FALSE))
+ return FALSE;
+ if (AreStatsRaised())
+ return FALSE;
+ if (FindMonWithFlagsAndSuperEffective(MOVESTATUS_NOTAFFECTED, 2)
+ || FindMonWithFlagsAndSuperEffective(MOVESTATUS_NOTVERYEFFECTIVE, 3))
+ return TRUE;
+
+ return FALSE;
+}
+
+void AI_TrySwitchOrUseItem(void)
+{
+ struct Pokemon *party;
+ u8 bankIn1, bankIn2;
+ s32 firstId;
+ s32 lastId; // + 1
+ u8 bankIdentity = GetBankIdentity(gActiveBank);
+
+ if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ party = gPlayerParty;
+ else
+ party = gEnemyParty;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
+ {
+ if (ShouldSwitch())
+ {
+ if (*(gBattleStruct->field_294 + gActiveBank) == 6)
+ {
+ s32 monToSwitchId = GetMostSuitableMonToSwitchInto();
+ if (monToSwitchId == 6)
+ {
+ if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
+ {
+ bankIn1 = GetBankByIdentity(bankIdentity);
+ bankIn2 = bankIn1;
+ }
+ else
+ {
+ bankIn1 = GetBankByIdentity(bankIdentity);
+ bankIn2 = GetBankByIdentity(bankIdentity ^ BIT_MON);
+ }
+
+ if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
+ {
+ if ((gActiveBank & BIT_MON) == 0)
+ firstId = 0, lastId = 3;
+ else
+ firstId = 3, lastId = 6;
+ }
+ else
+ {
+ firstId = 0, lastId = 6;
+ }
+
+ for (monToSwitchId = firstId; monToSwitchId < lastId; monToSwitchId++)
+ {
+ if (GetMonData(&party[monToSwitchId], MON_DATA_HP) == 0)
+ continue;
+ if (monToSwitchId == gBattlePartyID[bankIn1])
+ continue;
+ if (monToSwitchId == gBattlePartyID[bankIn2])
+ continue;
+ if (monToSwitchId == *(gBattleStruct->field_5C + bankIn1))
+ continue;
+ if (monToSwitchId == *(gBattleStruct->field_5C + bankIn2))
+ continue;
+
+ break;
+ }
+ }
+
+ *(gBattleStruct->field_294 + gActiveBank) = monToSwitchId;
+ }
+
+ *(gBattleStruct->field_5C + gActiveBank) = *(gBattleStruct->field_294 + gActiveBank);
+ return;
+ }
+ else if (ShouldUseItem())
+ {
+ return;
+ }
+ }
+
+ EmitCmd_x21(1, 0, (gActiveBank ^ BIT_SIDE) << 8);
+}
+
+#define TYPE_FORESIGHT 0xFE
+#define TYPE_ENDTABLE 0xFF
+
+static void ModulateByTypeEffectiveness(u8 atkType, u8 defType1, u8 defType2, u8 *var)
+{
+ s32 i = 0;
+
+ while (gTypeEffectiveness[i] != TYPE_ENDTABLE)
+ {
+ if (gTypeEffectiveness[i] == TYPE_FORESIGHT)
+ {
+ i += 3;
+ continue;
+ }
+ else if (gTypeEffectiveness[i] == atkType)
+ {
+ // check type1
+ if (gTypeEffectiveness[i + 1] == defType1)
+ *var = (*var * gTypeEffectiveness[i + 2]) / 10;
+ // check type2
+ if (gTypeEffectiveness[i + 1] == defType2 && defType1 != defType2)
+ *var = (*var * gTypeEffectiveness[i + 2]) / 10;
+ }
+ i += 3;
+ }
+}
+
+u8 GetMostSuitableMonToSwitchInto(void)
+{
+ u8 opposingBank;
+ u8 bestDmg; // note : should be changed to u32 for obvious reasons
+ u8 bestMonId;
+ u8 bankIn1, bankIn2;
+ s32 firstId;
+ s32 lastId; // + 1
+ struct Pokemon *party;
+ s32 i, j;
+ u8 invalidMons;
+ u16 move;
+
+ if (*(gBattleStruct->field_5C + gActiveBank) != 6)
+ return *(gBattleStruct->field_5C + gActiveBank);
+ if (gBattleTypeFlags & BATTLE_TYPE_ARENA)
+ return gBattlePartyID[gActiveBank] + 1;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
+ {
+ bankIn1 = gActiveBank;
+ if (gAbsentBankFlags & gBitTable[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)])
+ bankIn2 = gActiveBank;
+ else
+ bankIn2 = GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON);
+
+ // UB: It considers the opponent only player's side even though it can battle alongside player;
+ opposingBank = Random() & BIT_MON;
+ if (gAbsentBankFlags & gBitTable[opposingBank])
+ opposingBank ^= BIT_MON;
+ }
+ else
+ {
+ opposingBank = GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_SIDE);
+ bankIn1 = gActiveBank;
+ bankIn2 = gActiveBank;
+ }
+
+ if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
+ {
+ if ((gActiveBank & BIT_MON) == 0)
+ firstId = 0, lastId = 3;
+ else
+ firstId = 3, lastId = 6;
+ }
+ else
+ {
+ firstId = 0, lastId = 6;
+ }
+
+ if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ party = gPlayerParty;
+ else
+ party = gEnemyParty;
+
+ invalidMons = 0;
+
+ while (invalidMons != 0x3F) // all mons are invalid
+ {
+ bestDmg = 0;
+ bestMonId = 6;
+ // find the mon which type is the most suitable offensively
+ for (i = firstId; i < lastId; i++)
+ {
+ u16 species = GetMonData(&party[i], MON_DATA_SPECIES);
+ if (species != SPECIES_NONE
+ && GetMonData(&party[i], MON_DATA_HP) != 0
+ && !(gBitTable[i] & invalidMons)
+ && gBattlePartyID[bankIn1] != i
+ && gBattlePartyID[bankIn2] != i
+ && i != *(gBattleStruct->field_5C + bankIn1)
+ && i != *(gBattleStruct->field_5C + bankIn2))
+ {
+ u8 type1 = gBaseStats[species].type1;
+ u8 type2 = gBaseStats[species].type2;
+ u8 typeDmg = 10;
+ ModulateByTypeEffectiveness(gBattleMons[opposingBank].type1, type1, type2, &typeDmg);
+ ModulateByTypeEffectiveness(gBattleMons[opposingBank].type2, type1, type2, &typeDmg);
+ if (bestDmg < typeDmg)
+ {
+ bestDmg = typeDmg;
+ bestMonId = i;
+ }
+ }
+ else
+ {
+ invalidMons |= gBitTable[i];
+ }
+ }
+
+ // ok, we know the mon has the right typing but does it have at least one super effective move?
+ if (bestMonId != 6)
+ {
+ for (i = 0; i < 4; i++)
+ {
+ move = GetMonData(&party[bestMonId], MON_DATA_MOVE1 + i);
+ if (move != MOVE_NONE && TypeCalc(move, gActiveBank, opposingBank) & MOVESTATUS_SUPEREFFECTIVE)
+ break;
+ }
+
+ if (i != 4)
+ return bestMonId; // has both the typing and at least one super effective move
+
+ invalidMons |= gBitTable[bestMonId]; // sorry buddy, we want something better
+ }
+ else
+ {
+ invalidMons = 0x3F; // no viable mon to switch
+ }
+ }
+
+ gDynamicBasePower = 0;
+ gBattleStruct->dynamicMoveType = 0;
+ gBattleScripting.dmgMultiplier = 1;
+ gBattleMoveFlags = 0;
+ gCritMultiplier = 1;
+ bestDmg = 0;
+ bestMonId = 6;
+
+ // if we couldn't find the best mon in terms of typing, find the one that deals most damage
+ for (i = firstId; i < lastId; i++)
+ {
+ if ((u16)(GetMonData(&party[i], MON_DATA_SPECIES)) == SPECIES_NONE)
+ continue;
+ if (GetMonData(&party[i], MON_DATA_HP) == 0)
+ continue;
+ if (gBattlePartyID[bankIn1] == i)
+ continue;
+ if (gBattlePartyID[bankIn2] == i)
+ continue;
+ if (i == *(gBattleStruct->field_5C + bankIn1))
+ continue;
+ if (i == *(gBattleStruct->field_5C + bankIn2))
+ continue;
+
+ for (j = 0; j < 4; j++)
+ {
+ move = GetMonData(&party[i], MON_DATA_MOVE1 + j);
+ gBattleMoveDamage = 0;
+ if (move != MOVE_NONE && gBattleMoves[move].power != 1)
+ {
+ AI_CalcDmg(gActiveBank, opposingBank);
+ TypeCalc(move, gActiveBank, opposingBank);
+ }
+ if (bestDmg < gBattleMoveDamage)
+ {
+ bestDmg = gBattleMoveDamage;
+ bestMonId = i;
+ }
+ }
+ }
+
+ return bestMonId;
+}
+
+// TODO: use PokemonItemEffect struct instead of u8 once it's documented
+static u8 GetAI_ItemType(u8 itemId, const u8 *itemEffect) // NOTE: should take u16 as item Id argument
+{
+ if (itemId == ITEM_FULL_RESTORE)
+ return AI_ITEM_FULL_RESTORE;
+ if (itemEffect[4] & 4)
+ return AI_ITEM_HEAL_HP;
+ if (itemEffect[3] & 0x3F)
+ return AI_ITEM_CURE_CONDITION;
+ if (itemEffect[0] & 0x3F || itemEffect[1] != 0 || itemEffect[2] != 0)
+ return AI_ITEM_X_STAT;
+ if (itemEffect[3] & 0x80)
+ return AI_ITEM_GUARD_SPECS;
+
+ return AI_ITEM_NOT_RECOGNIZABLE;
+}
+
+static bool8 ShouldUseItem(void)
+{
+ struct Pokemon *party;
+ s32 i;
+ u8 validMons = 0;
+ bool8 shouldUse = FALSE;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && GetBankIdentity(gActiveBank) == IDENTITY_PLAYER_MON2)
+ return FALSE;
+
+ if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ party = gPlayerParty;
+ else
+ party = gEnemyParty;
+
+ for (i = 0; i < 6; i++)
+ {
+ if (GetMonData(&party[i], MON_DATA_HP) != 0
+ && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_NONE
+ && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG)
+ {
+ validMons++;
+ }
+ }
+
+ for (i = 0; i < 4; i++)
+ {
+ u16 item;
+ const u8 *itemEffects;
+ u8 paramOffset;
+ u8 bankSide;
+
+ if (i != 0 && validMons > (gBattleResources->battleHistory->itemsNo - i) + 1)
+ continue;
+ item = gBattleResources->battleHistory->trainerItems[i];
+ if (item == ITEM_NONE)
+ continue;
+ if (gItemEffectTable[item - 13] == NULL)
+ continue;
+
+ if (item == ITEM_ENIGMA_BERRY)
+ itemEffects = gSaveBlock1Ptr->enigmaBerry.itemEffect;
+ else
+ itemEffects = gItemEffectTable[item - 13];
+
+ *(gBattleStruct->AI_itemType + gActiveBank / 2) = GetAI_ItemType(item, itemEffects);
+
+ switch (*(gBattleStruct->AI_itemType + gActiveBank / 2))
+ {
+ case AI_ITEM_FULL_RESTORE:
+ if (gBattleMons[gActiveBank].hp >= gBattleMons[gActiveBank].maxHP / 4)
+ break;
+ if (gBattleMons[gActiveBank].hp == 0)
+ break;
+ shouldUse = TRUE;
+ break;
+ case AI_ITEM_HEAL_HP:
+ paramOffset = GetItemEffectParamOffset(item, 4, 4);
+ if (paramOffset == 0)
+ break;
+ if (gBattleMons[gActiveBank].hp == 0)
+ break;
+ if (gBattleMons[gActiveBank].hp < gBattleMons[gActiveBank].maxHP / 4 || gBattleMons[gActiveBank].maxHP - gBattleMons[gActiveBank].hp > itemEffects[paramOffset])
+ shouldUse = TRUE;
+ break;
+ case AI_ITEM_CURE_CONDITION:
+ *(gBattleStruct->AI_itemFlags + gActiveBank / 2) = 0;
+ if (itemEffects[3] & 0x20 && gBattleMons[gActiveBank].status1 & STATUS_SLEEP)
+ {
+ *(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x20;
+ shouldUse = TRUE;
+ }
+ if (itemEffects[3] & 0x10 && (gBattleMons[gActiveBank].status1 & STATUS_POISON || gBattleMons[gActiveBank].status1 & STATUS_TOXIC_POISON))
+ {
+ *(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x10;
+ shouldUse = TRUE;
+ }
+ if (itemEffects[3] & 0x8 && gBattleMons[gActiveBank].status1 & STATUS_BURN)
+ {
+ *(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x8;
+ shouldUse = TRUE;
+ }
+ if (itemEffects[3] & 0x4 && gBattleMons[gActiveBank].status1 & STATUS_FREEZE)
+ {
+ *(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x4;
+ shouldUse = TRUE;
+ }
+ if (itemEffects[3] & 0x2 && gBattleMons[gActiveBank].status1 & STATUS_PARALYSIS)
+ {
+ *(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x2;
+ shouldUse = TRUE;
+ }
+ if (itemEffects[3] & 0x1 && gBattleMons[gActiveBank].status2 & STATUS2_CONFUSION)
+ {
+ *(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x1;
+ shouldUse = TRUE;
+ }
+ break;
+ case AI_ITEM_X_STAT:
+ *(gBattleStruct->AI_itemFlags + gActiveBank / 2) = 0;
+ if (gDisableStructs[gActiveBank].isFirstTurn == 0)
+ break;
+ if (itemEffects[0] & 0xF)
+ *(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x1;
+ if (itemEffects[1] & 0xF0)
+ *(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x2;
+ if (itemEffects[1] & 0xF)
+ *(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x4;
+ if (itemEffects[2] & 0xF)
+ *(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x8;
+ if (itemEffects[2] & 0xF0)
+ *(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x20;
+ if (itemEffects[0] & 0x30)
+ *(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x80;
+ shouldUse = TRUE;
+ break;
+ case AI_ITEM_GUARD_SPECS:
+ bankSide = GetBankSide(gActiveBank);
+ if (gDisableStructs[gActiveBank].isFirstTurn != 0 && gSideTimers[bankSide].mistTimer == 0)
+ shouldUse = TRUE;
+ break;
+ case AI_ITEM_NOT_RECOGNIZABLE:
+ return FALSE;
+ }
+
+ if (shouldUse)
+ {
+ EmitCmd_x21(1, 1, 0);
+ *(gBattleStruct->field_C0 + (gActiveBank / 2) * 2) = item;
+ gBattleResources->battleHistory->trainerItems[i] = 0;
+ return shouldUse;
+ }
+ }
+
+ return FALSE;
+}
diff --git a/src/battle_dome_cards.c b/src/battle_dome_cards.c
index c0557ac70..5251ee06a 100644
--- a/src/battle_dome_cards.c
+++ b/src/battle_dome_cards.c
@@ -17,7 +17,7 @@ extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[];
extern const union AffineAnimCmd *const gUnknown_082FF618[];
extern const union AffineAnimCmd *const gUnknown_082FF694[];
extern const union AnimCmd *const gUnknown_082FF70C[];
-extern const union AnimCmd *const *const gUnknown_08309AAC[NUM_SPECIES];
+extern const union AnimCmd *const *const gMonAnimationsSpriteAnimsPtrTable[NUM_SPECIES];
extern const union AnimCmd *const *const gUnknown_0830536C[];
extern const u8 gUnknown_0831F578[];
@@ -282,7 +282,7 @@ u16 sub_818D3E4(u16 species, u32 otId, u32 personality, u8 flags, s16 x, s16 y,
images[j].size = 0x800;
}
gUnknown_0203CCEC.tileTag = 0xFFFF;
- gUnknown_0203CCEC.anims = gUnknown_08309AAC[species];
+ gUnknown_0203CCEC.anims = gMonAnimationsSpriteAnimsPtrTable[species];
gUnknown_0203CCEC.images = images;
if (flags2 == 0x01)
{
diff --git a/src/battle_message.c b/src/battle_message.c
new file mode 100644
index 000000000..aeff721d6
--- /dev/null
+++ b/src/battle_message.c
@@ -0,0 +1,2333 @@
+#include "global.h"
+#include "battle.h"
+#include "battle_message.h"
+#include "battle_string_ids.h"
+#include "moves.h"
+#include "text.h"
+#include "string_util.h"
+#include "items.h"
+#include "event_data.h"
+#include "link.h"
+#include "item.h"
+#include "window.h"
+#include "palette.h"
+#include "battle_controllers.h"
+
+extern u16 gLastUsedItem;
+extern u8 gLastUsedAbility;
+extern u8 gActiveBank;
+extern u8 gBankAttacker;
+extern u8 gBankTarget;
+extern u8 gStringBank;
+extern u8 gEffectBank;
+extern u8 gAbilitiesPerBank[BATTLE_BANKS_COUNT];
+extern u32 gBattleTypeFlags;
+extern u16 gTrainerBattleOpponent_A;
+extern u16 gTrainerBattleOpponent_B;
+extern u16 gPartnerTrainerId;
+extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
+extern struct BattleEnigmaBerry gEnigmaBerries[BATTLE_BANKS_COUNT];
+extern u8 gBattleBufferA[BATTLE_BANKS_COUNT][0x200];
+extern u8 gMoveSelectionCursor[BATTLE_BANKS_COUNT];
+extern u8 gUnknown_0203C7B4;
+extern struct StringInfoBattle *gStringInfo;
+
+extern const u8 gMoveNames[LAST_MOVE_INDEX + 1][13];
+extern const u8 gAbilityNames[][13];
+extern const u8 gTrainerClassNames[][13];
+extern const u8 gTypeNames[][7];
+extern const u16 gUnknown_08D85620[];
+
+// strings
+extern const u8 gText_PkmnBoxSomeonesPCFull[];
+extern const u8 gText_PkmnBoxLanettesPCFull[];
+extern const u8 gText_PkmnTransferredSomeonesPC[];
+extern const u8 gText_PkmnTransferredLanettesPC[];
+
+extern u16 sub_8068BB0(void); // pokemon_1
+extern u8 sub_81A4D00(void); // battle_frontier_2
+extern u8 GetFrontierOpponentClass(u16 trainerId); // battle_tower
+extern u8 sub_81D5530(u16 trainerId); // pokenav
+extern u8 GetEreaderTrainerClassId(void); // battle_tower
+extern void sub_81A4D50(u8 *txtPtr); // battle_frontier_2
+extern void sub_81D5554(u8 *txtPtr, u16 trainerId); // pokenav
+extern void GetEreaderTrainerName(u8 *txtPtr);
+extern void sub_81A36D0(u8 arg0, u16 trainerId); // battle_frontier_2
+extern void sub_81D572C(u8 arg0, u16 trainerId); // pokenav
+extern const u8* GetTrainer1LoseText(void); // battle_setup
+extern const u8* GetTrainer2LoseText(void); // battle_setup
+extern void GetFrontierTrainerName(u8 *dst, u16 trainerId);
+extern s32 GetStringCenterAlignXOffsetWithLetterSpacing(u8 fontId, const u8 *str, s32 totalWidth, s16 letterSpacing);
+extern u8 sub_8185FC4(void);
+extern u8 sav2_get_text_speed(void);
+
+// this file's functions
+static void sub_814F8F8(u8 *textPtr);
+static void sub_814F950(u8 *dst);
+static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst);
+
+// ewram variables
+EWRAM_DATA u8 gDisplayedStringBattle[300] = {0};
+EWRAM_DATA u8 gBattleTextBuff1[TEXT_BUFF_ARRAY_COUNT] = {0};
+EWRAM_DATA u8 gBattleTextBuff2[TEXT_BUFF_ARRAY_COUNT] = {0};
+EWRAM_DATA u8 gBattleTextBuff3[TEXT_BUFF_ARRAY_COUNT] = {0};
+
+// const rom data
+// todo: make some of those names less vague: attacker/target vs pkmn, etc.
+
+const u8 gText_Trainer1LoseText[] = _("{B_TRAINER1_LOSE_TEXT}");
+const u8 gText_PkmnGainedEXP[] = _("{B_BUFF1} gained{B_BUFF2}\n{B_BUFF3} EXP. Points!\p");
+const u8 gText_EmptyString4[] = _("");
+const u8 gText_ABoosted[] = _(" a boosted");
+const u8 gText_PkmnGrewToLv[] = _("{B_BUFF1} grew to\nLV. {B_BUFF2}!{UNKNOWN_A}\p");
+const u8 gText_PkmnLearnedMove[] = _("{B_BUFF1} learned\n{B_BUFF2}!{UNKNOWN_A}\p");
+const u8 gText_TryToLearnMove1[] = _("{B_BUFF1} is trying to\nlearn {B_BUFF2}.\p");
+const u8 gText_TryToLearnMove2[] = _("But, {B_BUFF1} can’t learn\nmore than four moves.\p");
+const u8 gText_TryToLearnMove3[] = _("Delete a move to make\nroom for {B_BUFF2}?");
+const u8 gText_PkmnForgotMove[] = _("{B_BUFF1} forgot\n{B_BUFF2}.\p");
+const u8 gText_StopLearningMove[] = _("{PAUSE 32}Stop learning\n{B_BUFF2}?");
+const u8 gText_DidNotLearnMove[] = _("{B_BUFF1} did not learn\n{B_BUFF2}.\p");
+const u8 gText_UseNextPkmn[] = _("Use next POKéMON?");
+const u8 gText_AttackMissed[] = _("{B_ATK_NAME_WITH_PREFIX}’s\nattack missed!");
+const u8 gText_PkmnProtectedItself[] = _("{B_DEF_NAME_WITH_PREFIX}\nprotected itself!");
+const u8 gText_AvoidedDamage[] = _("{B_DEF_NAME_WITH_PREFIX} avoided\ndamage with {B_DEF_ABILITY}!");
+const u8 gText_PkmnMakesGroundMiss[] = _("{B_DEF_NAME_WITH_PREFIX} makes GROUND\nmoves miss with {B_DEF_ABILITY}!");
+const u8 gText_PkmnAvoidedAttack[] = _("{B_DEF_NAME_WITH_PREFIX} avoided\nthe attack!");
+const u8 gText_ItDoesntAffect[] = _("It doesn’t affect\n{B_DEF_NAME_WITH_PREFIX}…");
+const u8 gText_AttackerFainted[] = _("{B_ATK_NAME_WITH_PREFIX}\nfainted!\p");
+const u8 gText_TargetFainted[] = _("{B_DEF_NAME_WITH_PREFIX}\nfainted!\p");
+const u8 gText_PlayerGotMoney[] = _("{B_PLAYER_NAME} got ¥{B_BUFF1}\nfor winning!\p");
+const u8 gText_PlayerWhiteout[] = _("{B_PLAYER_NAME} is out of\nusable POKéMON!\p");
+const u8 gText_PlayerWhiteout2[] = _("{B_PLAYER_NAME} whited out!{PAUSE_UNTIL_PRESS}");
+const u8 gText_PreventsEscape[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} prevents\nescape with {B_SCR_ACTIVE_ABILITY}!\p");
+const u8 gText_CantEscape2[] = _("Can’t escape!\p");
+const u8 gText_AttackerCantEscape[] = _("{B_ATK_NAME_WITH_PREFIX} can’t escape!");
+const u8 gText_HitXTimes[] = _("Hit {B_BUFF1} time(s)!");
+const u8 gText_PkmnFellAsleep[] = _("{B_EFF_NAME_WITH_PREFIX}\nfell asleep!");
+const u8 gText_PkmnMadeSleep[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nmade {B_EFF_NAME_WITH_PREFIX} sleep!");
+const u8 gText_PkmnAlreadyAsleep[] = _("{B_DEF_NAME_WITH_PREFIX} is\nalready asleep!");
+const u8 gText_PkmnAlreadyAsleep2[] = _("{B_ATK_NAME_WITH_PREFIX} is\nalready asleep!");
+const u8 gText_PkmnWasntAffected[] = _("{B_DEF_NAME_WITH_PREFIX}\nwasn’t affected!");
+const u8 gText_PkmnWasPoisoned[] = _("{B_EFF_NAME_WITH_PREFIX}\nwas poisoned!");
+const u8 gText_PkmnPoisonedBy[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\npoisoned {B_EFF_NAME_WITH_PREFIX}!");
+const u8 gText_PkmnHurtByPoison[] = _("{B_ATK_NAME_WITH_PREFIX} is hurt\nby poison!");
+const u8 gText_PkmnAlreadyPoisoned[] = _("{B_DEF_NAME_WITH_PREFIX} is already\npoisoned.");
+const u8 gText_PkmnBadlyPoisoned[] = _("{B_EFF_NAME_WITH_PREFIX} is badly\npoisoned!");
+const u8 gText_PkmnEnergyDrained[] = _("{B_DEF_NAME_WITH_PREFIX} had its\nenergy drained!");
+const u8 gText_PkmnWasBurned[] = _("{B_EFF_NAME_WITH_PREFIX} was burned!");
+const u8 gText_PkmnBurnedBy[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nburned {B_EFF_NAME_WITH_PREFIX}!");
+const u8 gText_PkmnHurtByBurn[] = _("{B_ATK_NAME_WITH_PREFIX} is hurt\nby its burn!");
+const u8 gText_PkmnAlreadyHasBurn[] = _("{B_DEF_NAME_WITH_PREFIX} already\nhas a burn.");
+const u8 gText_PkmnWasFrozen[] = _("{B_EFF_NAME_WITH_PREFIX} was\nfrozen solid!");
+const u8 gText_PkmnFrozenBy[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nfroze {B_EFF_NAME_WITH_PREFIX} solid!");
+const u8 gText_PkmnIsFrozen[] = _("{B_ATK_NAME_WITH_PREFIX} is\nfrozen solid!");
+const u8 gText_PkmnWasDefrosted[] = _("{B_DEF_NAME_WITH_PREFIX} was\ndefrosted!");
+const u8 gText_PkmnWasDefrosted2[] = _("{B_ATK_NAME_WITH_PREFIX} was\ndefrosted!");
+const u8 gText_PkmnWasDefrostedBy[] = _("{B_ATK_NAME_WITH_PREFIX} was\ndefrosted by {B_CURRENT_MOVE}!");
+const u8 gText_PkmnWasParalyzed[] = _("{B_EFF_NAME_WITH_PREFIX} is paralyzed!\nIt may be unable to move!");
+const u8 gText_PkmnWasParalyzedBy[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nparalyzed {B_EFF_NAME_WITH_PREFIX}!\lIt may be unable to move!");
+const u8 gText_PkmnIsParalyzed[] = _("{B_ATK_NAME_WITH_PREFIX} is paralyzed!\nIt can’t move!");
+const u8 gText_PkmnIsAlreadyParalyzed[] = _("{B_DEF_NAME_WITH_PREFIX} is\nalready paralyzed!");
+const u8 gText_PkmnHealedParalysis[] = _("{B_DEF_NAME_WITH_PREFIX} was\nhealed of paralysis!");
+const u8 gText_PkmnDreamEaten[] = _("{B_DEF_NAME_WITH_PREFIX}’s\ndream was eaten!");
+const u8 gText_StatsWontIncrease[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_BUFF1}\nwon’t go higher!");
+const u8 gText_StatsWontDecrease[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_BUFF1}\nwon’t go lower!");
+const u8 gText_TeamStoppedWorking[] = _("Your team’s {B_BUFF1}\nstopped working!");
+const u8 gText_FoeStoppedWorking[] = _("The foe’s {B_BUFF1}\nstopped working!");
+const u8 gText_PkmnIsConfused[] = _("{B_ATK_NAME_WITH_PREFIX} is\nconfused!");
+const u8 gText_PkmnHealedConfusion[] = _("{B_ATK_NAME_WITH_PREFIX} snapped\nout of confusion!");
+const u8 gText_PkmnWasConfused[] = _("{B_EFF_NAME_WITH_PREFIX} became\nconfused!");
+const u8 gText_PkmnAlreadyConfused[] = _("{B_DEF_NAME_WITH_PREFIX} is\nalready confused!");
+const u8 gText_PkmnFellInLove[] = _("{B_DEF_NAME_WITH_PREFIX}\nfell in love!");
+const u8 gText_PkmnInLove[] = _("{B_ATK_NAME_WITH_PREFIX} is in love\nwith {B_SCR_ACTIVE_NAME_WITH_PREFIX}!");
+const u8 gText_PkmnImmobilizedByLove[] = _("{B_ATK_NAME_WITH_PREFIX} is\nimmobilized by love!");
+const u8 gText_PkmnBlownAway[] = _("{B_DEF_NAME_WITH_PREFIX} was\nblown away!");
+const u8 gText_PkmnChangedType[] = _("{B_ATK_NAME_WITH_PREFIX} transformed\ninto the {B_BUFF1} type!");
+const u8 gText_PkmnFlinched[] = _("{B_ATK_NAME_WITH_PREFIX} flinched!");
+const u8 gText_PkmnRegainedHealth[] = _("{B_DEF_NAME_WITH_PREFIX} regained\nhealth!");
+const u8 gText_PkmnHPFull[] = _("{B_DEF_NAME_WITH_PREFIX}’s\nHP is full!");
+const u8 gText_PkmnRaisedSpDef[] = _("{B_ATK_PREFIX2}’s {B_CURRENT_MOVE}\nraised SP. DEF!");
+const u8 gText_PkmnRaisedSpDefALittle[] = _("{B_ATK_PREFIX2}’s {B_CURRENT_MOVE}\nraised SP. DEF a little!");
+const u8 gText_PkmnRaisedDef[] = _("{B_ATK_PREFIX2}’s {B_CURRENT_MOVE}\nraised DEFENSE!");
+const u8 gText_PkmnRaisedDefALittle[] = _("{B_ATK_PREFIX2}’s {B_CURRENT_MOVE}\nraised DEFENSE a little!");
+const u8 gText_PkmnCoveredByVeil[] = _("{B_ATK_PREFIX2}’s party is covered\nby a veil!");
+const u8 gText_PkmnUsedSafeguard[] = _("{B_DEF_NAME_WITH_PREFIX}’s party is protected\nby SAFEGUARD!");
+const u8 gText_PkmnSafeguardExpired[] = _("{B_ATK_PREFIX3}’s party is no longer\nprotected by SAFEGUARD!");
+const u8 gText_PkmnWentToSleep[] = _("{B_ATK_NAME_WITH_PREFIX} went\nto sleep!");
+const u8 gText_PkmnSleptHealthy[] = _("{B_ATK_NAME_WITH_PREFIX} slept and\nbecame healthy!");
+const u8 gText_PkmnWhippedWhirlwind[] = _("{B_ATK_NAME_WITH_PREFIX} whipped\nup a whirlwind!");
+const u8 gText_PkmnTookSunlight[] = _("{B_ATK_NAME_WITH_PREFIX} took\nin sunlight!");
+const u8 gText_PkmnLoweredHead[] = _("{B_ATK_NAME_WITH_PREFIX} lowered\nits head!");
+const u8 gText_PkmnIsGlowing[] = _("{B_ATK_NAME_WITH_PREFIX} is glowing!");
+const u8 gText_PkmnFlewHigh[] = _("{B_ATK_NAME_WITH_PREFIX} flew\nup high!");
+const u8 gText_PkmnDugHole[] = _("{B_ATK_NAME_WITH_PREFIX} dug a hole!");
+const u8 gText_PkmnHidUnderwater[] = _("{B_ATK_NAME_WITH_PREFIX} hid\nunderwater!");
+const u8 gText_PkmnSprangUp[] = _("{B_ATK_NAME_WITH_PREFIX} sprang up!");
+const u8 gText_PkmnSqueezedByBind[] = _("{B_DEF_NAME_WITH_PREFIX} was squeezed by\n{B_ATK_NAME_WITH_PREFIX}’s BIND!");
+const u8 gText_PkmnTrappedInVortex[] = _("{B_DEF_NAME_WITH_PREFIX} was trapped\nin the vortex!");
+const u8 gText_PkmnTrappedBySandTomb[] = _("{B_DEF_NAME_WITH_PREFIX} was trapped\nby SAND TOMB!");
+const u8 gText_PkmnWrappedBy[] = _("{B_DEF_NAME_WITH_PREFIX} was WRAPPED by\n{B_ATK_NAME_WITH_PREFIX}!");
+const u8 gText_PkmnClamped[] = _("{B_ATK_NAME_WITH_PREFIX} CLAMPED\n{B_DEF_NAME_WITH_PREFIX}!");
+const u8 gText_PkmnHurtBy[] = _("{B_ATK_NAME_WITH_PREFIX} is hurt\nby {B_BUFF1}!");
+const u8 gText_PkmnFreedFrom[] = _("{B_ATK_NAME_WITH_PREFIX} was freed\nfrom {B_BUFF1}!");
+const u8 gText_PkmnCrashed[] = _("{B_ATK_NAME_WITH_PREFIX} kept going\nand crashed!");
+const u8 gText_PkmnShroudedInMist[] = _("{B_ATK_PREFIX2} became\nshrouded in MIST!");
+const u8 gText_PkmnProtectedByMist[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is protected\nby MIST!");
+const u8 gText_PkmnGettingPumped[] = _("{B_ATK_NAME_WITH_PREFIX} is getting\npumped!");
+const u8 gText_PkmnHitWithRecoil[] = _("{B_ATK_NAME_WITH_PREFIX} is hit\nwith recoil!");
+const u8 gText_PkmnProtectedItself2[] = _("{B_ATK_NAME_WITH_PREFIX} protected\nitself!");
+const u8 gText_PkmnBuffetedBySandstorm[] = _("{B_ATK_NAME_WITH_PREFIX} is buffeted\nby the sandstorm!");
+const u8 gText_PkmnPeltedByHail[] = _("{B_ATK_NAME_WITH_PREFIX} is pelted\nby HAIL!");
+const u8 gText_PkmnsXWoreOff[] = _("{B_ATK_PREFIX1}’s {B_BUFF1}\nwore off!");
+const u8 gText_PkmnSeeded[] = _("{B_DEF_NAME_WITH_PREFIX} was seeded!");
+const u8 gText_PkmnEvadedAttack[] = _("{B_DEF_NAME_WITH_PREFIX} evaded\nthe attack!");
+const u8 gText_PkmnSappedByLeechSeed[] = _("{B_ATK_NAME_WITH_PREFIX}’s health is\nsapped by LEECH SEED!");
+const u8 gText_PkmnFastAsleep[] = _("{B_ATK_NAME_WITH_PREFIX} is fast\nasleep.");
+const u8 gText_PkmnWokeUp[] = _("{B_ATK_NAME_WITH_PREFIX} woke up!");
+const u8 gText_PkmnUproarKeptAwake[] = _("But {B_SCR_ACTIVE_NAME_WITH_PREFIX}’s UPROAR\nkept it awake!");
+const u8 gText_PkmnWokeUpInUproar[] = _("{B_ATK_NAME_WITH_PREFIX} woke up\nin the UPROAR!");
+const u8 gText_PkmnCausedUproar[] = _("{B_ATK_NAME_WITH_PREFIX} caused\nan UPROAR!");
+const u8 gText_PkmnMakingUproar[] = _("{B_ATK_NAME_WITH_PREFIX} is making\nan UPROAR!");
+const u8 gText_PkmnCalmedDown[] = _("{B_ATK_NAME_WITH_PREFIX} calmed down.");
+const u8 gText_PkmnCantSleepInUproar[] = _("But {B_DEF_NAME_WITH_PREFIX} can’t\nsleep in an UPROAR!");
+const u8 gText_PkmnStockpiled[] = _("{B_ATK_NAME_WITH_PREFIX} STOCKPILED\n{B_BUFF1}!");
+const u8 gText_PkmnCantStockpile[] = _("{B_ATK_NAME_WITH_PREFIX} can’t\nSTOCKPILE any more!");
+const u8 gText_PkmnCantSleepInUproar2[] = _("But {B_DEF_NAME_WITH_PREFIX} can’t\nsleep in an UPROAR!");
+const u8 gText_UproarKeptPkmnAwake[] = _("But the UPROAR kept\n{B_DEF_NAME_WITH_PREFIX} awake!");
+const u8 gText_PkmnStayedAwakeUsing[] = _("{B_DEF_NAME_WITH_PREFIX} stayed awake\nusing its {B_DEF_ABILITY}!");
+const u8 gText_PkmnStoringEnergy[] = _("{B_ATK_NAME_WITH_PREFIX} is storing\nenergy!");
+const u8 gText_PkmnUnleashedEnergy[] = _("{B_ATK_NAME_WITH_PREFIX} unleashed\nenergy!");
+const u8 gText_PkmnFatigueConfusion[] = _("{B_ATK_NAME_WITH_PREFIX} became\nconfused due to fatigue!");
+const u8 gText_PkmnPickedUpItem[] = _("{B_PLAYER_NAME} picked up\n¥{B_BUFF1}!\p");
+const u8 gText_PkmnUnaffected[] = _("{B_DEF_NAME_WITH_PREFIX} is\nunaffected!");
+const u8 gText_PkmnTransformedInto[] = _("{B_ATK_NAME_WITH_PREFIX} transformed\ninto {B_BUFF1}!");
+const u8 gText_PkmnMadeSubstitute[] = _("{B_ATK_NAME_WITH_PREFIX} made\na SUBSTITUTE!");
+const u8 gText_PkmnHasSubstitute[] = _("{B_ATK_NAME_WITH_PREFIX} already\nhas a SUBSTITUTE!");
+const u8 gText_SubstituteDamaged[] = _("The SUBSTITUTE took damage\nfor {B_DEF_NAME_WITH_PREFIX}!\p");
+const u8 gText_PkmnSubstituteFaded[] = _("{B_DEF_NAME_WITH_PREFIX}’s\nSUBSTITUTE faded!\p");
+const u8 gText_PkmnMustRecharge[] = _("{B_ATK_NAME_WITH_PREFIX} must\nrecharge!");
+const u8 gText_PkmnRageBuilding[] = _("{B_DEF_NAME_WITH_PREFIX}’s RAGE\nis building!");
+const u8 gText_PkmnMoveWasDisabled[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_BUFF1}\nwas disabled!");
+const u8 gText_PkmnMoveDisabledNoMore[] = _("{B_ATK_NAME_WITH_PREFIX} is disabled\nno more!");
+const u8 gText_PkmnGotEncore[] = _("{B_DEF_NAME_WITH_PREFIX} got\nan ENCORE!");
+const u8 gText_PkmnEncoreEnded[] = _("{B_ATK_NAME_WITH_PREFIX}’s ENCORE\nended!");
+const u8 gText_PkmnTookAim[] = _("{B_ATK_NAME_WITH_PREFIX} took aim\nat {B_DEF_NAME_WITH_PREFIX}!");
+const u8 gText_PkmnSketchedMove[] = _("{B_ATK_NAME_WITH_PREFIX} SKETCHED\n{B_BUFF1}!");
+const u8 gText_PkmnTryingToTakeFoe[] = _("{B_ATK_NAME_WITH_PREFIX} is trying\nto take its foe with it!");
+const u8 gText_PkmnTookFoe[] = _("{B_DEF_NAME_WITH_PREFIX} took\n{B_ATK_NAME_WITH_PREFIX} with it!");
+const u8 gText_PkmnReducedPP[] = _("Reduced {B_DEF_NAME_WITH_PREFIX}’s\n{B_BUFF1} by {B_BUFF2}!");
+const u8 gText_PkmnStoleItem[] = _("{B_ATK_NAME_WITH_PREFIX} stole\n{B_DEF_NAME_WITH_PREFIX}’s {B_LAST_ITEM}!");
+const u8 gText_TargetCantEscapeNow[] = _("{B_DEF_NAME_WITH_PREFIX} can’t\nescape now!");
+const u8 gText_PkmnFellIntoNightmare[] = _("{B_DEF_NAME_WITH_PREFIX} fell into\na NIGHTMARE!");
+const u8 gText_PkmnLockedInNightmare[] = _("{B_ATK_NAME_WITH_PREFIX} is locked\nin a NIGHTMARE!");
+const u8 gText_PkmnLaidCurse[] = _("{B_ATK_NAME_WITH_PREFIX} cut its own HP and\nlaid a CURSE on {B_DEF_NAME_WITH_PREFIX}!");
+const u8 gText_PkmnAfflictedByCurse[] = _("{B_ATK_NAME_WITH_PREFIX} is afflicted\nby the CURSE!");
+const u8 gText_SpikesScattered[] = _("SPIKES were scattered all around\nthe opponent’s side!");
+const u8 gText_PkmnHurtBySpikes[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is hurt\nby SPIKES!");
+const u8 gText_PkmnIdentified[] = _("{B_ATK_NAME_WITH_PREFIX} identified\n{B_DEF_NAME_WITH_PREFIX}!");
+const u8 gText_PkmnPerishCountFell[] = _("{B_ATK_NAME_WITH_PREFIX}’s PERISH count\nfell to {B_BUFF1}!");
+const u8 gText_PkmnBracedItself[] = _("{B_ATK_NAME_WITH_PREFIX} braced\nitself!");
+const u8 gText_PkmnEnduredHit[] = _("{B_DEF_NAME_WITH_PREFIX} ENDURED\nthe hit!");
+const u8 gText_MagnitudeStrength[] = _("MAGNITUDE {B_BUFF1}!");
+const u8 gText_PkmnCutHPMaxedAttack[] = _("{B_ATK_NAME_WITH_PREFIX} cut its own HP\nand maximized ATTACK!");
+const u8 gText_PkmnCopiedStatChanges[] = _("{B_ATK_NAME_WITH_PREFIX} copied\n{B_DEF_NAME_WITH_PREFIX}’s stat changes!");
+const u8 gText_PkmnGotFree[] = _("{B_ATK_NAME_WITH_PREFIX} got free of\n{B_DEF_NAME_WITH_PREFIX}’s {B_BUFF1}!");
+const u8 gText_PkmnShedLeechSeed[] = _("{B_ATK_NAME_WITH_PREFIX} shed\nLEECH SEED!");
+const u8 gText_PkmnBlewAwaySpikes[] = _("{B_ATK_NAME_WITH_PREFIX} blew away\nSPIKES!");
+const u8 gText_PkmnFledFromBattle[] = _("{B_ATK_NAME_WITH_PREFIX} fled from\nbattle!");
+const u8 gText_PkmnForesawAttack[] = _("{B_ATK_NAME_WITH_PREFIX} foresaw\nan attack!");
+const u8 gText_PkmnTookAttack[] = _("{B_DEF_NAME_WITH_PREFIX} took the\n{B_BUFF1} attack!");
+const u8 gText_PkmnChoseXAsDestiny[] = _("{B_ATK_NAME_WITH_PREFIX} chose\n{B_CURRENT_MOVE} as its destiny!");
+const u8 gText_PkmnAttack[] = _("{B_BUFF1}’s attack!");
+const u8 gText_PkmnCenterAttention[] = _("{B_ATK_NAME_WITH_PREFIX} became the\ncenter of attention!");
+const u8 gText_PkmnChargingPower[] = _("{B_ATK_NAME_WITH_PREFIX} began\ncharging power!");
+const u8 gText_NaturePowerTurnedInto[] = _("NATURE POWER turned into\n{B_CURRENT_MOVE}!");
+const u8 gText_PkmnStatusNormal[] = _("{B_ATK_NAME_WITH_PREFIX}’s status\nreturned to normal!");
+const u8 gText_PkmnSubjectedToTorment[] = _("{B_DEF_NAME_WITH_PREFIX} was subjected\nto TORMENT!");
+const u8 gText_PkmnTighteningFocus[] = _("{B_ATK_NAME_WITH_PREFIX} is tightening\nits focus!");
+const u8 gText_PkmnFellForTaunt[] = _("{B_DEF_NAME_WITH_PREFIX} fell for\nthe TAUNT!");
+const u8 gText_PkmnReadyToHelp[] = _("{B_ATK_NAME_WITH_PREFIX} is ready to\nhelp {B_DEF_NAME_WITH_PREFIX}!");
+const u8 gText_PkmnSwitchedItems[] = _("{B_ATK_NAME_WITH_PREFIX} switched\nitems with its opponent!");
+const u8 gText_PkmnObtainedX[] = _("{B_ATK_NAME_WITH_PREFIX} obtained\n{B_BUFF1}.");
+const u8 gText_PkmnObtainedX2[] = _("{B_DEF_NAME_WITH_PREFIX} obtained\n{B_BUFF2}.");
+const u8 gText_PkmnObtainedXYObtainedZ[] = _("{B_ATK_NAME_WITH_PREFIX} obtained\n{B_BUFF1}.\p{B_DEF_NAME_WITH_PREFIX} obtained\n{B_BUFF2}.");
+const u8 gText_PkmnCopiedFoe[] = _("{B_ATK_NAME_WITH_PREFIX} copied\n{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}!");
+const u8 gText_PkmnMadeWish[] = _("{B_ATK_NAME_WITH_PREFIX} made a WISH!");
+const u8 gText_PkmnWishCameTrue[] = _("{B_BUFF1}’s WISH\ncame true!");
+const u8 gText_PkmnPlantedRoots[] = _("{B_ATK_NAME_WITH_PREFIX} planted its roots!");
+const u8 gText_PkmnAbsorbedNutrients[] = _("{B_ATK_NAME_WITH_PREFIX} absorbed\nnutrients with its roots!");
+const u8 gText_PkmnAnchoredItself[] = _("{B_DEF_NAME_WITH_PREFIX} anchored\nitself with its roots!");
+const u8 gText_PkmnWasMadeDrowsy[] = _("{B_ATK_NAME_WITH_PREFIX} made\n{B_DEF_NAME_WITH_PREFIX} drowsy!");
+const u8 gText_PkmnKnockedOff[] = _("{B_ATK_NAME_WITH_PREFIX} knocked off\n{B_DEF_NAME_WITH_PREFIX}’s {B_LAST_ITEM}!");
+const u8 gText_PkmnSwappedAbilities[] = _("{B_ATK_NAME_WITH_PREFIX} swapped abilities\nwith its opponent!");
+const u8 gText_PkmnSealedOpponentMove[] = _("{B_ATK_NAME_WITH_PREFIX} sealed the\nopponent’s move(s)!");
+const u8 gText_PkmnWantsGrudge[] = _("{B_ATK_NAME_WITH_PREFIX} wants the\nopponent to bear a GRUDGE!");
+const u8 gText_PkmnLostPPGrudge[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_BUFF1} lost\nall its PP due to the GRUDGE!");
+const u8 gText_PkmnShroudedItself[] = _("{B_ATK_NAME_WITH_PREFIX} shrouded\nitself in {B_CURRENT_MOVE}!");
+const u8 gText_PkmnMoveBounced[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_CURRENT_MOVE}\nwas bounced back by MAGIC COAT!");
+const u8 gText_PkmnWaitsForTarget[] = _("{B_ATK_NAME_WITH_PREFIX} waits for a target\nto make a move!");
+const u8 gText_PkmnSnatchedMove[] = _("{B_DEF_NAME_WITH_PREFIX} SNATCHED\n{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s move!");
+const u8 gText_ElectricityWeakened[] = _("Electricity’s power was\nweakened!");
+const u8 gText_FireWeakened[] = _("Fire’s power was\nweakened!");
+const u8 gText_XFoundOneY[] = _("{B_ATK_NAME_WITH_PREFIX} found\none {B_LAST_ITEM}!");
+const u8 gText_SoothingAroma[] = _("A soothing aroma wafted\nthrough the area!");
+const u8 gText_ItemsCantBeUsedNow[] = _("Items can’t be used now.{PAUSE 64}");
+const u8 gText_ForXCommaYZ[] = _("For {B_SCR_ACTIVE_NAME_WITH_PREFIX},\n{B_LAST_ITEM} {B_BUFF1}");
+const u8 gText_PkmnUsedXToGetPumped[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} used\n{B_LAST_ITEM} to get pumped!");
+const u8 gText_PkmnLostFocus[] = _("{B_ATK_NAME_WITH_PREFIX} lost its\nfocus and couldn’t move!");
+const u8 gText_PkmnWasDraggedOut[] = _("{B_DEF_NAME_WITH_PREFIX} was\ndragged out!\p");
+const u8 gText_TheWallShattered[] = _("The wall shattered!");
+const u8 gText_ButNoEffect[] = _("But it had no effect!");
+const u8 gText_PkmnHasNoMovesLeft[] = _("{B_ACTIVE_NAME_WITH_PREFIX} has no\nmoves left!\p");
+const u8 gText_PkmnMoveIsDisabled[] = _("{B_ACTIVE_NAME_WITH_PREFIX}’s {B_CURRENT_MOVE}\nis disabled!\p");
+const u8 gText_PkmnCantUseMoveTorment[] = _("{B_ACTIVE_NAME_WITH_PREFIX} can’t use the same\nmove in a row due to the TORMENT!\p");
+const u8 gText_PkmnCantUseMoveTaunt[] = _("{B_ACTIVE_NAME_WITH_PREFIX} can’t use\n{B_CURRENT_MOVE} after the TAUNT!\p");
+const u8 gText_PkmnCantUseMoveSealed[] = _("{B_ACTIVE_NAME_WITH_PREFIX} can’t use the\nsealed {B_CURRENT_MOVE}!\p");
+const u8 gText_PkmnMadeItRain[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nmade it rain!");
+const u8 gText_PkmnRaisedSpeed[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nraised its SPEED!");
+const u8 gText_PkmnProtectedBy[] = _("{B_DEF_NAME_WITH_PREFIX} was protected\nby {B_DEF_ABILITY}!");
+const u8 gText_PkmnPreventsUsage[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nprevents {B_ATK_NAME_WITH_PREFIX}\lfrom using {B_CURRENT_MOVE}!");
+const u8 gText_PkmnRestoredHPUsing[] = _("{B_DEF_NAME_WITH_PREFIX} restored HP\nusing its {B_DEF_ABILITY}!");
+const u8 gText_PkmnsXMadeYUseless[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nmade {B_CURRENT_MOVE} useless!");
+const u8 gText_PkmnChangedTypeWith[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nmade it the {B_BUFF1} type!");
+const u8 gText_PkmnPreventsParalysisWith[] = _("{B_EFF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nprevents paralysis!");
+const u8 gText_PkmnPreventsRomanceWith[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nprevents romance!");
+const u8 gText_PkmnPreventsPoisoningWith[] = _("{B_EFF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nprevents poisoning!");
+const u8 gText_PkmnPreventsConfusionWith[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nprevents confusion!");
+const u8 gText_PkmnRaisedFirePowerWith[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nraised its FIRE power!");
+const u8 gText_PkmnAnchorsItselfWith[] = _("{B_DEF_NAME_WITH_PREFIX} anchors\nitself with {B_DEF_ABILITY}!");
+const u8 gText_PkmnCutsAttackWith[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\ncuts {B_DEF_NAME_WITH_PREFIX}’s ATTACK!");
+const u8 gText_PkmnPreventsStatLossWith[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nprevents stat loss!");
+const u8 gText_PkmnHurtsWith[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nhurt {B_ATK_NAME_WITH_PREFIX}!");
+const u8 gText_PkmnTraced[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} TRACED\n{B_BUFF1}’s {B_BUFF2}!");
+const u8 gText_PkmnsXPreventsBurns[] = _("{B_EFF_NAME_WITH_PREFIX}’s {B_EFF_ABILITY}\nprevents burns!");
+const u8 gText_PkmnsXBlocksY[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nblocks {B_CURRENT_MOVE}!");
+const u8 gText_PkmnsXBlocksY2[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nblocks {B_CURRENT_MOVE}!");
+const u8 gText_PkmnsXRestoredHPALittle2[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_ATK_ABILITY}\nrestored its HP a little!");
+const u8 gText_PkmnsXWhippedUpSandstorm[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nwhipped up a sandstorm!");
+const u8 gText_PkmnsXIntensifiedSun[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nintensified the sun’s rays!");
+const u8 gText_PkmnsXPreventsYLoss[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nprevents {B_BUFF1} loss!");
+const u8 gText_PkmnsXInfatuatedY[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\ninfatuated {B_ATK_NAME_WITH_PREFIX}!");
+const u8 gText_PkmnsXMadeYIneffective[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nmade {B_CURRENT_MOVE} ineffective!");
+const u8 gText_PkmnsXCuredYProblem[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\ncured its {B_BUFF1} problem!");
+const u8 gText_ItSuckedLiquidOoze[] = _("It sucked up the\nLIQUID OOZE!");
+const u8 gText_PkmnTransformed[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} transformed!");
+const u8 gText_PkmnsXTookAttack[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\ntook the attack!");
+const u8 gText_PkmnsXPreventsSwitching[] = _("{B_BUFF1}’s {B_LAST_ABILITY}\nprevents switching!\p");
+const u8 gText_PreventedFromWorking[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_DEF_ABILITY}\nprevented {B_SCR_ACTIVE_NAME_WITH_PREFIX}’s\l{B_BUFF1} from working!");
+const u8 gText_PkmnsXMadeItIneffective[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nmade it ineffective!");
+const u8 gText_PkmnsXPreventsFlinching[] = _("{B_EFF_NAME_WITH_PREFIX}’s {B_EFF_ABILITY}\nprevents flinching!");
+const u8 gText_PkmnsXPreventsYsZ[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_ATK_ABILITY}\nprevents {B_DEF_NAME_WITH_PREFIX}’s\l{B_DEF_ABILITY} from working!");
+const u8 gText_PkmnsXCuredItsYProblem[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\ncured its {B_BUFF1} problem!");
+const u8 gText_PkmnsXHadNoEffectOnY[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_SCR_ACTIVE_ABILITY}\nhad no effect on {B_EFF_NAME_WITH_PREFIX}!");
+const u8 gText_StatSharply[] = _("sharply ");
+const u8 gText_StatRose[] = _("rose!");
+const u8 gText_StatHarshly[] = _("harshly ");
+const u8 gText_StatFell[] = _("fell!");
+const u8 gText_PkmnsStatChanged[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_BUFF1}\n{B_BUFF2}");
+const u8 gText_PkmnsStatChanged2[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_BUFF1}\n{B_BUFF2}");
+const u8 gText_UsingXTheYOfZN[] = _("Using {B_LAST_ITEM}, the {B_BUFF1}\nof {B_SCR_ACTIVE_NAME_WITH_PREFIX} {B_BUFF2}");
+const u8 gText_PkmnsStatChanged3[] = _("{B_ATK_NAME_WITH_PREFIX}’s {B_BUFF1}\n{B_BUFF2}");
+const u8 gText_PkmnsStatChanged4[] = _("{B_DEF_NAME_WITH_PREFIX}’s {B_BUFF1}\n{B_BUFF2}");
+const u8 gText_StatsWontIncrease2[] = _("{B_ATK_NAME_WITH_PREFIX}’s stats won’t\ngo any higher!");
+const u8 gText_StatsWontDecrease2[] = _("{B_DEF_NAME_WITH_PREFIX}’s stats won’t\ngo any lower!");
+const u8 gText_CriticalHit[] = _("A critical hit!");
+const u8 gText_OneHitKO[] = _("It’s a one-hit KO!");
+const u8 gText_123Poof[] = _("{PAUSE 32}1, {PAUSE 15}2, and{PAUSE 15}… {PAUSE 15}… {PAUSE 15}… {PAUSE 15}{PLAY_SE 0x0038}Poof!\p");
+const u8 gText_AndEllipsis[] = _("And…\p");
+const u8 gText_HMMovesCantBeForgotten[] = _("HM moves can’t be\nforgotten now.\p");
+const u8 gText_NotVeryEffective[] = _("It’s not very effective…");
+const u8 gText_SuperEffective[] = _("It’s super effective!");
+const u8 gText_GotAwaySafely[] = _("{PLAY_SE 0x0011}Got away safely!\p");
+const u8 gText_PkmnFledUsingIts[] = _("{PLAY_SE 0x0011}{B_ATK_NAME_WITH_PREFIX} fled\nusing its {B_LAST_ITEM}!\p");
+const u8 gText_PkmnFledUsing[] = _("{PLAY_SE 0x0011}{B_ATK_NAME_WITH_PREFIX} fled\nusing {B_ATK_ABILITY}!\p");
+const u8 gText_WildPkmnFled[] = _("{PLAY_SE 0x0011}Wild {B_BUFF1} fled!");
+const u8 gText_PlayerDefeatedLinkTrainer[] = _("Player defeated\n{B_20}!");
+const u8 gText_TwoLinkTrainersDefeated[] = _("Player beat {B_20}\nand {B_21}!");
+const u8 gText_PlayerLostAgainstLinkTrainer[] = _("Player lost against\n{B_20}!");
+const u8 gText_PlayerLostToTwo[] = _("Player lost to {B_20}\nand {B_21}!");
+const u8 gText_PlayerBattledToDrawLinkTrainer[] = _("Player battled to a draw against\n{B_20}!");
+const u8 gText_PlayerBattledToDrawVsTwo[] = _("Player battled to a draw against\n{B_20} and {B_21}!");
+const u8 gText_WildFled[] = _("{PLAY_SE 0x0011}{B_20} fled!");
+const u8 gText_TwoWildFled[] = _("{PLAY_SE 0x0011}{B_20} and\n{B_21} fled!");
+const u8 gText_NoRunningFromTrainers[] = _("No! There’s no running\nfrom a TRAINER battle!\p");
+const u8 gText_CantEscape[] = _("Can’t escape!\p");
+const u8 gText_DontLeaveBirch[] = _("PROF. BIRCH: Don’t leave me like this!\p");
+const u8 gText_ButNothingHappened[] = _("But nothing happened!");
+const u8 gText_ButItFailed[] = _("But it failed!");
+const u8 gText_ItHurtConfusion[] = _("It hurt itself in its\nconfusion!");
+const u8 gText_MirrorMoveFailed[] = _("The MIRROR MOVE failed!");
+const u8 gText_StartedToRain[] = _("It started to rain!");
+const u8 gText_DownpourStarted[] = _("A downpour started!");
+const u8 gText_RainContinues[] = _("Rain continues to fall.");
+const u8 gText_DownpourContinues[] = _("The downpour continues.");
+const u8 gText_RainStopped[] = _("The rain stopped.");
+const u8 gText_SandstormBrewed[] = _("A sandstorm brewed!");
+const u8 gText_SandstormRages[] = _("The sandstorm rages.");
+const u8 gText_SandstormSubsided[] = _("The sandstorm subsided.");
+const u8 gText_SunlightGotBright[] = _("The sunlight got bright!");
+const u8 gText_SunlightStrong[] = _("The sunlight is strong.");
+const u8 gText_SunlightFaded[] = _("The sunlight faded.");
+const u8 gText_StartedHail[] = _("It started to hail!");
+const u8 gText_HailContinues[] = _("Hail continues to fall.");
+const u8 gText_HailStopped[] = _("The hail stopped.");
+const u8 gText_FailedToSpitUp[] = _("But it failed to SPIT UP\na thing!");
+const u8 gText_FailedToSwallow[] = _("But it failed to SWALLOW\na thing!");
+const u8 gText_WindBecameHeatWave[] = _("The wind turned into a\nHEAT WAVE!");
+const u8 gText_StatChangesGone[] = _("All stat changes were\neliminated!");
+const u8 gText_CoinsScattered[] = _("Coins scattered everywhere!");
+const u8 gText_TooWeakForSubstitute[] = _("It was too weak to make\na SUBSTITUTE!");
+const u8 gText_SharedPain[] = _("The battlers shared\ntheir pain!");
+const u8 gText_BellChimed[] = _("A bell chimed!");
+const u8 gText_FaintInThree[] = _("All affected POKéMON will\nfaint in three turns!");
+const u8 gText_NoPPLeft[] = _("There’s no PP left for\nthis move!\p");
+const u8 gText_ButNoPPLeft[] = _("But there was no PP left\nfor the move!");
+const u8 gText_PkmnIgnoresAsleep[] = _("{B_ATK_NAME_WITH_PREFIX} ignored\norders while asleep!");
+const u8 gText_PkmnIgnoredOrders[] = _("{B_ATK_NAME_WITH_PREFIX} ignored\norders!");
+const u8 gText_PkmnBeganToNap[] = _("{B_ATK_NAME_WITH_PREFIX} began to nap!");
+const u8 gText_PkmnLoafing[] = _("{B_ATK_NAME_WITH_PREFIX} is\nloafing around!");
+const u8 gText_PkmnWontObey[] = _("{B_ATK_NAME_WITH_PREFIX} won’t\nobey!");
+const u8 gText_PkmnTurnedAway[] = _("{B_ATK_NAME_WITH_PREFIX} turned away!");
+const u8 gText_PkmnPretendNotNotice[] = _("{B_ATK_NAME_WITH_PREFIX} pretended\nnot to notice!");
+const u8 gText_EnemyAboutToSwitchPkmn[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME} is\nabout to use {B_BUFF2}.\pWill {B_PLAYER_NAME} change\nPOKéMON?");
+const u8 gText_PkmnLearnedMove2[] = _("{B_ATK_NAME_WITH_PREFIX} learned\n{B_BUFF1}!");
+const u8 gText_PlayerDefeatedLinkTrainerTrainer1[] = _("Player defeated\n{B_TRAINER1_CLASS} {B_TRAINER1_NAME}!\p");
+const u8 gText_CreptCloser[] = _("{B_PLAYER_NAME} crept closer to\n{B_OPPONENT_MON1_NAME}!");
+const u8 gText_CantGetCloser[] = _("{B_PLAYER_NAME} can’t get any closer!");
+const u8 gText_PkmnWatchingCarefully[] = _("{B_OPPONENT_MON1_NAME} is watching\ncarefully!");
+const u8 gText_PkmnCuriousAboutX[] = _("{B_OPPONENT_MON1_NAME} is curious about\nthe {B_BUFF1}!");
+const u8 gText_PkmnEnthralledByX[] = _("{B_OPPONENT_MON1_NAME} is enthralled by\nthe {B_BUFF1}!");
+const u8 gText_PkmnIgnoredX[] = _("{B_OPPONENT_MON1_NAME} completely ignored\nthe {B_BUFF1}!");
+const u8 gText_ThrewPokeblockAtPkmn[] = _("{B_PLAYER_NAME} threw a {POKEBLOCK}\nat the {B_OPPONENT_MON1_NAME}!");
+const u8 gText_OutOfSafariBalls[] = _("{PLAY_SE 0x0049}ANNOUNCER: You’re out of\nSAFARI BALLS! Game over!\p");
+const u8 gText_OpponentMon1Appeared[] = _("{B_OPPONENT_MON1_NAME} appeared!\p");
+const u8 gText_WildPkmnAppeared[] = _("Wild {B_OPPONENT_MON1_NAME} appeared!\p");
+const u8 gText_WildPkmnAppeared2[] = _("Wild {B_OPPONENT_MON1_NAME} appeared!\p");
+const u8 gText_WildPkmnAppearedPause[] = _("Wild {B_OPPONENT_MON1_NAME} appeared!{PAUSE 127}");
+const u8 gText_TwoWildPkmnAppeared[] = _("Wild {B_OPPONENT_MON1_NAME} and\n{B_OPPONENT_MON2_NAME} appeared!\p");
+const u8 gText_Trainer1WantsToBattle[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME}\nwould like to battle!\p");
+const u8 gText_LinkTrainerWantsToBattle[] = _("{B_20}\nwants to battle!");
+const u8 gText_TwoLinkTrainersWantToBattle[] = _("{B_20} and {B_21}\nwant to battle!");
+const u8 gText_Trainer1SentOutPkmn[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME} sent\nout {B_OPPONENT_MON1_NAME}!");
+const u8 gText_Trainer1SentOutTwoPkmn[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME} sent\nout {B_OPPONENT_MON1_NAME} and {B_OPPONENT_MON2_NAME}!");
+const u8 gText_Trainer1SentOutPkmn2[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME} sent\nout {B_BUFF1}!");
+const u8 gText_LinkTrainerSentOutPkmn[] = _("{B_20} sent out\n{B_OPPONENT_MON1_NAME}!");
+const u8 gText_LinkTrainerSentOutTwoPkmn[] = _("{B_20} sent out\n{B_OPPONENT_MON1_NAME} and {B_OPPONENT_MON2_NAME}!");
+const u8 gText_TwoLinkTrainersSentOutPkmn[] = _("{B_20} sent out {B_LINK_OPPONENT_MON1_NAME}!\n{B_21} sent out {B_LINK_OPPONENT_MON2_NAME}!");
+const u8 gText_LinkTrainerSentOutPkmn2[] = _("{B_20} sent out\n{B_BUFF1}!");
+const u8 gText_LinkTrainerMultiSentOutPkmn[] = _("{B_22} sent out\n{B_BUFF1}!");
+const u8 gText_GoPkmn[] = _("Go! {B_PLAYER_MON1_NAME}!");
+const u8 gText_GoTwoPkmn[] = _("Go! {B_PLAYER_MON1_NAME} and\n{B_PLAYER_MON2_NAME}!");
+const u8 gText_GoPkmn2[] = _("Go! {B_BUFF1}!");
+const u8 gText_DoItPkmn[] = _("Do it! {B_BUFF1}!");
+const u8 gText_GoForItPkmn[] = _("Go for it, {B_BUFF1}!");
+const u8 gText_YourFoesWeakGetEmPkmn[] = _("Your foe’s weak!\nGet ’em, {B_BUFF1}!");
+const u8 gText_LinkPartnerSentOutPkmnGoPkmn[] = _("{B_1F} sent out {B_LINK_PLAYER_MON2_NAME}!\nGo! {B_LINK_PLAYER_MON1_NAME}!");
+const u8 gText_PkmnThatsEnough[] = _("{B_BUFF1}, that’s enough!\nCome back!");
+const u8 gText_PkmnComeBack[] = _("{B_BUFF1}, come back!");
+const u8 gText_PkmnOkComeBack[] = _("{B_BUFF1}, OK!\nCome back!");
+const u8 gText_PkmnGoodComeBack[] = _("{B_BUFF1}, good!\nCome back!");
+const u8 gText_Trainer1WithdrewPkmn[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME}\nwithdrew {B_BUFF1}!");
+const u8 gText_LinkTrainer1WithdrewPkmn[] = _("{B_20} withdrew\n{B_BUFF1}!");
+const u8 gText_LinkTrainer2WithdrewPkmn[] = _("{B_22} withdrew\n{B_BUFF1}!");
+const u8 gText_WildPkmnPrefix[] = _("Wild ");
+const u8 gText_FoePkmnPrefix[] = _("Foe ");
+const u8 gText_EmptyString8[] = _( "");
+const u8 gText_FoePkmnPrefix2[] = _("Foe");
+const u8 gText_AllyPkmnPrefix[] = _("Ally");
+const u8 gText_FoePkmnPrefix3[] = _("Foe");
+const u8 gText_AllyPkmnPrefix2[] = _("Ally");
+const u8 gText_FoePkmnPrefix4[] = _("Foe");
+const u8 gText_AllyPkmnPrefix3[] = _("Ally");
+const u8 gText_AttackerUsedX[] = _("{B_ATK_NAME_WITH_PREFIX} used\n{B_BUFF2}");
+const u8 gText_ExclamationMark[] = _("!");
+const u8 gText_ExclamationMark2[] = _("!");
+const u8 gText_ExclamationMark3[] = _("!");
+const u8 gText_ExclamationMark4[] = _("!");
+const u8 gText_ExclamationMark5[] = _("!");
+const u8 gText_HP2[] = _("HP");
+const u8 gText_Attack2[] = _("ATTACK");
+const u8 gText_Defense2[] = _("DEFENSE");
+const u8 gText_Speed[] = _("SPEED");
+const u8 gText_SpAtk2[] = _("SP. ATK");
+const u8 gText_SpDef2[] = _("SP. DEF");
+const u8 gText_Accuracy[] = _("accuracy");
+const u8 gText_Evasiveness[] = _("evasiveness");
+
+const u8 * const gStatNamesTable[] =
+{
+ gText_HP2, gText_Attack2, gText_Defense2,
+ gText_Speed, gText_SpAtk2, gText_SpDef2,
+ gText_Accuracy, gText_Evasiveness
+};
+
+const u8 gText_PokeblockWasTooSpicy[] = _("was too spicy!");
+const u8 gText_PokeblockWasTooDry[] = _("was too dry!");
+const u8 gText_PokeblockWasTooSweet[] = _("was too sweet!");
+const u8 gText_PokeblockWasTooBitter[] = _("was too bitter!");
+const u8 gText_PokeblockWasTooSour[] = _("was too sour!");
+
+const u8 * const gPokeblockWasTooXStringTable[] =
+{
+ gText_PokeblockWasTooSpicy, gText_PokeblockWasTooDry,
+ gText_PokeblockWasTooSweet, gText_PokeblockWasTooBitter,
+ gText_PokeblockWasTooSour
+};
+
+const u8 gText_PlayerUsedItem[] = _("{B_PLAYER_NAME} used\n{B_LAST_ITEM}!");
+const u8 gText_WallyUsedItem[] = _("WALLY used\n{B_LAST_ITEM}!");
+const u8 gText_Trainer1UsedItem[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME}\nused {B_LAST_ITEM}!");
+const u8 gText_TrainerBlockedBall[] = _("The TRAINER blocked the BALL!");
+const u8 gText_DontBeAThief[] = _("Don’t be a thief!");
+const u8 gText_ItDodgedBall[] = _("It dodged the thrown BALL!\nThis POKéMON can’t be caught!");
+const u8 gText_YouMissedPkmn[] = _("You missed the POKéMON!");
+const u8 gText_PkmnBrokeFree[] = _("Oh, no!\nThe POKéMON broke free!");
+const u8 gText_ItAppearedCaught[] = _("Aww!\nIt appeared to be caught!");
+const u8 gText_AarghAlmostHadIt[] = _("Aargh!\nAlmost had it!");
+const u8 gText_ShootSoClose[] = _("Shoot!\nIt was so close, too!");
+const u8 gText_GotchaPkmnCaught[] = _("Gotcha!\n{B_OPPONENT_MON1_NAME} was caught!{UNKNOWN_A}{PLAY_BGM BGM_KACHI22}\p");
+const u8 gText_GotchaPkmnCaught2[] = _("Gotcha!\n{B_OPPONENT_MON1_NAME} was caught!{UNKNOWN_A}{PLAY_BGM BGM_KACHI22}{PAUSE 127}");
+const u8 gText_GiveNicknameCaptured[] = _("Give a nickname to the\ncaptured {B_OPPONENT_MON1_NAME}?");
+const u8 gText_PkmnSentToPC[] = _("{B_OPPONENT_MON1_NAME} was sent to\n{B_PC_CREATOR_NAME} PC.");
+const u8 gText_Someones[] = _("someone’s");
+const u8 gText_Lanettes[] = _("LANETTE’s");
+const u8 gText_PkmnDataAddedToDex[] = _("{B_OPPONENT_MON1_NAME}’s data was\nadded to the POKéDEX.\p");
+const u8 gText_ItIsRaining[] = _("It is raining.");
+const u8 gText_SandstormIsRaging[] = _("A sandstorm is raging.");
+const u8 gText_BoxIsFull[] = _("The BOX is full!\nYou can’t catch any more!\p");
+const u8 gText_EnigmaBerry[] = _("ENIGMA BERRY");
+const u8 gText_BerrySuffix[] = _(" BERRY");
+const u8 gText_PkmnsItemCuredParalysis[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\ncured paralysis!");
+const u8 gText_PkmnsItemCuredPoison[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\ncured poison!");
+const u8 gText_PkmnsItemHealedBurn[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\nhealed its burn!");
+const u8 gText_PkmnsItemDefrostedIt[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\ndefrosted it!");
+const u8 gText_PkmnsItemWokeIt[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\nwoke it from its sleep!");
+const u8 gText_PkmnsItemSnappedOut[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\nsnapped it out of confusion!");
+const u8 gText_PkmnsItemCuredProblem[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\ncured its {B_BUFF1} problem!");
+const u8 gText_PkmnsItemNormalizedStatus[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\nnormalized its status!");
+const u8 gText_PkmnsItemRestoredHealth[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\nrestored health!");
+const u8 gText_PkmnsItemRestoredPP[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\nrestored {B_BUFF1}’s PP!");
+const u8 gText_PkmnsItemRestoredStatus[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\nrestored its status!");
+const u8 gText_PkmnsItemRestoredHPALittle[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s {B_LAST_ITEM}\nrestored its HP a little!");
+const u8 gText_ItemAllowsOnlyYMove[] = _("{B_LAST_ITEM} allows the\nuse of only {B_CURRENT_MOVE}!\p");
+const u8 gText_PkmnHungOnWithX[] = _("{B_DEF_NAME_WITH_PREFIX} hung on\nusing its {B_LAST_ITEM}!");
+const u8 gText_EmptyString3[] = _("");
+const u8 gText_YouThrowABallNowRight[] = _("You throw a BALL now, right?\nI… I’ll do my best!");
+
+// early declaration of strings
+const u8 gText_PkmnIncapableOfPower[];
+const u8 gText_GlintAppearsInEye[];
+const u8 gText_PkmnGettingIntoPosition[];
+const u8 gText_PkmnBeganGrowlingDeeply[];
+const u8 gText_PkmnEagerForMore[];
+const u8 gText_DefeatedOpponentByReferee[];
+const u8 gText_LostToOpponentByReferee[];
+const u8 gText_TiedOpponentByReferee[];
+const u8 gText_QuestionForfeitMatch[];
+const u8 gText_ForfeitedMatch[];
+const u8 gText_Trainer1WinText[];
+const u8 gText_Trainer2WinText[];
+const u8 gText_TwoInGameTrainersDefeated[];
+const u8 gText_Trainer2LoseText[];
+
+const u8 * const gBattleStringsTable[BATTLESTRINGS_COUNT] =
+{
+ gText_Trainer1LoseText,
+ gText_PkmnGainedEXP,
+ gText_PkmnGrewToLv,
+ gText_PkmnLearnedMove,
+ gText_TryToLearnMove1,
+ gText_TryToLearnMove2,
+ gText_TryToLearnMove3,
+ gText_PkmnForgotMove,
+ gText_StopLearningMove,
+ gText_DidNotLearnMove,
+ gText_PkmnLearnedMove2,
+ gText_AttackMissed,
+ gText_PkmnProtectedItself,
+ gText_StatsWontIncrease2,
+ gText_AvoidedDamage,
+ gText_ItDoesntAffect,
+ gText_AttackerFainted,
+ gText_TargetFainted,
+ gText_PlayerGotMoney,
+ gText_PlayerWhiteout,
+ gText_PlayerWhiteout2,
+ gText_PreventsEscape,
+ gText_HitXTimes,
+ gText_PkmnFellAsleep,
+ gText_PkmnMadeSleep,
+ gText_PkmnAlreadyAsleep,
+ gText_PkmnAlreadyAsleep2,
+ gText_PkmnWasntAffected,
+ gText_PkmnWasPoisoned,
+ gText_PkmnPoisonedBy,
+ gText_PkmnHurtByPoison,
+ gText_PkmnAlreadyPoisoned,
+ gText_PkmnBadlyPoisoned,
+ gText_PkmnEnergyDrained,
+ gText_PkmnWasBurned,
+ gText_PkmnBurnedBy,
+ gText_PkmnHurtByBurn,
+ gText_PkmnWasFrozen,
+ gText_PkmnFrozenBy,
+ gText_PkmnIsFrozen,
+ gText_PkmnWasDefrosted,
+ gText_PkmnWasDefrosted2,
+ gText_PkmnWasDefrostedBy,
+ gText_PkmnWasParalyzed,
+ gText_PkmnWasParalyzedBy,
+ gText_PkmnIsParalyzed,
+ gText_PkmnIsAlreadyParalyzed,
+ gText_PkmnHealedParalysis,
+ gText_PkmnDreamEaten,
+ gText_StatsWontIncrease,
+ gText_StatsWontDecrease,
+ gText_TeamStoppedWorking,
+ gText_FoeStoppedWorking,
+ gText_PkmnIsConfused,
+ gText_PkmnHealedConfusion,
+ gText_PkmnWasConfused,
+ gText_PkmnAlreadyConfused,
+ gText_PkmnFellInLove,
+ gText_PkmnInLove,
+ gText_PkmnImmobilizedByLove,
+ gText_PkmnBlownAway,
+ gText_PkmnChangedType,
+ gText_PkmnFlinched,
+ gText_PkmnRegainedHealth,
+ gText_PkmnHPFull,
+ gText_PkmnRaisedSpDef,
+ gText_PkmnRaisedDef,
+ gText_PkmnCoveredByVeil,
+ gText_PkmnUsedSafeguard,
+ gText_PkmnSafeguardExpired,
+ gText_PkmnWentToSleep,
+ gText_PkmnSleptHealthy,
+ gText_PkmnWhippedWhirlwind,
+ gText_PkmnTookSunlight,
+ gText_PkmnLoweredHead,
+ gText_PkmnIsGlowing,
+ gText_PkmnFlewHigh,
+ gText_PkmnDugHole,
+ gText_PkmnSqueezedByBind,
+ gText_PkmnTrappedInVortex,
+ gText_PkmnWrappedBy,
+ gText_PkmnClamped,
+ gText_PkmnHurtBy,
+ gText_PkmnFreedFrom,
+ gText_PkmnCrashed,
+ gText_PkmnShroudedInMist,
+ gText_PkmnProtectedByMist,
+ gText_PkmnGettingPumped,
+ gText_PkmnHitWithRecoil,
+ gText_PkmnProtectedItself2,
+ gText_PkmnBuffetedBySandstorm,
+ gText_PkmnPeltedByHail,
+ gText_PkmnSeeded,
+ gText_PkmnEvadedAttack,
+ gText_PkmnSappedByLeechSeed,
+ gText_PkmnFastAsleep,
+ gText_PkmnWokeUp,
+ gText_PkmnUproarKeptAwake,
+ gText_PkmnWokeUpInUproar,
+ gText_PkmnCausedUproar,
+ gText_PkmnMakingUproar,
+ gText_PkmnCalmedDown,
+ gText_PkmnCantSleepInUproar,
+ gText_PkmnStockpiled,
+ gText_PkmnCantStockpile,
+ gText_PkmnCantSleepInUproar2,
+ gText_UproarKeptPkmnAwake,
+ gText_PkmnStayedAwakeUsing,
+ gText_PkmnStoringEnergy,
+ gText_PkmnUnleashedEnergy,
+ gText_PkmnFatigueConfusion,
+ gText_PkmnPickedUpItem,
+ gText_PkmnUnaffected,
+ gText_PkmnTransformedInto,
+ gText_PkmnMadeSubstitute,
+ gText_PkmnHasSubstitute,
+ gText_SubstituteDamaged,
+ gText_PkmnSubstituteFaded,
+ gText_PkmnMustRecharge,
+ gText_PkmnRageBuilding,
+ gText_PkmnMoveWasDisabled,
+ gText_PkmnMoveIsDisabled,
+ gText_PkmnMoveDisabledNoMore,
+ gText_PkmnGotEncore,
+ gText_PkmnEncoreEnded,
+ gText_PkmnTookAim,
+ gText_PkmnSketchedMove,
+ gText_PkmnTryingToTakeFoe,
+ gText_PkmnTookFoe,
+ gText_PkmnReducedPP,
+ gText_PkmnStoleItem,
+ gText_TargetCantEscapeNow,
+ gText_PkmnFellIntoNightmare,
+ gText_PkmnLockedInNightmare,
+ gText_PkmnLaidCurse,
+ gText_PkmnAfflictedByCurse,
+ gText_SpikesScattered,
+ gText_PkmnHurtBySpikes,
+ gText_PkmnIdentified,
+ gText_PkmnPerishCountFell,
+ gText_PkmnBracedItself,
+ gText_PkmnEnduredHit,
+ gText_MagnitudeStrength,
+ gText_PkmnCutHPMaxedAttack,
+ gText_PkmnCopiedStatChanges,
+ gText_PkmnGotFree,
+ gText_PkmnShedLeechSeed,
+ gText_PkmnBlewAwaySpikes,
+ gText_PkmnFledFromBattle,
+ gText_PkmnForesawAttack,
+ gText_PkmnTookAttack,
+ gText_PkmnAttack,
+ gText_PkmnCenterAttention,
+ gText_PkmnChargingPower,
+ gText_NaturePowerTurnedInto,
+ gText_PkmnStatusNormal,
+ gText_PkmnHasNoMovesLeft,
+ gText_PkmnSubjectedToTorment,
+ gText_PkmnCantUseMoveTorment,
+ gText_PkmnTighteningFocus,
+ gText_PkmnFellForTaunt,
+ gText_PkmnCantUseMoveTaunt,
+ gText_PkmnReadyToHelp,
+ gText_PkmnSwitchedItems,
+ gText_PkmnCopiedFoe,
+ gText_PkmnMadeWish,
+ gText_PkmnWishCameTrue,
+ gText_PkmnPlantedRoots,
+ gText_PkmnAbsorbedNutrients,
+ gText_PkmnAnchoredItself,
+ gText_PkmnWasMadeDrowsy,
+ gText_PkmnKnockedOff,
+ gText_PkmnSwappedAbilities,
+ gText_PkmnSealedOpponentMove,
+ gText_PkmnCantUseMoveSealed,
+ gText_PkmnWantsGrudge,
+ gText_PkmnLostPPGrudge,
+ gText_PkmnShroudedItself,
+ gText_PkmnMoveBounced,
+ gText_PkmnWaitsForTarget,
+ gText_PkmnSnatchedMove,
+ gText_PkmnMadeItRain,
+ gText_PkmnRaisedSpeed,
+ gText_PkmnProtectedBy,
+ gText_PkmnPreventsUsage,
+ gText_PkmnRestoredHPUsing,
+ gText_PkmnChangedTypeWith,
+ gText_PkmnPreventsParalysisWith,
+ gText_PkmnPreventsRomanceWith,
+ gText_PkmnPreventsPoisoningWith,
+ gText_PkmnPreventsConfusionWith,
+ gText_PkmnRaisedFirePowerWith,
+ gText_PkmnAnchorsItselfWith,
+ gText_PkmnCutsAttackWith,
+ gText_PkmnPreventsStatLossWith,
+ gText_PkmnHurtsWith,
+ gText_PkmnTraced,
+ gText_StatSharply,
+ gText_StatRose,
+ gText_StatHarshly,
+ gText_StatFell,
+ gText_PkmnsStatChanged,
+ gText_PkmnsStatChanged2,
+ gText_PkmnsStatChanged3,
+ gText_PkmnsStatChanged4,
+ gText_CriticalHit,
+ gText_OneHitKO,
+ gText_123Poof,
+ gText_AndEllipsis,
+ gText_NotVeryEffective,
+ gText_SuperEffective,
+ gText_GotAwaySafely,
+ gText_WildPkmnFled,
+ gText_NoRunningFromTrainers,
+ gText_CantEscape,
+ gText_DontLeaveBirch,
+ gText_ButNothingHappened,
+ gText_ButItFailed,
+ gText_ItHurtConfusion,
+ gText_MirrorMoveFailed,
+ gText_StartedToRain,
+ gText_DownpourStarted,
+ gText_RainContinues,
+ gText_DownpourContinues,
+ gText_RainStopped,
+ gText_SandstormBrewed,
+ gText_SandstormRages,
+ gText_SandstormSubsided,
+ gText_SunlightGotBright,
+ gText_SunlightStrong,
+ gText_SunlightFaded,
+ gText_StartedHail,
+ gText_HailContinues,
+ gText_HailStopped,
+ gText_FailedToSpitUp,
+ gText_FailedToSwallow,
+ gText_WindBecameHeatWave,
+ gText_StatChangesGone,
+ gText_CoinsScattered,
+ gText_TooWeakForSubstitute,
+ gText_SharedPain,
+ gText_BellChimed,
+ gText_FaintInThree,
+ gText_NoPPLeft,
+ gText_ButNoPPLeft,
+ gText_PlayerUsedItem,
+ gText_WallyUsedItem,
+ gText_TrainerBlockedBall,
+ gText_DontBeAThief,
+ gText_ItDodgedBall,
+ gText_YouMissedPkmn,
+ gText_PkmnBrokeFree,
+ gText_ItAppearedCaught,
+ gText_AarghAlmostHadIt,
+ gText_ShootSoClose,
+ gText_GotchaPkmnCaught,
+ gText_GotchaPkmnCaught2,
+ gText_GiveNicknameCaptured,
+ gText_PkmnSentToPC,
+ gText_PkmnDataAddedToDex,
+ gText_ItIsRaining,
+ gText_SandstormIsRaging,
+ gText_CantEscape2,
+ gText_PkmnIgnoresAsleep,
+ gText_PkmnIgnoredOrders,
+ gText_PkmnBeganToNap,
+ gText_PkmnLoafing,
+ gText_PkmnWontObey,
+ gText_PkmnTurnedAway,
+ gText_PkmnPretendNotNotice,
+ gText_EnemyAboutToSwitchPkmn,
+ gText_CreptCloser,
+ gText_CantGetCloser,
+ gText_PkmnWatchingCarefully,
+ gText_PkmnCuriousAboutX,
+ gText_PkmnEnthralledByX,
+ gText_PkmnIgnoredX,
+ gText_ThrewPokeblockAtPkmn,
+ gText_OutOfSafariBalls,
+ gText_PkmnsItemCuredParalysis,
+ gText_PkmnsItemCuredPoison,
+ gText_PkmnsItemHealedBurn,
+ gText_PkmnsItemDefrostedIt,
+ gText_PkmnsItemWokeIt,
+ gText_PkmnsItemSnappedOut,
+ gText_PkmnsItemCuredProblem,
+ gText_PkmnsItemRestoredHealth,
+ gText_PkmnsItemRestoredPP,
+ gText_PkmnsItemRestoredStatus,
+ gText_PkmnsItemRestoredHPALittle,
+ gText_ItemAllowsOnlyYMove,
+ gText_PkmnHungOnWithX,
+ gText_EmptyString3,
+ gText_PkmnsXPreventsBurns,
+ gText_PkmnsXBlocksY,
+ gText_PkmnsXRestoredHPALittle2,
+ gText_PkmnsXWhippedUpSandstorm,
+ gText_PkmnsXPreventsYLoss,
+ gText_PkmnsXInfatuatedY,
+ gText_PkmnsXMadeYIneffective,
+ gText_PkmnsXCuredYProblem,
+ gText_ItSuckedLiquidOoze,
+ gText_PkmnTransformed,
+ gText_ElectricityWeakened,
+ gText_FireWeakened,
+ gText_PkmnHidUnderwater,
+ gText_PkmnSprangUp,
+ gText_HMMovesCantBeForgotten,
+ gText_XFoundOneY,
+ gText_PlayerDefeatedLinkTrainerTrainer1,
+ gText_SoothingAroma,
+ gText_ItemsCantBeUsedNow,
+ gText_ForXCommaYZ,
+ gText_UsingXTheYOfZN,
+ gText_PkmnUsedXToGetPumped,
+ gText_PkmnsXMadeYUseless,
+ gText_PkmnTrappedBySandTomb,
+ gText_EmptyString4,
+ gText_ABoosted,
+ gText_PkmnsXIntensifiedSun,
+ gText_PkmnMakesGroundMiss,
+ gText_YouThrowABallNowRight,
+ gText_PkmnsXTookAttack,
+ gText_PkmnChoseXAsDestiny,
+ gText_PkmnLostFocus,
+ gText_UseNextPkmn,
+ gText_PkmnFledUsingIts,
+ gText_PkmnFledUsing,
+ gText_PkmnWasDraggedOut,
+ gText_PreventedFromWorking,
+ gText_PkmnsItemNormalizedStatus,
+ gText_Trainer1UsedItem,
+ gText_BoxIsFull,
+ gText_PkmnAvoidedAttack,
+ gText_PkmnsXMadeItIneffective,
+ gText_PkmnsXPreventsFlinching,
+ gText_PkmnAlreadyHasBurn,
+ gText_StatsWontDecrease2,
+ gText_PkmnsXBlocksY2,
+ gText_PkmnsXWoreOff,
+ gText_PkmnRaisedDefALittle,
+ gText_PkmnRaisedSpDefALittle,
+ gText_TheWallShattered,
+ gText_PkmnsXPreventsYsZ,
+ gText_PkmnsXCuredItsYProblem,
+ gText_AttackerCantEscape,
+ gText_PkmnObtainedX,
+ gText_PkmnObtainedX2,
+ gText_PkmnObtainedXYObtainedZ,
+ gText_ButNoEffect,
+ gText_PkmnsXHadNoEffectOnY,
+ gText_TwoInGameTrainersDefeated,
+ gText_Trainer2LoseText,
+ gText_PkmnIncapableOfPower,
+ gText_GlintAppearsInEye,
+ gText_PkmnGettingIntoPosition,
+ gText_PkmnBeganGrowlingDeeply,
+ gText_PkmnEagerForMore,
+ gText_DefeatedOpponentByReferee,
+ gText_LostToOpponentByReferee,
+ gText_TiedOpponentByReferee,
+ gText_QuestionForfeitMatch,
+ gText_ForfeitedMatch,
+ gText_PkmnTransferredSomeonesPC,
+ gText_PkmnTransferredLanettesPC,
+ gText_PkmnBoxSomeonesPCFull,
+ gText_PkmnBoxLanettesPCFull,
+ gText_Trainer1WinText,
+ gText_Trainer2WinText,
+};
+
+const u16 gMissStringIds[] =
+{
+ STRINGID_ATTACKMISSED, STRINGID_PKMNPROTECTEDITSELF,
+ STRINGID_PKMNAVOIDEDATTACK, STRINGID_AVOIDEDDAMAGE,
+ STRINGID_PKMNMAKESGROUNDMISS
+};
+
+const u16 gNoEscapeStringIds[] =
+{
+ STRINGID_CANTESCAPE, STRINGID_DONTLEAVEBIRCH, STRINGID_PREVENTSESCAPE,
+ STRINGID_CANTESCAPE2, STRINGID_ATTACKERCANTESCAPE
+};
+
+const u16 gMoveWeatherChangeStringIds[] =
+{
+ STRINGID_STARTEDTORAIN, STRINGID_DOWNPOURSTARTED, STRINGID_BUTITFAILED,
+ STRINGID_SANDSTORMBREWED, STRINGID_SUNLIGHTGOTBRIGHT, STRINGID_STARTEDHAIL
+};
+
+const u16 gSandStormHailContinuesStringIds[] =
+{
+ STRINGID_SANDSTORMRAGES, STRINGID_HAILCONTINUES
+};
+
+const u16 gSandStormHailDmgStringIds[] =
+{
+ STRINGID_PKMNBUFFETEDBYSANDSTORM, STRINGID_PKMNPELTEDBYHAIL
+};
+
+// todo once battlescripts are dumped
+const u16 gTooLazyToSplitThemStringIds[] =
+{
+ STRINGID_SANDSTORMSUBSIDED, STRINGID_HAILSTOPPED, STRINGID_RAINCONTINUES, STRINGID_DOWNPOURCONTINUES,
+ STRINGID_RAINSTOPPED, STRINGID_PKMNPROTECTEDITSELF2, STRINGID_PKMNBRACEDITSELF,
+ STRINGID_BUTITFAILED, STRINGID_BUTITFAILED, STRINGID_PKMNRAISEDDEF,
+ STRINGID_PKMNRAISEDDEFALITTLE, STRINGID_PKMNRAISEDSPDEF, STRINGID_PKMNRAISEDSPDEFALITTLE,
+ STRINGID_PKMNCOVEREDBYVEIL, STRINGID_PKMNSEEDED, STRINGID_PKMNEVADEDATTACK,
+ STRINGID_ITDOESNTAFFECT, STRINGID_PKMNSAPPEDBYLEECHSEED, STRINGID_ITSUCKEDLIQUIDOOZE,
+ STRINGID_PKMNWENTTOSLEEP, STRINGID_PKMNSLEPTHEALTHY, STRINGID_PKMNMAKINGUPROAR,
+ STRINGID_PKMNCALMEDDOWN, STRINGID_PKMNSTOCKPILED, STRINGID_PKMNCANTSTOCKPILE,
+ STRINGID_PKMNWOKEUP, STRINGID_PKMNWOKEUPINUPROAR, STRINGID_FAILEDTOSWALLOW,
+ STRINGID_PKMNHPFULL, STRINGID_PKMNCANTSLEEPINUPROAR2, STRINGID_UPROARKEPTPKMNAWAKE,
+ STRINGID_PKMNSTAYEDAWAKEUSING, STRINGID_PKMNSSTATCHANGED, STRINGID_PKMNSSTATCHANGED2,
+ STRINGID_STATSWONTINCREASE, STRINGID_EMPTYSTRING3, STRINGID_USINGXTHEYOFZN,
+ STRINGID_PKMNUSEDXTOGETPUMPED, STRINGID_PKMNSSTATCHANGED3, STRINGID_PKMNSSTATCHANGED4,
+ STRINGID_STATSWONTDECREASE, STRINGID_EMPTYSTRING3, STRINGID_PKMNWHIPPEDWHIRLWIND,
+ STRINGID_PKMNTOOKSUNLIGHT, STRINGID_PKMNLOWEREDHEAD, STRINGID_PKMNISGLOWING,
+ STRINGID_PKMNFLEWHIGH, STRINGID_PKMNDUGHOLE, STRINGID_PKMNHIDUNDERWATER,
+ STRINGID_PKMNSPRANGUP, STRINGID_PKMNSQUEEZEDBYBIND, STRINGID_PKMNWRAPPEDBY,
+ STRINGID_PKMNTRAPPEDINVORTEX, STRINGID_PKMNCLAMPED, STRINGID_PKMNTRAPPEDINVORTEX,
+ STRINGID_PKMNTRAPPEDBYSANDTOMB, STRINGID_PKMNSHROUDEDINMIST, STRINGID_BUTITFAILED,
+ STRINGID_PKMNGETTINGPUMPED, STRINGID_BUTITFAILED, STRINGID_PKMNTRANSFORMEDINTO,
+ STRINGID_BUTITFAILED, STRINGID_PKMNMADESUBSTITUTE, STRINGID_TOOWEAKFORSUBSTITUTE,
+ STRINGID_PKMNWASPOISONED, STRINGID_PKMNPOISONEDBY, STRINGID_PKMNWASPARALYZED,
+ STRINGID_PKMNWASPARALYZEDBY, STRINGID_PKMNFELLASLEEP, STRINGID_PKMNMADESLEEP,
+ STRINGID_PKMNWASBURNED, STRINGID_PKMNBURNEDBY, STRINGID_PKMNWASFROZEN,
+ STRINGID_PKMNFROZENBY, STRINGID_PKMNWASDEFROSTED2, STRINGID_PKMNWASDEFROSTEDBY,
+ STRINGID_ATTACKMISSED, STRINGID_PKMNUNAFFECTED, STRINGID_PKMNFELLINLOVE,
+ STRINGID_PKMNSXINFATUATEDY, STRINGID_PKMNENERGYDRAINED, STRINGID_ITSUCKEDLIQUIDOOZE,
+ STRINGID_ELECTRICITYWEAKENED, STRINGID_FIREWEAKENED, STRINGID_BELLCHIMED,
+ STRINGID_BELLCHIMED, STRINGID_BELLCHIMED, STRINGID_BELLCHIMED,
+ STRINGID_SOOTHINGAROMA, STRINGID_PKMNFORESAWATTACK, STRINGID_PKMNCHOSEXASDESTINY,
+ STRINGID_PKMNBROKEFREE, STRINGID_ITAPPEAREDCAUGHT, STRINGID_AARGHALMOSTHADIT,
+ STRINGID_SHOOTSOCLOSE, STRINGID_ITISRAINING, STRINGID_ITISRAINING,
+ STRINGID_ITISRAINING, STRINGID_ITISRAINING, STRINGID_ITISRAINING,
+ STRINGID_ITISRAINING, STRINGID_ITISRAINING, STRINGID_ITISRAINING,
+ STRINGID_SANDSTORMISRAGING, STRINGID_ITISRAINING, STRINGID_ITISRAINING,
+ STRINGID_ITISRAINING, STRINGID_SUNLIGHTSTRONG, STRINGID_ITISRAINING,
+ STRINGID_ITISRAINING, STRINGID_ITISRAINING, STRINGID_PKMNLOAFING,
+ STRINGID_PKMNWONTOBEY, STRINGID_PKMNTURNEDAWAY, STRINGID_PKMNPRETENDNOTNOTICE,
+ STRINGID_PKMNINCAPABLEOFPOWER, STRINGID_CREPTCLOSER, STRINGID_CANTGETCLOSER,
+ STRINGID_PKMNCURIOUSABOUTX, STRINGID_PKMNENTHRALLEDBYX, STRINGID_PKMNIGNOREDX,
+ STRINGID_PKMNSITEMSNAPPEDOUT, STRINGID_PKMNSITEMCUREDPARALYSIS, STRINGID_PKMNSITEMDEFROSTEDIT,
+ STRINGID_PKMNSITEMHEALEDBURN, STRINGID_PKMNSITEMCUREDPOISON, STRINGID_PKMNSITEMWOKEIT,
+ STRINGID_PKMNSITEMCUREDPROBLEM, STRINGID_PKMNSITEMNORMALIZEDSTATUS, STRINGID_PKMNSXPREVENTSBURNS,
+ STRINGID_PKMNSXPREVENTSYSZ, STRINGID_PKMNSXHADNOEFFECTONY, STRINGID_PKMNPREVENTSPARALYSISWITH,
+ STRINGID_PKMNSXPREVENTSYSZ, STRINGID_PKMNSXHADNOEFFECTONY, STRINGID_PKMNPREVENTSPOISONINGWITH,
+ STRINGID_PKMNSXPREVENTSYSZ, STRINGID_PKMNSXHADNOEFFECTONY, STRINGID_PKMNOBTAINEDX,
+ STRINGID_PKMNOBTAINEDX2, STRINGID_PKMNOBTAINEDXYOBTAINEDZ, STRINGID_PKMNRAISEDFIREPOWERWITH,
+ STRINGID_PKMNSXMADEYINEFFECTIVE, STRINGID_PKMNTRANSFERREDSOMEONESPC, STRINGID_PKMNTRANSFERREDLANETTESPC,
+ STRINGID_PKMNBOXSOMEONESPCFULL, STRINGID_PKMNBOXLANETTESPCFULL,
+};
+
+const u16 gTrappingMoves[] =
+{
+ MOVE_BIND, MOVE_WRAP, MOVE_FIRE_SPIN, MOVE_CLAMP, MOVE_WHIRLPOOL, MOVE_SAND_TOMB, 0xFFFF
+};
+
+const u8 gText_PkmnIsEvolving[] = _("What?\n{STR_VAR_1} is evolving!");
+const u8 gText_CongratsPkmnEvolved[] = _("Congratulations! Your {STR_VAR_1}\nevolved into {STR_VAR_2}!{UNKNOWN_A}\p");
+const u8 gText_PkmnStoppedEvolving[] = _("Huh? {STR_VAR_1}\nstopped evolving!\p");
+const u8 gText_EllipsisQuestionMark[] = _("……?\p");
+const u8 gText_WhatWillPkmnDo[] = _("What will\n{B_ACTIVE_NAME_WITH_PREFIX} do?");
+const u8 gText_WhatWillPkmnDo2[] = _("What will\n{B_PLAYER_NAME} do?");
+const u8 gText_WhatWillWallyDo[] = _("What will\nWALLY do?");
+const u8 gText_LinkStandby[] = _("{PAUSE 16}Link standby…");
+const u8 gText_BattleMenu[] = _("FIGHT{CLEAR_TO 56}BAG\nPOKéMON{CLEAR_TO 56}RUN");
+const u8 gText_SafariZoneMenu[] = _("BALL{CLEAR_TO 56}{POKEBLOCK}\nGO NEAR{CLEAR_TO 56}RUN");
+const u8 gText_MoveInterfacePP[] = _("PP ");
+const u8 gText_MoveInterfaceType[] = _("TYPE/");
+const u8 gText_MoveInterfacePpType[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW DYNAMIC_COLOR4 DYNAMIC_COLOR5 DYNAMIC_COLOR6}PP\nTYPE/");
+const u8 gText_MoveInterfaceDynamicColors[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW DYNAMIC_COLOR4 DYNAMIC_COLOR5 DYNAMIC_COLOR6}");
+const u8 gText_WhichMoveToForget4[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW DYNAMIC_COLOR4 DYNAMIC_COLOR5 DYNAMIC_COLOR6}Which move should\nbe forgotten?");
+const u8 gText_BattleYesNoChoice[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW DYNAMIC_COLOR4 DYNAMIC_COLOR5 DYNAMIC_COLOR6}Yes\nNo");
+const u8 gText_BattleSwitchWhich[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW DYNAMIC_COLOR4 DYNAMIC_COLOR5 DYNAMIC_COLOR6}Switch\nwhich?");
+const u8 gText_BattleSwitchWhich2[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW DYNAMIC_COLOR4 DYNAMIC_COLOR5 DYNAMIC_COLOR6}");
+const u8 gText_BattleSwitchWhich3[] = _("{UP_ARROW}");
+const u8 gText_BattleSwitchWhich4[] = _("{ESCAPE 4}");
+const u8 gText_BattleSwitchWhich5[] = _("-");
+
+const u8 gText_HP[] = _("HP");
+const u8 gText_Attack[] = _("ATTACK");
+const u8 gText_Defense[] = _("DEFENSE");
+const u8 gText_SpAtk[] = _("SP. ATK");
+const u8 gText_SpDef[] = _("SP. DEF");
+
+const u8 * const gStatNamesTable2[] =
+{
+ gText_HP, gText_SpAtk, gText_Attack,
+ gText_SpDef, gText_Defense, gText_Speed
+};
+
+const u8 gText_SafariBalls[] = _("{HIGHLIGHT DARK_GREY}SAFARI BALLS");
+const u8 gText_SafariBallLeft[] = _("{HIGHLIGHT DARK_GREY}Left: $" "{HIGHLIGHT DARK_GREY}");const u8 gText_Sleep[] = _( "sleep");const u8 gText_Poison[] = _( "poison");const u8 gText_Burn[] = _( "burn");const u8 gText_Paralysis[] = _( "paralysis");const u8 gText_Ice[] = _( "ice");const u8 gText_Confusion[] = _( "confusion");const u8 gText_Love[] = _( "love");
+const u8 gText_SpaceAndSpace[] = _(" and ");
+const u8 gText_CommaSpace[] = _(", ");
+const u8 gText_Space2[] = _(" ");
+const u8 gText_ScrollTextUp[] = _("\l");
+const u8 gText_NewLine[] = _("\n");
+const u8 gText_Are[] = _("are");
+const u8 gText_Are2[] = _("are");
+const u8 gText_BadEgg[] = _("Bad EGG");
+const u8 gText_BattleWallyName[] = _("WALLY");
+const u8 gText_Win[] = _("{HIGHLIGHT TRANSPARENT}Win");
+const u8 gText_Loss[] = _("{HIGHLIGHT TRANSPARENT}Loss");
+const u8 gText_Draw[] = _("{HIGHLIGHT TRANSPARENT}Draw");
+const u8 gText_SpaceIs[] = _(" is");
+const u8 gText_ApostropheS[] = _("’s");
+
+const u8 gText_UnknownMoveTypes[][17] =
+{
+ _("a NORMAL move"),
+ _("a FIGHTING move"),
+ _("a FLYING move"),
+ _("a POISON move"),
+ _("a GROUND move"),
+ _("a ROCK move"),
+ _("a BUG move"),
+ _("a GHOST move"),
+ _("a STEEL move"),
+ _("a ??? move"),
+ _("a FIRE move"),
+ _("a WATER move"),
+ _("a GRASS move"),
+ _("an ELECTRIC move"),
+ _("a PSYCHIC move"),
+ _("an ICE move"),
+ _("a DRAGON move"),
+ _("a DARK move")
+};
+
+const u8 gText_BattleTourney[] = _("BATTLE TOURNEY");
+const u8 gText_Round1[] = _("Round 1");
+const u8 gText_Round2[] = _("Round 2");
+const u8 gText_Semifinal[] = _("Semifinal");
+const u8 gText_Final[] = _("Final");
+
+const u8 * const gRoundsStringTable[] =
+{
+ gText_Round1,
+ gText_Round2,
+ gText_Semifinal,
+ gText_Final
+};
+
+const u8 gText_TheGreatNewHope[] = _("The great new hope!\p");
+const u8 gText_WillChampinshipDreamComeTrue[] = _("Will the championship dream come true?!\p");
+const u8 gText_AFormerChampion[] = _("A former CHAMPION!\p");
+const u8 gText_ThePreviousChampion[] = _("The previous CHAMPION!\p");
+const u8 gText_TheUnbeatenChampion[] = _("The unbeaten CHAMPION!\p");
+const u8 gText_PlayerMon1Name[] = _("{B_PLAYER_MON1_NAME}");
+const u8 gText_Vs[] = _("VS");
+const u8 gText_OpponentMon1Name[] = _("{B_OPPONENT_MON1_NAME}");
+const u8 gText_Mind[] = _("Mind");
+const u8 gText_Skill[] = _("Skill");
+const u8 gText_Body[] = _("Body");
+const u8 gText_Judgement[] = _("{B_BUFF1}{CLEAR 13}Judgment{CLEAR 13}{B_BUFF2}");
+const u8 gText_TwoTrainersSentPkmn[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME} sent\nout {B_OPPONENT_MON1_NAME}!\p{B_TRAINER2_CLASS} {B_TRAINER2_NAME} sent\nout {B_OPPONENT_MON2_NAME}!");
+const u8 gText_Trainer2SentOutPkmn[] = _("{B_TRAINER2_CLASS} {B_TRAINER2_NAME} sent\nout {B_BUFF1}!");
+const u8 gText_TwoTrainersWantToBattle[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME} and\n{B_TRAINER2_CLASS} {B_TRAINER2_NAME}\lwant to battle!\p");
+const u8 gText_InGamePartnerSentOutZGoN[] = _("{B_PARTNER_CLASS} {B_PARTNER_NAME} sent\nout {B_PLAYER_MON2_NAME}!\lGo, {B_PLAYER_MON1_NAME}!");
+const u8 gText_TwoInGameTrainersDefeated[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME} and\n{B_TRAINER2_CLASS} {B_TRAINER2_NAME}\lwere defeated!\p");
+const u8 gText_Trainer2LoseText[] = _("{B_TRAINER2_LOSE_TEXT}");
+const u8 gText_PkmnIncapableOfPower[] = _("{B_ATK_NAME_WITH_PREFIX} appears incapable\nof using its power!");
+const u8 gText_GlintAppearsInEye[] = _("A glint appears in\n{B_SCR_ACTIVE_NAME_WITH_PREFIX}’s eyes!");
+const u8 gText_PkmnGettingIntoPosition[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is getting into\nposition!");
+const u8 gText_PkmnBeganGrowlingDeeply[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} began growling deeply!");
+const u8 gText_PkmnEagerForMore[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is eager for more!");
+
+const u16 gUnknown_085CCF0A[] =
+{
+ 0x016E, 0x016F, 0x0170, 0x0171
+};
+
+const u8 gText_RefIfNothingIsDecided[] = _("REFEREE: If nothing is decided in\n3 turns, we will go to judging!");
+const u8 gText_RefThatsIt[] = _("REFEREE: That’s it! We will now go to\njudging to determine the winner!");
+const u8 gText_RefJudgeMind[] = _("REFEREE: Judging category 1, Mind!\nThe POKéMON showing the most guts!\p");
+const u8 gText_RefJudgeSkill[] = _("REFEREE: Judging category 2, Skill!\nThe POKéMON using moves the best!\p");
+const u8 gText_RefJudgeBody[] = _("REFEREE: Judging category 3, Body!\nThe POKéMON with the most vitality!\p");
+const u8 gText_RefJudgement1[] = _("REFEREE: Judgment: {B_BUFF1} to {B_BUFF2}!\nThe winner is {B_PLAYER_NAME}’s {B_PLAYER_MON1_NAME}!\p");
+const u8 gText_RefJudgement2[] = _("REFEREE: Judgment: {B_BUFF1} to {B_BUFF2}!\nThe winner is {B_TRAINER1_NAME}’s {B_OPPONENT_MON1_NAME}!\p");
+const u8 gText_RefJudgement3[] = _("REFEREE: Judgment: 3 to 3!\nWe have a draw!\p");
+const u8 gText_DefeatedOpponentByReferee[] = _("{B_PLAYER_MON1_NAME} defeated the opponent\n{B_OPPONENT_MON1_NAME} in a REFEREE’s decision!");
+const u8 gText_LostToOpponentByReferee[] = _("{B_PLAYER_MON1_NAME} lost to the opponent\n{B_OPPONENT_MON1_NAME} in a REFEREE’s decision!");
+const u8 gText_TiedOpponentByReferee[] = _("{B_PLAYER_MON1_NAME} tied the opponent\n{B_OPPONENT_MON1_NAME} in a REFEREE’s decision!");
+const u8 gText_RefCommenceBattle[] = _("REFEREE: {B_PLAYER_MON1_NAME} VS {B_OPPONENT_MON1_NAME}!\nCommence battling!");
+
+const u8 * const gRefereeStringsTable[] =
+{
+ gText_RefIfNothingIsDecided,
+ gText_RefThatsIt,
+ gText_RefJudgeMind,
+ gText_RefJudgeSkill,
+ gText_RefJudgeBody,
+ gText_RefJudgement1,
+ gText_RefJudgement2,
+ gText_RefJudgement3,
+ gText_RefCommenceBattle,
+};
+
+const u8 gText_QuestionForfeitMatch[] = _("Would you like to forfeit the match\nand quit now?");
+const u8 gText_ForfeitedMatch[] = _("{B_PLAYER_NAME} forfeited the match!");
+const u8 gText_Trainer1WinText[] = _("{B_TRAINER1_WIN_TEXT}");
+const u8 gText_Trainer2WinText[] = _("{B_TRAINER2_WIN_TEXT}");
+const u8 gText_Trainer1Fled[] = _( "{PLAY_SE 0x0011}{B_TRAINER1_CLASS} {B_TRAINER1_NAME} fled!");
+const u8 gText_PlayerLostAgainstTrainer1[] = _("Player lost against\n{B_TRAINER1_CLASS} {B_TRAINER1_NAME}!");
+const u8 gText_PlayerBattledToDrawTrainer1[] = _("Player battled to a draw against\n{B_TRAINER1_CLASS} {B_TRAINER1_NAME}!");
+const u8 gText_RecordBattleToPass[] = _("Would you like to record your battle\non your FRONTIER PASS?");
+const u8 gText_BattleRecordedOnPass[] = _("{B_PLAYER_NAME}’s battle result was recorded\non the FRONTIER PASS.");
+const u8 gText_LinkTrainerWantsToBattlePause[] = _("{B_20}\nwants to battle!{PAUSE 49}");
+const u8 gText_TwoLinkTrainersWantToBattlePause[] = _("{B_20} and {B_21}\nwant to battle!{PAUSE 49}");
+
+static const u16 sUnknownMoveTable[] =
+{
+ MOVE_SWORDS_DANCE, MOVE_STRENGTH, MOVE_GROWTH,
+ MOVE_HARDEN, MOVE_MINIMIZE, MOVE_SMOKESCREEN,
+ MOVE_WITHDRAW, MOVE_DEFENSE_CURL, MOVE_EGG_BOMB,
+ MOVE_SMOG, MOVE_BONE_CLUB, MOVE_FLASH, MOVE_SPLASH,
+ MOVE_ACID_ARMOR, MOVE_BONEMERANG, MOVE_REST, MOVE_SHARPEN,
+ MOVE_SUBSTITUTE, MOVE_MIND_READER, MOVE_SNORE,
+ MOVE_PROTECT, MOVE_SPIKES, MOVE_ENDURE, MOVE_ROLLOUT,
+ MOVE_SWAGGER, MOVE_SLEEP_TALK, MOVE_HIDDEN_POWER,
+ MOVE_PSYCH_UP, MOVE_EXTREME_SPEED, MOVE_FOLLOW_ME,
+ MOVE_TRICK, MOVE_ASSIST, MOVE_INGRAIN, MOVE_KNOCK_OFF,
+ MOVE_CAMOUFLAGE, MOVE_ASTONISH, MOVE_ODOR_SLEUTH,
+ MOVE_GRASS_WHISTLE, MOVE_SHEER_COLD, MOVE_MUDDY_WATER,
+ MOVE_IRON_DEFENSE, MOVE_BOUNCE, MOVE_NONE,
+
+ MOVE_TELEPORT, MOVE_RECOVER, MOVE_BIDE, MOVE_AMNESIA,
+ MOVE_FLAIL, MOVE_TAUNT, MOVE_BULK_UP, MOVE_NONE,
+
+ MOVE_MEDITATE, MOVE_AGILITY, MOVE_MIMIC, MOVE_DOUBLE_TEAM,
+ MOVE_BARRAGE, MOVE_TRANSFORM, MOVE_STRUGGLE, MOVE_SCARY_FACE,
+ MOVE_CHARGE, MOVE_WISH, MOVE_BRICK_BREAK, MOVE_YAWN,
+ MOVE_FEATHER_DANCE, MOVE_TEETER_DANCE, MOVE_MUD_SPORT,
+ MOVE_FAKE_TEARS, MOVE_WATER_SPORT, MOVE_CALM_MIND, MOVE_NONE,
+
+ MOVE_POUND, MOVE_SCRATCH, MOVE_VICE_GRIP,
+ MOVE_WING_ATTACK, MOVE_FLY, MOVE_BIND, MOVE_SLAM,
+ MOVE_HORN_ATTACK, MOVE_WRAP, MOVE_THRASH, MOVE_TAIL_WHIP,
+ MOVE_LEER, MOVE_BITE, MOVE_GROWL, MOVE_ROAR,
+ MOVE_SING, MOVE_PECK, MOVE_ABSORB, MOVE_STRING_SHOT,
+ MOVE_EARTHQUAKE, MOVE_FISSURE, MOVE_DIG, MOVE_TOXIC,
+ MOVE_SCREECH, MOVE_METRONOME, MOVE_LICK, MOVE_CLAMP,
+ MOVE_CONSTRICT, MOVE_POISON_GAS, MOVE_BUBBLE,
+ MOVE_SLASH, MOVE_SPIDER_WEB, MOVE_NIGHTMARE, MOVE_CURSE,
+ MOVE_FORESIGHT, MOVE_CHARM, MOVE_ATTRACT, MOVE_ROCK_SMASH,
+ MOVE_UPROAR, MOVE_SPIT_UP, MOVE_SWALLOW, MOVE_TORMENT,
+ MOVE_FLATTER, MOVE_ROLE_PLAY, MOVE_ENDEAVOR, MOVE_TICKLE,
+ MOVE_COVET, MOVE_NONE
+};
+
+static const u8 sDummyWeirdStatusString[] = {EOS, EOS, EOS, EOS, EOS, EOS, EOS, EOS, 0, 0};
+
+static const u8 gUnknown_085CD42C[] =
+{
+ 0xFF, 0x1, 0x0, 0x1, 0x0, 0x0, 0x1, 0x1, 0xF, 0x6, 0x0, 0x0, 0xFF, 0x1,
+ 0x1, 0x1, 0x0, 0x0, 0x0, 0x1, 0xF, 0x6, 0x0, 0x0, 0xEE, 0x1, 0x0, 0x1, 0x0,
+ 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0,
+ 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0, 0xD,
+ 0xE, 0xF, 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE,
+ 0xF, 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF,
+ 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0, 0xC, 0xE, 0xB, 0x0, 0x0,
+ 0xEE, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE,
+ 0x1, 0x2, 0x1, 0x0, 0x0, 0x0, 0xC, 0xE, 0xB, 0x0, 0x0, 0xEE, 0x7, 0x0,
+ 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0,
+ 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0,
+ 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0xD,
+ 0xE, 0xF, 0x0, 0x0, 0x0, 0x1, 0x20, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x2,
+ 0x0, 0x0, 0xEE, 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0,
+ 0x0, 0xEE, 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0,
+ 0xEE, 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE,
+ 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x1,
+ 0xFF, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x1, 0xFF,
+ 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0x0, 0x1, 0xFF, 0x1, 0x0,
+ 0x0, 0x0, 0x1, 0x0, 0x6, 0x0, 0x0, 0x0, 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0,
+ 0x6, 0x0, 0x0, 0x0, 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x6, 0x0, 0x0
+};
+
+static const u8 gUnknown_085CD54C[] =
+{
+ 0xFF, 0x1, 0x0, 0x1, 0x0, 0x0, 0x1, 0x1, 0xF, 0x6, 0x0, 0x0, 0xFF, 0x1,
+ 0x1, 0x1, 0x0, 0x0, 0x0, 0x1, 0xF, 0x6, 0x0, 0x0, 0xEE, 0x1, 0x0, 0x1, 0x0,
+ 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0,
+ 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0, 0xD,
+ 0xE, 0xF, 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE,
+ 0xF, 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF,
+ 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0, 0xC, 0xE, 0xB, 0x0, 0x0,
+ 0xEE, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE,
+ 0x1, 0x2, 0x1, 0x0, 0x0, 0x0, 0xC, 0xE, 0xB, 0x0, 0x0, 0xEE, 0x7, 0x0,
+ 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0,
+ 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0,
+ 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0xD,
+ 0xE, 0xF, 0x0, 0x0, 0x0, 0x1, 0x20, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x2,
+ 0x0, 0x0, 0xEE, 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0x1, 0xE, 0xF, 0x0,
+ 0x0, 0xEE, 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0,
+ 0xEE, 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE,
+ 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x1,
+ 0xFF, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x1, 0xFF,
+ 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x1, 0xFF, 0x1,
+ 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0x11, 0x1, 0x0, 0x1, 0x0, 0x0,
+ 0x1, 0x2, 0x1, 0x3, 0x0, 0x0
+};
+
+static const u8 * const gUnknown_085CD660[] =
+{
+ gUnknown_085CD42C, gUnknown_085CD54C
+};
+
+static const u8 sRecordedBattleTextSpeeds[] = {8, 4, 1, 0};
+
+void BufferStringBattle(u16 stringID)
+{
+ s32 i;
+ const u8* stringPtr = NULL;
+
+ gStringInfo = (struct StringInfoBattle*)(&gBattleBufferA[gActiveBank][4]);
+ gLastUsedItem = gStringInfo->lastItem;
+ gLastUsedAbility = gStringInfo->lastAbility;
+ gBattleScripting.bank = gStringInfo->scrActive;
+ *(&gBattleStruct->field_52) = gStringInfo->unk1605E;
+ *(&gBattleStruct->hpScale) = gStringInfo->hpScale;
+ gStringBank = gStringInfo->StringBank;
+ *(&gBattleStruct->stringMoveType) = gStringInfo->moveType;
+
+ for (i = 0; i < BATTLE_BANKS_COUNT; i++)
+ {
+ gAbilitiesPerBank[i] = gStringInfo->abilities[i];
+ }
+ for (i = 0; i < TEXT_BUFF_ARRAY_COUNT; i++)
+ {
+ gBattleTextBuff1[i] = gStringInfo->textBuffs[0][i];
+ gBattleTextBuff2[i] = gStringInfo->textBuffs[1][i];
+ gBattleTextBuff3[i] = gStringInfo->textBuffs[2][i];
+ }
+
+ switch (stringID)
+ {
+ case STRINGID_INTROMSG: // first battle msg
+ if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
+ {
+ if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_x800000)
+ {
+ stringPtr = gText_TwoTrainersWantToBattle;
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
+ stringPtr = gText_TwoLinkTrainersWantToBattlePause;
+ else
+ stringPtr = gText_TwoLinkTrainersWantToBattle;
+ }
+ else
+ {
+ if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_C00)
+ stringPtr = gText_Trainer1WantsToBattle;
+ else if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
+ stringPtr = gText_LinkTrainerWantsToBattlePause;
+ else
+ stringPtr = gText_LinkTrainerWantsToBattle;
+ }
+ }
+ else
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER)
+ stringPtr = gText_TwoTrainersWantToBattle;
+ else if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)
+ stringPtr = gText_TwoTrainersWantToBattle;
+ else
+ stringPtr = gText_Trainer1WantsToBattle;
+ }
+ }
+ else
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY)
+ stringPtr = gText_WildPkmnAppeared2;
+ else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) // interesting, looks like they had something planned for wild double battles
+ stringPtr = gText_TwoWildPkmnAppeared;
+ else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL)
+ stringPtr = gText_WildPkmnAppearedPause;
+ else
+ stringPtr = gText_WildPkmnAppeared;
+ }
+ break;
+ case STRINGID_INTROSENDOUT: // poke first send-out
+ if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER)
+ stringPtr = gText_InGamePartnerSentOutZGoN;
+ else if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)
+ stringPtr = gText_GoTwoPkmn;
+ else if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ stringPtr = gText_LinkPartnerSentOutPkmnGoPkmn;
+ else
+ stringPtr = gText_GoTwoPkmn;
+ }
+ else
+ {
+ stringPtr = gText_GoPkmn;
+ }
+ }
+ else
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)
+ stringPtr = gText_TwoTrainersSentPkmn;
+ else if (gBattleTypeFlags & BATTLE_TYPE_x800000)
+ stringPtr = gText_TwoTrainersSentPkmn;
+ else if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ stringPtr = gText_TwoLinkTrainersSentOutPkmn;
+ else if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
+ stringPtr = gText_LinkTrainerSentOutTwoPkmn;
+ else
+ stringPtr = gText_Trainer1SentOutTwoPkmn;
+ }
+ else
+ {
+ if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)))
+ stringPtr = gText_Trainer1SentOutPkmn;
+ else if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_C00)
+ stringPtr = gText_Trainer1SentOutPkmn;
+ else
+ stringPtr = gText_LinkTrainerSentOutPkmn;
+ }
+ }
+ break;
+ case STRINGID_RETURNMON: // sending poke to ball msg
+ if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ {
+ if (*(&gBattleStruct->hpScale) == 0)
+ stringPtr = gText_PkmnThatsEnough;
+ else if (*(&gBattleStruct->hpScale) == 1 || gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
+ stringPtr = gText_PkmnComeBack;
+ else if (*(&gBattleStruct->hpScale) == 2)
+ stringPtr = gText_PkmnOkComeBack;
+ else
+ stringPtr = gText_PkmnGoodComeBack;
+ }
+ else
+ {
+ if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_800 || gBattleTypeFlags & BATTLE_TYPE_x2000000)
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ stringPtr = gText_LinkTrainer2WithdrewPkmn;
+ else
+ stringPtr = gText_LinkTrainer1WithdrewPkmn;
+ }
+ else
+ {
+ stringPtr = gText_Trainer1WithdrewPkmn;
+ }
+ }
+ break;
+ case STRINGID_SWITCHINMON: // switch-in msg
+ if (GetBankSide(gBattleScripting.bank) == SIDE_PLAYER)
+ {
+ if (*(&gBattleStruct->hpScale) == 0 || gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
+ stringPtr = gText_GoPkmn2;
+ else if (*(&gBattleStruct->hpScale) == 1)
+ stringPtr = gText_DoItPkmn;
+ else if (*(&gBattleStruct->hpScale) == 2)
+ stringPtr = gText_GoForItPkmn;
+ else
+ stringPtr = gText_YourFoesWeakGetEmPkmn;
+ }
+ else
+ {
+ if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_x800000)
+ {
+ if (gBattleScripting.bank == 1)
+ stringPtr = gText_Trainer1SentOutPkmn2;
+ else
+ stringPtr = gText_Trainer2SentOutPkmn;
+ }
+ else
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ stringPtr = gText_LinkTrainerMultiSentOutPkmn;
+ else if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_C00)
+ stringPtr = gText_Trainer1SentOutPkmn2;
+ else
+ stringPtr = gText_LinkTrainerSentOutPkmn2;
+ }
+ }
+ else
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)
+ {
+ if (gBattleScripting.bank == 1)
+ stringPtr = gText_Trainer1SentOutPkmn2;
+ else
+ stringPtr = gText_Trainer2SentOutPkmn;
+ }
+ else
+ {
+ stringPtr = gText_Trainer1SentOutPkmn2;
+ }
+ }
+ }
+ break;
+ case STRINGID_USEDMOVE: // pokemon used a move msg
+ sub_814F8F8(gBattleTextBuff1); // buff1 doesn't appear in the string, leftover from japanese move names?
+
+ if (gStringInfo->currentMove > LAST_MOVE_INDEX)
+ StringCopy(gBattleTextBuff2, gText_UnknownMoveTypes[*(&gBattleStruct->stringMoveType)]);
+ else
+ StringCopy(gBattleTextBuff2, gMoveNames[gStringInfo->currentMove]);
+
+ sub_814F950(gBattleTextBuff2);
+ stringPtr = gText_AttackerUsedX;
+ break;
+ case STRINGID_BATTLEEND: // battle end
+ if (gBattleTextBuff1[0] & BATTLE_OUTCOME_BIT_x80)
+ {
+ gBattleTextBuff1[0] &= ~(BATTLE_OUTCOME_BIT_x80);
+ if (GetBankSide(gActiveBank) == SIDE_OPPONENT && gBattleTextBuff1[0] != BATTLE_DREW)
+ gBattleTextBuff1[0] ^= (BATTLE_LOST | BATTLE_WON);
+
+ if (gBattleTextBuff1[0] == BATTLE_LOST || gBattleTextBuff1[0] == BATTLE_DREW)
+ stringPtr = gText_GotAwaySafely;
+ else if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ stringPtr = gText_TwoWildFled;
+ else
+ stringPtr = gText_WildFled;
+ }
+ else
+ {
+ if (GetBankSide(gActiveBank) == SIDE_OPPONENT && gBattleTextBuff1[0] != BATTLE_DREW)
+ gBattleTextBuff1[0] ^= (BATTLE_LOST | BATTLE_WON);
+
+ if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ {
+ switch (gBattleTextBuff1[0])
+ {
+ case BATTLE_WON:
+ if (gBattleTypeFlags & BATTLE_TYPE_x800000)
+ stringPtr = gText_TwoInGameTrainersDefeated;
+ else
+ stringPtr = gText_TwoLinkTrainersDefeated;
+ break;
+ case BATTLE_LOST:
+ stringPtr = gText_PlayerLostToTwo;
+ break;
+ case BATTLE_DREW:
+ stringPtr = gText_PlayerBattledToDrawVsTwo;
+ break;
+ }
+ }
+ else if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_C00)
+ {
+ switch (gBattleTextBuff1[0])
+ {
+ case BATTLE_WON:
+ stringPtr = gText_PlayerDefeatedLinkTrainerTrainer1;
+ break;
+ case BATTLE_LOST:
+ stringPtr = gText_PlayerLostAgainstTrainer1;
+ break;
+ case BATTLE_DREW:
+ stringPtr = gText_PlayerBattledToDrawTrainer1;
+ break;
+ }
+ }
+ else
+ {
+ switch (gBattleTextBuff1[0])
+ {
+ case BATTLE_WON:
+ stringPtr = gText_PlayerDefeatedLinkTrainer;
+ break;
+ case BATTLE_LOST:
+ stringPtr = gText_PlayerLostAgainstLinkTrainer;
+ break;
+ case BATTLE_DREW:
+ stringPtr = gText_PlayerBattledToDrawLinkTrainer;
+ break;
+ }
+ }
+ }
+ break;
+ default: // load a string from the table
+ if (stringID >= BATTLESTRINGS_COUNT + BATTLESTRINGS_ID_ADDER)
+ {
+ gDisplayedStringBattle[0] = EOS;
+ return;
+ }
+ else
+ {
+ stringPtr = gBattleStringsTable[stringID - BATTLESTRINGS_ID_ADDER];
+ }
+ break;
+ }
+
+ BattleStringExpandPlaceholdersToDisplayedString(stringPtr);
+}
+
+u32 BattleStringExpandPlaceholdersToDisplayedString(const u8* src)
+{
+ BattleStringExpandPlaceholders(src, gDisplayedStringBattle);
+}
+
+static const u8* TryGetStatusString(u8* src)
+{
+ u32 i;
+ u8 status[8];
+ u32 chars1, chars2;
+ u8* statusPtr;
+
+ memcpy(status, sDummyWeirdStatusString, 8);
+
+ statusPtr = status;
+ for (i = 0; i < 8; i++)
+ {
+ if (*src == EOS)
+ break;
+ *statusPtr = *src;
+ src++;
+ statusPtr++;
+ }
+
+ chars1 = *(u32*)(&status[0]);
+ chars2 = *(u32*)(&status[4]);
+
+ for (i = 0; i < ARRAY_COUNT(gStatusConditionStringsTable); i++)
+ {
+ if (chars1 == *(u32*)(&gStatusConditionStringsTable[i][0][0])
+ && chars2 == *(u32*)(&gStatusConditionStringsTable[i][0][4]))
+ return gStatusConditionStringsTable[i][1];
+ }
+ return NULL;
+}
+
+#define HANDLE_NICKNAME_STRING_CASE(bank, monIndex) \
+ if (GetBankSide(bank) != SIDE_PLAYER) \
+ { \
+ if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) \
+ toCpy = gText_FoePkmnPrefix; \
+ else \
+ toCpy = gText_WildPkmnPrefix; \
+ while (*toCpy != EOS) \
+ { \
+ dst[dstID] = *toCpy; \
+ dstID++; \
+ toCpy++; \
+ } \
+ GetMonData(&gEnemyParty[monIndex], MON_DATA_NICKNAME, text); \
+ } \
+ else \
+ { \
+ GetMonData(&gPlayerParty[monIndex], MON_DATA_NICKNAME, text); \
+ } \
+ StringGetEnd10(text); \
+ toCpy = text;
+
+u32 BattleStringExpandPlaceholders(const u8* src, u8* dst)
+{
+ u32 dstID = 0; // if they used dstID, why not use srcID as well?
+ const u8* toCpy = NULL;
+ u8 text[30];
+ u8 multiplayerID;
+ s32 i;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_x2000000)
+ multiplayerID = gUnknown_0203C7B4;
+ else
+ multiplayerID = GetMultiplayerId();
+
+ while (*src != EOS)
+ {
+ if (*src == PLACEHOLDER_BEGIN)
+ {
+ src++;
+ switch (*src)
+ {
+ case B_TXT_BUFF1:
+ if (gBattleTextBuff1[0] == B_BUFF_PLACEHOLDER_BEGIN)
+ {
+ ExpandBattleTextBuffPlaceholders(gBattleTextBuff1, gStringVar1);
+ toCpy = gStringVar1;
+ }
+ else
+ {
+ toCpy = TryGetStatusString(gBattleTextBuff1);
+ if (toCpy == NULL)
+ toCpy = gBattleTextBuff1;
+ }
+ break;
+ case B_TXT_BUFF2:
+ if (gBattleTextBuff2[0] == B_BUFF_PLACEHOLDER_BEGIN)
+ {
+ ExpandBattleTextBuffPlaceholders(gBattleTextBuff2, gStringVar2);
+ toCpy = gStringVar2;
+ }
+ else
+ toCpy = gBattleTextBuff2;
+ break;
+ case B_TXT_BUFF3:
+ if (gBattleTextBuff3[0] == B_BUFF_PLACEHOLDER_BEGIN)
+ {
+ ExpandBattleTextBuffPlaceholders(gBattleTextBuff3, gStringVar3);
+ toCpy = gStringVar3;
+ }
+ else
+ toCpy = gBattleTextBuff3;
+ break;
+ case B_TXT_COPY_VAR_1:
+ toCpy = gStringVar1;
+ break;
+ case B_TXT_COPY_VAR_2:
+ toCpy = gStringVar2;
+ break;
+ case B_TXT_COPY_VAR_3:
+ toCpy = gStringVar3;
+ break;
+ case B_TXT_PLAYER_MON1_NAME: // first player poke name
+ GetMonData(&gPlayerParty[gBattlePartyID[GetBankByIdentity(IDENTITY_PLAYER_MON1)]],
+ MON_DATA_NICKNAME, text);
+ StringGetEnd10(text);
+ toCpy = text;
+ break;
+ case B_TXT_OPPONENT_MON1_NAME: // first enemy poke name
+ GetMonData(&gEnemyParty[gBattlePartyID[GetBankByIdentity(IDENTITY_OPPONENT_MON1)]],
+ MON_DATA_NICKNAME, text);
+ StringGetEnd10(text);
+ toCpy = text;
+ break;
+ case B_TXT_PLAYER_MON2_NAME: // second player poke name
+ GetMonData(&gPlayerParty[gBattlePartyID[GetBankByIdentity(IDENTITY_PLAYER_MON2)]],
+ MON_DATA_NICKNAME, text);
+ StringGetEnd10(text);
+ toCpy = text;
+ break;
+ case B_TXT_OPPONENT_MON2_NAME: // second enemy poke name
+ GetMonData(&gEnemyParty[gBattlePartyID[GetBankByIdentity(IDENTITY_OPPONENT_MON2)]],
+ MON_DATA_NICKNAME, text);
+ StringGetEnd10(text);
+ toCpy = text;
+ break;
+ case B_TXT_LINK_PLAYER_MON1_NAME: // link first player poke name
+ GetMonData(&gPlayerParty[gBattlePartyID[gLinkPlayers[multiplayerID].lp_field_18]],
+ MON_DATA_NICKNAME, text);
+ StringGetEnd10(text);
+ toCpy = text;
+ break;
+ case B_TXT_LINK_OPPONENT_MON1_NAME: // link first opponent poke name
+ GetMonData(&gEnemyParty[gBattlePartyID[gLinkPlayers[multiplayerID].lp_field_18 ^ 1]],
+ MON_DATA_NICKNAME, text);
+ StringGetEnd10(text);
+ toCpy = text;
+ break;
+ case B_TXT_LINK_PLAYER_MON2_NAME: // link second player poke name
+ GetMonData(&gPlayerParty[gBattlePartyID[gLinkPlayers[multiplayerID].lp_field_18 ^ 2]],
+ MON_DATA_NICKNAME, text);
+ StringGetEnd10(text);
+ toCpy = text;
+ break;
+ case B_TXT_LINK_OPPONENT_MON2_NAME: // link second opponent poke name
+ GetMonData(&gEnemyParty[gBattlePartyID[gLinkPlayers[multiplayerID].lp_field_18 ^ 3]],
+ MON_DATA_NICKNAME, text);
+ StringGetEnd10(text);
+ toCpy = text;
+ break;
+ case B_TXT_ATK_NAME_WITH_PREFIX_MON1: // attacker name with prefix, only bank 0/1
+ HANDLE_NICKNAME_STRING_CASE(gBankAttacker,
+ gBattlePartyID[GetBankByIdentity(GET_BANK_SIDE(gBankAttacker))])
+ break;
+ case B_TXT_ATK_PARTNER_NAME: // attacker partner name
+ if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
+ GetMonData(&gPlayerParty[gBattlePartyID[GetBankByIdentity(GET_BANK_SIDE(gBankAttacker)) + 2]], MON_DATA_NICKNAME, text);
+ else
+ GetMonData(&gEnemyParty[gBattlePartyID[GetBankByIdentity(GET_BANK_SIDE(gBankAttacker)) + 2]], MON_DATA_NICKNAME, text);
+
+ StringGetEnd10(text);
+ toCpy = text;
+ break;
+ case B_TXT_ATK_NAME_WITH_PREFIX: // attacker name with prefix
+ HANDLE_NICKNAME_STRING_CASE(gBankAttacker, gBattlePartyID[gBankAttacker])
+ break;
+ case B_TXT_DEF_NAME_WITH_PREFIX: // target name with prefix
+ HANDLE_NICKNAME_STRING_CASE(gBankTarget, gBattlePartyID[gBankTarget])
+ break;
+ case B_TXT_EFF_NAME_WITH_PREFIX: // effect bank name with prefix
+ HANDLE_NICKNAME_STRING_CASE(gEffectBank, gBattlePartyID[gEffectBank])
+ break;
+ case B_TXT_ACTIVE_NAME_WITH_PREFIX: // active bank name with prefix
+ HANDLE_NICKNAME_STRING_CASE(gActiveBank, gBattlePartyID[gActiveBank])
+ break;
+ case B_TXT_SCR_ACTIVE_NAME_WITH_PREFIX: // scripting active bank name with prefix
+ HANDLE_NICKNAME_STRING_CASE(gBattleScripting.bank, gBattlePartyID[gBattleScripting.bank])
+ break;
+ case B_TXT_CURRENT_MOVE: // current move name
+ if (gStringInfo->currentMove > LAST_MOVE_INDEX)
+ toCpy = gText_UnknownMoveTypes[gBattleStruct->stringMoveType];
+ else
+ toCpy = gMoveNames[gStringInfo->currentMove];
+ break;
+ case B_TXT_LAST_MOVE: // last used move name
+ if (gStringInfo->lastMove > LAST_MOVE_INDEX)
+ toCpy = gText_UnknownMoveTypes[gBattleStruct->stringMoveType];
+ else
+ toCpy = gMoveNames[gStringInfo->lastMove];
+ break;
+ case B_TXT_LAST_ITEM: // last used item
+ if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
+ {
+ if (gLastUsedItem == ITEM_ENIGMA_BERRY)
+ {
+ if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))
+ {
+ if ((gBattleScripting.multiplayerId != 0 && (gStringBank & BIT_SIDE))
+ || (gBattleScripting.multiplayerId == 0 && !(gStringBank & BIT_SIDE)))
+ {
+ StringCopy(text, gEnigmaBerries[gStringBank].name);
+ StringAppend(text, gText_BerrySuffix);
+ toCpy = text;
+ }
+ else
+ {
+ toCpy = gText_EnigmaBerry;
+ }
+ }
+ else
+ {
+ if (gLinkPlayers[gBattleScripting.multiplayerId].lp_field_18 == gStringBank)
+ {
+ StringCopy(text, gEnigmaBerries[gStringBank].name);
+ StringAppend(text, gText_BerrySuffix);
+ toCpy = text;
+ }
+ else
+ toCpy = gText_EnigmaBerry;
+ }
+ }
+ else
+ {
+ CopyItemName(gLastUsedItem, text);
+ toCpy = text;
+ }
+ }
+ else
+ {
+ CopyItemName(gLastUsedItem, text);
+ toCpy = text;
+ }
+ break;
+ case B_TXT_LAST_ABILITY: // last used ability
+ toCpy = gAbilityNames[gLastUsedAbility];
+ break;
+ case B_TXT_ATK_ABILITY: // attacker ability
+ toCpy = gAbilityNames[gAbilitiesPerBank[gBankAttacker]];
+ break;
+ case B_TXT_DEF_ABILITY: // target ability
+ toCpy = gAbilityNames[gAbilitiesPerBank[gBankTarget]];
+ break;
+ case B_TXT_SCR_ACTIVE_ABILITY: // scripting active ability
+ toCpy = gAbilityNames[gAbilitiesPerBank[gBattleScripting.bank]];
+ break;
+ case B_TXT_EFF_ABILITY: // effect bank ability
+ toCpy = gAbilityNames[gAbilitiesPerBank[gEffectBank]];
+ break;
+ case B_TXT_TRAINER1_CLASS: // trainer class name
+ if (gBattleTypeFlags & BATTLE_TYPE_SECRET_BASE)
+ toCpy = gTrainerClassNames[GetSecretBaseTrainerNameIndex()];
+ else if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_C00)
+ toCpy = gTrainerClassNames[sub_8068BB0()];
+ else if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_3FE)
+ toCpy = gTrainerClassNames[sub_81A4D00()];
+ else if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER)
+ toCpy = gTrainerClassNames[GetFrontierOpponentClass(gTrainerBattleOpponent_A)];
+ else if (gBattleTypeFlags & BATTLE_TYPE_x4000000)
+ toCpy = gTrainerClassNames[sub_81D5530(gTrainerBattleOpponent_A)];
+ else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER)
+ toCpy = gTrainerClassNames[GetEreaderTrainerClassId()];
+ else
+ toCpy = gTrainerClassNames[gTrainers[gTrainerBattleOpponent_A].trainerClass];
+ break;
+ case B_TXT_TRAINER1_NAME: // trainer1 name
+ if (gBattleTypeFlags & BATTLE_TYPE_SECRET_BASE)
+ {
+ for (i = 0; i < (s32) ARRAY_COUNT(gBattleResources->secretBase->trainerName); i++)
+ text[i] = gBattleResources->secretBase->trainerName[i];
+ text[i] = EOS;
+ ConvertInternationalString(text, gBattleResources->secretBase->language);
+ toCpy = text;
+ }
+ else if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_C00)
+ {
+ toCpy = gLinkPlayers[multiplayerID ^ BIT_SIDE].name;
+ }
+ else if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_3FE)
+ {
+ sub_81A4D50(text);
+ toCpy = text;
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER)
+ {
+ GetFrontierTrainerName(text, gTrainerBattleOpponent_A);
+ toCpy = text;
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_x4000000)
+ {
+ sub_81D5554(text, gTrainerBattleOpponent_A);
+ toCpy = text;
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER)
+ {
+ GetEreaderTrainerName(text);
+ toCpy = text;
+ }
+ else
+ {
+ toCpy = gTrainers[gTrainerBattleOpponent_A].trainerName;
+ }
+ break;
+ case B_TXT_1E: // link player name?
+ toCpy = gLinkPlayers[multiplayerID].name;
+ break;
+ case B_TXT_1F: // link partner name?
+ toCpy = gLinkPlayers[sub_806D864(2 ^ gLinkPlayers[multiplayerID].lp_field_18)].name;
+ break;
+ case B_TXT_20: // link opponent 1 name?
+ toCpy = gLinkPlayers[sub_806D864(1 ^ gLinkPlayers[multiplayerID].lp_field_18)].name;
+ break;
+ case B_TXT_21: // link opponent 2 name?
+ toCpy = gLinkPlayers[sub_806D864(3 ^ gLinkPlayers[multiplayerID].lp_field_18)].name;
+ break;
+ case B_TXT_22: // link scripting active name
+ toCpy = gLinkPlayers[sub_806D864(gBattleScripting.bank)].name;
+ break;
+ case B_TXT_PLAYER_NAME: // player name
+ if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
+ toCpy = gLinkPlayers[0].name;
+ else
+ toCpy = gSaveBlock2Ptr->playerName;
+ break;
+ case B_TXT_TRAINER1_LOSE_TEXT: // trainerA lose text
+ if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER)
+ {
+ sub_81A36D0(2, gTrainerBattleOpponent_A);
+ toCpy = gStringVar4;
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_x4000000)
+ {
+ sub_81D572C(4, gTrainerBattleOpponent_A);
+ toCpy = gStringVar4;
+ }
+ else
+ {
+ toCpy = GetTrainer1LoseText();
+ }
+ break;
+ case B_TXT_TRAINER1_WIN_TEXT: // trainerA win text
+ if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER)
+ {
+ sub_81A36D0(1, gTrainerBattleOpponent_A);
+ toCpy = gStringVar4;
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_x4000000)
+ {
+ sub_81D572C(3, gTrainerBattleOpponent_A);
+ toCpy = gStringVar4;
+ }
+ break;
+ case B_TXT_26: // ?
+ HANDLE_NICKNAME_STRING_CASE(gBattleScripting.bank, *(&gBattleStruct->field_52))
+ break;
+ case B_TXT_PC_CREATOR_NAME: // lanette pc
+ if (FlagGet(SYS_PC_LANETTE))
+ toCpy = gText_Lanettes;
+ else
+ toCpy = gText_Someones;
+ break;
+ case B_TXT_ATK_PREFIX2:
+ if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
+ toCpy = gText_AllyPkmnPrefix2;
+ else
+ toCpy = gText_FoePkmnPrefix3;
+ break;
+ case B_TXT_DEF_PREFIX2:
+ if (GetBankSide(gBankTarget) == SIDE_PLAYER)
+ toCpy = gText_AllyPkmnPrefix2;
+ else
+ toCpy = gText_FoePkmnPrefix3;
+ break;
+ case B_TXT_ATK_PREFIX1:
+ if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
+ toCpy = gText_AllyPkmnPrefix;
+ else
+ toCpy = gText_FoePkmnPrefix2;
+ break;
+ case B_TXT_DEF_PREFIX1:
+ if (GetBankSide(gBankTarget) == SIDE_PLAYER)
+ toCpy = gText_AllyPkmnPrefix;
+ else
+ toCpy = gText_FoePkmnPrefix2;
+ break;
+ case B_TXT_ATK_PREFIX3:
+ if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
+ toCpy = gText_AllyPkmnPrefix3;
+ else
+ toCpy = gText_FoePkmnPrefix4;
+ break;
+ case B_TXT_DEF_PREFIX3:
+ if (GetBankSide(gBankTarget) == SIDE_PLAYER)
+ toCpy = gText_AllyPkmnPrefix3;
+ else
+ toCpy = gText_FoePkmnPrefix4;
+ break;
+ case B_TXT_TRAINER2_CLASS:
+ if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER)
+ toCpy = gTrainerClassNames[GetFrontierOpponentClass(gTrainerBattleOpponent_B)];
+ else if (gBattleTypeFlags & BATTLE_TYPE_x4000000)
+ toCpy = gTrainerClassNames[sub_81D5530(gTrainerBattleOpponent_B)];
+ else
+ toCpy = gTrainerClassNames[gTrainers[gTrainerBattleOpponent_B].trainerClass];
+ break;
+ case B_TXT_TRAINER2_NAME:
+ if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER)
+ {
+ GetFrontierTrainerName(text, gTrainerBattleOpponent_B);
+ toCpy = text;
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_x4000000)
+ {
+ sub_81D5554(text, gTrainerBattleOpponent_B);
+ toCpy = text;
+ }
+ else
+ {
+ toCpy = gTrainers[gTrainerBattleOpponent_B].trainerName;
+ }
+ break;
+ case B_TXT_TRAINER2_LOSE_TEXT:
+ if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER)
+ {
+ sub_81A36D0(2, gTrainerBattleOpponent_B);
+ toCpy = gStringVar4;
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_x4000000)
+ {
+ sub_81D572C(4, gTrainerBattleOpponent_B);
+ toCpy = gStringVar4;
+ }
+ else
+ {
+ toCpy = GetTrainer2LoseText();
+ }
+ break;
+ case B_TXT_TRAINER2_WIN_TEXT:
+ if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER)
+ {
+ sub_81A36D0(1, gTrainerBattleOpponent_B);
+ toCpy = gStringVar4;
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_x4000000)
+ {
+ sub_81D572C(3, gTrainerBattleOpponent_B);
+ toCpy = gStringVar4;
+ }
+ break;
+ case B_TXT_PARTNER_CLASS:
+ toCpy = gTrainerClassNames[GetFrontierOpponentClass(gPartnerTrainerId)];
+ break;
+ case B_TXT_PARTNER_NAME:
+ GetFrontierTrainerName(text, gPartnerTrainerId);
+ toCpy = text;
+ break;
+ }
+
+ // missing if (toCpy != NULL) check
+ while (*toCpy != EOS)
+ {
+ dst[dstID] = *toCpy;
+ dstID++;
+ toCpy++;
+ }
+ if (*src == B_TXT_TRAINER1_LOSE_TEXT || *src == B_TXT_TRAINER2_LOSE_TEXT
+ || *src == B_TXT_TRAINER1_WIN_TEXT || *src == B_TXT_TRAINER2_WIN_TEXT)
+ {
+ dst[dstID] = EXT_CTRL_CODE_BEGIN;
+ dstID++;
+ dst[dstID] = 9;
+ dstID++;
+ }
+ }
+ else
+ {
+ dst[dstID] = *src;
+ dstID++;
+ }
+ src++;
+ }
+
+ dst[dstID] = *src;
+ dstID++;
+
+ return dstID;
+}
+
+// TODO: move these to a general header like util.h
+#define ByteRead16(ptr) ((ptr)[0] | ((ptr)[1] << 8))
+#define ByteRead32(ptr) ((ptr)[0] | (ptr)[1] << 8 | (ptr)[2] << 16 | (ptr)[3] << 24)
+
+static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst)
+{
+ u32 srcID = 1;
+ u32 value = 0;
+ u8 text[12];
+ u16 hword;
+
+ *dst = EOS;
+ while (src[srcID] != B_BUFF_EOS)
+ {
+ switch (src[srcID])
+ {
+ case B_BUFF_STRING: // battle string
+ hword = ByteRead16(&src[srcID + 1]);
+ StringAppend(dst, gBattleStringsTable[hword - BATTLESTRINGS_ID_ADDER]);
+ srcID += 3;
+ break;
+ case B_BUFF_NUMBER: // int to string
+ switch (src[srcID + 1])
+ {
+ case 1:
+ value = src[srcID + 3];
+ break;
+ case 2:
+ value = ByteRead16(&src[srcID + 3]);
+ break;
+ case 4:
+ value = ByteRead32(&src[srcID + 3]);
+ break;
+ }
+ ConvertIntToDecimalStringN(dst, value, 0, src[srcID + 2]);
+ srcID += src[srcID + 1] + 3;
+ break;
+ case B_BUFF_MOVE: // move name
+ StringAppend(dst, gMoveNames[ByteRead16(&src[srcID + 1])]);
+ srcID += 3;
+ break;
+ case B_BUFF_TYPE: // type name
+ StringAppend(dst, gTypeNames[src[srcID + 1]]);
+ srcID += 2;
+ break;
+ case B_BUFF_MON_NICK_WITH_PREFIX: // poke nick with prefix
+ if (GetBankSide(src[srcID + 1]) == SIDE_PLAYER)
+ {
+ GetMonData(&gPlayerParty[src[srcID + 2]], MON_DATA_NICKNAME, text);
+ }
+ else
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
+ StringAppend(dst, gText_FoePkmnPrefix);
+ else
+ StringAppend(dst, gText_WildPkmnPrefix);
+
+ GetMonData(&gEnemyParty[src[srcID + 2]], MON_DATA_NICKNAME, text);
+ }
+ StringGetEnd10(text);
+ StringAppend(dst, text);
+ srcID += 3;
+ break;
+ case B_BUFF_STAT: // stats
+ StringAppend(dst, gStatNamesTable[src[srcID + 1]]);
+ srcID += 2;
+ break;
+ case B_BUFF_SPECIES: // species name
+ GetSpeciesName(dst, ByteRead16(&src[srcID + 1]));
+ srcID += 3;
+ break;
+ case B_BUFF_MON_NICK: // poke nick without prefix
+ if (GetBankSide(src[srcID + 1]) == SIDE_PLAYER)
+ GetMonData(&gPlayerParty[src[srcID + 2]], MON_DATA_NICKNAME, dst);
+ else
+ GetMonData(&gEnemyParty[src[srcID + 2]], MON_DATA_NICKNAME, dst);
+ StringGetEnd10(dst);
+ srcID += 3;
+ break;
+ case B_BUFF_NEGATIVE_FLAVOUR: // flavour table
+ StringAppend(dst, gPokeblockWasTooXStringTable[src[srcID + 1]]);
+ srcID += 2;
+ break;
+ case B_BUFF_ABILITY: // ability names
+ StringAppend(dst, gAbilityNames[src[srcID + 1]]);
+ srcID += 2;
+ break;
+ case B_BUFF_ITEM: // item name
+ hword = ByteRead16(&src[srcID + 1]);
+ if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
+ {
+ if (hword == ITEM_ENIGMA_BERRY)
+ {
+ if (gLinkPlayers[gBattleScripting.multiplayerId].lp_field_18 == gStringBank)
+ {
+ StringCopy(dst, gEnigmaBerries[gStringBank].name);
+ StringAppend(dst, gText_BerrySuffix);
+ }
+ else
+ StringAppend(dst, gText_EnigmaBerry);
+ }
+ else
+ CopyItemName(hword, dst);
+ }
+ else
+ CopyItemName(hword, dst);
+ srcID += 3;
+ break;
+ }
+ }
+}
+
+static void sub_814F8F8(u8* textBuff)
+{
+ s32 counter = 0;
+ u32 i = 0;
+
+ while (counter != 4)
+ {
+ if (sUnknownMoveTable[i] == MOVE_NONE)
+ counter++;
+ if (sUnknownMoveTable[i++] == gStringInfo->currentMove)
+ break;
+ }
+
+ if (counter >= 0)
+ {
+ if (counter <= 2)
+ StringCopy(textBuff, gText_SpaceIs); // is
+ else if (counter <= 4)
+ StringCopy(textBuff, gText_ApostropheS); // 's
+ }
+}
+
+static void sub_814F950(u8* dst)
+{
+ s32 counter = 0;
+ s32 i = 0;
+
+ while (*dst != EOS)
+ dst++;
+
+ while (counter != 4)
+ {
+ if (sUnknownMoveTable[i] == MOVE_NONE)
+ counter++;
+ if (sUnknownMoveTable[i++] == gStringInfo->currentMove)
+ break;
+ }
+
+ switch (counter)
+ {
+ case 0:
+ StringCopy(dst, gText_ExclamationMark);
+ break;
+ case 1:
+ StringCopy(dst, gText_ExclamationMark2);
+ break;
+ case 2:
+ StringCopy(dst, gText_ExclamationMark3);
+ break;
+ case 3:
+ StringCopy(dst, gText_ExclamationMark4);
+ break;
+ case 4:
+ StringCopy(dst, gText_ExclamationMark5);
+ break;
+ }
+}
+
+void sub_814F9EC(const u8 *text, u8 arg1)
+{
+ const u8 *r8 = gUnknown_085CD660[gBattleScripting.field_24];
+ bool32 r9;
+ struct TextSubPrinter textSubPrinter;
+ u8 speed;
+
+ if (arg1 & 0x80)
+ {
+ arg1 &= ~(0x80);
+ r9 = FALSE;
+ }
+ else
+ {
+ FillWindowPixelBuffer(arg1, r8[12 * arg1]);
+ r9 = TRUE;
+ }
+
+ textSubPrinter.current_text_offset = text;
+ textSubPrinter.windowId = arg1;
+ textSubPrinter.fontId = r8[(12 * arg1) + 1];
+ textSubPrinter.x = r8[(12 * arg1) + 2];
+ textSubPrinter.y = r8[(12 * arg1) + 3];
+ textSubPrinter.currentX = textSubPrinter.x;
+ textSubPrinter.currentY = textSubPrinter.y;
+ textSubPrinter.letterSpacing = r8[(12 * arg1) + 4];
+ textSubPrinter.lineSpacing = r8[(12 * arg1) + 5];
+ textSubPrinter.fontColor_l = 0;
+ textSubPrinter.fontColor_h = r8[(12 * arg1) + 7];
+ textSubPrinter.bgColor = r8[(12 * arg1) + 8];
+ textSubPrinter.shadowColor = r8[(12 * arg1) + 9];
+
+ if (textSubPrinter.x == 0xFF)
+ {
+ s32 var2;
+ u32 var = sub_80397C4(gBattleScripting.field_24, arg1);
+ var2 = GetStringCenterAlignXOffsetWithLetterSpacing(textSubPrinter.fontId, textSubPrinter.current_text_offset, var, textSubPrinter.letterSpacing);
+ textSubPrinter.x = textSubPrinter.currentX = var2;
+ }
+
+ if (arg1 == 0x16)
+ gTextFlags.flag_1 = 0;
+ else
+ gTextFlags.flag_1 = 1;
+
+ if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED))
+ gTextFlags.flag_2 = 1;
+ else
+ gTextFlags.flag_2 = 0;
+
+ if (arg1 == 0 || arg1 == 0x16)
+ {
+ if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
+ speed = 1;
+ else if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
+ speed = sRecordedBattleTextSpeeds[sub_8185FC4()];
+ else
+ speed = sav2_get_text_speed();
+
+ gTextFlags.flag_0 = 1;
+ }
+ else
+ {
+ speed = r8[(12 * arg1) + 6];
+ gTextFlags.flag_0 = 0;
+ }
+
+ AddTextPrinter(&textSubPrinter, speed, NULL);
+
+ if (r9)
+ {
+ PutWindowTilemap(arg1);
+ CopyWindowToVram(arg1, 3);
+ }
+}
+
+void SetPpNumbersPaletteInMoveSelection(void)
+{
+ struct ChooseMoveStruct *chooseMoveStruct = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBank][4]);
+ const u16 *palPtr = gUnknown_08D85620;
+ u8 var = GetCurrentPpToMaxPpState(chooseMoveStruct->currentPp[gMoveSelectionCursor[gActiveBank]],
+ chooseMoveStruct->maxPp[gMoveSelectionCursor[gActiveBank]]);
+
+ gPlttBufferUnfaded[92] = palPtr[(var * 2) + 0];
+ gPlttBufferUnfaded[91] = palPtr[(var * 2) + 1];
+
+ CpuCopy16(&gPlttBufferUnfaded[92], &gPlttBufferFaded[92], sizeof(u16));
+ CpuCopy16(&gPlttBufferUnfaded[91], &gPlttBufferFaded[91], sizeof(u16));
+}
+
+u8 GetCurrentPpToMaxPpState(u8 currentPp, u8 maxPp)
+{
+ if (maxPp == currentPp)
+ {
+ return 3;
+ }
+ else if (maxPp <= 2)
+ {
+ if (currentPp > 1)
+ return 3;
+ else
+ return 2 - currentPp;
+ }
+ else if (maxPp <= 7)
+ {
+ if (currentPp > 2)
+ return 3;
+ else
+ return 2 - currentPp;
+ }
+ else
+ {
+ if (currentPp == 0)
+ return 2;
+ if (currentPp <= maxPp / 4)
+ return 1;
+ if (currentPp > maxPp / 2)
+ return 3;
+ }
+
+ return 0;
+}
diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c
index e53292442..fb6a8272b 100644
--- a/src/battle_script_commands.c
+++ b/src/battle_script_commands.c
@@ -34,6 +34,7 @@
#include "pokemon_storage_system.h"
#include "task.h"
#include "naming_screen.h"
+#include "battle_string_ids.h"
// variables
@@ -1375,7 +1376,7 @@ static void atk02_attackstring(void)
return;
if (!(gHitMarker & (HITMARKER_NO_ATTACKSTRING | HITMARKER_ATTACKSTRING_PRINTED)))
{
- PrepareStringBattle(4, gBankAttacker);
+ PrepareStringBattle(STRINGID_USEDMOVE, gBankAttacker);
gHitMarker |= HITMARKER_ATTACKSTRING_PRINTED;
}
gBattlescriptCurrInstr++;
@@ -1771,11 +1772,11 @@ u8 TypeCalc(u16 move, u8 bankAtk, u8 bankDef)
return flags;
}
-u8 AI_TypeCalc(u16 move, u16 species, u8 ability)
+u8 AI_TypeCalc(u16 move, u16 targetSpecies, u8 targetAbility)
{
s32 i = 0;
u8 flags = 0;
- u8 type1 = gBaseStats[species].type1, type2 = gBaseStats[species].type2;
+ u8 type1 = gBaseStats[targetSpecies].type1, type2 = gBaseStats[targetSpecies].type2;
u8 moveType;
if (move == MOVE_STRUGGLE)
@@ -1783,7 +1784,7 @@ u8 AI_TypeCalc(u16 move, u16 species, u8 ability)
moveType = gBattleMoves[move].type;
- if (ability == ABILITY_LEVITATE && moveType == TYPE_GROUND)
+ if (targetAbility == ABILITY_LEVITATE && moveType == TYPE_GROUND)
{
flags = MOVESTATUS_MISSED | MOVESTATUS_NOTAFFECTED;
}
@@ -1808,7 +1809,7 @@ u8 AI_TypeCalc(u16 move, u16 species, u8 ability)
i += 3;
}
}
- if (ability == ABILITY_WONDER_GUARD
+ if (targetAbility == ABILITY_WONDER_GUARD
&& (!(flags & MOVESTATUS_SUPEREFFECTIVE) || ((flags & (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE)) == (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE)))
&& gBattleMoves[move].power)
flags |= MOVESTATUS_NOTAFFECTED;
@@ -2000,7 +2001,7 @@ static void atk0B_healthbarupdate(void)
if (gBattleMons[gActiveBank].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBank].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE))
{
- PrepareStringBattle(0x80, gActiveBank);
+ PrepareStringBattle(STRINGID_SUBSTITUTEDAMAGED, gActiveBank);
}
else
{
@@ -2157,7 +2158,7 @@ static void atk0D_critmessage(void)
{
if (gCritMultiplier == 2 && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT))
{
- PrepareStringBattle(0xD9, gBankAttacker);
+ PrepareStringBattle(STRINGID_CRITICALHIT, gBankAttacker);
gBattleCommunication[MSG_DISPLAY] = 1;
}
gBattlescriptCurrInstr++;
@@ -2229,22 +2230,22 @@ static void atk0F_resultmessage(void)
switch (gBattleMoveFlags & (u8)(~(MOVESTATUS_MISSED)))
{
case MOVESTATUS_SUPEREFFECTIVE:
- stringId = 0xDE;
+ stringId = STRINGID_SUPEREFFECTIVE;
break;
case MOVESTATUS_NOTVERYEFFECTIVE:
- stringId = 0xDD;
+ stringId = STRINGID_NOTVERYEFFECTIVE;
break;
case MOVESTATUS_ONEHITKO:
- stringId = 0xDA;
+ stringId = STRINGID_ONEHITKO;
break;
case MOVESTATUS_ENDURED:
- stringId = 0x99;
+ stringId = STRINGID_PKMNENDUREDHIT;
break;
case MOVESTATUS_FAILED:
- stringId = 0xE5;
+ stringId = STRINGID_BUTITFAILED;
break;
case MOVESTATUS_NOTAFFECTED:
- stringId = 0x1B;
+ stringId = STRINGID_ITDOESNTAFFECT;
break;
case MOVESTATUS_HUNGON:
gLastUsedItem = gBattleMons[gBankTarget].item;
@@ -2256,7 +2257,7 @@ static void atk0F_resultmessage(void)
default:
if (gBattleMoveFlags & MOVESTATUS_NOTAFFECTED)
{
- stringId = 0x1B;
+ stringId = STRINGID_ITDOESNTAFFECT;
}
else if (gBattleMoveFlags & MOVESTATUS_ONEHITKO)
{
@@ -2285,7 +2286,7 @@ static void atk0F_resultmessage(void)
}
else if (gBattleMoveFlags & MOVESTATUS_FAILED)
{
- stringId = 0xE5;
+ stringId = STRINGID_BUTITFAILED;
}
else
{
@@ -3592,7 +3593,7 @@ static void atk23_getexp(void)
PREPARE_WORD_NUMBER_BUFFER(gBattleTextBuff3, 5, gBattleMoveDamage)
- PrepareStringBattle(0xD, gBattleStruct->expGetterBank);
+ PrepareStringBattle(STRINGID_PKMNGAINEDEXP, gBattleStruct->expGetterBank);
MonGainEVs(&gPlayerParty[gBattleStruct->expGetterId], gBattleMons[gBank1].species);
}
gBattleStruct->sentInPokes >>= 1;
@@ -6181,7 +6182,7 @@ static void atk5A_yesnoboxlearnmove(void)
u16 moveId = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_MOVE1 + movePosition);
if (IsHMMove2(moveId))
{
- PrepareStringBattle(0x13F, gActiveBank);
+ PrepareStringBattle(STRINGID_HMMOVESCANTBEFORGOTTEN, gActiveBank);
gBattleScripting.learnMoveState = 6;
}
else
@@ -11086,7 +11087,7 @@ static void atkEF_pokeball_catch_calculation(void)
{
if (gLastUsedItem == ITEM_MASTER_BALL)
{
- gBattleResults.unk5_1 = 1;
+ gBattleResults.usedMasterBall = TRUE;
}
else
{
diff --git a/src/battle_util.c b/src/battle_util.c
index c6762dd99..0a0badb33 100644
--- a/src/battle_util.c
+++ b/src/battle_util.c
@@ -132,6 +132,8 @@ extern const u8 BattleScript_MoveHPDrain[];
extern const u8 BattleScript_MoveHPDrain_PPLoss[];
extern const u8 BattleScript_FlashFireBoost[];
extern const u8 BattleScript_FlashFireBoost_PPLoss[];
+extern const u8 gUnknown_082DB592[];
+extern const u8 gUnknown_082DB591[];
extern const u8 BattleScript_ColorChangeActivates[];
extern const u8 BattleScript_RoughSkinActivates[];
extern const u8 BattleScript_ApplySecondaryEffect[];
@@ -353,7 +355,7 @@ void sub_803F850(u8 arg0)
{
s32 i;
- for (i = 0; i < sub_8009FCC(); i++)
+ for (i = 0; i < GetLinkPlayerCount(); i++)
gBattleExecBuffer |= gBitTable[arg0] << (i << 2);
gBattleExecBuffer &= ~(0x10000000 << arg0);
@@ -1859,13 +1861,12 @@ u8 CastformDataTypeChange(u8 bank)
return formChange;
}
-// We meet again, ABE.
-#ifdef NONMATCHING
+// The largest function in the game, but even it could not save itself from decompiling.
u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
{
u8 effect = 0;
- struct Pokemon* pokeAtk;
- struct Pokemon* pokeDef;
+ struct Pokemon *pokeAtk;
+ struct Pokemon *pokeDef;
u16 speciesAtk;
u16 speciesDef;
u32 pidAtk;
@@ -1893,12 +1894,11 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) // why isn't that check done at the beginning?
{
- int i; // r4
+ u8 moveType;
+ s32 i;
u16 move;
- // Hmm...
- #define moveType moveArg
- //u16 moveType;
u8 side;
+ u8 target1;
if (special)
gLastUsedAbility = special;
@@ -1918,44 +1918,45 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
switch (caseID)
{
case ABILITYEFFECT_ON_SWITCHIN: // 0
- //_08042A18
if (gBankAttacker >= gNoOfAllBanks)
gBankAttacker = bank;
switch (gLastUsedAbility)
{
case ABILITYEFFECT_SWITCH_IN_WEATHER:
- //_08042A86
- switch (weather_get_current())
+ if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED))
{
- case 3:
- case 5:
- case 13:
- if (!(gBattleWeather & WEATHER_RAIN_ANY))
- {
- gBattleWeather = (WEATHER_RAIN_TEMPORARY | WEATHER_RAIN_PERMANENT);
- gBattleScripting.animArg1 = 0xA;
- gBattleScripting.bank = bank;
- effect++;
- }
- break;
- case 8:
- if (!(gBattleWeather & WEATHER_SANDSTORM_ANY))
- {
- gBattleWeather = (WEATHER_SANDSTORM_PERMANENT | WEATHER_SANDSTORM_TEMPORARY);
- gBattleScripting.animArg1 = 0xC;
- gBattleScripting.bank = bank;
- effect++;
- }
- break;
- case 12:
- if (!(gBattleWeather & WEATHER_SUN_ANY))
+ switch (weather_get_current())
{
- gBattleWeather = (WEATHER_SUN_PERMANENT | WEATHER_SUN_TEMPORARY);
- gBattleScripting.animArg1 = 0xB;
- gBattleScripting.bank = bank;
- effect++;
+ case 3:
+ case 5:
+ case 13:
+ if (!(gBattleWeather & WEATHER_RAIN_ANY))
+ {
+ gBattleWeather = (WEATHER_RAIN_TEMPORARY | WEATHER_RAIN_PERMANENT);
+ gBattleScripting.animArg1 = B_ANIM_RAIN_CONTINUES;
+ gBattleScripting.bank = bank;
+ effect++;
+ }
+ break;
+ case 8:
+ if (!(gBattleWeather & WEATHER_SANDSTORM_ANY))
+ {
+ gBattleWeather = (WEATHER_SANDSTORM_PERMANENT | WEATHER_SANDSTORM_TEMPORARY);
+ gBattleScripting.animArg1 = B_ANIM_SANDSTORM_CONTINUES;
+ gBattleScripting.bank = bank;
+ effect++;
+ }
+ break;
+ case 12:
+ if (!(gBattleWeather & WEATHER_SUN_ANY))
+ {
+ gBattleWeather = (WEATHER_SUN_PERMANENT | WEATHER_SUN_TEMPORARY);
+ gBattleScripting.animArg1 = B_ANIM_SUN_CONTINUES;
+ gBattleScripting.bank = bank;
+ effect++;
+ }
+ break;
}
- break;
}
if (effect)
{
@@ -1964,7 +1965,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITY_DRIZZLE:
- //_08042B78
if (!(gBattleWeather & WEATHER_RAIN_PERMANENT))
{
gBattleWeather = (WEATHER_RAIN_PERMANENT | WEATHER_RAIN_TEMPORARY);
@@ -1974,7 +1974,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITY_SAND_STREAM:
- //_08042BA8
if (!(gBattleWeather & WEATHER_SANDSTORM_PERMANENT))
{
gBattleWeather = (WEATHER_SANDSTORM_PERMANENT | WEATHER_SANDSTORM_TEMPORARY);
@@ -1984,7 +1983,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITY_DROUGHT:
- //_08042BD8
if (!(gBattleWeather & WEATHER_SUN_PERMANENT))
{
gBattleWeather = (WEATHER_SUN_PERMANENT | WEATHER_SUN_TEMPORARY);
@@ -1994,7 +1992,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITY_INTIMIDATE:
- //_08042C08
if (!(gSpecialStatuses[bank].intimidatedPoke))
{
gStatuses3[bank] |= STATUS3_INTIMIDATE_POKES;
@@ -2002,13 +1999,12 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITY_FORECAST:
- //_08042C3C
effect = CastformDataTypeChange(bank);
if (effect != 0)
{
BattleScriptPushCursorAndCallback(BattleScript_CastformChange);
gBattleScripting.bank = bank;
- gBattleStruct->formToChangeInto = effect - 1;
+ *(&gBattleStruct->formToChangeInto) = effect - 1;
}
break;
case ABILITY_TRACE:
@@ -2021,18 +2017,15 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
case ABILITY_CLOUD_NINE:
case ABILITY_AIR_LOCK:
{
- u8 i;
-
- for (i = 0; i < gNoOfAllBanks; i++)
+ // that's a weird choice for a variable, why not use i or bank?
+ for (target1 = 0; target1 < gNoOfAllBanks; target1++)
{
- // TODO: i should be in r6 here
- //asm("":::"r4","r5");
- effect = CastformDataTypeChange(i);
+ effect = CastformDataTypeChange(target1);
if (effect != 0)
{
BattleScriptPushCursorAndCallback(BattleScript_CastformChange);
- gBattleScripting.bank = i;
- gBattleStruct->formToChangeInto = effect - 1;
+ gBattleScripting.bank = target1;
+ *(&gBattleStruct->formToChangeInto) = effect - 1;
break;
}
}
@@ -2041,18 +2034,16 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITYEFFECT_ENDTURN: // 1
- //_08042CDC
if (gBattleMons[bank].hp != 0)
{
gBankAttacker = bank;
switch (gLastUsedAbility)
{
case ABILITY_RAIN_DISH:
- //_08042D22
if (WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_RAIN_ANY)
&& gBattleMons[bank].maxHP > gBattleMons[bank].hp)
{
- gLastUsedAbility = ABILITY_RAIN_DISH; //why
+ gLastUsedAbility = ABILITY_RAIN_DISH; // why
BattleScriptPushCursorAndCallback(BattleScript_RainDishActivates);
gBattleMoveDamage = gBattleMons[bank].maxHP / 16;
if (gBattleMoveDamage == 0)
@@ -2062,7 +2053,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITY_SHED_SKIN:
- //_08042DA0
if ((gBattleMons[bank].status1 & STATUS_ANY) && (Random() % 3) == 0)
{
if (gBattleMons[bank].status1 & (STATUS_POISON | STATUS_TOXIC_POISON))
@@ -2076,7 +2066,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
if (gBattleMons[bank].status1 & STATUS_FREEZE)
StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn);
gBattleMons[bank].status1 = 0;
- gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE); // fix nighmare glitch
+ gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE); // fix nightmare glitch
gBattleScripting.bank = gActiveBank = bank;
BattleScriptPushCursorAndCallback(BattleScript_ShedSkinActivates);
EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[bank].status1);
@@ -2085,7 +2075,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITY_SPEED_BOOST:
- //_08042E84
if (gBattleMons[bank].statStages[STAT_STAGE_SPEED] < 0xC && gDisableStructs[bank].isFirstTurn != 2)
{
gBattleMons[bank].statStages[STAT_STAGE_SPEED]++;
@@ -2103,7 +2092,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITYEFFECT_MOVES_BLOCK: // 2
- //_08042EF8
if (gLastUsedAbility == ABILITY_SOUNDPROOF)
{
for (i = 0; sSoundMovesTable[i] != 0xFFFF; i++)
@@ -2132,6 +2120,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
gBattlescriptCurrInstr = BattleScript_MoveHPDrain;
else
gBattlescriptCurrInstr = BattleScript_MoveHPDrain_PPLoss;
+
effect = 1;
}
break;
@@ -2142,11 +2131,11 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
gBattlescriptCurrInstr = BattleScript_MoveHPDrain;
else
gBattlescriptCurrInstr = BattleScript_MoveHPDrain_PPLoss;
+
effect = 1;
}
break;
case ABILITY_FLASH_FIRE:
- //_0804305C
if (moveType == TYPE_FIRE && !(gBattleMons[bank].status1 & STATUS_FREEZE))
{
if (!(gBattleResources->flags->flags[bank] & UNKNOWN_FLAG_FLASH_FIRE))
@@ -2156,6 +2145,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
gBattlescriptCurrInstr = BattleScript_FlashFireBoost;
else
gBattlescriptCurrInstr = BattleScript_FlashFireBoost_PPLoss;
+
gBattleResources->flags->flags[bank] |= UNKNOWN_FLAG_FLASH_FIRE;
effect = 2;
}
@@ -2166,6 +2156,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
gBattlescriptCurrInstr = BattleScript_FlashFireBoost;
else
gBattlescriptCurrInstr = BattleScript_FlashFireBoost_PPLoss;
+
effect = 2;
}
}
@@ -2176,9 +2167,9 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
if (gBattleMons[bank].maxHP == gBattleMons[bank].hp)
{
if ((gProtectStructs[gBankAttacker].notFirstStrike))
- gBattlescriptCurrInstr = BattleScript_MoveHPDrain;
+ gBattlescriptCurrInstr = gUnknown_082DB592;
else
- gBattlescriptCurrInstr = BattleScript_MoveHPDrain_PPLoss;
+ gBattlescriptCurrInstr = gUnknown_082DB591;
}
else
{
@@ -2191,11 +2182,9 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITYEFFECT_CONTACT: // 4
- //_080431AC
switch (gLastUsedAbility)
{
case ABILITY_COLOR_CHANGE:
- //_08043288
if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)
&& move != MOVE_STRUGGLE
&& gBattleMoves[move].power != 0
@@ -2206,17 +2195,13 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
{
gBattleMons[bank].type1 = moveType;
gBattleMons[bank].type2 = moveType;
- gBattleTextBuff1[0] = 0xFD;
- gBattleTextBuff1[1] = 3;
- gBattleTextBuff1[2] = moveType;
- gBattleTextBuff1[3] = 0xFF;
+ PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType)
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_ColorChangeActivates;
effect++;
}
break;
case ABILITY_ROUGH_SKIN:
- //_08043350
if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)
&& gBattleMons[gBankAttacker].hp != 0
&& !gProtectStructs[gBankAttacker].confusionSelfDmg
@@ -2232,7 +2217,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITY_EFFECT_SPORE:
- //_08043410
if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)
&& gBattleMons[gBankAttacker].hp != 0
&& !gProtectStructs[gBankAttacker].confusionSelfDmg
@@ -2244,9 +2228,11 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
{
gBattleCommunication[MOVE_EFFECT_BYTE] = Random() & 3;
} while (gBattleCommunication[MOVE_EFFECT_BYTE] == 0);
- if (gBattleCommunication[MOVE_EFFECT_BYTE] == 3)
- gBattleCommunication[MOVE_EFFECT_BYTE] += 2;
- gBattleCommunication[MOVE_EFFECT_BYTE] += 0x40;
+
+ if (gBattleCommunication[MOVE_EFFECT_BYTE] == MOVE_EFFECT_BURN)
+ gBattleCommunication[MOVE_EFFECT_BYTE] += 2; // 5 MOVE_EFFECT_PARALYSIS
+
+ gBattleCommunication[MOVE_EFFECT_BYTE] += MOVE_EFFECT_AFFECTS_USER;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect;
gHitMarker |= HITMARKER_IGNORE_SAFEGUARD;
@@ -2261,7 +2247,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
&& (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)
&& (Random() % 3) == 0)
{
- gBattleCommunication[MOVE_EFFECT_BYTE] = 0x42;
+ gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_POISON;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect;
gHitMarker |= HITMARKER_IGNORE_SAFEGUARD;
@@ -2276,7 +2262,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
&& (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)
&& (Random() % 3) == 0)
{
- gBattleCommunication[MOVE_EFFECT_BYTE] = 0x45;
+ gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_PARALYSIS;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect;
gHitMarker |= HITMARKER_IGNORE_SAFEGUARD;
@@ -2291,7 +2277,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
&& (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special)
&& (Random() % 3) == 0)
{
- gBattleCommunication[MOVE_EFFECT_BYTE] = 0x43;
+ gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_BURN;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect;
gHitMarker |= HITMARKER_IGNORE_SAFEGUARD;
@@ -2299,7 +2285,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITY_CUTE_CHARM:
- //_0804379C
if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)
&& gBattleMons[gBankAttacker].hp != 0
&& !gProtectStructs[gBankAttacker].confusionSelfDmg
@@ -2310,10 +2295,10 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
&& gBattleMons[gBankAttacker].ability != ABILITY_OBLIVIOUS
&& GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != GetGenderFromSpeciesAndPersonality(speciesDef, pidDef)
&& !(gBattleMons[gBankAttacker].status2 & STATUS2_INFATUATION)
- && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != 0xFF
- && GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) != 0xFF)
+ && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != MON_GENDERLESS
+ && GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) != MON_GENDERLESS)
{
- gBattleMons[gBankAttacker].status2 |= (gBitTable[gBankTarget] << 0x10);
+ gBattleMons[gBankAttacker].status2 |= STATUS2_INFATUATED_WITH(gBankTarget);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_CuteCharmActivates;
effect++;
@@ -2323,28 +2308,26 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
break;
case ABILITYEFFECT_IMMUNITY: // 5
{
- #define i bank
- for (i = 0; i < gNoOfAllBanks; i++)
+ for (bank = 0; bank < gNoOfAllBanks; bank++)
{
- switch (gBattleMons[i].ability)
+ switch (gBattleMons[bank].ability)
{
case ABILITY_IMMUNITY:
- if (gBattleMons[i].status1 & (STATUS_POISON | STATUS_TOXIC_POISON | 0xF00)) // TODO: what is 0xF00?
+ if (gBattleMons[bank].status1 & (STATUS_POISON | STATUS_TOXIC_POISON | STATUS_TOXIC_COUNTER))
{
StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn);
effect = 1;
}
break;
case ABILITY_OWN_TEMPO:
- //_08043A7C
- if (gBattleMons[i].status2 & STATUS2_CONFUSION)
+ if (gBattleMons[bank].status2 & STATUS2_CONFUSION)
{
StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn);
effect = 2;
}
break;
case ABILITY_LIMBER:
- if (gBattleMons[i].status1 & STATUS_PARALYSIS)
+ if (gBattleMons[bank].status1 & STATUS_PARALYSIS)
{
StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn);
effect = 1;
@@ -2352,30 +2335,29 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
break;
case ABILITY_INSOMNIA:
case ABILITY_VITAL_SPIRIT:
- if (gBattleMons[i].status1 & STATUS_SLEEP)
+ if (gBattleMons[bank].status1 & STATUS_SLEEP)
{
- gBattleMons[i].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE);
StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn);
effect = 1;
}
break;
case ABILITY_WATER_VEIL:
- if (gBattleMons[i].status1 & STATUS_BURN)
+ if (gBattleMons[bank].status1 & STATUS_BURN)
{
StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn);
effect = 1;
}
break;
case ABILITY_MAGMA_ARMOR:
- if (gBattleMons[i].status1 & STATUS_FREEZE)
+ if (gBattleMons[bank].status1 & STATUS_FREEZE)
{
StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn);
effect = 1;
}
break;
case ABILITY_OBLIVIOUS:
- //_08043B70
- if (gBattleMons[i].status2 & STATUS2_INFATUATION)
+ if (gBattleMons[bank].status2 & STATUS2_INFATUATION)
{
StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn);
effect = 3;
@@ -2387,56 +2369,52 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
switch (effect)
{
case 1: // status cleared
- gBattleMons[i].status1 = 0;
+ gBattleMons[bank].status1 = 0;
break;
case 2: // get rid of confusion
- gBattleMons[i].status2 &= ~(STATUS2_CONFUSION);
+ gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION);
break;
case 3: // get rid of infatuation
- gBattleMons[i].status2 &= ~(STATUS2_INFATUATION);
+ gBattleMons[bank].status2 &= ~(STATUS2_INFATUATION);
break;
}
+
BattleScriptPushCursor();
gBattlescriptCurrInstr = gUnknown_082DB68C;
- gBattleScripting.bank = i;
- gActiveBank = i;
+ gBattleScripting.bank = bank;
+ gActiveBank = bank;
EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1);
MarkBufferBankForExecution(gActiveBank);
return effect;
}
}
- #undef i
}
break;
case ABILITYEFFECT_FORECAST: // 6
+ for (bank = 0; bank < gNoOfAllBanks; bank++)
{
- #define i bank
- for (i = 0; i < gNoOfAllBanks; i++)
+ if (gBattleMons[bank].ability == ABILITY_FORECAST)
{
- if (gBattleMons[i].ability == ABILITY_FORECAST)
+ effect = CastformDataTypeChange(bank);
+ if (effect)
{
- effect = CastformDataTypeChange(i);
- if (effect)
- {
- BattleScriptPushCursorAndCallback(BattleScript_CastformChange);
- gBattleScripting.bank = i;
- gBattleStruct->formToChangeInto = effect - 1;
- return effect;
- }
+ BattleScriptPushCursorAndCallback(BattleScript_CastformChange);
+ gBattleScripting.bank = bank;
+ *(&gBattleStruct->formToChangeInto) = effect - 1;
+ return effect;
}
}
- #undef i
}
break;
case ABILITYEFFECT_SYNCHRONIZE: // 7
- //_08043CBC
if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT))
{
gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT);
- gBattleStruct->synchronizeMoveEffect &= 0x3F;
- if (gBattleStruct->synchronizeMoveEffect == 6)
- gBattleStruct->synchronizeMoveEffect = 2;
- gBattleCommunication[MOVE_EFFECT_BYTE] = gBattleStruct->synchronizeMoveEffect + 0x40;
+ gBattleStruct->synchronizeMoveEffect &= ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN);
+ if (gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC)
+ gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON;
+
+ gBattleCommunication[MOVE_EFFECT_BYTE] = gBattleStruct->synchronizeMoveEffect + MOVE_EFFECT_AFFECTS_USER;
gBattleScripting.bank = gBankTarget;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_SynchronizeActivates;
@@ -2448,9 +2426,10 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT))
{
gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT);
- gBattleStruct->synchronizeMoveEffect &= 0x3F;
- if (gBattleStruct->synchronizeMoveEffect == 6)
- gBattleStruct->synchronizeMoveEffect = 2;
+ gBattleStruct->synchronizeMoveEffect &= ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN);
+ if (gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC)
+ gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON;
+
gBattleCommunication[MOVE_EFFECT_BYTE] = gBattleStruct->synchronizeMoveEffect;
gBattleScripting.bank = gBankAttacker;
BattleScriptPushCursor();
@@ -2478,15 +2457,16 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
{
if (gBattleMons[i].ability == ABILITY_TRACE && (gStatuses3[i] & STATUS3_TRACE))
{
- u8 opposite = (GetBankIdentity(i) ^ 1) & 1;
- u8 target1 = GetBankByIdentity(opposite);
- u8 target2 = GetBankByIdentity(opposite + 2);
+ u8 target2;
+ side = (GetBankIdentity(i) ^ BIT_SIDE) & BIT_SIDE; // side of the opposing pokemon
+ target1 = GetBankByIdentity(side);
+ target2 = GetBankByIdentity(side + BIT_MON);
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
if (gBattleMons[target1].ability != 0 && gBattleMons[target1].hp != 0
&& gBattleMons[target2].ability != 0 && gBattleMons[target2].hp != 0)
{
- gActiveBank = GetBankByIdentity(((Random() & 1) * 2) | opposite);
+ gActiveBank = GetBankByIdentity(((Random() & 1) * 2) | side);
gBattleMons[i].ability = gBattleMons[gActiveBank].ability;
gLastUsedAbility = gBattleMons[gActiveBank].ability;
effect++;
@@ -2522,16 +2502,8 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
gStatuses3[i] &= ~(STATUS3_TRACE);
gBattleScripting.bank = i;
- gBattleTextBuff1[0] = 0xFD;
- gBattleTextBuff1[1] = 4;
- gBattleTextBuff1[2] = gActiveBank;
- gBattleTextBuff1[3] = gBattlePartyID[gActiveBank];
- gBattleTextBuff1[4] = EOS;
-
- gBattleTextBuff2[0] = 0xFD;
- gBattleTextBuff2[1] = 9;
- gBattleTextBuff2[2] = gLastUsedAbility;
- gBattleTextBuff2[3] = EOS;
+ PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gActiveBank, gBattlePartyID[gActiveBank])
+ PREPARE_ABILITY_BUFFER(gBattleTextBuff2, gLastUsedAbility)
break;
}
}
@@ -2656,3045 +2628,13 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
}
- if (effect && caseID < 0xC && gLastUsedAbility != 0xFF)
+
+ if (effect && caseID < ABILITYEFFECT_CHECK_OTHER_SIDE && gLastUsedAbility != 0xFF)
RecordAbilityBattle(bank, gLastUsedAbility);
}
return effect;
}
-#else
-__attribute__((naked))
-u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
-{
- asm(
- "\n\
- .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, 0x28\n\
- ldr r4, [sp, 0x48]\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- str r0, [sp, 0x4]\n\
- lsls r1, 24\n\
- lsrs r1, 24\n\
- mov r10, r1\n\
- lsls r2, 24\n\
- lsrs r6, r2, 24\n\
- lsls r3, 24\n\
- lsrs r3, 24\n\
- mov r8, r3\n\
- lsls r4, 16\n\
- lsrs r4, 16\n\
- movs r0, 0\n\
- mov r9, r0\n\
- ldr r5, =gBankAttacker\n\
- ldr r1, =gNoOfAllBanks\n\
- ldrb r0, [r5]\n\
- ldrb r1, [r1]\n\
- cmp r0, r1\n\
- bcc _08042864\n\
- mov r1, r10\n\
- strb r1, [r5]\n\
-_08042864:\n\
- ldrb r0, [r5]\n\
- bl GetBankSide\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- bne _08042894\n\
- ldr r1, =gBattlePartyID\n\
- ldrb r0, [r5]\n\
- lsls r0, 1\n\
- adds r0, r1\n\
- ldrh r1, [r0]\n\
- movs r0, 0x64\n\
- muls r1, r0\n\
- ldr r0, =gPlayerParty\n\
- b _080428A4\n\
- .pool\n\
-_08042894:\n\
- ldr r1, =gBattlePartyID\n\
- ldrb r0, [r5]\n\
- lsls r0, 1\n\
- adds r0, r1\n\
- ldrh r1, [r0]\n\
- movs r0, 0x64\n\
- muls r1, r0\n\
- ldr r0, =gEnemyParty\n\
-_080428A4:\n\
- adds r7, r1, r0\n\
- ldr r5, =gBankTarget\n\
- ldr r1, =gNoOfAllBanks\n\
- ldrb r0, [r5]\n\
- ldrb r1, [r1]\n\
- cmp r0, r1\n\
- bcc _080428B6\n\
- mov r2, r10\n\
- strb r2, [r5]\n\
-_080428B6:\n\
- ldrb r0, [r5]\n\
- bl GetBankSide\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- bne _080428E8\n\
- ldr r1, =gBattlePartyID\n\
- ldrb r0, [r5]\n\
- lsls r0, 1\n\
- adds r0, r1\n\
- ldrh r1, [r0]\n\
- movs r0, 0x64\n\
- muls r1, r0\n\
- ldr r0, =gPlayerParty\n\
- b _080428F8\n\
- .pool\n\
-_080428E8:\n\
- ldr r1, =gBattlePartyID\n\
- ldrb r0, [r5]\n\
- lsls r0, 1\n\
- adds r0, r1\n\
- ldrh r1, [r0]\n\
- movs r0, 0x64\n\
- muls r1, r0\n\
- ldr r0, =gEnemyParty\n\
-_080428F8:\n\
- adds r5, r1, r0\n\
- adds r0, r7, 0\n\
- movs r1, 0xB\n\
- bl GetMonData\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- str r0, [sp, 0x8]\n\
- adds r0, r7, 0\n\
- movs r1, 0\n\
- bl GetMonData\n\
- str r0, [sp, 0x10]\n\
- adds r0, r5, 0\n\
- movs r1, 0xB\n\
- bl GetMonData\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- str r0, [sp, 0xC]\n\
- adds r0, r5, 0\n\
- movs r1, 0\n\
- bl GetMonData\n\
- str r0, [sp, 0x14]\n\
- ldr r0, =gBattleTypeFlags\n\
- ldr r0, [r0]\n\
- movs r1, 0x80\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0804293A\n\
- bl _0804443A\n\
-_0804293A:\n\
- mov r3, r8\n\
- cmp r3, 0\n\
- beq _08042958\n\
- ldr r0, =gLastUsedAbility\n\
- strb r3, [r0]\n\
- adds r7, r0, 0\n\
- b _0804296E\n\
- .pool\n\
-_08042958:\n\
- ldr r2, =gLastUsedAbility\n\
- ldr r1, =gBattleMons\n\
- movs r0, 0x58\n\
- mov r5, r10\n\
- muls r5, r0\n\
- adds r0, r5, 0\n\
- adds r0, r1\n\
- adds r0, 0x20\n\
- ldrb r0, [r0]\n\
- strb r0, [r2]\n\
- adds r7, r2, 0\n\
-_0804296E:\n\
- cmp r4, 0\n\
- beq _08042980\n\
- adds r5, r4, 0\n\
- b _08042984\n\
- .pool\n\
-_08042980:\n\
- ldr r0, =gCurrentMove\n\
- ldrh r5, [r0]\n\
-_08042984:\n\
- ldr r1, =gBattleStruct\n\
- ldr r0, [r1]\n\
- ldrb r0, [r0, 0x13]\n\
- mov r8, r1\n\
- cmp r0, 0\n\
- beq _080429A0\n\
- movs r3, 0x3F\n\
- ands r3, r0\n\
- b _080429AC\n\
- .pool\n\
-_080429A0:\n\
- ldr r1, =gBattleMoves\n\
- lsls r0, r5, 1\n\
- adds r0, r5\n\
- lsls r0, 2\n\
- adds r0, r1\n\
- ldrb r3, [r0, 0x2]\n\
-_080429AC:\n\
- ldr r0, [sp, 0x4]\n\
- cmp r0, 0x13\n\
- bls _080429B6\n\
- bl _0804441E\n\
-_080429B6:\n\
- lsls r0, 2\n\
- ldr r1, =_080429C8\n\
- adds r0, r1\n\
- ldr r0, [r0]\n\
- mov pc, r0\n\
- .pool\n\
- .align 2, 0\n\
-_080429C8:\n\
- .4byte _08042A18\n\
- .4byte _08042CDC\n\
- .4byte _08042EF8\n\
- .4byte _08042F8C\n\
- .4byte _080431AC\n\
- .4byte _08043908\n\
- .4byte _08043C6C\n\
- .4byte _08043CBC\n\
- .4byte _08043D40\n\
- .4byte _08043DC4\n\
- .4byte _08043FE4\n\
- .4byte _08043E08\n\
- .4byte _08044028\n\
- .4byte _08044084\n\
- .4byte _080440E0\n\
- .4byte _080441DC\n\
- .4byte _08044220\n\
- .4byte _0804427C\n\
- .4byte _080443EC\n\
- .4byte _08044196\n\
-_08042A18:\n\
- ldr r2, =gBankAttacker\n\
- ldr r0, =gNoOfAllBanks\n\
- ldrb r1, [r2]\n\
- adds r5, r0, 0\n\
- ldrb r3, [r5]\n\
- cmp r1, r3\n\
- bcc _08042A2A\n\
- mov r0, r10\n\
- strb r0, [r2]\n\
-_08042A2A:\n\
- ldrb r0, [r7]\n\
- cmp r0, 0x2D\n\
- bne _08042A32\n\
- b _08042BA8\n\
-_08042A32:\n\
- cmp r0, 0x2D\n\
- bgt _08042A64\n\
- cmp r0, 0xD\n\
- bne _08042A3C\n\
- b _08042CA4\n\
-_08042A3C:\n\
- cmp r0, 0xD\n\
- bgt _08042A54\n\
- cmp r0, 0x2\n\
- bne _08042A46\n\
- b _08042B78\n\
-_08042A46:\n\
- bl _0804441E\n\
- .pool\n\
-_08042A54:\n\
- cmp r0, 0x16\n\
- bne _08042A5A\n\
- b _08042C08\n\
-_08042A5A:\n\
- cmp r0, 0x24\n\
- bne _08042A60\n\
- b _08042C68\n\
-_08042A60:\n\
- bl _0804441E\n\
-_08042A64:\n\
- cmp r0, 0x46\n\
- bne _08042A6A\n\
- b _08042BD8\n\
-_08042A6A:\n\
- cmp r0, 0x46\n\
- bgt _08042A78\n\
- cmp r0, 0x3B\n\
- bne _08042A74\n\
- b _08042C3C\n\
-_08042A74:\n\
- bl _0804441E\n\
-_08042A78:\n\
- cmp r0, 0x4D\n\
- bne _08042A7E\n\
- b _08042CA4\n\
-_08042A7E:\n\
- cmp r0, 0xFF\n\
- beq _08042A86\n\
- bl _0804441E\n\
-_08042A86:\n\
- ldr r0, =gBattleTypeFlags\n\
- ldr r0, [r0]\n\
- movs r1, 0x80\n\
- lsls r1, 17\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _08042B4C\n\
- bl weather_get_current\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- subs r0, 0x3\n\
- cmp r0, 0xA\n\
- bhi _08042B4C\n\
- lsls r0, 2\n\
- ldr r1, =_08042AB4\n\
- adds r0, r1\n\
- ldr r0, [r0]\n\
- mov pc, r0\n\
- .pool\n\
- .align 2, 0\n\
-_08042AB4:\n\
- .4byte _08042AE0\n\
- .4byte _08042B4C\n\
- .4byte _08042AE0\n\
- .4byte _08042B4C\n\
- .4byte _08042B4C\n\
- .4byte _08042B04\n\
- .4byte _08042B4C\n\
- .4byte _08042B4C\n\
- .4byte _08042B4C\n\
- .4byte _08042B28\n\
- .4byte _08042AE0\n\
-_08042AE0:\n\
- ldr r2, =gBattleWeather\n\
- ldrh r1, [r2]\n\
- movs r0, 0x7\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _08042B4C\n\
- movs r0, 0x5\n\
- strh r0, [r2]\n\
- ldr r1, =gBattleScripting\n\
- movs r0, 0xA\n\
- strb r0, [r1, 0x10]\n\
- mov r2, r10\n\
- strb r2, [r1, 0x17]\n\
- b _08042B42\n\
- .pool\n\
-_08042B04:\n\
- ldr r3, =gBattleWeather\n\
- ldrh r1, [r3]\n\
- movs r2, 0x18\n\
- adds r0, r2, 0\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _08042B4C\n\
- strh r2, [r3]\n\
- ldr r1, =gBattleScripting\n\
- movs r0, 0xC\n\
- strb r0, [r1, 0x10]\n\
- mov r3, r10\n\
- strb r3, [r1, 0x17]\n\
- b _08042B42\n\
- .pool\n\
-_08042B28:\n\
- ldr r3, =gBattleWeather\n\
- ldrh r1, [r3]\n\
- movs r2, 0x60\n\
- adds r0, r2, 0\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _08042B4C\n\
- strh r2, [r3]\n\
- ldr r1, =gBattleScripting\n\
- movs r0, 0xB\n\
- strb r0, [r1, 0x10]\n\
- mov r5, r10\n\
- strb r5, [r1, 0x17]\n\
-_08042B42:\n\
- mov r0, r9\n\
- adds r0, 0x1\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- mov r9, r0\n\
-_08042B4C:\n\
- mov r0, r9\n\
- cmp r0, 0\n\
- bne _08042B56\n\
- bl _0804443A\n\
-_08042B56:\n\
- bl weather_get_current\n\
- ldr r1, =gBattleCommunication\n\
- strb r0, [r1, 0x5]\n\
- ldr r0, =gUnknown_082DACE7\n\
- bl BattleScriptPushCursorAndCallback\n\
- bl _0804441E\n\
- .pool\n\
-_08042B78:\n\
- ldr r2, =gBattleWeather\n\
- ldrh r1, [r2]\n\
- movs r0, 0x4\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08042B88\n\
- bl _0804441E\n\
-_08042B88:\n\
- movs r0, 0x5\n\
- strh r0, [r2]\n\
- ldr r0, =BattleScript_DrizzleActivates\n\
- bl BattleScriptPushCursorAndCallback\n\
- ldr r0, =gBattleScripting\n\
- mov r1, r10\n\
- strb r1, [r0, 0x17]\n\
- bl _080443D0\n\
- .pool\n\
-_08042BA8:\n\
- ldr r2, =gBattleWeather\n\
- ldrh r1, [r2]\n\
- movs r0, 0x10\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08042BB8\n\
- bl _0804441E\n\
-_08042BB8:\n\
- movs r0, 0x18\n\
- strh r0, [r2]\n\
- ldr r0, =BattleScript_SandstreamActivates\n\
- bl BattleScriptPushCursorAndCallback\n\
- ldr r0, =gBattleScripting\n\
- mov r2, r10\n\
- strb r2, [r0, 0x17]\n\
- bl _080443D0\n\
- .pool\n\
-_08042BD8:\n\
- ldr r2, =gBattleWeather\n\
- ldrh r1, [r2]\n\
- movs r0, 0x40\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08042BE8\n\
- bl _0804441E\n\
-_08042BE8:\n\
- movs r0, 0x60\n\
- strh r0, [r2]\n\
- ldr r0, =BattleScript_DroughtActivates\n\
- bl BattleScriptPushCursorAndCallback\n\
- ldr r0, =gBattleScripting\n\
- mov r3, r10\n\
- strb r3, [r0, 0x17]\n\
- bl _080443D0\n\
- .pool\n\
-_08042C08:\n\
- ldr r0, =gSpecialStatuses\n\
- mov r5, r10\n\
- lsls r2, r5, 2\n\
- adds r1, r2, r5\n\
- lsls r1, 2\n\
- adds r3, r1, r0\n\
- ldrb r0, [r3]\n\
- lsls r0, 28\n\
- cmp r0, 0\n\
- bge _08042C20\n\
- bl _0804441E\n\
-_08042C20:\n\
- ldr r1, =gStatuses3\n\
- adds r1, r2, r1\n\
- ldr r0, [r1]\n\
- movs r2, 0x80\n\
- lsls r2, 12\n\
- orrs r0, r2\n\
- str r0, [r1]\n\
- ldrb r0, [r3]\n\
- movs r1, 0x8\n\
- b _08042C92\n\
- .pool\n\
-_08042C3C:\n\
- mov r0, r10\n\
- bl CastformDataTypeChange\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- mov r9, r0\n\
- cmp r0, 0\n\
- bne _08042C50\n\
- bl _0804443A\n\
-_08042C50:\n\
- ldr r0, =BattleScript_CastformChange\n\
- bl BattleScriptPushCursorAndCallback\n\
- ldr r0, =gBattleScripting\n\
- mov r1, r10\n\
- strb r1, [r0, 0x17]\n\
- bl _080442E2\n\
- .pool\n\
-_08042C68:\n\
- ldr r0, =gSpecialStatuses\n\
- mov r3, r10\n\
- lsls r2, r3, 2\n\
- adds r1, r2, r3\n\
- lsls r1, 2\n\
- adds r3, r1, r0\n\
- ldrb r0, [r3]\n\
- lsls r0, 27\n\
- cmp r0, 0\n\
- bge _08042C80\n\
- bl _0804441E\n\
-_08042C80:\n\
- ldr r1, =gStatuses3\n\
- adds r1, r2, r1\n\
- ldr r0, [r1]\n\
- movs r2, 0x80\n\
- lsls r2, 13\n\
- orrs r0, r2\n\
- str r0, [r1]\n\
- ldrb r0, [r3]\n\
- movs r1, 0x10\n\
-_08042C92:\n\
- orrs r0, r1\n\
- strb r0, [r3]\n\
- bl _0804441E\n\
- .pool\n\
-_08042CA4:\n\
- movs r6, 0\n\
- ldrb r5, [r5]\n\
- cmp r6, r5\n\
- bcc _08042CB0\n\
- bl _0804441E\n\
-_08042CB0:\n\
- adds r0, r6, 0\n\
- bl CastformDataTypeChange\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- mov r9, r0\n\
- cmp r0, 0\n\
- beq _08042CC4\n\
- bl _080442D8\n\
-_08042CC4:\n\
- adds r0, r6, 0x1\n\
- lsls r0, 24\n\
- lsrs r6, r0, 24\n\
- ldr r0, =gNoOfAllBanks\n\
- ldrb r0, [r0]\n\
- cmp r6, r0\n\
- bcc _08042CB0\n\
- bl _0804441E\n\
- .pool\n\
-_08042CDC:\n\
- ldr r5, =gBattleMons\n\
- mov r8, r5\n\
- movs r0, 0x58\n\
- mov r6, r10\n\
- muls r6, r0\n\
- adds r4, r6, r5\n\
- ldrh r0, [r4, 0x28]\n\
- cmp r0, 0\n\
- bne _08042CF2\n\
- bl _0804441E\n\
-_08042CF2:\n\
- ldr r0, =gBankAttacker\n\
- mov r1, r10\n\
- strb r1, [r0]\n\
- ldrb r5, [r7]\n\
- cmp r5, 0x2C\n\
- beq _08042D22\n\
- cmp r5, 0x2C\n\
- bgt _08042D14\n\
- cmp r5, 0x3\n\
- bne _08042D08\n\
- b _08042E84\n\
-_08042D08:\n\
- bl _0804441E\n\
- .pool\n\
-_08042D14:\n\
- cmp r5, 0x36\n\
- bne _08042D1A\n\
- b _08042ED0\n\
-_08042D1A:\n\
- cmp r5, 0x3D\n\
- beq _08042DA0\n\
- bl _0804441E\n\
-_08042D22:\n\
- movs r0, 0\n\
- str r0, [sp]\n\
- movs r0, 0x13\n\
- movs r1, 0\n\
- movs r2, 0xD\n\
- movs r3, 0\n\
- bl AbilityBattleEffects\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- cmp r0, 0\n\
- beq _08042D3E\n\
- bl _0804441E\n\
-_08042D3E:\n\
- str r0, [sp]\n\
- movs r0, 0x13\n\
- movs r1, 0\n\
- movs r2, 0x4D\n\
- movs r3, 0\n\
- bl AbilityBattleEffects\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _08042D56\n\
- bl _0804441E\n\
-_08042D56:\n\
- ldr r0, =gBattleWeather\n\
- ldrh r1, [r0]\n\
- movs r0, 0x7\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _08042D66\n\
- bl _0804441E\n\
-_08042D66:\n\
- ldrh r0, [r4, 0x2C]\n\
- ldrh r2, [r4, 0x28]\n\
- cmp r0, r2\n\
- bhi _08042D72\n\
- bl _0804441E\n\
-_08042D72:\n\
- strb r5, [r7]\n\
- ldr r0, =BattleScript_RainDishActivates\n\
- bl BattleScriptPushCursorAndCallback\n\
- ldr r1, =gBattleMoveDamage\n\
- ldrh r0, [r4, 0x2C]\n\
- lsrs r0, 4\n\
- str r0, [r1]\n\
- cmp r0, 0\n\
- bne _08042D8A\n\
- movs r0, 0x1\n\
- str r0, [r1]\n\
-_08042D8A:\n\
- ldr r0, [r1]\n\
- negs r0, r0\n\
- str r0, [r1]\n\
- bl _080443D0\n\
- .pool\n\
-_08042DA0:\n\
- mov r0, r8\n\
- adds r0, 0x4C\n\
- adds r5, r6, r0\n\
- ldrb r0, [r5]\n\
- cmp r0, 0\n\
- bne _08042DB0\n\
- bl _0804441E\n\
-_08042DB0:\n\
- bl Random\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- movs r1, 0x3\n\
- bl __umodsi3\n\
- lsls r0, 16\n\
- lsrs r4, r0, 16\n\
- cmp r4, 0\n\
- beq _08042DCA\n\
- bl _0804441E\n\
-_08042DCA:\n\
- ldr r0, [r5]\n\
- movs r1, 0x88\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08042DDC\n\
- ldr r0, =gBattleTextBuff1\n\
- ldr r1, =gStatusConditionString_PoisonJpn\n\
- bl StringCopy\n\
-_08042DDC:\n\
- ldr r0, [r5]\n\
- movs r1, 0x7\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08042DEE\n\
- ldr r0, =gBattleTextBuff1\n\
- ldr r1, =gStatusConditionString_SleepJpn\n\
- bl StringCopy\n\
-_08042DEE:\n\
- ldr r0, [r5]\n\
- movs r1, 0x40\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08042E00\n\
- ldr r0, =gBattleTextBuff1\n\
- ldr r1, =gStatusConditionString_ParalysisJpn\n\
- bl StringCopy\n\
-_08042E00:\n\
- ldr r0, [r5]\n\
- movs r1, 0x10\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08042E12\n\
- ldr r0, =gBattleTextBuff1\n\
- ldr r1, =gStatusConditionString_BurnJpn\n\
- bl StringCopy\n\
-_08042E12:\n\
- ldr r0, [r5]\n\
- movs r1, 0x20\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08042E24\n\
- ldr r0, =gBattleTextBuff1\n\
- ldr r1, =gStatusConditionString_IceJpn\n\
- bl StringCopy\n\
-_08042E24:\n\
- str r4, [r5]\n\
- mov r1, r8\n\
- adds r1, 0x50\n\
- adds r1, r6, r1\n\
- ldr r0, [r1]\n\
- ldr r2, =0xf7ffffff\n\
- ands r0, r2\n\
- str r0, [r1]\n\
- ldr r0, =gBattleScripting\n\
- ldr r4, =gActiveBank\n\
- mov r3, r10\n\
- strb r3, [r4]\n\
- strb r3, [r0, 0x17]\n\
- ldr r0, =BattleScript_ShedSkinActivates\n\
- bl BattleScriptPushCursorAndCallback\n\
- str r5, [sp]\n\
- movs r0, 0\n\
- movs r1, 0x28\n\
- movs r2, 0\n\
- movs r3, 0x4\n\
- bl EmitSetMonData\n\
- ldrb r0, [r4]\n\
- bl MarkBufferBankForExecution\n\
- bl _080443D0\n\
- .pool\n\
-_08042E84:\n\
- ldrb r2, [r4, 0x1B]\n\
- movs r0, 0x1B\n\
- ldrsb r0, [r4, r0]\n\
- cmp r0, 0xB\n\
- ble _08042E92\n\
- bl _0804441E\n\
-_08042E92:\n\
- ldr r0, =gDisableStructs\n\
- mov r5, r10\n\
- lsls r1, r5, 3\n\
- subs r1, r5\n\
- lsls r1, 2\n\
- adds r1, r0\n\
- ldrb r0, [r1, 0x16]\n\
- cmp r0, 0x2\n\
- bne _08042EA8\n\
- bl _0804441E\n\
-_08042EA8:\n\
- adds r0, r2, 0x1\n\
- movs r1, 0\n\
- strb r0, [r4, 0x1B]\n\
- ldr r4, =gBattleScripting\n\
- movs r0, 0x11\n\
- strb r0, [r4, 0x10]\n\
- strb r1, [r4, 0x11]\n\
- ldr r0, =BattleScript_SpeedBoostActivates\n\
- bl BattleScriptPushCursorAndCallback\n\
- strb r5, [r4, 0x17]\n\
- bl _080443D0\n\
- .pool\n\
-_08042ED0:\n\
- ldr r2, =gDisableStructs\n\
- ldrb r0, [r0]\n\
- lsls r1, r0, 3\n\
- subs r1, r0\n\
- lsls r1, 2\n\
- adds r1, r2\n\
- ldrb r3, [r1, 0x18]\n\
- lsls r0, r3, 31\n\
- lsrs r0, 31\n\
- movs r2, 0x1\n\
- eors r2, r0\n\
- movs r0, 0x2\n\
- negs r0, r0\n\
- ands r0, r3\n\
- orrs r0, r2\n\
- strb r0, [r1, 0x18]\n\
- bl _0804441E\n\
- .pool\n\
-_08042EF8:\n\
- ldrb r0, [r7]\n\
- cmp r0, 0x2B\n\
- beq _08042F02\n\
- bl _0804441E\n\
-_08042F02:\n\
- movs r4, 0\n\
- ldr r0, =sSoundMovesTable\n\
- ldrh r2, [r0]\n\
- ldr r3, =0x0000ffff\n\
- adds r1, r0, 0\n\
- cmp r2, r3\n\
- bne _08042F14\n\
- bl _0804441E\n\
-_08042F14:\n\
- cmp r2, r5\n\
- beq _08042F2C\n\
- adds r2, r1, 0\n\
-_08042F1A:\n\
- adds r2, 0x2\n\
- adds r4, 0x1\n\
- ldrh r0, [r2]\n\
- cmp r0, r3\n\
- bne _08042F28\n\
- bl _0804441E\n\
-_08042F28:\n\
- cmp r0, r5\n\
- bne _08042F1A\n\
-_08042F2C:\n\
- lsls r0, r4, 1\n\
- adds r0, r1\n\
- ldrh r1, [r0]\n\
- ldr r0, =0x0000ffff\n\
- cmp r1, r0\n\
- bne _08042F3C\n\
- bl _0804441E\n\
-_08042F3C:\n\
- ldr r1, =gBattleMons\n\
- ldr r0, =gBankAttacker\n\
- ldrb r2, [r0]\n\
- movs r0, 0x58\n\
- muls r0, r2\n\
- adds r1, 0x50\n\
- adds r0, r1\n\
- ldr r0, [r0]\n\
- movs r1, 0x80\n\
- lsls r1, 5\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08042F62\n\
- ldr r0, =gHitMarker\n\
- ldr r1, [r0]\n\
- movs r2, 0x80\n\
- lsls r2, 4\n\
- orrs r1, r2\n\
- str r1, [r0]\n\
-_08042F62:\n\
- ldr r1, =gBattlescriptCurrInstr\n\
- ldr r0, =BattleScript_SoundproofProtected\n\
- str r0, [r1]\n\
- movs r0, 0x1\n\
- mov r9, r0\n\
- bl _08044424\n\
- .pool\n\
-_08042F8C:\n\
- cmp r5, 0\n\
- bne _08042F94\n\
- bl _0804441E\n\
-_08042F94:\n\
- ldrb r0, [r7]\n\
- cmp r0, 0xB\n\
- beq _08043004\n\
- cmp r0, 0xB\n\
- bgt _08042FA4\n\
- cmp r0, 0xA\n\
- beq _08042FAA\n\
- b _08043126\n\
-_08042FA4:\n\
- cmp r0, 0x12\n\
- beq _0804305C\n\
- b _08043126\n\
-_08042FAA:\n\
- cmp r3, 0xD\n\
- beq _08042FB0\n\
- b _08043126\n\
-_08042FB0:\n\
- ldr r0, =gBattleMoves\n\
- lsls r1, r5, 1\n\
- adds r1, r5\n\
- lsls r1, 2\n\
- adds r1, r0\n\
- ldrb r0, [r1, 0x1]\n\
- cmp r0, 0\n\
- bne _08042FC2\n\
- b _08043126\n\
-_08042FC2:\n\
- ldr r1, =gProtectStructs\n\
- ldr r0, =gBankAttacker\n\
- ldrb r0, [r0]\n\
- lsls r0, 4\n\
- adds r0, r1\n\
- ldrb r0, [r0, 0x2]\n\
- lsls r0, 28\n\
- cmp r0, 0\n\
- bge _08042FF0\n\
- ldr r1, =gBattlescriptCurrInstr\n\
- ldr r0, =BattleScript_MoveHPDrain\n\
- b _08042FF4\n\
- .pool\n\
-_08042FF0:\n\
- ldr r1, =gBattlescriptCurrInstr\n\
- ldr r0, =BattleScript_MoveHPDrain_PPLoss\n\
-_08042FF4:\n\
- str r0, [r1]\n\
- movs r1, 0x1\n\
- b _08043124\n\
- .pool\n\
-_08043004:\n\
- cmp r3, 0xB\n\
- beq _0804300A\n\
- b _08043126\n\
-_0804300A:\n\
- ldr r0, =gBattleMoves\n\
- lsls r1, r5, 1\n\
- adds r1, r5\n\
- lsls r1, 2\n\
- adds r1, r0\n\
- ldrb r0, [r1, 0x1]\n\
- cmp r0, 0\n\
- bne _0804301C\n\
- b _08043126\n\
-_0804301C:\n\
- ldr r1, =gProtectStructs\n\
- ldr r0, =gBankAttacker\n\
- ldrb r0, [r0]\n\
- lsls r0, 4\n\
- adds r0, r1\n\
- ldrb r0, [r0, 0x2]\n\
- lsls r0, 28\n\
- cmp r0, 0\n\
- bge _08043048\n\
- ldr r1, =gBattlescriptCurrInstr\n\
- ldr r0, =BattleScript_MoveHPDrain\n\
- b _0804304C\n\
- .pool\n\
-_08043048:\n\
- ldr r1, =gBattlescriptCurrInstr\n\
- ldr r0, =BattleScript_MoveHPDrain_PPLoss\n\
-_0804304C:\n\
- str r0, [r1]\n\
- movs r2, 0x1\n\
- mov r9, r2\n\
- b _08043126\n\
- .pool\n\
-_0804305C:\n\
- cmp r3, 0xA\n\
- bne _08043126\n\
- ldr r1, =gBattleMons\n\
- movs r0, 0x58\n\
- mov r3, r10\n\
- muls r3, r0\n\
- adds r0, r3, 0\n\
- adds r1, 0x4C\n\
- adds r0, r1\n\
- ldr r0, [r0]\n\
- movs r1, 0x20\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _08043126\n\
- ldr r2, =gBattleResources\n\
- ldr r0, [r2]\n\
- ldr r0, [r0, 0x4]\n\
- mov r5, r10\n\
- lsls r1, r5, 2\n\
- adds r0, r1\n\
- ldr r3, [r0]\n\
- movs r4, 0x1\n\
- ands r3, r4\n\
- adds r5, r1, 0\n\
- cmp r3, 0\n\
- bne _080430EC\n\
- ldr r0, =gBattleCommunication\n\
- strb r3, [r0, 0x5]\n\
- ldr r1, =gProtectStructs\n\
- ldr r0, =gBankAttacker\n\
- ldrb r0, [r0]\n\
- lsls r0, 4\n\
- adds r0, r1\n\
- ldrb r0, [r0, 0x2]\n\
- lsls r0, 28\n\
- cmp r0, 0\n\
- bge _080430C8\n\
- ldr r1, =gBattlescriptCurrInstr\n\
- ldr r0, =BattleScript_FlashFireBoost\n\
- b _080430CC\n\
- .pool\n\
-_080430C8:\n\
- ldr r1, =gBattlescriptCurrInstr\n\
- ldr r0, =BattleScript_FlashFireBoost_PPLoss\n\
-_080430CC:\n\
- str r0, [r1]\n\
- ldr r0, [r2]\n\
- ldr r1, [r0, 0x4]\n\
- adds r1, r5\n\
- ldr r0, [r1]\n\
- movs r2, 0x1\n\
- orrs r0, r2\n\
- str r0, [r1]\n\
- movs r0, 0x2\n\
- mov r9, r0\n\
- b _08043126\n\
- .pool\n\
-_080430EC:\n\
- ldr r0, =gBattleCommunication\n\
- strb r4, [r0, 0x5]\n\
- ldr r1, =gProtectStructs\n\
- ldr r0, =gBankAttacker\n\
- ldrb r0, [r0]\n\
- lsls r0, 4\n\
- adds r0, r1\n\
- ldrb r0, [r0, 0x2]\n\
- lsls r0, 28\n\
- cmp r0, 0\n\
- bge _0804311C\n\
- ldr r1, =gBattlescriptCurrInstr\n\
- ldr r0, =BattleScript_FlashFireBoost\n\
- b _08043120\n\
- .pool\n\
-_0804311C:\n\
- ldr r1, =gBattlescriptCurrInstr\n\
- ldr r0, =BattleScript_FlashFireBoost_PPLoss\n\
-_08043120:\n\
- str r0, [r1]\n\
- movs r1, 0x2\n\
-_08043124:\n\
- mov r9, r1\n\
-_08043126:\n\
- mov r2, r9\n\
- cmp r2, 0x1\n\
- beq _08043130\n\
- bl _0804441E\n\
-_08043130:\n\
- ldr r1, =gBattleMons\n\
- movs r0, 0x58\n\
- mov r3, r10\n\
- muls r3, r0\n\
- adds r0, r3, 0\n\
- adds r1, r0, r1\n\
- ldrh r0, [r1, 0x2C]\n\
- ldrh r5, [r1, 0x28]\n\
- cmp r0, r5\n\
- bne _0804318C\n\
- ldr r1, =gProtectStructs\n\
- ldr r0, =gBankAttacker\n\
- ldrb r0, [r0]\n\
- lsls r0, 4\n\
- adds r0, r1\n\
- ldrb r0, [r0, 0x2]\n\
- lsls r0, 28\n\
- cmp r0, 0\n\
- bge _08043178\n\
- ldr r1, =gBattlescriptCurrInstr\n\
- ldr r0, =gUnknown_082DB592\n\
- str r0, [r1]\n\
- bl _0804441E\n\
- .pool\n\
-_08043178:\n\
- ldr r1, =gBattlescriptCurrInstr\n\
- ldr r0, =gUnknown_082DB591\n\
- str r0, [r1]\n\
- bl _0804441E\n\
- .pool\n\
-_0804318C:\n\
- ldr r2, =gBattleMoveDamage\n\
- ldrh r0, [r1, 0x2C]\n\
- lsrs r0, 2\n\
- str r0, [r2]\n\
- cmp r0, 0\n\
- bne _0804319C\n\
- mov r0, r9\n\
- str r0, [r2]\n\
-_0804319C:\n\
- ldr r0, [r2]\n\
- negs r0, r0\n\
- str r0, [r2]\n\
- bl _0804441E\n\
- .pool\n\
-_080431AC:\n\
- ldrb r0, [r7]\n\
- subs r0, 0x9\n\
- cmp r0, 0x2F\n\
- bls _080431B8\n\
- bl _0804441E\n\
-_080431B8:\n\
- lsls r0, 2\n\
- ldr r1, =_080431C8\n\
- adds r0, r1\n\
- ldr r0, [r0]\n\
- mov pc, r0\n\
- .pool\n\
- .align 2, 0\n\
-_080431C8:\n\
- .4byte _080435E4\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _08043288\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _08043350\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _08043410\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _08043508\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _080436C0\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _0804441E\n\
- .4byte _0804379C\n\
-_08043288:\n\
- ldr r0, =gBattleMoveFlags\n\
- ldrb r1, [r0]\n\
- movs r0, 0x29\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08043298\n\
- bl _0804441E\n\
-_08043298:\n\
- cmp r5, 0xA5\n\
- bne _080432A0\n\
- bl _0804441E\n\
-_080432A0:\n\
- ldr r0, =gBattleMoves\n\
- lsls r1, r5, 1\n\
- adds r1, r5\n\
- lsls r1, 2\n\
- adds r1, r0\n\
- ldrb r0, [r1, 0x1]\n\
- cmp r0, 0\n\
- bne _080432B4\n\
- bl _0804441E\n\
-_080432B4:\n\
- ldr r2, =gSpecialStatuses\n\
- ldr r0, =gBankTarget\n\
- ldrb r1, [r0]\n\
- lsls r0, r1, 2\n\
- adds r0, r1\n\
- lsls r1, r0, 2\n\
- adds r0, r2, 0\n\
- adds r0, 0x8\n\
- adds r0, r1, r0\n\
- ldr r0, [r0]\n\
- cmp r0, 0\n\
- bne _080432DC\n\
- adds r0, r2, 0\n\
- adds r0, 0xC\n\
- adds r0, r1, r0\n\
- ldr r0, [r0]\n\
- cmp r0, 0\n\
- bne _080432DC\n\
- bl _0804441E\n\
-_080432DC:\n\
- ldr r1, =gBattleMons\n\
- movs r0, 0x58\n\
- mov r2, r10\n\
- muls r2, r0\n\
- adds r0, r2, 0\n\
- adds r1, r0, r1\n\
- adds r4, r1, 0\n\
- adds r4, 0x21\n\
- ldrb r0, [r4]\n\
- cmp r0, r3\n\
- bne _080432F6\n\
- bl _0804441E\n\
-_080432F6:\n\
- adds r2, r1, 0\n\
- adds r2, 0x22\n\
- ldrb r0, [r2]\n\
- cmp r0, r3\n\
- bne _08043304\n\
- bl _0804441E\n\
-_08043304:\n\
- ldrh r0, [r1, 0x28]\n\
- cmp r0, 0\n\
- bne _0804330E\n\
- bl _0804441E\n\
-_0804330E:\n\
- strb r3, [r4]\n\
- strb r3, [r2]\n\
- ldr r1, =gBattleTextBuff1\n\
- movs r0, 0xFD\n\
- strb r0, [r1]\n\
- movs r0, 0x3\n\
- strb r0, [r1, 0x1]\n\
- strb r3, [r1, 0x2]\n\
- movs r0, 0xFF\n\
- strb r0, [r1, 0x3]\n\
- bl BattleScriptPushCursor\n\
- ldr r1, =gBattlescriptCurrInstr\n\
- ldr r0, =BattleScript_ColorChangeActivates\n\
- str r0, [r1]\n\
- bl _080443D0\n\
- .pool\n\
-_08043350:\n\
- ldr r0, =gBattleMoveFlags\n\
- ldrb r1, [r0]\n\
- movs r0, 0x29\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08043360\n\
- bl _0804441E\n\
-_08043360:\n\
- ldr r1, =gBattleMons\n\
- ldr r0, =gBankAttacker\n\
- ldrb r2, [r0]\n\
- movs r0, 0x58\n\
- muls r0, r2\n\
- adds r3, r0, r1\n\
- ldrh r0, [r3, 0x28]\n\
- cmp r0, 0\n\
- bne _08043376\n\
- bl _0804441E\n\
-_08043376:\n\
- ldr r0, =gProtectStructs\n\
- lsls r1, r2, 4\n\
- adds r1, r0\n\
- ldrb r0, [r1, 0x1]\n\
- lsls r0, 31\n\
- cmp r0, 0\n\
- beq _08043388\n\
- bl _0804441E\n\
-_08043388:\n\
- ldr r2, =gSpecialStatuses\n\
- ldr r0, =gBankTarget\n\
- ldrb r1, [r0]\n\
- lsls r0, r1, 2\n\
- adds r0, r1\n\
- lsls r1, r0, 2\n\
- adds r0, r2, 0\n\
- adds r0, 0x8\n\
- adds r0, r1, r0\n\
- ldr r0, [r0]\n\
- cmp r0, 0\n\
- bne _080433B0\n\
- adds r0, r2, 0\n\
- adds r0, 0xC\n\
- adds r0, r1, r0\n\
- ldr r0, [r0]\n\
- cmp r0, 0\n\
- bne _080433B0\n\
- bl _0804441E\n\
-_080433B0:\n\
- ldr r1, =gBattleMoves\n\
- lsls r0, r5, 1\n\
- adds r0, r5\n\
- lsls r0, 2\n\
- adds r0, r1\n\
- ldrb r1, [r0, 0x8]\n\
- movs r2, 0x1\n\
- adds r0, r2, 0\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _080433CA\n\
- bl _0804441E\n\
-_080433CA:\n\
- ldr r1, =gBattleMoveDamage\n\
- ldrh r0, [r3, 0x2C]\n\
- lsrs r0, 4\n\
- str r0, [r1]\n\
- cmp r0, 0\n\
- bne _080433D8\n\
- str r2, [r1]\n\
-_080433D8:\n\
- bl BattleScriptPushCursor\n\
- ldr r1, =gBattlescriptCurrInstr\n\
- ldr r0, =BattleScript_RoughSkinActivates\n\
- str r0, [r1]\n\
- bl _080443D0\n\
- .pool\n\
-_08043410:\n\
- ldr r0, =gBattleMoveFlags\n\
- ldrb r1, [r0]\n\
- movs r0, 0x29\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08043420\n\
- bl _0804441E\n\
-_08043420:\n\
- ldr r1, =gBattleMons\n\
- ldr r0, =gBankAttacker\n\
- ldrb r2, [r0]\n\
- movs r0, 0x58\n\
- muls r0, r2\n\
- adds r0, r1\n\
- ldrh r0, [r0, 0x28]\n\
- cmp r0, 0\n\
- bne _08043436\n\
- bl _0804441E\n\
-_08043436:\n\
- ldr r0, =gProtectStructs\n\
- lsls r1, r2, 4\n\
- adds r1, r0\n\
- ldrb r0, [r1, 0x1]\n\
- lsls r0, 31\n\
- cmp r0, 0\n\
- beq _08043448\n\
- bl _0804441E\n\
-_08043448:\n\
- ldr r2, =gSpecialStatuses\n\
- ldr r0, =gBankTarget\n\
- ldrb r1, [r0]\n\
- lsls r0, r1, 2\n\
- adds r0, r1\n\
- lsls r1, r0, 2\n\
- adds r0, r2, 0\n\
- adds r0, 0x8\n\
- adds r0, r1, r0\n\
- ldr r0, [r0]\n\
- cmp r0, 0\n\
- bne _08043470\n\
- adds r0, r2, 0\n\
- adds r0, 0xC\n\
- adds r0, r1, r0\n\
- ldr r0, [r0]\n\
- cmp r0, 0\n\
- bne _08043470\n\
- bl _0804441E\n\
-_08043470:\n\
- ldr r1, =gBattleMoves\n\
- lsls r0, r5, 1\n\
- adds r0, r5\n\
- lsls r0, 2\n\
- adds r0, r1\n\
- ldrb r1, [r0, 0x8]\n\
- movs r0, 0x1\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _08043488\n\
- bl _0804441E\n\
-_08043488:\n\
- bl Random\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- movs r1, 0xA\n\
- bl __umodsi3\n\
- lsls r0, 16\n\
- cmp r0, 0\n\
- beq _080434A0\n\
- bl _0804441E\n\
-_080434A0:\n\
- ldr r5, =gBattleCommunication\n\
- movs r4, 0x3\n\
-_080434A4:\n\
- bl Random\n\
- ands r0, r4\n\
- strb r0, [r5, 0x3]\n\
- cmp r0, 0\n\
- beq _080434A4\n\
- ldr r1, =gBattleCommunication\n\
- ldrb r0, [r1, 0x3]\n\
- cmp r0, 0x3\n\
- bne _080434BC\n\
- adds r0, 0x2\n\
- strb r0, [r1, 0x3]\n\
-_080434BC:\n\
- ldrb r0, [r1, 0x3]\n\
- adds r0, 0x40\n\
- strb r0, [r1, 0x3]\n\
- bl BattleScriptPushCursor\n\
- ldr r1, =gBattlescriptCurrInstr\n\
- ldr r0, =BattleScript_ApplySecondaryEffect\n\
- str r0, [r1]\n\
- ldr r2, =gHitMarker\n\
- ldr r0, [r2]\n\
- movs r1, 0x80\n\
- lsls r1, 6\n\
- orrs r0, r1\n\
- str r0, [r2]\n\
- bl _080443D0\n\
- .pool\n\
-_08043508:\n\
- ldr r0, =gBattleMoveFlags\n\
- ldrb r1, [r0]\n\
- movs r0, 0x29\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08043518\n\
- bl _0804441E\n\
-_08043518:\n\
- ldr r1, =gBattleMons\n\
- ldr r0, =gBankAttacker\n\
- ldrb r2, [r0]\n\
- movs r0, 0x58\n\
- muls r0, r2\n\
- adds r0, r1\n\
- ldrh r0, [r0, 0x28]\n\
- cmp r0, 0\n\
- bne _0804352E\n\
- bl _0804441E\n\
-_0804352E:\n\
- ldr r0, =gProtectStructs\n\
- lsls r1, r2, 4\n\
- adds r1, r0\n\
- ldrb r0, [r1, 0x1]\n\
- lsls r0, 31\n\
- cmp r0, 0\n\
- beq _08043540\n\
- bl _0804441E\n\
-_08043540:\n\
- ldr r2, =gSpecialStatuses\n\
- ldr r0, =gBankTarget\n\
- ldrb r1, [r0]\n\
- lsls r0, r1, 2\n\
- adds r0, r1\n\
- lsls r1, r0, 2\n\
- adds r0, r2, 0\n\
- adds r0, 0x8\n\
- adds r0, r1, r0\n\
- ldr r0, [r0]\n\
- cmp r0, 0\n\
- bne _08043568\n\
- adds r0, r2, 0\n\
- adds r0, 0xC\n\
- adds r0, r1, r0\n\
- ldr r0, [r0]\n\
- cmp r0, 0\n\
- bne _08043568\n\
- bl _0804441E\n\
-_08043568:\n\
- ldr r1, =gBattleMoves\n\
- lsls r0, r5, 1\n\
- adds r0, r5\n\
- lsls r0, 2\n\
- adds r0, r1\n\
- ldrb r1, [r0, 0x8]\n\
- movs r0, 0x1\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _08043580\n\
- bl _0804441E\n\
-_08043580:\n\
- bl Random\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- movs r1, 0x3\n\
- bl __umodsi3\n\
- lsls r0, 16\n\
- cmp r0, 0\n\
- beq _08043598\n\
- bl _0804441E\n\
-_08043598:\n\
- ldr r1, =gBattleCommunication\n\
- movs r0, 0x42\n\
- strb r0, [r1, 0x3]\n\
- bl BattleScriptPushCursor\n\
- ldr r1, =gBattlescriptCurrInstr\n\
- ldr r0, =BattleScript_ApplySecondaryEffect\n\
- str r0, [r1]\n\
- ldr r2, =gHitMarker\n\
- ldr r0, [r2]\n\
- movs r1, 0x80\n\
- lsls r1, 6\n\
- orrs r0, r1\n\
- str r0, [r2]\n\
- bl _080443D0\n\
- .pool\n\
-_080435E4:\n\
- ldr r0, =gBattleMoveFlags\n\
- ldrb r1, [r0]\n\
- movs r0, 0x29\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _080435F4\n\
- bl _0804441E\n\
-_080435F4:\n\
- ldr r1, =gBattleMons\n\
- ldr r0, =gBankAttacker\n\
- ldrb r2, [r0]\n\
- movs r0, 0x58\n\
- muls r0, r2\n\
- adds r0, r1\n\
- ldrh r0, [r0, 0x28]\n\
- cmp r0, 0\n\
- bne _0804360A\n\
- bl _0804441E\n\
-_0804360A:\n\
- ldr r0, =gProtectStructs\n\
- lsls r1, r2, 4\n\
- adds r1, r0\n\
- ldrb r0, [r1, 0x1]\n\
- lsls r0, 31\n\
- cmp r0, 0\n\
- beq _0804361C\n\
- bl _0804441E\n\
-_0804361C:\n\
- ldr r2, =gSpecialStatuses\n\
- ldr r0, =gBankTarget\n\
- ldrb r1, [r0]\n\
- lsls r0, r1, 2\n\
- adds r0, r1\n\
- lsls r1, r0, 2\n\
- adds r0, r2, 0\n\
- adds r0, 0x8\n\
- adds r0, r1, r0\n\
- ldr r0, [r0]\n\
- cmp r0, 0\n\
- bne _08043644\n\
- adds r0, r2, 0\n\
- adds r0, 0xC\n\
- adds r0, r1, r0\n\
- ldr r0, [r0]\n\
- cmp r0, 0\n\
- bne _08043644\n\
- bl _0804441E\n\
-_08043644:\n\
- ldr r1, =gBattleMoves\n\
- lsls r0, r5, 1\n\
- adds r0, r5\n\
- lsls r0, 2\n\
- adds r0, r1\n\
- ldrb r1, [r0, 0x8]\n\
- movs r0, 0x1\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _0804365C\n\
- bl _0804441E\n\
-_0804365C:\n\
- bl Random\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- movs r1, 0x3\n\
- bl __umodsi3\n\
- lsls r0, 16\n\
- cmp r0, 0\n\
- beq _08043674\n\
- bl _0804441E\n\
-_08043674:\n\
- ldr r1, =gBattleCommunication\n\
- movs r0, 0x45\n\
- strb r0, [r1, 0x3]\n\
- bl BattleScriptPushCursor\n\
- ldr r1, =gBattlescriptCurrInstr\n\
- ldr r0, =BattleScript_ApplySecondaryEffect\n\
- str r0, [r1]\n\
- ldr r2, =gHitMarker\n\
- ldr r0, [r2]\n\
- movs r1, 0x80\n\
- lsls r1, 6\n\
- orrs r0, r1\n\
- str r0, [r2]\n\
- bl _080443D0\n\
- .pool\n\
-_080436C0:\n\
- ldr r0, =gBattleMoveFlags\n\
- ldrb r1, [r0]\n\
- movs r0, 0x29\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _080436D0\n\
- bl _0804441E\n\
-_080436D0:\n\
- ldr r1, =gBattleMons\n\
- ldr r0, =gBankAttacker\n\
- ldrb r2, [r0]\n\
- movs r0, 0x58\n\
- muls r0, r2\n\
- adds r0, r1\n\
- ldrh r0, [r0, 0x28]\n\
- cmp r0, 0\n\
- bne _080436E6\n\
- bl _0804441E\n\
-_080436E6:\n\
- ldr r0, =gProtectStructs\n\
- lsls r1, r2, 4\n\
- adds r1, r0\n\
- ldrb r0, [r1, 0x1]\n\
- lsls r0, 31\n\
- cmp r0, 0\n\
- beq _080436F8\n\
- bl _0804441E\n\
-_080436F8:\n\
- ldr r1, =gBattleMoves\n\
- lsls r0, r5, 1\n\
- adds r0, r5\n\
- lsls r0, 2\n\
- adds r0, r1\n\
- ldrb r1, [r0, 0x8]\n\
- movs r0, 0x1\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _08043710\n\
- bl _0804441E\n\
-_08043710:\n\
- ldr r2, =gSpecialStatuses\n\
- ldr r0, =gBankTarget\n\
- ldrb r1, [r0]\n\
- lsls r0, r1, 2\n\
- adds r0, r1\n\
- lsls r1, r0, 2\n\
- adds r0, r2, 0\n\
- adds r0, 0x8\n\
- adds r0, r1, r0\n\
- ldr r0, [r0]\n\
- cmp r0, 0\n\
- bne _08043738\n\
- adds r0, r2, 0\n\
- adds r0, 0xC\n\
- adds r0, r1, r0\n\
- ldr r0, [r0]\n\
- cmp r0, 0\n\
- bne _08043738\n\
- bl _0804441E\n\
-_08043738:\n\
- bl Random\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- movs r1, 0x3\n\
- bl __umodsi3\n\
- lsls r0, 16\n\
- cmp r0, 0\n\
- beq _08043750\n\
- bl _0804441E\n\
-_08043750:\n\
- ldr r1, =gBattleCommunication\n\
- movs r0, 0x43\n\
- strb r0, [r1, 0x3]\n\
- bl BattleScriptPushCursor\n\
- ldr r1, =gBattlescriptCurrInstr\n\
- ldr r0, =BattleScript_ApplySecondaryEffect\n\
- str r0, [r1]\n\
- ldr r2, =gHitMarker\n\
- ldr r0, [r2]\n\
- movs r1, 0x80\n\
- lsls r1, 6\n\
- orrs r0, r1\n\
- str r0, [r2]\n\
- bl _080443D0\n\
- .pool\n\
-_0804379C:\n\
- ldr r0, =gBattleMoveFlags\n\
- ldrb r1, [r0]\n\
- movs r0, 0x29\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _080437AC\n\
- bl _0804441E\n\
-_080437AC:\n\
- ldr r6, =gBattleMons\n\
- ldr r3, =gBankAttacker\n\
- mov r8, r3\n\
- ldrb r1, [r3]\n\
- movs r7, 0x58\n\
- adds r0, r1, 0\n\
- muls r0, r7\n\
- adds r0, r6\n\
- ldrh r0, [r0, 0x28]\n\
- cmp r0, 0\n\
- bne _080437C6\n\
- bl _0804441E\n\
-_080437C6:\n\
- ldr r0, =gProtectStructs\n\
- lsls r1, 4\n\
- adds r1, r0\n\
- ldrb r0, [r1, 0x1]\n\
- lsls r0, 31\n\
- cmp r0, 0\n\
- beq _080437D8\n\
- bl _0804441E\n\
-_080437D8:\n\
- ldr r1, =gBattleMoves\n\
- lsls r0, r5, 1\n\
- adds r0, r5\n\
- lsls r0, 2\n\
- adds r0, r1\n\
- ldrb r1, [r0, 0x8]\n\
- movs r0, 0x1\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _080437F0\n\
- bl _0804441E\n\
-_080437F0:\n\
- ldr r3, =gSpecialStatuses\n\
- ldr r5, =gBankTarget\n\
- ldrb r1, [r5]\n\
- lsls r0, r1, 2\n\
- adds r0, r1\n\
- lsls r2, r0, 2\n\
- adds r0, r3, 0\n\
- adds r0, 0x8\n\
- adds r0, r2, r0\n\
- ldr r0, [r0]\n\
- cmp r0, 0\n\
- bne _08043818\n\
- adds r0, r3, 0\n\
- adds r0, 0xC\n\
- adds r0, r2, r0\n\
- ldr r0, [r0]\n\
- cmp r0, 0\n\
- bne _08043818\n\
- bl _0804441E\n\
-_08043818:\n\
- adds r0, r1, 0\n\
- muls r0, r7\n\
- adds r0, r6\n\
- ldrh r0, [r0, 0x28]\n\
- cmp r0, 0\n\
- bne _08043828\n\
- bl _0804441E\n\
-_08043828:\n\
- bl Random\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- movs r1, 0x3\n\
- bl __umodsi3\n\
- lsls r0, 16\n\
- cmp r0, 0\n\
- beq _08043840\n\
- bl _0804441E\n\
-_08043840:\n\
- mov r1, r8\n\
- ldrb r0, [r1]\n\
- muls r0, r7\n\
- adds r0, r6\n\
- adds r0, 0x20\n\
- ldrb r0, [r0]\n\
- cmp r0, 0xC\n\
- bne _08043854\n\
- bl _0804441E\n\
-_08043854:\n\
- ldr r0, [sp, 0x8]\n\
- ldr r1, [sp, 0x10]\n\
- bl GetGenderFromSpeciesAndPersonality\n\
- adds r4, r0, 0\n\
- ldr r0, [sp, 0xC]\n\
- ldr r1, [sp, 0x14]\n\
- bl GetGenderFromSpeciesAndPersonality\n\
- lsls r4, 24\n\
- lsls r0, 24\n\
- cmp r4, r0\n\
- bne _08043872\n\
- bl _0804441E\n\
-_08043872:\n\
- mov r2, r8\n\
- ldrb r0, [r2]\n\
- muls r0, r7\n\
- adds r4, r6, 0\n\
- adds r4, 0x50\n\
- adds r0, r4\n\
- ldr r0, [r0]\n\
- movs r1, 0xF0\n\
- lsls r1, 12\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0804388E\n\
- bl _0804441E\n\
-_0804388E:\n\
- ldr r0, [sp, 0x8]\n\
- ldr r1, [sp, 0x10]\n\
- bl GetGenderFromSpeciesAndPersonality\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- cmp r0, 0xFF\n\
- bne _080438A2\n\
- bl _0804441E\n\
-_080438A2:\n\
- ldr r0, [sp, 0xC]\n\
- ldr r1, [sp, 0x14]\n\
- bl GetGenderFromSpeciesAndPersonality\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- cmp r0, 0xFF\n\
- bne _080438B6\n\
- bl _0804441E\n\
-_080438B6:\n\
- mov r3, r8\n\
- ldrb r0, [r3]\n\
- adds r2, r0, 0\n\
- muls r2, r7\n\
- adds r2, r4\n\
- ldr r1, =gBitTable\n\
- ldrb r0, [r5]\n\
- lsls r0, 2\n\
- adds r0, r1\n\
- ldr r1, [r0]\n\
- lsls r1, 16\n\
- ldr r0, [r2]\n\
- orrs r0, r1\n\
- str r0, [r2]\n\
- bl BattleScriptPushCursor\n\
- ldr r1, =gBattlescriptCurrInstr\n\
- ldr r0, =BattleScript_CuteCharmActivates\n\
- str r0, [r1]\n\
- bl _080443D0\n\
- .pool\n\
-_08043908:\n\
- movs r5, 0\n\
- mov r10, r5\n\
- ldr r0, =gNoOfAllBanks\n\
- ldrb r0, [r0]\n\
- cmp r10, r0\n\
- bcc _08043918\n\
- bl _0804441E\n\
-_08043918:\n\
- ldr r1, =gBattleMons\n\
- movs r0, 0x58\n\
- mov r2, r10\n\
- muls r2, r0\n\
- adds r0, r2, 0\n\
- adds r0, r1\n\
- adds r0, 0x20\n\
- ldrb r0, [r0]\n\
- subs r0, 0x7\n\
- adds r2, r1, 0\n\
- cmp r0, 0x41\n\
- bls _08043932\n\
- b _08043B96\n\
-_08043932:\n\
- lsls r0, 2\n\
- ldr r1, =_08043948\n\
- adds r0, r1\n\
- ldr r0, [r0]\n\
- mov pc, r0\n\
- .pool\n\
- .align 2, 0\n\
-_08043948:\n\
- .4byte _08043AAC\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B70\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043AD4\n\
- .4byte _08043B96\n\
- .4byte _08043A50\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043A7C\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B40\n\
- .4byte _08043B10\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043B96\n\
- .4byte _08043AD4\n\
-_08043A50:\n\
- movs r0, 0x58\n\
- mov r3, r10\n\
- muls r3, r0\n\
- adds r0, r3, 0\n\
- adds r1, r2, 0\n\
- adds r1, 0x4C\n\
- adds r0, r1\n\
- ldr r0, [r0]\n\
- ldr r1, =0x00000f88\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _08043A6A\n\
- b _08043B96\n\
-_08043A6A:\n\
- ldr r0, =gBattleTextBuff1\n\
- ldr r1, =gStatusConditionString_PoisonJpn\n\
- b _08043B5C\n\
- .pool\n\
-_08043A7C:\n\
- movs r0, 0x58\n\
- mov r1, r10\n\
- muls r1, r0\n\
- adds r0, r1, 0\n\
- adds r1, r2, 0\n\
- adds r1, 0x50\n\
- adds r0, r1\n\
- ldr r0, [r0]\n\
- movs r1, 0x7\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _08043A96\n\
- b _08043B96\n\
-_08043A96:\n\
- ldr r0, =gBattleTextBuff1\n\
- ldr r1, =gStatusConditionString_ConfusionJpn\n\
- bl StringCopy\n\
- movs r2, 0x2\n\
- mov r9, r2\n\
- b _08043B9C\n\
- .pool\n\
-_08043AAC:\n\
- movs r0, 0x58\n\
- mov r3, r10\n\
- muls r3, r0\n\
- adds r0, r3, 0\n\
- adds r1, r2, 0\n\
- adds r1, 0x4C\n\
- adds r0, r1\n\
- ldr r0, [r0]\n\
- movs r1, 0x40\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08043B96\n\
- ldr r0, =gBattleTextBuff1\n\
- ldr r1, =gStatusConditionString_ParalysisJpn\n\
- b _08043B5C\n\
- .pool\n\
-_08043AD4:\n\
- movs r0, 0x58\n\
- mov r3, r10\n\
- muls r3, r0\n\
- adds r0, r2, 0\n\
- adds r0, 0x4C\n\
- adds r0, r3, r0\n\
- ldr r0, [r0]\n\
- movs r1, 0x7\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08043B96\n\
- adds r2, 0x50\n\
- adds r2, r3, r2\n\
- ldr r0, [r2]\n\
- ldr r1, =0xf7ffffff\n\
- ands r0, r1\n\
- str r0, [r2]\n\
- ldr r0, =gBattleTextBuff1\n\
- ldr r1, =gStatusConditionString_SleepJpn\n\
- bl StringCopy\n\
- movs r0, 0x1\n\
- mov r9, r0\n\
- b _08043B9C\n\
- .pool\n\
-_08043B10:\n\
- movs r0, 0x58\n\
- mov r1, r10\n\
- muls r1, r0\n\
- adds r0, r1, 0\n\
- adds r1, r2, 0\n\
- adds r1, 0x4C\n\
- adds r0, r1\n\
- ldr r0, [r0]\n\
- movs r1, 0x10\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08043B96\n\
- ldr r0, =gBattleTextBuff1\n\
- ldr r1, =gStatusConditionString_BurnJpn\n\
- bl StringCopy\n\
- movs r2, 0x1\n\
- mov r9, r2\n\
- b _08043B9C\n\
- .pool\n\
-_08043B40:\n\
- movs r0, 0x58\n\
- mov r3, r10\n\
- muls r3, r0\n\
- adds r0, r3, 0\n\
- adds r1, r2, 0\n\
- adds r1, 0x4C\n\
- adds r0, r1\n\
- ldr r0, [r0]\n\
- movs r1, 0x20\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08043B96\n\
- ldr r0, =gBattleTextBuff1\n\
- ldr r1, =gStatusConditionString_IceJpn\n\
-_08043B5C:\n\
- bl StringCopy\n\
- movs r5, 0x1\n\
- mov r9, r5\n\
- b _08043B9C\n\
- .pool\n\
-_08043B70:\n\
- movs r0, 0x58\n\
- mov r1, r10\n\
- muls r1, r0\n\
- adds r0, r1, 0\n\
- adds r1, r2, 0\n\
- adds r1, 0x50\n\
- adds r0, r1\n\
- ldr r0, [r0]\n\
- movs r1, 0xF0\n\
- lsls r1, 12\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08043B96\n\
- ldr r0, =gBattleTextBuff1\n\
- ldr r1, =gStatusConditionString_LoveJpn\n\
- bl StringCopy\n\
- movs r2, 0x3\n\
- mov r9, r2\n\
-_08043B96:\n\
- mov r3, r9\n\
- cmp r3, 0\n\
- beq _08043C50\n\
-_08043B9C:\n\
- mov r5, r9\n\
- cmp r5, 0x2\n\
- beq _08043BD0\n\
- cmp r5, 0x2\n\
- bgt _08043BB4\n\
- cmp r5, 0x1\n\
- beq _08043BBC\n\
- b _08043BFC\n\
- .pool\n\
-_08043BB4:\n\
- mov r0, r9\n\
- cmp r0, 0x3\n\
- beq _08043BE8\n\
- b _08043BFC\n\
-_08043BBC:\n\
- ldr r1, =gBattleMons\n\
- movs r0, 0x58\n\
- mov r2, r10\n\
- muls r2, r0\n\
- adds r1, 0x4C\n\
- adds r2, r1\n\
- movs r0, 0\n\
- b _08043BFA\n\
- .pool\n\
-_08043BD0:\n\
- ldr r1, =gBattleMons\n\
- movs r0, 0x58\n\
- mov r2, r10\n\
- muls r2, r0\n\
- adds r1, 0x50\n\
- adds r2, r1\n\
- ldr r0, [r2]\n\
- movs r1, 0x8\n\
- negs r1, r1\n\
- b _08043BF8\n\
- .pool\n\
-_08043BE8:\n\
- ldr r1, =gBattleMons\n\
- movs r0, 0x58\n\
- mov r2, r10\n\
- muls r2, r0\n\
- adds r1, 0x50\n\
- adds r2, r1\n\
- ldr r0, [r2]\n\
- ldr r1, =0xfff0ffff\n\
-_08043BF8:\n\
- ands r0, r1\n\
-_08043BFA:\n\
- str r0, [r2]\n\
-_08043BFC:\n\
- bl BattleScriptPushCursor\n\
- ldr r1, =gBattlescriptCurrInstr\n\
- ldr r0, =gUnknown_082DB68C\n\
- str r0, [r1]\n\
- ldr r0, =gBattleScripting\n\
- mov r1, r10\n\
- strb r1, [r0, 0x17]\n\
- ldr r4, =gActiveBank\n\
- strb r1, [r4]\n\
- ldrb r1, [r4]\n\
- movs r0, 0x58\n\
- muls r0, r1\n\
- ldr r1, =gBattleMons + 0x4C\n\
- adds r0, r1\n\
- str r0, [sp]\n\
- movs r0, 0\n\
- movs r1, 0x28\n\
- movs r2, 0\n\
- movs r3, 0x4\n\
- bl EmitSetMonData\n\
- ldrb r0, [r4]\n\
- bl MarkBufferBankForExecution\n\
- bl _0804443A\n\
- .pool\n\
-_08043C50:\n\
- mov r0, r10\n\
- adds r0, 0x1\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- mov r10, r0\n\
- ldr r0, =gNoOfAllBanks\n\
- ldrb r0, [r0]\n\
- cmp r10, r0\n\
- bcs _08043C64\n\
- b _08043918\n\
-_08043C64:\n\
- bl _0804441E\n\
- .pool\n\
-_08043C6C:\n\
- movs r2, 0\n\
- mov r10, r2\n\
- ldr r0, =gNoOfAllBanks\n\
- ldrb r0, [r0]\n\
- cmp r10, r0\n\
- bcc _08043C7A\n\
- b _0804441E\n\
-_08043C7A:\n\
- ldr r4, =gBattleMons\n\
-_08043C7C:\n\
- movs r0, 0x58\n\
- mov r3, r10\n\
- muls r3, r0\n\
- adds r0, r3, 0\n\
- adds r0, r4\n\
- adds r0, 0x20\n\
- ldrb r0, [r0]\n\
- cmp r0, 0x3B\n\
- bne _08043CA0\n\
- mov r0, r10\n\
- bl CastformDataTypeChange\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- mov r9, r0\n\
- cmp r0, 0\n\
- beq _08043CA0\n\
- b _080442FC\n\
-_08043CA0:\n\
- mov r0, r10\n\
- adds r0, 0x1\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- mov r10, r0\n\
- ldr r0, =gNoOfAllBanks\n\
- ldrb r0, [r0]\n\
- cmp r10, r0\n\
- bcc _08043C7C\n\
- b _0804441E\n\
- .pool\n\
-_08043CBC:\n\
- ldrb r0, [r7]\n\
- cmp r0, 0x1C\n\
- beq _08043CC4\n\
- b _0804441E\n\
-_08043CC4:\n\
- ldr r4, =gHitMarker\n\
- ldr r1, [r4]\n\
- movs r0, 0x80\n\
- lsls r0, 7\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _08043CD4\n\
- b _0804441E\n\
-_08043CD4:\n\
- ldr r0, =0xffffbfff\n\
- ands r1, r0\n\
- str r1, [r4]\n\
- mov r5, r8\n\
- ldr r1, [r5]\n\
- adds r1, 0xB2\n\
- ldrb r2, [r1]\n\
- movs r0, 0x3F\n\
- ands r0, r2\n\
- strb r0, [r1]\n\
- ldr r0, [r5]\n\
- adds r1, r0, 0\n\
- adds r1, 0xB2\n\
- ldrb r0, [r1]\n\
- cmp r0, 0x6\n\
- bne _08043CF8\n\
- movs r0, 0x2\n\
- strb r0, [r1]\n\
-_08043CF8:\n\
- ldr r1, =gBattleCommunication\n\
- mov r2, r8\n\
- ldr r0, [r2]\n\
- adds r0, 0xB2\n\
- ldrb r0, [r0]\n\
- adds r0, 0x40\n\
- strb r0, [r1, 0x3]\n\
- ldr r1, =gBattleScripting\n\
- ldr r0, =gBankTarget\n\
- ldrb r0, [r0]\n\
- strb r0, [r1, 0x17]\n\
- bl BattleScriptPushCursor\n\
- ldr r1, =gBattlescriptCurrInstr\n\
- ldr r0, =BattleScript_SynchronizeActivates\n\
- str r0, [r1]\n\
- ldr r0, [r4]\n\
- movs r1, 0x80\n\
- lsls r1, 6\n\
- orrs r0, r1\n\
- str r0, [r4]\n\
- b _080443D0\n\
- .pool\n\
-_08043D40:\n\
- ldrb r0, [r7]\n\
- cmp r0, 0x1C\n\
- beq _08043D48\n\
- b _0804441E\n\
-_08043D48:\n\
- ldr r4, =gHitMarker\n\
- ldr r1, [r4]\n\
- movs r0, 0x80\n\
- lsls r0, 7\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _08043D58\n\
- b _0804441E\n\
-_08043D58:\n\
- ldr r0, =0xffffbfff\n\
- ands r1, r0\n\
- str r1, [r4]\n\
- mov r3, r8\n\
- ldr r1, [r3]\n\
- adds r1, 0xB2\n\
- ldrb r2, [r1]\n\
- movs r0, 0x3F\n\
- ands r0, r2\n\
- strb r0, [r1]\n\
- ldr r0, [r3]\n\
- adds r1, r0, 0\n\
- adds r1, 0xB2\n\
- ldrb r0, [r1]\n\
- cmp r0, 0x6\n\
- bne _08043D7C\n\
- movs r0, 0x2\n\
- strb r0, [r1]\n\
-_08043D7C:\n\
- ldr r1, =gBattleCommunication\n\
- mov r3, r8\n\
- ldr r0, [r3]\n\
- adds r0, 0xB2\n\
- ldrb r0, [r0]\n\
- strb r0, [r1, 0x3]\n\
- ldr r1, =gBattleScripting\n\
- ldr r0, =gBankAttacker\n\
- ldrb r0, [r0]\n\
- strb r0, [r1, 0x17]\n\
- bl BattleScriptPushCursor\n\
- ldr r1, =gBattlescriptCurrInstr\n\
- ldr r0, =BattleScript_SynchronizeActivates\n\
- str r0, [r1]\n\
- ldr r0, [r4]\n\
- movs r1, 0x80\n\
- lsls r1, 6\n\
- orrs r0, r1\n\
- str r0, [r4]\n\
- b _080443D0\n\
- .pool\n\
-_08043DC4:\n\
- movs r4, 0\n\
- ldr r0, =gNoOfAllBanks\n\
- ldrb r1, [r0]\n\
- cmp r4, r1\n\
- blt _08043DD0\n\
- b _0804441E\n\
-_08043DD0:\n\
- ldr r0, =gBattleMons\n\
- adds r5, r1, 0\n\
- ldr r2, =gStatuses3\n\
- adds r3, r0, 0\n\
- adds r3, 0x20\n\
- movs r6, 0x80\n\
- lsls r6, 12\n\
-_08043DDE:\n\
- ldrb r1, [r3]\n\
- cmp r1, 0x16\n\
- bne _08043DEE\n\
- ldr r0, [r2]\n\
- ands r0, r6\n\
- cmp r0, 0\n\
- beq _08043DEE\n\
- b _08044324\n\
-_08043DEE:\n\
- adds r2, 0x4\n\
- adds r3, 0x58\n\
- adds r4, 0x1\n\
- cmp r4, r5\n\
- blt _08043DDE\n\
- b _0804441E\n\
- .pool\n\
-_08043E08:\n\
- movs r4, 0\n\
- ldr r0, =gNoOfAllBanks\n\
- ldrb r0, [r0]\n\
- cmp r4, r0\n\
- blt _08043E14\n\
- b _0804441E\n\
-_08043E14:\n\
- ldr r5, =gActiveBank\n\
- mov r8, r5\n\
- ldr r0, =gBattleMons\n\
- adds r0, 0x20\n\
- str r0, [sp, 0x1C]\n\
- movs r1, 0\n\
- str r1, [sp, 0x20]\n\
-_08043E22:\n\
- ldr r2, [sp, 0x1C]\n\
- ldrb r0, [r2]\n\
- cmp r0, 0x24\n\
- beq _08043E2C\n\
- b _08043FBE\n\
-_08043E2C:\n\
- ldr r0, =gStatuses3\n\
- ldr r3, [sp, 0x20]\n\
- adds r0, r3, r0\n\
- ldr r1, [r0]\n\
- movs r0, 0x80\n\
- lsls r0, 13\n\
- ands r1, r0\n\
- str r3, [sp, 0x18]\n\
- cmp r1, 0\n\
- bne _08043E42\n\
- b _08043FBE\n\
-_08043E42:\n\
- lsls r0, r4, 24\n\
- lsrs r0, 24\n\
- bl GetBankIdentity\n\
- movs r1, 0x1\n\
- adds r5, r0, 0\n\
- eors r5, r1\n\
- ands r5, r1\n\
- adds r0, r5, 0\n\
- bl GetBankByIdentity\n\
- lsls r0, 24\n\
- lsrs r6, r0, 24\n\
- adds r0, r5, 0x2\n\
- bl GetBankByIdentity\n\
- lsls r0, 24\n\
- lsrs r7, r0, 24\n\
- ldr r0, =gBattleTypeFlags\n\
- ldr r0, [r0]\n\
- movs r2, 0x1\n\
- ands r0, r2\n\
- cmp r0, 0\n\
- bne _08043E74\n\
- b _08043F84\n\
-_08043E74:\n\
- movs r1, 0x58\n\
- adds r0, r6, 0\n\
- muls r0, r1\n\
- ldr r3, =gBattleMons\n\
- adds r1, r0, r3\n\
- adds r0, r1, 0\n\
- adds r0, 0x20\n\
- ldrb r0, [r0]\n\
- cmp r0, 0\n\
- beq _08043F40\n\
- ldrh r0, [r1, 0x28]\n\
- cmp r0, 0\n\
- beq _08043EFC\n\
- movs r1, 0x58\n\
- adds r0, r7, 0\n\
- muls r0, r1\n\
- adds r1, r0, r3\n\
- adds r0, r1, 0\n\
- adds r0, 0x20\n\
- ldrb r0, [r0]\n\
- cmp r0, 0\n\
- beq _08043EFC\n\
- ldrh r0, [r1, 0x28]\n\
- cmp r0, 0\n\
- beq _08043EFC\n\
- str r2, [sp, 0x24]\n\
- bl Random\n\
- ldr r2, [sp, 0x24]\n\
- adds r1, r2, 0\n\
- ands r1, r0\n\
- lsls r1, 1\n\
- orrs r5, r1\n\
- adds r0, r5, 0\n\
- bl GetBankByIdentity\n\
- mov r2, r8\n\
- strb r0, [r2]\n\
- ldrb r0, [r2]\n\
- movs r3, 0x58\n\
- muls r0, r3\n\
- ldr r5, =gBattleMons\n\
- adds r0, r5\n\
- adds r0, 0x20\n\
- ldrb r0, [r0]\n\
- ldr r1, [sp, 0x1C]\n\
- strb r0, [r1]\n\
- ldrb r0, [r2]\n\
- muls r0, r3\n\
- adds r0, r5\n\
- adds r0, 0x20\n\
- ldrb r0, [r0]\n\
- ldr r2, =gLastUsedAbility\n\
- strb r0, [r2]\n\
- b _08043FAC\n\
- .pool\n\
-_08043EFC:\n\
- ldr r3, =gBattleMons\n\
- movs r2, 0x58\n\
- adds r0, r6, 0\n\
- muls r0, r2\n\
- adds r1, r0, r3\n\
- adds r0, r1, 0\n\
- adds r0, 0x20\n\
- ldrb r0, [r0]\n\
- cmp r0, 0\n\
- beq _08043F40\n\
- ldrh r0, [r1, 0x28]\n\
- cmp r0, 0\n\
- beq _08043F40\n\
- mov r5, r8\n\
- strb r6, [r5]\n\
- adds r1, r4, 0\n\
- muls r1, r2\n\
- adds r1, r3\n\
- ldrb r0, [r5]\n\
- muls r0, r2\n\
- adds r0, r3\n\
- adds r0, 0x20\n\
- ldrb r0, [r0]\n\
- adds r1, 0x20\n\
- strb r0, [r1]\n\
- ldrb r0, [r5]\n\
- muls r0, r2\n\
- adds r0, r3\n\
- adds r0, 0x20\n\
- ldrb r0, [r0]\n\
- b _08043FA8\n\
- .pool\n\
-_08043F40:\n\
- ldr r3, =gBattleMons\n\
- movs r2, 0x58\n\
- adds r0, r7, 0\n\
- muls r0, r2\n\
- adds r1, r0, r3\n\
- adds r0, r1, 0\n\
- adds r0, 0x20\n\
- ldrb r0, [r0]\n\
- cmp r0, 0\n\
- beq _08043FB6\n\
- ldrh r0, [r1, 0x28]\n\
- cmp r0, 0\n\
- beq _08043FB6\n\
- mov r5, r8\n\
- strb r7, [r5]\n\
- adds r1, r4, 0\n\
- muls r1, r2\n\
- adds r1, r3\n\
- ldrb r0, [r5]\n\
- muls r0, r2\n\
- adds r0, r3\n\
- adds r0, 0x20\n\
- ldrb r0, [r0]\n\
- adds r1, 0x20\n\
- strb r0, [r1]\n\
- ldrb r0, [r5]\n\
- muls r0, r2\n\
- adds r0, r3\n\
- adds r0, 0x20\n\
- ldrb r0, [r0]\n\
- b _08043FA8\n\
- .pool\n\
-_08043F84:\n\
- mov r2, r8\n\
- strb r6, [r2]\n\
- movs r3, 0x58\n\
- adds r0, r6, 0\n\
- muls r0, r3\n\
- ldr r5, =gBattleMons\n\
- adds r0, r5\n\
- adds r2, r0, 0\n\
- adds r2, 0x20\n\
- ldrb r1, [r2]\n\
- cmp r1, 0\n\
- beq _08043FB6\n\
- ldrh r0, [r0, 0x28]\n\
- cmp r0, 0\n\
- beq _08043FB6\n\
- ldr r0, [sp, 0x1C]\n\
- strb r1, [r0]\n\
- ldrb r0, [r2]\n\
-_08043FA8:\n\
- ldr r1, =gLastUsedAbility\n\
- strb r0, [r1]\n\
-_08043FAC:\n\
- mov r0, r9\n\
- adds r0, 0x1\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- mov r9, r0\n\
-_08043FB6:\n\
- mov r2, r9\n\
- cmp r2, 0\n\
- beq _08043FBE\n\
- b _08044340\n\
-_08043FBE:\n\
- ldr r3, [sp, 0x1C]\n\
- adds r3, 0x58\n\
- str r3, [sp, 0x1C]\n\
- ldr r5, [sp, 0x20]\n\
- adds r5, 0x4\n\
- str r5, [sp, 0x20]\n\
- adds r4, 0x1\n\
- ldr r0, =gNoOfAllBanks\n\
- ldrb r0, [r0]\n\
- cmp r4, r0\n\
- bge _08043FD6\n\
- b _08043E22\n\
-_08043FD6:\n\
- b _0804441E\n\
- .pool\n\
-_08043FE4:\n\
- movs r4, 0\n\
- ldr r0, =gNoOfAllBanks\n\
- ldrb r1, [r0]\n\
- cmp r4, r1\n\
- blt _08043FF0\n\
- b _0804441E\n\
-_08043FF0:\n\
- ldr r0, =gBattleMons\n\
- adds r5, r1, 0\n\
- ldr r2, =gStatuses3\n\
- adds r3, r0, 0\n\
- adds r3, 0x20\n\
- movs r6, 0x80\n\
- lsls r6, 12\n\
-_08043FFE:\n\
- ldrb r1, [r3]\n\
- cmp r1, 0x16\n\
- bne _0804400E\n\
- ldr r0, [r2]\n\
- ands r0, r6\n\
- cmp r0, 0\n\
- beq _0804400E\n\
- b _080443B4\n\
-_0804400E:\n\
- adds r2, 0x4\n\
- adds r3, 0x58\n\
- adds r4, 0x1\n\
- cmp r4, r5\n\
- blt _08043FFE\n\
- b _0804441E\n\
- .pool\n\
-_08044028:\n\
- mov r0, r10\n\
- bl GetBankSide\n\
- lsls r0, 24\n\
- lsrs r5, r0, 24\n\
- movs r4, 0\n\
- ldr r0, =gNoOfAllBanks\n\
- ldrb r0, [r0]\n\
- cmp r4, r0\n\
- blt _0804403E\n\
- b _0804441E\n\
-_0804403E:\n\
- ldr r7, =gBattleMons\n\
-_08044040:\n\
- lsls r0, r4, 24\n\
- lsrs r0, 24\n\
- bl GetBankSide\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- adds r3, r4, 0x1\n\
- cmp r0, r5\n\
- beq _0804406A\n\
- movs r0, 0x58\n\
- muls r0, r4\n\
- adds r0, r7\n\
- adds r0, 0x20\n\
- ldrb r0, [r0]\n\
- cmp r0, r6\n\
- bne _0804406A\n\
- ldr r0, =gLastUsedAbility\n\
- strb r6, [r0]\n\
- lsls r0, r3, 24\n\
- lsrs r0, 24\n\
- mov r9, r0\n\
-_0804406A:\n\
- adds r4, r3, 0\n\
- ldr r0, =gNoOfAllBanks\n\
- ldrb r0, [r0]\n\
- cmp r4, r0\n\
- blt _08044040\n\
- b _0804441E\n\
- .pool\n\
-_08044084:\n\
- mov r0, r10\n\
- bl GetBankSide\n\
- lsls r0, 24\n\
- lsrs r5, r0, 24\n\
- movs r4, 0\n\
- ldr r0, =gNoOfAllBanks\n\
- ldrb r0, [r0]\n\
- cmp r4, r0\n\
- blt _0804409A\n\
- b _0804441E\n\
-_0804409A:\n\
- ldr r7, =gBattleMons\n\
-_0804409C:\n\
- lsls r0, r4, 24\n\
- lsrs r0, 24\n\
- bl GetBankSide\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- adds r3, r4, 0x1\n\
- cmp r0, r5\n\
- bne _080440C6\n\
- movs r0, 0x58\n\
- muls r0, r4\n\
- adds r0, r7\n\
- adds r0, 0x20\n\
- ldrb r0, [r0]\n\
- cmp r0, r6\n\
- bne _080440C6\n\
- ldr r0, =gLastUsedAbility\n\
- strb r6, [r0]\n\
- lsls r0, r3, 24\n\
- lsrs r0, 24\n\
- mov r9, r0\n\
-_080440C6:\n\
- adds r4, r3, 0\n\
- ldr r0, =gNoOfAllBanks\n\
- ldrb r0, [r0]\n\
- cmp r4, r0\n\
- blt _0804409C\n\
- b _0804441E\n\
- .pool\n\
-_080440E0:\n\
- ldrb r0, [r7]\n\
- cmp r0, 0xFD\n\
- beq _08044104\n\
- cmp r0, 0xFE\n\
- beq _0804413C\n\
- movs r4, 0\n\
- ldr r0, =gNoOfAllBanks\n\
- adds r5, r0, 0\n\
- ldrb r0, [r5]\n\
- cmp r4, r0\n\
- blt _080440F8\n\
- b _0804441E\n\
-_080440F8:\n\
- ldr r2, =gBattleMons\n\
- b _08044174\n\
- .pool\n\
-_08044104:\n\
- movs r4, 0\n\
- ldr r0, =gNoOfAllBanks\n\
- ldrb r0, [r0]\n\
- cmp r4, r0\n\
- blt _08044110\n\
- b _0804441E\n\
-_08044110:\n\
- ldr r5, =gStatuses3\n\
- movs r2, 0x80\n\
- lsls r2, 9\n\
- adds r1, r0, 0\n\
-_08044118:\n\
- lsls r0, r4, 2\n\
- adds r0, r5\n\
- ldr r0, [r0]\n\
- ands r0, r2\n\
- adds r3, r4, 0x1\n\
- cmp r0, 0\n\
- beq _0804412C\n\
- lsls r0, r3, 24\n\
- lsrs r0, 24\n\
- mov r9, r0\n\
-_0804412C:\n\
- adds r4, r3, 0\n\
- cmp r4, r1\n\
- blt _08044118\n\
- b _0804441E\n\
- .pool\n\
-_0804413C:\n\
- movs r4, 0\n\
- ldr r0, =gNoOfAllBanks\n\
- ldrb r0, [r0]\n\
- cmp r4, r0\n\
- blt _08044148\n\
- b _0804441E\n\
-_08044148:\n\
- ldr r5, =gStatuses3\n\
- movs r2, 0x80\n\
- lsls r2, 10\n\
- adds r1, r0, 0\n\
-_08044150:\n\
- lsls r0, r4, 2\n\
- adds r0, r5\n\
- ldr r0, [r0]\n\
- ands r0, r2\n\
- adds r3, r4, 0x1\n\
- cmp r0, 0\n\
- beq _08044164\n\
- lsls r0, r3, 24\n\
- lsrs r0, 24\n\
- mov r9, r0\n\
-_08044164:\n\
- adds r4, r3, 0\n\
- cmp r4, r1\n\
- blt _08044150\n\
- b _0804441E\n\
- .pool\n\
-_08044174:\n\
- movs r0, 0x58\n\
- muls r0, r4\n\
- adds r0, r2\n\
- adds r0, 0x20\n\
- ldrb r0, [r0]\n\
- adds r3, r4, 0x1\n\
- cmp r0, r6\n\
- bne _0804418C\n\
- strb r6, [r7]\n\
- lsls r0, r3, 24\n\
- lsrs r0, 24\n\
- mov r9, r0\n\
-_0804418C:\n\
- adds r4, r3, 0\n\
- ldrb r1, [r5]\n\
- cmp r4, r1\n\
- blt _08044174\n\
- b _0804441E\n\
-_08044196:\n\
- movs r4, 0\n\
- ldr r0, =gNoOfAllBanks\n\
- ldrb r0, [r0]\n\
- cmp r4, r0\n\
- blt _080441A2\n\
- b _0804441E\n\
-_080441A2:\n\
- ldr r2, =gBattleMons\n\
- mov r8, r2\n\
- adds r2, r0, 0\n\
- movs r5, 0x58\n\
-_080441AA:\n\
- adds r0, r4, 0\n\
- muls r0, r5\n\
- mov r3, r8\n\
- adds r1, r0, r3\n\
- adds r0, r1, 0\n\
- adds r0, 0x20\n\
- ldrb r0, [r0]\n\
- adds r3, r4, 0x1\n\
- cmp r0, r6\n\
- bne _080441CC\n\
- ldrh r0, [r1, 0x28]\n\
- cmp r0, 0\n\
- beq _080441CC\n\
- strb r6, [r7]\n\
- lsls r0, r3, 24\n\
- lsrs r0, 24\n\
- mov r9, r0\n\
-_080441CC:\n\
- adds r4, r3, 0\n\
- cmp r4, r2\n\
- blt _080441AA\n\
- b _0804441E\n\
- .pool\n\
-_080441DC:\n\
- movs r4, 0\n\
- ldr r0, =gNoOfAllBanks\n\
- ldrb r0, [r0]\n\
- cmp r4, r0\n\
- blt _080441E8\n\
- b _0804441E\n\
-_080441E8:\n\
- ldr r7, =gBattleMons\n\
- adds r1, r0, 0\n\
- movs r5, 0x58\n\
- ldr r2, =gLastUsedAbility\n\
-_080441F0:\n\
- adds r0, r4, 0\n\
- muls r0, r5\n\
- adds r0, r7\n\
- adds r0, 0x20\n\
- ldrb r0, [r0]\n\
- adds r3, r4, 0x1\n\
- cmp r0, r6\n\
- bne _0804420C\n\
- cmp r4, r10\n\
- beq _0804420C\n\
- strb r6, [r2]\n\
- lsls r0, r3, 24\n\
- lsrs r0, 24\n\
- mov r9, r0\n\
-_0804420C:\n\
- adds r4, r3, 0\n\
- cmp r4, r1\n\
- blt _080441F0\n\
- b _0804441E\n\
- .pool\n\
-_08044220:\n\
- mov r0, r10\n\
- bl GetBankSide\n\
- lsls r0, 24\n\
- lsrs r5, r0, 24\n\
- movs r4, 0\n\
- ldr r0, =gNoOfAllBanks\n\
- ldrb r0, [r0]\n\
- cmp r4, r0\n\
- blt _08044236\n\
- b _0804441E\n\
-_08044236:\n\
- ldr r7, =gBattleMons\n\
-_08044238:\n\
- lsls r0, r4, 24\n\
- lsrs r0, 24\n\
- bl GetBankSide\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- cmp r0, r5\n\
- beq _08044264\n\
- movs r0, 0x58\n\
- muls r0, r4\n\
- adds r0, r7\n\
- adds r0, 0x20\n\
- ldrb r0, [r0]\n\
- cmp r0, r6\n\
- bne _08044264\n\
- ldr r0, =gLastUsedAbility\n\
- strb r6, [r0]\n\
- mov r0, r9\n\
- adds r0, 0x1\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- mov r9, r0\n\
-_08044264:\n\
- adds r4, 0x1\n\
- ldr r0, =gNoOfAllBanks\n\
- ldrb r0, [r0]\n\
- cmp r4, r0\n\
- blt _08044238\n\
- b _0804441E\n\
- .pool\n\
-_0804427C:\n\
- mov r0, r10\n\
- bl GetBankSide\n\
- lsls r0, 24\n\
- lsrs r5, r0, 24\n\
- movs r4, 0\n\
- ldr r0, =gNoOfAllBanks\n\
- ldrb r0, [r0]\n\
- cmp r4, r0\n\
- blt _08044292\n\
- b _0804441E\n\
-_08044292:\n\
- ldr r7, =gBattleMons\n\
-_08044294:\n\
- lsls r0, r4, 24\n\
- lsrs r0, 24\n\
- bl GetBankSide\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- cmp r0, r5\n\
- bne _080442C0\n\
- movs r0, 0x58\n\
- muls r0, r4\n\
- adds r0, r7\n\
- adds r0, 0x20\n\
- ldrb r0, [r0]\n\
- cmp r0, r6\n\
- bne _080442C0\n\
- ldr r0, =gLastUsedAbility\n\
- strb r6, [r0]\n\
- mov r0, r9\n\
- adds r0, 0x1\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- mov r9, r0\n\
-_080442C0:\n\
- adds r4, 0x1\n\
- ldr r0, =gNoOfAllBanks\n\
- ldrb r0, [r0]\n\
- cmp r4, r0\n\
- blt _08044294\n\
- b _0804441E\n\
- .pool\n\
-_080442D8:\n\
- ldr r0, =BattleScript_CastformChange\n\
- bl BattleScriptPushCursorAndCallback\n\
- ldr r0, =gBattleScripting\n\
- strb r6, [r0, 0x17]\n\
-_080442E2:\n\
- ldr r0, =gBattleStruct\n\
- ldr r0, [r0]\n\
- adds r0, 0x7F\n\
- mov r1, r9\n\
- subs r1, 0x1\n\
- strb r1, [r0]\n\
- b _0804441E\n\
- .pool\n\
-_080442FC:\n\
- ldr r0, =BattleScript_CastformChange\n\
- bl BattleScriptPushCursorAndCallback\n\
- ldr r0, =gBattleScripting\n\
- mov r5, r10\n\
- strb r5, [r0, 0x17]\n\
- ldr r0, =gBattleStruct\n\
- ldr r0, [r0]\n\
- adds r0, 0x7F\n\
- mov r1, r9\n\
- subs r1, 0x1\n\
- strb r1, [r0]\n\
- b _0804443A\n\
- .pool\n\
-_08044324:\n\
- strb r1, [r7]\n\
- ldr r0, [r2]\n\
- ldr r1, =0xfff7ffff\n\
- ands r0, r1\n\
- str r0, [r2]\n\
- ldr r0, =gUnknown_082DB4B8\n\
- bl BattleScriptPushCursorAndCallback\n\
- b _080443C8\n\
- .pool\n\
-_08044340:\n\
- ldr r0, =BattleScript_TraceActivates\n\
- bl BattleScriptPushCursorAndCallback\n\
- ldr r1, =gStatuses3\n\
- ldr r0, [sp, 0x18]\n\
- adds r1, r0, r1\n\
- ldr r0, [r1]\n\
- ldr r2, =0xffefffff\n\
- ands r0, r2\n\
- str r0, [r1]\n\
- ldr r0, =gBattleScripting\n\
- strb r4, [r0, 0x17]\n\
- ldr r1, =gBattleTextBuff1\n\
- movs r4, 0xFD\n\
- strb r4, [r1]\n\
- movs r0, 0x4\n\
- strb r0, [r1, 0x1]\n\
- ldr r2, =gActiveBank\n\
- ldrb r0, [r2]\n\
- strb r0, [r1, 0x2]\n\
- ldr r3, =gBattlePartyID\n\
- ldrb r0, [r2]\n\
- lsls r0, 1\n\
- adds r0, r3\n\
- ldrh r0, [r0]\n\
- strb r0, [r1, 0x3]\n\
- movs r0, 0xFF\n\
- strb r0, [r1, 0x4]\n\
- ldr r1, =gBattleTextBuff2\n\
- strb r4, [r1]\n\
- movs r0, 0x9\n\
- strb r0, [r1, 0x1]\n\
- ldr r0, =gLastUsedAbility\n\
- ldrb r0, [r0]\n\
- strb r0, [r1, 0x2]\n\
- movs r0, 0x1\n\
- negs r0, r0\n\
- strb r0, [r1, 0x3]\n\
- b _0804441E\n\
- .pool\n\
-_080443B4:\n\
- strb r1, [r7]\n\
- ldr r0, [r2]\n\
- ldr r1, =0xfff7ffff\n\
- ands r0, r1\n\
- str r0, [r2]\n\
- bl BattleScriptPushCursor\n\
- ldr r1, =gBattlescriptCurrInstr\n\
- ldr r0, =gUnknown_082DB4C1\n\
- str r0, [r1]\n\
-_080443C8:\n\
- ldr r0, =gBattleStruct\n\
- ldr r0, [r0]\n\
- adds r0, 0xD8\n\
- strb r4, [r0]\n\
-_080443D0:\n\
- mov r0, r9\n\
- adds r0, 0x1\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- mov r9, r0\n\
- b _0804441E\n\
- .pool\n\
-_080443EC:\n\
- movs r4, 0\n\
- ldr r0, =gNoOfAllBanks\n\
- ldrb r1, [r0]\n\
- cmp r4, r1\n\
- bge _0804441E\n\
- ldr r0, =gBattleMons\n\
- adds r2, r1, 0\n\
- adds r1, r0, 0\n\
- adds r1, 0x20\n\
- ldr r3, =gLastUsedAbility\n\
-_08044400:\n\
- ldrb r0, [r1]\n\
- cmp r0, r6\n\
- bne _08044416\n\
- cmp r4, r10\n\
- beq _08044416\n\
- strb r6, [r3]\n\
- mov r0, r9\n\
- adds r0, 0x1\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- mov r9, r0\n\
-_08044416:\n\
- adds r1, 0x58\n\
- adds r4, 0x1\n\
- cmp r4, r2\n\
- blt _08044400\n\
-_0804441E:\n\
- mov r1, r9\n\
- cmp r1, 0\n\
- beq _0804443A\n\
-_08044424:\n\
- ldr r2, [sp, 0x4]\n\
- cmp r2, 0xB\n\
- bhi _0804443A\n\
- ldr r1, =gLastUsedAbility\n\
- ldrb r0, [r1]\n\
- cmp r0, 0xFF\n\
- beq _0804443A\n\
- adds r1, r0, 0\n\
- mov r0, r10\n\
- bl RecordAbilityBattle\n\
-_0804443A:\n\
- mov r0, r9\n\
- add sp, 0x28\n\
- pop {r3-r5}\n\
- mov r8, r3\n\
- mov r9, r4\n\
- mov r10, r5\n\
- pop {r4-r7}\n\
- pop {r1}\n\
- bx r1\n\
- .pool\n\
- .syntax divided");
-}
-#endif // NONMATCHING
void BattleScriptExecute(const u8* BS_ptr)
{
diff --git a/src/braille_puzzles.c b/src/braille_puzzles.c
index 83d32b56c..9a6f0371c 100755
--- a/src/braille_puzzles.c
+++ b/src/braille_puzzles.c
@@ -220,7 +220,7 @@ bool8 ShouldDoBrailleStrengthEffect(void)
void sub_8179834(void)
{
- gFieldEffectSpawnParams[0] = brm_get_pokemon_selection();
+ gFieldEffectArguments[0] = brm_get_pokemon_selection();
FieldEffectStart(FLDEFF_USE_FLY_ANCIENT_TOMB);
}
@@ -256,7 +256,7 @@ bool8 ShouldDoBrailleFlyEffect(void)
void sub_8179918(void)
{
- gFieldEffectSpawnParams[0] = brm_get_pokemon_selection();
+ gFieldEffectArguments[0] = brm_get_pokemon_selection();
FieldEffectStart(FLDEFF_USE_FLY_ANCIENT_TOMB);
}
@@ -417,7 +417,7 @@ bool8 ShouldDoBrailleRegicePuzzle(void)
}
// TODO: Find what flags 2 and 3 are.
FlagSet(3);
- FlagReset(2);
+ FlagClear(2);
return FALSE;
}
#else
@@ -568,7 +568,7 @@ _08179B44:\n\
movs r0, 0x3\n\
bl FlagSet\n\
movs r0, 0x2\n\
- bl FlagReset\n\
+ bl FlagClear\n\
_08179B5A:\n\
movs r0, 0\n\
_08179B5C:\n\
diff --git a/src/coins.c b/src/coins.c
index 9c2d35168..e1694b29c 100644
--- a/src/coins.c
+++ b/src/coins.c
@@ -54,7 +54,7 @@ void SetCoins(u16 coinAmount)
}
/* Can't match it lol
-bool8 AddCoins(u16 toAdd)
+bool8 GiveCoins(u16 toAdd)
{
u16 newAmount;
u16 ownedCoins = GetCoins();
diff --git a/src/diploma.c b/src/diploma.c
index f2cbcabb7..d4a269757 100755
--- a/src/diploma.c
+++ b/src/diploma.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "diploma.h"
#include "palette.h"
#include "main.h"
#include "gpu_regs.h"
@@ -33,7 +34,7 @@ static void InitDiplomaBg(void);
static void InitDiplomaWindow(void);
static void PrintDiplomaText(u8 *, u8, u8);
-EWRAM_DATA void **gDiplomaTilemapPtr = {NULL};
+EWRAM_DATA static void **sDiplomaTilemapPtr = {NULL};
static void VBlankCB(void)
{
@@ -42,14 +43,14 @@ static void VBlankCB(void)
TransferPlttBuffer();
}
-static const u16 gDiplomaPalettes[][16] =
+static const u16 sDiplomaPalettes[][16] =
{
INCBIN_U16("graphics/misc/diploma_national.gbapal"),
INCBIN_U16("graphics/misc/diploma_hoenn.gbapal"),
};
-static const u8 gDiplomaTilemap[] = INCBIN_U8("graphics/misc/diploma_map.bin.lz");
-static const u8 gDiplomaTiles[] = INCBIN_U8("graphics/misc/diploma.4bpp.lz");
+static const u8 sDiplomaTilemap[] = INCBIN_U8("graphics/misc/diploma_map.bin.lz");
+static const u8 sDiplomaTiles[] = INCBIN_U8("graphics/misc/diploma.4bpp.lz");
void CB2_ShowDiploma(void)
{
@@ -76,15 +77,15 @@ void CB2_ShowDiploma(void)
ResetSpriteData();
ResetPaletteFade();
FreeAllSpritePalettes();
- LoadPalette(gDiplomaPalettes, 0, 64);
- gDiplomaTilemapPtr = malloc(0x1000);
+ LoadPalette(sDiplomaPalettes, 0, 64);
+ sDiplomaTilemapPtr = malloc(0x1000);
InitDiplomaBg();
InitDiplomaWindow();
reset_temp_tile_data_buffers();
- decompress_and_copy_tile_data_to_vram(1, &gDiplomaTiles, 0, 0, 0);
+ decompress_and_copy_tile_data_to_vram(1, &sDiplomaTiles, 0, 0, 0);
while (free_temp_tile_data_buffers_if_possible())
;
- LZDecompressWram(&gDiplomaTilemap, gDiplomaTilemapPtr);
+ LZDecompressWram(&sDiplomaTilemap, sDiplomaTilemapPtr);
CopyBgTilemapBufferToVram(1);
DisplayDiplomaText();
BlendPalettes(-1, 16, 0);
@@ -122,7 +123,7 @@ static void Task_DiplomaFadeOut(u8 taskId)
{
if (!gPaletteFade.active)
{
- Free(gDiplomaTilemapPtr);
+ Free(sDiplomaTilemapPtr);
FreeAllWindowBuffers();
DestroyTask(taskId);
SetMainCallback2(sub_80861E8);
@@ -147,7 +148,7 @@ static void DisplayDiplomaText(void)
CopyWindowToVram(0, 3);
}
-static const struct BgTemplate gDiplomaBgTemplates[2] =
+static const struct BgTemplate sDiplomaBgTemplates[2] =
{
{
.bg = 0,
@@ -172,8 +173,8 @@ static const struct BgTemplate gDiplomaBgTemplates[2] =
static void InitDiplomaBg(void)
{
ResetBgsAndClearDma3BusyFlags(0);
- InitBgsFromTemplates(0, gDiplomaBgTemplates, 2);
- SetBgTilemapBuffer(1, gDiplomaTilemapPtr);
+ InitBgsFromTemplates(0, sDiplomaBgTemplates, 2);
+ SetBgTilemapBuffer(1, sDiplomaTilemapPtr);
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
ShowBg(0);
ShowBg(1);
@@ -182,7 +183,7 @@ static void InitDiplomaBg(void)
SetGpuReg(REG_OFFSET_BLDY, DISPCNT_MODE_0);
}
-static const struct WindowTemplate gDiplomaWinTemplates[2] =
+static const struct WindowTemplate sDiplomaWinTemplates[2] =
{
{
.priority = 0,
@@ -198,7 +199,7 @@ static const struct WindowTemplate gDiplomaWinTemplates[2] =
static void InitDiplomaWindow(void)
{
- InitWindows(gDiplomaWinTemplates);
+ InitWindows(sDiplomaWinTemplates);
DeactivateAllTextPrinters();
LoadPalette(gUnknown_0860F074, 0xF0, 0x20);
FillWindowPixelBuffer(0, 0);
diff --git a/src/egg_hatch.c b/src/egg_hatch.c
index 4e4c10090..a1f187b85 100644
--- a/src/egg_hatch.c
+++ b/src/egg_hatch.c
@@ -59,7 +59,7 @@ extern u8* GetMonNick(struct Pokemon* mon, u8* dst);
extern u8* GetBoxMonNick(struct BoxPokemon* boxMon, u8* dst);
extern u8 sav1_map_get_name(void);
extern s8 sub_8198C58(void);
-extern void sub_81DB5E8(u8* str1, u8* str2, u8);
+extern void TVShowConvertInternationalString(u8* str1, u8* str2, u8);
extern void sub_806A068(u16, u8);
extern void fade_screen(u8, u8);
extern void overworld_free_bg_tilemaps(void);
@@ -404,8 +404,8 @@ static bool8 sub_807158C(struct DaycareData* daycare, u8 daycareId)
|| StringCompareWithoutExtCtrlCodes(gSaveBlock2Ptr->playerName, daycareMon->OT_name) != 0))
{
StringCopy(gStringVar1, nick);
- sub_81DB5E8(gStringVar2, daycareMon->OT_name, daycareMon->language_maybe);
- sub_81DB5E8(gStringVar3, daycareMon->monName, daycareMon->unknown);
+ TVShowConvertInternationalString(gStringVar2, daycareMon->OT_name, daycareMon->language_maybe);
+ TVShowConvertInternationalString(gStringVar3, daycareMon->monName, daycareMon->unknown);
return TRUE;
}
return FALSE;
diff --git a/src/event_data.c b/src/event_data.c
index fb2edb063..19a310db5 100644
--- a/src/event_data.c
+++ b/src/event_data.c
@@ -40,11 +40,11 @@ void ClearTempFieldEventData(void)
{
memset(gSaveBlock1Ptr->flags, 0, TEMP_FLAGS_SIZE);
memset(gSaveBlock1Ptr->vars, 0, TEMP_VARS_SIZE);
- FlagReset(SYS_ENC_UP_ITEM);
- FlagReset(SYS_ENC_DOWN_ITEM);
- FlagReset(SYS_USE_STRENGTH);
- FlagReset(SYS_CTRL_OBJ_DELETE);
- FlagReset(SYS_UNKNOWN_880);
+ FlagClear(SYS_ENC_UP_ITEM);
+ FlagClear(SYS_ENC_DOWN_ITEM);
+ FlagClear(SYS_USE_STRENGTH);
+ FlagClear(SYS_CTRL_OBJ_DELETE);
+ FlagClear(SYS_UNKNOWN_880);
}
// probably had different flag splits at one point.
@@ -58,7 +58,7 @@ void DisableNationalPokedex(void)
u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX);
gSaveBlock2Ptr->pokedex.nationalMagic = 0;
*nationalDexVar = 0;
- FlagReset(SYS_NATIONAL_DEX);
+ FlagClear(SYS_NATIONAL_DEX);
}
void EnableNationalPokedex(void)
@@ -82,7 +82,7 @@ bool32 IsNationalPokedexEnabled(void)
void DisableMysteryEvent(void)
{
- FlagReset(SYS_MYSTERY_EVENT_ENABLE);
+ FlagClear(SYS_MYSTERY_EVENT_ENABLE);
}
void EnableMysteryEvent(void)
@@ -97,7 +97,7 @@ bool32 IsMysteryEventEnabled(void)
void DisableMysteryGift(void)
{
- FlagReset(SYS_MYSTERY_GIFT_ENABLE);
+ FlagClear(SYS_MYSTERY_GIFT_ENABLE);
}
void EnableMysteryGift(void)
@@ -112,22 +112,22 @@ bool32 IsMysteryGiftEnabled(void)
void sub_809D4D8(void)
{
- FlagReset(0x1E4);
- FlagReset(0x1E5);
- FlagReset(0x1E6);
- FlagReset(0x1E7);
- FlagReset(0x1E8);
- FlagReset(0x1E9);
- FlagReset(0x1EA);
- FlagReset(0x1EB);
- FlagReset(0x1EC);
- FlagReset(0x1ED);
- FlagReset(0x1EE);
- FlagReset(0x1EF);
- FlagReset(0x1F0);
- FlagReset(0x1F1);
- FlagReset(0x1F2);
- FlagReset(0x1F3);
+ FlagClear(0x1E4);
+ FlagClear(0x1E5);
+ FlagClear(0x1E6);
+ FlagClear(0x1E7);
+ FlagClear(0x1E8);
+ FlagClear(0x1E9);
+ FlagClear(0x1EA);
+ FlagClear(0x1EB);
+ FlagClear(0x1EC);
+ FlagClear(0x1ED);
+ FlagClear(0x1EE);
+ FlagClear(0x1EF);
+ FlagClear(0x1F0);
+ FlagClear(0x1F1);
+ FlagClear(0x1F2);
+ FlagClear(0x1F3);
}
void sub_809D570(void)
@@ -145,7 +145,7 @@ void sub_809D570(void)
void DisableResetRTC(void)
{
VarSet(VAR_RESET_RTC_ENABLE, 0);
- FlagReset(SYS_RESET_RTC_ENABLE);
+ FlagClear(SYS_RESET_RTC_ENABLE);
}
void EnableResetRTC(void)
@@ -214,7 +214,7 @@ u8 FlagSet(u16 id)
return 0;
}
-u8 FlagReset(u16 id)
+u8 FlagClear(u16 id)
{
u8 *ptr = GetFlagPointer(id);
if (ptr)
diff --git a/src/field_map_obj.c b/src/field_map_obj.c
index e80e402c8..e822fc1ca 100755
--- a/src/field_map_obj.c
+++ b/src/field_map_obj.c
@@ -3,7 +3,7 @@
#include "global.h"
#include "malloc.h"
#include "sprite.h"
-#include "rom4.h"
+#include "overworld.h"
#include "rng.h"
#include "event_scripts.h"
#include "berry.h"
@@ -2386,10 +2386,10 @@ bool8 do_berry_tree_growth_sparkle_1 (struct MapObject *mapObject, struct Sprite
{
if (!(sprite->data7 & 0x0004) && sprite->animNum == 4)
{
- gFieldEffectSpawnParams[0] = mapObject->coords2.x;
- gFieldEffectSpawnParams[1] = mapObject->coords2.y;
- gFieldEffectSpawnParams[2] = sprite->subpriority - 1;
- gFieldEffectSpawnParams[3] = sprite->oam.priority;
+ gFieldEffectArguments[0] = mapObject->coords2.x;
+ gFieldEffectArguments[1] = mapObject->coords2.y;
+ gFieldEffectArguments[2] = sprite->subpriority - 1;
+ gFieldEffectArguments[3] = sprite->oam.priority;
FieldEffectStart(FLDEFF_BERRY_TREE_GROWTH_SPARKLE);
sprite->animNum = berryStage;
}
@@ -2425,10 +2425,10 @@ bool8 do_berry_tree_growth_sparkle_2 (struct MapObject *mapObject, struct Sprite
sprite->data1 = 3;
sprite->data2 = 0;
sprite->data7 |= 0x0002;
- gFieldEffectSpawnParams[0] = mapObject->coords2.x;
- gFieldEffectSpawnParams[1] = mapObject->coords2.y;
- gFieldEffectSpawnParams[2] = sprite->subpriority - 1;
- gFieldEffectSpawnParams[3] = sprite->oam.priority;
+ gFieldEffectArguments[0] = mapObject->coords2.x;
+ gFieldEffectArguments[1] = mapObject->coords2.y;
+ gFieldEffectArguments[2] = sprite->subpriority - 1;
+ gFieldEffectArguments[3] = sprite->oam.priority;
FieldEffectStart(FLDEFF_BERRY_TREE_GROWTH_SPARKLE);
return TRUE;
}
@@ -3425,7 +3425,7 @@ void FieldObjectCB_TreeDisguise(struct Sprite *sprite)
mapObject = &gMapObjects[sprite->data0];
if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && !sprite->data7))
{
- FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectSpawnParams[0], (u8 *)&gFieldEffectSpawnParams[1], (u8 *)&gFieldEffectSpawnParams[2]);
+ FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]);
mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_TREE_DISGUISE);
mapObject->mapobj_unk_21 = 1;
sprite->data7 ++;
@@ -3446,7 +3446,7 @@ void FieldObjectCB_MountainDisguise(struct Sprite *sprite)
mapObject = &gMapObjects[sprite->data0];
if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && !sprite->data7))
{
- FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectSpawnParams[0], (u8 *)&gFieldEffectSpawnParams[1], (u8 *)&gFieldEffectSpawnParams[2]);
+ FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]);
mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_MOUNTAIN_DISGUISE);
mapObject->mapobj_unk_21 = 1;
sprite->data7 ++;
@@ -4693,7 +4693,7 @@ bool8 sub_80954CC(struct MapObject *mapObject, struct Sprite *sprite)
bool8 do_exclamation_mark_bubble_1(struct MapObject *mapObject, struct Sprite *sprite)
{
- FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectSpawnParams[0], (u8 *)&gFieldEffectSpawnParams[1], (u8 *)&gFieldEffectSpawnParams[2]);
+ FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]);
FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_1);
sprite->data2 = 1;
return TRUE;
@@ -4701,7 +4701,7 @@ bool8 do_exclamation_mark_bubble_1(struct MapObject *mapObject, struct Sprite *s
bool8 do_exclamation_mark_bubble_2(struct MapObject *mapObject, struct Sprite *sprite)
{
- FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectSpawnParams[0], (u8 *)&gFieldEffectSpawnParams[1], (u8 *)&gFieldEffectSpawnParams[2]);
+ FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]);
FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_2);
sprite->data2 = 1;
return TRUE;
@@ -4709,7 +4709,7 @@ bool8 do_exclamation_mark_bubble_2(struct MapObject *mapObject, struct Sprite *s
bool8 do_heart_bubble(struct MapObject *mapObject, struct Sprite *sprite)
{
- FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectSpawnParams[0], (u8 *)&gFieldEffectSpawnParams[1], (u8 *)&gFieldEffectSpawnParams[2]);
+ FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]);
FieldEffectStart(FLDEFF_HEART_ICON);
sprite->data2 = 1;
return TRUE;
diff --git a/src/field_special_scene.c b/src/field_special_scene.c
index 9c35a33da..54c1d8144 100755
--- a/src/field_special_scene.c
+++ b/src/field_special_scene.c
@@ -13,10 +13,10 @@
#define SECONDS(value) ((signed) (60.0 * value + 0.5))
extern u8 GetSSTidalLocation(s8 *, s8 *, s16 *, s16 *); // should be in field_specials.h
-extern void warp1_set(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y);
-extern bool8 sub_80D3340(u8, u8, u8);
+extern void Overworld_SetWarpDestination(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y);
+extern bool8 ScriptMovement_IsObjectMovementFinished(u8, u8, u8);
extern bool32 CountSSTidalStep(u16);
-extern bool8 exec_movement(u8, u8, u8, u8 *);
+extern bool8 ScriptMovement_StartObjectMovementScript(u8, u8, u8, u8 *);
extern void copy_saved_warp2_bank_and_enter_x_to_warp1(u8 unused);
extern void sp13E_warp_to_last_warp(void);
extern void saved_warp2_set(int unused, s8 mapGroup, s8 mapNum, s8 warpId);
@@ -264,7 +264,7 @@ bool8 sub_80FB59C(void)
}
else
{
- warp1_set(mapGroup, mapNum, -1, x, y);
+ Overworld_SetWarpDestination(mapGroup, mapNum, -1, x, y);
return TRUE;
}
}
@@ -287,7 +287,7 @@ void Task_HandlePorthole(u8 taskId)
case IDLE_CHECK: // idle and move.
if (gMain.newKeys & A_BUTTON)
data[1] = 1;
- if (!sub_80D3340(0xFF, location->mapNum, location->mapGroup))
+ if (!ScriptMovement_IsObjectMovementFinished(0xFF, location->mapNum, location->mapGroup))
return;
if (CountSSTidalStep(1) == TRUE)
{
@@ -308,18 +308,18 @@ void Task_HandlePorthole(u8 taskId)
// run this once.
if (*var == 2) // which direction?
{
- exec_movement(0xFF, location->mapNum, location->mapGroup, gUnknown_0858E8AB);
+ ScriptMovement_StartObjectMovementScript(0xFF, location->mapNum, location->mapGroup, gUnknown_0858E8AB);
data[0] = IDLE_CHECK; // run case 1.
}
else
{
- exec_movement(0xFF, location->mapNum, location->mapGroup, gUnknown_0858E8AD);
+ ScriptMovement_StartObjectMovementScript(0xFF, location->mapNum, location->mapGroup, gUnknown_0858E8AD);
data[0] = IDLE_CHECK; // run case 1.
}
break;
case EXIT_PORTHOLE: // exit porthole.
- FlagReset(0x4001);
- FlagReset(0x4000);
+ FlagClear(0x4001);
+ FlagClear(0x4000);
copy_saved_warp2_bank_and_enter_x_to_warp1(0);
sp13E_warp_to_last_warp();
DestroyTask(taskId);
diff --git a/src/lilycove_lady.c b/src/lilycove_lady.c
index 9f38824f9..3b7ae49f2 100644
--- a/src/lilycove_lady.c
+++ b/src/lilycove_lady.c
@@ -4,7 +4,7 @@
#include "global.h"
#include "main.h"
-#include "rom4.h"
+#include "overworld.h"
#include "rom6.h"
#include "event_data.h"
#include "script.h"
diff --git a/src/money.c b/src/money.c
index 65a45b158..98f25a42a 100644
--- a/src/money.c
+++ b/src/money.c
@@ -110,7 +110,7 @@ void AddMoney(u32* moneyPtr, u32 toAdd)
SetMoney(moneyPtr, toSet);
}
-void SubtractMoney(u32* moneyPtr, u32 toSub)
+void RemoveMoney(u32* moneyPtr, u32 toSub)
{
u32 toSet = GetMoney(moneyPtr);
@@ -130,7 +130,7 @@ bool8 IsEnoughForCostInVar0x8005(void)
void SubtractMoneyFromVar0x8005(void)
{
- SubtractMoney(&gSaveBlock1Ptr->money, gSpecialVar_0x8005);
+ RemoveMoney(&gSaveBlock1Ptr->money, gSpecialVar_0x8005);
}
void PrintMoneyAmountInMoneyBox(u8 windowId, int amount, u8 speed)
diff --git a/src/new_game.c b/src/new_game.c
index 5a482c593..d0666dd71 100644
--- a/src/new_game.c
+++ b/src/new_game.c
@@ -17,6 +17,7 @@
#include "easy_chat.h"
#include "event_data.h"
#include "money.h"
+#include "tv.h"
#include "coins.h"
#include "text.h"
@@ -28,7 +29,7 @@ extern u8 gUnknown_030060B0;
// TODO: replace those declarations with file headers
extern u16 GetGeneratedTrainerIdLower(void);
extern void ClearContestWinnerPicsInContestHall(void);
-extern void warp1_set(s8 mapBank, s8 mapNo, s8 warpNo, s8 xPos, s8 yPos);
+extern void Overworld_SetWarpDestination(s8 mapBank, s8 mapNo, s8 warpNo, s8 xPos, s8 yPos);
extern void warp_in(void);
extern void sub_80BB358(void);
extern void ResetBagScrollPositions(void);
@@ -36,7 +37,6 @@ extern void sub_813624C(void); // clears something pokeblock related
extern void ResetPokedex(void);
extern void sub_8084400(void);
extern void ClearMailData(void);
-extern void ClearTVShowData(void);
extern void ResetGabbyAndTy(void);
extern void ResetSecretBases(void);
extern void ResetLinkContestBoolean(void);
@@ -131,7 +131,7 @@ void sub_8084400(void)
void WarpToTruck(void)
{
- warp1_set(25, 40, -1, -1, -1); // inside of truck
+ Overworld_SetWarpDestination(25, 40, -1, -1, -1); // inside of truck
warp_in();
}
diff --git a/src/palette.c b/src/palette.c
index d60efdbc5..d4bb593da 100644
--- a/src/palette.c
+++ b/src/palette.c
@@ -53,13 +53,13 @@ static void UpdateBlendRegisters(void);
static bool8 IsSoftwarePaletteFadeFinishing(void);
static void sub_80A2D54(u8 taskId);
-EWRAM_DATA u16 gPlttBufferUnfaded[0x200] = {0};
-EWRAM_DATA u16 gPlttBufferFaded[0x200] = {0};
+EWRAM_DATA u16 gPlttBufferUnfaded[PLTT_BUFFER_SIZE] = {0};
+EWRAM_DATA u16 gPlttBufferFaded[PLTT_BUFFER_SIZE] = {0};
EWRAM_DATA struct PaletteStruct sPaletteStructs[0x10] = {0};
EWRAM_DATA struct PaletteFadeControl gPaletteFade = {0};
static EWRAM_DATA u32 gFiller_2037FE0 = 0;
static EWRAM_DATA u32 sPlttBufferTransferPending = 0;
-EWRAM_DATA u8 gPaletteDecompressionBuffer[0x400] = {0};
+EWRAM_DATA u8 gPaletteDecompressionBuffer[PLTT_DECOMP_BUFFER_SIZE] = {0};
static const struct PaletteStructTemplate gDummyPaletteStructTemplate = {
.uid = 0xFFFF,
diff --git a/src/pokemon_2.c b/src/pokemon_2.c
index 8a16954a7..27441f952 100644
--- a/src/pokemon_2.c
+++ b/src/pokemon_2.c
@@ -28,7 +28,7 @@ extern const u32 gBitTable[];
extern const struct SpriteTemplate gUnknown_08329D98[];
extern const struct SpriteTemplate gUnknown_08329DF8[];
extern const union AnimCmd* gUnknown_082FF70C[];
-extern const union AnimCmd* const * const gUnknown_08309AAC[];
+extern const union AnimCmd* const * const gMonAnimationsSpriteAnimsPtrTable[];
extern const union AnimCmd* const * const gUnknown_08305D0C[];
extern const union AnimCmd* const * const gUnknown_0830536C[];
extern const u8 gText_BadEgg[];
@@ -165,9 +165,9 @@ void sub_806A068(u16 species, u8 bankIdentity)
if (bankIdentity == 0 || bankIdentity == 2)
gUnknown_0202499C.anims = gUnknown_082FF70C;
else if (species > 500)
- gUnknown_0202499C.anims = gUnknown_08309AAC[species - 500];
+ gUnknown_0202499C.anims = gMonAnimationsSpriteAnimsPtrTable[species - 500];
else
- gUnknown_0202499C.anims = gUnknown_08309AAC[species];
+ gUnknown_0202499C.anims = gMonAnimationsSpriteAnimsPtrTable[species];
}
void sub_806A12C(u16 trainerSpriteId, u8 bankIdentity)
@@ -1089,7 +1089,7 @@ u8 SendMonToPC(struct Pokemon* mon)
gSpecialVar_0x8012 = boxNo;
gSpecialVar_0x8013 = boxPos;
if (get_unknown_box_id() != boxNo)
- FlagReset(SYS_STORAGE_UNKNOWN_FLAG);
+ FlagClear(SYS_STORAGE_UNKNOWN_FLAG);
VarSet(VAR_STORAGE_UNKNOWN, boxNo);
return MON_GIVEN_TO_PC;
}
diff --git a/src/reset_save_heap.c b/src/reset_save_heap.c
index b786ff9f8..d4dbc5f42 100644
--- a/src/reset_save_heap.c
+++ b/src/reset_save_heap.c
@@ -5,7 +5,7 @@
#include "load_save.h"
#include "save.h"
#include "new_game.h"
-#include "rom4.h"
+#include "overworld.h"
#include "malloc.h"
void sub_81700F8(void)
diff --git a/src/reshow_battle_screen.c b/src/reshow_battle_screen.c
new file mode 100644
index 000000000..25c2ca658
--- /dev/null
+++ b/src/reshow_battle_screen.c
@@ -0,0 +1,354 @@
+#include "global.h"
+#include "reshow_battle_screen.h"
+#include "battle.h"
+#include "palette.h"
+#include "main.h"
+#include "unknown_task.h"
+#include "text.h"
+#include "gpu_regs.h"
+#include "bg.h"
+#include "battle_controllers.h"
+#include "link.h"
+#include "sprite.h"
+#include "species.h"
+#include "battle_interface.h"
+
+extern u16 gBattle_BG0_X;
+extern u16 gBattle_BG0_Y;
+extern u16 gBattle_BG1_X;
+extern u16 gBattle_BG1_Y;
+extern u16 gBattle_BG2_X;
+extern u16 gBattle_BG2_Y;
+extern u16 gBattle_BG3_X;
+extern u16 gBattle_BG3_Y;
+extern u8 gReservedSpritePaletteCount;
+extern u8 gActionSelectionCursor[BATTLE_BANKS_COUNT];
+extern u8 gBankInMenu;
+extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
+extern u8 gNoOfAllBanks;
+extern u32 gBattleTypeFlags;
+extern u8 gBankSpriteIds[BATTLE_BANKS_COUNT];
+extern u8 gBattleMonForms[BATTLE_BANKS_COUNT];
+extern u8 gHealthBoxesIds[BATTLE_BANKS_COUNT];
+extern struct SpriteTemplate gUnknown_0202499C;
+
+extern const union AnimCmd * const * const gMonAnimationsSpriteAnimsPtrTable[];
+
+extern void dp12_8087EA4(void);
+extern void trs_config(void);
+extern bool8 IsDoubleBattle(void);
+extern u8 sub_80A614C(u8 bank);
+extern u8 sub_80A6138(u8 bank);
+extern u8 sub_80A82E4(u8 bank);
+extern void sub_806A068(u16 species, u8 bankIdentity);
+extern void sub_806A12C(u16 backPicId, u8 bankIdentity);
+extern u8 sub_80A5C6C(u8 bank, u8 caseId);
+
+// this file's functions
+static void CB2_ReshowBattleScreenAfterMenu(void);
+static bool8 LoadBankSpriteGfx(u8 bank);
+static void CreateBankSprite(u8 bank);
+static void CreateHealthboxSprite(u8 bank);
+static void sub_80A95F4(void);
+
+void nullsub_35(void)
+{
+
+}
+
+void ReshowBattleScreenAfterMenu(void)
+{
+ gPaletteFade.bufferTransferDisabled = 1;
+ SetHBlankCallback(NULL);
+ SetVBlankCallback(NULL);
+ SetGpuReg(REG_OFFSET_MOSAIC, 0);
+ gBattleScripting.reshowMainState = 0;
+ gBattleScripting.reshowHelperState = 0;
+ SetMainCallback2(CB2_ReshowBattleScreenAfterMenu);
+}
+
+static void CB2_ReshowBattleScreenAfterMenu(void)
+{
+ switch (gBattleScripting.reshowMainState)
+ {
+ case 0:
+ dp12_8087EA4();
+ trs_config();
+ SetBgAttribute(1, BG_CTRL_ATTR_VISIBLE, 0);
+ SetBgAttribute(2, BG_CTRL_ATTR_VISIBLE, 0);
+ ShowBg(0);
+ ShowBg(1);
+ ShowBg(2);
+ ShowBg(3);
+ ResetPaletteFade();
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 0;
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ gBattle_BG2_X = 0;
+ gBattle_BG2_Y = 0;
+ gBattle_BG3_X = 0;
+ gBattle_BG3_Y = 0;
+ break;
+ case 1:
+ CpuFastFill(0, (void*)(VRAM), VRAM_SIZE);
+ break;
+ case 2:
+ LoadBattleTextboxAndBackground();
+ break;
+ case 3:
+ ResetSpriteData();
+ break;
+ case 4:
+ FreeAllSpritePalettes();
+ gReservedSpritePaletteCount = 4;
+ break;
+ case 5:
+ sub_805E350();
+ break;
+ case 6:
+ if (BattleLoadAllHealthBoxesGfx(gBattleScripting.reshowHelperState))
+ {
+ gBattleScripting.reshowHelperState = 0;
+ }
+ else
+ {
+ gBattleScripting.reshowHelperState++;
+ gBattleScripting.reshowMainState--;
+ }
+ break;
+ case 7:
+ if (!LoadBankSpriteGfx(0))
+ gBattleScripting.reshowMainState--;
+ break;
+ case 8:
+ if (!LoadBankSpriteGfx(1))
+ gBattleScripting.reshowMainState--;
+ break;
+ case 9:
+ if (!LoadBankSpriteGfx(2))
+ gBattleScripting.reshowMainState--;
+ break;
+ case 10:
+ if (!LoadBankSpriteGfx(3))
+ gBattleScripting.reshowMainState--;
+ break;
+ case 11:
+ CreateBankSprite(0);
+ break;
+ case 12:
+ CreateBankSprite(1);
+ break;
+ case 13:
+ CreateBankSprite(2);
+ break;
+ case 14:
+ CreateBankSprite(3);
+ break;
+ case 15:
+ CreateHealthboxSprite(0);
+ break;
+ case 16:
+ CreateHealthboxSprite(1);
+ break;
+ case 17:
+ CreateHealthboxSprite(2);
+ break;
+ case 18:
+ CreateHealthboxSprite(3);
+ break;
+ case 19:
+ {
+ u8 opponentBank;
+ u16 species;
+
+ LoadAndCreateEnemyShadowSprites();
+
+ opponentBank = GetBankByIdentity(IDENTITY_OPPONENT_MON1);
+ species = GetMonData(&gEnemyParty[gBattlePartyID[opponentBank]], MON_DATA_SPECIES);
+ SetBankEnemyShadowSpriteCallback(opponentBank, species);
+
+ if (IsDoubleBattle())
+ {
+ opponentBank = GetBankByIdentity(IDENTITY_OPPONENT_MON2);
+ species = GetMonData(&gEnemyParty[gBattlePartyID[opponentBank]], MON_DATA_SPECIES);
+ SetBankEnemyShadowSpriteCallback(opponentBank, species);
+ }
+
+ ActionSelectionCreateCursorAt(gActionSelectionCursor[gBankInMenu], 0);
+
+ if (gLinkVSyncDisabled != 0 && gReceivedRemoteLinkPlayers != 0)
+ {
+ sub_800E0E8();
+ sub_800DFB4(0, 0);
+ }
+ }
+ break;
+ default:
+ SetVBlankCallback(VBlankCB_Battle);
+ sub_80A95F4();
+ BeginHardwarePaletteFade(0xFF, 0, 0x10, 0, 1);
+ gPaletteFade.bufferTransferDisabled = 0;
+ SetMainCallback2(BattleMainCB2);
+ sub_805EF14();
+ break;
+ }
+
+ gBattleScripting.reshowMainState++;
+}
+
+static void sub_80A95F4(void)
+{
+ struct BGCntrlBitfield *regBgcnt1, *regBgcnt2;
+
+ regBgcnt1 = (struct BGCntrlBitfield *)(&REG_BG1CNT);
+ regBgcnt1->charBaseBlock = 0;
+
+ regBgcnt2 = (struct BGCntrlBitfield *)(&REG_BG2CNT);
+ regBgcnt2->charBaseBlock = 0;
+}
+
+static bool8 LoadBankSpriteGfx(u8 bank)
+{
+ if (bank < gNoOfAllBanks)
+ {
+ if (GetBankSide(bank) != SIDE_PLAYER)
+ {
+ if (!gBattleSpritesDataPtr->bankData[bank].behindSubstitute)
+ BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlePartyID[bank]], bank);
+ else
+ BattleLoadSubstituteSpriteGfx(bank, FALSE);
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && bank == 0)
+ LoadBackTrainerBankSpriteGfx(gSaveBlock2Ptr->playerGender, bank);
+ else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && bank == 0)
+ LoadBackTrainerBankSpriteGfx(BACK_PIC_WALLY, bank);
+ else if (!gBattleSpritesDataPtr->bankData[bank].behindSubstitute)
+ BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlePartyID[bank]], bank);
+ else
+ BattleLoadSubstituteSpriteGfx(bank, FALSE);
+
+ gBattleScripting.reshowHelperState = 0;
+ }
+ return TRUE;
+}
+
+// todo: get rid of it once the struct is declared in a header
+struct MonCoords
+{
+ // This would use a bitfield, but sub_8079F44
+ // uses it as a u8 and casting won't match.
+ u8 coords; // u8 x:4, y:4;
+ u8 y_offset;
+};
+extern const struct MonCoords gTrainerBackPicCoords[];
+
+static void CreateBankSprite(u8 bank)
+{
+ if (bank < gNoOfAllBanks)
+ {
+ u8 posY;
+
+ if (gBattleSpritesDataPtr->bankData[bank].behindSubstitute)
+ posY = sub_80A614C(bank);
+ else
+ posY = sub_80A6138(bank);
+
+ if (GetBankSide(bank) != SIDE_PLAYER)
+ {
+ if (GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_HP) == 0)
+ return;
+
+ sub_806A068(GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES), GetBankIdentity(bank));
+ gBankSpriteIds[bank] = CreateSprite(&gUnknown_0202499C, sub_80A5C6C(bank, 2), posY, sub_80A82E4(bank));
+ gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank;
+ gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy;
+ gSprites[gBankSpriteIds[bank]].data0 = bank;
+ gSprites[gBankSpriteIds[bank]].data2 = GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES);
+
+ StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]);
+ if (gBattleSpritesDataPtr->bankData[bank].transformSpecies == SPECIES_CASTFORM)
+ gSprites[gBankSpriteIds[bank]].anims = gMonAnimationsSpriteAnimsPtrTable[SPECIES_CASTFORM];
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && bank == 0)
+ {
+ sub_806A12C(gSaveBlock2Ptr->playerGender, GetBankIdentity(IDENTITY_PLAYER_MON1));
+ gBankSpriteIds[bank] = CreateSprite(&gUnknown_0202499C, 0x50,
+ (8 - gTrainerBackPicCoords[gSaveBlock2Ptr->playerGender].coords) * 4 + 80,
+ sub_80A82E4(0));
+ gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank;
+ gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy;
+ gSprites[gBankSpriteIds[bank]].data0 = bank;
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && bank == 0)
+ {
+ sub_806A12C(BACK_PIC_WALLY, GetBankIdentity(0));
+ gBankSpriteIds[bank] = CreateSprite(&gUnknown_0202499C, 0x50,
+ (8 - gTrainerBackPicCoords[BACK_PIC_WALLY].coords) * 4 + 80,
+ sub_80A82E4(0));
+ gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank;
+ gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy;
+ gSprites[gBankSpriteIds[bank]].data0 = bank;
+ }
+ else
+ {
+ if (GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_HP) == 0)
+ return;
+
+ sub_806A068(GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES), GetBankIdentity(bank));
+ gBankSpriteIds[bank] = CreateSprite(&gUnknown_0202499C, sub_80A5C6C(bank, 2), posY, sub_80A82E4(bank));
+ gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank;
+ gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy;
+ gSprites[gBankSpriteIds[bank]].data0 = bank;
+ gSprites[gBankSpriteIds[bank]].data2 = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES);
+
+ StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]);
+ if (gBattleSpritesDataPtr->bankData[bank].transformSpecies == SPECIES_CASTFORM)
+ gSprites[gBankSpriteIds[bank]].anims = gMonAnimationsSpriteAnimsPtrTable[SPECIES_CASTFORM];
+ }
+
+ gSprites[gBankSpriteIds[bank]].invisible = gBattleSpritesDataPtr->bankData[bank].invisible;
+ }
+}
+
+static void CreateHealthboxSprite(u8 bank)
+{
+ if (bank < gNoOfAllBanks)
+ {
+ u8 healthboxSpriteId;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && bank == 0)
+ healthboxSpriteId = CreateSafariPlayerHealthboxSprites();
+ else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && bank == 0)
+ return;
+ else
+ healthboxSpriteId = CreateBankHealthboxSprites(bank);
+
+ gHealthBoxesIds[bank] = healthboxSpriteId;
+ SetBankHealthboxSpritePos(bank);
+ SetHealthboxSpriteVisible(healthboxSpriteId);
+
+ if (GetBankSide(bank) != SIDE_PLAYER)
+ UpdateHealthboxAttribute(gHealthBoxesIds[bank], &gEnemyParty[gBattlePartyID[bank]], HEALTHBOX_ALL);
+ else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
+ UpdateHealthboxAttribute(gHealthBoxesIds[bank], &gPlayerParty[gBattlePartyID[bank]], HEALTHBOX_SAFARI_ALL_TEXT);
+ else
+ UpdateHealthboxAttribute(gHealthBoxesIds[bank], &gPlayerParty[gBattlePartyID[bank]], HEALTHBOX_ALL);
+
+ if (GetBankIdentity(bank) == IDENTITY_OPPONENT_MON2 || GetBankIdentity(bank) == IDENTITY_PLAYER_MON2)
+ nullsub_30(gHealthBoxesIds[bank], TRUE);
+ else
+ nullsub_30(gHealthBoxesIds[bank], FALSE);
+
+ if (GetBankSide(bank) != SIDE_PLAYER)
+ {
+ if (GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_HP) == 0)
+ SetHealthboxSpriteInvisible(healthboxSpriteId);
+ }
+ else if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI))
+ {
+ if (GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_HP) == 0)
+ SetHealthboxSpriteInvisible(healthboxSpriteId);
+ }
+ }
+}
diff --git a/src/safari_zone.c b/src/safari_zone.c
index 3e25468bf..a1ec38920 100644
--- a/src/safari_zone.c
+++ b/src/safari_zone.c
@@ -60,7 +60,7 @@ void SetSafariZoneFlag(void)
void ResetSafariZoneFlag(void)
{
- FlagReset(SYS_SAFARI_MODE);
+ FlagClear(SYS_SAFARI_MODE);
}
void EnterSafariMode(void)
@@ -114,7 +114,7 @@ void sub_80FC190(void)
{
SetMainCallback2(c2_exit_to_overworld_2_switch);
}
- else if (gBattleOutcome == 8)
+ else if (gBattleOutcome == BATTLE_SAFARI_OUT_OF_BALLS)
{
ScriptContext2_RunNewScript(gUnknown_082A4B4C);
warp_in();
diff --git a/src/save_location.c b/src/save_location.c
index 87067e14d..61a5fd30d 100755
--- a/src/save_location.c
+++ b/src/save_location.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "save_location.h"
#include "map_constants.h"
// used to make the list defines a little less ugly.
@@ -26,7 +27,7 @@ static bool32 IsCurMapInLocationList(const u16 *list)
}
// TODO: Not require a packed u16 array for these lists
-static const u16 gSaveLocationPokeCenterList[] =
+static const u16 sSaveLocationPokeCenterList[] =
{
MAP(OLDALE_TOWN_POKEMON_CENTER_1F),
MAP(OLDALE_TOWN_POKEMON_CENTER_2F),
@@ -71,10 +72,10 @@ static const u16 gSaveLocationPokeCenterList[] =
static bool32 IsCurMapPokeCenter(void)
{
- return IsCurMapInLocationList(gSaveLocationPokeCenterList);
+ return IsCurMapInLocationList(sSaveLocationPokeCenterList);
}
-static const u16 gSaveLocationReloadLocList[] = // there's only 1 location, and it's presumed its for the save reload feature for battle tower
+static const u16 sSaveLocationReloadLocList[] = // there's only 1 location, and it's presumed its for the save reload feature for battle tower
{
MAP(BATTLE_TOWER_LOBBY),
0xFFFF,
@@ -82,18 +83,18 @@ static const u16 gSaveLocationReloadLocList[] = // there's only 1 location, and
static bool32 IsCurMapReloadLocation(void)
{
- return IsCurMapInLocationList(gSaveLocationReloadLocList);
+ return IsCurMapInLocationList(sSaveLocationReloadLocList);
}
// nulled out list. unknown what this would have been
-static const u16 gUnknown_0861440E[] =
+static const u16 sUnknown_0861440E[] =
{
0xFFFF,
};
bool32 sub_81AFCEC(void)
{
- return IsCurMapInLocationList(gUnknown_0861440E);
+ return IsCurMapInLocationList(sUnknown_0861440E);
}
static void TrySetPokeCenterWarpStatus(void)
diff --git a/src/scrcmd.c b/src/scrcmd.c
index b56a53caf..af314609c 100644
--- a/src/scrcmd.c
+++ b/src/scrcmd.c
@@ -1,15 +1,2452 @@
-
-// Includes
#include "global.h"
+#include "battle_frontier_2.h"
+#include "battle_setup.h"
+#include "berry.h"
+#include "clock.h"
+#include "coins.h"
+#include "contest_link_80F57C4.h"
+#include "contest_painting.h"
+#include "data2.h"
+#include "decoration.h"
+#include "decoration_inventory.h"
+#include "event_data.h"
+#include "field_door.h"
+#include "field_effect.h"
+#include "field_fadetransition.h"
+#include "field_map_obj.h"
+#include "field_map_obj_helpers.h"
+#include "field_message_box.h"
+#include "field_player_avatar.h"
+#include "field_screen_effect.h"
+#include "field_specials.h"
+#include "field_tasks.h"
+#include "field_weather.h"
+#include "fieldmap.h"
+#include "item.h"
+#include "lilycove_lady.h"
+#include "main.h"
+#include "map_obj_lock.h"
+#include "menu.h"
+#include "money.h"
+#include "mystery_event_script.h"
+#include "new_menu_helpers.h"
+#include "palette.h"
+#include "party_menu.h"
+#include "pokemon_3.h"
+#include "pokemon_storage_system.h"
+#include "rng.h"
+#include "overworld.h"
+#include "rtc.h"
+#include "script.h"
+#include "script_menu.h"
+#include "script_movement.h"
+#include "script_pokemon_80F8.h"
+#include "script_pokemon_81B9.h"
+#include "shop.h"
+#include "slot_machine.h"
+#include "sound.h"
+#include "string_util.h"
+#include "text.h"
+#include "text_window.h"
+#include "trainer_see.h"
+#include "tv.h"
+#include "window.h"
+
+typedef u16 (*SpecialFunc)(void);
+typedef void (*NativeFunc)(void);
+
+extern u32 gUnknown_020375C0;
+
+static EWRAM_DATA u32 gUnknown_020375C4 = 0;
+static EWRAM_DATA u16 sPauseCounter = 0;
+static EWRAM_DATA u16 sMovingNpcId = 0;
+static EWRAM_DATA u16 sMovingNpcMapBank = 0;
+static EWRAM_DATA u16 sMovingNpcMapId = 0;
+static EWRAM_DATA u16 sFieldEffectScriptId = 0;
-// Static type declarations
+extern u16 gSpecialVar_0x8000;
+extern u16 gSpecialVar_0x8001;
+extern u16 gSpecialVar_0x8002;
+extern u16 gSpecialVar_0x8004;
-// Static RAM declarations
+extern u16 gScriptResult;
+
+extern u16 gScriptContestCategory;
IWRAM_DATA u8 gUnknown_03000F30;
-// Static ROM declarations
+extern const SpecialFunc gSpecials[];
+extern const u8 *gStdScripts[];
+extern const u8 *gStdScripts_End[];
+
+void sub_809BDB4(void);
+
+// This is defined in here so the optimizer can't see its value when compiling
+// script.c.
+void * const gNullScriptPtr = NULL;
+
+static const u8 sScriptConditionTable[6][3] =
+{
+// < = >
+ 1, 0, 0, // <
+ 0, 1, 0, // =
+ 0, 0, 1, // >
+ 1, 1, 0, // <=
+ 0, 1, 1, // >=
+ 1, 0, 1, // !=
+};
+
+static u8 * const sScriptStringVars[] =
+{
+ gStringVar1,
+ gStringVar2,
+ gStringVar3,
+};
+
+bool8 ScrCmd_nop(struct ScriptContext *ctx)
+{
+ return FALSE;
+}
+
+bool8 ScrCmd_nop1(struct ScriptContext *ctx)
+{
+ return FALSE;
+}
+
+bool8 ScrCmd_end(struct ScriptContext *ctx)
+{
+ StopScript(ctx);
+ return FALSE;
+}
+
+bool8 ScrCmd_gotonative(struct ScriptContext *ctx)
+{
+ bool8 (*addr)(void) = (bool8 (*)(void))ScriptReadWord(ctx);
+
+ SetupNativeScript(ctx, addr);
+ return TRUE;
+}
+
+bool8 ScrCmd_special(struct ScriptContext *ctx)
+{
+ u16 index = ScriptReadHalfword(ctx);
+
+ gSpecials[index]();
+ return FALSE;
+}
+
+bool8 ScrCmd_specialvar(struct ScriptContext *ctx)
+{
+ u16 *var = GetVarPointer(ScriptReadHalfword(ctx));
+
+ *var = gSpecials[ScriptReadHalfword(ctx)]();
+ return FALSE;
+}
+
+bool8 ScrCmd_callnative(struct ScriptContext *ctx)
+{
+ NativeFunc func = (NativeFunc)ScriptReadWord(ctx);
+
+ func();
+ return FALSE;
+}
+
+bool8 ScrCmd_waitstate(struct ScriptContext *ctx)
+{
+ ScriptContext1_Stop();
+ return TRUE;
+}
+
+bool8 ScrCmd_goto(struct ScriptContext *ctx)
+{
+ const u8 *ptr = (const u8 *)ScriptReadWord(ctx);
+
+ ScriptJump(ctx, ptr);
+ return FALSE;
+}
+
+bool8 ScrCmd_return(struct ScriptContext *ctx)
+{
+ ScriptReturn(ctx);
+ return FALSE;
+}
+
+bool8 ScrCmd_call(struct ScriptContext *ctx)
+{
+ const u8 *ptr = (const u8 *)ScriptReadWord(ctx);
+
+ ScriptCall(ctx, ptr);
+ return FALSE;
+}
+
+bool8 ScrCmd_goto_if(struct ScriptContext *ctx)
+{
+ u8 condition = ScriptReadByte(ctx);
+ const u8 *ptr = (const u8 *)ScriptReadWord(ctx);
+
+ if (sScriptConditionTable[condition][ctx->comparisonResult] == 1)
+ ScriptJump(ctx, ptr);
+ return FALSE;
+}
+
+bool8 ScrCmd_call_if(struct ScriptContext *ctx)
+{
+ u8 condition = ScriptReadByte(ctx);
+ const u8 *ptr = (const u8 *)ScriptReadWord(ctx);
+
+ if (sScriptConditionTable[condition][ctx->comparisonResult] == 1)
+ ScriptCall(ctx, ptr);
+ return FALSE;
+}
+
+bool8 ScrCmd_setvaddress(struct ScriptContext *ctx)
+{
+ u32 addr1 = (u32)ctx->scriptPtr - 1;
+ u32 addr2 = ScriptReadWord(ctx);
+
+ gUnknown_020375C4 = addr2 - addr1;
+ return FALSE;
+}
+
+bool8 ScrCmd_vgoto(struct ScriptContext *ctx)
+{
+ u32 addr = ScriptReadWord(ctx);
+
+ ScriptJump(ctx, (u8 *)(addr - gUnknown_020375C4));
+ return FALSE;
+}
+
+bool8 ScrCmd_vcall(struct ScriptContext *ctx)
+{
+ u32 addr = ScriptReadWord(ctx);
+
+ ScriptCall(ctx, (u8 *)(addr - gUnknown_020375C4));
+ return FALSE;
+}
+
+bool8 ScrCmd_vgoto_if(struct ScriptContext *ctx)
+{
+ u8 condition = ScriptReadByte(ctx);
+ const u8 *ptr = (const u8 *)(ScriptReadWord(ctx) - gUnknown_020375C4);
+
+ if (sScriptConditionTable[condition][ctx->comparisonResult] == 1)
+ ScriptJump(ctx, ptr);
+ return FALSE;
+}
+
+bool8 ScrCmd_vcall_if(struct ScriptContext *ctx)
+{
+ u8 condition = ScriptReadByte(ctx);
+ const u8 *ptr = (const u8 *)(ScriptReadWord(ctx) - gUnknown_020375C4);
+
+ if (sScriptConditionTable[condition][ctx->comparisonResult] == 1)
+ ScriptCall(ctx, ptr);
+ return FALSE;
+}
+
+bool8 ScrCmd_gotostd(struct ScriptContext *ctx)
+{
+ u8 index = ScriptReadByte(ctx);
+ const u8 **ptr = &gStdScripts[index];
+
+ if (ptr < gStdScripts_End)
+ ScriptJump(ctx, *ptr);
+ return FALSE;
+}
+
+bool8 ScrCmd_callstd(struct ScriptContext *ctx)
+{
+ u8 index = ScriptReadByte(ctx);
+ const u8 **ptr = &gStdScripts[index];
+
+ if (ptr < gStdScripts_End)
+ ScriptCall(ctx, *ptr);
+ return FALSE;
+}
+
+bool8 ScrCmd_gotostd_if(struct ScriptContext *ctx)
+{
+ u8 condition = ScriptReadByte(ctx);
+ u8 index = ScriptReadByte(ctx);
+
+ if (sScriptConditionTable[condition][ctx->comparisonResult] == 1)
+ {
+ const u8 **ptr = &gStdScripts[index];
+ if (ptr < gStdScripts_End)
+ ScriptJump(ctx, *ptr);
+ }
+ return FALSE;
+}
+
+bool8 ScrCmd_callstd_if(struct ScriptContext *ctx)
+{
+ u8 condition = ScriptReadByte(ctx);
+ u8 index = ScriptReadByte(ctx);
+
+ if (sScriptConditionTable[condition][ctx->comparisonResult] == 1)
+ {
+ const u8 **ptr = &gStdScripts[index];
+ if (ptr < gStdScripts_End)
+ ScriptCall(ctx, *ptr);
+ }
+ return FALSE;
+}
+
+bool8 ScrCmd_gotoram(struct ScriptContext *ctx)
+{
+ ScriptJump(ctx, (const u8 *)gUnknown_020375C0);
+ return FALSE;
+}
+
+bool8 ScrCmd_killscript(struct ScriptContext *ctx)
+{
+ ClearRamScript();
+ StopScript(ctx);
+ return TRUE;
+}
+
+bool8 ScrCmd_setmysteryeventstatus(struct ScriptContext *ctx)
+{
+ u8 value = ScriptReadByte(ctx);
+
+ SetMysteryEventScriptStatus(value);
+ return FALSE;
+}
+
+bool8 ScrCmd_loadword(struct ScriptContext *ctx)
+{
+ u8 index = ScriptReadByte(ctx);
+
+ ctx->data[index] = ScriptReadWord(ctx);
+ return FALSE;
+}
+
+bool8 ScrCmd_loadbytefromaddr(struct ScriptContext *ctx)
+{
+ u8 index = ScriptReadByte(ctx);
+
+ ctx->data[index] = *(const u8 *)ScriptReadWord(ctx);
+ return FALSE;
+}
+
+bool8 ScrCmd_writebytetoaddr(struct ScriptContext *ctx)
+{
+ u8 value = ScriptReadByte(ctx);
+
+ *(u8 *)ScriptReadWord(ctx) = value;
+ return FALSE;
+}
+
+bool8 ScrCmd_loadbyte(struct ScriptContext *ctx)
+{
+ u8 index = ScriptReadByte(ctx);
+
+ ctx->data[index] = ScriptReadByte(ctx);
+ return FALSE;
+}
+
+bool8 ScrCmd_setptrbyte(struct ScriptContext *ctx)
+{
+ u8 index = ScriptReadByte(ctx);
+
+ *(u8 *)ScriptReadWord(ctx) = ctx->data[index];
+ return FALSE;
+}
+
+bool8 ScrCmd_copylocal(struct ScriptContext *ctx)
+{
+ u8 destIndex = ScriptReadByte(ctx);
+ u8 srcIndex = ScriptReadByte(ctx);
+
+ ctx->data[destIndex] = ctx->data[srcIndex];
+ return FALSE;
+}
+
+bool8 ScrCmd_copybyte(struct ScriptContext *ctx)
+{
+ u8 *ptr = (u8 *)ScriptReadWord(ctx);
+ *ptr = *(const u8 *)ScriptReadWord(ctx);
+ return FALSE;
+}
+
+bool8 ScrCmd_setvar(struct ScriptContext *ctx)
+{
+ u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx));
+ *ptr = ScriptReadHalfword(ctx);
+ return FALSE;
+}
+
+bool8 ScrCmd_copyvar(struct ScriptContext *ctx)
+{
+ u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx));
+ *ptr = *GetVarPointer(ScriptReadHalfword(ctx));
+ return FALSE;
+}
+
+bool8 ScrCmd_setorcopyvar(struct ScriptContext *ctx)
+{
+ u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx));
+ *ptr = VarGet(ScriptReadHalfword(ctx));
+ return FALSE;
+}
+
+u8 compare_012(u16 a1, u16 a2)
+{
+ if (a1 < a2)
+ return 0;
+ if (a1 == a2)
+ return 1;
+ return 2;
+}
+
+// comparelocaltolocal
+bool8 ScrCmd_compare_local_to_local(struct ScriptContext *ctx)
+{
+ const u8 value1 = ctx->data[ScriptReadByte(ctx)];
+ const u8 value2 = ctx->data[ScriptReadByte(ctx)];
+
+ ctx->comparisonResult = compare_012(value1, value2);
+ return FALSE;
+}
+
+// comparelocaltoimm
+bool8 ScrCmd_compare_local_to_value(struct ScriptContext *ctx)
+{
+ const u8 value1 = ctx->data[ScriptReadByte(ctx)];
+ const u8 value2 = ScriptReadByte(ctx);
+
+ ctx->comparisonResult = compare_012(value1, value2);
+ return FALSE;
+}
+
+bool8 ScrCmd_compare_local_to_addr(struct ScriptContext *ctx)
+{
+ const u8 value1 = ctx->data[ScriptReadByte(ctx)];
+ const u8 value2 = *(const u8 *)ScriptReadWord(ctx);
+
+ ctx->comparisonResult = compare_012(value1, value2);
+ return FALSE;
+}
+
+bool8 ScrCmd_compare_addr_to_local(struct ScriptContext *ctx)
+{
+ const u8 value1 = *(const u8 *)ScriptReadWord(ctx);
+ const u8 value2 = ctx->data[ScriptReadByte(ctx)];
+
+ ctx->comparisonResult = compare_012(value1, value2);
+ return FALSE;
+}
+
+bool8 ScrCmd_compare_addr_to_value(struct ScriptContext *ctx)
+{
+ const u8 value1 = *(const u8 *)ScriptReadWord(ctx);
+ const u8 value2 = ScriptReadByte(ctx);
+
+ ctx->comparisonResult = compare_012(value1, value2);
+ return FALSE;
+}
+
+bool8 ScrCmd_compare_addr_to_addr(struct ScriptContext *ctx)
+{
+ const u8 value1 = *(const u8 *)ScriptReadWord(ctx);
+ const u8 value2 = *(const u8 *)ScriptReadWord(ctx);
+
+ ctx->comparisonResult = compare_012(value1, value2);
+ return FALSE;
+}
+
+bool8 ScrCmd_compare_var_to_value(struct ScriptContext *ctx)
+{
+ const u16 value1 = *GetVarPointer(ScriptReadHalfword(ctx));
+ const u16 value2 = ScriptReadHalfword(ctx);
+
+ ctx->comparisonResult = compare_012(value1, value2);
+ return FALSE;
+}
+
+bool8 ScrCmd_compare_var_to_var(struct ScriptContext *ctx)
+{
+ const u16 *ptr1 = GetVarPointer(ScriptReadHalfword(ctx));
+ const u16 *ptr2 = GetVarPointer(ScriptReadHalfword(ctx));
+
+ ctx->comparisonResult = compare_012(*ptr1, *ptr2);
+ return FALSE;
+}
+
+bool8 ScrCmd_addvar(struct ScriptContext *ctx)
+{
+ u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx));
+ *ptr += ScriptReadHalfword(ctx);
+ return FALSE;
+}
+
+bool8 ScrCmd_subvar(struct ScriptContext *ctx)
+{
+ u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx));
+ *ptr -= VarGet(ScriptReadHalfword(ctx));
+ return FALSE;
+}
+
+bool8 ScrCmd_random(struct ScriptContext *ctx)
+{
+ u16 max = VarGet(ScriptReadHalfword(ctx));
+
+ gScriptResult = Random() % max;
+ return FALSE;
+}
+
+bool8 ScrCmd_additem(struct ScriptContext *ctx)
+{
+ u16 itemId = VarGet(ScriptReadHalfword(ctx));
+ u32 quantity = VarGet(ScriptReadHalfword(ctx));
+
+ gScriptResult = AddBagItem(itemId, (u8)quantity);
+ return FALSE;
+}
+
+bool8 ScrCmd_removeitem(struct ScriptContext *ctx)
+{
+ u16 itemId = VarGet(ScriptReadHalfword(ctx));
+ u32 quantity = VarGet(ScriptReadHalfword(ctx));
+
+ gScriptResult = RemoveBagItem(itemId, (u8)quantity);
+ return FALSE;
+}
+
+bool8 ScrCmd_checkitemspace(struct ScriptContext *ctx)
+{
+ u16 itemId = VarGet(ScriptReadHalfword(ctx));
+ u32 quantity = VarGet(ScriptReadHalfword(ctx));
+
+ gScriptResult = CheckBagHasSpace(itemId, (u8)quantity);
+ return FALSE;
+}
+
+bool8 ScrCmd_checkitem(struct ScriptContext *ctx)
+{
+ u16 itemId = VarGet(ScriptReadHalfword(ctx));
+ u32 quantity = VarGet(ScriptReadHalfword(ctx));
+
+ gScriptResult = CheckBagHasItem(itemId, (u8)quantity);
+ return FALSE;
+}
+
+bool8 ScrCmd_checkitemtype(struct ScriptContext *ctx)
+{
+ u16 itemId = VarGet(ScriptReadHalfword(ctx));
+
+ gScriptResult = GetPocketByItemId(itemId);
+ return FALSE;
+}
+
+bool8 ScrCmd_addpcitem(struct ScriptContext *ctx)
+{
+ u16 itemId = VarGet(ScriptReadHalfword(ctx));
+ u16 quantity = VarGet(ScriptReadHalfword(ctx));
+
+ gScriptResult = AddPCItem(itemId, quantity);
+ return FALSE;
+}
+
+bool8 ScrCmd_checkpcitem(struct ScriptContext *ctx)
+{
+ u16 itemId = VarGet(ScriptReadHalfword(ctx));
+ u16 quantity = VarGet(ScriptReadHalfword(ctx));
+
+ gScriptResult = CheckPCHasItem(itemId, quantity);
+ return FALSE;
+}
+
+bool8 ScrCmd_adddecor(struct ScriptContext *ctx)
+{
+ u32 decorId = VarGet(ScriptReadHalfword(ctx));
+
+ gScriptResult = DecorationAdd(decorId);
+ return FALSE;
+}
+
+bool8 ScrCmd_removedecor(struct ScriptContext *ctx)
+{
+ u32 decorId = VarGet(ScriptReadHalfword(ctx));
+
+ gScriptResult = DecorationRemove(decorId);
+ return FALSE;
+}
+
+bool8 ScrCmd_checkdecor(struct ScriptContext *ctx)
+{
+ u32 decorId = VarGet(ScriptReadHalfword(ctx));
+
+ gScriptResult = DecorationCheckSpace(decorId);
+ return FALSE;
+}
+
+bool8 ScrCmd_hasdecor(struct ScriptContext *ctx)
+{
+ u32 decorId = VarGet(ScriptReadHalfword(ctx));
+
+ gScriptResult = CheckHasDecoration(decorId);
+ return FALSE;
+}
+
+bool8 ScrCmd_setflag(struct ScriptContext *ctx)
+{
+ FlagSet(ScriptReadHalfword(ctx));
+ return FALSE;
+}
+
+bool8 ScrCmd_clearflag(struct ScriptContext *ctx)
+{
+ FlagClear(ScriptReadHalfword(ctx));
+ return FALSE;
+}
+
+bool8 ScrCmd_checkflag(struct ScriptContext *ctx)
+{
+ ctx->comparisonResult = FlagGet(ScriptReadHalfword(ctx));
+ return FALSE;
+}
+
+bool8 ScrCmd_incrementgamestat(struct ScriptContext *ctx)
+{
+ IncrementGameStat(ScriptReadByte(ctx));
+ return FALSE;
+}
+
+bool8 ScrCmd_animdarklevel(struct ScriptContext *ctx)
+{
+ sub_80B009C(ScriptReadByte(ctx));
+ ScriptContext1_Stop();
+ return TRUE;
+}
+
+bool8 ScrCmd_setdarklevel(struct ScriptContext *ctx)
+{
+ u16 flashLevel = VarGet(ScriptReadHalfword(ctx));
+
+ Overworld_SetFlashLevel(flashLevel);
+ return FALSE;
+}
+
+static bool8 IsPaletteNotActive(void)
+{
+ if (!gPaletteFade.active)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+bool8 ScrCmd_fadescreen(struct ScriptContext *ctx)
+{
+ fade_screen(ScriptReadByte(ctx), 0);
+ SetupNativeScript(ctx, IsPaletteNotActive);
+ return TRUE;
+}
+
+bool8 ScrCmd_fadescreendelay(struct ScriptContext *ctx)
+{
+ u8 mode = ScriptReadByte(ctx);
+ u8 delay = ScriptReadByte(ctx);
+
+ fade_screen(mode, delay);
+ SetupNativeScript(ctx, IsPaletteNotActive);
+ return TRUE;
+}
+
+bool8 ScrCmd_fadescreenswapbuffers(struct ScriptContext *ctx)
+{
+ u8 mode = ScriptReadByte(ctx);
+
+ switch (mode)
+ {
+ case 1:
+ default:
+ CpuCopy32(gPlttBufferUnfaded, gPaletteDecompressionBuffer, PLTT_DECOMP_BUFFER_SIZE);
+ fade_screen(mode, 0);
+ break;
+ case 0:
+ case 2:
+ CpuCopy32(gPaletteDecompressionBuffer, gPlttBufferUnfaded, PLTT_DECOMP_BUFFER_SIZE);
+ fade_screen(mode, 0);
+ break;
+ }
+
+ SetupNativeScript(ctx, IsPaletteNotActive);
+ return TRUE;
+}
+
+static bool8 RunPauseTimer(void)
+{
+ sPauseCounter--;
+
+ if (sPauseCounter == 0)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+bool8 ScrCmd_delay(struct ScriptContext *ctx)
+{
+ sPauseCounter = ScriptReadHalfword(ctx);
+ SetupNativeScript(ctx, RunPauseTimer);
+ return TRUE;
+}
+
+bool8 ScrCmd_initclock(struct ScriptContext *ctx)
+{
+ u8 hour = VarGet(ScriptReadHalfword(ctx));
+ u8 minute = VarGet(ScriptReadHalfword(ctx));
+
+ RtcInitLocalTimeOffset(hour, minute);
+ return FALSE;
+}
+
+bool8 ScrCmd_dodailyevents(struct ScriptContext *ctx)
+{
+ DoTimeBasedEvents();
+ return FALSE;
+}
+
+bool8 ScrCmd_gettime(struct ScriptContext *ctx)
+{
+ RtcCalcLocalTime();
+ gSpecialVar_0x8000 = gLocalTime.hours;
+ gSpecialVar_0x8001 = gLocalTime.minutes;
+ gSpecialVar_0x8002 = gLocalTime.seconds;
+ return FALSE;
+}
+
+bool8 ScrCmd_setweather(struct ScriptContext *ctx)
+{
+ u16 weather = VarGet(ScriptReadHalfword(ctx));
+
+ SetSav1Weather(weather);
+ return FALSE;
+}
+
+bool8 ScrCmd_resetweather(struct ScriptContext *ctx)
+{
+ sub_80AEDBC();
+ return FALSE;
+}
+
+bool8 ScrCmd_doweather(struct ScriptContext *ctx)
+{
+ DoCurrentWeather();
+ return FALSE;
+}
+
+bool8 ScrCmd_tileeffect(struct ScriptContext *ctx)
+{
+ ActivatePerStepCallback(ScriptReadByte(ctx));
+ return FALSE;
+}
+
+bool8 ScrCmd_setmaplayoutindex(struct ScriptContext *ctx)
+{
+ u16 value = VarGet(ScriptReadHalfword(ctx));
+
+ sub_8085524(value);
+ return FALSE;
+}
+
+bool8 ScrCmd_warp(struct ScriptContext *ctx)
+{
+ u8 mapGroup = ScriptReadByte(ctx);
+ u8 mapNum = ScriptReadByte(ctx);
+ u8 warpId = ScriptReadByte(ctx);
+ u16 x = VarGet(ScriptReadHalfword(ctx));
+ u16 y = VarGet(ScriptReadHalfword(ctx));
+
+ Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y);
+ sub_80AF734();
+ player_avatar_init_params_reset();
+ return TRUE;
+}
+
+bool8 ScrCmd_warpsilent(struct ScriptContext *ctx)
+{
+ u8 mapGroup = ScriptReadByte(ctx);
+ u8 mapNum = ScriptReadByte(ctx);
+ u8 warpId = ScriptReadByte(ctx);
+ u16 x = VarGet(ScriptReadHalfword(ctx));
+ u16 y = VarGet(ScriptReadHalfword(ctx));
+
+ Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y);
+ sp13E_warp_to_last_warp();
+ player_avatar_init_params_reset();
+ return TRUE;
+}
+
+bool8 ScrCmd_warpdoor(struct ScriptContext *ctx)
+{
+ u8 mapGroup = ScriptReadByte(ctx);
+ u8 mapNum = ScriptReadByte(ctx);
+ u8 warpId = ScriptReadByte(ctx);
+ u16 x = VarGet(ScriptReadHalfword(ctx));
+ u16 y = VarGet(ScriptReadHalfword(ctx));
+
+ Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y);
+ sub_80AF7D0();
+ player_avatar_init_params_reset();
+ return TRUE;
+}
+
+bool8 ScrCmd_warphole(struct ScriptContext *ctx)
+{
+ u8 mapGroup = ScriptReadByte(ctx);
+ u8 mapNum = ScriptReadByte(ctx);
+ u16 x;
+ u16 y;
+
+ PlayerGetDestCoords(&x, &y);
+ if (mapGroup == 0xFF && mapNum == 0xFF)
+ sub_8084EBC(x - 7, y - 7);
+ else
+ Overworld_SetWarpDestination(mapGroup, mapNum, -1, x - 7, y - 7);
+ sp13F_fall_to_last_warp();
+ player_avatar_init_params_reset();
+ return TRUE;
+}
+
+bool8 ScrCmd_warpteleport(struct ScriptContext *ctx)
+{
+ u8 mapGroup = ScriptReadByte(ctx);
+ u8 mapNum = ScriptReadByte(ctx);
+ u8 warpId = ScriptReadByte(ctx);
+ u16 x = VarGet(ScriptReadHalfword(ctx));
+ u16 y = VarGet(ScriptReadHalfword(ctx));
+
+ Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y);
+ sub_80AF848();
+ player_avatar_init_params_reset();
+ return TRUE;
+}
+
+bool8 ScrCmd_warpD7(struct ScriptContext *ctx)
+{
+ u8 mapGroup = ScriptReadByte(ctx);
+ u8 mapNum = ScriptReadByte(ctx);
+ u8 warpId = ScriptReadByte(ctx);
+ u16 x = VarGet(ScriptReadHalfword(ctx));
+ u16 y = VarGet(ScriptReadHalfword(ctx));
+
+ Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y);
+ sub_80AF87C();
+ player_avatar_init_params_reset();
+ return TRUE;
+}
+
+bool8 ScrCmd_setwarp(struct ScriptContext *ctx)
+{
+ u8 mapGroup = ScriptReadByte(ctx);
+ u8 mapNum = ScriptReadByte(ctx);
+ u8 warpId = ScriptReadByte(ctx);
+ u16 x = VarGet(ScriptReadHalfword(ctx));
+ u16 y = VarGet(ScriptReadHalfword(ctx));
+
+ Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y);
+ return FALSE;
+}
+
+bool8 ScrCmd_setdynamicwarp(struct ScriptContext *ctx)
+{
+ u8 mapGroup = ScriptReadByte(ctx);
+ u8 mapNum = ScriptReadByte(ctx);
+ u8 warpId = ScriptReadByte(ctx);
+ u16 x = VarGet(ScriptReadHalfword(ctx));
+ u16 y = VarGet(ScriptReadHalfword(ctx));
+
+ saved_warp2_set_2(0, mapGroup, mapNum, warpId, x, y);
+ return FALSE;
+}
+
+bool8 ScrCmd_setdivewarp(struct ScriptContext *ctx)
+{
+ u8 mapGroup = ScriptReadByte(ctx);
+ u8 mapNum = ScriptReadByte(ctx);
+ u8 warpId = ScriptReadByte(ctx);
+ u16 x = VarGet(ScriptReadHalfword(ctx));
+ u16 y = VarGet(ScriptReadHalfword(ctx));
+
+ sub_8084E2C(mapGroup, mapNum, warpId, x, y);
+ return FALSE;
+}
+
+bool8 ScrCmd_setholewarp(struct ScriptContext *ctx)
+{
+ u8 mapGroup = ScriptReadByte(ctx);
+ u8 mapNum = ScriptReadByte(ctx);
+ u8 warpId = ScriptReadByte(ctx);
+ u16 x = VarGet(ScriptReadHalfword(ctx));
+ u16 y = VarGet(ScriptReadHalfword(ctx));
+
+ sub_8084E80(mapGroup, mapNum, warpId, x, y);
+ return FALSE;
+}
+
+bool8 ScrCmd_setescapewarp(struct ScriptContext *ctx)
+{
+ u8 mapGroup = ScriptReadByte(ctx);
+ u8 mapNum = ScriptReadByte(ctx);
+ u8 warpId = ScriptReadByte(ctx);
+ u16 x = VarGet(ScriptReadHalfword(ctx));
+ u16 y = VarGet(ScriptReadHalfword(ctx));
+
+ sub_8084DD4(mapGroup, mapNum, warpId, x, y);
+ return FALSE;
+}
+
+bool8 ScrCmd_getplayerxy(struct ScriptContext *ctx)
+{
+ u16 *pX = GetVarPointer(ScriptReadHalfword(ctx));
+ u16 *pY = GetVarPointer(ScriptReadHalfword(ctx));
+
+ *pX = gSaveBlock1Ptr->pos.x;
+ *pY = gSaveBlock1Ptr->pos.y;
+ return FALSE;
+}
+
+bool8 ScrCmd_countpokemon(struct ScriptContext *ctx)
+{
+ gScriptResult = CalculatePlayerPartyCount();
+ return FALSE;
+}
+
+bool8 ScrCmd_playse(struct ScriptContext *ctx)
+{
+ PlaySE(ScriptReadHalfword(ctx));
+ return FALSE;
+}
+
+static bool8 WaitForSoundEffectFinish(void)
+{
+ if (!IsSEPlaying())
+ return TRUE;
+ else
+ return FALSE;
+}
+
+bool8 ScrCmd_waitse(struct ScriptContext *ctx)
+{
+ SetupNativeScript(ctx, WaitForSoundEffectFinish);
+ return TRUE;
+}
+
+bool8 ScrCmd_playfanfare(struct ScriptContext *ctx)
+{
+ PlayFanfare(ScriptReadHalfword(ctx));
+ return FALSE;
+}
+
+static bool8 WaitForFanfareFinish(void)
+{
+ return IsFanfareTaskInactive();
+}
+
+bool8 ScrCmd_waitfanfare(struct ScriptContext *ctx)
+{
+ SetupNativeScript(ctx, WaitForFanfareFinish);
+ return TRUE;
+}
+
+bool8 ScrCmd_playbgm(struct ScriptContext *ctx)
+{
+ u16 songId = ScriptReadHalfword(ctx);
+ bool8 val = ScriptReadByte(ctx);
+
+ if (val == TRUE)
+ Overworld_SetSavedMusic(songId);
+ PlayNewMapMusic(songId);
+ return FALSE;
+}
+
+bool8 ScrCmd_savebgm(struct ScriptContext *ctx)
+{
+ Overworld_SetSavedMusic(ScriptReadHalfword(ctx));
+ return FALSE;
+}
+
+bool8 ScrCmd_fadedefaultbgm(struct ScriptContext *ctx)
+{
+ Overworld_ChangeMusicToDefault();
+ return FALSE;
+}
+
+bool8 ScrCmd_fadenewbgm(struct ScriptContext *ctx)
+{
+ Overworld_ChangeMusicTo(ScriptReadHalfword(ctx));
+ return FALSE;
+}
+
+bool8 ScrCmd_fadeoutbgm(struct ScriptContext *ctx)
+{
+ u8 speed = ScriptReadByte(ctx);
+
+ if (speed != 0)
+ FadeOutBGMTemporarily(4 * speed);
+ else
+ FadeOutBGMTemporarily(4);
+ SetupNativeScript(ctx, IsBGMPausedOrStopped);
+ return TRUE;
+}
+
+bool8 ScrCmd_fadeinbgm(struct ScriptContext *ctx)
+{
+ u8 speed = ScriptReadByte(ctx);
+
+ if (speed != 0)
+ FadeInBGM(4 * speed);
+ else
+ FadeInBGM(4);
+ return FALSE;
+}
+
+bool8 ScrCmd_applymovement(struct ScriptContext *ctx)
+{
+ u16 localId = VarGet(ScriptReadHalfword(ctx));
+ const void *movementScript = (const void *)ScriptReadWord(ctx);
+
+ ScriptMovement_StartObjectMovementScript(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, movementScript);
+ sMovingNpcId = localId;
+ return FALSE;
+}
+
+bool8 ScrCmd_applymovement_at(struct ScriptContext *ctx)
+{
+ u16 localId = VarGet(ScriptReadHalfword(ctx));
+ const void *movementScript = (const void *)ScriptReadWord(ctx);
+ u8 mapGroup = ScriptReadByte(ctx);
+ u8 mapNum = ScriptReadByte(ctx);
+
+ ScriptMovement_StartObjectMovementScript(localId, mapNum, mapGroup, movementScript);
+ sMovingNpcId = localId;
+ return FALSE;
+}
+
+static bool8 WaitForMovementFinish(void)
+{
+ return ScriptMovement_IsObjectMovementFinished(sMovingNpcId, sMovingNpcMapId, sMovingNpcMapBank);
+}
+
+bool8 ScrCmd_waitmovement(struct ScriptContext *ctx)
+{
+ u16 localId = VarGet(ScriptReadHalfword(ctx));
+
+ if (localId != 0)
+ sMovingNpcId = localId;
+ sMovingNpcMapBank = gSaveBlock1Ptr->location.mapGroup;
+ sMovingNpcMapId = gSaveBlock1Ptr->location.mapNum;
+ SetupNativeScript(ctx, WaitForMovementFinish);
+ return TRUE;
+}
+
+bool8 ScrCmd_waitmovement_at(struct ScriptContext *ctx)
+{
+ u16 localId = VarGet(ScriptReadHalfword(ctx));
+ u8 mapBank;
+ u8 mapId;
+
+ if (localId != 0)
+ sMovingNpcId = localId;
+ mapBank = ScriptReadByte(ctx);
+ mapId = ScriptReadByte(ctx);
+ sMovingNpcMapBank = mapBank;
+ sMovingNpcMapId = mapId;
+ SetupNativeScript(ctx, WaitForMovementFinish);
+ return TRUE;
+}
+
+bool8 ScrCmd_removeobject(struct ScriptContext *ctx)
+{
+ u16 localId = VarGet(ScriptReadHalfword(ctx));
+
+ RemoveFieldObjectByLocalIdAndMap(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
+ return FALSE;
+}
+
+bool8 ScrCmd_removeobject_at(struct ScriptContext *ctx)
+{
+ u16 objectId = VarGet(ScriptReadHalfword(ctx));
+ u8 mapGroup = ScriptReadByte(ctx);
+ u8 mapNum = ScriptReadByte(ctx);
+
+ RemoveFieldObjectByLocalIdAndMap(objectId, mapNum, mapGroup);
+ return FALSE;
+}
+
+bool8 ScrCmd_addobject(struct ScriptContext *ctx)
+{
+ u16 objectId = VarGet(ScriptReadHalfword(ctx));
+
+ show_sprite(objectId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
+ return FALSE;
+}
+
+bool8 ScrCmd_addobject_at(struct ScriptContext *ctx)
+{
+ u16 objectId = VarGet(ScriptReadHalfword(ctx));
+ u8 mapGroup = ScriptReadByte(ctx);
+ u8 mapNum = ScriptReadByte(ctx);
+
+ show_sprite(objectId, mapNum, mapGroup);
+ return FALSE;
+}
+
+bool8 ScrCmd_setobjectxy(struct ScriptContext *ctx)
+{
+ u16 localId = VarGet(ScriptReadHalfword(ctx));
+ u16 x = VarGet(ScriptReadHalfword(ctx));
+ u16 y = VarGet(ScriptReadHalfword(ctx));
+
+ sub_808EBA8(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, x, y);
+ return FALSE;
+}
+
+bool8 ScrCmd_setobjectxyperm(struct ScriptContext *ctx)
+{
+ u16 localId = VarGet(ScriptReadHalfword(ctx));
+ u16 x = VarGet(ScriptReadHalfword(ctx));
+ u16 y = VarGet(ScriptReadHalfword(ctx));
+
+ Overworld_SetMapObjTemplateCoords(localId, x, y);
+ return FALSE;
+}
+
+bool8 ScrCmd_moveobjectoffscreen(struct ScriptContext *ctx)
+{
+ u16 localId = VarGet(ScriptReadHalfword(ctx));
+
+ sub_808F254(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
+ return FALSE;
+}
+
+bool8 ScrCmd_showobject(struct ScriptContext *ctx)
+{
+ u16 localId = VarGet(ScriptReadHalfword(ctx));
+ u8 mapGroup = ScriptReadByte(ctx);
+ u8 mapNum = ScriptReadByte(ctx);
+
+ npc_by_local_id_and_map_set_field_1_bit_x20(localId, mapNum, mapGroup, 0);
+ return FALSE;
+}
+
+bool8 ScrCmd_hideobject(struct ScriptContext *ctx)
+{
+ u16 localId = VarGet(ScriptReadHalfword(ctx));
+ u8 mapGroup = ScriptReadByte(ctx);
+ u8 mapNum = ScriptReadByte(ctx);
+
+ npc_by_local_id_and_map_set_field_1_bit_x20(localId, mapNum, mapGroup, 1);
+ return FALSE;
+}
+
+bool8 ScrCmd_setobjectpriority(struct ScriptContext *ctx)
+{
+ u16 localId = VarGet(ScriptReadHalfword(ctx));
+ u8 mapGroup = ScriptReadByte(ctx);
+ u8 mapNum = ScriptReadByte(ctx);
+ u8 priority = ScriptReadByte(ctx);
+
+ sub_808E78C(localId, mapNum, mapGroup, priority + 83);
+ return FALSE;
+}
+
+bool8 ScrCmd_resetobjectpriority(struct ScriptContext *ctx)
+{
+ u16 localId = VarGet(ScriptReadHalfword(ctx));
+ u8 mapGroup = ScriptReadByte(ctx);
+ u8 mapNum = ScriptReadByte(ctx);
+
+ sub_808E7E4(localId, mapNum, mapGroup);
+ return FALSE;
+}
+
+bool8 ScrCmd_faceplayer(struct ScriptContext *ctx)
+{
+ if (gMapObjects[gSelectedMapObject].active)
+ {
+ FieldObjectFaceOppositeDirection(&gMapObjects[gSelectedMapObject],
+ player_get_direction_lower_nybble());
+ }
+ return FALSE;
+}
+
+bool8 ScrCmd_turnobject(struct ScriptContext *ctx)
+{
+ u16 localId = VarGet(ScriptReadHalfword(ctx));
+ u8 direction = ScriptReadByte(ctx);
+
+ FieldObjectTurnByLocalIdAndMap(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, direction);
+ return FALSE;
+}
+
+bool8 ScrCmd_setobjectmovementtype(struct ScriptContext *ctx)
+{
+ u16 localId = VarGet(ScriptReadHalfword(ctx));
+ u8 movementType = ScriptReadByte(ctx);
+
+ Overworld_SetMapObjTemplateMovementType(localId, movementType);
+ return FALSE;
+}
+
+bool8 ScrCmd_createvobject(struct ScriptContext *ctx)
+{
+ u8 graphicsId = ScriptReadByte(ctx);
+ u8 v2 = ScriptReadByte(ctx);
+ u16 x = VarGet(ScriptReadHalfword(ctx));
+ u32 y = VarGet(ScriptReadHalfword(ctx));
+ u8 elevation = ScriptReadByte(ctx);
+ u8 direction = ScriptReadByte(ctx);
+
+ sprite_new(graphicsId, v2, x, y, elevation, direction);
+ return FALSE;
+}
+
+bool8 ScrCmd_turnvobject(struct ScriptContext *ctx)
+{
+ u8 v1 = ScriptReadByte(ctx);
+ u8 direction = ScriptReadByte(ctx);
+
+ sub_8097B78(v1, direction);
+ return FALSE;
+}
+
+bool8 ScrCmd_lockall(struct ScriptContext *ctx)
+{
+ if (is_c1_link_related_active())
+ {
+ return FALSE;
+ }
+ else
+ {
+ ScriptFreezeMapObjects();
+ SetupNativeScript(ctx, sub_80983C4);
+ return TRUE;
+ }
+}
+
+bool8 ScrCmd_lock(struct ScriptContext *ctx)
+{
+ if (is_c1_link_related_active())
+ {
+ return FALSE;
+ }
+ else
+ {
+ if (gMapObjects[gSelectedMapObject].active)
+ {
+ LockSelectedMapObject();
+ SetupNativeScript(ctx, sub_809847C);
+ }
+ else
+ {
+ ScriptFreezeMapObjects();
+ SetupNativeScript(ctx, sub_80983C4);
+ }
+ return TRUE;
+ }
+}
+
+bool8 ScrCmd_releaseall(struct ScriptContext *ctx)
+{
+ u8 objectId;
+
+ HideFieldMessageBox();
+ objectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0);
+ FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[objectId]);
+ sub_80D338C();
+ UnfreezeMapObjects();
+ return FALSE;
+}
+
+bool8 ScrCmd_release(struct ScriptContext *ctx)
+{
+ u8 objectId;
+
+ HideFieldMessageBox();
+ if (gMapObjects[gSelectedMapObject].active)
+ FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[gSelectedMapObject]);
+ objectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0);
+ FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[objectId]);
+ sub_80D338C();
+ UnfreezeMapObjects();
+ return FALSE;
+}
+
+bool8 ScrCmd_message(struct ScriptContext *ctx)
+{
+ const u8 *msg = (const u8 *)ScriptReadWord(ctx);
+
+ if (msg == NULL)
+ msg = (const u8 *)ctx->data[0];
+ ShowFieldMessage(msg);
+ return FALSE;
+}
+
+bool8 ScrCmd_pokenavcall(struct ScriptContext *ctx)
+{
+ const u8 *msg = (const u8 *)ScriptReadWord(ctx);
+
+ if (msg == NULL)
+ msg = (const u8 *)ctx->data[0];
+ sub_8098238(msg);
+ return FALSE;
+}
+
+bool8 ScrCmd_messageautoscroll(struct ScriptContext *ctx)
+{
+ const u8 *msg = (const u8 *)ScriptReadWord(ctx);
+
+ if (msg == NULL)
+ msg = (const u8 *)ctx->data[0];
+ gTextFlags.flag_2 = TRUE;
+ gTextFlags.flag_3 = TRUE;
+ ShowFieldAutoScrollMessage(msg);
+ return FALSE;
+}
+
+bool8 ScrCmd_cmdDB(struct ScriptContext *ctx)
+{
+ const u8 *msg = (const u8 *)ScriptReadWord(ctx);
+
+ if (msg == NULL)
+ msg = (const u8 *)ctx->data[0];
+ sub_81973A4();
+ sub_81973C4(0, 1);
+ PrintTextOnWindow(0, 1, msg, 0, 1, 0, 0);
+ return FALSE;
+}
+
+bool8 ScrCmd_waitmessage(struct ScriptContext *ctx)
+{
+ SetupNativeScript(ctx, IsFieldMessageBoxHidden);
+ return TRUE;
+}
+
+bool8 ScrCmd_closemessage(struct ScriptContext *ctx)
+{
+ HideFieldMessageBox();
+ return FALSE;
+}
+
+static bool8 WaitForAorBPress(void)
+{
+ if (gMain.newKeys & A_BUTTON)
+ return TRUE;
+ if (gMain.newKeys & B_BUTTON)
+ return TRUE;
+ return FALSE;
+}
+
+bool8 ScrCmd_waitbutton(struct ScriptContext *ctx)
+{
+ SetupNativeScript(ctx, WaitForAorBPress);
+ return TRUE;
+}
+
+bool8 ScrCmd_yesnobox(struct ScriptContext *ctx)
+{
+ u8 left = ScriptReadByte(ctx);
+ u8 top = ScriptReadByte(ctx);
+
+ if (ScriptMenu_YesNo(left, top) == TRUE)
+ {
+ ScriptContext1_Stop();
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+bool8 ScrCmd_multichoice(struct ScriptContext *ctx)
+{
+ u8 left = ScriptReadByte(ctx);
+ u8 top = ScriptReadByte(ctx);
+ u8 multichoiceId = ScriptReadByte(ctx);
+ u8 ignoreBPress = ScriptReadByte(ctx);
+
+ if (ScriptMenu_Multichoice(left, top, multichoiceId, ignoreBPress) == TRUE)
+ {
+ ScriptContext1_Stop();
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+bool8 ScrCmd_multichoicedefault(struct ScriptContext *ctx)
+{
+ u8 left = ScriptReadByte(ctx);
+ u8 top = ScriptReadByte(ctx);
+ u8 multichoiceId = ScriptReadByte(ctx);
+ u8 defaultChoice = ScriptReadByte(ctx);
+ u8 ignoreBPress = ScriptReadByte(ctx);
+
+ if (ScriptMenu_MultichoiceWithDefault(left, top, multichoiceId, ignoreBPress, defaultChoice) == TRUE)
+ {
+ ScriptContext1_Stop();
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+bool8 ScrCmd_drawbox(struct ScriptContext *ctx)
+{
+ /*u8 left = ScriptReadByte(ctx);
+ u8 top = ScriptReadByte(ctx);
+ u8 right = ScriptReadByte(ctx);
+ u8 bottom = ScriptReadByte(ctx);
+
+ MenuDrawTextWindow(left, top, right, bottom);*/
+ return FALSE;
+}
+
+bool8 ScrCmd_multichoicegrid(struct ScriptContext *ctx)
+{
+ u8 left = ScriptReadByte(ctx);
+ u8 top = ScriptReadByte(ctx);
+ u8 multichoiceId = ScriptReadByte(ctx);
+ u8 numColumns = ScriptReadByte(ctx);
+ u8 ignoreBPress = ScriptReadByte(ctx);
+
+ if (ScriptMenu_MultichoiceGrid(left, top, multichoiceId, ignoreBPress, numColumns) == TRUE)
+ {
+ ScriptContext1_Stop();
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+bool8 ScrCmd_erasebox(struct ScriptContext *ctx)
+{
+ u8 left = ScriptReadByte(ctx);
+ u8 top = ScriptReadByte(ctx);
+ u8 right = ScriptReadByte(ctx);
+ u8 bottom = ScriptReadByte(ctx);
+
+ // MenuZeroFillWindowRect(left, top, right, bottom);
+ return FALSE;
+}
+
+bool8 ScrCmd_drawboxtext(struct ScriptContext *ctx)
+{
+ u8 left = ScriptReadByte(ctx);
+ u8 top = ScriptReadByte(ctx);
+ u8 multichoiceId = ScriptReadByte(ctx);
+ u8 ignoreBPress = ScriptReadByte(ctx);
+
+ /*if (Multichoice(left, top, multichoiceId, ignoreBPress) == TRUE)
+ {
+ ScriptContext1_Stop();
+ return TRUE;
+ }*/
+ return FALSE;
+}
+
+bool8 ScrCmd_drawpokepic(struct ScriptContext *ctx)
+{
+ u16 species = VarGet(ScriptReadHalfword(ctx));
+ u8 x = ScriptReadByte(ctx);
+ u8 y = ScriptReadByte(ctx);
+
+ ScriptMenu_ShowPokemonPic(species, x, y);
+ return FALSE;
+}
+
+bool8 ScrCmd_erasepokepic(struct ScriptContext *ctx)
+{
+ bool8 (*func)(void) = ScriptMenu_GetPicboxWaitFunc();
+
+ if (func == NULL)
+ return FALSE;
+ SetupNativeScript(ctx, func);
+ return TRUE;
+}
+
+bool8 ScrCmd_drawcontestwinner(struct ScriptContext *ctx)
+{
+ u8 v1 = ScriptReadByte(ctx);
+
+ if (v1)
+ sub_812FDA8(v1);
+ ShowContestWinner();
+ ScriptContext1_Stop();
+ return TRUE;
+}
+
+// Lots of math, can't figure it out.
+/*
+bool8 ScrCmd_braillemessage(struct ScriptContext *ctx)
+{
+ u8 *ptr = (u8 *)ScriptReadWord(ctx);
+ struct WindowTemplate template1;
+ struct WindowTemplate template2;
+ int i;
+ u8 width;
+ u8 height;
+ int temp1;
+ int temp2;
+ u8 x;
+ u8 y;
+
+ StringExpandPlaceholders(gStringVar4, ptr + 6);
+
+ width = GetStringWidth(6, gStringVar4, -1) / 8;
+
+ if (width > 0x1C)
+ width = 0x1C;
+
+ for (i = 0, height = 4; gStringVar4[i] != 0xFF;)
+ {
+ if (gStringVar4[i++] == 0xFE)
+ height += 3;
+ }
+
+ if (height > 0x12)
+ height = 0x12;
+
+ x = width + 2;
+ temp1 = (0x1E - x) / 2;
+ x = temp1 + 1;
+ temp1 = ((x - temp1 - 1) * 8 + 3);
+
+ y = height + 2;
+ temp2 = (0x14 - y) / 2;
+ y = temp2 + 2;
+ temp2 = ((y - temp2 - 1) * 8);
+
+ sub_8198A50(&template1, 0, x, y, width, height, 0xF, 0x1);
+ template2 = template1;
+ gUnknown_03000F30 = AddWindow(&template2);
+ sub_809882C(gUnknown_03000F30, 0x214, 0xE0);
+ sub_81973FC(gUnknown_03000F30, 0);
+ PutWindowTilemap(gUnknown_03000F30);
+ FillWindowPixelBuffer(gUnknown_03000F30, 0x11);
+ PrintTextOnWindow(gUnknown_03000F30, 6, gStringVar4, temp1, temp2, 0xFF, 0x0);
+ CopyWindowToVram(gUnknown_03000F30, 3);
+ return FALSE;
+}*/
+__attribute__((naked))
+bool8 ScrCmd_braillemessage(struct ScriptContext *ctx)
+{
+ asm("push {r4-r7,lr}\n\
+ mov r7, r8\n\
+ push {r7}\n\
+ sub sp, #0x20\n\
+ bl ScriptReadWord\n\
+ add r1, r0, #0\n\
+ ldr r4, =gStringVar4\n\
+ add r1, #0x6\n\
+ add r0, r4, #0\n\
+ bl StringExpandPlaceholders\n\
+ mov r2, #0x1\n\
+ neg r2, r2\n\
+ mov r0, #0x6\n\
+ add r1, r4, #0\n\
+ bl GetStringWidth\n\
+ lsr r0, #3\n\
+ lsl r0, #24\n\
+ lsr r7, r0, #24\n\
+ cmp r7, #0x1C\n\
+ bls _0809AE9C\n\
+ mov r7, #0x1C\n\
+_0809AE9C:\n\
+ mov r5, #0x4\n\
+ ldrb r0, [r4]\n\
+ add r2, r7, #0x2\n\
+ add r1, sp, #0x18\n\
+ mov r8, r1\n\
+ cmp r0, #0xFF\n\
+ beq _0809AEC0\n\
+ add r1, r4, #0\n\
+_0809AEAC:\n\
+ ldrb r0, [r1]\n\
+ add r1, #0x1\n\
+ cmp r0, #0xFE\n\
+ bne _0809AEBA\n\
+ add r0, r5, #0x3\n\
+ lsl r0, #24\n\
+ lsr r5, r0, #24\n\
+_0809AEBA:\n\
+ ldrb r0, [r1]\n\
+ cmp r0, #0xFF\n\
+ bne _0809AEAC\n\
+_0809AEC0:\n\
+ cmp r5, #0x12\n\
+ bls _0809AEC6\n\
+ mov r5, #0x12\n\
+_0809AEC6:\n\
+ lsl r0, r2, #24\n\
+ lsr r0, #24\n\
+ mov r2, #0x1E\n\
+ sub r2, r0\n\
+ lsr r0, r2, #31\n\
+ add r2, r0\n\
+ asr r2, #1\n\
+ lsl r2, #24\n\
+ add r0, r5, #0x2\n\
+ lsl r0, #24\n\
+ lsr r0, #24\n\
+ mov r4, #0x14\n\
+ sub r4, r0\n\
+ lsr r0, r4, #31\n\
+ add r4, r0\n\
+ asr r4, #1\n\
+ lsl r4, #24\n\
+ lsr r6, r2, #24\n\
+ mov r0, #0x80\n\
+ lsl r0, #17\n\
+ add r2, r0\n\
+ lsr r2, #24\n\
+ lsr r3, r4, #24\n\
+ mov r1, #0x80\n\
+ lsl r1, #18\n\
+ add r4, r1\n\
+ lsr r4, #24\n\
+ sub r6, r2, r6\n\
+ sub r6, #0x1\n\
+ lsl r6, #3\n\
+ add r6, #0x3\n\
+ lsl r6, #24\n\
+ lsr r6, #24\n\
+ sub r4, r3\n\
+ sub r4, #0x1\n\
+ lsl r4, #27\n\
+ lsr r4, #24\n\
+ add r3, #0x1\n\
+ lsl r3, #24\n\
+ lsr r3, #24\n\
+ str r7, [sp]\n\
+ str r5, [sp, #0x4]\n\
+ mov r0, #0xF\n\
+ str r0, [sp, #0x8]\n\
+ mov r0, #0x1\n\
+ str r0, [sp, #0xC]\n\
+ add r0, sp, #0x10\n\
+ mov r1, #0\n\
+ bl sub_8198A50\n\
+ ldr r0, [sp, #0x10]\n\
+ ldr r1, [sp, #0x14]\n\
+ str r0, [sp, #0x18]\n\
+ str r1, [sp, #0x1C]\n\
+ ldr r5, =gUnknown_03000F30\n\
+ mov r0, r8\n\
+ bl AddWindow\n\
+ strb r0, [r5]\n\
+ ldrb r0, [r5]\n\
+ mov r1, #0x85\n\
+ lsl r1, #2\n\
+ mov r2, #0xE0\n\
+ bl sub_809882C\n\
+ ldrb r0, [r5]\n\
+ mov r1, #0\n\
+ bl sub_81973FC\n\
+ ldrb r0, [r5]\n\
+ bl PutWindowTilemap\n\
+ ldrb r0, [r5]\n\
+ mov r1, #0x11\n\
+ bl FillWindowPixelBuffer\n\
+ ldrb r0, [r5]\n\
+ ldr r2, =gStringVar4\n\
+ str r4, [sp]\n\
+ mov r1, #0xFF\n\
+ str r1, [sp, #0x4]\n\
+ mov r1, #0\n\
+ str r1, [sp, #0x8]\n\
+ mov r1, #0x6\n\
+ add r3, r6, #0\n\
+ bl PrintTextOnWindow\n\
+ ldrb r0, [r5]\n\
+ mov r1, #0x3\n\
+ bl CopyWindowToVram\n\
+ mov r0, #0\n\
+ add sp, #0x20\n\
+ pop {r3}\n\
+ mov r8, r3\n\
+ pop {r4-r7}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .pool");
+}
+
+bool8 ScrCmd_cmdDA(struct ScriptContext *ctx)
+{
+ sub_809BDB4();
+ return FALSE;
+}
+
+bool8 ScrCmd_vmessage(struct ScriptContext *ctx)
+{
+ u32 v1 = ScriptReadWord(ctx);
+
+ ShowFieldMessage((u8 *)(v1 - gUnknown_020375C4));
+ return FALSE;
+}
+
+bool8 ScrCmd_getspeciesname(struct ScriptContext *ctx)
+{
+ u8 stringVarIndex = ScriptReadByte(ctx);
+ u16 species = VarGet(ScriptReadHalfword(ctx));
+
+ StringCopy(sScriptStringVars[stringVarIndex], gSpeciesNames[species]);
+ return FALSE;
+}
+
+bool8 ScrCmd_getfirstpartypokename(struct ScriptContext *ctx)
+{
+ u8 stringVarIndex = ScriptReadByte(ctx);
+
+ u8 *dest = sScriptStringVars[stringVarIndex];
+ u8 partyIndex = GetLeadMonIndex();
+ u32 species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES, NULL);
+ StringCopy(dest, gSpeciesNames[species]);
+ return FALSE;
+}
+
+bool8 ScrCmd_getpartypokename(struct ScriptContext *ctx)
+{
+ u8 stringVarIndex = ScriptReadByte(ctx);
+ u16 partyIndex = VarGet(ScriptReadHalfword(ctx));
+
+ GetMonData(&gPlayerParty[partyIndex], MON_DATA_NICKNAME, sScriptStringVars[stringVarIndex]);
+ StringGetEnd10(sScriptStringVars[stringVarIndex]);
+ return FALSE;
+}
+
+bool8 ScrCmd_getitemname(struct ScriptContext *ctx)
+{
+ u8 stringVarIndex = ScriptReadByte(ctx);
+ u16 itemId = VarGet(ScriptReadHalfword(ctx));
+
+ CopyItemName(itemId, sScriptStringVars[stringVarIndex]);
+ return FALSE;
+}
+
+bool8 ScrCmd_getitemnameplural(struct ScriptContext *ctx)
+{
+ u8 stringVarIndex = ScriptReadByte(ctx);
+ u16 itemId = VarGet(ScriptReadHalfword(ctx));
+ u16 quantity = VarGet(ScriptReadHalfword(ctx));
+
+ CopyItemNameHandlePlural(itemId, sScriptStringVars[stringVarIndex], quantity);
+ return FALSE;
+}
+
+bool8 ScrCmd_getdecorname(struct ScriptContext *ctx)
+{
+ u8 stringVarIndex = ScriptReadByte(ctx);
+ u16 decorId = VarGet(ScriptReadHalfword(ctx));
+
+ StringCopy(sScriptStringVars[stringVarIndex], gDecorations[decorId].name);
+ return FALSE;
+}
+
+bool8 ScrCmd_getmovename(struct ScriptContext *ctx)
+{
+ u8 stringVarIndex = ScriptReadByte(ctx);
+ u16 moveId = VarGet(ScriptReadHalfword(ctx));
+
+ StringCopy(sScriptStringVars[stringVarIndex], gMoveNames[moveId]);
+ return FALSE;
+}
+
+bool8 ScrCmd_getnumberstring(struct ScriptContext *ctx)
+{
+ u8 stringVarIndex = ScriptReadByte(ctx);
+ u16 v1 = VarGet(ScriptReadHalfword(ctx));
+ u8 v2 = sub_80EF370(v1);
+
+ ConvertIntToDecimalStringN(sScriptStringVars[stringVarIndex], v1, 0, v2);
+ return FALSE;
+}
+
+bool8 ScrCmd_getstdstring(struct ScriptContext *ctx)
+{
+ u8 stringVarIndex = ScriptReadByte(ctx);
+ u16 index = VarGet(ScriptReadHalfword(ctx));
+
+ StringCopy(sScriptStringVars[stringVarIndex], gUnknown_0858BAF0[index]);
+ return FALSE;
+}
+
+bool8 ScrCmd_getcontesttype(struct ScriptContext *ctx)
+{
+ u8 stringVarIndex = ScriptReadByte(ctx);
+ u16 index = VarGet(ScriptReadHalfword(ctx));
+
+ sub_818E868(sScriptStringVars[stringVarIndex], index);
+ return FALSE;
+}
+
+bool8 ScrCmd_getstring(struct ScriptContext *ctx)
+{
+ u8 stringVarIndex = ScriptReadByte(ctx);
+ const u8 *text = (u8 *)ScriptReadWord(ctx);
+
+ StringCopy(sScriptStringVars[stringVarIndex], text);
+ return FALSE;
+}
+
+bool8 ScrCmd_vloadword(struct ScriptContext *ctx)
+{
+ const u8 *ptr = (u8 *)(ScriptReadWord(ctx) - gUnknown_020375C4);
+
+ StringExpandPlaceholders(gStringVar4, ptr);
+ return FALSE;
+}
+
+bool8 ScrCmd_vgetstring(struct ScriptContext *ctx)
+{
+ u8 stringVarIndex = ScriptReadByte(ctx);
+ u32 addr = ScriptReadWord(ctx);
+
+ const u8 *src = (u8 *)(addr - gUnknown_020375C4);
+ u8 *dest = sScriptStringVars[stringVarIndex];
+ StringCopy(dest, src);
+ return FALSE;
+}
+
+bool8 ScrCmd_getboxname(struct ScriptContext *ctx)
+{
+ u8 stringVarIndex = ScriptReadByte(ctx);
+ u16 boxId = VarGet(ScriptReadHalfword(ctx));
+
+ StringCopy(sScriptStringVars[stringVarIndex], GetBoxNamePtr(boxId));
+ return FALSE;
+}
+
+bool8 ScrCmd_givepoke(struct ScriptContext *ctx)
+{
+ u16 species = VarGet(ScriptReadHalfword(ctx));
+ u8 level = ScriptReadByte(ctx);
+ u16 item = VarGet(ScriptReadHalfword(ctx));
+ u32 unkParam1 = ScriptReadWord(ctx);
+ u32 unkParam2 = ScriptReadWord(ctx);
+ u8 unkParam3 = ScriptReadByte(ctx);
+
+ gScriptResult = ScriptGiveMon(species, level, item, unkParam1, unkParam2, unkParam3);
+ return FALSE;
+}
+
+bool8 ScrCmd_giveegg(struct ScriptContext *ctx)
+{
+ u16 species = VarGet(ScriptReadHalfword(ctx));
+
+ gScriptResult = ScriptGiveEgg(species);
+ return FALSE;
+}
+
+bool8 ScrCmd_setpokemove(struct ScriptContext *ctx)
+{
+ u8 partyIndex = ScriptReadByte(ctx);
+ u8 slot = ScriptReadByte(ctx);
+ u16 move = ScriptReadHalfword(ctx);
+
+ ScriptSetMonMoveSlot(partyIndex, move, slot);
+ return FALSE;
+}
+
+bool8 ScrCmd_checkpokemove(struct ScriptContext *ctx)
+{
+ u8 i;
+ u16 moveId = ScriptReadHalfword(ctx);
+
+ gScriptResult = 6;
+ for (i = 0; i < 6; i++)
+ {
+ u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL);
+ if (!species)
+ break;
+ // UB: GetMonData() arguments don't match function definition
+ if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) && pokemon_has_move(&gPlayerParty[i], moveId) == TRUE)
+ {
+ gScriptResult = i;
+ gSpecialVar_0x8004 = species;
+ break;
+ }
+ }
+ return FALSE;
+}
+
+bool8 ScrCmd_givemoney(struct ScriptContext *ctx)
+{
+ u32 amount = ScriptReadWord(ctx);
+ u8 ignore = ScriptReadByte(ctx);
+
+ if (!ignore)
+ AddMoney(&gSaveBlock1Ptr->money, amount);
+ return FALSE;
+}
+
+bool8 ScrCmd_takemoney(struct ScriptContext *ctx)
+{
+ u32 amount = ScriptReadWord(ctx);
+ u8 ignore = ScriptReadByte(ctx);
+
+ if (!ignore)
+ RemoveMoney(&gSaveBlock1Ptr->money, amount);
+ return FALSE;
+}
+
+bool8 ScrCmd_checkmoney(struct ScriptContext *ctx)
+{
+ u32 amount = ScriptReadWord(ctx);
+ u8 ignore = ScriptReadByte(ctx);
+
+ if (!ignore)
+ gScriptResult = IsEnoughMoney(&gSaveBlock1Ptr->money, amount);
+ return FALSE;
+}
+
+bool8 ScrCmd_showmoneybox(struct ScriptContext *ctx)
+{
+ u8 x = ScriptReadByte(ctx);
+ u8 y = ScriptReadByte(ctx);
+ u8 ignore = ScriptReadByte(ctx);
+
+ if (!ignore)
+ DrawMoneyBox(GetMoney(&gSaveBlock1Ptr->money), x, y);
+ return FALSE;
+}
+
+bool8 ScrCmd_hidemoneybox(struct ScriptContext *ctx)
+{
+ /*u8 x = ScriptReadByte(ctx);
+ u8 y = ScriptReadByte(ctx);*/
+
+ HideMoneyBox();
+ return FALSE;
+}
+
+bool8 ScrCmd_updatemoneybox(struct ScriptContext *ctx)
+{
+ u8 x = ScriptReadByte(ctx);
+ u8 y = ScriptReadByte(ctx);
+ u8 ignore = ScriptReadByte(ctx);
+
+ if (!ignore)
+ ChangeAmountInMoneyBox(GetMoney(&gSaveBlock1Ptr->money));
+ return FALSE;
+}
+
+bool8 ScrCmd_showcoinsbox(struct ScriptContext *ctx)
+{
+ u8 x = ScriptReadByte(ctx);
+ u8 y = ScriptReadByte(ctx);
+
+ ShowCoinsWindow(GetCoins(), x, y);
+ return FALSE;
+}
+
+bool8 ScrCmd_hidecoinsbox(struct ScriptContext *ctx)
+{
+ u8 x = ScriptReadByte(ctx);
+ u8 y = ScriptReadByte(ctx);
+
+ HideCoinsWindow();
+ return FALSE;
+}
+
+bool8 ScrCmd_updatecoinsbox(struct ScriptContext *ctx)
+{
+ u8 x = ScriptReadByte(ctx);
+ u8 y = ScriptReadByte(ctx);
+
+ PrintCoinsString(GetCoins());
+ return FALSE;
+}
+
+bool8 ScrCmd_trainerbattle(struct ScriptContext *ctx)
+{
+ ctx->scriptPtr = BattleSetup_ConfigureTrainerBattle(ctx->scriptPtr);
+ return FALSE;
+}
+
+bool8 ScrCmd_battlebegin(struct ScriptContext *ctx)
+{
+ BattleSetup_StartTrainerBattle();
+ return TRUE;
+}
+
+bool8 ScrCmd_ontrainerbattleend(struct ScriptContext *ctx)
+{
+ ctx->scriptPtr = BattleSetup_GetScriptAddrAfterBattle();
+ return FALSE;
+}
+
+bool8 ScrCmd_ontrainerbattleendgoto(struct ScriptContext *ctx)
+{
+ ctx->scriptPtr = BattleSetup_GetTrainerPostBattleScript();
+ return FALSE;
+}
+
+bool8 ScrCmd_checktrainerflag(struct ScriptContext *ctx)
+{
+ u16 index = VarGet(ScriptReadHalfword(ctx));
+
+ ctx->comparisonResult = HasTrainerAlreadyBeenFought(index);
+ return FALSE;
+}
+
+bool8 ScrCmd_settrainerflag(struct ScriptContext *ctx)
+{
+ u16 index = VarGet(ScriptReadHalfword(ctx));
+
+ trainer_flag_set(index);
+ return FALSE;
+}
+
+bool8 ScrCmd_cleartrainerflag(struct ScriptContext *ctx)
+{
+ u16 index = VarGet(ScriptReadHalfword(ctx));
+
+ trainer_flag_clear(index);
+ return FALSE;
+}
+
+bool8 ScrCmd_setwildbattle(struct ScriptContext *ctx)
+{
+ u16 species = ScriptReadHalfword(ctx);
+ u8 level = ScriptReadByte(ctx);
+ u16 item = ScriptReadHalfword(ctx);
+
+ CreateScriptedWildMon(species, level, item);
+ return FALSE;
+}
+
+bool8 ScrCmd_dowildbattle(struct ScriptContext *ctx)
+{
+ BattleSetup_StartScriptedWildBattle();
+ ScriptContext1_Stop();
+ return TRUE;
+}
+
+bool8 ScrCmd_pokemart(struct ScriptContext *ctx)
+{
+ const void *ptr = (void *)ScriptReadWord(ctx);
+
+ CreatePokemartMenu(ptr);
+ ScriptContext1_Stop();
+ return TRUE;
+}
+
+bool8 ScrCmd_pokemartdecor(struct ScriptContext *ctx)
+{
+ const void *ptr = (void *)ScriptReadWord(ctx);
+
+ CreateDecorationShop1Menu(ptr);
+ ScriptContext1_Stop();
+ return TRUE;
+}
+
+bool8 ScrCmd_pokemartbp(struct ScriptContext *ctx)
+{
+ const void *ptr = (void *)ScriptReadWord(ctx);
+
+ CreateDecorationShop2Menu(ptr);
+ ScriptContext1_Stop();
+ return TRUE;
+}
+
+bool8 ScrCmd_playslotmachine(struct ScriptContext *ctx)
+{
+ u8 slotMachineIndex = VarGet(ScriptReadHalfword(ctx));
+
+ PlaySlotMachine(slotMachineIndex, c2_exit_to_overworld_1_continue_scripts_restart_music);
+ ScriptContext1_Stop();
+ return TRUE;
+}
+
+bool8 ScrCmd_plantberrytree(struct ScriptContext *ctx)
+{
+ u8 treeId = ScriptReadByte(ctx);
+ u8 berry = ScriptReadByte(ctx);
+ u8 growthStage = ScriptReadByte(ctx);
+
+ if (berry == 0)
+ PlantBerryTree(treeId, 0, growthStage, FALSE);
+ else
+ PlantBerryTree(treeId, berry, growthStage, FALSE);
+ return FALSE;
+}
+
+bool8 ScrCmd_getpricereduction(struct ScriptContext *ctx)
+{
+ u16 value = VarGet(ScriptReadHalfword(ctx));
+
+ gScriptResult = GetPriceReduction(value);
+ return FALSE;
+}
+
+bool8 ScrCmd_choosecontestpkmn(struct ScriptContext *ctx)
+{
+ sub_81B9404();
+ ScriptContext1_Stop();
+ return TRUE;
+}
+
+
+bool8 ScrCmd_startcontest(struct ScriptContext *ctx)
+{
+ sub_80F840C();
+ ScriptContext1_Stop();
+ return TRUE;
+}
+
+bool8 ScrCmd_showcontestresults(struct ScriptContext *ctx)
+{
+ sub_80F8484();
+ ScriptContext1_Stop();
+ return TRUE;
+}
+
+bool8 ScrCmd_contestlinktransfer(struct ScriptContext *ctx)
+{
+ sub_80F84C4(gScriptContestCategory);
+ ScriptContext1_Stop();
+ return TRUE;
+}
+
+bool8 ScrCmd_dofieldeffect(struct ScriptContext *ctx)
+{
+ u16 effectId = VarGet(ScriptReadHalfword(ctx));
+
+ sFieldEffectScriptId = effectId;
+ FieldEffectStart(sFieldEffectScriptId);
+ return FALSE;
+}
+
+bool8 ScrCmd_setfieldeffect(struct ScriptContext *ctx)
+{
+ u8 argNum = ScriptReadByte(ctx);
+
+ gFieldEffectArguments[argNum] = (s16)VarGet(ScriptReadHalfword(ctx));
+ return FALSE;
+}
+
+static bool8 WaitForFieldEffectFinish(void)
+{
+ if (!FieldEffectActiveListContains(sFieldEffectScriptId))
+ return TRUE;
+ else
+ return FALSE;
+}
+
+bool8 ScrCmd_waitfieldeffect(struct ScriptContext *ctx)
+{
+ sFieldEffectScriptId = VarGet(ScriptReadHalfword(ctx));
+ SetupNativeScript(ctx, WaitForFieldEffectFinish);
+ return TRUE;
+}
+
+bool8 ScrCmd_sethealplace(struct ScriptContext *ctx)
+{
+ u16 healLocationId = VarGet(ScriptReadHalfword(ctx));
+
+ Overworld_SetHealLocationWarp(healLocationId);
+ return FALSE;
+}
+
+bool8 ScrCmd_checkplayergender(struct ScriptContext *ctx)
+{
+ gScriptResult = gSaveBlock2Ptr->playerGender;
+ return FALSE;
+}
+
+bool8 ScrCmd_playpokecry(struct ScriptContext *ctx)
+{
+ u16 species = VarGet(ScriptReadHalfword(ctx));
+ u16 mode = VarGet(ScriptReadHalfword(ctx));
+
+ PlayCry5(species, mode);
+ return FALSE;
+}
+
+bool8 ScrCmd_waitpokecry(struct ScriptContext *ctx)
+{
+ SetupNativeScript(ctx, IsCryFinished);
+ return TRUE;
+}
+
+bool8 ScrCmd_setmaptile(struct ScriptContext *ctx)
+{
+ u16 x = VarGet(ScriptReadHalfword(ctx));
+ u16 y = VarGet(ScriptReadHalfword(ctx));
+ u16 tileId = VarGet(ScriptReadHalfword(ctx));
+ u16 v8 = VarGet(ScriptReadHalfword(ctx));
+
+ x += 7;
+ y += 7;
+ if (!v8)
+ MapGridSetMetatileIdAt(x, y, tileId);
+ else
+ MapGridSetMetatileIdAt(x, y, tileId | 0xC00);
+ return FALSE;
+}
+
+bool8 ScrCmd_opendoor(struct ScriptContext *ctx)
+{
+ u16 x = VarGet(ScriptReadHalfword(ctx));
+ u16 y = VarGet(ScriptReadHalfword(ctx));
+
+ x += 7;
+ y += 7;
+ PlaySE(GetDoorSoundEffect(x, y));
+ FieldAnimateDoorOpen(x, y);
+ return FALSE;
+}
+
+bool8 ScrCmd_closedoor(struct ScriptContext *ctx)
+{
+ u16 x = VarGet(ScriptReadHalfword(ctx));
+ u16 y = VarGet(ScriptReadHalfword(ctx));
+
+ x += 7;
+ y += 7;
+ FieldAnimateDoorClose(x, y);
+ return FALSE;
+}
+
+static bool8 IsDoorAnimationStopped(void)
+{
+ if (!FieldIsDoorAnimationRunning())
+ return TRUE;
+ else
+ return FALSE;
+}
+
+bool8 ScrCmd_waitdooranim(struct ScriptContext *ctx)
+{
+ SetupNativeScript(ctx, IsDoorAnimationStopped);
+ return TRUE;
+}
+
+bool8 ScrCmd_setdooropen(struct ScriptContext *ctx)
+{
+ u16 x = VarGet(ScriptReadHalfword(ctx));
+ u16 y = VarGet(ScriptReadHalfword(ctx));
+
+ x += 7;
+ y += 7;
+ FieldSetDoorOpened(x, y);
+ return FALSE;
+}
+
+bool8 ScrCmd_setdoorclosed(struct ScriptContext *ctx)
+{
+ u16 x = VarGet(ScriptReadHalfword(ctx));
+ u16 y = VarGet(ScriptReadHalfword(ctx));
+
+ x += 7;
+ y += 7;
+ FieldSetDoorClosed(x, y);
+ return FALSE;
+}
+
+bool8 ScrCmd_addelevmenuitem(struct ScriptContext *ctx)
+{
+ u8 v3 = ScriptReadByte(ctx);
+ u16 v5 = VarGet(ScriptReadHalfword(ctx));
+ u16 v7 = VarGet(ScriptReadHalfword(ctx));
+ u16 v9 = VarGet(ScriptReadHalfword(ctx));
+
+ //ScriptAddElevatorMenuItem(v3, v5, v7, v9);
+ return FALSE;
+}
+
+bool8 ScrCmd_showelevmenu(struct ScriptContext *ctx)
+{
+ /*ScriptShowElevatorMenu();
+ ScriptContext1_Stop();
+ return TRUE;*/
+ return FALSE;
+}
+
+bool8 ScrCmd_checkcoins(struct ScriptContext *ctx)
+{
+ u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx));
+ *ptr = GetCoins();
+ return FALSE;
+}
+
+bool8 ScrCmd_givecoins(struct ScriptContext *ctx)
+{
+ u16 coins = VarGet(ScriptReadHalfword(ctx));
+
+ if (GiveCoins(coins) == TRUE)
+ gScriptResult = 0;
+ else
+ gScriptResult = 1;
+ return FALSE;
+}
+
+bool8 ScrCmd_takecoins(struct ScriptContext *ctx)
+{
+ u16 coins = VarGet(ScriptReadHalfword(ctx));
+
+ if (TakeCoins(coins) == TRUE)
+ gScriptResult = 0;
+ else
+ gScriptResult = 1;
+ return FALSE;
+}
+
+bool8 ScrCmd_mossdeepgym1(struct ScriptContext *ctx)
+{
+ u16 v1 = VarGet(ScriptReadHalfword(ctx));
+
+ sMovingNpcId = sub_81A89A0(v1);
+ return FALSE;
+}
+
+bool8 ScrCmd_mossdeepgym2(struct ScriptContext *ctx)
+{
+ sub_81A8AF8();
+ return FALSE;
+}
+
+bool8 ScrCmd_mossdeepgym3(struct ScriptContext *ctx)
+{
+ u16 v1 = VarGet(ScriptReadHalfword(ctx));
+
+ sub_81A8934(v1);
+ return FALSE;
+}
+
+bool8 ScrCmd_mossdeepgym4(struct ScriptContext *ctx)
+{
+ sub_81A895C();
+ return FALSE;
+}
+
+bool8 ScrCmd_cmdD8(struct ScriptContext *ctx)
+{
+ gSelectedMapObject = sub_80B47BC();
+ return FALSE;
+}
+
+bool8 ScrCmd_cmdD9(struct ScriptContext *ctx)
+{
+ if (is_c1_link_related_active())
+ {
+ return FALSE;
+ }
+ else
+ {
+ if (gMapObjects[gSelectedMapObject].active)
+ {
+ sub_8098630();
+ SetupNativeScript(ctx, sub_8098734);
+ }
+ return TRUE;
+ }
+}
+
+// This command will force the Pokémon to be obedient, you don't get to choose which value to set its obedience to
+bool8 ScrCmd_setpokeobedient(struct ScriptContext *ctx)
+{
+ bool8 obedient = TRUE;
+ u16 partyIndex = VarGet(ScriptReadHalfword(ctx));
+
+ SetMonData(&gPlayerParty[partyIndex], MON_DATA_OBEDIENCE, &obedient);
+ return FALSE;
+}
+
+bool8 ScrCmd_checkpokeobedience(struct ScriptContext *ctx)
+{
+ u16 partyIndex = VarGet(ScriptReadHalfword(ctx));
+
+ gScriptResult = GetMonData(&gPlayerParty[partyIndex], MON_DATA_OBEDIENCE, NULL);
+ return FALSE;
+}
+
+bool8 ScrCmd_cmdCF(struct ScriptContext *ctx)
+{
+ const u8* v1 = sub_8099244();
+
+ if (v1)
+ {
+ ((u8*)gUnknown_020375C0) = ctx->scriptPtr;
+ ScriptJump(ctx, v1);
+ }
+ return FALSE;
+}
+
+bool8 ScrCmd_warpD1(struct ScriptContext *ctx)
+{
+ u8 mapGroup = ScriptReadByte(ctx);
+ u8 mapNum = ScriptReadByte(ctx);
+ u8 warpId = ScriptReadByte(ctx);
+ u16 x = VarGet(ScriptReadHalfword(ctx));
+ u16 y = VarGet(ScriptReadHalfword(ctx));
+
+ Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y);
+ sub_808D074(player_get_direction_lower_nybble());
+ sub_80B0244();
+ player_avatar_init_params_reset();
+ return TRUE;
+}
+
+bool8 ScrCmd_setpokemetlocation(struct ScriptContext *ctx)
+{
+ u16 partyIndex = VarGet(ScriptReadHalfword(ctx));
+ u8 location = ScriptReadByte(ctx);
+
+ if (partyIndex < PARTY_SIZE)
+ SetMonData(&gPlayerParty[partyIndex], MON_DATA_MET_LOCATION, &location);
+ return FALSE;
+}
+
+void sub_809BDB4(void)
+{
+ sub_819746C(gUnknown_03000F30, 1);
+ RemoveWindow(gUnknown_03000F30);
+}
+
+bool8 ScrCmd_gettrainerclass(struct ScriptContext *ctx)
+{
+ u8 stringVarIndex = ScriptReadByte(ctx);
+ u16 trainerClassId = VarGet(ScriptReadHalfword(ctx));
+
+ StringCopy(sScriptStringVars[stringVarIndex], GetTrainerClassNameFromId(trainerClassId));
+ return FALSE;
+}
+
+bool8 ScrCmd_gettrainername(struct ScriptContext *ctx)
+{
+ u8 stringVarIndex = ScriptReadByte(ctx);
+ u16 trainerClassId = VarGet(ScriptReadHalfword(ctx));
+
+ StringCopy(sScriptStringVars[stringVarIndex], GetTrainerNameFromId(trainerClassId));
+ return FALSE;
+}
+
+void sub_809BE48(u16 npcId)
+{
+ sMovingNpcId = npcId;
+}
-// .rodata
+bool8 ScrCmd_warpE0(struct ScriptContext *ctx)
+{
+ u8 mapGroup = ScriptReadByte(ctx);
+ u8 mapNum = ScriptReadByte(ctx);
+ u8 warpId = ScriptReadByte(ctx);
+ u16 x = VarGet(ScriptReadHalfword(ctx));
+ u16 y = VarGet(ScriptReadHalfword(ctx));
-// .text
+ Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y);
+ sub_80AF79C();
+ player_avatar_init_params_reset();
+ return TRUE;
+}
diff --git a/src/script.c b/src/script.c
index b2809a137..5a1c5daa9 100644
--- a/src/script.c
+++ b/src/script.c
@@ -134,12 +134,12 @@ const u8 *ScriptPop(struct ScriptContext *ctx)
return ctx->stack[ctx->stackDepth];
}
-void ScriptJump(struct ScriptContext *ctx, u8 *ptr)
+void ScriptJump(struct ScriptContext *ctx, const u8 *ptr)
{
ctx->scriptPtr = ptr;
}
-void ScriptCall(struct ScriptContext *ctx, u8 *ptr)
+void ScriptCall(struct ScriptContext *ctx, const u8 *ptr)
{
ScriptPush(ctx, ctx->scriptPtr);
ctx->scriptPtr = ptr;
diff --git a/src/start_menu.c b/src/start_menu.c
index ac393ce2e..be30d0e53 100644
--- a/src/start_menu.c
+++ b/src/start_menu.c
@@ -170,13 +170,13 @@ extern const u8 gText_BattlePyramidFloor[];
void DisplayPyramidFloorWindow(void)
{
// TODO: fix location
- if (*(u16*)(&gSaveBlock2Ptr->field_CAA[8]) == 7)
+ if (gSaveBlock2Ptr->field_CAA[4] == 7)
sBattlePyramidFloorWindowId = AddWindow(&gPyramidFloorWindowTemplate_1);
else
sBattlePyramidFloorWindowId = AddWindow(&gPyramidFloorWindowTemplate_2);
PutWindowTilemap(sBattlePyramidFloorWindowId);
sub_81973FC(sBattlePyramidFloorWindowId, 0);
- StringCopy(gStringVar1, gUnknown_08510510[*(u16*)(&gSaveBlock2Ptr->field_CAA[8])]);
+ StringCopy(gStringVar1, gUnknown_08510510[gSaveBlock2Ptr->field_CAA[4]]);
StringExpandPlaceholders(gStringVar4, gText_BattlePyramidFloor);
PrintTextOnWindow(sBattlePyramidFloorWindowId, 1, gStringVar4, 0, 1, 0xFF, NULL);
CopyWindowToVram(sBattlePyramidFloorWindowId, 2);
diff --git a/src/string_util.c b/src/string_util.c
index 92e9f19e8..ea50ba5a5 100644
--- a/src/string_util.c
+++ b/src/string_util.c
@@ -625,7 +625,7 @@ u8 *WriteColorChangeControlCode(u8 *dest, u32 colorType, u8 color)
return dest;
}
-bool32 sub_8009228(u8 *str)
+bool32 IsStringJapanese(u8 *str)
{
while (*str != EOS)
{
diff --git a/src/text.c b/src/text.c
index 7cc46cd92..8108a6867 100644
--- a/src/text.c
+++ b/src/text.c
@@ -145,7 +145,7 @@ void DeactivateAllTextPrinters (void)
gTextPrinters[printer].sub_union.sub.active = 0;
}
-u16 PrintTextOnWindow(u8 windowId, u8 fontId, u8 *str, u8 x, u8 y, u8 speed, void (*callback)(struct TextSubPrinter *, u16))
+u16 PrintTextOnWindow(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, void (*callback)(struct TextSubPrinter *, u16))
{
struct TextSubPrinter subPrinter;
diff --git a/src/tv.c b/src/tv.c
new file mode 100644
index 000000000..7f64b46ac
--- /dev/null
+++ b/src/tv.c
@@ -0,0 +1,7927 @@
+
+// Includes
+#include "global.h"
+#include "rtc.h"
+#include "overworld.h"
+#include "map_constants.h"
+#include "rng.h"
+#include "event_data.h"
+#include "fieldmap.h"
+#include "field_camera.h"
+#include "strings.h"
+#include "string_util.h"
+#include "international_string_util.h"
+#include "pokemon_storage_system.h"
+#include "field_message_box.h"
+#include "easy_chat.h"
+#include "species.h"
+#include "moves.h"
+#include "battle.h"
+#include "battle_tower.h"
+#include "contest.h"
+#include "items.h"
+#include "item.h"
+#include "link.h"
+#include "main.h"
+#include "event_scripts.h"
+#include "shop.h"
+#include "lilycove_lady.h"
+#include "rom6.h"
+#include "pokedex.h"
+#include "field_map_obj.h"
+#include "text.h"
+#include "script_menu.h"
+#include "naming_screen.h"
+#include "malloc.h"
+#include "region_map.h"
+#include "decoration.h"
+#include "secret_base.h"
+#include "tv.h"
+
+// Static type declarations
+
+#define rbernoulli(num, den) TV_BernoulliTrial(0xFFFF * (num) / (den))
+
+// Static RAM declarations
+
+s8 sCurTVShowSlot;
+u16 sTV_SecretBaseVisitMovesTemp[8];
+u8 sTV_DecorationsBuffer[16];
+struct {
+ u8 level;
+ u16 species;
+ u16 move;
+} sTV_SecretBaseVisitMonsTemp[10];
+
+IWRAM_DATA u8 sTVShowMixingNumPlayers;
+IWRAM_DATA u8 sTVShowNewsMixingNumPlayers;
+IWRAM_DATA s8 sTVShowMixingCurSlot;
+
+EWRAM_DATA u16 sPokemonAnglerSpecies = 0;
+EWRAM_DATA u16 sPokemonAnglerAttemptCounters = 0;
+EWRAM_DATA u16 sFindThatGamerCoinsSpent = 0;
+EWRAM_DATA bool8 sFindThatGamerWhichGame = FALSE;
+EWRAM_DATA ALIGNED(4) u8 sRecordMixingPartnersWithoutShowsToShare = 0;
+EWRAM_DATA ALIGNED(4) u8 sTVShowState = 0;
+EWRAM_DATA u8 sTVSecretBaseSecretsRandomValues[3] = {};
+
+// Static ROM declarations
+
+extern const u8 *const sTVBravoTrainerTextGroup[];
+extern const u8 *const sTVBravoTrainerBattleTowerTextGroup[];
+
+void ClearPokemonNews(void);
+u8 GetTVChannelByShowType(u8 kind);
+u8 FindFirstActiveTVShowThatIsNotAMassOutbreak(void);
+u8 CheckForBigMovieOrEmergencyNewsOnTV(void);
+void SetTVMetatilesOnMap(int width, int height, u16 tileId);
+u8 FindAnyTVNewsOnTheAir(void);
+bool8 IsTVShowInSearchOfTrainersAiring(void);
+void TakeTVShowInSearchOfTrainersOffTheAir(void);
+bool8 TV_BernoulliTrial(u16 ratio);
+s8 FindEmptyTVSlotBeyondFirstFiveShowsOfArray(TVShow *shows);
+bool8 HasMixableShowAlreadyBeenSpawnedWithPlayerID(u8 kind, bool8 flag);
+void tv_store_id_3x(TVShow *show);
+void DeleteTVShowInArrayByIdx(TVShow *shows, u8 idx);
+s8 FindEmptyTVSlotWithinFirstFiveShowsOfArray(TVShow *shows);
+void FindActiveBroadcastByShowType_SetScriptResult(u8 kind);
+void InterviewBefore_BravoTrainerPkmnProfile(void);
+void InterviewBefore_NameRater(void);
+u16 TV_GetSomeOtherSpeciesAlreadySeenByPlayer(u16 passedSpecies);
+void sub_80EFA88(void);
+void sub_80EF93C(TVShow *shows);
+s8 sub_80EEE30(PokeNews *pokeNews);
+bool8 sub_80EF0E4(u8 newsKind);
+void ClearPokemonNewsI(u8 i);
+void sub_80F1254(TVShow *shows);
+void sub_80F12A4(TVShow *shows);
+void sub_80F0358(TVShow *player1, TVShow *player2, TVShow *player3, TVShow *player4);
+void sub_80F0C04(void);
+void sub_80F0708(void);
+void sub_80F0B64(void);
+s8 sub_80F06D0(TVShow *tvShows);
+bool8 sub_80F049C(TVShow *dest[], TVShow *src[], u8 idx);
+bool8 sub_80F0580(TVShow *tv1, TVShow *tv2, u8 idx);
+bool8 sub_80F05E8(TVShow *tv1, TVShow *tv2, u8 idx);
+bool8 sub_80F0668(TVShow *tv1, TVShow *tv2, u8 idx);
+void sub_80F0B00(u8 showIdx);
+void sub_80F0B24(u16 species, u8 showIdx);
+void sub_80F0D60(PokeNews *player1, PokeNews *player2, PokeNews *player3, PokeNews *player4);
+void sub_80F0EEC(void);
+void sub_80F0F24(void);
+s8 sub_80F0ECC(PokeNews *pokeNews, u8 idx);
+void sub_80F0E58(PokeNews *dest[], PokeNews *src[]);
+bool8 sub_80F0E84(PokeNews *dest, PokeNews *src, s8 slot);
+void TVShowDone(void);
+void InterviewAfter_FanClubLetter(void);
+void InterviewAfter_RecentHappenings(void);
+void InterviewAfter_PkmnFanClubOpinions(void);
+void InterviewAfter_DummyShow4(void);
+void InterviewAfter_BravoTrainerPokemonProfile(void);
+void InterviewAfter_BravoTrainerBattleTowerProfile(void);
+void InterviewAfter_ContestLiveUpdates(void);
+void UpdateWorldOfMastersAndPutItOnTheAir(void);
+void PutPokemonTodayFailedOnTheAir(void);
+void sub_80ED718(void);
+void sub_80EED88(void);
+void TV_SortPurchasesByQuantity(void);
+void sub_80ED8B4(u16 days);
+void UpdateMassOutbreakTimeLeft(u16 days);
+void sub_80EF120(u16 days);
+void sub_80EDA48(u16 days);
+void sub_80EEB98(u16 days);
+void PutFishingAdviceShowOnTheAir(void);
+void sub_80EDA80(void);
+u8 TV_MonDataIdxToRibbon(u8 monDataIdx);
+void sub_80EEBF4(u8 actionIdx);
+bool8 IsPriceDiscounted(u8 newsKind);
+void InterviewBefore_FanClubLetter(void);
+void InterviewBefore_RecentHappenings(void);
+void InterviewBefore_PkmnFanClubOpinions(void);
+void InterviewBefore_Dummy(void);
+void InterviewBefore_BravoTrainerBTProfile(void);
+void InterviewBefore_ContestLiveUpdates(void);
+void InterviewBefore_3CheersForPokeblocks(void);
+void InterviewBefore_FanClubSpecial(void);
+void ChangeBoxPokemonNickname_CB(void);
+void DoTVShowPokemonFanClubLetter(void);
+void DoTVShowRecentHappenings(void);
+void DoTVShowPokemonFanClubOpinions(void);
+void DoTVShowDummiedOut(void);
+void DoTVShowPokemonNewsMassOutbreak(void);
+void DoTVShowBravoTrainerPokemonProfile(void);
+void DoTVShowBravoTrainerBattleTower(void);
+void DoTVShowPokemonTodaySuccessfulCapture(void);
+void DoTVShowTodaysSmartShopper(void);
+void DoTVShowTheNameRaterShow(void);
+void DoTVShowPokemonContestLiveUpdates(void);
+void DoTVShowPokemonBattleUpdate(void);
+void DoTVShow3CheersForPokeblocks(void);
+void DoTVShowPokemonTodayFailedCapture(void);
+void DoTVShowPokemonAngler(void);
+void DoTVShowTheWorldOfMasters(void);
+void DoTVShowTodaysRivalTrainer(void);
+void DoTVShowDewfordTrendWatcherNetwork(void);
+void DoTVShowHoennTreasureInvestigators(void);
+void DoTVShowFindThatGamer(void);
+void DoTVShowBreakingNewsTV(void);
+void DoTVShowSecretBaseVisit(void);
+void DoTVShowPokemonLotteryWinnerFlashReport(void);
+void DoTVShowThePokemonBattleSeminar(void);
+void DoTVShowTrainerFanClubSpecial(void);
+void DoTVShowTrainerFanClub(void);
+void DoTVShowSpotTheCuties(void);
+void DoTVShowPokemonNewsBattleFrontier(void);
+void DoTVShowWhatsNo1InHoennToday(void);
+void DoTVShowSecretBaseSecrets(void);
+void DoTVShowSafariFanClub(void);
+void DoTVShowPokemonContestLiveUpdates2(void);
+
+// .rodata
+
+const struct {
+ u16 species;
+ u16 moves[4];
+ u8 level;
+ u8 location;
+} sPokeOutbreakSpeciesList[] = {
+ {
+ SPECIES_SEEDOT,
+ {MOVE_BIDE, MOVE_HARDEN, MOVE_LEECH_SEED},
+ 3, 0x11 // Route 102
+ },
+ {
+ SPECIES_NUZLEAF,
+ {MOVE_HARDEN, MOVE_GROWTH, MOVE_NATURE_POWER, MOVE_LEECH_SEED},
+ 15, 0x1D // Route 114
+ },
+ {
+ SPECIES_SEEDOT,
+ {MOVE_HARDEN, MOVE_GROWTH, MOVE_NATURE_POWER, MOVE_LEECH_SEED},
+ 13, 0x20 // Route 117
+ },
+ {
+ SPECIES_SEEDOT,
+ {MOVE_GIGA_DRAIN, MOVE_FRUSTRATION, MOVE_SOLAR_BEAM, MOVE_LEECH_SEED},
+ 25, 0x23 // Route 110
+ },
+ {
+ SPECIES_SKITTY,
+ {MOVE_GROWL, MOVE_TACKLE, MOVE_TAIL_WHIP, MOVE_ATTRACT},
+ 8, 0x1F // Route 116
+ }
+};
+
+// TODO: Figure out what these are, and define constants in include/flags.h
+const u16 sGoldSymbolFlags[] = {
+ SYS_TOWER_GOLD,
+ SYS_DOME_GOLD,
+ SYS_PALACE_GOLD,
+ SYS_ARENA_GOLD,
+ SYS_FACTORY_GOLD,
+ SYS_PIKE_GOLD,
+ SYS_PYRAMID_GOLD
+};
+
+const u16 sSilverSymbolFlags[] = {
+ SYS_TOWER_SILVER,
+ SYS_DOME_SILVER,
+ SYS_PALACE_SILVER,
+ SYS_ARENA_SILVER,
+ SYS_FACTORY_SILVER,
+ SYS_PIKE_SILVER,
+ SYS_PYRAMID_SILVER
+};
+
+// TODO: Figure out what these are, and define constants in include/vars.h
+const u16 sNumberOneVarsAndThresholds[][2] = {
+ {VAR_DAILY_SLOTS, 100},
+ {VAR_DAILY_ROULETTE, 50},
+ {VAR_DAILY_WILDS, 100},
+ {VAR_DAILY_BLENDER, 20},
+ {VAR_DAILY_PLANTED_BERRIES, 20},
+ {VAR_DAILY_PICKED_BERRIES, 20},
+ {VAR_DAILY_BP, 30}
+};
+
+const u8 *const sPokeNewsTextGroup_Upcoming[] = {
+ NULL,
+ gPokeNewsTextSlateport_Upcoming,
+ gPokeNewsTextGameCorner_Upcoming,
+ gPokeNewsTextLilycove_Upcoming,
+ gPokeNewsTextBlendMaster_Upcoming
+};
+
+const u8 *const sPokeNewsTextGroup_Ongoing[] = {
+ NULL,
+ gPokeNewsTextSlateport_Ongoing,
+ gPokeNewsTextGameCorner_Ongoing,
+ gPokeNewsTextLilycove_Ongoing,
+ gPokeNewsTextBlendMaster_Ongoing
+};
+
+const u8 *const sPokeNewsTextGroup_Ending[] = {
+ NULL,
+ gPokeNewsTextSlateport_Ending,
+ gPokeNewsTextGameCorner_Ending,
+ gPokeNewsTextLilycove_Ending,
+ gPokeNewsTextBlendMaster_Ending
+};
+
+u8 *const gTVStringVarPtrs[] = {
+ gStringVar1,
+ gStringVar2,
+ gStringVar3
+};
+
+const u8 *const sTVFanClubTextGroup[] = {
+ gTVFanClubText00,
+ gTVFanClubText01,
+ gTVFanClubText02,
+ gTVFanClubText03,
+ gTVFanClubText04,
+ gTVFanClubText05,
+ gTVFanClubText06,
+ gTVFanClubText07
+};
+
+const u8 *const sTVRecentHappeninssTextGroup[] = {
+ gTVRecentHappeningsText00,
+ gTVRecentHappeningsText01,
+ gTVRecentHappeningsText02,
+ gTVRecentHappeningsText03,
+ gTVRecentHappeningsText04,
+ gTVRecentHappeningsText05
+};
+
+const u8 *const sTVFanClubOpinionsTextGroup[] = {
+ gTVFanClubOpinionsText00,
+ gTVFanClubOpinionsText01,
+ gTVFanClubOpinionsText02,
+ gTVFanClubOpinionsText03,
+ gTVFanClubOpinionsText04
+};
+
+const u8 *const sTVMassOutbreakTextGroup[] = {
+ gTVMassOutbreakText00
+};
+
+const u8 *const sTVPokemonTodaySuccessfulTextGroup[] = {
+ gTVPokemonTodaySuccessfulText00,
+ gTVPokemonTodaySuccessfulText01,
+ gTVPokemonTodaySuccessfulText02,
+ gTVPokemonTodaySuccessfulText03,
+ gTVPokemonTodaySuccessfulText04,
+ gTVPokemonTodaySuccessfulText05,
+ gTVPokemonTodaySuccessfulText06,
+ gTVPokemonTodaySuccessfulText07,
+ gTVPokemonTodaySuccessfulText08,
+ gTVPokemonTodaySuccessfulText09,
+ gTVPokemonTodaySuccessfulText10,
+ gTVPokemonTodaySuccessfulText11
+};
+
+const u8 *const sTVTodaysSmartShopperTextGroup[] = {
+ gTVTodaysSmartShopperText00,
+ gTVTodaysSmartShopperText01,
+ gTVTodaysSmartShopperText02,
+ gTVTodaysSmartShopperText03,
+ gTVTodaysSmartShopperText04,
+ gTVTodaysSmartShopperText05,
+ gTVTodaysSmartShopperText06,
+ gTVTodaysSmartShopperText07,
+ gTVTodaysSmartShopperText08,
+ gTVTodaysSmartShopperText09,
+ gTVTodaysSmartShopperText10,
+ gTVTodaysSmartShopperText11,
+ gTVTodaysSmartShopperText12
+};
+
+const u8 *const sTVBravoTrainerTextGroup[] = {
+ gTVBravoTrainerText00,
+ gTVBravoTrainerText01,
+ gTVBravoTrainerText02,
+ gTVBravoTrainerText03,
+ gTVBravoTrainerText04,
+ gTVBravoTrainerText05,
+ gTVBravoTrainerText06,
+ gTVBravoTrainerText07,
+ gTVBravoTrainerText08
+};
+
+const u8 *const sTV3CheersForPokeblocksTextGroup[] = {
+ gTV3CheersForPokeblocksText00,
+ gTV3CheersForPokeblocksText01,
+ gTV3CheersForPokeblocksText02,
+ gTV3CheersForPokeblocksText03,
+ gTV3CheersForPokeblocksText04,
+ gTV3CheersForPokeblocksText05
+};
+
+const u8 *const sTVBravoTrainerBattleTowerTextGroup[] = {
+ gTVBravoTrainerBattleTowerText00,
+ gTVBravoTrainerBattleTowerText01,
+ gTVBravoTrainerBattleTowerText02,
+ gTVBravoTrainerBattleTowerText03,
+ gTVBravoTrainerBattleTowerText04,
+ gTVBravoTrainerBattleTowerText05,
+ gTVBravoTrainerBattleTowerText06,
+ gTVBravoTrainerBattleTowerText07,
+ gTVBravoTrainerBattleTowerText08,
+ gTVBravoTrainerBattleTowerText09,
+ gTVBravoTrainerBattleTowerText10,
+ gTVBravoTrainerBattleTowerText11,
+ gTVBravoTrainerBattleTowerText12,
+ gTVBravoTrainerBattleTowerText13,
+ gTVBravoTrainerBattleTowerText14
+};
+
+const u8 *const sTVContestLiveUpdatesTextGroup[] = {
+ gTVContestLiveUpdatesText00,
+ gTVContestLiveUpdatesText01,
+ gTVContestLiveUpdatesText02,
+ gTVContestLiveUpdatesText03,
+ gTVContestLiveUpdatesText04,
+ gTVContestLiveUpdatesText05,
+ gTVContestLiveUpdatesText06,
+ gTVContestLiveUpdatesText07,
+ gTVContestLiveUpdatesText08,
+ gTVContestLiveUpdatesText09,
+ gTVContestLiveUpdatesText10,
+ gTVContestLiveUpdatesText11,
+ gTVContestLiveUpdatesText12,
+ gTVContestLiveUpdatesText13,
+ gTVContestLiveUpdatesText14,
+ gTVContestLiveUpdatesText15,
+ gTVContestLiveUpdatesText16,
+ gTVContestLiveUpdatesText17,
+ gTVContestLiveUpdatesText18,
+ gTVContestLiveUpdatesText19,
+ gTVContestLiveUpdatesText20,
+ gTVContestLiveUpdatesText21,
+ gTVContestLiveUpdatesText22,
+ gTVContestLiveUpdatesText23,
+ gTVContestLiveUpdatesText24,
+ gTVContestLiveUpdatesText25,
+ gTVContestLiveUpdatesText26,
+ gTVContestLiveUpdatesText27,
+ gTVContestLiveUpdatesText28,
+ gTVContestLiveUpdatesText29,
+ gTVContestLiveUpdatesText30,
+ gTVContestLiveUpdatesText31,
+ gTVContestLiveUpdatesText32
+};
+
+const u8 *const sTVPokemonBattleUpdateTextGroup[] = {
+ gTVPokemonBattleUpdateText00,
+ gTVPokemonBattleUpdateText01,
+ gTVPokemonBattleUpdateText02,
+ gTVPokemonBattleUpdateText03,
+ gTVPokemonBattleUpdateText04,
+ gTVPokemonBattleUpdateText05,
+ gTVPokemonBattleUpdateText06,
+ gTVPokemonBattleUpdateText07
+};
+
+const u8 *const sTVTrainerFanClubSpecialTextGroup[] = {
+ gTVTrainerFanClubSpecialText00,
+ gTVTrainerFanClubSpecialText01,
+ gTVTrainerFanClubSpecialText02,
+ gTVTrainerFanClubSpecialText03,
+ gTVTrainerFanClubSpecialText04,
+ gTVTrainerFanClubSpecialText05
+};
+
+const u8 *const sTVNameRaterTextGroup[] = {
+ gTVNameRaterText00,
+ gTVNameRaterText01,
+ gTVNameRaterText02,
+ gTVNameRaterText03,
+ gTVNameRaterText04,
+ gTVNameRaterText05,
+ gTVNameRaterText06,
+ gTVNameRaterText07,
+ gTVNameRaterText08,
+ gTVNameRaterText09,
+ gTVNameRaterText10,
+ gTVNameRaterText11,
+ gTVNameRaterText12,
+ gTVNameRaterText13,
+ gTVNameRaterText14,
+ gTVNameRaterText15,
+ gTVNameRaterText16,
+ gTVNameRaterText17,
+ gTVNameRaterText18
+};
+
+const u8 *const sTVPokemonContestLiveUpdates2TextGroup[] = {
+ gTVPokemonContestLiveUpdates2Text00,
+ gTVPokemonContestLiveUpdates2Text01,
+ gTVPokemonContestLiveUpdates2Text02,
+ gTVPokemonContestLiveUpdates2Text03
+};
+
+const u8 *const sTVPokemonTodayFailedTextGroup[] = {
+ gTVPokemonTodayFailedText00,
+ gTVPokemonTodayFailedText01,
+ gTVPokemonTodayFailedText02,
+ gTVPokemonTodayFailedText03,
+ gTVPokemonTodayFailedText04,
+ gTVPokemonTodayFailedText05,
+ gTVPokemonTodayFailedText06
+};
+
+const u8 *const sTVPokemonAnslerTextGroup[] = {
+ gTVPokemonAnglerText00,
+ gTVPokemonAnglerText01
+};
+
+const u8 *const sTVWorldOfMastersTextGroup[] = {
+ gTVWorldOfMastersText00,
+ gTVWorldOfMastersText01,
+ gTVWorldOfMastersText02
+};
+
+const u8 *const sTVTodaysRivalTrainerTextGroup[] = {
+ gTVTodaysRivalTrainerText00,
+ gTVTodaysRivalTrainerText01,
+ gTVTodaysRivalTrainerText02,
+ gTVTodaysRivalTrainerText03,
+ gTVTodaysRivalTrainerText04,
+ gTVTodaysRivalTrainerText05,
+ gTVTodaysRivalTrainerText06,
+ gTVTodaysRivalTrainerText07,
+ gTVTodaysRivalTrainerText08,
+ gTVTodaysRivalTrainerText09,
+ gTVTodaysRivalTrainerText10
+};
+
+const u8 *const sTVDewfordTrendWatcherNetworkTextGroup[] = {
+ gTVDewfordTrendWatcherNetworkText00,
+ gTVDewfordTrendWatcherNetworkText01,
+ gTVDewfordTrendWatcherNetworkText02,
+ gTVDewfordTrendWatcherNetworkText03,
+ gTVDewfordTrendWatcherNetworkText04,
+ gTVDewfordTrendWatcherNetworkText05,
+ gTVDewfordTrendWatcherNetworkText06
+};
+
+const u8 *const sTVHoennTreasureInvestisatorsTextGroup[] = {
+ gTVHoennTreasureInvestigatorsText00,
+ gTVHoennTreasureInvestigatorsText01,
+ gTVHoennTreasureInvestigatorsText02
+};
+
+const u8 *const sTVFindThatGamerTextGroup[] = {
+ gTVFindThatGamerText00,
+ gTVFindThatGamerText01,
+ gTVFindThatGamerText02,
+ gTVFindThatGamerText03
+};
+
+const u8 *const sTVBreakinsNewsTextGroup[] = {
+ gTVBreakingNewsText00,
+ gTVBreakingNewsText01,
+ gTVBreakingNewsText02,
+ gTVBreakingNewsText03,
+ gTVBreakingNewsText04,
+ gTVBreakingNewsText05,
+ gTVBreakingNewsText06,
+ gTVBreakingNewsText07,
+ gTVBreakingNewsText08,
+ gTVBreakingNewsText09,
+ gTVBreakingNewsText10,
+ gTVBreakingNewsText11,
+ gTVBreakingNewsText12
+};
+
+const u8 *const sTVSecretBaseVisitTextGroup[] = {
+ gTVSecretBaseVisitText00,
+ gTVSecretBaseVisitText01,
+ gTVSecretBaseVisitText02,
+ gTVSecretBaseVisitText03,
+ gTVSecretBaseVisitText04,
+ gTVSecretBaseVisitText05,
+ gTVSecretBaseVisitText06,
+ gTVSecretBaseVisitText07,
+ gTVSecretBaseVisitText08,
+ gTVSecretBaseVisitText09,
+ gTVSecretBaseVisitText10,
+ gTVSecretBaseVisitText11,
+ gTVSecretBaseVisitText12,
+ gTVSecretBaseVisitText13
+};
+
+const u8 *const sTVPokemonLotteryWinnerFlashReportTextGroup[] = {
+ gTVPokemonLotteryWinnerFlashReportText00
+};
+
+const u8 *const sTVThePokemonBattleSeminarTextGroup[] = {
+ gTVThePokemonBattleSeminarText00,
+ gTVThePokemonBattleSeminarText01,
+ gTVThePokemonBattleSeminarText02,
+ gTVThePokemonBattleSeminarText03,
+ gTVThePokemonBattleSeminarText04,
+ gTVThePokemonBattleSeminarText05,
+ gTVThePokemonBattleSeminarText06
+};
+
+const u8 *const sTVTrainerFanClubTextGroup[] = {
+ gTVTrainerFanClubText00,
+ gTVTrainerFanClubText01,
+ gTVTrainerFanClubText02,
+ gTVTrainerFanClubText03,
+ gTVTrainerFanClubText04,
+ gTVTrainerFanClubText05,
+ gTVTrainerFanClubText06,
+ gTVTrainerFanClubText07,
+ gTVTrainerFanClubText08,
+ gTVTrainerFanClubText09,
+ gTVTrainerFanClubText10,
+ gTVTrainerFanClubText11
+};
+
+const u8 *const sTVCutiesTextGroup[] = {
+ gTVCutiesText00,
+ gTVCutiesText01,
+ gTVCutiesText02,
+ gTVCutiesText03,
+ gTVCutiesText04,
+ gTVCutiesText05,
+ gTVCutiesText06,
+ gTVCutiesText07,
+ gTVCutiesText08,
+ gTVCutiesText09,
+ gTVCutiesText10,
+ gTVCutiesText11,
+ gTVCutiesText12,
+ gTVCutiesText13,
+ gTVCutiesText14,
+ gTVCutiesText15
+};
+
+const u8 *const sTVPokemonNewsBattleFrontierTextGroup[] = {
+ gTVPokemonNewsBattleFrontierText00,
+ gTVPokemonNewsBattleFrontierText01,
+ gTVPokemonNewsBattleFrontierText02,
+ gTVPokemonNewsBattleFrontierText03,
+ gTVPokemonNewsBattleFrontierText04,
+ gTVPokemonNewsBattleFrontierText05,
+ gTVPokemonNewsBattleFrontierText06,
+ gTVPokemonNewsBattleFrontierText07,
+ gTVPokemonNewsBattleFrontierText08,
+ gTVPokemonNewsBattleFrontierText09,
+ gTVPokemonNewsBattleFrontierText10,
+ gTVPokemonNewsBattleFrontierText11,
+ gTVPokemonNewsBattleFrontierText12,
+ gTVPokemonNewsBattleFrontierText13,
+ gTVPokemonNewsBattleFrontierText14,
+ gTVPokemonNewsBattleFrontierText15,
+ gTVPokemonNewsBattleFrontierText16,
+ gTVPokemonNewsBattleFrontierText17,
+ gTVPokemonNewsBattleFrontierText18
+};
+
+const u8 *const sTVWhatsNo1InHoennTodayTextGroup[] = {
+ gTVWhatsNo1InHoennTodayText00,
+ gTVWhatsNo1InHoennTodayText01,
+ gTVWhatsNo1InHoennTodayText02,
+ gTVWhatsNo1InHoennTodayText03,
+ gTVWhatsNo1InHoennTodayText04,
+ gTVWhatsNo1InHoennTodayText05,
+ gTVWhatsNo1InHoennTodayText06,
+ gTVWhatsNo1InHoennTodayText07,
+ gTVWhatsNo1InHoennTodayText08
+};
+
+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
+};
+
+const u8 *const sTVSafariFanClubTextGroup[] = {
+ gTVSafariFanClubText00,
+ gTVSafariFanClubText01,
+ gTVSafariFanClubText02,
+ gTVSafariFanClubText03,
+ gTVSafariFanClubText04,
+ gTVSafariFanClubText05,
+ gTVSafariFanClubText06,
+ gTVSafariFanClubText07,
+ gTVSafariFanClubText08,
+ gTVSafariFanClubText09,
+ gTVSafariFanClubText10
+};
+
+const u8 *const sTVInSearchOfTrainersTextGroup[] = {
+ gTVInSearchOfTrainersText00,
+ gTVInSearchOfTrainersText01,
+ gTVInSearchOfTrainersText02,
+ gTVInSearchOfTrainersText03,
+ gTVInSearchOfTrainersText04,
+ gTVInSearchOfTrainersText05,
+ gTVInSearchOfTrainersText06,
+ gTVInSearchOfTrainersText07,
+ 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
+};
+
+// .text
+
+void ClearTVShowData(void)
+{
+ u8 i;
+ u8 j;
+
+ for (i = 0; i < ARRAY_COUNT(gSaveBlock1Ptr->tvShows); i ++)
+ {
+ gSaveBlock1Ptr->tvShows[i].common.kind = 0;
+ gSaveBlock1Ptr->tvShows[i].common.active = 0;
+ for (j = 0; j < sizeof(TVShow) - 2; j ++)
+ {
+ gSaveBlock1Ptr->tvShows[i].common.pad02[j] = 0;
+ }
+ }
+ ClearPokemonNews();
+}
+
+u8 special_0x44(void)
+{
+ u8 i;
+ u8 j;
+ u8 selIdx;
+ TVShow *show;
+
+ for (i = 5; i < ARRAY_COUNT(gSaveBlock1Ptr->tvShows) - 1; i ++)
+ {
+ if (gSaveBlock1Ptr->tvShows[i].common.kind == 0)
+ {
+ break;
+ }
+ }
+ j = Random() % i;
+ selIdx = j;
+ do
+ {
+ if (GetTVChannelByShowType(gSaveBlock1Ptr->tvShows[j].common.kind) != 4)
+ {
+ if (gSaveBlock1Ptr->tvShows[j].common.active == TRUE)
+ {
+ return j;
+ }
+ }
+ else
+ {
+ show = &gSaveBlock1Ptr->tvShows[j];
+ if (show->massOutbreak.daysLeft == 0 && show->massOutbreak.active == TRUE)
+ {
+ return j;
+ }
+ }
+ if (j == 0)
+ {
+ j = ARRAY_COUNT(gSaveBlock1Ptr->tvShows) - 2;
+ }
+ else
+ {
+ j --;
+ }
+ } while (j != selIdx);
+ return 0xFF;
+}
+
+u8 FindAnyTVShowOnTheAir(void)
+{
+ u8 response;
+
+ response = special_0x44();
+ if (response == 0xFF)
+ {
+ return 0xFF;
+ }
+ if (gSaveBlock1Ptr->outbreakPokemonSpecies != SPECIES_NONE && gSaveBlock1Ptr->tvShows[response].common.kind == TVSHOW_MASS_OUTBREAK)
+ {
+ return FindFirstActiveTVShowThatIsNotAMassOutbreak();
+ }
+ return response;
+}
+
+void UpdateTVScreensOnMap(int width, int height)
+{
+ FlagSet(SYS_TV_WATCH);
+ switch (CheckForBigMovieOrEmergencyNewsOnTV())
+ {
+ case 1:
+ SetTVMetatilesOnMap(width, height, 0x3);
+ break;
+ case 2:
+ break;
+ default:
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F && gSaveBlock1Ptr->location.mapNum == MAP_ID_LILYCOVE_CITY_COVE_LILY_MOTEL_1F)
+ {
+ SetTVMetatilesOnMap(width, height, 0x3);
+ }
+ else if (FlagGet(SYS_TV_START) && (FindAnyTVShowOnTheAir() != 0xff || FindAnyTVNewsOnTheAir() != 0xff || IsTVShowInSearchOfTrainersAiring()))
+ {
+ FlagClear(SYS_TV_WATCH);
+ SetTVMetatilesOnMap(width, height, 0x3);
+ }
+ break;
+ }
+}
+
+void SetTVMetatilesOnMap(int width, int height, u16 tileId)
+{
+ int x;
+ int y;
+
+ for (y = 0; y < height; y ++)
+ {
+ for (x = 0; x < width; x ++)
+ {
+ if (MapGridGetMetatileBehaviorAt(x, y) == 0x86) // is this tile a TV?
+ {
+ MapGridSetMetatileIdAt(x, y, tileId | 0xc00);
+ }
+ }
+ }
+}
+
+void TurnOffTVScreen(void)
+{
+ SetTVMetatilesOnMap(gUnknown_03005DC0.width, gUnknown_03005DC0.height, 0x0002);
+ DrawWholeMapView();
+}
+
+void TurnOnTVScreen(void)
+{
+ SetTVMetatilesOnMap(gUnknown_03005DC0.width, gUnknown_03005DC0.height, 0x0003);
+ DrawWholeMapView();
+}
+
+u8 special_0x45(void)
+{
+ return gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004].common.kind;
+}
+
+u8 FindFirstActiveTVShowThatIsNotAMassOutbreak(void)
+{
+ u8 i;
+
+ for (i = 0; i < ARRAY_COUNT(gSaveBlock1Ptr->tvShows) - 1; i ++)
+ {
+ if (gSaveBlock1Ptr->tvShows[i].common.kind != 0 && gSaveBlock1Ptr->tvShows[i].common.kind != TVSHOW_MASS_OUTBREAK && gSaveBlock1Ptr->tvShows[i].common.active == TRUE)
+ {
+ return i;
+ }
+ }
+ return 0xFF;
+}
+
+u8 special_0x4a(void)
+{
+ TVShow *tvShow;
+
+ tvShow = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ if (tvShow->common.kind == TVSHOW_MASS_OUTBREAK && gSaveBlock1Ptr->outbreakPokemonSpecies != SPECIES_NONE)
+ {
+ return FindFirstActiveTVShowThatIsNotAMassOutbreak();
+ }
+ return gSpecialVar_0x8004;
+}
+
+// IN SEARCH OF TRAINERS
+
+void ResetGabbyAndTy(void)
+{
+ gSaveBlock1Ptr->gabbyAndTyData.mon1 = SPECIES_NONE;
+ gSaveBlock1Ptr->gabbyAndTyData.mon2 = SPECIES_NONE;
+ gSaveBlock1Ptr->gabbyAndTyData.lastMove = MOVE_NONE;
+ gSaveBlock1Ptr->gabbyAndTyData.quote[0] = -1;
+ gSaveBlock1Ptr->gabbyAndTyData.battleTookMoreThanOneTurn = FALSE;
+ gSaveBlock1Ptr->gabbyAndTyData.playerLostAMon = FALSE;
+ gSaveBlock1Ptr->gabbyAndTyData.playerUsedAnItem = FALSE;
+ gSaveBlock1Ptr->gabbyAndTyData.playerThrewABall = FALSE;
+ gSaveBlock1Ptr->gabbyAndTyData.onAir = FALSE;
+ gSaveBlock1Ptr->gabbyAndTyData.valA_5 = 0;
+ gSaveBlock1Ptr->gabbyAndTyData.battleTookMoreThanOneTurn2 = FALSE;
+ gSaveBlock1Ptr->gabbyAndTyData.playerLostAMon2 = FALSE;
+ gSaveBlock1Ptr->gabbyAndTyData.playerUsedAnItem2 = FALSE;
+ gSaveBlock1Ptr->gabbyAndTyData.playerThrewABall2 = FALSE;
+ gSaveBlock1Ptr->gabbyAndTyData.valB_4 = 0;
+ gSaveBlock1Ptr->gabbyAndTyData.mapnum = 0;
+ gSaveBlock1Ptr->gabbyAndTyData.battleNum = 0;
+}
+
+void GabbyAndTyBeforeInterview(void)
+{
+ u8 i;
+
+ gSaveBlock1Ptr->gabbyAndTyData.mon1 = gBattleResults.playerMon1Species;
+ gSaveBlock1Ptr->gabbyAndTyData.mon2 = gBattleResults.playerMon2Species;
+ gSaveBlock1Ptr->gabbyAndTyData.lastMove = gBattleResults.lastUsedMovePlayer;
+ if (gSaveBlock1Ptr->gabbyAndTyData.battleNum != 0xFF)
+ {
+ gSaveBlock1Ptr->gabbyAndTyData.battleNum ++;
+ }
+ gSaveBlock1Ptr->gabbyAndTyData.battleTookMoreThanOneTurn = gBattleResults.unk5_0;
+ if (gBattleResults.playerFaintCounter != 0)
+ {
+ gSaveBlock1Ptr->gabbyAndTyData.playerLostAMon = TRUE;
+ }
+ else
+ {
+ gSaveBlock1Ptr->gabbyAndTyData.playerLostAMon = FALSE;
+ }
+ if (gBattleResults.unk3 != 0)
+ {
+ gSaveBlock1Ptr->gabbyAndTyData.playerUsedAnItem = TRUE;
+ }
+ else
+ {
+ gSaveBlock1Ptr->gabbyAndTyData.playerUsedAnItem = FALSE;
+ }
+ if (!gBattleResults.usedMasterBall)
+ {
+ for (i = 0; i < 11; i ++)
+ {
+ if (gBattleResults.catchAttempts[i])
+ {
+ gSaveBlock1Ptr->gabbyAndTyData.playerThrewABall = TRUE;
+ break;
+ }
+ }
+ }
+ else
+ {
+ gSaveBlock1Ptr->gabbyAndTyData.playerThrewABall = TRUE;
+ }
+ TakeTVShowInSearchOfTrainersOffTheAir();
+ if (gSaveBlock1Ptr->gabbyAndTyData.lastMove == MOVE_NONE)
+ {
+ FlagSet(0x0001);
+ }
+}
+
+void GabbyAndTyAfterInterview(void)
+{
+ gSaveBlock1Ptr->gabbyAndTyData.battleTookMoreThanOneTurn2 = gSaveBlock1Ptr->gabbyAndTyData.battleTookMoreThanOneTurn;
+ gSaveBlock1Ptr->gabbyAndTyData.playerLostAMon2 = gSaveBlock1Ptr->gabbyAndTyData.playerLostAMon;
+ gSaveBlock1Ptr->gabbyAndTyData.playerUsedAnItem2 = gSaveBlock1Ptr->gabbyAndTyData.playerUsedAnItem;
+ gSaveBlock1Ptr->gabbyAndTyData.playerThrewABall2 = gSaveBlock1Ptr->gabbyAndTyData.playerThrewABall;
+ gSaveBlock1Ptr->gabbyAndTyData.onAir = TRUE;
+ gSaveBlock1Ptr->gabbyAndTyData.mapnum = gMapHeader.regionMapSectionId;
+ IncrementGameStat(GAME_STAT_GOT_INTERVIEWED);
+}
+
+void TakeTVShowInSearchOfTrainersOffTheAir(void)
+{
+ gSaveBlock1Ptr->gabbyAndTyData.onAir = FALSE;
+}
+
+u8 GabbyAndTyGetBattleNum(void)
+{
+ if (gSaveBlock1Ptr->gabbyAndTyData.battleNum > 5)
+ {
+ return (gSaveBlock1Ptr->gabbyAndTyData.battleNum % 3) + 6;
+ }
+ return gSaveBlock1Ptr->gabbyAndTyData.battleNum;
+}
+
+bool8 IsTVShowInSearchOfTrainersAiring(void)
+{
+ return gSaveBlock1Ptr->gabbyAndTyData.onAir;
+}
+
+bool8 GabbyAndTyGetLastQuote(void)
+{
+ if (gSaveBlock1Ptr->gabbyAndTyData.quote[0] == 0xFFFF)
+ {
+ return FALSE;
+ }
+ CopyEasyChatWord(gStringVar1, gSaveBlock1Ptr->gabbyAndTyData.quote[0]);
+ gSaveBlock1Ptr->gabbyAndTyData.quote[0] = -1;
+ return TRUE;
+}
+
+u8 GabbyAndTyGetLastBattleTrivia(void)
+{
+ if (!gSaveBlock1Ptr->gabbyAndTyData.battleTookMoreThanOneTurn2)
+ {
+ return 1;
+ }
+ if (gSaveBlock1Ptr->gabbyAndTyData.playerThrewABall2)
+ {
+ return 2;
+ }
+ if (gSaveBlock1Ptr->gabbyAndTyData.playerUsedAnItem2)
+ {
+ return 3;
+ }
+ if (gSaveBlock1Ptr->gabbyAndTyData.playerLostAMon2)
+ {
+ return 4;
+ }
+ return 0;
+}
+
+void GabbyAndTySetScriptVarsToFieldObjectLocalIds(void)
+{
+ switch (GabbyAndTyGetBattleNum())
+ {
+ case 1:
+ gSpecialVar_0x8004 = 14;
+ gSpecialVar_0x8005 = 13;
+ break;
+ case 2:
+ gSpecialVar_0x8004 = 5;
+ gSpecialVar_0x8005 = 6;
+ break;
+ case 3:
+ gSpecialVar_0x8004 = 18;
+ gSpecialVar_0x8005 = 17;
+ break;
+ case 4:
+ gSpecialVar_0x8004 = 21;
+ gSpecialVar_0x8005 = 22;
+ break;
+ case 5:
+ gSpecialVar_0x8004 = 8;
+ gSpecialVar_0x8005 = 9;
+ break;
+ case 6:
+ gSpecialVar_0x8004 = 19;
+ gSpecialVar_0x8005 = 20;
+ break;
+ case 7:
+ gSpecialVar_0x8004 = 23;
+ gSpecialVar_0x8005 = 24;
+ break;
+ case 8:
+ gSpecialVar_0x8004 = 10;
+ gSpecialVar_0x8005 = 11;
+ break;
+ }
+}
+
+void InterviewAfter(void)
+{
+ switch (gSpecialVar_0x8005)
+ {
+ case TVSHOW_FAN_CLUB_LETTER:
+ InterviewAfter_FanClubLetter();
+ break;
+ case TVSHOW_RECENT_HAPPENINGS:
+ InterviewAfter_RecentHappenings();
+ break;
+ case TVSHOW_PKMN_FAN_CLUB_OPINIONS:
+ InterviewAfter_PkmnFanClubOpinions();
+ break;
+ case TVSHOW_UNKN_SHOWTYPE_04:
+ InterviewAfter_DummyShow4();
+ break;
+ case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE:
+ InterviewAfter_BravoTrainerPokemonProfile();
+ break;
+ case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE:
+ InterviewAfter_BravoTrainerBattleTowerProfile();
+ break;
+ case TVSHOW_CONTEST_LIVE_UPDATES:
+ InterviewAfter_ContestLiveUpdates();
+ break;
+ }
+}
+
+void PutPokemonTodayCaughtOnAir(void)
+{
+ u8 i;
+ u16 ct;
+ TVShow *show;
+ u32 language2;
+ u16 itemLastUsed;
+
+ ct = 0;
+ sub_80EED88();
+ sub_80ED718();
+ if (gBattleResults.caughtMonSpecies == SPECIES_NONE)
+ {
+ PutPokemonTodayFailedOnTheAir();
+ }
+ else
+ {
+ UpdateWorldOfMastersAndPutItOnTheAir();
+ if (!rbernoulli(1, 1) && StringCompare(gSpeciesNames[gBattleResults.caughtMonSpecies], gBattleResults.caughtMonNick))
+ {
+ sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_POKEMON_TODAY_CAUGHT, FALSE) != TRUE)
+ {
+ for (i = 0; i < 11; i ++)
+ {
+ ct += gBattleResults.catchAttempts[i];
+ }
+ if (ct != 0 || gBattleResults.usedMasterBall)
+ {
+ ct = 0;
+ show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ show->pokemonToday.kind = TVSHOW_POKEMON_TODAY_CAUGHT;
+ show->pokemonToday.active = FALSE;
+ if (gBattleResults.usedMasterBall)
+ {
+ ct = 1;
+ itemLastUsed = ITEM_MASTER_BALL;
+ }
+ else
+ {
+ for (i = 0; i < 11; i ++)
+ {
+ ct += gBattleResults.catchAttempts[i];
+ }
+ if (ct > 0xFF)
+ {
+ ct = 0xFF;
+ }
+ itemLastUsed = gLastUsedItem;
+ }
+ show->pokemonToday.nBallsUsed = ct;
+ show->pokemonToday.ball = itemLastUsed;
+ StringCopy(show->pokemonToday.playerName, gSaveBlock2Ptr->playerName);
+ StringCopy(show->pokemonToday.nickname, gBattleResults.caughtMonNick);
+ language2 = sub_81DB604(show->pokemonToday.nickname);
+ StripExtCtrlCodes(show->pokemonToday.nickname);
+ show->pokemonToday.species = gBattleResults.caughtMonSpecies;
+ tv_store_id_3x(show);
+ show->pokemonToday.language = gGameLanguage;
+ show->pokemonToday.language2 = language2;
+ }
+ }
+ }
+ }
+}
+
+void UpdateWorldOfMastersAndPutItOnTheAir(void)
+{
+ TVShow *show;
+
+ show = &gSaveBlock1Ptr->tvShows[24];
+ if (show->worldOfMasters.kind != TVSHOW_WORLD_OF_MASTERS)
+ {
+ DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, 24);
+ show->worldOfMasters.steps = GetGameStat(GAME_STAT_STEPS);
+ show->worldOfMasters.kind = TVSHOW_WORLD_OF_MASTERS;
+ }
+ show->worldOfMasters.numPokeCaught ++;
+ show->worldOfMasters.caughtPoke = gBattleResults.caughtMonSpecies;
+ show->worldOfMasters.species = gBattleResults.playerMon1Species;
+ show->worldOfMasters.location = gMapHeader.regionMapSectionId;
+}
+
+void PutPokemonTodayFailedOnTheAir(void)
+{
+ u16 ct;
+ u8 i;
+ TVShow *show;
+
+ if (!rbernoulli(1, 1))
+ {
+ for (i = 0, ct = 0; i < 11; i ++)
+ {
+ ct += gBattleResults.catchAttempts[i];
+ }
+ if (ct > 0xFF)
+ {
+ ct = 0xFF;
+ }
+ if (ct > 2 && (gBattleOutcome == BATTLE_POKE_FLED || gBattleOutcome == BATTLE_WON))
+ {
+ sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_POKEMON_TODAY_FAILED, FALSE) != TRUE)
+ {
+ show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ show->pokemonTodayFailed.kind = TVSHOW_POKEMON_TODAY_FAILED;
+ show->pokemonTodayFailed.active = FALSE;
+ show->pokemonTodayFailed.species = gBattleResults.playerMon1Species;
+ show->pokemonTodayFailed.species2 = gBattleResults.lastOpponentSpecies;
+ show->pokemonTodayFailed.nBallsUsed = ct;
+ show->pokemonTodayFailed.outcome = gBattleOutcome;
+ show->pokemonTodayFailed.location = gMapHeader.regionMapSectionId;
+ StringCopy(show->pokemonTodayFailed.playerName, gSaveBlock2Ptr->playerName);
+ tv_store_id_3x(show);
+ show->pokemonTodayFailed.language = gGameLanguage;
+ }
+ }
+ }
+}
+
+void tv_store_id_3x(TVShow *show)
+{
+ u32 id;
+
+ id = GetPlayerIDAsU32();
+ show->common.srcTrainerId2Lo = id;
+ show->common.srcTrainerId2Hi = id >> 8;
+ show->common.srcTrainerIdLo = id;
+ show->common.srcTrainerIdHi = id >> 8;
+ show->common.trainerIdLo = id;
+ show->common.trainerIdHi = id >> 8;
+}
+
+void tv_store_id_2x(TVShow *show)
+{
+ u32 id;
+
+ id = GetPlayerIDAsU32();
+ show->common.srcTrainerIdLo = id;
+ show->common.srcTrainerIdHi = id >> 8;
+ show->common.trainerIdLo = id;
+ show->common.trainerIdHi = id >> 8;
+}
+
+void InterviewAfter_ContestLiveUpdates(void)
+{
+ TVShow *show;
+ TVShow *show2;
+
+ show = &gSaveBlock1Ptr->tvShows[24];
+ if (show->contestLiveUpdates.kind == TVSHOW_CONTEST_LIVE_UPDATES)
+ {
+ show2 = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ show2->contestLiveUpdates.kind = TVSHOW_CONTEST_LIVE_UPDATES;
+ show2->contestLiveUpdates.active = TRUE;
+ StringCopy(show2->contestLiveUpdates.playerName, gSaveBlock2Ptr->playerName);
+ show2->contestLiveUpdates.category = gScriptContestCategory;
+ show2->contestLiveUpdates.species = GetMonData(&gPlayerParty[gUnknown_02039F24], MON_DATA_SPECIES, NULL);
+ show2->contestLiveUpdates.winningSpecies = show->contestLiveUpdates.winningSpecies;
+ show2->contestLiveUpdates.appealFlags2 = show->contestLiveUpdates.appealFlags2;
+ show2->contestLiveUpdates.round1Rank = show->contestLiveUpdates.round1Rank;
+ show2->contestLiveUpdates.round2Rank = show->contestLiveUpdates.round2Rank;
+ show2->contestLiveUpdates.move = show->contestLiveUpdates.move;
+ show2->contestLiveUpdates.appealFlags1 = show->contestLiveUpdates.appealFlags1;
+ StringCopy(show2->contestLiveUpdates.winningTrainerName, show->contestLiveUpdates.winningTrainerName);
+ tv_store_id_2x(show2);
+ show2->contestLiveUpdates.language = gGameLanguage;
+ show2->contestLiveUpdates.winningTrainerLanguage = show->contestLiveUpdates.winningTrainerLanguage;
+ DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, 24);
+ }
+}
+
+void PutBattleUpdateOnTheAir(u8 a0, u16 a1, u16 a2, u16 a3)
+{
+ TVShow *show;
+ u8 name[32];
+
+ sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1)
+ {
+ FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_BATTLE_UPDATE);
+ if (gScriptResult != 1)
+ {
+ show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ show->battleUpdate.kind = TVSHOW_BATTLE_UPDATE;
+ show->battleUpdate.active = TRUE;
+ StringCopy(show->battleUpdate.playerName, gSaveBlock2Ptr->playerName);
+ if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ {
+ show->battleUpdate.battleType = 2;
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
+ {
+ show->battleUpdate.battleType = 1;
+ }
+ else
+ {
+ show->battleUpdate.battleType = 0;
+ }
+ show->battleUpdate.move = a1;
+ show->battleUpdate.species2 = a2;
+ show->battleUpdate.species = a3;
+ StringCopy(name, gLinkPlayers[a0].name);
+ StripExtCtrlCodes(name);
+ StringCopy(show->battleUpdate.linkOpponentName, name);
+ tv_store_id_2x(show);
+ show->battleUpdate.language = gGameLanguage;
+ if (show->battleUpdate.language == LANGUAGE_JAPANESE || gLinkPlayers[a0].language == LANGUAGE_JAPANESE)
+ {
+ show->battleUpdate.linkOpponentLanguage = LANGUAGE_JAPANESE;
+ }
+ else
+ {
+ show->battleUpdate.linkOpponentLanguage = gLinkPlayers[a0].language;
+ }
+ }
+ }
+}
+
+bool8 Put3CheersForPokeblocksOnTheAir(const u8 *partnersName, u8 flavor, u8 unused, u8 sheen, u8 language)
+{
+ TVShow *show;
+ u8 name[32];
+
+ sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot == -1)
+ {
+ return FALSE;
+ }
+ FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_3_CHEERS_FOR_POKEBLOCKS);
+ if (gScriptResult == 1)
+ {
+ return FALSE;
+ }
+ show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ show->threeCheers.kind = TVSHOW_3_CHEERS_FOR_POKEBLOCKS;
+ show->threeCheers.active = TRUE;
+ StringCopy(show->threeCheers.playerName, gSaveBlock2Ptr->playerName);
+ StringCopy(name, partnersName);
+ StripExtCtrlCodes(name);
+ StringCopy(show->threeCheers.worstBlenderName, name);
+ show->threeCheers.flavor = flavor;
+ show->threeCheers.unk_03_3 = unused;
+ show->threeCheers.sheen = sheen;
+ tv_store_id_2x(show);
+ show->threeCheers.language = gGameLanguage;
+ if (show->threeCheers.language == LANGUAGE_JAPANESE || language == LANGUAGE_JAPANESE)
+ {
+ show->threeCheers.worstBlenderLanguage = LANGUAGE_JAPANESE;
+ }
+ else
+ {
+ show->threeCheers.worstBlenderLanguage = language;
+ }
+ return TRUE;
+}
+
+void PutFanClubSpecialOnTheAir(void)
+{
+ TVShow *show;
+ u8 name[32];
+ u32 id;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8006];
+ show->fanClubSpecial.score = gSpecialVar_0x8005 * 10;
+ StringCopy(show->fanClubSpecial.playerName, gSaveBlock2Ptr->playerName);
+ show->fanClubSpecial.kind = TVSHOW_FAN_CLUB_SPECIAL;
+ show->fanClubSpecial.active = TRUE;
+ id = GetPlayerIDAsU32();
+ show->fanClubSpecial.idLo = id;
+ show->fanClubSpecial.idHi = id >> 8;
+ StringCopy(name, gStringVar1);
+ StripExtCtrlCodes(name);
+ StringCopy(show->fanClubSpecial.idolName, name);
+ tv_store_id_2x(show);
+ show->fanClubSpecial.language = gGameLanguage;
+ if (show->fanClubSpecial.language == LANGUAGE_JAPANESE || gSaveBlock1Ptr->unk_31A0 == LANGUAGE_JAPANESE)
+ {
+ show->fanClubSpecial.idolNameLanguage = LANGUAGE_JAPANESE;
+ }
+ else
+ {
+ show->fanClubSpecial.idolNameLanguage = gSaveBlock1Ptr->unk_31A0;
+ }
+}
+
+void ContestLiveUpdates_BeforeInterview_1(u8 a0)
+{
+ TVShow *show;
+
+ DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, 24);
+ sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1)
+ {
+ show = &gSaveBlock1Ptr->tvShows[24];
+ show->contestLiveUpdates.round1Rank = a0;
+ show->contestLiveUpdates.kind = TVSHOW_CONTEST_LIVE_UPDATES;
+ }
+}
+
+void ContestLiveUpdates_BeforeInterview_2(u8 a0)
+{
+ TVShow *show;
+
+ show = &gSaveBlock1Ptr->tvShows[24];
+ sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1)
+ {
+ show->contestLiveUpdates.round2Rank = a0;
+ }
+}
+
+void ContestLiveUpdates_BeforeInterview_3(u8 a0)
+{
+ TVShow *show;
+
+ show = &gSaveBlock1Ptr->tvShows[24];
+ sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1)
+ {
+ show->contestLiveUpdates.appealFlags1 = a0;
+ }
+}
+
+void ContestLiveUpdates_BeforeInterview_4(u16 a0)
+{
+ TVShow *show;
+
+ show = &gSaveBlock1Ptr->tvShows[24];
+ sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1)
+ {
+ show->contestLiveUpdates.move = a0;
+ }
+}
+
+void ContestLiveUpdates_BeforeInterview_5(u8 a0, u8 a1)
+{
+ TVShow *show;
+
+ show = &gSaveBlock1Ptr->tvShows[24];
+ sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1)
+ {
+ show->contestLiveUpdates.winningSpecies = gUnknown_02039E00[a1].unk_00;
+ StringCopy(show->contestLiveUpdates.winningTrainerName, gUnknown_02039E00[a1].unk_0d);
+ StripExtCtrlCodes(show->contestLiveUpdates.winningTrainerName);
+ show->contestLiveUpdates.appealFlags2 = a0;
+ if (a1 + 1 > gUnknown_02039F30)
+ {
+ show->contestLiveUpdates.winningTrainerLanguage = gLinkPlayers[0].language;
+ }
+ else if (gGameLanguage == LANGUAGE_JAPANESE || gLinkPlayers[a1].language == LANGUAGE_JAPANESE)
+ {
+ show->contestLiveUpdates.winningTrainerLanguage = LANGUAGE_JAPANESE;
+ }
+ else
+ {
+ show->contestLiveUpdates.winningTrainerLanguage = gLinkPlayers[a1].language;
+ }
+ }
+}
+
+void InterviewAfter_BravoTrainerPokemonProfile(void)
+{
+ TVShow *show;
+ TVShow *show2;
+
+ show = &gSaveBlock1Ptr->tvShows[24];
+ if (show->bravoTrainer.kind == TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE)
+ {
+ show2 = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ show2->bravoTrainer.kind = TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE;
+ show2->bravoTrainer.active = TRUE;
+ show2->bravoTrainer.species = show->bravoTrainer.species;
+ StringCopy(show2->bravoTrainer.playerName, gSaveBlock2Ptr->playerName);
+ StringCopy(show2->bravoTrainer.pokemonNickname, show->bravoTrainer.pokemonNickname);
+ show2->bravoTrainer.contestCategory = show->bravoTrainer.contestCategory;
+ show2->bravoTrainer.contestRank = show->bravoTrainer.contestRank;
+ show2->bravoTrainer.move = show->bravoTrainer.move;
+ show2->bravoTrainer.contestResult = show->bravoTrainer.contestResult;
+ show2->bravoTrainer.contestCategory = show->bravoTrainer.contestCategory;
+ tv_store_id_2x(show2);
+ show2->bravoTrainer.language = gGameLanguage;
+ if (show2->bravoTrainer.language == LANGUAGE_JAPANESE || show->bravoTrainer.pokemonNameLanguage == LANGUAGE_JAPANESE)
+ {
+ show2->bravoTrainer.pokemonNameLanguage = LANGUAGE_JAPANESE;
+ }
+ else
+ {
+ show2->bravoTrainer.pokemonNameLanguage = show->bravoTrainer.pokemonNameLanguage;
+ }
+ DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, 24);
+ }
+}
+
+void BravoTrainerPokemonProfile_BeforeInterview1(u16 a0)
+{
+ TVShow *show;
+
+ show = &gSaveBlock1Ptr->tvShows[24];
+ InterviewBefore_BravoTrainerPkmnProfile();
+ sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1)
+ {
+ DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, 24);
+ show->bravoTrainer.move = a0;
+ show->bravoTrainer.kind = TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE;
+ }
+}
+
+void BravoTrainerPokemonProfile_BeforeInterview2(u8 a0)
+{
+ TVShow *show;
+
+ show = &gSaveBlock1Ptr->tvShows[24];
+ sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1)
+ {
+ show->bravoTrainer.contestResult = a0;
+ show->bravoTrainer.contestCategory = gScriptContestCategory;
+ show->bravoTrainer.contestRank = gUnknown_02039F2E;
+ show->bravoTrainer.species = GetMonData(&gPlayerParty[gUnknown_02039F24], MON_DATA_SPECIES, NULL);
+ GetMonData(&gPlayerParty[gUnknown_02039F24], MON_DATA_NICKNAME, show->bravoTrainer.pokemonNickname);
+ StripExtCtrlCodes(show->bravoTrainer.pokemonNickname);
+ show->bravoTrainer.pokemonNameLanguage = GetMonData(&gPlayerParty[gUnknown_02039F24], MON_DATA_LANGUAGE);
+ }
+}
+
+void InterviewAfter_BravoTrainerBattleTowerProfile(void)
+{
+ TVShow *show;
+
+ show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ show->bravoTrainerTower.kind = TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE;
+ show->bravoTrainerTower.active = TRUE;
+ StringCopy(show->bravoTrainerTower.trainerName, gSaveBlock2Ptr->playerName);
+ StringCopy(show->bravoTrainerTower.pokemonName, gSaveBlock2Ptr->field_BD8);
+ show->bravoTrainerTower.species = gSaveBlock2Ptr->field_BD4;
+ show->bravoTrainerTower.defeatedSpecies = gSaveBlock2Ptr->field_BD6;
+ show->bravoTrainerTower.numFights = sub_8164FCC(gSaveBlock2Ptr->field_D07, 0);
+ show->bravoTrainerTower.wonTheChallenge = gSaveBlock2Ptr->field_D06;
+ if (gSaveBlock2Ptr->field_D07 == 0)
+ {
+ show->bravoTrainerTower.btLevel = 50;
+ }
+ else
+ {
+ show->bravoTrainerTower.btLevel = 100;
+ }
+ show->bravoTrainerTower.interviewResponse = gSpecialVar_0x8004;
+ tv_store_id_2x(show);
+ show->bravoTrainerTower.language = gGameLanguage;
+ if (show->bravoTrainerTower.language == LANGUAGE_JAPANESE || gSaveBlock2Ptr->field_BEB == LANGUAGE_JAPANESE)
+ {
+ show->bravoTrainerTower.pokemonNameLanguage = LANGUAGE_JAPANESE;
+ }
+ else
+ {
+ show->bravoTrainerTower.pokemonNameLanguage = gSaveBlock2Ptr->field_BEB;
+ }
+}
+
+void SaveRecordedItemPurchasesForTVShow(void)
+{
+ TVShow *show;
+ u8 i;
+
+ if (!(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP_TRAINER_HILL_LOBBY && gSaveBlock1Ptr->location.mapNum == MAP_ID_TRAINER_HILL_LOBBY) && !(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP_BATTLE_FRONTIER_MART && gSaveBlock1Ptr->location.mapNum == MAP_ID_BATTLE_FRONTIER_MART) && !rbernoulli(1, 3))
+ {
+ sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_SMART_SHOPPER, FALSE) != TRUE)
+ {
+ TV_SortPurchasesByQuantity();
+ if (gUnknown_02039F80[0].quantity >= 20)
+ {
+ show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ show->smartshopperShow.kind = TVSHOW_SMART_SHOPPER;
+ show->smartshopperShow.active = FALSE;
+ show->smartshopperShow.shopLocation = gMapHeader.regionMapSectionId;
+ for (i = 0; i < 3; i ++)
+ {
+ show->smartshopperShow.itemIds[i] = gUnknown_02039F80[i].itemId;
+ show->smartshopperShow.itemAmounts[i] = gUnknown_02039F80[i].quantity;
+ }
+ show->smartshopperShow.priceReduced = GetPriceReduction(1);
+ StringCopy(show->smartshopperShow.playerName, gSaveBlock2Ptr->playerName);
+ tv_store_id_3x(show);
+ show->smartshopperShow.language = gGameLanguage;
+ }
+ }
+ }
+}
+
+void PutNameRaterShowOnTheAir(void)
+{
+ TVShow *show;
+
+ InterviewBefore_NameRater();
+ if (gScriptResult != 1)
+ {
+ GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar1);
+ if (StringLength(gSaveBlock2Ptr->playerName) > 1 && StringLength(gStringVar1) > 1)
+ {
+ show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ show->nameRaterShow.kind = TVSHOW_NAME_RATER_SHOW;
+ show->nameRaterShow.active = TRUE;
+ show->nameRaterShow.species = GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_SPECIES, NULL);
+ show->nameRaterShow.random = Random() % 3;
+ show->nameRaterShow.random2 = Random() % 2;
+ show->nameRaterShow.randomSpecies = TV_GetSomeOtherSpeciesAlreadySeenByPlayer(show->nameRaterShow.species);
+ StringCopy(show->nameRaterShow.trainerName, gSaveBlock2Ptr->playerName);
+ GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, show->nameRaterShow.pokemonName);
+ StripExtCtrlCodes(show->nameRaterShow.pokemonName);
+ tv_store_id_2x(show);
+ show->nameRaterShow.language = gGameLanguage;
+ show->nameRaterShow.pokemonNameLanguage = GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_LANGUAGE);
+ }
+ }
+}
+
+void StartMassOutbreak(void)
+{
+ TVShow *show;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gSaveBlock1Ptr->outbreakPokemonSpecies = show->massOutbreak.species;
+ gSaveBlock1Ptr->outbreakLocationMapNum = show->massOutbreak.locationMapNum;
+ gSaveBlock1Ptr->outbreakLocationMapGroup = show->massOutbreak.locationMapGroup;
+ gSaveBlock1Ptr->outbreakPokemonLevel = show->massOutbreak.level;
+ gSaveBlock1Ptr->outbreakUnk1 = show->massOutbreak.var02;
+ gSaveBlock1Ptr->outbreakUnk2 = show->massOutbreak.var0E;
+ gSaveBlock1Ptr->outbreakPokemonMoves[0] = show->massOutbreak.moves[0];
+ gSaveBlock1Ptr->outbreakPokemonMoves[1] = show->massOutbreak.moves[1];
+ gSaveBlock1Ptr->outbreakPokemonMoves[2] = show->massOutbreak.moves[2];
+ gSaveBlock1Ptr->outbreakPokemonMoves[3] = show->massOutbreak.moves[3];
+ gSaveBlock1Ptr->outbreakUnk4 = show->massOutbreak.var03;
+ gSaveBlock1Ptr->outbreakPokemonProbability = show->massOutbreak.probability;
+ gSaveBlock1Ptr->outbreakDaysLeft = 2;
+}
+
+void PutLilycoveContestLadyShowOnTheAir(void)
+{
+ TVShow *show;
+
+ sub_80EFA88();
+ if (gScriptResult != TRUE)
+ {
+ show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ sub_818E848(&show->contestLiveUpdates2.language);
+ show->contestLiveUpdates2.pokemonNameLanguage = LANGUAGE_ENGLISH;
+ show->contestLiveUpdates2.kind = TVSHOW_CONTEST_LIVE_UPDATES_2;
+ show->contestLiveUpdates2.active = TRUE;
+ sub_818E81C(show->contestLiveUpdates2.playerName);
+ sub_818E7E0(&show->contestLiveUpdates2.contestCategory, show->contestLiveUpdates2.nickname);
+ show->contestLiveUpdates2.pokeblockState = sub_818E880();
+ tv_store_id_2x(show);
+ }
+}
+
+void InterviewAfter_FanClubLetter(void)
+{
+ TVShow *show;
+
+ show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ show->fanclubLetter.kind = TVSHOW_FAN_CLUB_LETTER;
+ show->fanclubLetter.active = TRUE;
+ StringCopy(show->fanclubLetter.playerName, gSaveBlock2Ptr->playerName);
+ show->fanclubLetter.species = GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL);
+ tv_store_id_2x(show);
+ show->fanclubLetter.language = gGameLanguage;
+}
+
+void InterviewAfter_RecentHappenings(void)
+{
+ TVShow *show;
+
+ show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ show->recentHappenings.kind = TVSHOW_RECENT_HAPPENINGS;
+ show->recentHappenings.active = TRUE;
+ StringCopy(show->recentHappenings.playerName, gSaveBlock2Ptr->playerName);
+ show->recentHappenings.var02 = 0;
+ tv_store_id_2x(show);
+ show->recentHappenings.language = gGameLanguage;
+}
+
+void InterviewAfter_PkmnFanClubOpinions(void)
+{
+ TVShow *show;
+
+ show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ show->fanclubOpinions.kind = TVSHOW_PKMN_FAN_CLUB_OPINIONS;
+ show->fanclubOpinions.active = TRUE;
+ show->fanclubOpinions.friendshipHighNybble = GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_FRIENDSHIP, NULL) >> 4;
+ show->fanclubOpinions.questionAsked = gSpecialVar_0x8007;
+ StringCopy(show->fanclubOpinions.playerName, gSaveBlock2Ptr->playerName);
+ GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_NICKNAME, show->fanclubOpinions.nickname);
+ StripExtCtrlCodes(show->fanclubOpinions.nickname);
+ show->fanclubOpinions.species = GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL);
+ tv_store_id_2x(show);
+ show->fanclubOpinions.language = gGameLanguage;
+ if (gGameLanguage == LANGUAGE_JAPANESE || GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_LANGUAGE) == LANGUAGE_JAPANESE)
+ {
+ show->fanclubOpinions.pokemonNameLanguage = LANGUAGE_JAPANESE;
+ }
+ else
+ {
+ show->fanclubOpinions.pokemonNameLanguage = GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_LANGUAGE);
+ }
+}
+
+void InterviewAfter_DummyShow4()
+{
+ TVShow *show;
+
+ show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+}
+
+void sub_80ED718(void)
+{
+ u8 i;
+ u16 outbreakIdx;
+ TVShow *show;
+
+ if (FlagGet(SYS_GAME_CLEAR))
+ {
+ for (i = 0; i < 24; i ++)
+ {
+ if (gSaveBlock1Ptr->tvShows[i].common.kind == TVSHOW_MASS_OUTBREAK)
+ {
+ return;
+ }
+ }
+ if (!rbernoulli(1, 200))
+ {
+ sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1)
+ {
+ outbreakIdx = Random() % ARRAY_COUNT(sPokeOutbreakSpeciesList);
+ show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ show->massOutbreak.kind = TVSHOW_MASS_OUTBREAK;
+ show->massOutbreak.active = TRUE;
+ show->massOutbreak.level = sPokeOutbreakSpeciesList[outbreakIdx].level;
+ show->massOutbreak.var02 = 0;
+ show->massOutbreak.var03 = 0;
+ show->massOutbreak.species = sPokeOutbreakSpeciesList[outbreakIdx].species;
+ show->massOutbreak.var0E = 0;
+ show->massOutbreak.moves[0] = sPokeOutbreakSpeciesList[outbreakIdx].moves[0];
+ show->massOutbreak.moves[1] = sPokeOutbreakSpeciesList[outbreakIdx].moves[1];
+ show->massOutbreak.moves[2] = sPokeOutbreakSpeciesList[outbreakIdx].moves[2];
+ show->massOutbreak.moves[3] = sPokeOutbreakSpeciesList[outbreakIdx].moves[3];
+ show->massOutbreak.locationMapNum = sPokeOutbreakSpeciesList[outbreakIdx].location;
+ show->massOutbreak.locationMapGroup = 0;
+ show->massOutbreak.var12 = 0;
+ show->massOutbreak.probability = 50;
+ show->massOutbreak.var15 = 0;
+ show->massOutbreak.daysLeft = 1;
+ tv_store_id_2x(show);
+ show->massOutbreak.language = gGameLanguage;
+ }
+ }
+ }
+}
+
+void EndMassOutbreak(void)
+{
+ gSaveBlock1Ptr->outbreakPokemonSpecies = SPECIES_NONE;
+ gSaveBlock1Ptr->outbreakLocationMapNum = 0;
+ gSaveBlock1Ptr->outbreakLocationMapGroup = 0;
+ gSaveBlock1Ptr->outbreakPokemonLevel = 0;
+ gSaveBlock1Ptr->outbreakUnk1 = 0;
+ gSaveBlock1Ptr->outbreakUnk2 = 0;
+ gSaveBlock1Ptr->outbreakPokemonMoves[0] = MOVE_NONE;
+ gSaveBlock1Ptr->outbreakPokemonMoves[1] = MOVE_NONE;
+ gSaveBlock1Ptr->outbreakPokemonMoves[2] = MOVE_NONE;
+ gSaveBlock1Ptr->outbreakPokemonMoves[3] = MOVE_NONE;
+ gSaveBlock1Ptr->outbreakUnk4 = 0;
+ gSaveBlock1Ptr->outbreakPokemonProbability = 0;
+ gSaveBlock1Ptr->outbreakDaysLeft = 0;
+}
+
+void sub_80ED888(u16 days)
+{
+
+ sub_80ED8B4(days);
+ UpdateMassOutbreakTimeLeft(days);
+ sub_80EF120(days);
+ sub_80EDA48(days);
+ sub_80EEB98(days);
+}
+
+void sub_80ED8B4(u16 days)
+{
+ u8 i;
+ TVShow *show;
+
+ if (gSaveBlock1Ptr->outbreakPokemonSpecies == SPECIES_NONE)
+ {
+ for (i = 0; i < 24; i ++)
+ {
+ if (gSaveBlock1Ptr->tvShows[i].massOutbreak.kind == TVSHOW_MASS_OUTBREAK && gSaveBlock1Ptr->tvShows[i].massOutbreak.active == TRUE)
+ {
+ show = &gSaveBlock1Ptr->tvShows[i];
+ if (show->massOutbreak.daysLeft < days)
+ {
+ show->massOutbreak.daysLeft = 0;
+ }
+ else
+ {
+ show->massOutbreak.daysLeft -= days;
+ }
+ break;
+ }
+ }
+ }
+}
+
+void UpdateMassOutbreakTimeLeft(u16 days)
+{
+ if (gSaveBlock1Ptr->outbreakDaysLeft <= days)
+ {
+ EndMassOutbreak();
+ }
+ else
+ {
+ gSaveBlock1Ptr->outbreakDaysLeft -= days;
+ }
+}
+
+void sub_80ED950(bool8 flag)
+{
+ if (flag)
+ {
+ if (sPokemonAnglerAttemptCounters >> 8 > 4)
+ {
+ PutFishingAdviceShowOnTheAir();
+ }
+ sPokemonAnglerAttemptCounters &= 0xFF;
+ if (sPokemonAnglerAttemptCounters != 0xFF)
+ {
+ sPokemonAnglerAttemptCounters += 0x01;
+ }
+ }
+ else
+ {
+ if ((u8)sPokemonAnglerAttemptCounters > 4)
+ {
+ PutFishingAdviceShowOnTheAir();
+ }
+ sPokemonAnglerAttemptCounters &= 0xFF00;
+ if (sPokemonAnglerAttemptCounters >> 8 != 0xFF)
+ {
+ sPokemonAnglerAttemptCounters += 0x0100;
+ }
+ }
+}
+
+void PutFishingAdviceShowOnTheAir(void)
+{
+ TVShow *show;
+
+ sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_FISHING_ADVICE, FALSE) != TRUE)
+ {
+ show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ show->pokemonAngler.kind = TVSHOW_FISHING_ADVICE;
+ show->pokemonAngler.active = FALSE;
+ show->pokemonAngler.nBites = sPokemonAnglerAttemptCounters;
+ show->pokemonAngler.nFails = sPokemonAnglerAttemptCounters >> 8;
+ show->pokemonAngler.species = sPokemonAnglerSpecies;
+ StringCopy(show->pokemonAngler.playerName, gSaveBlock2Ptr->playerName);
+ tv_store_id_3x(show);
+ show->pokemonAngler.language = gGameLanguage;
+ }
+}
+
+void sub_80EDA3C(u16 species)
+{
+ sPokemonAnglerSpecies = species;
+}
+
+void sub_80EDA48(u16 days)
+{
+ TVShow *show;
+
+ show = &gSaveBlock1Ptr->tvShows[24];
+ if (show->worldOfMasters.kind == TVSHOW_WORLD_OF_MASTERS)
+ {
+ if (show->worldOfMasters.numPokeCaught >= 20)
+ {
+ sub_80EDA80();
+ }
+ DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, 24);
+ }
+}
+
+void sub_80EDA80(void)
+{
+ TVShow *show;
+ TVShow *show2;
+
+ show = &gSaveBlock1Ptr->tvShows[24];
+ if (!rbernoulli(1, 1))
+ {
+ sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_WORLD_OF_MASTERS, FALSE) != TRUE)
+ {
+ show2 = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ show2->worldOfMasters.kind = TVSHOW_WORLD_OF_MASTERS;
+ show2->worldOfMasters.active = FALSE;
+ show2->worldOfMasters.numPokeCaught = show->worldOfMasters.numPokeCaught;
+ show2->worldOfMasters.steps = GetGameStat(GAME_STAT_STEPS) - show->worldOfMasters.steps;
+ show2->worldOfMasters.caughtPoke = show->worldOfMasters.caughtPoke;
+ show2->worldOfMasters.species = show->worldOfMasters.species;
+ show2->worldOfMasters.location = show->worldOfMasters.location;
+ StringCopy(show2->worldOfMasters.playerName, gSaveBlock2Ptr->playerName);
+ tv_store_id_3x(show2);
+ show2->worldOfMasters.language = gGameLanguage;
+ DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, 24);
+ }
+ }
+}
+
+void sub_80EDB44(void)
+{
+ TVShow *show;
+ u32 i;
+ u8 nBadges;
+
+ HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_TODAYS_RIVAL_TRAINER, TRUE);
+ sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1)
+ {
+ show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ show->rivalTrainer.kind = TVSHOW_TODAYS_RIVAL_TRAINER;
+ show->rivalTrainer.active = FALSE;
+ for (i = BADGE01_GET, nBadges = 0; i < BADGE01_GET + 8; i ++)
+ {
+ if (FlagGet(i))
+ {
+ nBadges ++;
+ }
+ }
+ show->rivalTrainer.badgeCount = nBadges;
+ if (IsNationalPokedexEnabled())
+ {
+ show->rivalTrainer.dexCount = pokedex_count(0x01);
+ }
+ else
+ {
+ show->rivalTrainer.dexCount = sub_80C0844(0x01);
+ }
+ show->rivalTrainer.location = gMapHeader.regionMapSectionId;
+ show->rivalTrainer.mapDataId = gMapHeader.mapDataId;
+ show->rivalTrainer.nSilverSymbols = 0;
+ show->rivalTrainer.nGoldSymbols = 0;
+ for (i = 0; i < 7; i ++)
+ {
+ if (FlagGet(sSilverSymbolFlags[i]) == TRUE)
+ {
+ show->rivalTrainer.nSilverSymbols ++;
+ }
+ if (FlagGet(sGoldSymbolFlags[i]) == TRUE)
+ {
+ show->rivalTrainer.nGoldSymbols ++;
+ }
+ }
+ show->rivalTrainer.battlePoints = gSaveBlock2Ptr->frontierBattlePoints;
+ StringCopy(show->rivalTrainer.playerName, gSaveBlock2Ptr->playerName);
+ tv_store_id_3x(show);
+ show->rivalTrainer.language = gGameLanguage;
+ }
+}
+
+void sub_80EDC60(const u16 *words)
+{
+ TVShow *show;
+
+ sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_TREND_WATCHER, FALSE) != TRUE)
+ {
+ show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ show->trendWatcher.kind = TVSHOW_TREND_WATCHER;
+ show->trendWatcher.active = FALSE;
+ show->trendWatcher.gender = gSaveBlock2Ptr->playerGender;
+ show->trendWatcher.words[0] = words[0];
+ show->trendWatcher.words[1] = words[1];
+ StringCopy(show->trendWatcher.playerName, gSaveBlock2Ptr->playerName);
+ tv_store_id_3x(show);
+ show->trendWatcher.language = gGameLanguage;
+ }
+}
+
+void sub_80EDCE8(void)
+{
+ TVShow *show;
+
+ sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_TREASURE_INVESTIGATORS, FALSE) != TRUE)
+ {
+ show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ show->treasureInvestigators.kind = TVSHOW_TREASURE_INVESTIGATORS;
+ show->treasureInvestigators.active = FALSE;
+ show->treasureInvestigators.item = gSpecialVar_0x8005;
+ show->treasureInvestigators.location = gMapHeader.regionMapSectionId;
+ show->treasureInvestigators.mapDataId = gMapHeader.mapDataId;
+ StringCopy(show->treasureInvestigators.playerName, gSaveBlock2Ptr->playerName);
+ tv_store_id_3x(show);
+ show->treasureInvestigators.language = gGameLanguage;
+ }
+}
+
+void sub_80EDD78(u16 nCoinsPaidOut)
+{
+ TVShow *show;
+ bool8 flag;
+ u16 nCoinsWon;
+
+ sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_FIND_THAT_GAMER, FALSE) != TRUE)
+ {
+ flag = FALSE;
+ switch (sFindThatGamerWhichGame)
+ {
+ case FALSE:
+ if (nCoinsPaidOut >= sFindThatGamerCoinsSpent + 200)
+ {
+ flag = TRUE;
+ nCoinsWon = nCoinsPaidOut - sFindThatGamerCoinsSpent;
+ break;
+ }
+ if (sFindThatGamerCoinsSpent >= 100 && nCoinsPaidOut <= sFindThatGamerCoinsSpent - 100)
+ {
+ nCoinsWon = sFindThatGamerCoinsSpent - nCoinsPaidOut;
+ break;
+ }
+ return;
+ case TRUE:
+ if (nCoinsPaidOut >= sFindThatGamerCoinsSpent + 50)
+ {
+ flag = TRUE;
+ nCoinsWon = nCoinsPaidOut - sFindThatGamerCoinsSpent;
+ break;
+ }
+ if (sFindThatGamerCoinsSpent >= 50 && nCoinsPaidOut <= sFindThatGamerCoinsSpent - 50)
+ {
+ nCoinsWon = sFindThatGamerCoinsSpent - nCoinsPaidOut;
+ break;
+ }
+ return;
+ default:
+ return;
+ }
+ show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ show->findThatGamer.kind = TVSHOW_FIND_THAT_GAMER;
+ show->findThatGamer.active = FALSE;
+ show->findThatGamer.nCoins = nCoinsWon;
+ show->findThatGamer.whichGame = sFindThatGamerWhichGame;
+ show->findThatGamer.won = flag;
+ StringCopy(show->findThatGamer.playerName, gSaveBlock2Ptr->playerName);
+ tv_store_id_3x(show);
+ show->findThatGamer.language = gGameLanguage;
+ }
+}
+
+void sub_80EDE70(u16 nCoinsSpent)
+{
+ sFindThatGamerWhichGame = FALSE;
+ sFindThatGamerCoinsSpent = nCoinsSpent;
+}
+
+void sub_80EDE84(u16 nCoinsSpent)
+{
+ sFindThatGamerWhichGame = TRUE;
+ sFindThatGamerCoinsSpent = nCoinsSpent;
+}
+
+#ifdef NONMATCHING // FIXME: Register allocation shenanigans
+void sub_80EDE98(TVShow *show)
+{
+ u8 i;
+ u8 j;
+ u16 k;
+ u8 n;
+ u8 deco;
+ u8 x;
+
+ for (i = 0; i < 16; i ++)
+ {
+ sTV_DecorationsBuffer[i] = 0;
+ }
+ for (i = 0, n = 0; i < 16; i ++)
+ {
+ deco = gSaveBlock1Ptr->secretBases[0].decorations[i];
+ if (deco)
+ {
+ for (j = 0; j < 16; j ++)
+ {
+ if (sTV_DecorationsBuffer[j] == 0)
+ {
+ sTV_DecorationsBuffer[j] = deco;
+ n ++;
+ break;
+ }
+ if (sTV_DecorationsBuffer[j] == deco)
+ {
+ break;
+ }
+ }
+ }
+ }
+ if (n > 4)
+ {
+ show->secretBaseVisit.nDecorations = 4;
+ }
+ else
+ {
+ show->secretBaseVisit.nDecorations = n;
+ }
+ switch (show->secretBaseVisit.nDecorations)
+ {
+ case 0:
+ break;
+ case 1:
+ show->secretBaseVisit.decorations[0] = sTV_DecorationsBuffer[0];
+ break;
+ default:
+ for (k = 0; k < n * n; k ++)
+ {
+ i = Random() % n;
+ j = Random() % n;
+ x = sTV_DecorationsBuffer[i];
+ sTV_DecorationsBuffer[i] = sTV_DecorationsBuffer[j];
+ sTV_DecorationsBuffer[j] = x;
+ }
+ for (i = 0; i < show->secretBaseVisit.nDecorations; i ++)
+ {
+ show->secretBaseVisit.decorations[i] = sTV_DecorationsBuffer[i];
+ }
+ break;
+ }
+}
+#else
+__attribute__((naked))
+void sub_80EDE98(TVShow *show)
+{
+ asm_unified("\tpush {r4-r7,lr}\n"
+ "\tmov r7, r9\n"
+ "\tmov r6, r8\n"
+ "\tpush {r6,r7}\n"
+ "\tmov r8, r0\n"
+ "\tmovs r3, 0\n"
+ "\tldr r6, =sTV_DecorationsBuffer\n"
+ "\tldr r7, =gSaveBlock1Ptr\n"
+ "\tadds r2, r6, 0\n"
+ "\tmovs r1, 0\n"
+ "_080EDEAC:\n"
+ "\tadds r0, r3, r2\n"
+ "\tstrb r1, [r0]\n"
+ "\tadds r0, r3, 0x1\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r3, r0, 24\n"
+ "\tcmp r3, 0xF\n"
+ "\tbls _080EDEAC\n"
+ "\tmovs r3, 0\n"
+ "\tmovs r5, 0\n"
+ "_080EDEBE:\n"
+ "\tldr r0, [r7]\n"
+ "\tldr r1, =0x00001aae\n"
+ "\tadds r0, r1\n"
+ "\tadds r0, r3\n"
+ "\tldrb r4, [r0]\n"
+ "\tadds r3, 0x1\n"
+ "\tcmp r4, 0\n"
+ "\tbeq _080EDF0A\n"
+ "\tmovs r1, 0\n"
+ "\tldrb r0, [r6]\n"
+ "\tcmp r0, 0\n"
+ "\tbne _080EDEE8\n"
+ "\tstrb r4, [r6]\n"
+ "\tb _080EDF04\n"
+ "\t.pool\n"
+ "_080EDEE8:\n"
+ "\tadds r0, r1, r6\n"
+ "\tldrb r0, [r0]\n"
+ "\tcmp r0, r4\n"
+ "\tbeq _080EDF0A\n"
+ "\tadds r0, r1, 0x1\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r1, r0, 24\n"
+ "\tcmp r1, 0xF\n"
+ "\tbhi _080EDF0A\n"
+ "\tadds r2, r1, r6\n"
+ "\tldrb r0, [r2]\n"
+ "\tcmp r0, 0\n"
+ "\tbne _080EDEE8\n"
+ "\tstrb r4, [r2]\n"
+ "_080EDF04:\n"
+ "\tadds r0, r5, 0x1\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r5, r0, 24\n"
+ "_080EDF0A:\n"
+ "\tlsls r0, r3, 24\n"
+ "\tlsrs r3, r0, 24\n"
+ "\tcmp r3, 0xF\n"
+ "\tbls _080EDEBE\n"
+ "\tcmp r5, 0x4\n"
+ "\tbls _080EDF1E\n"
+ "\tmovs r0, 0x4\n"
+ "\tmov r1, r8\n"
+ "\tstrb r0, [r1, 0x3]\n"
+ "\tb _080EDF22\n"
+ "_080EDF1E:\n"
+ "\tmov r0, r8\n"
+ "\tstrb r5, [r0, 0x3]\n"
+ "_080EDF22:\n"
+ "\tmov r1, r8\n"
+ "\tldrb r0, [r1, 0x3]\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _080EDFA4\n"
+ "\tcmp r0, 0x1\n"
+ "\tbne _080EDF34\n"
+ "\tldrb r0, [r6]\n"
+ "\tstrb r0, [r1, 0x4]\n"
+ "\tb _080EDFA4\n"
+ "_080EDF34:\n"
+ "\tmovs r6, 0\n"
+ "\tadds r7, r5, 0\n"
+ "\tmuls r7, r5\n"
+ "\tcmp r6, r7\n"
+ "\tbge _080EDF7E\n"
+ "\tldr r0, =sTV_DecorationsBuffer\n"
+ "\tmov r9, r0\n"
+ "_080EDF42:\n"
+ "\tbl Random\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tadds r1, r5, 0\n"
+ "\tbl __modsi3\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r4, r0, 24\n"
+ "\tbl Random\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tadds r1, r5, 0\n"
+ "\tbl __modsi3\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r1, r0, 24\n"
+ "\tmov r0, r9\n"
+ "\tadds r2, r4, r0\n"
+ "\tldrb r3, [r2]\n"
+ "\tadd r1, r9\n"
+ "\tldrb r0, [r1]\n"
+ "\tstrb r0, [r2]\n"
+ "\tstrb r3, [r1]\n"
+ "\tadds r0, r6, 0x1\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r6, r0, 16\n"
+ "\tcmp r6, r7\n"
+ "\tblt _080EDF42\n"
+ "_080EDF7E:\n"
+ "\tmovs r3, 0\n"
+ "\tmov r1, r8\n"
+ "\tldrb r1, [r1, 0x3]\n"
+ "\tcmp r3, r1\n"
+ "\tbcs _080EDFA4\n"
+ "\tmov r2, r8\n"
+ "\tadds r2, 0x4\n"
+ "\tldr r4, =sTV_DecorationsBuffer\n"
+ "_080EDF8E:\n"
+ "\tadds r1, r2, r3\n"
+ "\tadds r0, r3, r4\n"
+ "\tldrb r0, [r0]\n"
+ "\tstrb r0, [r1]\n"
+ "\tadds r0, r3, 0x1\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r3, r0, 24\n"
+ "\tmov r0, r8\n"
+ "\tldrb r0, [r0, 0x3]\n"
+ "\tcmp r3, r0\n"
+ "\tbcc _080EDF8E\n"
+ "_080EDFA4:\n"
+ "\tpop {r3,r4}\n"
+ "\tmov r8, r3\n"
+ "\tmov r9, r4\n"
+ "\tpop {r4-r7}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.pool");
+}
+#endif
+
+void sub_80EDFB4(TVShow *show)
+{
+ u8 i;
+ u16 move;
+ u16 j;
+ u8 nMoves;
+ u8 nPokemon;
+ u16 sum;
+
+ for (i = 0, nPokemon = 0; i < PARTY_SIZE; i ++)
+ {
+ if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != SPECIES_NONE && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG))
+ {
+ sTV_SecretBaseVisitMonsTemp[nPokemon].level = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL);
+ sTV_SecretBaseVisitMonsTemp[nPokemon].species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES);
+ nMoves = 0;
+ move = GetMonData(&gPlayerParty[i], MON_DATA_MOVE1);
+ if (move != MOVE_NONE)
+ {
+ sTV_SecretBaseVisitMovesTemp[nMoves] = move;
+ nMoves ++;
+ }
+ move = GetMonData(&gPlayerParty[i], MON_DATA_MOVE2);
+ if (move != MOVE_NONE)
+ {
+ sTV_SecretBaseVisitMovesTemp[nMoves] = move;
+ nMoves ++;
+ }
+ move = GetMonData(&gPlayerParty[i], MON_DATA_MOVE3);
+ if (move != MOVE_NONE)
+ {
+ sTV_SecretBaseVisitMovesTemp[nMoves] = move;
+ nMoves ++;
+ }
+ move = GetMonData(&gPlayerParty[i], MON_DATA_MOVE4);
+ if (move != MOVE_NONE)
+ {
+ sTV_SecretBaseVisitMovesTemp[nMoves] = move;
+ nMoves ++;
+ }
+ sTV_SecretBaseVisitMonsTemp[nPokemon].move = sTV_SecretBaseVisitMovesTemp[Random() % nMoves];
+ nPokemon ++;
+ }
+ }
+ for (i = 0, sum = 0; i < nPokemon; i ++)
+ {
+ sum += sTV_SecretBaseVisitMonsTemp[i].level;
+ }
+ show->secretBaseVisit.avgLevel = sum / nPokemon;
+ j = Random() % nPokemon;
+ show->secretBaseVisit.species = sTV_SecretBaseVisitMonsTemp[j].species;
+ show->secretBaseVisit.move = sTV_SecretBaseVisitMonsTemp[j].move;
+}
+
+void sub_80EE104(void)
+{
+ TVShow *show;
+
+ HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_SECRET_BASE_VISIT, TRUE);
+ sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1)
+ {
+ show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ show->secretBaseVisit.kind = TVSHOW_SECRET_BASE_VISIT;
+ show->secretBaseVisit.active = FALSE;
+ StringCopy(show->secretBaseVisit.playerName, gSaveBlock2Ptr->playerName);
+ sub_80EDE98(show);
+ sub_80EDFB4(show);
+ tv_store_id_3x(show);
+ show->secretBaseVisit.language = gGameLanguage;
+ }
+}
+
+void sub_80EE184(void)
+{
+ TVShow *show;
+ u8 i;
+ u16 balls;
+
+ sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_BREAKING_NEWS, FALSE) != TRUE)
+ {
+ show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ show->breakingNews.kind = TVSHOW_BREAKING_NEWS;
+ show->breakingNews.active = FALSE;
+ balls = 0;
+ for (i = 0; i < 11; i ++)
+ {
+ balls += gBattleResults.catchAttempts[i];
+ }
+ if (gBattleResults.usedMasterBall)
+ {
+ balls ++;
+ }
+ show->breakingNews.location = gMapHeader.regionMapSectionId;
+ StringCopy(show->breakingNews.playerName, gSaveBlock2Ptr->playerName);
+ show->breakingNews.poke1Species = gBattleResults.playerMon1Species;
+ switch (gBattleOutcome)
+ {
+ case BATTLE_LOST:
+ case BATTLE_DREW:
+ show->breakingNews.kind = TVSHOW_OFF_AIR;
+ return;
+ case BATTLE_CAUGHT:
+ show->breakingNews.outcome = 0;
+ break;
+ case BATTLE_WON:
+ show->breakingNews.outcome = 1;
+ break;
+ case BATTLE_RAN:
+ case BATTLE_PLAYER_TELEPORTED:
+ case BATTLE_SAFARI_OUT_OF_BALLS:
+ show->breakingNews.outcome = 2;
+ break;
+ case BATTLE_POKE_FLED:
+ case BATTLE_OPPONENT_TELEPORTED:
+ show->breakingNews.outcome = 3;
+ break;
+ }
+ show->breakingNews.lastOpponentSpecies = gBattleResults.lastOpponentSpecies;
+ switch (show->breakingNews.outcome)
+ {
+ case 0:
+ if (gBattleResults.usedMasterBall)
+ {
+ show->breakingNews.caughtMonBall = ITEM_MASTER_BALL;
+ }
+ else
+ {
+ show->breakingNews.caughtMonBall = gBattleResults.caughtMonBall;
+ }
+ show->breakingNews.balls = balls;
+ break;
+ case 1:
+ show->breakingNews.lastUsedMove = gBattleResults.lastUsedMovePlayer;
+ break;
+ case 2:
+ break;
+ case 3:
+ break;
+ }
+ tv_store_id_3x(show);
+ show->breakingNews.language = gGameLanguage;
+ }
+}
+
+void sub_80EE2CC(void)
+{
+ TVShow *show;
+
+ sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_LOTTO_WINNER, FALSE) != TRUE)
+ {
+ show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ show->lottoWinner.kind = TVSHOW_LOTTO_WINNER;
+ show->lottoWinner.active = FALSE;
+ StringCopy(show->lottoWinner.playerName, gSaveBlock2Ptr->playerName);
+ show->lottoWinner.whichPrize = 4 - gSpecialVar_0x8004;
+ show->lottoWinner.item = gSpecialVar_0x8005;
+ tv_store_id_3x(show);
+ show->lottoWinner.language = gGameLanguage;
+ }
+}
+
+void sub_80EE35C(u16 foeSpecies, u16 species, u8 moveIdx, const u16 *movePtr, u16 betterMove)
+{
+ TVShow *show;
+ u8 i;
+ u8 j;
+
+ sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_BATTLE_SEMINAR, FALSE) != TRUE)
+ {
+ show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ show->battleSeminar.kind = TVSHOW_BATTLE_SEMINAR;
+ show->battleSeminar.active = FALSE;
+ StringCopy(show->battleSeminar.playerName, gSaveBlock2Ptr->playerName);
+ show->battleSeminar.foeSpecies = foeSpecies;
+ show->battleSeminar.species = species;
+ show->battleSeminar.move = movePtr[moveIdx];
+ for (i = 0, j = 0; i < 4; i ++)
+ {
+ if (i != moveIdx && movePtr[i])
+ {
+ show->battleSeminar.otherMoves[j] = movePtr[i];
+ j ++;
+ }
+ }
+ show->battleSeminar.nOtherMoves = j;
+ show->battleSeminar.betterMove = betterMove;
+ tv_store_id_3x(show);
+ show->battleSeminar.language = gGameLanguage;
+ }
+}
+
+void sub_80EE44C(u8 nMonsCaught, u8 nPkblkUsed)
+{
+ TVShow *show;
+
+ sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_SAFARI_FAN_CLUB, FALSE) != TRUE)
+ {
+ show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ show->safariFanClub.kind = TVSHOW_SAFARI_FAN_CLUB;
+ show->safariFanClub.active = FALSE;
+ StringCopy(show->safariFanClub.playerName, gSaveBlock2Ptr->playerName);
+ show->safariFanClub.nMonsCaught = nMonsCaught;
+ show->safariFanClub.nPkblkUsed = nPkblkUsed;
+ tv_store_id_3x(show);
+ show->safariFanClub.language = gGameLanguage;
+ }
+}
+
+void sub_80EE4DC(struct Pokemon *pokemon, u8 ribbonMonDataIdx)
+{
+ TVShow *show;
+
+ sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_CUTIES, FALSE) != TRUE)
+ {
+ show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ show->cuties.kind = TVSHOW_CUTIES;
+ show->cuties.active = FALSE;
+ StringCopy(show->cuties.playerName, gSaveBlock2Ptr->playerName);
+ GetMonData(pokemon, MON_DATA_NICKNAME, show->cuties.nickname);
+ StripExtCtrlCodes(show->cuties.nickname);
+ show->cuties.nRibbons = GetRibbonCount(pokemon);
+ show->cuties.selectedRibbon = TV_MonDataIdxToRibbon(ribbonMonDataIdx);
+ tv_store_id_3x(show);
+ show->cuties.language = gGameLanguage;
+ if (show->cuties.language == LANGUAGE_JAPANESE || GetMonData(pokemon, MON_DATA_LANGUAGE) == LANGUAGE_JAPANESE)
+ {
+ show->cuties.pokemonNameLanguage = LANGUAGE_JAPANESE;
+ }
+ else
+ {
+ show->cuties.pokemonNameLanguage = GetMonData(pokemon, MON_DATA_LANGUAGE);
+ }
+ }
+}
+
+u8 GetRibbonCount(struct Pokemon *pokemon)
+{
+ u8 nRibbons;
+
+ nRibbons = 0;
+ nRibbons += GetMonData(pokemon, MON_DATA_COOL_RIBBON);
+ nRibbons += GetMonData(pokemon, MON_DATA_BEAUTY_RIBBON);
+ nRibbons += GetMonData(pokemon, MON_DATA_CUTE_RIBBON);
+ nRibbons += GetMonData(pokemon, MON_DATA_SMART_RIBBON);
+ nRibbons += GetMonData(pokemon, MON_DATA_TOUGH_RIBBON);
+ nRibbons += GetMonData(pokemon, MON_DATA_CHAMPION_RIBBON);
+ nRibbons += GetMonData(pokemon, MON_DATA_WINNING_RIBBON);
+ nRibbons += GetMonData(pokemon, MON_DATA_VICTORY_RIBBON);
+ nRibbons += GetMonData(pokemon, MON_DATA_ARTIST_RIBBON);
+ nRibbons += GetMonData(pokemon, MON_DATA_EFFORT_RIBBON);
+ nRibbons += GetMonData(pokemon, MON_DATA_GIFT_RIBBON_1);
+ nRibbons += GetMonData(pokemon, MON_DATA_GIFT_RIBBON_2);
+ nRibbons += GetMonData(pokemon, MON_DATA_GIFT_RIBBON_3);
+ nRibbons += GetMonData(pokemon, MON_DATA_GIFT_RIBBON_4);
+ nRibbons += GetMonData(pokemon, MON_DATA_GIFT_RIBBON_5);
+ nRibbons += GetMonData(pokemon, MON_DATA_GIFT_RIBBON_6);
+ nRibbons += GetMonData(pokemon, MON_DATA_GIFT_RIBBON_7);
+ return nRibbons;
+}
+
+u8 TV_MonDataIdxToRibbon(u8 monDataIdx)
+{
+ if (monDataIdx == MON_DATA_CHAMPION_RIBBON) return 0;
+ if (monDataIdx == MON_DATA_COOL_RIBBON) return 1;
+ if (monDataIdx == MON_DATA_BEAUTY_RIBBON) return 5;
+ if (monDataIdx == MON_DATA_CUTE_RIBBON) return 9;
+ if (monDataIdx == MON_DATA_SMART_RIBBON) return 13;
+ if (monDataIdx == MON_DATA_TOUGH_RIBBON) return 17;
+ if (monDataIdx == MON_DATA_WINNING_RIBBON) return 21;
+ if (monDataIdx == MON_DATA_VICTORY_RIBBON) return 22;
+ if (monDataIdx == MON_DATA_ARTIST_RIBBON) return 23;
+ if (monDataIdx == MON_DATA_EFFORT_RIBBON) return 24;
+ if (monDataIdx == MON_DATA_GIFT_RIBBON_1) return 25;
+ if (monDataIdx == MON_DATA_GIFT_RIBBON_2) return 26;
+ if (monDataIdx == MON_DATA_GIFT_RIBBON_3) return 27;
+ if (monDataIdx == MON_DATA_GIFT_RIBBON_4) return 28;
+ if (monDataIdx == MON_DATA_GIFT_RIBBON_5) return 29;
+ if (monDataIdx == MON_DATA_GIFT_RIBBON_6) return 30;
+ if (monDataIdx == MON_DATA_GIFT_RIBBON_7) return 31;
+ return 0;
+}
+
+void sub_80EE72C(void)
+{
+ TVShow *show;
+
+ sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_TRAINER_FAN_CLUB, FALSE) != TRUE)
+ {
+ show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ show->trainerFanClub.kind = TVSHOW_TRAINER_FAN_CLUB;
+ show->trainerFanClub.active = FALSE;
+ StringCopy(show->trainerFanClub.playerName, gSaveBlock2Ptr->playerName);
+ show->trainerFanClub.words[0] = gSaveBlock1Ptr->unk2BB0[0];
+ show->trainerFanClub.words[1] = gSaveBlock1Ptr->unk2BB0[1];
+ tv_store_id_3x(show);
+ show->trainerFanClub.language = gGameLanguage;
+ }
+}
+
+bool8 sub_80EE7C0(void)
+{
+ sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot == -1)
+ {
+ return TRUE;
+ }
+ FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_FAN_CLUB_SPECIAL);
+ if (gScriptResult == TRUE)
+ {
+ return TRUE;
+ }
+ if (gSaveBlock1Ptr->linkBattleRecords[0].name[0] == EOS)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_80EE818(void)
+{
+ u32 playerId;
+ u8 showIdx;
+ TVShow *shows;
+
+ if (HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_FRONTIER, FALSE) == TRUE)
+ {
+ shows = gSaveBlock1Ptr->tvShows;
+ playerId = GetPlayerIDAsU32();
+ for (showIdx = 5; showIdx < 24; showIdx ++)
+ {
+ if (shows[showIdx].common.kind == TVSHOW_FRONTIER && (playerId & 0xFF) == shows[showIdx].common.trainerIdLo && ((playerId >> 8) & 0xFF) == shows[showIdx].common.trainerIdHi)
+ {
+ DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, showIdx);
+ sub_80EF93C(gSaveBlock1Ptr->tvShows);
+ return TRUE;
+ }
+ }
+ }
+ sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot == -1)
+ {
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void sub_80EE8C8(u16 winStreak, u8 facility)
+{
+ TVShow *show;
+
+ sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1)
+ {
+ show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ show->frontier.kind = TVSHOW_FRONTIER;
+ show->frontier.active = FALSE;
+ StringCopy(show->frontier.playerName, gSaveBlock2Ptr->playerName);
+ show->frontier.winStreak = winStreak;
+ show->frontier.facility = facility;
+ switch (facility)
+ {
+ case 1:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ show->frontier.species1 = GetMonData(&gPlayerParty[0], MON_DATA_SPECIES, NULL);
+ show->frontier.species2 = GetMonData(&gPlayerParty[1], MON_DATA_SPECIES, NULL);
+ show->frontier.species3 = GetMonData(&gPlayerParty[2], MON_DATA_SPECIES, NULL);
+ break;
+ case 2:
+ show->frontier.species1 = GetMonData(&gPlayerParty[0], MON_DATA_SPECIES, NULL);
+ show->frontier.species2 = GetMonData(&gPlayerParty[1], MON_DATA_SPECIES, NULL);
+ show->frontier.species3 = GetMonData(&gPlayerParty[2], MON_DATA_SPECIES, NULL);
+ show->frontier.species4 = GetMonData(&gPlayerParty[3], MON_DATA_SPECIES, NULL);
+ break;
+ case 3:
+ show->frontier.species1 = GetMonData(&gPlayerParty[0], MON_DATA_SPECIES, NULL);
+ show->frontier.species2 = GetMonData(&gPlayerParty[1], MON_DATA_SPECIES, NULL);
+ break;
+ case 4:
+ show->frontier.species1 = GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->field_CAA[0] - 1], MON_DATA_SPECIES, NULL);
+ show->frontier.species2 = GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->field_CAA[1] - 1], MON_DATA_SPECIES, NULL);
+ break;
+ }
+ tv_store_id_3x(show);
+ show->frontier.language = gGameLanguage;
+ }
+}
+
+void sub_80EEA70(void)
+{
+ TVShow *show;
+ u8 strbuf[32];
+
+ if (HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_SECRET_BASE_SECRETS, FALSE) != TRUE)
+ {
+ sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1)
+ {
+ show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ show->secretBaseSecrets.kind = TVSHOW_SECRET_BASE_SECRETS;
+ show->secretBaseSecrets.active = FALSE;
+ StringCopy(show->secretBaseSecrets.playerName, gSaveBlock2Ptr->playerName);
+ show->secretBaseSecrets.stepsInBase = VarGet(0x40ec);
+ sub_80E980C();
+ StringCopy(strbuf, gStringVar1);
+ StripExtCtrlCodes(strbuf);
+ StringCopy(show->secretBaseSecrets.baseOwnersName, strbuf);
+ show->secretBaseSecrets.item = VarGet(0x40ed);
+ show->secretBaseSecrets.flags = VarGet(0x40ee) + (VarGet(0x40ef) << 16);
+ tv_store_id_3x(show);
+ show->secretBaseSecrets.language = gGameLanguage;
+ if (show->secretBaseSecrets.language == LANGUAGE_JAPANESE || gSaveBlock1Ptr->secretBases[VarGet(VAR_0x4054)].language == LANGUAGE_JAPANESE)
+ {
+ show->secretBaseSecrets.baseOwnersNameLanguage = LANGUAGE_JAPANESE;
+ }
+ else
+ {
+ show->secretBaseSecrets.baseOwnersNameLanguage = gSaveBlock1Ptr->secretBases[VarGet(VAR_0x4054)].language;
+ }
+ }
+ }
+}
+
+void sub_80EEB98(u16 days)
+{
+ u8 i;
+
+ for (i = 0; i < ARRAY_COUNT(sNumberOneVarsAndThresholds); i ++)
+ {
+ if (VarGet(sNumberOneVarsAndThresholds[i][0]) >= sNumberOneVarsAndThresholds[i][1])
+ {
+ sub_80EEBF4(i);
+ break;
+ }
+ }
+ for (i = 0; i < ARRAY_COUNT(sNumberOneVarsAndThresholds); i ++)
+ {
+ VarSet(sNumberOneVarsAndThresholds[i][0], 0);
+ }
+}
+
+void sub_80EEBF4(u8 actionIdx)
+{
+ TVShow *show;
+
+ HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_NUMBER_ONE, TRUE);
+ sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1)
+ {
+ show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ show->numberOne.kind = TVSHOW_NUMBER_ONE;
+ show->numberOne.active = FALSE;
+ StringCopy(show->numberOne.playerName, gSaveBlock2Ptr->playerName);
+ show->numberOne.actionIdx = actionIdx;
+ show->numberOne.count = VarGet(sNumberOneVarsAndThresholds[actionIdx][0]);
+ tv_store_id_3x(show);
+ show->numberOne.language = gGameLanguage;
+ }
+}
+
+void sub_80EEC80(void)
+{
+ VarSet(VAR_DAILY_SLOTS, VarGet(VAR_DAILY_SLOTS) + 1);
+}
+
+void sub_80EECA4(void)
+{
+ VarSet(VAR_DAILY_ROULETTE, VarGet(VAR_DAILY_ROULETTE) + 1);
+}
+
+void sub_80EECC8(void)
+{
+ VarSet(VAR_DAILY_WILDS, VarGet(VAR_DAILY_WILDS) + 1);
+}
+
+void sub_80EECEC(void)
+{
+ VarSet(VAR_DAILY_BLENDER, VarGet(VAR_DAILY_BLENDER) + 1);
+}
+
+void sub_80EED10(void)
+{
+ VarSet(VAR_DAILY_PLANTED_BERRIES, VarGet(VAR_DAILY_PLANTED_BERRIES) + 1);
+}
+
+void sub_80EED34(void)
+{
+ VarSet(VAR_DAILY_PICKED_BERRIES, VarGet(VAR_DAILY_PICKED_BERRIES) + gSpecialVar_0x8006);
+}
+
+void sub_80EED60(u16 delta)
+{
+ VarSet(VAR_DAILY_BP, VarGet(VAR_DAILY_BP) + delta);
+}
+
+// PokeNews
+
+void sub_80EED88(void)
+{
+ u8 newsKind;
+
+ if (FlagGet(SYS_GAME_CLEAR))
+ {
+ sCurTVShowSlot = sub_80EEE30(gSaveBlock1Ptr->pokeNews);
+ if (sCurTVShowSlot != -1 && rbernoulli(1, 100) != TRUE)
+ {
+ newsKind = (Random() % 4) + POKENEWS_SLATEPORT;
+ if (sub_80EF0E4(newsKind) != TRUE)
+ {
+ gSaveBlock1Ptr->pokeNews[sCurTVShowSlot].kind = newsKind;
+ gSaveBlock1Ptr->pokeNews[sCurTVShowSlot].days = 4;
+ gSaveBlock1Ptr->pokeNews[sCurTVShowSlot].state = TRUE;
+ }
+ }
+ }
+}
+
+s8 sub_80EEE30(PokeNews *pokeNews)
+{
+ s8 i;
+
+ for (i = 0; i < 16; i ++)
+ {
+ if (pokeNews[i].kind == 0)
+ {
+ return i;
+ }
+ }
+ return -1;
+}
+
+void ClearPokemonNews(void)
+{
+ u8 i;
+
+ for (i = 0; i < 16; i ++)
+ {
+ ClearPokemonNewsI(i);
+ }
+}
+
+void ClearPokemonNewsI(u8 i)
+{
+ gSaveBlock1Ptr->pokeNews[i].kind = POKENEWS_NONE;
+ gSaveBlock1Ptr->pokeNews[i].state = FALSE;
+ gSaveBlock1Ptr->pokeNews[i].days = 0;
+}
+
+void sub_80EEEB8(void)
+{
+ u8 i;
+ u8 j;
+
+ for (i = 0; i < 15; i ++)
+ {
+ if (gSaveBlock1Ptr->pokeNews[i].kind == POKENEWS_NONE)
+ {
+ for (j = i + 1; j < 16; j ++)
+ {
+ if (gSaveBlock1Ptr->pokeNews[j].kind != POKENEWS_NONE)
+ {
+ gSaveBlock1Ptr->pokeNews[i] = gSaveBlock1Ptr->pokeNews[j];
+ ClearPokemonNewsI(j);
+ break;
+ }
+ }
+ }
+ }
+}
+
+u8 FindAnyTVNewsOnTheAir(void)
+{
+ u8 i;
+
+ for (i = 0; i < 16; i ++)
+ {
+ if (gSaveBlock1Ptr->pokeNews[i].kind != POKENEWS_NONE && gSaveBlock1Ptr->pokeNews[i].state == TRUE && gSaveBlock1Ptr->pokeNews[i].days < 3)
+ {
+ return i;
+ }
+ }
+ return -1;
+}
+
+void DoPokeNews(void)
+{
+ u8 i;
+ u16 n;
+
+ i = FindAnyTVNewsOnTheAir();
+ if (i == 0xFF)
+ {
+ gScriptResult = FALSE;
+ }
+ else
+ {
+ if (gSaveBlock1Ptr->pokeNews[i].days == 0)
+ {
+ gSaveBlock1Ptr->pokeNews[i].state = 2;
+ if (gLocalTime.hours < 20)
+ {
+ ShowFieldMessage(sPokeNewsTextGroup_Ongoing[gSaveBlock1Ptr->pokeNews[i].kind]);
+ }
+ else
+ {
+ ShowFieldMessage(sPokeNewsTextGroup_Ending[gSaveBlock1Ptr->pokeNews[i].kind]);
+ }
+ }
+ else
+ {
+ n = gSaveBlock1Ptr->pokeNews[i].days;
+ ConvertIntToDecimalStringN(gStringVar1, n, STR_CONV_MODE_LEFT_ALIGN, 1);
+ gSaveBlock1Ptr->pokeNews[i].state = 0;
+ ShowFieldMessage(sPokeNewsTextGroup_Upcoming[gSaveBlock1Ptr->pokeNews[i].kind]);
+ }
+ gScriptResult = TRUE;
+ }
+}
+
+bool8 GetPriceReduction(u8 newsKind)
+{
+ u8 i;
+
+ if (newsKind == 0)
+ {
+ return FALSE;
+ }
+ for (i = 0; i < 16; i ++)
+ {
+ if (gSaveBlock1Ptr->pokeNews[i].kind == newsKind)
+ {
+ if (gSaveBlock1Ptr->pokeNews[i].state == 2 && IsPriceDiscounted(newsKind))
+ {
+ return TRUE;
+ }
+ return FALSE;
+ }
+ }
+ return FALSE;
+}
+
+bool8 IsPriceDiscounted(u8 newsKind)
+{
+ switch (newsKind)
+ {
+ case POKENEWS_SLATEPORT:
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP_SLATEPORT_CITY && gSaveBlock1Ptr->location.mapNum == MAP_ID_SLATEPORT_CITY && gScriptLastTalked == 25)
+ {
+ return TRUE;
+ }
+ return FALSE;
+ case POKENEWS_LILYCOVE:
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP && gSaveBlock1Ptr->location.mapNum == MAP_ID_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP)
+ {
+ return TRUE;
+ }
+ return FALSE;
+ }
+ return TRUE;
+}
+
+bool8 sub_80EF0E4(u8 newsKind)
+{
+ u8 i;
+ if (newsKind == POKENEWS_NONE)
+ {
+ return TRUE;
+ }
+ for (i = 0; i < 16; i ++)
+ {
+ if (gSaveBlock1Ptr->pokeNews[i].kind == newsKind)
+ {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+void sub_80EF120(u16 days)
+{
+ u8 i;
+
+ for (i = 0; i < 16; i ++)
+ {
+ if (gSaveBlock1Ptr->pokeNews[i].kind != POKENEWS_NONE)
+ {
+ if (gSaveBlock1Ptr->pokeNews[i].days < days)
+ {
+ ClearPokemonNewsI(i);
+ }
+ else
+ {
+ if (gSaveBlock1Ptr->pokeNews[i].state == 0 && FlagGet(SYS_GAME_CLEAR) == TRUE)
+ {
+ gSaveBlock1Ptr->pokeNews[i].state = 1;
+ }
+ gSaveBlock1Ptr->pokeNews[i].days -= days;
+ }
+ }
+ }
+ sub_80EEEB8();
+}
+
+void CopyContestRankToStringVar(u8 varIdx, u8 rank)
+{
+ switch (rank)
+ {
+ case 0: // NORMAL
+ StringCopy(gTVStringVarPtrs[varIdx], gUnknown_0858BAF0[5]);
+ break;
+ case 1: // SUPER
+ StringCopy(gTVStringVarPtrs[varIdx], gUnknown_0858BAF0[6]);
+ break;
+ case 2: // HYPER
+ StringCopy(gTVStringVarPtrs[varIdx], gUnknown_0858BAF0[7]);
+ break;
+ case 3: // MASTER
+ StringCopy(gTVStringVarPtrs[varIdx], gUnknown_0858BAF0[8]);
+ break;
+ }
+}
+
+void CopyContestCategoryToStringVar(u8 varIdx, u8 category)
+{
+ switch (category)
+ {
+ case 0: // COOL
+ StringCopy(gTVStringVarPtrs[varIdx], gUnknown_0858BAF0[0]);
+ break;
+ case 1: // BEAUTY
+ StringCopy(gTVStringVarPtrs[varIdx], gUnknown_0858BAF0[1]);
+ break;
+ case 2: // CUTE
+ StringCopy(gTVStringVarPtrs[varIdx], gUnknown_0858BAF0[2]);
+ break;
+ case 3: // SMART
+ StringCopy(gTVStringVarPtrs[varIdx], gUnknown_0858BAF0[3]);
+ break;
+ case 4: // TOUGH
+ StringCopy(gTVStringVarPtrs[varIdx], gUnknown_0858BAF0[4]);
+ break;
+ }
+}
+
+void SetContestCategoryStringVarForInterview(void)
+{
+ TVShow *show;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ CopyContestCategoryToStringVar(1, show->bravoTrainer.contestCategory);
+}
+
+void TV_PrintIntToStringVar(u8 varIdx, int value)
+{
+ int nDigits;
+
+ nDigits = sub_80EF370(value);
+ ConvertIntToDecimalStringN(gTVStringVarPtrs[varIdx], value, STR_CONV_MODE_LEFT_ALIGN, nDigits);
+}
+
+size_t sub_80EF370(int value)
+{
+ if (value / 10 == 0)
+ {
+ return 1;
+ }
+ if (value / 100 == 0)
+ {
+ return 2;
+ }
+ if (value / 1000 == 0)
+ {
+ return 3;
+ }
+ if (value / 10000 == 0)
+ {
+ return 4;
+ }
+ if (value / 100000 == 0)
+ {
+ return 5;
+ }
+ if (value / 1000000 == 0)
+ {
+ return 6;
+ }
+ if (value / 10000000 == 0)
+ {
+ return 7;
+ }
+ if (value / 100000000 == 0)
+ {
+ return 8;
+ }
+ return 1;
+}
+
+void sub_80EF40C(u8 varIdx, TVShow *show)
+{
+ u8 i;
+ int price;
+
+ price = 0;
+ for (i = 0; i < 3; i ++)
+ {
+ if (show->smartshopperShow.itemIds[i] != ITEM_NONE)
+ {
+ price += itemid_get_market_price(show->smartshopperShow.itemIds[i]) * show->smartshopperShow.itemAmounts[i];
+ }
+ }
+ if (show->smartshopperShow.priceReduced == TRUE)
+ {
+ TV_PrintIntToStringVar(varIdx, price >> 1);
+ }
+ else
+ {
+ TV_PrintIntToStringVar(varIdx, price);
+ }
+}
+
+bool8 HasMixableShowAlreadyBeenSpawnedWithPlayerID(u8 kind, bool8 flag)
+{
+ u32 playerId;
+ TVShow *shows;
+ u8 i;
+
+ shows = gSaveBlock1Ptr->tvShows;
+ playerId = GetPlayerIDAsU32();
+ for (i = 5; i < 24; i ++)
+ {
+ if (shows[i].common.kind == kind && (playerId & 0xFF) == shows[i].common.trainerIdLo && ((playerId >> 8) & 0xFF) == shows[i].common.trainerIdHi)
+ {
+ if (flag == TRUE)
+ {
+ DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, i);
+ sub_80EF93C(gSaveBlock1Ptr->tvShows);
+ }
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+void TV_SortPurchasesByQuantity(void)
+{
+ u8 i;
+ u8 j;
+ u16 tmpId;
+ u16 tmpQn;
+
+ for (i = 0; i < 2; i ++)
+ {
+ for (j = i + 1; j < 3; j ++)
+ {
+ if (gUnknown_02039F80[i].quantity < gUnknown_02039F80[j].quantity)
+ {
+ tmpId = gUnknown_02039F80[i].itemId;
+ tmpQn = gUnknown_02039F80[i].quantity;
+ gUnknown_02039F80[i].itemId = gUnknown_02039F80[j].itemId;
+ gUnknown_02039F80[i].quantity = gUnknown_02039F80[j].quantity;
+ gUnknown_02039F80[j].itemId = tmpId;
+ gUnknown_02039F80[j].quantity = tmpQn;
+ }
+ }
+ }
+}
+
+void FindActiveBroadcastByShowType_SetScriptResult(u8 kind)
+{
+ u8 i;
+ for (i = 0; i < 5; i ++)
+ {
+ if (gSaveBlock1Ptr->tvShows[i].common.kind == kind)
+ {
+ if (gSaveBlock1Ptr->tvShows[i].common.active == TRUE)
+ {
+ gScriptResult = TRUE;
+ }
+ else
+ {
+ DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, i);
+ sub_80EF93C(gSaveBlock1Ptr->tvShows);
+ sub_80EFA88();
+ }
+ return;
+ }
+ }
+ sub_80EFA88();
+}
+
+void InterviewBefore(void)
+{
+ gScriptResult = FALSE;
+ switch (gSpecialVar_0x8005)
+ {
+ case TVSHOW_FAN_CLUB_LETTER:
+ InterviewBefore_FanClubLetter();
+ break;
+ case TVSHOW_RECENT_HAPPENINGS:
+ InterviewBefore_RecentHappenings();
+ break;
+ case TVSHOW_PKMN_FAN_CLUB_OPINIONS:
+ InterviewBefore_PkmnFanClubOpinions();
+ break;
+ case TVSHOW_UNKN_SHOWTYPE_04:
+ InterviewBefore_Dummy();
+ break;
+ case TVSHOW_NAME_RATER_SHOW:
+ InterviewBefore_NameRater();
+ break;
+ case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE:
+ InterviewBefore_BravoTrainerPkmnProfile();
+ break;
+ case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE:
+ InterviewBefore_BravoTrainerBTProfile();
+ break;
+ case TVSHOW_CONTEST_LIVE_UPDATES:
+ InterviewBefore_ContestLiveUpdates();
+ break;
+ case TVSHOW_3_CHEERS_FOR_POKEBLOCKS:
+ InterviewBefore_3CheersForPokeblocks();
+ break;
+ case TVSHOW_FAN_CLUB_SPECIAL:
+ InterviewBefore_FanClubSpecial();
+ break;
+ }
+}
+
+void InterviewBefore_FanClubLetter(void)
+{
+ FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_FAN_CLUB_LETTER);
+ if (!gScriptResult)
+ {
+ StringCopy(gStringVar1, gSpeciesNames[GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL)]);
+ InitializeEasyChatWordArray(gSaveBlock1Ptr->tvShows[sCurTVShowSlot].fanclubLetter.words, 6);
+ }
+}
+
+void InterviewBefore_RecentHappenings(void)
+{
+ FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_RECENT_HAPPENINGS);
+ if (!gScriptResult)
+ {
+ InitializeEasyChatWordArray(gSaveBlock1Ptr->tvShows[sCurTVShowSlot].recentHappenings.words, 6);
+ }
+}
+
+void InterviewBefore_PkmnFanClubOpinions(void)
+{
+ FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_PKMN_FAN_CLUB_OPINIONS);
+ if (!gScriptResult)
+ {
+ StringCopy(gStringVar1, gSpeciesNames[GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL)]);
+ GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_NICKNAME, gStringVar2);
+ StringGetEnd10(gStringVar2);
+ InitializeEasyChatWordArray(gSaveBlock1Ptr->tvShows[sCurTVShowSlot].fanclubOpinions.words, 2);
+ }
+}
+
+void InterviewBefore_Dummy(void)
+{
+ gScriptResult = TRUE;
+}
+
+void InterviewBefore_NameRater(void)
+{
+ FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_NAME_RATER_SHOW);
+}
+
+void InterviewBefore_BravoTrainerPkmnProfile(void)
+{
+ FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE);
+ if (!gScriptResult)
+ {
+ InitializeEasyChatWordArray(gSaveBlock1Ptr->tvShows[sCurTVShowSlot].bravoTrainer.words, 2);
+ }
+}
+
+void InterviewBefore_ContestLiveUpdates(void)
+{
+ FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_CONTEST_LIVE_UPDATES);
+}
+
+void InterviewBefore_3CheersForPokeblocks(void)
+{
+ FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_3_CHEERS_FOR_POKEBLOCKS);
+}
+
+void InterviewBefore_BravoTrainerBTProfile(void)
+{
+ FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE);
+ if (!gScriptResult)
+ {
+ InitializeEasyChatWordArray(gSaveBlock1Ptr->tvShows[sCurTVShowSlot].bravoTrainerTower.words, 1);
+ }
+}
+
+void InterviewBefore_FanClubSpecial(void)
+{
+ FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_FAN_CLUB_SPECIAL);
+ if (!gScriptResult)
+ {
+ InitializeEasyChatWordArray(gSaveBlock1Ptr->tvShows[sCurTVShowSlot].fanClubSpecial.words, 1);
+ }
+}
+
+bool8 sub_80EF88C(u8 monIdx)
+{
+ struct Pokemon *pokemon;
+ u8 language;
+
+ pokemon = &gPlayerParty[monIdx];
+ GetMonData(pokemon, MON_DATA_NICKNAME, gStringVar1);
+ language = GetMonData(pokemon, MON_DATA_LANGUAGE, &language);
+ if (language == LANGUAGE_ENGLISH && !StringCompare(gSpeciesNames[GetMonData(pokemon, MON_DATA_SPECIES, NULL)], gStringVar1))
+ {
+ return FALSE;
+ }
+ return TRUE;
+}
+
+bool8 sub_80EF8F8(void)
+{
+ return sub_80EF88C(GetLeadMonIndex());
+}
+
+void DeleteTVShowInArrayByIdx(TVShow *shows, u8 idx)
+{
+ u8 i;
+
+ shows[idx].common.kind = TVSHOW_OFF_AIR;
+ shows[idx].common.active = FALSE;
+ for (i = 0; i < 34; i ++)
+ {
+ shows[idx].common.pad02[i] = 0;
+ }
+}
+
+void sub_80EF93C(TVShow *shows)
+{
+ u8 i;
+ u8 j;
+
+ for (i = 0; i < 4; i ++)
+ {
+ if (shows[i].common.kind == TVSHOW_OFF_AIR)
+ {
+ for (j = i + 1; j < 5; j ++)
+ {
+ if (shows[j].common.kind != TVSHOW_OFF_AIR)
+ {
+ shows[i] = shows[j];
+ DeleteTVShowInArrayByIdx(shows, j);
+ break;
+ }
+ }
+ }
+ }
+ for (i = 5; i < 24; i ++)
+ {
+ if (shows[i].common.kind == TVSHOW_OFF_AIR)
+ {
+ for (j = i + 1; j < 24; j ++)
+ {
+ if (shows[j].common.kind != TVSHOW_OFF_AIR)
+ {
+ shows[i] = shows[j];
+ DeleteTVShowInArrayByIdx(shows, j);
+ break;
+ }
+ }
+ }
+ }
+}
+
+u16 TV_GetSomeOtherSpeciesAlreadySeenByPlayer_AndPrintName(u8 varIdx, u16 passedSpecies)
+{
+ u16 species;
+
+ species = TV_GetSomeOtherSpeciesAlreadySeenByPlayer(passedSpecies);
+ StringCopy(gTVStringVarPtrs[varIdx], gSpeciesNames[species]);
+ return species;
+}
+
+u16 TV_GetSomeOtherSpeciesAlreadySeenByPlayer(u16 passedSpecies)
+{
+ u16 species;
+ u16 initSpecies;
+
+ species = (Random() % (NUM_SPECIES - 1)) + 1;
+ initSpecies = species;
+ while (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), 0) != 1 || species == passedSpecies)
+ {
+ if (species == 1)
+ {
+ species = NUM_SPECIES - 1;
+ }
+ else
+ {
+ species --;
+ }
+ if (species == initSpecies)
+ {
+ species = passedSpecies;
+ return species;
+ }
+ };
+ return species;
+}
+
+void sub_80EFA88(void)
+{
+ sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ gSpecialVar_0x8006 = sCurTVShowSlot;
+ if (sCurTVShowSlot == -1)
+ {
+ gScriptResult = TRUE;
+ }
+ else
+ {
+ gScriptResult = FALSE;
+ }
+}
+
+s8 FindEmptyTVSlotWithinFirstFiveShowsOfArray(TVShow *shows)
+{
+ u8 i;
+
+ for (i = 0; i < 5; i ++)
+ {
+ if (shows[i].common.kind == TVSHOW_OFF_AIR)
+ {
+ return i;
+ }
+ }
+ return -1;
+}
+
+s8 FindEmptyTVSlotBeyondFirstFiveShowsOfArray(TVShow *shows)
+{
+ s8 i;
+
+ for (i = 5; i < 24; i ++)
+ {
+ if (shows[i].common.kind == TVSHOW_OFF_AIR)
+ {
+ return i;
+ }
+ }
+ return -1;
+}
+
+bool8 TV_BernoulliTrial(u16 ratio)
+{
+ if (Random() <= ratio)
+ {
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void TV_FanClubLetter_RandomWordToStringVar3(TVShow *show)
+{
+ u8 i;
+
+ i = Random() % 6;
+ while (TRUE)
+ {
+ if (i == 6)
+ {
+ i = 0;
+ }
+ if (show->fanclubLetter.words[i] != 0xFFFF)
+ {
+ break;
+ }
+ i ++;
+ }
+ CopyEasyChatWord(gStringVar3, show->fanclubLetter.words[i]);
+}
+
+u8 TV_GetNicknameSumMod8(TVShow *show)
+{
+ u8 i;
+ u16 ct;
+
+ ct = 0;
+ for (i = 0; i < 11; i ++)
+ {
+ if (show->nameRaterShow.pokemonName[i] == EOS)
+ {
+ break;
+ }
+ ct += show->nameRaterShow.pokemonName[i];
+ }
+ return ct & 7;
+}
+
+void TV_GetNicknameSubstring(u8 varIdx, u8 whichPosition, u8 charParam, u16 whichString, u16 species, TVShow *show)
+{
+ u8 buff[16];
+ u8 i;
+ u16 strlen;
+
+ for (i = 0; i < 3; i ++)
+ {
+ buff[i] = EOS;
+ }
+ if (whichString == 0)
+ {
+ strlen = StringLength(show->nameRaterShow.trainerName);
+ if (charParam == 0)
+ {
+ buff[0] = show->nameRaterShow.trainerName[whichPosition];
+ }
+ else if (charParam == 1)
+ {
+ buff[0] = show->nameRaterShow.trainerName[strlen - whichPosition];
+ }
+ else if (charParam == 2)
+ {
+ buff[0] = show->nameRaterShow.trainerName[whichPosition];
+ buff[1] = show->nameRaterShow.trainerName[whichPosition + 1];
+ }
+ else
+ {
+ buff[0] = show->nameRaterShow.trainerName[strlen - (whichPosition + 2)];
+ buff[1] = show->nameRaterShow.trainerName[strlen - (whichPosition + 1)];
+ }
+ ConvertInternationalString(buff, show->nameRaterShow.language);
+ }
+ else if (whichString == 1)
+ {
+ strlen = StringLength(show->nameRaterShow.pokemonName);
+ if (charParam == 0)
+ {
+ buff[0] = show->nameRaterShow.pokemonName[whichPosition];
+ }
+ else if (charParam == 1)
+ {
+ buff[0] = show->nameRaterShow.pokemonName[strlen - whichPosition];
+ }
+ else if (charParam == 2)
+ {
+ buff[0] = show->nameRaterShow.pokemonName[whichPosition];
+ buff[1] = show->nameRaterShow.pokemonName[whichPosition + 1];
+ }
+ else
+ {
+ buff[0] = show->nameRaterShow.pokemonName[strlen - (whichPosition + 2)];
+ buff[1] = show->nameRaterShow.pokemonName[strlen - (whichPosition + 1)];
+ }
+ ConvertInternationalString(buff, show->nameRaterShow.pokemonNameLanguage);
+ }
+ else
+ {
+ strlen = StringLength(gSpeciesNames[species]);
+ if (charParam == 0)
+ {
+ buff[0] = gSpeciesNames[species][whichPosition];
+ }
+ else if (charParam == 1)
+ {
+ buff[0] = gSpeciesNames[species][strlen - whichPosition];
+ }
+ else if (charParam == 2)
+ {
+ buff[0] = gSpeciesNames[species][whichPosition];
+ buff[1] = gSpeciesNames[species][whichPosition + 1];
+ }
+ else
+ {
+ buff[0] = gSpeciesNames[species][strlen - (whichPosition + 2)];
+ buff[1] = gSpeciesNames[species][strlen - (whichPosition + 1)];
+ }
+ }
+ StringCopy(gTVStringVarPtrs[varIdx], buff);
+}
+
+bool8 TV_IsScriptShowKindAlreadyInQueue(void)
+{
+ u8 i;
+
+ for (i = 0; i < 5; i ++)
+ {
+ if (gSaveBlock1Ptr->tvShows[i].common.kind == gSpecialVar_0x8004)
+ {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+bool8 TV_PutNameRaterShowOnTheAirIfNicnkameChanged(void)
+{
+ GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar1);
+ if (!StringCompare(gStringVar3, gStringVar1))
+ {
+ return FALSE;
+ }
+ PutNameRaterShowOnTheAir();
+ return TRUE;
+}
+
+void ChangePokemonNickname(void)
+{
+ void ChangePokemonNickname_CB(void);
+
+ GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar3);
+ GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar2);
+ DoNamingScreen(3, gStringVar2, GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_SPECIES, NULL), GetMonGender(&gPlayerParty[gSpecialVar_0x8004]), GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_PERSONALITY, NULL), ChangePokemonNickname_CB);
+}
+
+void ChangePokemonNickname_CB(void)
+{
+ SetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar2);
+ c2_exit_to_overworld_1_continue_scripts_restart_music();
+}
+
+void ChangeBoxPokemonNickname(void)
+{
+ struct BoxPokemon *boxMon;
+
+ boxMon = GetBoxedMonPtr(gSpecialVar_0x8012, gSpecialVar_0x8013);
+ GetBoxMonData(boxMon, MON_DATA_NICKNAME, gStringVar3);
+ GetBoxMonData(boxMon, MON_DATA_NICKNAME, gStringVar2);
+ DoNamingScreen(3, gStringVar2, GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL), GetBoxMonGender(boxMon), GetBoxMonData(boxMon, MON_DATA_PERSONALITY, NULL), ChangeBoxPokemonNickname_CB);
+}
+
+void ChangeBoxPokemonNickname_CB(void)
+{
+ SetBoxMonNickFromAnyBox(gSpecialVar_0x8012, gSpecialVar_0x8013, gStringVar2);
+ c2_exit_to_overworld_1_continue_scripts_restart_music();
+}
+
+void TV_CopyNicknameToStringVar1AndEnsureTerminated(void)
+{
+ GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar1);
+ StringGetEnd10(gStringVar1);
+}
+
+void TV_CheckMonOTIDEqualsPlayerID(void)
+{
+ if (GetPlayerIDAsU32() == GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_OT_ID, NULL))
+ {
+ gScriptResult = FALSE;
+ }
+ else
+ {
+ gScriptResult = TRUE;
+ }
+}
+
+u8 GetTVChannelByShowType(u8 kind)
+{
+ if (kind == TVSHOW_OFF_AIR)
+ {
+ return 0;
+ }
+ if (kind >= TVSHOW_FAN_CLUB_LETTER && kind < TVSHOW_POKEMON_TODAY_CAUGHT)
+ {
+ return 2;
+ }
+ if (kind >= TVSHOW_POKEMON_TODAY_CAUGHT && kind < TVSHOW_MASS_OUTBREAK)
+ {
+ return 3;
+ }
+ if (kind >= TVSHOW_MASS_OUTBREAK && kind < 61)
+ {
+ return 4;
+ }
+ return 0;
+}
+
+u32 GetPlayerIDAsU32(void)
+{
+ return (gSaveBlock2Ptr->playerTrainerId[3] << 24) | (gSaveBlock2Ptr->playerTrainerId[2] << 16) | (gSaveBlock2Ptr->playerTrainerId[1] << 8) | gSaveBlock2Ptr->playerTrainerId[0];
+}
+
+u8 CheckForBigMovieOrEmergencyNewsOnTV(void)
+{
+ if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)
+ {
+ return 0;
+ }
+ if (gSaveBlock2Ptr->playerGender == MALE)
+ {
+ if (gSaveBlock1Ptr->location.mapNum != MAP_ID_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)
+ {
+ return 0;
+ }
+ }
+ else
+ {
+ if (gSaveBlock1Ptr->location.mapNum != MAP_ID_LITTLEROOT_TOWN_MAYS_HOUSE_1F)
+ {
+ return 0;
+ }
+ }
+ if (FlagGet(SYS_TV_LATI) == TRUE)
+ {
+ return 1;
+ }
+ if (FlagGet(SYS_TV_HOME) == TRUE)
+ {
+ return 2;
+ }
+ return 1;
+}
+
+void GetMomOrDadStringForTVMessage(void)
+{
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)
+ {
+ if (gSaveBlock2Ptr->playerGender == MALE)
+ {
+ if (gSaveBlock1Ptr->location.mapNum == MAP_ID_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)
+ {
+ StringCopy(gStringVar1, gText_Mom);
+ VarSet(VAR_0x4003, 1);
+ }
+ }
+ else
+ {
+ if (gSaveBlock1Ptr->location.mapNum == MAP_ID_LITTLEROOT_TOWN_MAYS_HOUSE_1F)
+ {
+ StringCopy(gStringVar1, gText_Mom);
+ VarSet(VAR_0x4003, 1);
+ }
+ }
+ }
+ if (VarGet(VAR_0x4003) == 1)
+ {
+ StringCopy(gStringVar1, gText_Mom);
+ }
+ else if (VarGet(VAR_0x4003) == 2)
+ {
+ StringCopy(gStringVar1, gText_Dad);
+ }
+ else if (VarGet(VAR_0x4003) > 2)
+ {
+ if (VarGet(VAR_0x4003) % 2 == 0)
+ StringCopy(gStringVar1, gText_Mom);
+ else
+ StringCopy(gStringVar1, gText_Dad);
+ }
+ else
+ {
+ if (Random() % 2 != 0)
+ {
+ StringCopy(gStringVar1, gText_Mom);
+ VarSet(VAR_0x4003, 1);
+ }
+ else
+ {
+ StringCopy(gStringVar1, gText_Dad);
+ VarSet(VAR_0x4003, 2);
+ }
+ }
+}
+
+void sub_80F01B8(void)
+{
+ VarSet(VAR_0x40BC, 0);
+ RemoveFieldObjectByLocalIdAndMap(5, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
+ FlagSet(0x396);
+}
+
+void sub_80F01E8(void *src, u32 size, u8 masterIdx)
+{
+ u8 i;
+ u16 version;
+ TVShow (*rmBuffer2)[4][25];
+ TVShow (*rmBuffer)[4][25];
+
+ rmBuffer2 = malloc(4 * 25 * sizeof(TVShow));
+ if (rmBuffer2 != NULL)
+ {
+ for (i = 0; i < 4; i ++)
+ {
+ memcpy((*rmBuffer2)[i], src + i * size, sizeof((*rmBuffer2)[i]));
+ }
+ rmBuffer = rmBuffer2;
+ for (i = 0; i < GetLinkPlayerCount(); i ++)
+ {
+ version = (u8)gLinkPlayers[i].version;
+ if (version == VERSION_RUBY || version == VERSION_SAPPHIRE)
+ {
+ sub_80F1254((*rmBuffer)[i]);
+ }
+ else if (version == VERSION_EMERALD && gLinkPlayers[i].language == LANGUAGE_JAPANESE)
+ {
+ sub_80F12A4((*rmBuffer)[i]);
+ }
+ }
+ switch (masterIdx)
+ {
+ case 0:
+ sub_80F0358(gSaveBlock1Ptr->tvShows, (*rmBuffer)[1], (*rmBuffer)[2], (*rmBuffer)[3]);
+ break;
+ case 1:
+ sub_80F0358((*rmBuffer)[0], gSaveBlock1Ptr->tvShows, (*rmBuffer)[2], (*rmBuffer)[3]);
+ break;
+ case 2:
+ sub_80F0358((*rmBuffer)[0], (*rmBuffer)[1], gSaveBlock1Ptr->tvShows, (*rmBuffer)[3]);
+ break;
+ case 3:
+ sub_80F0358((*rmBuffer)[0], (*rmBuffer)[1], (*rmBuffer)[2], gSaveBlock1Ptr->tvShows);
+ break;
+ }
+ sub_80EF93C(gSaveBlock1Ptr->tvShows);
+ sub_80F0C04();
+ sub_80EF93C(gSaveBlock1Ptr->tvShows);
+ sub_80F0708();
+ sub_80F0B64();
+ free(rmBuffer2);
+ }
+}
+
+void sub_80F0358(TVShow player1[25], TVShow player2[25], TVShow player3[25], TVShow player4[25])
+{
+ u8 i;
+ u8 j;
+ TVShow **argslist[4];
+
+ argslist[0] = &player1;
+ argslist[1] = &player2;
+ argslist[2] = &player3;
+ argslist[3] = &player4;
+ sTVShowMixingNumPlayers = GetLinkPlayerCount();
+ while (1)
+ {
+ for (i = 0; i < sTVShowMixingNumPlayers; i ++)
+ {
+ if (i == 0)
+ {
+ sRecordMixingPartnersWithoutShowsToShare = i;
+ }
+ sTVShowMixingCurSlot = sub_80F06D0(argslist[i][0]);
+ if (sTVShowMixingCurSlot == -1)
+ {
+ sRecordMixingPartnersWithoutShowsToShare ++;
+ if (sRecordMixingPartnersWithoutShowsToShare == sTVShowMixingNumPlayers)
+ {
+ return;
+ }
+ }
+ else
+ {
+ for (j = 0; j < sTVShowMixingNumPlayers - 1; j ++)
+ {
+ sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(argslist[(i + j + 1) % sTVShowMixingNumPlayers][0]);
+ if (sCurTVShowSlot != -1
+ && sub_80F049C(&argslist[(i + j + 1) % sTVShowMixingNumPlayers][0], &argslist[i][0], (i + j + 1) % sTVShowMixingNumPlayers) == 1)
+ {
+ break;
+ }
+ }
+ if (j == sTVShowMixingNumPlayers - 1)
+ {
+ DeleteTVShowInArrayByIdx(argslist[i][0], sTVShowMixingCurSlot);
+ }
+ }
+ }
+ }
+}
+
+bool8 sub_80F049C(TVShow *dest[25], TVShow *src[25], u8 idx)
+{
+ u8 value;
+ u8 switchval;
+ TVShow *tv1;
+ TVShow *tv2;
+
+ tv1 = *dest;
+ tv2 = *src;
+ value = FALSE;
+ switchval = GetTVChannelByShowType(tv2[sTVShowMixingCurSlot].common.kind);
+ switch (switchval)
+ {
+ case 2:
+ value = sub_80F0580(&tv1[sCurTVShowSlot], &tv2[sTVShowMixingCurSlot], idx);
+ break;
+ case 3:
+ value = sub_80F05E8(&tv1[sCurTVShowSlot], &tv2[sTVShowMixingCurSlot], idx);
+ break;
+ case 4:
+ value = sub_80F0668(&tv1[sCurTVShowSlot], &tv2[sTVShowMixingCurSlot], idx);
+ break;
+ }
+ if (value == TRUE)
+ {
+ DeleteTVShowInArrayByIdx(tv2, sTVShowMixingCurSlot);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+u8 sub_80F0580(TVShow *tv1, TVShow *tv2, u8 idx)
+{
+ u32 linkTrainerId = GetLinkPlayerTrainerId(idx);
+
+ if ((linkTrainerId & 0xFF) == tv2->common.trainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.trainerIdHi)
+ {
+ return FALSE;
+ }
+ tv2->common.trainerIdLo = tv2->common.srcTrainerIdLo;
+ tv2->common.trainerIdHi = tv2->common.srcTrainerIdHi;
+ tv2->common.srcTrainerIdLo = linkTrainerId & 0xFF;
+ tv2->common.srcTrainerIdHi = linkTrainerId >> 8;
+ *tv1 = *tv2;
+ tv1->common.active = TRUE;
+ return TRUE;
+}
+
+u8 sub_80F05E8(TVShow *tv1, TVShow *tv2, u8 idx)
+{
+ u32 linkTrainerId = GetLinkPlayerTrainerId(idx);
+ if ((linkTrainerId & 0xFF) == tv2->common.srcTrainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.srcTrainerIdHi)
+ {
+ return FALSE;
+ }
+ if ((linkTrainerId & 0xFF) == tv2->common.trainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.trainerIdHi)
+ {
+ return FALSE;
+ }
+ tv2->common.srcTrainerIdLo = tv2->common.srcTrainerId2Lo;
+ tv2->common.srcTrainerIdHi = tv2->common.srcTrainerId2Hi;
+ tv2->common.srcTrainerId2Lo = linkTrainerId & 0xFF;
+ tv2->common.srcTrainerId2Hi = linkTrainerId >> 8;
+ *tv1 = *tv2;
+ tv1->common.active = TRUE;
+ return TRUE;
+}
+
+u8 sub_80F0668(TVShow *tv1, TVShow *tv2, u8 idx)
+{
+ u32 linkTrainerId = GetLinkPlayerTrainerId(idx);
+ if ((linkTrainerId & 0xFF) == tv2->common.trainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.trainerIdHi)
+ {
+ return FALSE;
+ }
+ tv2->common.trainerIdLo = tv2->common.srcTrainerIdLo;
+ tv2->common.trainerIdHi = tv2->common.srcTrainerIdHi;
+ tv2->common.srcTrainerIdLo = linkTrainerId & 0xFF;
+ tv2->common.srcTrainerIdHi = linkTrainerId >> 8;
+ *tv1 = *tv2;
+ tv1->common.active = TRUE;
+ tv1->massOutbreak.daysLeft = 1;
+ return TRUE;
+}
+
+s8 sub_80F06D0(TVShow *tvShows)
+{
+ u8 i;
+
+ for (i = 0; i < 24; i ++)
+ {
+ if (tvShows[i].common.active == FALSE && (u8)(tvShows[i].common.kind - 1) < 60)
+ {
+ return i;
+ }
+ }
+ return -1;
+}
+
+#ifdef NONMATCHING
+void sub_80F0708(void) // FIXME: register allocation shenanigans
+{
+ u16 i;
+ TVShow *show;
+
+ for (i = 0; i < 24; i ++)
+ {
+ switch (gSaveBlock1Ptr->tvShows[i].common.kind)
+ {
+ case TVSHOW_CONTEST_LIVE_UPDATES:
+ sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->contestLiveUpdates.species, i);
+ sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->contestLiveUpdates.winningSpecies, i);
+ break;
+ case TVSHOW_3_CHEERS_FOR_POKEBLOCKS:
+ break;
+ case TVSHOW_BATTLE_UPDATE:
+ sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->battleUpdate.species2, i);
+ sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->battleUpdate.species, i);
+ break;
+ case TVSHOW_FAN_CLUB_SPECIAL:
+ break;
+ case TVSHOW_CONTEST_LIVE_UPDATES_2:
+ break;
+
+ case TVSHOW_OFF_AIR:
+ break;
+ case TVSHOW_FAN_CLUB_LETTER:
+ sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->fanclubLetter.species, i);
+ break;
+ case TVSHOW_RECENT_HAPPENINGS:
+ break;
+ case TVSHOW_PKMN_FAN_CLUB_OPINIONS:
+ sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->fanclubOpinions.species, i);
+ break;
+ case TVSHOW_UNKN_SHOWTYPE_04:
+ sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->unkShow04.var06, i);
+ break;
+ case TVSHOW_NAME_RATER_SHOW:
+ sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->nameRaterShow.species, i);
+ sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->nameRaterShow.randomSpecies, i);
+ break;
+ case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE:
+ sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->bravoTrainer.species, i);
+ break;
+ case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE:
+ sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->bravoTrainerTower.species, i);
+ sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->bravoTrainerTower.defeatedSpecies, i);
+ break;
+
+ case TVSHOW_POKEMON_TODAY_CAUGHT:
+ sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->pokemonToday.species, i);
+ break;
+ case TVSHOW_SMART_SHOPPER:
+ break;
+ case TVSHOW_POKEMON_TODAY_FAILED:
+ sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->pokemonTodayFailed.species, i);
+ sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->pokemonTodayFailed.species2, i);
+ break;
+ case TVSHOW_FISHING_ADVICE:
+ sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->pokemonAngler.species, i);
+ break;
+ case TVSHOW_WORLD_OF_MASTERS:
+ sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->worldOfMasters.species, i);
+ sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->worldOfMasters.caughtPoke, i);
+ break;
+
+ case TVSHOW_TODAYS_RIVAL_TRAINER:
+ break;
+ case TVSHOW_TREND_WATCHER:
+ break;
+ case TVSHOW_TREASURE_INVESTIGATORS:
+ break;
+ case TVSHOW_FIND_THAT_GAMER:
+ break;
+ case TVSHOW_BREAKING_NEWS:
+ sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->breakingNews.lastOpponentSpecies, i);
+ sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->breakingNews.poke1Species, i);
+ break;
+ case TVSHOW_SECRET_BASE_VISIT:
+ sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->secretBaseVisit.species, i);
+ break;
+ case TVSHOW_LOTTO_WINNER:
+ break;
+ case TVSHOW_BATTLE_SEMINAR:
+ sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->battleSeminar.species, i);
+ sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->battleSeminar.foeSpecies, i);
+ break;
+ case TVSHOW_TRAINER_FAN_CLUB:
+ break;
+ case TVSHOW_CUTIES:
+ break;
+ case TVSHOW_FRONTIER:
+ sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->frontier.species1, i);
+ sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->frontier.species2, i);
+ switch ((&gSaveBlock1Ptr->tvShows[i])->frontier.facility)
+ {
+ case 3:
+ case 4:
+ break;
+ case 1:
+ case 5 ... 13:
+ sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->frontier.species3, i);
+ break;
+ case 2:
+ sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->frontier.species3, i);
+ sub_80F0B24((&gSaveBlock1Ptr->tvShows[i])->frontier.species4, i);
+ break;
+ }
+ break;
+ case TVSHOW_NUMBER_ONE:
+ break;
+ case TVSHOW_SECRET_BASE_SECRETS:
+ break;
+ case TVSHOW_SAFARI_FAN_CLUB:
+ break;
+
+ case TVSHOW_MASS_OUTBREAK:
+ break;
+
+ default:
+ sub_80F0B00(i);
+ break;
+ }
+ }
+}
+#else
+__attribute__((naked)) void sub_80F0708(void)
+{
+ asm_unified("\tpush {r4-r7,lr}\n"
+ "\tmov r7, r9\n"
+ "\tmov r6, r8\n"
+ "\tpush {r6,r7}\n"
+ "\tsub sp, 0x8\n"
+ "\tmovs r0, 0\n"
+ "\tmov r9, r0\n"
+ "_080F0716:\n"
+ "\tldr r3, =gSaveBlock1Ptr\n"
+ "\tldr r1, [r3]\n"
+ "\tmov r4, r9\n"
+ "\tlsls r2, r4, 3\n"
+ "\tadds r0, r2, r4\n"
+ "\tlsls r0, 2\n"
+ "\tadds r1, r0\n"
+ "\tldr r0, =0x000027cc\n"
+ "\tadds r1, r0\n"
+ "\tldrb r0, [r1]\n"
+ "\tadds r7, r2, 0\n"
+ "\tcmp r0, 0x29\n"
+ "\tbls _080F0732\n"
+ "\tb _080F0AD8\n"
+ "_080F0732:\n"
+ "\tlsls r0, 2\n"
+ "\tldr r1, =_080F0748\n"
+ "\tadds r0, r1\n"
+ "\tldr r0, [r0]\n"
+ "\tmov pc, r0\n"
+ "\t.pool\n"
+ "\t.align 2, 0\n"
+ "_080F0748:\n"
+ "\t.4byte _080F0AE2_break @ TVSHOW_OFF_AIR\n"
+ "\t.4byte _080F0848 @ TVSHOW_FAN_CLUB_LETTER\n"
+ "\t.4byte _080F0AE2_break @ TVSHOW_RECENT_HAPPENINGS\n"
+ "\t.4byte _080F0860 @ TVSHOW_PKMN_FAN_CLUB_OPINIONS\n"
+ "\t.4byte _080F0878 @ TVSHOW_UNKN_SHOWTYPE_04\n"
+ "\t.4byte _080F0890 @ TVSHOW_NAME_RATER_SHOW\n"
+ "\t.4byte _080F08BC @ TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE\n"
+ "\t.4byte _080F08D4 @ TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE\n"
+ "\t.4byte _080F07F0 @ TVSHOW_CONTEST_LIVE_UPDATES\n"
+ "\t.4byte _080F0AE2_break @ TVSHOW_3_CHEERS_FOR_POKEBLOCKS\n"
+ "\t.4byte _080F081C @ TVSHOW_BATTLE_UPDATE\n"
+ "\t.4byte _080F0AE2_break @ TVSHOW_FAN_CLUB_SPECIAL\n"
+ "\t.4byte _080F0AE2_break @ TVSHOW_CONTEST_LIVE_UPDATES_2\n"
+ "\t.4byte _080F0AD8 @ \n"
+ "\t.4byte _080F0AD8 @ \n"
+ "\t.4byte _080F0AD8 @ \n"
+ "\t.4byte _080F0AD8 @ \n"
+ "\t.4byte _080F0AD8 @ \n"
+ "\t.4byte _080F0AD8 @ \n"
+ "\t.4byte _080F0AD8 @ \n"
+ "\t.4byte _080F0AD8 @ \n"
+ "\t.4byte _080F0900 @ TVSHOW_POKEMON_TODAY_CAUGHT\n"
+ "\t.4byte _080F0AE2_break @ TVSHOW_SMART_SHOPPER\n"
+ "\t.4byte _080F0918 @ TVSHOW_POKEMON_TODAY_FAILED\n"
+ "\t.4byte _080F0944 @ TVSHOW_FISHING_ADVICE\n"
+ "\t.4byte _080F095C @ TVSHOW_WORLD_OF_MASTERS\n"
+ "\t.4byte _080F0AE2_break @ TVSHOW_TODAYS_RIVAL_TRAINER\n"
+ "\t.4byte _080F0AE2_break @ TVSHOW_TREND_WATCHER\n"
+ "\t.4byte _080F0AE2_break @ TVSHOW_TREASURE_INVESTIGATORS\n"
+ "\t.4byte _080F0AE2_break @ TVSHOW_FIND_THAT_GAMER\n"
+ "\t.4byte _080F0974 @ TVSHOW_BREAKING_NEWS\n"
+ "\t.4byte _080F09A0 @ TVSHOW_SECRET_BASE_VISIT\n"
+ "\t.4byte _080F0AE2_break @ TVSHOW_LOTTO_WINNER\n"
+ "\t.4byte _080F09C0 @ TVSHOW_BATTLE_SEMINAR\n"
+ "\t.4byte _080F0AE2_break @ TVSHOW_TRAINER_FAN_CLUB\n"
+ "\t.4byte _080F0AE2_break @ TVSHOW_CUTIES\n"
+ "\t.4byte _080F09F4 @ TVSHOW_FRONTIER\n"
+ "\t.4byte _080F0AE2_break @ TVSHOW_NUMBER_ONE\n"
+ "\t.4byte _080F0AE2_break @ TVSHOW_SECRET_BASE_SECRETS\n"
+ "\t.4byte _080F0AE2_break @ TVSHOW_SAFARI_FAN_CLUB\n"
+ "\t.4byte _080F0AD8 @ \n"
+ "\t.4byte _080F0AE2_break @ TVSHOW_MASS_OUTBREAK\n"
+ "_080F07F0:\n"
+ "\tldr r0, [r3]\n"
+ "\tmov r1, r9\n"
+ "\tadds r4, r7, r1\n"
+ "\tlsls r4, 2\n"
+ "\tadds r0, r4, r0\n"
+ "\tldr r6, =0x000027cc\n"
+ "\tadds r0, r6\n"
+ "\tldrh r0, [r0, 0x12]\n"
+ "\tlsls r5, r1, 24\n"
+ "\tlsrs r5, 24\n"
+ "\tadds r1, r5, 0\n"
+ "\tstr r3, [sp, 0x4]\n"
+ "\tbl sub_80F0B24\n"
+ "\tldr r3, [sp, 0x4]\n"
+ "\tldr r0, [r3]\n"
+ "\tadds r4, r0\n"
+ "\tadds r4, r6\n"
+ "\tldrh r0, [r4, 0x2]\n"
+ "\tb _080F09E6\n"
+ "\t.pool\n"
+ "_080F081C:\n"
+ "\tldr r0, [r3]\n"
+ "\tmov r2, r9\n"
+ "\tadds r4, r7, r2\n"
+ "\tlsls r4, 2\n"
+ "\tadds r0, r4, r0\n"
+ "\tldr r6, =0x000027cc\n"
+ "\tadds r0, r6\n"
+ "\tldrh r0, [r0, 0x16]\n"
+ "\tlsls r5, r2, 24\n"
+ "\tlsrs r5, 24\n"
+ "\tadds r1, r5, 0\n"
+ "\tstr r3, [sp, 0x4]\n"
+ "\tbl sub_80F0B24\n"
+ "\tldr r3, [sp, 0x4]\n"
+ "\tldr r0, [r3]\n"
+ "\tadds r4, r0\n"
+ "\tadds r4, r6\n"
+ "\tldrh r0, [r4, 0x2]\n"
+ "\tb _080F09E6\n"
+ "\t.pool\n"
+ "_080F0848:\n"
+ "\tldr r0, [r3]\n"
+ "\tmov r4, r9\n"
+ "\tadds r1, r7, r4\n"
+ "\tlsls r1, 2\n"
+ "\tadds r1, r0\n"
+ "\tldr r0, =0x000027cc\n"
+ "\tadds r1, r0\n"
+ "\tldrh r0, [r1, 0x2]\n"
+ "\tb _080F09B0\n"
+ "\t.pool\n"
+ "_080F0860:\n"
+ "\tldr r0, [r3]\n"
+ "\tmov r2, r9\n"
+ "\tadds r1, r7, r2\n"
+ "\tlsls r1, 2\n"
+ "\tadds r1, r0\n"
+ "\tldr r4, =0x000027cc\n"
+ "\tadds r1, r4\n"
+ "\tldrh r0, [r1, 0x2]\n"
+ "\tlsls r1, r2, 24\n"
+ "\tb _080F09B2\n"
+ "\t.pool\n"
+ "_080F0878:\n"
+ "\tldr r0, [r3]\n"
+ "\tmov r2, r9\n"
+ "\tadds r1, r7, r2\n"
+ "\tlsls r1, 2\n"
+ "\tadds r1, r0\n"
+ "\tldr r4, =0x000027cc\n"
+ "\tadds r1, r4\n"
+ "\tldrh r0, [r1, 0x6]\n"
+ "\tlsls r1, r2, 24\n"
+ "\tb _080F09B2\n"
+ "\t.pool\n"
+ "_080F0890:\n"
+ "\tldr r0, [r3]\n"
+ "\tmov r1, r9\n"
+ "\tadds r4, r7, r1\n"
+ "\tlsls r4, 2\n"
+ "\tadds r0, r4, r0\n"
+ "\tldr r6, =0x000027cc\n"
+ "\tadds r0, r6\n"
+ "\tldrh r0, [r0, 0x2]\n"
+ "\tlsls r5, r1, 24\n"
+ "\tlsrs r5, 24\n"
+ "\tadds r1, r5, 0\n"
+ "\tstr r3, [sp, 0x4]\n"
+ "\tbl sub_80F0B24\n"
+ "\tldr r3, [sp, 0x4]\n"
+ "\tldr r0, [r3]\n"
+ "\tadds r4, r0\n"
+ "\tadds r4, r6\n"
+ "\tldrh r0, [r4, 0x1C]\n"
+ "\tb _080F09E6\n"
+ "\t.pool\n"
+ "_080F08BC:\n"
+ "\tldr r0, [r3]\n"
+ "\tmov r2, r9\n"
+ "\tadds r1, r7, r2\n"
+ "\tlsls r1, 2\n"
+ "\tadds r1, r0\n"
+ "\tldr r4, =0x000027cc\n"
+ "\tadds r1, r4\n"
+ "\tldrh r0, [r1, 0x2]\n"
+ "\tlsls r1, r2, 24\n"
+ "\tb _080F09B2\n"
+ "\t.pool\n"
+ "_080F08D4:\n"
+ "\tldr r0, [r3]\n"
+ "\tmov r1, r9\n"
+ "\tadds r4, r7, r1\n"
+ "\tlsls r4, 2\n"
+ "\tadds r0, r4, r0\n"
+ "\tldr r6, =0x000027cc\n"
+ "\tadds r0, r6\n"
+ "\tldrh r0, [r0, 0xA]\n"
+ "\tlsls r5, r1, 24\n"
+ "\tlsrs r5, 24\n"
+ "\tadds r1, r5, 0\n"
+ "\tstr r3, [sp, 0x4]\n"
+ "\tbl sub_80F0B24\n"
+ "\tldr r3, [sp, 0x4]\n"
+ "\tldr r0, [r3]\n"
+ "\tadds r4, r0\n"
+ "\tadds r4, r6\n"
+ "\tldrh r0, [r4, 0x14]\n"
+ "\tb _080F09E6\n"
+ "\t.pool\n"
+ "_080F0900:\n"
+ "\tldr r0, [r3]\n"
+ "\tmov r2, r9\n"
+ "\tadds r1, r7, r2\n"
+ "\tlsls r1, 2\n"
+ "\tadds r1, r0\n"
+ "\tldr r4, =0x000027cc\n"
+ "\tadds r1, r4\n"
+ "\tldrh r0, [r1, 0x10]\n"
+ "\tlsls r1, r2, 24\n"
+ "\tb _080F09B2\n"
+ "\t.pool\n"
+ "_080F0918:\n"
+ "\tldr r0, [r3]\n"
+ "\tmov r1, r9\n"
+ "\tadds r4, r7, r1\n"
+ "\tlsls r4, 2\n"
+ "\tadds r0, r4, r0\n"
+ "\tldr r6, =0x000027cc\n"
+ "\tadds r0, r6\n"
+ "\tldrh r0, [r0, 0xC]\n"
+ "\tlsls r5, r1, 24\n"
+ "\tlsrs r5, 24\n"
+ "\tadds r1, r5, 0\n"
+ "\tstr r3, [sp, 0x4]\n"
+ "\tbl sub_80F0B24\n"
+ "\tldr r3, [sp, 0x4]\n"
+ "\tldr r0, [r3]\n"
+ "\tadds r4, r0\n"
+ "\tadds r4, r6\n"
+ "\tldrh r0, [r4, 0xE]\n"
+ "\tb _080F09E6\n"
+ "\t.pool\n"
+ "_080F0944:\n"
+ "\tldr r0, [r3]\n"
+ "\tmov r2, r9\n"
+ "\tadds r1, r7, r2\n"
+ "\tlsls r1, 2\n"
+ "\tadds r1, r0\n"
+ "\tldr r4, =0x000027cc\n"
+ "\tadds r1, r4\n"
+ "\tldrh r0, [r1, 0x4]\n"
+ "\tlsls r1, r2, 24\n"
+ "\tb _080F09B2\n"
+ "\t.pool\n"
+ "_080F095C:\n"
+ "\tldr r0, [r3]\n"
+ "\tmov r1, r9\n"
+ "\tadds r4, r7, r1\n"
+ "\tlsls r4, 2\n"
+ "\tadds r0, r4, r0\n"
+ "\tldr r6, =0x000027cc\n"
+ "\tadds r0, r6\n"
+ "\tldrh r0, [r0, 0x8]\n"
+ "\tb _080F09D0\n"
+ "\t.pool\n"
+ "_080F0974:\n"
+ "\tldr r0, [r3]\n"
+ "\tmov r2, r9\n"
+ "\tadds r4, r7, r2\n"
+ "\tlsls r4, 2\n"
+ "\tadds r0, r4, r0\n"
+ "\tldr r6, =0x000027cc\n"
+ "\tadds r0, r6\n"
+ "\tldrh r0, [r0, 0x2]\n"
+ "\tlsls r5, r2, 24\n"
+ "\tlsrs r5, 24\n"
+ "\tadds r1, r5, 0\n"
+ "\tstr r3, [sp, 0x4]\n"
+ "\tbl sub_80F0B24\n"
+ "\tldr r3, [sp, 0x4]\n"
+ "\tldr r0, [r3]\n"
+ "\tadds r4, r0\n"
+ "\tadds r4, r6\n"
+ "\tldrh r0, [r4, 0xA]\n"
+ "\tb _080F09E6\n"
+ "\t.pool\n"
+ "_080F09A0:\n"
+ "\tldr r0, [r3]\n"
+ "\tmov r4, r9\n"
+ "\tadds r1, r7, r4\n"
+ "\tlsls r1, 2\n"
+ "\tadds r1, r0\n"
+ "\tldr r0, =0x000027cc\n"
+ "\tadds r1, r0\n"
+ "\tldrh r0, [r1, 0x8]\n"
+ "_080F09B0:\n"
+ "\tlsls r1, r4, 24\n"
+ "_080F09B2:\n"
+ "\tlsrs r1, 24\n"
+ "\tbl sub_80F0B24\n"
+ "\tb _080F0AE2_break\n"
+ "\t.pool\n"
+ "_080F09C0:\n"
+ "\tldr r0, [r3]\n"
+ "\tmov r1, r9\n"
+ "\tadds r4, r7, r1\n"
+ "\tlsls r4, 2\n"
+ "\tadds r0, r4, r0\n"
+ "\tldr r6, =0x000027cc\n"
+ "\tadds r0, r6\n"
+ "\tldrh r0, [r0, 0x6]\n"
+ "_080F09D0:\n"
+ "\tlsls r5, r1, 24\n"
+ "\tlsrs r5, 24\n"
+ "\tadds r1, r5, 0\n"
+ "\tstr r3, [sp, 0x4]\n"
+ "\tbl sub_80F0B24\n"
+ "\tldr r3, [sp, 0x4]\n"
+ "\tldr r0, [r3]\n"
+ "\tadds r4, r0\n"
+ "\tadds r4, r6\n"
+ "\tldrh r0, [r4, 0x4]\n"
+ "_080F09E6:\n"
+ "\tadds r1, r5, 0\n"
+ "\tbl sub_80F0B24\n"
+ "\tb _080F0AE2_break\n"
+ "\t.pool\n"
+ "_080F09F4:\n"
+ "\tldr r0, [r3]\n"
+ "\tmov r2, r9\n"
+ "\tadds r4, r7, r2\n"
+ "\tlsls r4, 2\n"
+ "\tadds r0, r4, r0\n"
+ "\tldr r5, =0x000027cc\n"
+ "\tadds r0, r5\n"
+ "\tldrh r0, [r0, 0x4]\n"
+ "\tlsls r2, 24\n"
+ "\tmov r8, r2\n"
+ "\tlsrs r6, r2, 24\n"
+ "\tadds r1, r6, 0\n"
+ "\tstr r3, [sp, 0x4]\n"
+ "\tbl sub_80F0B24\n"
+ "\tldr r3, [sp, 0x4]\n"
+ "\tldr r0, [r3]\n"
+ "\tadds r0, r4, r0\n"
+ "\tadds r0, r5\n"
+ "\tldrh r0, [r0, 0x6]\n"
+ "\tadds r1, r6, 0\n"
+ "\tbl sub_80F0B24\n"
+ "\tldr r3, [sp, 0x4]\n"
+ "\tldr r0, [r3]\n"
+ "\tadds r4, r0\n"
+ "\tadds r4, r5\n"
+ "\tldrb r0, [r4, 0xD]\n"
+ "\tsubs r0, 0x1\n"
+ "\tmov r6, r8\n"
+ "\tcmp r0, 0xC\n"
+ "\tbhi _080F0AE2_break\n"
+ "\tlsls r0, 2\n"
+ "\tldr r1, =_080F0A48\n"
+ "\tadds r0, r1\n"
+ "\tldr r0, [r0]\n"
+ "\tmov pc, r0\n"
+ "\t.pool\n"
+ "\t.align 2, 0\n"
+ "_080F0A48:\n"
+ "\t.4byte _080F0A7C\n"
+ "\t.4byte _080F0AA0\n"
+ "\t.4byte _080F0AE2_break\n"
+ "\t.4byte _080F0AE2_break\n"
+ "\t.4byte _080F0A7C\n"
+ "\t.4byte _080F0A7C\n"
+ "\t.4byte _080F0A7C\n"
+ "\t.4byte _080F0A7C\n"
+ "\t.4byte _080F0A7C\n"
+ "\t.4byte _080F0A7C\n"
+ "\t.4byte _080F0A7C\n"
+ "\t.4byte _080F0A7C\n"
+ "\t.4byte _080F0A7C\n"
+ "_080F0A7C:\n"
+ "\tldr r0, =gSaveBlock1Ptr\n"
+ "\tldr r1, [r0]\n"
+ "\tmov r4, r9\n"
+ "\tadds r0, r7, r4\n"
+ "\tlsls r0, 2\n"
+ "\tadds r0, r1\n"
+ "\tldr r1, =0x000027cc\n"
+ "\tadds r0, r1\n"
+ "\tldrh r0, [r0, 0x8]\n"
+ "\tlsrs r1, r6, 24\n"
+ "\tbl sub_80F0B24\n"
+ "\tb _080F0AE2_break\n"
+ "\t.pool\n"
+ "_080F0AA0:\n"
+ "\tldr r2, =gSaveBlock1Ptr\n"
+ "\tldr r0, [r2]\n"
+ "\tmov r1, r9\n"
+ "\tadds r4, r7, r1\n"
+ "\tlsls r4, 2\n"
+ "\tadds r0, r4, r0\n"
+ "\tldr r5, =0x000027cc\n"
+ "\tadds r0, r5\n"
+ "\tldrh r0, [r0, 0x8]\n"
+ "\tlsrs r6, 24\n"
+ "\tadds r1, r6, 0\n"
+ "\tstr r2, [sp]\n"
+ "\tbl sub_80F0B24\n"
+ "\tldr r2, [sp]\n"
+ "\tldr r0, [r2]\n"
+ "\tadds r4, r0\n"
+ "\tadds r4, r5\n"
+ "\tldrh r0, [r4, 0xA]\n"
+ "\tadds r1, r6, 0\n"
+ "\tbl sub_80F0B24\n"
+ "\tb _080F0AE2_break\n"
+ "\t.pool\n"
+ "_080F0AD8:\n"
+ "\tmov r2, r9\n"
+ "\tlsls r0, r2, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tbl sub_80F0B00\n"
+ "_080F0AE2_break:\n"
+ "\tmov r0, r9\n"
+ "\tadds r0, 0x1\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tmov r9, r0\n"
+ "\tcmp r0, 0x17\n"
+ "\tbhi _080F0AF2\n"
+ "\tb _080F0716\n"
+ "_080F0AF2:\n"
+ "\tadd sp, 0x8\n"
+ "\tpop {r3,r4}\n"
+ "\tmov r8, r3\n"
+ "\tmov r9, r4\n"
+ "\tpop {r4-r7}\n"
+ "\tpop {r0}\n"
+ "\tbx r0");
+}
+#endif
+
+void sub_80F0B00(u8 showIdx)
+{
+ gSaveBlock1Ptr->tvShows[showIdx].common.active = FALSE;
+}
+
+void sub_80F0B24(u16 species, u8 showIdx)
+{
+ if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), 0) == 0)
+ {
+ gSaveBlock1Ptr->tvShows[showIdx].common.active = FALSE;
+ }
+}
+
+void sub_80F0B64(void)
+{
+ u16 i;
+
+ if (FlagGet(SYS_GAME_CLEAR) != TRUE)
+ {
+ for (i = 0; i < 24; i ++)
+ {
+ if (gSaveBlock1Ptr->tvShows[i].common.kind == TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE)
+ {
+ gSaveBlock1Ptr->tvShows[i].common.active = FALSE;
+ }
+ else if (gSaveBlock1Ptr->tvShows[i].common.kind == TVSHOW_MASS_OUTBREAK)
+ {
+ gSaveBlock1Ptr->tvShows[i].common.active = FALSE;
+ }
+ }
+ }
+}
+
+void sub_80F0BB8(void)
+{
+ u8 i;
+
+ for (i = 0; i < 5; i ++)
+ {
+ if (GetTVChannelByShowType(gSaveBlock1Ptr->tvShows[i].common.kind) == 2)
+ {
+ gSaveBlock1Ptr->tvShows[i].common.active = FALSE;
+ }
+ }
+}
+
+void sub_80F0C04(void)
+{
+ s8 i;
+ s8 ct;
+
+ ct = 0;
+ for (i = 5; i < 24; i ++)
+ {
+ if (gSaveBlock1Ptr->tvShows[i].common.kind == TVSHOW_OFF_AIR)
+ {
+ ct ++;
+ }
+ }
+ for (i = 0; i < 5 - ct; i ++)
+ {
+ DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, i + 5);
+ }
+}
+
+void sub_80F0C7C(void *src, u32 size, u8 masterIdx)
+{
+ u8 i;
+ PokeNews (*rmBuffer2)[4][16];
+ PokeNews (*rmBuffer)[4][16];
+
+ rmBuffer2 = malloc(4 * 16 * sizeof(PokeNews));
+ if (rmBuffer2 != NULL)
+ {
+ for (i = 0; i < 4; i ++)
+ {
+ memcpy((*rmBuffer2)[i], src + i * size, sizeof((*rmBuffer2)[i]));
+ }
+ rmBuffer = rmBuffer2;
+ switch (masterIdx)
+ {
+ case 0:
+ sub_80F0D60(gSaveBlock1Ptr->pokeNews, (*rmBuffer)[1], (*rmBuffer)[2], (*rmBuffer)[3]);
+ break;
+ case 1:
+ sub_80F0D60((*rmBuffer)[0], gSaveBlock1Ptr->pokeNews, (*rmBuffer)[2], (*rmBuffer)[3]);
+ break;
+ case 2:
+ sub_80F0D60((*rmBuffer)[0], (*rmBuffer)[1], gSaveBlock1Ptr->pokeNews, (*rmBuffer)[3]);
+ break;
+ case 3:
+ sub_80F0D60((*rmBuffer)[0], (*rmBuffer)[1], (*rmBuffer)[2], gSaveBlock1Ptr->pokeNews);
+ break;
+ }
+ sub_80F0EEC();
+ sub_80F0F24();
+ free(rmBuffer2);
+ }
+}
+
+void sub_80F0D60(PokeNews player1[16], PokeNews player2[16], PokeNews player3[16], PokeNews player4[16])
+{
+ u8 i;
+ u8 j;
+ u8 k;
+ PokeNews **argslist[4];
+
+ argslist[0] = &player1;
+ argslist[1] = &player2;
+ argslist[2] = &player3;
+ argslist[3] = &player4;
+ sTVShowNewsMixingNumPlayers = GetLinkPlayerCount();
+ for (i = 0; i < 16; i ++)
+ {
+ for (j = 0; j < sTVShowNewsMixingNumPlayers; j ++)
+ {
+ sTVShowMixingCurSlot = sub_80F0ECC(*argslist[j], i);
+ if (sTVShowMixingCurSlot != -1)
+ {
+ for (k = 0; k < sTVShowNewsMixingNumPlayers - 1; k++)
+ {
+ sCurTVShowSlot = sub_80EEE30(*argslist[(j + k + 1) % sTVShowNewsMixingNumPlayers]);
+ if (sCurTVShowSlot != -1)
+ {
+ sub_80F0E58(argslist[(j + k + 1) % sTVShowNewsMixingNumPlayers], argslist[j]);
+ }
+ }
+ }
+ }
+ }
+}
+
+void sub_80F0E58(PokeNews *dest[16], PokeNews *src[16])
+{
+ PokeNews *ptr1;
+ PokeNews *ptr2;
+
+ ptr1 = *dest;
+ ptr2 = *src;
+ ptr2 += sTVShowMixingCurSlot;
+ sub_80F0E84(ptr1, ptr2, sCurTVShowSlot);
+}
+
+bool8 sub_80F0E84(PokeNews *dest, PokeNews *src, s8 slot)
+{
+ u8 i;
+ u8 kind;
+
+ if (src->kind == POKENEWS_NONE)
+ {
+ return FALSE;
+ }
+ for (i = 0; i < 16; i ++)
+ {
+ if (dest[i].kind == src->kind)
+ {
+ return FALSE;
+ }
+ }
+ dest[slot].kind = src->kind;
+ dest[slot].state = 1;
+ dest[slot].days = src->days;
+ return TRUE;
+}
+
+s8 sub_80F0ECC(PokeNews *pokeNews, u8 idx)
+{
+ if (pokeNews[idx].kind == POKENEWS_NONE)
+ {
+ return -1;
+ }
+ return idx;
+}
+
+void sub_80F0EEC(void)
+{
+ u8 i;
+
+ for (i = 0; i < 16; i ++)
+ {
+ if (gSaveBlock1Ptr->pokeNews[i].kind > POKENEWS_BLENDMASTER)
+ {
+ ClearPokemonNewsI(i);
+ }
+ }
+ sub_80EEEB8();
+}
+
+void sub_80F0F24(void)
+{
+ u8 i;
+
+ if (FlagGet(SYS_GAME_CLEAR) != TRUE)
+ {
+ for (i = 0; i < 16; i ++)
+ {
+ gSaveBlock1Ptr->pokeNews[i].state = 0;
+ }
+ }
+}
+
+#define tvlangfix(strptr, langptr, langfix) \
+if (IsStringJapanese(strptr)) \
+{ \
+ (langptr) = LANGUAGE_JAPANESE; \
+} \
+else \
+{ \
+ (langptr) = langfix; \
+}
+
+void sub_80F0F64(TVShow *show, u32 language)
+{
+ int i;
+ TVShow **r4;
+
+ r4 = calloc(11, sizeof(TVShow *));
+ for (i = 0; i < 24; i ++)
+ {
+ switch (show[i].common.kind)
+ {
+ case TVSHOW_FAN_CLUB_LETTER:
+ case TVSHOW_RECENT_HAPPENINGS:
+ r4[0] = &show[i];
+ tvlangfix(r4[0]->fanclubLetter.playerName, r4[0]->fanclubLetter.language, language);
+ break;
+ case TVSHOW_PKMN_FAN_CLUB_OPINIONS:
+ r4[1] = &show[i];
+ tvlangfix(r4[1]->fanclubOpinions.playerName, r4[1]->fanclubOpinions.language, language);
+ tvlangfix(r4[1]->fanclubOpinions.nickname, r4[1]->fanclubOpinions.pokemonNameLanguage, language);
+ break;
+ case TVSHOW_POKEMON_TODAY_CAUGHT:
+ r4[6] = &show[i];
+ tvlangfix(r4[6]->pokemonToday.playerName, r4[6]->pokemonToday.language, language);
+ tvlangfix(r4[6]->pokemonToday.nickname, r4[6]->pokemonToday.language2, language);
+ break;
+ case TVSHOW_SMART_SHOPPER:
+ r4[7] = &show[i];
+ tvlangfix(r4[7]->smartshopperShow.playerName, r4[7]->smartshopperShow.language, language);
+ break;
+ case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE:
+ r4[5] = &show[i];
+ tvlangfix(r4[5]->bravoTrainerTower.trainerName, r4[5]->bravoTrainerTower.language, language);
+ tvlangfix(r4[5]->bravoTrainerTower.pokemonName, r4[5]->bravoTrainerTower.pokemonNameLanguage, language);
+ break;
+ case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE:
+ r4[4] = &show[i];
+ tvlangfix(r4[4]->bravoTrainer.playerName, r4[4]->bravoTrainer.language, language);
+ tvlangfix(r4[4]->bravoTrainer.pokemonNickname, r4[4]->bravoTrainer.pokemonNameLanguage, language);
+ break;
+ case TVSHOW_NAME_RATER_SHOW:
+ r4[3] = &show[i];
+ tvlangfix(r4[3]->nameRaterShow.trainerName, r4[3]->nameRaterShow.language, language);
+ tvlangfix(r4[3]->nameRaterShow.pokemonName, r4[3]->nameRaterShow.pokemonNameLanguage, language);
+ break;
+ case TVSHOW_POKEMON_TODAY_FAILED:
+ r4[2] = &show[i];
+ tvlangfix(r4[2]->pokemonTodayFailed.playerName, r4[2]->pokemonTodayFailed.language, language);
+ break;
+ case TVSHOW_FISHING_ADVICE:
+ r4[8] = &show[i];
+ tvlangfix(r4[8]->pokemonAngler.playerName, r4[8]->pokemonAngler.language, language);
+ break;
+ case TVSHOW_WORLD_OF_MASTERS:
+ r4[9] = &show[i];
+ tvlangfix(r4[9]->worldOfMasters.playerName, r4[9]->worldOfMasters.language, language);
+ break;
+ case TVSHOW_MASS_OUTBREAK:
+ r4[10] = &show[i];
+ r4[10]->massOutbreak.language = language;
+ break;
+ }
+ }
+ free(r4);
+}
+
+void sub_80F1208(TVShow *shows)
+{
+ TVShow *curShow;
+
+ sub_80F14F8(shows);
+ for (curShow = shows; curShow < shows + 24; curShow ++)
+ {
+ if (curShow->bravoTrainerTower.kind == TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE)
+ {
+ if ((curShow->bravoTrainerTower.language == LANGUAGE_JAPANESE && curShow->bravoTrainerTower.pokemonNameLanguage != LANGUAGE_JAPANESE) || (curShow->bravoTrainerTower.language != LANGUAGE_JAPANESE && curShow->bravoTrainerTower.pokemonNameLanguage == LANGUAGE_JAPANESE))
+ {
+ memset(curShow, 0, sizeof(TVShow));
+ }
+ }
+ }
+}
+
+void sub_80F1254(TVShow *shows)
+{
+ TVShow *curShow;
+
+ for (curShow = shows; curShow < shows + 24; curShow ++)
+ {
+ if (curShow->bravoTrainerTower.kind == TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE)
+ {
+ if (IsStringJapanese(curShow->bravoTrainerTower.pokemonName))
+ {
+ curShow->bravoTrainerTower.pokemonNameLanguage = LANGUAGE_JAPANESE;
+ }
+ else
+ {
+ curShow->bravoTrainerTower.pokemonNameLanguage = LANGUAGE_ENGLISH;
+ }
+ }
+ }
+}
+
+u8 TV_GetStringLanguage(u8 *str)
+{
+ return IsStringJapanese(str) ? LANGUAGE_JAPANESE : LANGUAGE_ENGLISH;
+}
+
+void sub_80F12A4(TVShow *shows)
+{
+ TVShow *curShow;
+
+ for (curShow = shows; curShow < shows + 24; curShow ++)
+ {
+ switch(curShow->common.kind)
+ {
+ case TVSHOW_FAN_CLUB_LETTER:
+ curShow->fanclubLetter.language = TV_GetStringLanguage(curShow->fanclubLetter.playerName);
+ break;
+ case TVSHOW_RECENT_HAPPENINGS:
+ curShow->recentHappenings.language = TV_GetStringLanguage(curShow->recentHappenings.playerName);
+ break;
+ case TVSHOW_PKMN_FAN_CLUB_OPINIONS:
+ curShow->fanclubOpinions.language = TV_GetStringLanguage(curShow->fanclubOpinions.playerName);
+ curShow->fanclubOpinions.pokemonNameLanguage = TV_GetStringLanguage(curShow->fanclubOpinions.nickname);
+ break;
+ case TVSHOW_UNKN_SHOWTYPE_04:
+ curShow->unkShow04.language = TV_GetStringLanguage(curShow->unkShow04.string_0b);
+ break;
+ case TVSHOW_NAME_RATER_SHOW:
+ curShow->nameRaterShow.language = TV_GetStringLanguage(curShow->nameRaterShow.trainerName);
+ curShow->nameRaterShow.pokemonNameLanguage = TV_GetStringLanguage(curShow->nameRaterShow.pokemonName);
+ break;
+ case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE:
+ curShow->bravoTrainer.language = TV_GetStringLanguage(curShow->bravoTrainer.playerName);
+ curShow->bravoTrainer.pokemonNameLanguage = TV_GetStringLanguage(curShow->bravoTrainer.pokemonNickname);
+ break;
+ case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE:
+ curShow->bravoTrainerTower.language = TV_GetStringLanguage(curShow->bravoTrainerTower.trainerName);
+ curShow->bravoTrainerTower.pokemonNameLanguage = TV_GetStringLanguage(curShow->bravoTrainerTower.pokemonName);
+ break;
+ case TVSHOW_CONTEST_LIVE_UPDATES:
+ curShow->contestLiveUpdates.language = TV_GetStringLanguage(curShow->contestLiveUpdates.playerName);
+ curShow->contestLiveUpdates.winningTrainerLanguage = TV_GetStringLanguage(curShow->contestLiveUpdates.winningTrainerName);
+ break;
+ case TVSHOW_3_CHEERS_FOR_POKEBLOCKS:
+ curShow->threeCheers.language = TV_GetStringLanguage(curShow->threeCheers.playerName);
+ curShow->threeCheers.worstBlenderLanguage = TV_GetStringLanguage(curShow->threeCheers.worstBlenderName);
+ break;
+ case TVSHOW_BATTLE_UPDATE:
+ curShow->battleUpdate.language = TV_GetStringLanguage(curShow->battleUpdate.playerName);
+ curShow->battleUpdate.linkOpponentLanguage = TV_GetStringLanguage(curShow->battleUpdate.linkOpponentName);
+ break;
+ case TVSHOW_FAN_CLUB_SPECIAL:
+ curShow->fanClubSpecial.language = TV_GetStringLanguage(curShow->fanClubSpecial.playerName);
+ curShow->fanClubSpecial.idolNameLanguage = TV_GetStringLanguage(curShow->fanClubSpecial.idolName);
+ break;
+ case TVSHOW_CONTEST_LIVE_UPDATES_2:
+ curShow->contestLiveUpdates2.language = TV_GetStringLanguage(curShow->contestLiveUpdates2.playerName);
+ curShow->contestLiveUpdates2.pokemonNameLanguage = TV_GetStringLanguage(curShow->contestLiveUpdates2.nickname);
+ break;
+
+ case TVSHOW_POKEMON_TODAY_CAUGHT:
+ curShow->pokemonToday.language = TV_GetStringLanguage(curShow->pokemonToday.playerName);
+ curShow->pokemonToday.language2 = TV_GetStringLanguage(curShow->pokemonToday.nickname);
+ break;
+ case TVSHOW_SMART_SHOPPER:
+ curShow->smartshopperShow.language = TV_GetStringLanguage(curShow->smartshopperShow.playerName);
+ break;
+ case TVSHOW_POKEMON_TODAY_FAILED:
+ curShow->pokemonTodayFailed.language = TV_GetStringLanguage(curShow->pokemonTodayFailed.playerName);
+ break;
+ case TVSHOW_FISHING_ADVICE:
+ curShow->pokemonAngler.language = TV_GetStringLanguage(curShow->pokemonAngler.playerName);
+ break;
+ case TVSHOW_WORLD_OF_MASTERS:
+ curShow->worldOfMasters.language = TV_GetStringLanguage(curShow->worldOfMasters.playerName);
+ break;
+ case TVSHOW_TREND_WATCHER:
+ curShow->trendWatcher.language = TV_GetStringLanguage(curShow->trendWatcher.playerName);
+ break;
+ case TVSHOW_BREAKING_NEWS:
+ curShow->breakingNews.language = TV_GetStringLanguage(curShow->breakingNews.playerName);
+ break;
+ case TVSHOW_BATTLE_SEMINAR:
+ curShow->battleSeminar.language = TV_GetStringLanguage(curShow->battleSeminar.playerName);
+ break;
+ case TVSHOW_FIND_THAT_GAMER:
+ case TVSHOW_TRAINER_FAN_CLUB:
+ curShow->trainerFanClub.language = TV_GetStringLanguage(curShow->trainerFanClub.playerName);
+ break;
+ case TVSHOW_CUTIES:
+ curShow->cuties.language = TV_GetStringLanguage(curShow->cuties.playerName);
+ curShow->cuties.pokemonNameLanguage = TV_GetStringLanguage(curShow->cuties.nickname);
+ break;
+ case TVSHOW_TODAYS_RIVAL_TRAINER:
+ case TVSHOW_SECRET_BASE_VISIT:
+ case TVSHOW_FRONTIER:
+ curShow->rivalTrainer.language = TV_GetStringLanguage(curShow->rivalTrainer.playerName);
+ break;
+ case TVSHOW_TREASURE_INVESTIGATORS:
+ case TVSHOW_LOTTO_WINNER:
+ case TVSHOW_NUMBER_ONE:
+ curShow->treasureInvestigators.language = TV_GetStringLanguage(curShow->treasureInvestigators.playerName);
+ break;
+ case TVSHOW_SECRET_BASE_SECRETS:
+ curShow->secretBaseSecrets.language = TV_GetStringLanguage(curShow->secretBaseSecrets.playerName);
+ curShow->secretBaseSecrets.baseOwnersNameLanguage = TV_GetStringLanguage(curShow->secretBaseSecrets.baseOwnersName);
+ break;
+ case TVSHOW_SAFARI_FAN_CLUB:
+ curShow->safariFanClub.language = TV_GetStringLanguage(curShow->safariFanClub.playerName);
+ break;
+ case TVSHOW_MASS_OUTBREAK:
+ break;
+ }
+ }
+}
+
+void sub_80F14F8(TVShow *shows)
+{
+ int i;
+
+ for (i = 0; i < 24; i ++)
+ {
+ switch (shows[i].common.kind)
+ {
+ case TVSHOW_WORLD_OF_MASTERS:
+ if (shows[i].worldOfMasters.location > 0x58)
+ {
+ memset(&shows[i], 0, sizeof(TVShow));
+ }
+ break;
+ case TVSHOW_POKEMON_TODAY_FAILED:
+ if (shows[i].pokemonTodayFailed.location > 0x58)
+ {
+ memset(&shows[i], 0, sizeof(TVShow));
+ }
+ break;
+ }
+ }
+}
+
+void DoTVShow(void)
+{
+ if (gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004].common.active)
+ {
+ switch (gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004].common.kind)
+ {
+ case TVSHOW_FAN_CLUB_LETTER:
+ DoTVShowPokemonFanClubLetter();
+ break;
+ case TVSHOW_RECENT_HAPPENINGS:
+ DoTVShowRecentHappenings();
+ break;
+ case TVSHOW_PKMN_FAN_CLUB_OPINIONS:
+ DoTVShowPokemonFanClubOpinions();
+ break;
+ case TVSHOW_UNKN_SHOWTYPE_04:
+ DoTVShowDummiedOut();
+ break;
+ case TVSHOW_MASS_OUTBREAK:
+ DoTVShowPokemonNewsMassOutbreak();
+ break;
+ case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE:
+ DoTVShowBravoTrainerPokemonProfile();
+ break;
+ case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE:
+ DoTVShowBravoTrainerBattleTower();
+ break;
+ case TVSHOW_POKEMON_TODAY_CAUGHT:
+ DoTVShowPokemonTodaySuccessfulCapture();
+ break;
+ case TVSHOW_SMART_SHOPPER:
+ DoTVShowTodaysSmartShopper();
+ break;
+ case TVSHOW_NAME_RATER_SHOW:
+ DoTVShowTheNameRaterShow();
+ break;
+ case TVSHOW_CONTEST_LIVE_UPDATES:
+ DoTVShowPokemonContestLiveUpdates();
+ break;
+ case TVSHOW_BATTLE_UPDATE:
+ DoTVShowPokemonBattleUpdate();
+ break;
+ case TVSHOW_3_CHEERS_FOR_POKEBLOCKS:
+ DoTVShow3CheersForPokeblocks();
+ break;
+ case TVSHOW_POKEMON_TODAY_FAILED:
+ DoTVShowPokemonTodayFailedCapture();
+ break;
+ case TVSHOW_FISHING_ADVICE:
+ DoTVShowPokemonAngler();
+ break;
+ case TVSHOW_WORLD_OF_MASTERS:
+ DoTVShowTheWorldOfMasters();
+ break;
+ case TVSHOW_TODAYS_RIVAL_TRAINER:
+ DoTVShowTodaysRivalTrainer();
+ break;
+ case TVSHOW_TREND_WATCHER:
+ DoTVShowDewfordTrendWatcherNetwork();
+ break;
+ case TVSHOW_TREASURE_INVESTIGATORS:
+ DoTVShowHoennTreasureInvestigators();
+ break;
+ case TVSHOW_FIND_THAT_GAMER:
+ DoTVShowFindThatGamer();
+ break;
+ case TVSHOW_BREAKING_NEWS:
+ DoTVShowBreakingNewsTV();
+ break;
+ case TVSHOW_SECRET_BASE_VISIT:
+ DoTVShowSecretBaseVisit();
+ break;
+ case TVSHOW_LOTTO_WINNER:
+ DoTVShowPokemonLotteryWinnerFlashReport();
+ break;
+ case TVSHOW_BATTLE_SEMINAR:
+ DoTVShowThePokemonBattleSeminar();
+ break;
+ case TVSHOW_FAN_CLUB_SPECIAL:
+ DoTVShowTrainerFanClubSpecial();
+ break;
+ case TVSHOW_TRAINER_FAN_CLUB:
+ DoTVShowTrainerFanClub();
+ break;
+ case TVSHOW_CUTIES:
+ DoTVShowSpotTheCuties();
+ break;
+ case TVSHOW_FRONTIER:
+ DoTVShowPokemonNewsBattleFrontier();
+ break;
+ case TVSHOW_NUMBER_ONE:
+ DoTVShowWhatsNo1InHoennToday();
+ break;
+ case TVSHOW_SECRET_BASE_SECRETS:
+ DoTVShowSecretBaseSecrets();
+ break;
+ case TVSHOW_SAFARI_FAN_CLUB:
+ DoTVShowSafariFanClub();
+ break;
+ case TVSHOW_CONTEST_LIVE_UPDATES_2:
+ DoTVShowPokemonContestLiveUpdates2();
+ break;
+ }
+ }
+}
+
+void DoTVShowBravoTrainerPokemonProfile(void)
+{
+ TVShow *show;
+ u8 state;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gScriptResult = FALSE;
+ state = sTVShowState;
+ switch (state)
+ {
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language);
+ CopyContestCategoryToStringVar(1, show->bravoTrainer.contestCategory);
+ CopyContestRankToStringVar(2, show->bravoTrainer.contestRank);
+ if (!StringCompare(gSpeciesNames[show->bravoTrainer.species], show->bravoTrainer.pokemonNickname))
+ sTVShowState = 8;
+ else
+ sTVShowState = 1;
+ break;
+ case 1:
+ StringCopy(gStringVar1, gSpeciesNames[show->bravoTrainer.species]);
+ TVShowConvertInternationalString(gStringVar2, show->bravoTrainer.pokemonNickname, show->bravoTrainer.pokemonNameLanguage);
+ CopyContestCategoryToStringVar(2, show->bravoTrainer.contestCategory);
+ sTVShowState = 2;
+ break;
+ case 2:
+ TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language);
+ if (show->bravoTrainer.contestResult == 0) // placed first
+ sTVShowState = 3;
+ else
+ sTVShowState = 4;
+ break;
+ case 3:
+ TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language);
+ CopyEasyChatWord(gStringVar2, show->bravoTrainer.words[0]);
+ TV_PrintIntToStringVar(2, show->bravoTrainer.contestResult + 1);
+ sTVShowState = 5;
+ break;
+ case 4:
+ TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language);
+ CopyEasyChatWord(gStringVar2, show->bravoTrainer.words[0]);
+ TV_PrintIntToStringVar(2, show->bravoTrainer.contestResult + 1);
+ sTVShowState = 5;
+ break;
+ case 5:
+ TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language);
+ CopyContestCategoryToStringVar(1, show->bravoTrainer.contestCategory);
+ CopyEasyChatWord(gStringVar3, show->bravoTrainer.words[1]);
+ if (show->bravoTrainer.move)
+ sTVShowState = 6;
+ else
+ sTVShowState = 7;
+ break;
+ case 6:
+ StringCopy(gStringVar1, gSpeciesNames[show->bravoTrainer.species]);
+ StringCopy(gStringVar2, gMoveNames[show->bravoTrainer.move]);
+ CopyEasyChatWord(gStringVar3, show->bravoTrainer.words[1]);
+ sTVShowState = 7;
+ break;
+ case 7:
+ TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainer.species]);
+ TVShowDone();
+ break;
+ case 8:
+ StringCopy(gStringVar1, gSpeciesNames[show->bravoTrainer.species]);
+ sTVShowState = 2;
+ break;
+ }
+ ShowFieldMessage(sTVBravoTrainerTextGroup[state]);
+}
+
+void DoTVShowBravoTrainerBattleTower(void)
+{
+ TVShow *show;
+ u8 state;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gScriptResult = FALSE;
+ state = sTVShowState;
+ switch(state)
+ {
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.trainerName, show->bravoTrainerTower.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainerTower.species]);
+ if (show->bravoTrainerTower.numFights >= 7)
+ sTVShowState = 1;
+ else
+ sTVShowState = 2;
+ break;
+ case 1:
+ if (show->bravoTrainerTower.btLevel == 50)
+ {
+ StringCopy(gStringVar1, gText_Lv50);
+ }
+ else
+ {
+ StringCopy(gStringVar1, gText_OpenLevel);
+ }
+ TV_PrintIntToStringVar(1, show->bravoTrainerTower.numFights);
+ if (show->bravoTrainerTower.wonTheChallenge == TRUE)
+ sTVShowState = 3;
+ else
+ sTVShowState = 4;
+ break;
+ case 2:
+ TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage);
+ TV_PrintIntToStringVar(1, show->bravoTrainerTower.numFights + 1);
+ if (show->bravoTrainerTower.interviewResponse == 0)
+ sTVShowState = 5;
+ else
+ sTVShowState = 6;
+ break;
+ case 3:
+ TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage);
+ StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainerTower.defeatedSpecies]);
+ if (show->bravoTrainerTower.interviewResponse == 0)
+ sTVShowState = 5;
+ else
+ sTVShowState = 6;
+ break;
+ case 4:
+ TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage);
+ StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainerTower.defeatedSpecies]);
+ if (show->bravoTrainerTower.interviewResponse == 0)
+ sTVShowState = 5;
+ else
+ sTVShowState = 6;
+ break;
+ case 5:
+ TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage);
+ sTVShowState = 11;
+ break;
+ case 6:
+ TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage);
+ sTVShowState = 11;
+ break;
+ case 7:
+ sTVShowState = 11;
+ break;
+ case 8:
+ case 9:
+ case 10:
+ TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.trainerName, show->bravoTrainerTower.language);
+ sTVShowState = 11;
+ break;
+ case 11:
+ CopyEasyChatWord(gStringVar1, show->bravoTrainerTower.words[0]);
+ if (show->bravoTrainerTower.interviewResponse == 0)
+ sTVShowState = 12;
+ else
+ sTVShowState = 13;
+ break;
+ case 12:
+ case 13:
+ CopyEasyChatWord(gStringVar1, show->bravoTrainerTower.words[0]);
+ TVShowConvertInternationalString(gStringVar2, show->bravoTrainerTower.trainerName, show->bravoTrainerTower.language);
+ TVShowConvertInternationalString(gStringVar3, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage);
+ sTVShowState = 14;
+ break;
+ case 14:
+ TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.trainerName, show->bravoTrainerTower.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainerTower.species]);
+ TVShowDone();
+ break;
+ }
+ ShowFieldMessage(sTVBravoTrainerBattleTowerTextGroup[state]);
+}
+
+void DoTVShowTodaysSmartShopper(void)
+{
+ TVShow *show;
+ u8 state;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gScriptResult = FALSE;
+ state = sTVShowState;
+ switch(state)
+ {
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->smartshopperShow.playerName, show->smartshopperShow.language);
+ GetMapName(gStringVar2, show->smartshopperShow.shopLocation, 0);
+ if (show->smartshopperShow.itemAmounts[0] >= 255)
+ {
+ sTVShowState = 11;
+ }
+ else
+ {
+ sTVShowState = 1;
+ }
+ break;
+ case 1:
+ TVShowConvertInternationalString(gStringVar1, show->smartshopperShow.playerName, show->smartshopperShow.language);
+ StringCopy(gStringVar2, ItemId_GetItem(show->smartshopperShow.itemIds[0])->name);
+ TV_PrintIntToStringVar(2, show->smartshopperShow.itemAmounts[0]);
+ sTVShowState += 1 + (Random() % 4);
+ break;
+ case 2:
+ case 4:
+ case 5:
+ if (show->smartshopperShow.itemIds[1] != ITEM_NONE)
+ {
+ sTVShowState = 6;
+ }
+ else
+ {
+ sTVShowState = 10;
+ }
+ break;
+ case 3:
+ TV_PrintIntToStringVar(2, show->smartshopperShow.itemAmounts[0] + 1);
+ if (show->smartshopperShow.itemIds[1] != ITEM_NONE)
+ {
+ sTVShowState = 6;
+ }
+ else
+ {
+ sTVShowState = 10;
+ }
+ break;
+ case 6:
+ StringCopy(gStringVar2, ItemId_GetItem(show->smartshopperShow.itemIds[1])->name);
+ TV_PrintIntToStringVar(2, show->smartshopperShow.itemAmounts[1]);
+ if (show->smartshopperShow.itemIds[2] != ITEM_NONE)
+ {
+ sTVShowState = 7;
+ }
+ else if (show->smartshopperShow.priceReduced == TRUE)
+ {
+ sTVShowState = 8;
+ }
+ else
+ {
+ sTVShowState = 9;
+ }
+ break;
+ case 7:
+ StringCopy(gStringVar2, ItemId_GetItem(show->smartshopperShow.itemIds[2])->name);
+ TV_PrintIntToStringVar(2, show->smartshopperShow.itemAmounts[2]);
+ if (show->smartshopperShow.priceReduced == TRUE)
+ {
+ sTVShowState = 8;
+ }
+ else
+ {
+ sTVShowState = 9;
+ }
+ break;
+ case 8:
+ if (show->smartshopperShow.itemAmounts[0] >= 255)
+ {
+ sTVShowState = 12;
+ }
+ else
+ {
+ sTVShowState = 9;
+ }
+ break;
+ case 9:
+ sub_80EF40C(1, show);
+ TVShowDone();
+ break;
+ case 10:
+ if (show->smartshopperShow.priceReduced == TRUE)
+ {
+ sTVShowState = 8;
+ }
+ else
+ {
+ sTVShowState = 9;
+ }
+ break;
+ case 11:
+ TVShowConvertInternationalString(gStringVar1, show->smartshopperShow.playerName, show->smartshopperShow.language);
+ StringCopy(gStringVar2, ItemId_GetItem(show->smartshopperShow.itemIds[0])->name);
+ if (show->smartshopperShow.priceReduced == TRUE)
+ {
+ sTVShowState = 8;
+ }
+ else
+ {
+ sTVShowState = 12;
+ }
+ break;
+ case 12:
+ TVShowConvertInternationalString(gStringVar1, show->smartshopperShow.playerName, show->smartshopperShow.language);
+ TVShowDone();
+ break;
+ }
+ ShowFieldMessage(sTVTodaysSmartShopperTextGroup[state]);
+}
+
+void DoTVShowTheNameRaterShow(void)
+{
+ TVShow *show;
+ u8 state;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gScriptResult = FALSE;
+ state = sTVShowState;
+ switch (state)
+ {
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->nameRaterShow.trainerName, show->nameRaterShow.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->nameRaterShow.species]);
+ TVShowConvertInternationalString(gStringVar3, show->nameRaterShow.pokemonName, show->nameRaterShow.pokemonNameLanguage);
+ sTVShowState = TV_GetNicknameSumMod8(show) + 1;
+ break;
+ case 1:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ if (show->nameRaterShow.random == 0)
+ {
+ sTVShowState = 9;
+ }
+ else if (show->nameRaterShow.random == 1)
+ {
+ sTVShowState = 10;
+ }
+ else if (show->nameRaterShow.random == 2)
+ {
+ sTVShowState = 11;
+ }
+ break;
+ case 2:
+ TVShowConvertInternationalString(gStringVar1, show->nameRaterShow.trainerName, show->nameRaterShow.language);
+ if (show->nameRaterShow.random == 0)
+ {
+ sTVShowState = 9;
+ }
+ else if (show->nameRaterShow.random == 1)
+ {
+ sTVShowState = 10;
+ }
+ else if (show->nameRaterShow.random == 2)
+ {
+ sTVShowState = 11;
+ }
+ break;
+ case 9:
+ case 10:
+ case 11:
+ TVShowConvertInternationalString(gStringVar1, show->nameRaterShow.pokemonName, show->nameRaterShow.pokemonNameLanguage);
+ TV_GetNicknameSubstring(1, 0, 0, 1, 0, show);
+ TV_GetNicknameSubstring(2, 1, 0, 1, 0, show);
+ sTVShowState = 12;
+ break;
+ case 13:
+ TVShowConvertInternationalString(gStringVar1, show->nameRaterShow.trainerName, show->nameRaterShow.language);
+ TV_GetNicknameSubstring(1, 0, 2, 0, 0, show);
+ TV_GetNicknameSubstring(2, 0, 3, 1, 0, show);
+ sTVShowState = 14;
+ break;
+ case 14:
+ TV_GetNicknameSubstring(1, 0, 2, 1, 0, show);
+ TV_GetNicknameSubstring(2, 0, 3, 0, 0, show);
+ sTVShowState = 18;
+ break;
+ case 15:
+ TV_GetNicknameSubstring(0, 0, 2, 1, 0, show);
+ StringCopy(gStringVar2, gSpeciesNames[show->nameRaterShow.species]);
+ TV_GetNicknameSubstring(2, 0, 3, 2, show->nameRaterShow.species, show);
+ sTVShowState = 16;
+ break;
+ case 16:
+ TV_GetNicknameSubstring(0, 0, 2, 2, show->nameRaterShow.species, show);
+ TV_GetNicknameSubstring(2, 0, 3, 1, 0, show);
+ sTVShowState = 17;
+ break;
+ case 17:
+ TV_GetNicknameSubstring(0, 0, 2, 1, 0, show);
+ StringCopy(gStringVar2, gSpeciesNames[show->nameRaterShow.randomSpecies]);
+ TV_GetNicknameSubstring(2, 0, 3, 2, show->nameRaterShow.randomSpecies, show);
+ sTVShowState = 18;
+ break;
+ case 12:
+ state = 18;
+ sTVShowState = 18;
+ case 18:
+ TVShowConvertInternationalString(gStringVar1, show->nameRaterShow.pokemonName, show->nameRaterShow.pokemonNameLanguage);
+ TVShowDone();
+ break;
+ }
+ ShowFieldMessage(sTVNameRaterTextGroup[state]);
+}
+
+void DoTVShowPokemonTodaySuccessfulCapture(void)
+{
+ TVShow *show;
+ u8 state;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gScriptResult = FALSE;
+ state = sTVShowState;
+ switch (state)
+ {
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->pokemonToday.playerName, show->pokemonToday.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->pokemonToday.species]);
+ TVShowConvertInternationalString(gStringVar3, show->pokemonToday.nickname, show->pokemonToday.language2);
+ if (show->pokemonToday.ball == ITEM_MASTER_BALL)
+ {
+ sTVShowState = 5;
+ }
+ else
+ {
+ sTVShowState = 1;
+ }
+ break;
+ case 1:
+ sTVShowState = 2;
+ break;
+ case 2:
+ StringCopy(gStringVar2, ItemId_GetItem(show->pokemonToday.ball)->name);
+ TV_PrintIntToStringVar(2, show->pokemonToday.nBallsUsed);
+ if (show->pokemonToday.nBallsUsed < 4)
+ {
+ sTVShowState = 3;
+ }
+ else
+ {
+ sTVShowState = 4;
+ }
+ break;
+ case 3:
+ TVShowConvertInternationalString(gStringVar1, show->pokemonToday.playerName, show->pokemonToday.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->pokemonToday.species]);
+ TVShowConvertInternationalString(gStringVar3, show->pokemonToday.nickname, show->pokemonToday.language2);
+ sTVShowState = 6;
+ break;
+ case 4:
+ sTVShowState = 6;
+ break;
+ case 5:
+ TVShowConvertInternationalString(gStringVar1, show->pokemonToday.playerName, show->pokemonToday.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->pokemonToday.species]);
+ sTVShowState = 6;
+ break;
+ case 6:
+ TVShowConvertInternationalString(gStringVar1, show->pokemonToday.playerName, show->pokemonToday.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->pokemonToday.species]);
+ TVShowConvertInternationalString(gStringVar3, show->pokemonToday.nickname, show->pokemonToday.language2);
+ sTVShowState += 1 + (Random() % 4);
+ break;
+ case 7:
+ case 8:
+ StringCopy(gStringVar1, gSpeciesNames[show->pokemonToday.species]);
+ TVShowConvertInternationalString(gStringVar2, show->pokemonToday.nickname, show->pokemonToday.language2);
+ TV_GetSomeOtherSpeciesAlreadySeenByPlayer_AndPrintName(2, show->pokemonToday.species);
+ sTVShowState = 11;
+ break;
+ case 9:
+ case 10:
+ StringCopy(gStringVar1, gSpeciesNames[show->pokemonToday.species]);
+ TVShowConvertInternationalString(gStringVar2, show->pokemonToday.nickname, show->pokemonToday.language2);
+ sTVShowState = 11;
+ break;
+ case 11:
+ TVShowDone();
+ break;
+ }
+ ShowFieldMessage(sTVPokemonTodaySuccessfulTextGroup[state]);
+}
+
+void DoTVShowPokemonTodayFailedCapture(void)
+{
+ TVShow *show;
+ u8 state;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gScriptResult = FALSE;
+ state = sTVShowState;
+ switch (state)
+ {
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->pokemonTodayFailed.playerName, show->pokemonTodayFailed.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->pokemonTodayFailed.species]);
+ sTVShowState = 1;
+ break;
+ case 1:
+ TVShowConvertInternationalString(gStringVar1, show->pokemonTodayFailed.playerName, show->pokemonTodayFailed.language);
+ GetMapName(gStringVar2, show->pokemonTodayFailed.location, 0);
+ StringCopy(gStringVar3, gSpeciesNames[show->pokemonTodayFailed.species2]);
+ if (show->pokemonTodayFailed.outcome == 1)
+ {
+ sTVShowState = 3;
+ }
+ else
+ {
+ sTVShowState = 2;
+ }
+ break;
+ case 2:
+ case 3:
+ TVShowConvertInternationalString(gStringVar1, show->pokemonTodayFailed.playerName, show->pokemonTodayFailed.language);
+ TV_PrintIntToStringVar(1, show->pokemonTodayFailed.nBallsUsed);
+ if (Random() % 3 == 0)
+ {
+ sTVShowState = 5;
+ }
+ else
+ {
+ sTVShowState = 4;
+ }
+ break;
+ case 4:
+ case 5:
+ TVShowConvertInternationalString(gStringVar1, show->pokemonTodayFailed.playerName, show->pokemonTodayFailed.language);
+ sTVShowState = 6;
+ break;
+ case 6:
+ TVShowDone();
+ break;
+ }
+ ShowFieldMessage(sTVPokemonTodayFailedTextGroup[state]);
+}
+
+void DoTVShowPokemonFanClubLetter(void)
+{
+ TVShow *show;
+ u8 state;
+ u16 rval;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gScriptResult = FALSE;
+ state = sTVShowState;
+ switch (state)
+ {
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->fanclubLetter.playerName, show->fanclubLetter.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->fanclubLetter.species]);
+ sTVShowState = 50;
+ break;
+ case 1:
+ rval = (Random() % 4) + 1;
+ if (rval == 1)
+ sTVShowState = 2;
+ else
+ sTVShowState = rval + 2;
+ break;
+ case 2:
+ sTVShowState = 51;
+ break;
+ case 3:
+ sTVShowState += (Random() % 3) + 1;
+ break;
+ case 4:
+ case 5:
+ case 6:
+ TV_FanClubLetter_RandomWordToStringVar3(show);
+ sTVShowState = 7;
+ break;
+ case 7:
+ rval = (Random() % 0x1f) + 0x46;
+ TV_PrintIntToStringVar(2, rval);
+ TVShowDone();
+ break;
+ case 50:
+ ConvertEasyChatWordsToString(gStringVar4, show->fanclubLetter.words, 2, 2);
+ ShowFieldMessage(gStringVar4);
+ sTVShowState = 1;
+ return;
+ case 51:
+ ConvertEasyChatWordsToString(gStringVar4, show->fanclubLetter.words, 2, 2);
+ ShowFieldMessage(gStringVar4);
+ sTVShowState = 3;
+ return;
+ }
+ ShowFieldMessage(sTVFanClubTextGroup[state]);
+}
+
+void DoTVShowRecentHappenings(void)
+{
+ TVShow *show;
+ u8 state;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gScriptResult = FALSE;
+ state = sTVShowState;
+ switch (state)
+ {
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->recentHappenings.playerName, show->recentHappenings.language);
+ TV_FanClubLetter_RandomWordToStringVar3(show);
+ sTVShowState = 50;
+ break;
+ case 1:
+ sTVShowState += 1 + (Random() % 3);
+ break;
+ case 2:
+ case 3:
+ case 4:
+ sTVShowState = 5;
+ break;
+ case 5:
+ TVShowDone();
+ break;
+ case 50:
+ ConvertEasyChatWordsToString(gStringVar4, show->recentHappenings.words, 2, 2);
+ ShowFieldMessage(gStringVar4);
+ sTVShowState = 1;
+ return;
+ }
+ ShowFieldMessage(sTVRecentHappeninssTextGroup[state]);
+}
+
+void DoTVShowPokemonFanClubOpinions(void)
+{
+ TVShow *show;
+ u8 state;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gScriptResult = FALSE;
+ state = sTVShowState;
+ switch (state)
+ {
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->fanclubOpinions.playerName, show->fanclubOpinions.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->fanclubOpinions.species]);
+ TVShowConvertInternationalString(gStringVar3, show->fanclubOpinions.nickname, show->fanclubOpinions.pokemonNameLanguage);
+ sTVShowState = show->fanclubOpinions.questionAsked + 1;
+ break;
+ case 1:
+ case 2:
+ case 3:
+ TVShowConvertInternationalString(gStringVar1, show->fanclubOpinions.playerName, show->fanclubOpinions.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->fanclubOpinions.species]);
+ CopyEasyChatWord(gStringVar3, show->fanclubOpinions.words[0]);
+ sTVShowState = 4;
+ break;
+ case 4:
+ TVShowConvertInternationalString(gStringVar1, show->fanclubOpinions.playerName, show->fanclubOpinions.language);
+ CopyEasyChatWord(gStringVar3, show->fanclubOpinions.words[1]);
+ TVShowDone();
+ break;
+ }
+ ShowFieldMessage(sTVFanClubOpinionsTextGroup[state]);
+}
+
+void DoTVShowDummiedOut(void)
+{
+
+}
+
+void DoTVShowPokemonNewsMassOutbreak(void)
+{
+ TVShow *show;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ GetMapName(gStringVar1, show->massOutbreak.locationMapNum, 0);
+ StringCopy(gStringVar2, gSpeciesNames[show->massOutbreak.species]);
+ TVShowDone();
+ StartMassOutbreak();
+ ShowFieldMessage(sTVMassOutbreakTextGroup[sTVShowState]);
+}
+
+void DoTVShowPokemonContestLiveUpdates(void)
+{
+ TVShow *show;
+ u8 state;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gScriptResult = FALSE;
+ state = sTVShowState;
+ switch (state)
+ {
+ case 0:
+ sub_818E868(gStringVar1, show->contestLiveUpdates.category);
+ StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
+ TVShowConvertInternationalString(gStringVar3, show->contestLiveUpdates.playerName, show->contestLiveUpdates.language);
+ if (show->contestLiveUpdates.round1Rank == show->contestLiveUpdates.round2Rank)
+ {
+ if (show->contestLiveUpdates.round1Rank == 0)
+ {
+ sTVShowState = 1;
+ }
+ else
+ {
+ sTVShowState = 3;
+ }
+ }
+ else if (show->contestLiveUpdates.round1Rank > show->contestLiveUpdates.round2Rank)
+ {
+ sTVShowState = 2;
+ }
+ else
+ {
+ sTVShowState = 4;
+ }
+ break;
+ case 1:
+ StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
+ switch (show->contestLiveUpdates.appealFlags1)
+ {
+ case 0x01:
+ sTVShowState = 8;
+ break;
+ case 0x02:
+ sTVShowState = 5;
+ break;
+ case 0x04:
+ sTVShowState = 14;
+ break;
+ case 0x08:
+ sTVShowState = 7;
+ break;
+ case 0x10:
+ sTVShowState = 6;
+ break;
+ case 0x20:
+ sTVShowState = 20;
+ break;
+ case 0x40:
+ sTVShowState = 21;
+ break;
+ case 0x80:
+ sTVShowState = 22;
+ break;
+ }
+ break;
+ case 2:
+ StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
+ switch (show->contestLiveUpdates.appealFlags1)
+ {
+ case 0x01:
+ sTVShowState = 8;
+ break;
+ case 0x02:
+ sTVShowState = 5;
+ break;
+ case 0x04:
+ sTVShowState = 14;
+ break;
+ case 0x08:
+ sTVShowState = 7;
+ break;
+ case 0x10:
+ sTVShowState = 6;
+ break;
+ case 0x20:
+ sTVShowState = 20;
+ break;
+ case 0x40:
+ sTVShowState = 21;
+ break;
+ case 0x80:
+ sTVShowState = 22;
+ break;
+ }
+ break;
+ case 3:
+ StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
+ TVShowConvertInternationalString(gStringVar3, show->contestLiveUpdates.playerName, show->contestLiveUpdates.language);
+ switch (show->contestLiveUpdates.appealFlags1)
+ {
+ case 0x01:
+ sTVShowState = 8;
+ break;
+ case 0x02:
+ sTVShowState = 5;
+ break;
+ case 0x04:
+ sTVShowState = 14;
+ break;
+ case 0x08:
+ sTVShowState = 7;
+ break;
+ case 0x10:
+ sTVShowState = 6;
+ break;
+ case 0x20:
+ sTVShowState = 20;
+ break;
+ case 0x40:
+ sTVShowState = 21;
+ break;
+ case 0x80:
+ sTVShowState = 22;
+ break;
+ }
+ break;
+ case 4:
+ switch (show->contestLiveUpdates.category)
+ {
+ case 0:
+ StringCopy(gStringVar1, gText_Cool);
+ break;
+ case 1:
+ StringCopy(gStringVar1, gText_Beauty);
+ break;
+ case 2:
+ StringCopy(gStringVar1, gText_Cute);
+ break;
+ case 3:
+ StringCopy(gStringVar1, gText_Smart);
+ break;
+ case 4:
+ StringCopy(gStringVar1, gText_Tough);
+ break;
+ }
+ StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
+ switch (show->contestLiveUpdates.appealFlags1)
+ {
+ case 0x01:
+ sTVShowState = 8;
+ break;
+ case 0x02:
+ sTVShowState = 5;
+ break;
+ case 0x04:
+ sTVShowState = 14;
+ break;
+ case 0x08:
+ sTVShowState = 7;
+ break;
+ case 0x10:
+ sTVShowState = 6;
+ break;
+ case 0x20:
+ sTVShowState = 20;
+ break;
+ case 0x40:
+ sTVShowState = 21;
+ break;
+ case 0x80:
+ sTVShowState = 22;
+ break;
+ }
+ break;
+ case 5:
+ StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
+ sTVShowState = 23;
+ break;
+ case 6:
+ StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
+ sTVShowState = 23;
+ break;
+ case 7:
+ StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
+ sTVShowState = 23;
+ break;
+ case 8:
+ StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
+ switch (show->contestLiveUpdates.category)
+ {
+ case 0:
+ sTVShowState = 9;
+ break;
+ case 1:
+ sTVShowState = 10;
+ break;
+ case 2:
+ sTVShowState = 11;
+ break;
+ case 3:
+ sTVShowState = 12;
+ break;
+ case 4:
+ sTVShowState = 13;
+ break;
+ }
+ break;
+ case 9:
+ StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
+ sTVShowState = 23;
+ break;
+ case 10:
+ StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
+ sTVShowState = 23;
+ break;
+ case 11:
+ StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
+ sTVShowState = 23;
+ break;
+ case 12:
+ StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
+ sTVShowState = 23;
+ break;
+ case 13:
+ StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
+ sTVShowState = 23;
+ break;
+ case 14:
+ StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
+ switch (show->contestLiveUpdates.category)
+ {
+ case 0:
+ sTVShowState = 15;
+ break;
+ case 1:
+ sTVShowState = 16;
+ break;
+ case 2:
+ sTVShowState = 17;
+ break;
+ case 3:
+ sTVShowState = 18;
+ break;
+ case 4:
+ sTVShowState = 19;
+ break;
+ }
+ break;
+ case 15:
+ StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
+ sTVShowState = 23;
+ break;
+ case 16:
+ StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
+ sTVShowState = 23;
+ break;
+ case 17:
+ StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
+ sTVShowState = 23;
+ break;
+ case 18:
+ StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
+ sTVShowState = 23;
+ break;
+ case 19:
+ StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
+ sTVShowState = 23;
+ break;
+ case 20:
+ StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
+ sTVShowState = 23;
+ break;
+ case 21:
+ StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
+ sTVShowState = 23;
+ break;
+ case 22:
+ StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
+ StringCopy(gStringVar3, gMoveNames[show->contestLiveUpdates.move]);
+ sTVShowState = 23;
+ break;
+ case 23:
+ StringCopy(gStringVar1, gSpeciesNames[show->contestLiveUpdates.species]);
+ TVShowConvertInternationalString(gStringVar2, show->contestLiveUpdates.winningTrainerName, show->contestLiveUpdates.winningTrainerLanguage);
+ StringCopy(gStringVar3, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
+ switch (show->contestLiveUpdates.appealFlags2)
+ {
+ case 0x01:
+ sTVShowState = 31;
+ break;
+ case 0x02:
+ sTVShowState = 30;
+ break;
+ case 0x04:
+ sTVShowState = 29;
+ break;
+ case 0x08:
+ sTVShowState = 28;
+ break;
+ case 0x10:
+ sTVShowState = 27;
+ break;
+ case 0x20:
+ sTVShowState = 26;
+ break;
+ case 0x40:
+ sTVShowState = 25;
+ break;
+ case 0x80:
+ sTVShowState = 24;
+ break;
+ }
+ break;
+ case 24:
+ StringCopy(gStringVar1, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
+ sTVShowState = 32;
+ break;
+ case 25:
+ TVShowConvertInternationalString(gStringVar1, show->contestLiveUpdates.winningTrainerName, show->contestLiveUpdates.winningTrainerLanguage);
+ StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
+ sTVShowState = 32;
+ break;
+ case 28:
+ sTVShowState = 32;
+ break;
+ case 29:
+ TVShowConvertInternationalString(gStringVar1, show->contestLiveUpdates.playerName, show->contestLiveUpdates.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
+ TVShowConvertInternationalString(gStringVar3, show->contestLiveUpdates.winningTrainerName, show->contestLiveUpdates.winningTrainerLanguage);
+ sTVShowState = 32;
+ break;
+ case 26:
+ case 27:
+ case 30:
+ case 31:
+ TVShowConvertInternationalString(gStringVar1, show->contestLiveUpdates.winningTrainerName, show->contestLiveUpdates.winningTrainerLanguage);
+ sTVShowState = 32;
+ break;
+ case 32:
+
+ TVShowConvertInternationalString(gStringVar1, show->contestLiveUpdates.playerName, show->contestLiveUpdates.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
+ TVShowDone();
+ break;
+ }
+ ShowFieldMessage(sTVContestLiveUpdatesTextGroup[state]);
+}
+
+void DoTVShowPokemonBattleUpdate(void)
+{
+ TVShow *show;
+ u8 state;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gScriptResult = FALSE;
+ state = sTVShowState;
+ switch (state)
+ {
+ case 0:
+ switch (show->battleUpdate.battleType)
+ {
+ case 0:
+ case 1:
+ sTVShowState = 1;
+ break;
+ case 2:
+ sTVShowState = 5;
+ break;
+ }
+ break;
+ case 1:
+ TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language);
+ TVShowConvertInternationalString(gStringVar2, show->battleUpdate.linkOpponentName, show->battleUpdate.linkOpponentLanguage);
+ if (show->battleUpdate.battleType == 0)
+ {
+ StringCopy(gStringVar3, gText_Single);
+ }
+ else
+ {
+ StringCopy(gStringVar3, gText_Double);
+ }
+ sTVShowState = 2;
+ break;
+ case 2:
+ TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->battleUpdate.species2]);
+ StringCopy(gStringVar3, gMoveNames[show->battleUpdate.move]);
+ sTVShowState = 3;
+ break;
+ case 3:
+ TVShowConvertInternationalString(gStringVar1, show->battleUpdate.linkOpponentName, show->battleUpdate.linkOpponentLanguage);
+ StringCopy(gStringVar2, gSpeciesNames[show->battleUpdate.species]);
+ sTVShowState = 4;
+ break;
+ case 4:
+ TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language);
+ TVShowConvertInternationalString(gStringVar2, show->battleUpdate.linkOpponentName, show->battleUpdate.linkOpponentLanguage);
+ TVShowDone();
+ break;
+ case 5:
+ TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language);
+ TVShowConvertInternationalString(gStringVar2, show->battleUpdate.linkOpponentName, show->battleUpdate.linkOpponentLanguage);
+ sTVShowState = 6;
+ break;
+ case 6:
+ TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->battleUpdate.species2]);
+ StringCopy(gStringVar3, gMoveNames[show->battleUpdate.move]);
+ sTVShowState = 7;
+ break;
+ case 7:
+ TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language);
+ TVShowConvertInternationalString(gStringVar2, show->battleUpdate.linkOpponentName, show->battleUpdate.linkOpponentLanguage);
+ StringCopy(gStringVar3, gSpeciesNames[show->battleUpdate.species]);
+ TVShowDone();
+ break;
+ }
+ ShowFieldMessage(sTVPokemonBattleUpdateTextGroup[state]);
+}
+
+void DoTVShow3CheersForPokeblocks(void)
+{
+ TVShow *show;
+ u8 state;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gScriptResult = FALSE;
+ state = sTVShowState;
+ switch (state)
+ {
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->threeCheers.playerName, show->threeCheers.language);
+ if (show->threeCheers.sheen > 20)
+ {
+ sTVShowState = 1;
+ }
+ else
+ {
+ sTVShowState = 3;
+ }
+ break;
+ case 1:
+ switch (show->threeCheers.flavor)
+ {
+ case 0:
+ StringCopy(gStringVar1, gText_Spicy2);
+ break;
+ case 1:
+ StringCopy(gStringVar1, gText_Dry2);
+ break;
+ case 2:
+ StringCopy(gStringVar1, gText_Sweet2);
+ break;
+ case 3:
+ StringCopy(gStringVar1, gText_Bitter2);
+ break;
+ case 4:
+ StringCopy(gStringVar1, gText_Sour2);
+ break;
+ }
+ if (show->threeCheers.sheen > 24)
+ {
+ StringCopy(gStringVar2, gText_Excellent);
+ } else if (show->threeCheers.sheen > 22)
+ {
+ StringCopy(gStringVar2, gText_VeryGood);
+ }
+ else
+ {
+ StringCopy(gStringVar2, gText_Good);
+ }
+ TVShowConvertInternationalString(gStringVar3, show->threeCheers.playerName, show->threeCheers.language);
+ sTVShowState = 2;
+ break;
+ case 2:
+ TVShowConvertInternationalString(gStringVar1, show->threeCheers.worstBlenderName, show->threeCheers.worstBlenderLanguage);
+ sTVShowState = 5;
+ break;
+ case 3:
+ switch (show->threeCheers.flavor)
+ {
+ case 0:
+ StringCopy(gStringVar1, gText_Spicy2);
+ break;
+ case 1:
+ StringCopy(gStringVar1, gText_Dry2);
+ break;
+ case 2:
+ StringCopy(gStringVar1, gText_Sweet2);
+ break;
+ case 3:
+ StringCopy(gStringVar1, gText_Bitter2);
+ break;
+ case 4:
+ StringCopy(gStringVar1, gText_Sour2);
+ break;
+ }
+ if (show->threeCheers.sheen > 16)
+ {
+ StringCopy(gStringVar2, gText_SoSo);
+ } else if (show->threeCheers.sheen > 13)
+ {
+ StringCopy(gStringVar2, gText_Bad);
+ }
+ else
+ {
+ StringCopy(gStringVar2, gText_TheWorst);
+ }
+ TVShowConvertInternationalString(gStringVar3, show->threeCheers.playerName, show->threeCheers.language);
+ sTVShowState = 4;
+ break;
+ case 4:
+ TVShowConvertInternationalString(gStringVar1, show->threeCheers.worstBlenderName, show->threeCheers.worstBlenderLanguage);
+ TVShowConvertInternationalString(gStringVar2, show->threeCheers.playerName, show->threeCheers.language);
+ sTVShowState = 5;
+ break;
+ case 5:
+ TVShowDone();
+ break;
+ }
+ ShowFieldMessage(sTV3CheersForPokeblocksTextGroup[state]);
+}
+
+void DoTVShowInSearchOfTrainers(void)
+{
+ u8 state;
+
+ gScriptResult = FALSE;
+ state = sTVShowState;
+ switch (state)
+ {
+ case 0:
+ GetMapName(gStringVar1, gSaveBlock1Ptr->gabbyAndTyData.mapnum, 0);
+ if (gSaveBlock1Ptr->gabbyAndTyData.battleNum > 1)
+ {
+ sTVShowState = 1;
+ }
+ else
+ {
+ sTVShowState = 2;
+ }
+ break;
+ case 1:
+ sTVShowState = 2;
+ break;
+ case 2:
+ if (!gSaveBlock1Ptr->gabbyAndTyData.battleTookMoreThanOneTurn)
+ {
+ sTVShowState = 4;
+ }
+ else if (gSaveBlock1Ptr->gabbyAndTyData.playerThrewABall)
+ {
+ sTVShowState = 5;
+ }
+ else if (gSaveBlock1Ptr->gabbyAndTyData.playerUsedAnItem)
+ {
+ sTVShowState = 6;
+ }
+ else if (gSaveBlock1Ptr->gabbyAndTyData.playerLostAMon)
+ {
+ sTVShowState = 7;
+ }
+ else
+ {
+ sTVShowState = 3;
+ }
+ break;
+ case 3:
+ StringCopy(gStringVar1, gSpeciesNames[gSaveBlock1Ptr->gabbyAndTyData.mon1]);
+ StringCopy(gStringVar2, gMoveNames[gSaveBlock1Ptr->gabbyAndTyData.lastMove]);
+ StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1Ptr->gabbyAndTyData.mon2]);
+ sTVShowState = 8;
+ break;
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ sTVShowState = 8;
+ break;
+ case 8:
+ CopyEasyChatWord(gStringVar1, gSaveBlock1Ptr->gabbyAndTyData.quote[0]);
+ StringCopy(gStringVar2, gSpeciesNames[gSaveBlock1Ptr->gabbyAndTyData.mon1]);
+ StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1Ptr->gabbyAndTyData.mon2]);
+ gScriptResult = TRUE;
+ sTVShowState = 0;
+ TakeTVShowInSearchOfTrainersOffTheAir();
+ break;
+ }
+ ShowFieldMessage(sTVInSearchOfTrainersTextGroup[state]);
+}
+
+void DoTVShowPokemonAngler(void)
+{
+ TVShow *show;
+ u8 state;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gScriptResult = FALSE;
+ if (show->pokemonAngler.nBites < show->pokemonAngler.nFails)
+ {
+ sTVShowState = 0;
+ }
+ else
+ {
+ sTVShowState = 1;
+ }
+ state = sTVShowState;
+ switch (state)
+ {
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->pokemonAngler.playerName, show->pokemonAngler.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->pokemonAngler.species]);
+ TV_PrintIntToStringVar(2, show->pokemonAngler.nFails);
+ TVShowDone();
+ break;
+ case 1:
+ TVShowConvertInternationalString(gStringVar1, show->pokemonAngler.playerName, show->pokemonAngler.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->pokemonAngler.species]);
+ TV_PrintIntToStringVar(2, show->pokemonAngler.nBites);
+ TVShowDone();
+ break;
+ }
+ ShowFieldMessage(sTVPokemonAnslerTextGroup[state]);
+}
+
+void DoTVShowTheWorldOfMasters(void)
+{
+ TVShow *show;
+ u8 state;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gScriptResult = FALSE;
+ state = sTVShowState;
+ switch (state)
+ {
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->worldOfMasters.playerName, show->worldOfMasters.language);
+ TV_PrintIntToStringVar(1, show->worldOfMasters.steps);
+ TV_PrintIntToStringVar(2, show->worldOfMasters.numPokeCaught);
+ sTVShowState = 1;
+ break;
+ case 1:
+ StringCopy(gStringVar1, gSpeciesNames[show->worldOfMasters.species]);
+ sTVShowState = 2;
+ break;
+ case 2:
+ TVShowConvertInternationalString(gStringVar1, show->worldOfMasters.playerName, show->worldOfMasters.language);
+ GetMapName(gStringVar2, show->worldOfMasters.location, 0);
+ StringCopy(gStringVar3, gSpeciesNames[show->worldOfMasters.caughtPoke]);
+ TVShowDone();
+ break;
+ }
+ ShowFieldMessage(sTVWorldOfMastersTextGroup[state]);
+}
+
+void DoTVShowTodaysRivalTrainer(void)
+{
+ TVShow *show;
+ u8 state;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gScriptResult = FALSE;
+ state = sTVShowState;
+ switch (state)
+ {
+ case 0:
+ switch (show->rivalTrainer.location)
+ {
+ default:
+ sTVShowState = 7;
+ break;
+ case REGION_MAP_SECRET_BASE:
+ sTVShowState = 8;
+ break;
+ case REGION_MAP_NONE:
+ switch (show->rivalTrainer.mapDataId)
+ {
+ case 0x115 ... 0x117:
+ sTVShowState = 10;
+ break;
+ default:
+ sTVShowState = 9;
+ break;
+ }
+ break;
+ }
+ break;
+ case 7:
+ TVShowConvertInternationalString(gStringVar1, show->rivalTrainer.playerName, show->rivalTrainer.language);
+ TV_PrintIntToStringVar(1, show->rivalTrainer.dexCount);
+ GetMapName(gStringVar3, show->rivalTrainer.location, 0);
+ if (show->rivalTrainer.badgeCount != 0)
+ {
+ sTVShowState = 1;
+ }
+ else
+ {
+ sTVShowState = 2;
+ }
+ break;
+ case 8:
+ TVShowConvertInternationalString(gStringVar1, show->rivalTrainer.playerName, show->rivalTrainer.language);
+ TV_PrintIntToStringVar(1, show->rivalTrainer.dexCount);
+ if (show->rivalTrainer.badgeCount != 0)
+ {
+ sTVShowState = 1;
+ }
+ else
+ {
+ sTVShowState = 2;
+ }
+ break;
+ case 9:
+ TVShowConvertInternationalString(gStringVar1, show->rivalTrainer.playerName, show->rivalTrainer.language);
+ TV_PrintIntToStringVar(1, show->rivalTrainer.dexCount);
+ if (show->rivalTrainer.badgeCount != 0)
+ {
+ sTVShowState = 1;
+ }
+ else
+ {
+ sTVShowState = 2;
+ }
+ break;
+ case 10:
+ TVShowConvertInternationalString(gStringVar1, show->rivalTrainer.playerName, show->rivalTrainer.language);
+ TV_PrintIntToStringVar(1, show->rivalTrainer.dexCount);
+ if (show->rivalTrainer.badgeCount != 0)
+ {
+ sTVShowState = 1;
+ }
+ else
+ {
+ sTVShowState = 2;
+ }
+ break;
+ case 1:
+ TV_PrintIntToStringVar(0, show->rivalTrainer.badgeCount);
+ if (FlagGet(CODE_FLAGS + 0x48))
+ {
+ if (show->rivalTrainer.nSilverSymbols || show->rivalTrainer.nGoldSymbols)
+ {
+ sTVShowState = 4;
+ }
+ else
+ {
+ sTVShowState = 3;
+ }
+ }
+ else
+ {
+ sTVShowState = 6;
+ }
+ break;
+ case 2:
+ if (FlagGet(CODE_FLAGS + 0x48))
+ {
+ if (show->rivalTrainer.nSilverSymbols || show->rivalTrainer.nGoldSymbols)
+ {
+ sTVShowState = 4;
+ }
+ else
+ {
+ sTVShowState = 3;
+ }
+ }
+ else
+ {
+ sTVShowState = 6;
+ }
+ break;
+ case 3:
+ if (show->rivalTrainer.battlePoints == 0)
+ {
+ sTVShowState = 6;
+ }
+ else
+ {
+ sTVShowState = 5;
+ }
+ break;
+ case 4:
+ TV_PrintIntToStringVar(0, show->rivalTrainer.nGoldSymbols);
+ TV_PrintIntToStringVar(1, show->rivalTrainer.nSilverSymbols);
+ if (show->rivalTrainer.battlePoints == 0)
+ {
+ sTVShowState = 6;
+ }
+ else
+ {
+ sTVShowState = 5;
+ }
+ break;
+ case 5:
+ TV_PrintIntToStringVar(0, show->rivalTrainer.battlePoints);
+ sTVShowState = 6;
+ break;
+ case 6:
+ TVShowConvertInternationalString(gStringVar1, show->rivalTrainer.playerName, show->rivalTrainer.language);
+ TVShowDone();
+ }
+ ShowFieldMessage(sTVTodaysRivalTrainerTextGroup[state]);
+}
+
+void DoTVShowDewfordTrendWatcherNetwork(void)
+{
+ TVShow *show;
+ u8 state;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gScriptResult = FALSE;
+ state = sTVShowState;
+ switch (state)
+ {
+ case 0:
+ CopyEasyChatWord(gStringVar1, show->trendWatcher.words[0]);
+ CopyEasyChatWord(gStringVar2, show->trendWatcher.words[1]);
+ if (show->trendWatcher.gender == MALE)
+ {
+ sTVShowState = 1;
+ }
+ else
+ {
+ sTVShowState = 2;
+ }
+ break;
+ case 1:
+ case 2:
+ CopyEasyChatWord(gStringVar1, show->trendWatcher.words[0]);
+ CopyEasyChatWord(gStringVar2, show->trendWatcher.words[1]);
+ TVShowConvertInternationalString(gStringVar3, show->trendWatcher.playerName, show->trendWatcher.language);
+ sTVShowState = 3;
+ break;
+ case 3:
+ CopyEasyChatWord(gStringVar1, show->trendWatcher.words[0]);
+ CopyEasyChatWord(gStringVar2, show->trendWatcher.words[1]);
+ if (show->trendWatcher.gender == MALE)
+ {
+ sTVShowState = 4;
+ }
+ else
+ {
+ sTVShowState = 5;
+ }
+ break;
+ case 4:
+ case 5:
+ CopyEasyChatWord(gStringVar1, show->trendWatcher.words[0]);
+ CopyEasyChatWord(gStringVar2, show->trendWatcher.words[1]);
+ TVShowConvertInternationalString(gStringVar3, show->trendWatcher.playerName, show->trendWatcher.language);
+ sTVShowState = 6;
+ break;
+ case 6:
+ CopyEasyChatWord(gStringVar1, show->trendWatcher.words[0]);
+ CopyEasyChatWord(gStringVar2, show->trendWatcher.words[1]);
+ TVShowDone();
+ }
+ ShowFieldMessage(sTVDewfordTrendWatcherNetworkTextGroup[state]);
+}
+
+void DoTVShowHoennTreasureInvestigators(void)
+{
+ TVShow *show;
+ u8 state;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gScriptResult = FALSE;
+ state = sTVShowState;
+ switch (state)
+ {
+ case 0:
+ StringCopy(gStringVar1, ItemId_GetItem(show->treasureInvestigators.item)->name);
+ if (show->treasureInvestigators.location == REGION_MAP_NONE)
+ {
+ switch (show->treasureInvestigators.mapDataId)
+ {
+ case 0x115 ... 0x117:
+ sTVShowState = 2;
+ break;
+ default:
+ sTVShowState = 1;
+ break;
+ }
+ }
+ else
+ {
+ sTVShowState = 1;
+ }
+ break;
+ case 1:
+ StringCopy(gStringVar1, ItemId_GetItem(show->treasureInvestigators.item)->name);
+ TVShowConvertInternationalString(gStringVar2, show->treasureInvestigators.playerName, show->treasureInvestigators.language);
+ GetMapName(gStringVar3, show->treasureInvestigators.location, 0);
+ TVShowDone();
+ break;
+ case 2:
+ StringCopy(gStringVar1, ItemId_GetItem(show->treasureInvestigators.item)->name);
+ TVShowConvertInternationalString(gStringVar2, show->treasureInvestigators.playerName, show->treasureInvestigators.language);
+ TVShowDone();
+ break;
+ }
+ ShowFieldMessage(sTVHoennTreasureInvestisatorsTextGroup[state]);
+}
+
+void DoTVShowFindThatGamer(void)
+{
+ TVShow *show;
+ u8 state;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gScriptResult = FALSE;
+ state = sTVShowState;
+ switch (state)
+ {
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->findThatGamer.playerName, show->findThatGamer.language);
+ switch (show->findThatGamer.whichGame)
+ {
+ case 0:
+ StringCopy(gStringVar2, gText_Slots);
+ break;
+ case 1:
+ StringCopy(gStringVar2, gText_Roulette);
+ break;
+ }
+ if (show->findThatGamer.won == TRUE)
+ {
+ sTVShowState = 1;
+ }
+ else
+ {
+ sTVShowState = 2;
+ }
+ break;
+ case 1:
+ TVShowConvertInternationalString(gStringVar1, show->findThatGamer.playerName, show->findThatGamer.language);
+ switch (show->findThatGamer.whichGame)
+ {
+ case 0:
+ StringCopy(gStringVar2, gText_Slots);
+ break;
+ case 1:
+ StringCopy(gStringVar2, gText_Roulette);
+ break;
+ }
+ TV_PrintIntToStringVar(2, show->findThatGamer.nCoins);
+ TVShowDone(); break;
+ case 2:
+ TVShowConvertInternationalString(gStringVar1, show->findThatGamer.playerName, show->findThatGamer.language);
+ switch (show->findThatGamer.whichGame)
+ {
+ case 0:
+ StringCopy(gStringVar2, gText_Slots);
+ break;
+ case 1:
+ StringCopy(gStringVar2, gText_Roulette);
+ break;
+ }
+ TV_PrintIntToStringVar(2, show->findThatGamer.nCoins);
+ sTVShowState = 3;
+ break;
+ case 3:
+ TVShowConvertInternationalString(gStringVar1, show->findThatGamer.playerName, show->findThatGamer.language);
+ switch (show->findThatGamer.whichGame)
+ {
+ case 0:
+ StringCopy(gStringVar2, gText_Roulette);
+ break;
+ case 1:
+ StringCopy(gStringVar2, gText_Slots);
+ break;
+ }
+ TVShowDone();
+ break;
+ }
+ ShowFieldMessage(sTVFindThatGamerTextGroup[state]);
+}
+
+void DoTVShowBreakingNewsTV(void)
+{
+ TVShow *show;
+ u8 state;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gScriptResult = FALSE;
+ state = sTVShowState;
+ switch (state)
+ {
+ case 0:
+ if (show->breakingNews.outcome == 0)
+ {
+ sTVShowState = 1;
+ }
+ else
+ {
+ sTVShowState = 5;
+ }
+ break;
+ case 1:
+ TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]);
+ GetMapName(gStringVar3, show->breakingNews.location, 0);
+ sTVShowState = 2;
+ break;
+ case 2:
+ TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]);
+ StringCopy(gStringVar3, gSpeciesNames[show->breakingNews.poke1Species]);
+ sTVShowState = 3;
+ break;
+ case 3:
+ TV_PrintIntToStringVar(0, show->breakingNews.balls);
+ StringCopy(gStringVar2, ItemId_GetItem(show->breakingNews.caughtMonBall)->name);
+ sTVShowState = 4;
+ break;
+ case 4:
+ TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language);
+ GetMapName(gStringVar2, show->breakingNews.location, 0);
+ TVShowDone();
+ break;
+ case 5:
+ TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]);
+ GetMapName(gStringVar3, show->breakingNews.location, 0);
+ sTVShowState = 6;
+ break;
+ case 6:
+ TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]);
+ StringCopy(gStringVar3, gSpeciesNames[show->breakingNews.poke1Species]);
+ switch (show->breakingNews.outcome)
+ {
+ case 1:
+ if (show->breakingNews.lastUsedMove == MOVE_NONE)
+ {
+ sTVShowState = 12;
+ }
+ else
+ {
+ sTVShowState = 7;
+ }
+ break;
+ case 2:
+ sTVShowState = 9;
+ break;
+ case 3:
+ sTVShowState = 10;
+ break;
+ }
+ break;
+ case 7:
+ StringCopy(gStringVar1, gMoveNames[show->breakingNews.lastUsedMove]);
+ StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.poke1Species]);
+ sTVShowState = 8;
+ break;
+ case 12:
+ TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]);
+ StringCopy(gStringVar3, gSpeciesNames[show->breakingNews.poke1Species]);
+ sTVShowState = 8;
+ break;
+ case 8:
+ TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language);
+ GetMapName(gStringVar2, show->breakingNews.location, 0);
+ sTVShowState = 11;
+ break;
+ case 9:
+ case 10:
+ TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]);
+ GetMapName(gStringVar3, show->breakingNews.location, 0);
+ sTVShowState = 11;
+ break;
+ case 11:
+ TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language);
+ TVShowDone();
+ break;
+ }
+ ShowFieldMessage(sTVBreakinsNewsTextGroup[state]);
+}
+
+void DoTVShowSecretBaseVisit(void)
+{
+ TVShow *show;
+ u8 state;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gScriptResult = FALSE;
+ state = sTVShowState;
+ switch (state)
+ {
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->secretBaseVisit.playerName, show->secretBaseVisit.language);
+ if (show->secretBaseVisit.nDecorations == 0)
+ {
+ sTVShowState = 2;
+ }
+ else
+ {
+ sTVShowState = 1;
+ }
+ break;
+ case 1:
+ StringCopy(gStringVar2, gDecorations[show->secretBaseVisit.decorations[0]].name);
+ if (show->secretBaseVisit.nDecorations == 1)
+ {
+ sTVShowState = 4;
+ }
+ else
+ {
+ sTVShowState = 3;
+ }
+ break;
+ case 3:
+ StringCopy(gStringVar2, gDecorations[show->secretBaseVisit.decorations[1]].name);
+ switch (show->secretBaseVisit.nDecorations)
+ {
+ case 2:
+ sTVShowState = 7;
+ break;
+ case 3:
+ sTVShowState = 6;
+ break;
+ case 4:
+ sTVShowState = 5;
+ break;
+ }
+ break;
+ case 5:
+ StringCopy(gStringVar2, gDecorations[show->secretBaseVisit.decorations[2]].name);
+ StringCopy(gStringVar3, gDecorations[show->secretBaseVisit.decorations[3]].name);
+ sTVShowState = 8;
+ break;
+ case 6:
+ StringCopy(gStringVar2, gDecorations[show->secretBaseVisit.decorations[2]].name);
+ sTVShowState = 8;
+ break;
+ case 2:
+ case 4:
+ case 7:
+ sTVShowState = 8;
+ break;
+ case 8:
+ TVShowConvertInternationalString(gStringVar1, show->secretBaseVisit.playerName, show->secretBaseVisit.language);
+ if (show->secretBaseVisit.avgLevel < 25)
+ {
+ sTVShowState = 12;
+ }
+ else if (show->secretBaseVisit.avgLevel < 50)
+ {
+ sTVShowState = 11;
+ }
+ else if (show->secretBaseVisit.avgLevel < 70)
+ {
+ sTVShowState = 10;
+ }
+ else
+ {
+ sTVShowState = 9;
+ }
+ break;
+ case 9:
+ case 10:
+ case 11:
+ case 12:
+ TVShowConvertInternationalString(gStringVar1, show->secretBaseVisit.playerName, show->secretBaseVisit.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->secretBaseVisit.species]);
+ StringCopy(gStringVar3, gMoveNames[show->secretBaseVisit.move]);
+ sTVShowState = 13;
+ break;
+ case 13:
+ TVShowDone();
+ break;
+ }
+ ShowFieldMessage(sTVSecretBaseVisitTextGroup[state]);
+}
+
+void DoTVShowPokemonLotteryWinnerFlashReport(void)
+{
+ TVShow *show;
+ u8 state;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gScriptResult = FALSE;
+ state = sTVShowState;
+ TVShowConvertInternationalString(gStringVar1, show->lottoWinner.playerName, show->lottoWinner.language);
+ if (show->lottoWinner.whichPrize == 0)
+ {
+ StringCopy(gStringVar2, gText_Jackpot);
+ }
+ else if (show->lottoWinner.whichPrize == 1)
+ {
+ StringCopy(gStringVar2, gText_First);
+ }
+ else if (show->lottoWinner.whichPrize == 2)
+ {
+ StringCopy(gStringVar2, gText_Second);
+ }
+ else
+ {
+ StringCopy(gStringVar2, gText_Third);
+ }
+ StringCopy(gStringVar3, ItemId_GetItem(show->lottoWinner.item)->name);
+ TVShowDone();
+ ShowFieldMessage(sTVPokemonLotteryWinnerFlashReportTextGroup[state]);
+}
+
+void DoTVShowThePokemonBattleSeminar(void)
+{
+ TVShow *show;
+ u8 state;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gScriptResult = FALSE;
+ state = sTVShowState;
+ switch (state)
+ {
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->battleSeminar.playerName, show->battleSeminar.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->battleSeminar.species]);
+ StringCopy(gStringVar3, gSpeciesNames[show->battleSeminar.foeSpecies]);
+ sTVShowState = 1;
+ break;
+ case 1:
+ TVShowConvertInternationalString(gStringVar1, show->battleSeminar.playerName, show->battleSeminar.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->battleSeminar.foeSpecies]);
+ StringCopy(gStringVar3, gMoveNames[show->battleSeminar.move]);
+ sTVShowState = 2;
+ break;
+ case 2:
+ StringCopy(gStringVar1, gSpeciesNames[show->battleSeminar.species]);
+ switch (show->battleSeminar.nOtherMoves)
+ {
+ case 1:
+ sTVShowState = 5;
+ break;
+ case 2:
+ sTVShowState = 4;
+ break;
+ case 3:
+ sTVShowState = 3;
+ break;
+ default:
+ sTVShowState = 6;
+ break;
+ }
+ break;
+ case 3:
+ StringCopy(gStringVar1, gMoveNames[show->battleSeminar.otherMoves[0]]);
+ StringCopy(gStringVar2, gMoveNames[show->battleSeminar.otherMoves[1]]);
+ StringCopy(gStringVar3, gMoveNames[show->battleSeminar.otherMoves[2]]);
+ sTVShowState = 6;
+ break;
+ case 4:
+ StringCopy(gStringVar1, gMoveNames[show->battleSeminar.otherMoves[0]]);
+ StringCopy(gStringVar2, gMoveNames[show->battleSeminar.otherMoves[1]]);
+ sTVShowState = 6;
+ break;
+ case 5:
+ StringCopy(gStringVar2, gMoveNames[show->battleSeminar.otherMoves[0]]);
+ sTVShowState = 6;
+ break;
+ case 6:
+ StringCopy(gStringVar1, gMoveNames[show->battleSeminar.betterMove]);
+ StringCopy(gStringVar2, gMoveNames[show->battleSeminar.move]);
+ TVShowDone();
+ break;
+ }
+ ShowFieldMessage(sTVThePokemonBattleSeminarTextGroup[state]);
+}
+
+void DoTVShowTrainerFanClubSpecial(void)
+{
+ TVShow *show;
+ u8 state;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gScriptResult = FALSE;
+ state = sTVShowState;
+ switch (state)
+ {
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->fanClubSpecial.idolName, show->fanClubSpecial.idolNameLanguage);
+ TVShowConvertInternationalString(gStringVar2, show->fanClubSpecial.playerName, show->fanClubSpecial.language);
+ CopyEasyChatWord(gStringVar3, show->fanClubSpecial.words[0]);
+ if (show->fanClubSpecial.score >= 90)
+ {
+ sTVShowState = 1;
+ }
+ else if (show->fanClubSpecial.score >= 70)
+ {
+ sTVShowState = 2;
+ }
+ else if (show->fanClubSpecial.score >= 30)
+ {
+ sTVShowState = 3;
+ }
+ else
+ {
+ sTVShowState = 4;
+ }
+ break;
+ case 1:
+ TVShowConvertInternationalString(gStringVar1, show->fanClubSpecial.idolName, show->fanClubSpecial.idolNameLanguage);
+ TVShowConvertInternationalString(gStringVar2, show->fanClubSpecial.playerName, show->fanClubSpecial.language);
+ TV_PrintIntToStringVar(2, show->fanClubSpecial.score);
+ sTVShowState = 5;
+ break;
+ case 2:
+ TVShowConvertInternationalString(gStringVar1, show->fanClubSpecial.idolName, show->fanClubSpecial.idolNameLanguage);
+ TVShowConvertInternationalString(gStringVar2, show->fanClubSpecial.playerName, show->fanClubSpecial.language);
+ TV_PrintIntToStringVar(2, show->fanClubSpecial.score);
+ sTVShowState = 5;
+ break;
+ case 3:
+ TVShowConvertInternationalString(gStringVar1, show->fanClubSpecial.idolName, show->fanClubSpecial.idolNameLanguage);
+ TVShowConvertInternationalString(gStringVar2, show->fanClubSpecial.playerName, show->fanClubSpecial.language);
+ TV_PrintIntToStringVar(2, show->fanClubSpecial.score);
+ sTVShowState = 5;
+ break;
+ case 4:
+ TVShowConvertInternationalString(gStringVar1, show->fanClubSpecial.idolName, show->fanClubSpecial.idolNameLanguage);
+ TVShowConvertInternationalString(gStringVar2, show->fanClubSpecial.playerName, show->fanClubSpecial.language);
+ TV_PrintIntToStringVar(2, show->fanClubSpecial.score);
+ sTVShowState = 5;
+ break;
+ case 5:
+ TVShowConvertInternationalString(gStringVar1, show->fanClubSpecial.idolName, show->fanClubSpecial.idolNameLanguage);
+ TVShowConvertInternationalString(gStringVar2, show->fanClubSpecial.playerName, show->fanClubSpecial.language);
+ CopyEasyChatWord(gStringVar3, show->fanClubSpecial.words[0]);
+ TVShowDone();
+ break;
+ }
+ ShowFieldMessage(sTVTrainerFanClubSpecialTextGroup[state]);
+}
+
+void DoTVShowTrainerFanClub(void)
+{
+ TVShow *show;
+ u8 state;
+ u32 playerId;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gScriptResult = FALSE;
+ state = sTVShowState;
+ switch (state)
+ {
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->trainerFanClub.playerName, show->trainerFanClub.language);
+ playerId = ((show->common.trainerIdHi << 8) + show->common.trainerIdLo);
+ switch (playerId % 10)
+ {
+ case 0:
+ sTVShowState = 1;
+ break;
+ case 1:
+ sTVShowState = 2;
+ break;
+ case 2:
+ sTVShowState = 3;
+ break;
+ case 3:
+ sTVShowState = 4;
+ break;
+ case 4:
+ sTVShowState = 5;
+ break;
+ case 5:
+ sTVShowState = 6;
+ break;
+ case 6:
+ sTVShowState = 7;
+ break;
+ case 7:
+ sTVShowState = 8;
+ break;
+ case 8:
+ sTVShowState = 9;
+ break;
+ case 9:
+ sTVShowState = 10;
+ break;
+ }
+ break;
+ case 1:
+ sTVShowState = 11;
+ break;
+ case 2:
+ sTVShowState = 11;
+ break;
+ case 3:
+ sTVShowState = 11;
+ break;
+ case 4:
+ sTVShowState = 11;
+ break;
+ case 5:
+ sTVShowState = 11;
+ break;
+ case 6:
+ sTVShowState = 11;
+ break;
+ case 7:
+ sTVShowState = 11;
+ break;
+ case 8:
+ sTVShowState = 11;
+ break;
+ case 9:
+ sTVShowState = 11;
+ break;
+ case 10:
+ sTVShowState = 11;
+ break;
+ case 11:
+ TVShowConvertInternationalString(gStringVar1, show->trainerFanClub.playerName, show->trainerFanClub.language);
+ CopyEasyChatWord(gStringVar2, show->trainerFanClub.words[0]);
+ CopyEasyChatWord(gStringVar3, show->trainerFanClub.words[1]);
+ TVShowDone();
+ }
+ ShowFieldMessage(sTVTrainerFanClubTextGroup[state]);
+}
+
+void DoTVShowSpotTheCuties(void)
+{
+ TVShow *show;
+ u8 state;
+ u32 playerId;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gScriptResult = FALSE;
+ state = sTVShowState;
+ switch (state)
+ {
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->cuties.playerName, show->cuties.language);
+ TVShowConvertInternationalString(gStringVar2, show->cuties.nickname, show->cuties.pokemonNameLanguage);
+ if (show->cuties.nRibbons < 10)
+ {
+ sTVShowState = 1;
+ }
+ else if (show->cuties.nRibbons < 20)
+ {
+ sTVShowState = 2;
+ }
+ else
+ {
+ sTVShowState = 3;
+ }
+ break;
+ case 1:
+ case 2:
+ case 3:
+ TVShowConvertInternationalString(gStringVar1, show->cuties.playerName, show->cuties.language);
+ TVShowConvertInternationalString(gStringVar2, show->cuties.nickname, show->cuties.pokemonNameLanguage);
+ TV_PrintIntToStringVar(2, show->cuties.nRibbons);
+ sTVShowState = 4;
+ break;
+ case 4:
+ TVShowConvertInternationalString(gStringVar2, show->cuties.nickname, show->cuties.pokemonNameLanguage);
+ switch (show->cuties.selectedRibbon)
+ {
+ case 0:
+ sTVShowState = 5;
+ break;
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ sTVShowState = 6;
+ break;
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ sTVShowState = 7;
+ break;
+ case 9:
+ case 10:
+ case 11:
+ case 12:
+ sTVShowState = 8;
+ break;
+ case 13:
+ case 14:
+ case 15:
+ case 16:
+ sTVShowState = 9;
+ break;
+ case 17:
+ case 18:
+ case 19:
+ case 20:
+ sTVShowState = 10;
+ break;
+ case 21:
+ sTVShowState = 11;
+ break;
+ case 22:
+ sTVShowState = 12;
+ break;
+ case 23:
+ sTVShowState = 13;
+ break;
+ case 24:
+ sTVShowState = 14;
+ break;
+ }
+ break;
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ case 14:
+ TVShowConvertInternationalString(gStringVar2, show->cuties.nickname, show->cuties.pokemonNameLanguage);
+ sTVShowState = 15;
+ break;
+ case 15:
+ TVShowDone();
+ }
+ ShowFieldMessage(sTVCutiesTextGroup[state]);
+}
+
+void DoTVShowPokemonNewsBattleFrontier(void)
+{
+ TVShow *show;
+ u8 state;
+ u32 playerId;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gScriptResult = FALSE;
+ state = sTVShowState;
+ switch (state)
+ {
+ case 0:
+ switch (show->frontier.facility)
+ {
+ case 1:
+ sTVShowState = 1;
+ break;
+ case 2:
+ sTVShowState = 2;
+ break;
+ case 3:
+ sTVShowState = 3;
+ break;
+ case 4:
+ sTVShowState = 4;
+ break;
+ case 5:
+ sTVShowState = 5;
+ break;
+ case 6:
+ sTVShowState = 6;
+ break;
+ case 7:
+ sTVShowState = 7;
+ break;
+ case 8:
+ sTVShowState = 8;
+ break;
+ case 9:
+ sTVShowState = 9;
+ break;
+ case 10:
+ sTVShowState = 10;
+ break;
+ case 11:
+ sTVShowState = 11;
+ break;
+ case 12:
+ sTVShowState = 12;
+ break;
+ case 13:
+ sTVShowState = 13;
+ break;
+ }
+ break;
+ case 1:
+ TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
+ TV_PrintIntToStringVar(1, show->frontier.winStreak);
+ sTVShowState = 14;
+ break;
+ case 2:
+ TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
+ TV_PrintIntToStringVar(1, show->frontier.winStreak);
+ sTVShowState = 16;
+ break;
+ case 3:
+ TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
+ TV_PrintIntToStringVar(1, show->frontier.winStreak);
+ sTVShowState = 15;
+ break;
+ case 4:
+ TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
+ TV_PrintIntToStringVar(1, show->frontier.winStreak);
+ sTVShowState = 15;
+ break;
+ case 5:
+ TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
+ TV_PrintIntToStringVar(1, show->frontier.winStreak);
+ sTVShowState = 14;
+ break;
+ case 6:
+ TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
+ TV_PrintIntToStringVar(1, show->frontier.winStreak);
+ sTVShowState = 14;
+ break;
+ case 7:
+ TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
+ TV_PrintIntToStringVar(1, show->frontier.winStreak);
+ sTVShowState = 14;
+ break;
+ case 8:
+ TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
+ TV_PrintIntToStringVar(1, show->frontier.winStreak);
+ sTVShowState = 14;
+ break;
+ case 9:
+ TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
+ TV_PrintIntToStringVar(1, show->frontier.winStreak);
+ sTVShowState = 14;
+ break;
+ case 10:
+ TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
+ TV_PrintIntToStringVar(1, show->frontier.winStreak);
+ sTVShowState = 14;
+ break;
+ case 11:
+ TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
+ TV_PrintIntToStringVar(1, show->frontier.winStreak);
+ sTVShowState = 14;
+ break;
+ case 12:
+ TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
+ TV_PrintIntToStringVar(1, show->frontier.winStreak);
+ sTVShowState = 14;
+ break;
+ case 13:
+ TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
+ TV_PrintIntToStringVar(1, show->frontier.winStreak);
+ sTVShowState = 14;
+ break;
+ case 14:
+ StringCopy(gStringVar1, gSpeciesNames[show->frontier.species1]);
+ StringCopy(gStringVar2, gSpeciesNames[show->frontier.species2]);
+ StringCopy(gStringVar3, gSpeciesNames[show->frontier.species3]);
+ sTVShowState = 18;
+ break;
+ case 15:
+ StringCopy(gStringVar1, gSpeciesNames[show->frontier.species1]);
+ StringCopy(gStringVar2, gSpeciesNames[show->frontier.species2]);
+ sTVShowState = 18;
+ break;
+ case 16:
+ StringCopy(gStringVar1, gSpeciesNames[show->frontier.species1]);
+ StringCopy(gStringVar2, gSpeciesNames[show->frontier.species2]);
+ StringCopy(gStringVar3, gSpeciesNames[show->frontier.species3]);
+ sTVShowState = 17;
+ break;
+ case 17:
+ StringCopy(gStringVar1, gSpeciesNames[show->frontier.species4]);
+ sTVShowState = 18;
+ break;
+ case 18:
+ TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
+ TVShowDone();
+ break;
+ }
+ ShowFieldMessage(sTVPokemonNewsBattleFrontierTextGroup[state]);
+}
+
+void DoTVShowWhatsNo1InHoennToday(void)
+{
+ TVShow *show;
+ u8 state;
+ u32 playerId;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gScriptResult = FALSE;
+ state = sTVShowState;
+ switch (state)
+ {
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language);
+ switch (show->numberOne.actionIdx)
+ {
+ case 0:
+ sTVShowState = 1;
+ break;
+ case 1:
+ sTVShowState = 2;
+ break;
+ case 2:
+ sTVShowState = 3;
+ break;
+ case 3:
+ sTVShowState = 4;
+ break;
+ case 4:
+ sTVShowState = 5;
+ break;
+ case 5:
+ sTVShowState = 6;
+ break;
+ case 6:
+ sTVShowState = 7;
+ break;
+ }
+ break;
+ case 1:
+ TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language);
+ TV_PrintIntToStringVar(1, show->numberOne.count);
+ sTVShowState = 8;
+ break;
+ case 2:
+ TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language);
+ TV_PrintIntToStringVar(1, show->numberOne.count);
+ sTVShowState = 8;
+ break;
+ case 3:
+ TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language);
+ TV_PrintIntToStringVar(1, show->numberOne.count);
+ sTVShowState = 8;
+ break;
+ case 4:
+ TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language);
+ TV_PrintIntToStringVar(1, show->numberOne.count);
+ sTVShowState = 8;
+ break;
+ case 5:
+ TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language);
+ TV_PrintIntToStringVar(1, show->numberOne.count);
+ sTVShowState = 8;
+ break;
+ case 6:
+ TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language);
+ TV_PrintIntToStringVar(1, show->numberOne.count);
+ sTVShowState = 8;
+ break;
+ case 7:
+ TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language);
+ TV_PrintIntToStringVar(1, show->numberOne.count);
+ sTVShowState = 8;
+ break;
+ case 8:
+ TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language);
+ TVShowDone();
+ break;
+ }
+ ShowFieldMessage(sTVWhatsNo1InHoennTodayTextGroup[state]);
+}
+
+u8 sub_80F5180(TVShow *show)
+{
+ u8 i;
+ u8 tot;
+
+ for (i = 0, tot = 0; i < 32; i ++)
+ {
+ if ((show->secretBaseSecrets.flags >> i) & 1)
+ {
+ tot ++;
+ }
+ }
+ return tot;
+}
+
+u8 sub_80F51AC(TVShow *show, u8 a1)
+{
+ u8 i;
+ u8 tot;
+
+ for (i = 0, tot = 0; i < 32; i ++)
+ {
+ if ((show->secretBaseSecrets.flags >> i) & 1)
+ {
+ if (tot == a1)
+ {
+ return sTVSecretBaseSecretsStateLookup[i];
+ }
+ tot ++;
+ }
+ }
+ return 0;
+}
+
+void DoTVShowSecretBaseSecrets(void)
+{
+ TVShow *show;
+ u8 state;
+ u8 bitCount;
+ u16 i;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gScriptResult = FALSE;
+ state = sTVShowState;
+ switch (state)
+ {
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->secretBaseSecrets.baseOwnersName, show->secretBaseSecrets.baseOwnersNameLanguage);
+ TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language);
+ bitCount = sub_80F5180(show);
+ if (bitCount == 0)
+ {
+ sTVShowState = 8;
+ }
+ else
+ {
+ show->secretBaseSecrets.savedState = 1;
+ sTVSecretBaseSecretsRandomValues[0] = Random() % bitCount;
+ sTVShowState = sub_80F51AC(show, sTVSecretBaseSecretsRandomValues[0]);
+ }
+ break;
+ case 1:
+ TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language);
+ bitCount = sub_80F5180(show);
+ switch (bitCount)
+ {
+ case 1:
+ sTVShowState = 9;
+ break;
+ case 2:
+ show->secretBaseSecrets.savedState = 2;
+ if (sTVSecretBaseSecretsRandomValues[0] == 0)
+ {
+ sTVShowState = sub_80F51AC(show, 1);
+ }
+ else
+ {
+ sTVShowState = sub_80F51AC(show, 0);
+ }
+ break;
+ default:
+ for (i = 0; i < 0xFFFF; i ++)
+ {
+ sTVSecretBaseSecretsRandomValues[1] = Random() % bitCount;
+ if (sTVSecretBaseSecretsRandomValues[1] != sTVSecretBaseSecretsRandomValues[0])
+ {
+ break;
+ }
+ }
+ show->secretBaseSecrets.savedState = 2;
+ sTVShowState = sub_80F51AC(show, sTVSecretBaseSecretsRandomValues[1]);
+ break;
+ }
+ break;
+ case 2:
+ TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language);
+ bitCount = sub_80F5180(show);
+ if (bitCount == 2)
+ {
+ sTVShowState = 9;
+ }
+ else
+ {
+ for (i = 0; i < 0xFFFF; i ++)
+ {
+ sTVSecretBaseSecretsRandomValues[2] = Random() % bitCount;
+ if (sTVSecretBaseSecretsRandomValues[2] != sTVSecretBaseSecretsRandomValues[0] && sTVSecretBaseSecretsRandomValues[2] != sTVSecretBaseSecretsRandomValues[1])
+ {
+ break;
+ }
+ }
+ show->secretBaseSecrets.savedState = 3;
+ sTVShowState = sub_80F51AC(show, sTVSecretBaseSecretsRandomValues[2]);
+ }
+ break;
+ case 3:
+ 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;
+ }
+ else if (show->secretBaseSecrets.stepsInBase <= 100)
+ {
+ sTVShowState = 5;
+ }
+ else
+ {
+ sTVShowState = 6;
+ }
+ break;
+ case 4:
+ TVShowConvertInternationalString(gStringVar1, show->secretBaseSecrets.baseOwnersName, show->secretBaseSecrets.baseOwnersNameLanguage);
+ TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language);
+ sTVShowState = 7;
+ 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:
+ TVShowConvertInternationalString(gStringVar1, show->secretBaseSecrets.baseOwnersName, show->secretBaseSecrets.baseOwnersNameLanguage);
+ TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language);
+ TVShowDone();
+ break;
+ case 8:
+ sTVShowState = 3;
+ break;
+ case 9:
+ sTVShowState = 3;
+ break;
+ case 10:
+ 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:
+ StringCopy(gStringVar2, ItemId_GetItem(show->secretBaseSecrets.item)->name);
+ sTVShowState = show->secretBaseSecrets.savedState;
+ break;
+ case 20:
+ if (show->common.trainerIdLo & 1)
+ {
+ sTVShowState = 22;
+ }
+ else
+ {
+ sTVShowState = 21;
+ }
+ 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:
+ sTVShowState = show->secretBaseSecrets.savedState;
+ break;
+ }
+ ShowFieldMessage(sTVSecretBaseSecretsTextGroup[state]);
+}
+
+void DoTVShowSafariFanClub(void)
+{
+ TVShow *show;
+ u8 state;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gScriptResult = FALSE;
+ state = sTVShowState;
+ switch (state)
+ {
+ case 0:
+ if (show->safariFanClub.nMonsCaught == 0)
+ {
+ sTVShowState = 6;
+ }
+ else if (show->safariFanClub.nMonsCaught < 4)
+ {
+ sTVShowState = 5;
+ }
+ else
+ {
+ sTVShowState = 1;
+ }
+ break;
+ case 1:
+ TVShowConvertInternationalString(gStringVar1, show->safariFanClub.playerName, show->safariFanClub.language);
+ TV_PrintIntToStringVar(1, show->safariFanClub.nMonsCaught);
+ if (show->safariFanClub.nPkblkUsed == 0)
+ {
+ sTVShowState = 3;
+ }
+ else
+ {
+ sTVShowState = 2;
+ }
+ break;
+ case 2:
+ TV_PrintIntToStringVar(1, show->safariFanClub.nPkblkUsed);
+ sTVShowState = 4;
+ break;
+ case 3:
+ sTVShowState = 4;
+ break;
+ case 4:
+ TVShowConvertInternationalString(gStringVar1, show->safariFanClub.playerName, show->safariFanClub.language);
+ sTVShowState = 10;
+ break;
+ case 5:
+ TVShowConvertInternationalString(gStringVar1, show->safariFanClub.playerName, show->safariFanClub.language);
+ TV_PrintIntToStringVar(1, show->safariFanClub.nMonsCaught);
+ if (show->safariFanClub.nPkblkUsed == 0)
+ {
+ sTVShowState = 8;
+ }
+ else
+ {
+ sTVShowState = 7;
+ }
+ break;
+ case 6:
+ TVShowConvertInternationalString(gStringVar1, show->safariFanClub.playerName, show->safariFanClub.language);
+ if (show->safariFanClub.nPkblkUsed == 0)
+ {
+ sTVShowState = 8;
+ }
+ else
+ {
+ sTVShowState = 7;
+ }
+ break;
+ case 7:
+ TV_PrintIntToStringVar(1, show->safariFanClub.nPkblkUsed);
+ sTVShowState = 9;
+ break;
+ case 8:
+ sTVShowState = 9;
+ break;
+ case 9:
+ TVShowConvertInternationalString(gStringVar1, show->safariFanClub.playerName, show->safariFanClub.language);
+ sTVShowState = 10;
+ break;
+ case 10:
+ TVShowDone();
+ }
+ ShowFieldMessage(sTVSafariFanClubTextGroup[state]);
+}
+
+void DoTVShowPokemonContestLiveUpdates2(void)
+{
+ TVShow *show;
+ u8 state;
+
+ show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ gScriptResult = FALSE;
+ state = sTVShowState;
+ switch (state)
+ {
+ case 0:
+ sub_818E868(gStringVar1, show->contestLiveUpdates2.contestCategory);
+ if (show->contestLiveUpdates2.pokeblockState == 1)
+ {
+ sTVShowState = 1;
+ }
+ else if (show->contestLiveUpdates2.pokeblockState == 0)
+ {
+ sTVShowState = 2;
+ }
+ else
+ {
+ sTVShowState = 3;
+ }
+ break;
+ case 1:
+ case 2:
+ TVShowConvertInternationalString(gStringVar3, show->contestLiveUpdates2.playerName, show->contestLiveUpdates2.language);
+ case 3:
+ TVShowConvertInternationalString(gStringVar2, show->contestLiveUpdates2.nickname, show->contestLiveUpdates2.pokemonNameLanguage);
+ TVShowDone();
+ break;
+ }
+ ShowFieldMessage(sTVPokemonContestLiveUpdates2TextGroup[state]);
+}
+
+void TVShowDone(void)
+{
+ gScriptResult = TRUE;
+ sTVShowState = 0;
+ gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004].common.active = FALSE;
+}
+
+void ResetTVShowState(void)
+{
+ sTVShowState = 0;
+}
diff --git a/src/util.c b/src/util.c
index 27b7c5ee5..58088c3ee 100644
--- a/src/util.c
+++ b/src/util.c
@@ -112,7 +112,7 @@ static const u16 sCrc16Table[] =
0x7BC7, 0x6A4E, 0x58D5, 0x495C, 0x3DE3, 0x2C6A, 0x1EF1, 0x0F78,
};
-const u8 gMiscBlank_Gfx[] = INCBIN_U8("graphics/interface/blank.4bpp"); // unused in Emerald
+const u8 gMiscBlank_Gfx[] = INCBIN_U8("graphics/interface/blank.4bpp");
u8 CreateInvisibleSpriteWithCallback(void (*callback)(struct Sprite *))
{