placeholders for battle strings are done

This commit is contained in:
DizzyEggg 2017-10-07 19:59:41 +02:00
parent db63fc1a09
commit 7552caaadc
10 changed files with 783 additions and 2095 deletions

File diff suppressed because it is too large Load Diff

View File

@ -2617,8 +2617,8 @@ _080B1C96:
.pool .pool
thumb_func_end sub_80B1C7C thumb_func_end sub_80B1C7C
thumb_func_start sub_80B1CA4 thumb_func_start GetTrainer1LoseText
sub_80B1CA4: @ 80B1CA4 GetTrainer1LoseText: @ 80B1CA4
push {r4,lr} push {r4,lr}
ldr r0, =gTrainerBattleOpponent_A ldr r0, =gTrainerBattleOpponent_A
ldrh r1, [r0] ldrh r1, [r0]
@ -2643,10 +2643,10 @@ _080B1CC0:
pop {r1} pop {r1}
bx r1 bx r1
.pool .pool
thumb_func_end sub_80B1CA4 thumb_func_end GetTrainer1LoseText
thumb_func_start sub_80B1CE0 thumb_func_start GetTrainer2LoseText
sub_80B1CE0: @ 80B1CE0 GetTrainer2LoseText: @ 80B1CE0
push {r4,lr} push {r4,lr}
ldr r4, =gStringVar4 ldr r4, =gStringVar4
ldr r0, =gUnknown_02038BE0 ldr r0, =gUnknown_02038BE0
@ -2660,7 +2660,7 @@ sub_80B1CE0: @ 80B1CE0
pop {r1} pop {r1}
bx r1 bx r1
.pool .pool
thumb_func_end sub_80B1CE0 thumb_func_end GetTrainer2LoseText
thumb_func_start sub_80B1D04 thumb_func_start sub_80B1D04
sub_80B1D04: @ 80B1D04 sub_80B1D04: @ 80B1D04

View File

@ -5857,8 +5857,8 @@ sub_8165244: @ 8165244
.pool .pool
thumb_func_end sub_8165244 thumb_func_end sub_8165244
thumb_func_start sub_8165264 thumb_func_start GetEreaderTrainerClassId
sub_8165264: @ 8165264 GetEreaderTrainerClassId: @ 8165264
ldr r1, =gTrainerClassToNameIndex ldr r1, =gTrainerClassToNameIndex
ldr r0, =gSaveBlock2Ptr ldr r0, =gSaveBlock2Ptr
ldr r0, [r0] ldr r0, [r0]
@ -5869,10 +5869,10 @@ sub_8165264: @ 8165264
ldrb r0, [r0] ldrb r0, [r0]
bx lr bx lr
.pool .pool
thumb_func_end sub_8165264 thumb_func_end GetEreaderTrainerClassId
thumb_func_start sub_8165284 thumb_func_start GetEreaderTrainerName
sub_8165284: @ 8165284 GetEreaderTrainerName: @ 8165284
push {r4,lr} push {r4,lr}
adds r3, r0, 0 adds r3, r0, 0
movs r2, 0 movs r2, 0
@ -5896,7 +5896,7 @@ _08165294:
pop {r0} pop {r0}
bx r0 bx r0
.pool .pool
thumb_func_end sub_8165284 thumb_func_end GetEreaderTrainerName
thumb_func_start sub_81652B4 thumb_func_start sub_81652B4
sub_81652B4: @ 81652B4 sub_81652B4: @ 81652B4

View File

@ -7347,7 +7347,7 @@ sub_8139228: @ 8139228
sub_8139238: @ 8139238 sub_8139238: @ 8139238
push {lr} push {lr}
ldr r0, =gStringVar1 ldr r0, =gStringVar1
bl sub_8165284 bl GetEreaderTrainerName
pop {r0} pop {r0}
bx r0 bx r0
.pool .pool

View File

@ -355,12 +355,12 @@ B_LINK_OPPONENT_MON1_NAME = FD 0A
B_LINK_PLAYER_MON2_NAME = FD 0B B_LINK_PLAYER_MON2_NAME = FD 0B
B_LINK_OPPONENT_MON2_NAME = FD 0C B_LINK_OPPONENT_MON2_NAME = FD 0C
B_ATK_NAME_WITH_PREFIX_MON1 = FD 0D B_ATK_NAME_WITH_PREFIX_MON1 = FD 0D
B_ATK_NAME = FD 0E B_ATK_PARTNER_NAME = FD 0E
B_ATK_NAME_WITH_PREFIX = FD 0F B_ATK_NAME_WITH_PREFIX = FD 0F
B_DEF_NAME_WITH_PREFIX = FD 10 B_DEF_NAME_WITH_PREFIX = FD 10
B_EFF_NAME_WITH_PREFIX = FD 11 @ EFF = short for gEffectBank B_EFF_NAME_WITH_PREFIX = FD 11 @ EFF = short for gEffectBank
B_SCR_ACTIVE_NAME_WITH_PREFIX = FD 12 B_ACTIVE_NAME_WITH_PREFIX = FD 12
B_ACTIVE_NAME_WITH_PREFIX = FD 13 B_SCR_ACTIVE_NAME_WITH_PREFIX = FD 13
B_CURRENT_MOVE = FD 14 B_CURRENT_MOVE = FD 14
B_LAST_MOVE = FD 15 B_LAST_MOVE = FD 15
B_LAST_ITEM = FD 16 B_LAST_ITEM = FD 16

View File

@ -25,6 +25,6 @@ extern const u8 gStatusConditionString_IceJpn[8];
extern const u8 gStatusConditionString_ConfusionJpn[8]; extern const u8 gStatusConditionString_ConfusionJpn[8];
extern const u8 gStatusConditionString_LoveJpn[8]; extern const u8 gStatusConditionString_LoveJpn[8];
extern const u8 * const gStatusConditionStringsTable[][2]; extern const u8 * const gStatusConditionStringsTable[7][2];
#endif // GUARD_BATTLE_2_H #endif // GUARD_BATTLE_2_H

View File

@ -3,59 +3,59 @@
// for 0xFD // for 0xFD
#define B_TXT_BUFF1 00 #define B_TXT_BUFF1 0x0
#define B_TXT_BUFF2 01 #define B_TXT_BUFF2 0x1
#define B_TXT_COPY_VAR_1 02 #define B_TXT_COPY_VAR_1 0x2
#define B_TXT_COPY_VAR_2 03 #define B_TXT_COPY_VAR_2 0x3
#define B_TXT_COPY_VAR_3 04 #define B_TXT_COPY_VAR_3 0x4
#define B_TXT_PLAYER_MON1_NAME 05 #define B_TXT_PLAYER_MON1_NAME 0x5
#define B_TXT_OPPONENT_MON1_NAME 06 #define B_TXT_OPPONENT_MON1_NAME 0x6
#define B_TXT_PLAYER_MON2_NAME 07 #define B_TXT_PLAYER_MON2_NAME 0x7
#define B_TXT_OPPONENT_MON2_NAME 08 #define B_TXT_OPPONENT_MON2_NAME 0x8
#define B_TXT_LINK_PLAYER_MON1_NAME 09 #define B_TXT_LINK_PLAYER_MON1_NAME 0x9
#define B_TXT_LINK_OPPONENT_MON1_NAME 0A #define B_TXT_LINK_OPPONENT_MON1_NAME 0xA
#define B_TXT_LINK_PLAYER_MON2_NAME 0B #define B_TXT_LINK_PLAYER_MON2_NAME 0xB
#define B_TXT_LINK_OPPONENT_MON2_NAME 0C #define B_TXT_LINK_OPPONENT_MON2_NAME 0xC
#define B_TXT_ATK_NAME_WITH_PREFIX_MON1 0D #define B_TXT_ATK_NAME_WITH_PREFIX_MON1 0xD
#define B_TXT_ATK_NAME 0E #define B_TXT_ATK_PARTNER_NAME 0xE
#define B_TXT_ATK_NAME_WITH_PREFIX 0F #define B_TXT_ATK_NAME_WITH_PREFIX 0xF
#define B_TXT_DEF_NAME_WITH_PREFIX 10 #define B_TXT_DEF_NAME_WITH_PREFIX 0x10
#define B_TXT_EFF_NAME_WITH_PREFIX 11 // EFF = short for gEffectBank #define B_TXT_EFF_NAME_WITH_PREFIX 0x11 // EFF = short for gEffectBank
#define B_TXT_SCR_ACTIVE_NAME_WITH_PREFIX 12 #define B_TXT_ACTIVE_NAME_WITH_PREFIX 0x12
#define B_TXT_ACTIVE_NAME_WITH_PREFIX 13 #define B_TXT_SCR_ACTIVE_NAME_WITH_PREFIX 0x13
#define B_TXT_CURRENT_MOVE 14 #define B_TXT_CURRENT_MOVE 0x14
#define B_TXT_LAST_MOVE 15 #define B_TXT_LAST_MOVE 0x15
#define B_TXT_LAST_ITEM 16 #define B_TXT_LAST_ITEM 0x16
#define B_TXT_LAST_ABILITY 17 #define B_TXT_LAST_ABILITY 0x17
#define B_TXT_ATK_ABILITY 18 #define B_TXT_ATK_ABILITY 0x18
#define B_TXT_DEF_ABILITY 19 #define B_TXT_DEF_ABILITY 0x19
#define B_TXT_SCR_ACTIVE_ABILITY 1A #define B_TXT_SCR_ACTIVE_ABILITY 0x1A
#define B_TXT_EFF_ABILITY 1B #define B_TXT_EFF_ABILITY 0x1B
#define B_TXT_TRAINER1_CLASS 1C #define B_TXT_TRAINER1_CLASS 0x1C
#define B_TXT_TRAINER1_NAME 1D #define B_TXT_TRAINER1_NAME 0x1D
#define B_TXT_1E 1E // trainer name for a link player #define B_TXT_1E 0x1E // trainer name for a link player
#define B_TXT_1F 1F // trainer name for a link player #define B_TXT_1F 0x1F // trainer name for a link player
#define B_TXT_20 20 // trainer name for a link player #define B_TXT_20 0x20 // trainer name for a link player
#define B_TXT_21 21 // trainer name for a link player #define B_TXT_21 0x21 // trainer name for a link player
#define B_TXT_22 22 // trainer name for a link player #define B_TXT_22 0x22 // trainer name for a link player
#define B_TXT_PLAYER_NAME 23 #define B_TXT_PLAYER_NAME 0x23
#define B_TXT_TRAINER1_LOSE_TEXT 24 #define B_TXT_TRAINER1_LOSE_TEXT 0x24
#define B_TXT_TRAINER1_WIN_TEXT 25 #define B_TXT_TRAINER1_WIN_TEXT 0x25
#define B_TXT_26 26 #define B_TXT_26 0x26
#define B_TXT_PC_CREATOR_NAME 27 #define B_TXT_PC_CREATOR_NAME 0x27
#define B_TXT_ATK_PREFIX1 28 #define B_TXT_ATK_PREFIX1 0x28
#define B_TXT_DEF_PREFIX1 29 #define B_TXT_DEF_PREFIX1 0x29
#define B_TXT_ATK_PREFIX2 2A #define B_TXT_ATK_PREFIX2 0x2A
#define B_TXT_DEF_PREFIX2 2B #define B_TXT_DEF_PREFIX2 0x2B
#define B_TXT_ATK_PREFIX3 2C #define B_TXT_ATK_PREFIX3 0x2C
#define B_TXT_DEF_PREFIX3 2D #define B_TXT_DEF_PREFIX3 0x2D
#define B_TXT_TRAINER2_CLASS 2E #define B_TXT_TRAINER2_CLASS 0x2E
#define B_TXT_TRAINER2_NAME 2F #define B_TXT_TRAINER2_NAME 0x2F
#define B_TXT_TRAINER2_LOSE_TEXT 30 #define B_TXT_TRAINER2_LOSE_TEXT 0x30
#define B_TXT_TRAINER2_WIN_TEXT 31 #define B_TXT_TRAINER2_WIN_TEXT 0x31
#define B_TXT_PARTNER_CLASS 32 #define B_TXT_PARTNER_CLASS 0x32
#define B_TXT_PARTNER_NAME 33 #define B_TXT_PARTNER_NAME 0x33
#define B_TXT_BUFF3 34 #define B_TXT_BUFF3 0x34
// for B_TXT_BUFF1, B_TXT_BUFF2 and B_TXT_BUFF3 // for B_TXT_BUFF1, B_TXT_BUFF2 and B_TXT_BUFF3

View File

@ -225,24 +225,25 @@ extern struct SaveBlock2 *gSaveBlock2Ptr;
struct SecretBaseRecord struct SecretBaseRecord
{ {
/*ID?*/ /*0x1A08*/ u8 sbr_field_0; u8 sbr_field_0;
/*0x1A09*/ u8 sbr_field_1_0:4; u8 sbr_field_1_0:4;
/*0x1A09*/ u8 gender:1; u8 gender:1;
/*0x1A09*/ u8 sbr_field_1_5:1; u8 sbr_field_1_5:1;
/*0x1A09*/ u8 sbr_field_1_6:2; u8 sbr_field_1_6:2;
/*0x1A0A*/ u8 sbr_field_2[7]; // 0xFF bytes? u8 trainerName[7];
/*0x1A12*/ u8 trainerId[4]; // byte 0 is used for determining trainer class u8 trainerId[4]; // byte 0 is used for determining trainer class
/*0x1A16*/ u16 sbr_field_e; u8 language;
/*0x1A18*/ u8 sbr_field_10; u16 sbr_field_e;
/*0x1A19*/ u8 sbr_field_11; u8 sbr_field_10;
/*0x1A1A*/ u8 decorations[16]; u8 sbr_field_11;
/*0x1A2A*/ u8 decorationPos[16]; u8 decorations[16];
/*0x1A3A*/ u32 partyPersonality[6]; u8 decorationPos[16];
/*0x1A54*/ u16 partyMoves[6 * 4]; u32 partyPersonality[6];
/*0x1A84*/ u16 partySpecies[6]; u16 partyMoves[6 * 4];
/*0x1A90*/ u16 partyHeldItems[6]; u16 partySpecies[6];
/*0x1A9C*/ u8 partyLevels[6]; u16 partyHeldItems[6];
/*0x1AA2*/ u8 partyEVs[6]; u8 partyLevels[6];
u8 partyEVs[6];
}; };
#include "game_stat.h" #include "game_stat.h"

View File

@ -344,7 +344,7 @@ const u8 gStatusConditionString_IceJpn[8] = _("こおり$$$$");
const u8 gStatusConditionString_ConfusionJpn[8] = _("こんらん$$$"); const u8 gStatusConditionString_ConfusionJpn[8] = _("こんらん$$$");
const u8 gStatusConditionString_LoveJpn[8] = _("メロメロ$$$"); const u8 gStatusConditionString_LoveJpn[8] = _("メロメロ$$$");
const u8 * const gStatusConditionStringsTable[][2] = const u8 * const gStatusConditionStringsTable[7][2] =
{ {
{gStatusConditionString_PoisonJpn, gText_Poison}, {gStatusConditionString_PoisonJpn, gText_Poison},
{gStatusConditionString_SleepJpn, gText_Sleep}, {gStatusConditionString_SleepJpn, gText_Sleep},

View File

@ -5,6 +5,10 @@
#include "moves.h" #include "moves.h"
#include "text.h" #include "text.h"
#include "string_util.h" #include "string_util.h"
#include "items.h"
#include "event_data.h"
#include "link.h"
#include "item.h"
extern u16 gLastUsedItem; extern u16 gLastUsedItem;
extern u8 gLastUsedAbility; extern u8 gLastUsedAbility;
@ -16,11 +20,16 @@ extern u8 gEffectBank;
extern u8 gAbilitiesPerBank[BATTLE_BANKS_COUNT]; extern u8 gAbilitiesPerBank[BATTLE_BANKS_COUNT];
extern u32 gBattleTypeFlags; extern u32 gBattleTypeFlags;
extern u16 gTrainerBattleOpponent_A; extern u16 gTrainerBattleOpponent_A;
extern u16 gTrainerBattleOpponent_B;
extern u16 gPartnerTrainerId;
extern u16 gBattlePartyID[BATTLE_BANKS_COUNT]; extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
extern struct BattleEnigmaBerry gEnigmaBerries[BATTLE_BANKS_COUNT]; extern struct BattleEnigmaBerry gEnigmaBerries[BATTLE_BANKS_COUNT];
extern u8 gBattleBufferA[BATTLE_BANKS_COUNT][0x200]; extern u8 gBattleBufferA[BATTLE_BANKS_COUNT][0x200];
extern const u8 gMoveNames[LAST_MOVE_INDEX + 1][13]; extern const u8 gMoveNames[LAST_MOVE_INDEX + 1][13];
extern const u8 gAbilityNames[][13];
extern const u8 gTrainerClassNames[][13];
extern const u8 gTypeNames[][7];
// strings // strings
extern const u8 gText_PkmnBoxSomeonesPCFull[]; extern const u8 gText_PkmnBoxSomeonesPCFull[];
@ -28,9 +37,24 @@ extern const u8 gText_PkmnBoxLanettesPCFull[];
extern const u8 gText_PkmnTransferredSomeonesPC[]; extern const u8 gText_PkmnTransferredSomeonesPC[];
extern const u8 gText_PkmnTransferredLanettesPC[]; 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);
// this file's functions // this file's functions
void sub_814F8F8(u8 *txtPtr); void sub_814F8F8(u8 *txtPtr);
void sub_814F950(u8 *txtPtr); void sub_814F950(u8 *txtPtr);
static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst);
// ewram variables // ewram variables
EWRAM_DATA u8 gDisplayedStringBattle[300] = {0}; EWRAM_DATA u8 gDisplayedStringBattle[300] = {0};
@ -64,33 +88,33 @@ const u8 gText_PkmnFainted2[] = _("{B_DEF_NAME_WITH_PREFIX}\nfainted!\p");
const u8 gText_PlayerGotMoney[] = _("{B_PLAYER_NAME} got ¥{B_BUFF1}\nfor winning!\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_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_PlayerWhiteout2[] = _("{B_PLAYER_NAME} whited out!{PAUSE_UNTIL_PRESS}");
const u8 gText_PreventsEscape[] = _("{B_ACTIVE_NAME_WITH_PREFIX} prevents\nescape with {B_SCR_ACTIVE_ABILITY}!\p"); const u8 gText_PreventsEscape[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} prevents\nescape with {B_SCR_ACTIVE_ABILITY}!\p");
const u8 gText_CantEscape2[] = _("Cant escape!\p"); const u8 gText_CantEscape2[] = _("Cant escape!\p");
const u8 gText_PkmnCantEscape2[] = _("{B_ATK_NAME_WITH_PREFIX} cant escape!"); const u8 gText_PkmnCantEscape2[] = _("{B_ATK_NAME_WITH_PREFIX} cant escape!");
const u8 gText_HitXTimes[] = _("Hit {B_BUFF1} time(s)!"); const u8 gText_HitXTimes[] = _("Hit {B_BUFF1} time(s)!");
const u8 gText_PkmnFellAsleep[] = _("{B_EFF_NAME_WITH_PREFIX}\nfell asleep!"); const u8 gText_PkmnFellAsleep[] = _("{B_EFF_NAME_WITH_PREFIX}\nfell asleep!");
const u8 gText_PkmnMadeSleep[] = _("{B_ACTIVE_NAME_WITH_PREFIX}s {B_SCR_ACTIVE_ABILITY}\nmade {B_EFF_NAME_WITH_PREFIX} sleep!"); 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_PkmnAlreadyAsleep[] = _("{B_DEF_NAME_WITH_PREFIX} is\nalready asleep!");
const u8 gText_PkmnAlreadyAsleep2[] = _("{B_ATK_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}\nwasnt affected!"); const u8 gText_PkmnWasntAffected[] = _("{B_DEF_NAME_WITH_PREFIX}\nwasnt affected!");
const u8 gText_PkmnWasPoisoned[] = _("{B_EFF_NAME_WITH_PREFIX}\nwas poisoned!"); const u8 gText_PkmnWasPoisoned[] = _("{B_EFF_NAME_WITH_PREFIX}\nwas poisoned!");
const u8 gText_PkmnPoisonedBy[] = _("{B_ACTIVE_NAME_WITH_PREFIX}s {B_SCR_ACTIVE_ABILITY}\npoisoned {B_EFF_NAME_WITH_PREFIX}!"); 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_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_PkmnAlreadyPoisoned[] = _("{B_DEF_NAME_WITH_PREFIX} is already\npoisoned.");
const u8 gText_PkmnBadlyPoisoned[] = _("{B_EFF_NAME_WITH_PREFIX} is badly\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_PkmnEnergyDrained[] = _("{B_DEF_NAME_WITH_PREFIX} had its\nenergy drained!");
const u8 gText_PkmnWasBurned[] = _("{B_EFF_NAME_WITH_PREFIX} was burned!"); const u8 gText_PkmnWasBurned[] = _("{B_EFF_NAME_WITH_PREFIX} was burned!");
const u8 gText_PkmnBurnedBy[] = _("{B_ACTIVE_NAME_WITH_PREFIX}s {B_SCR_ACTIVE_ABILITY}\nburned {B_EFF_NAME_WITH_PREFIX}!"); 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_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_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_PkmnWasFrozen[] = _("{B_EFF_NAME_WITH_PREFIX} was\nfrozen solid!");
const u8 gText_PkmnFrozenBy[] = _("{B_ACTIVE_NAME_WITH_PREFIX}s {B_SCR_ACTIVE_ABILITY}\nfroze {B_EFF_NAME_WITH_PREFIX} 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_PkmnIsFrozen[] = _("{B_ATK_NAME_WITH_PREFIX} is\nfrozen solid!");
const u8 gText_PkmnWasDefrosted[] = _("{B_DEF_NAME_WITH_PREFIX} was\ndefrosted!"); 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_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_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_PkmnWasParalyzed[] = _("{B_EFF_NAME_WITH_PREFIX} is paralyzed!\nIt may be unable to move!");
const u8 gText_PkmnWasParalyzedBy[] = _("{B_ACTIVE_NAME_WITH_PREFIX}s {B_SCR_ACTIVE_ABILITY}\nparalyzed {B_EFF_NAME_WITH_PREFIX}!\lIt 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 cant move!"); const u8 gText_PkmnIsParalyzed[] = _("{B_ATK_NAME_WITH_PREFIX} is paralyzed!\nIt cant move!");
const u8 gText_PkmnIsAlreadyParalyzed[] = _("{B_DEF_NAME_WITH_PREFIX} is\nalready paralyzed!"); 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_PkmnHealedParalysis[] = _("{B_DEF_NAME_WITH_PREFIX} was\nhealed of paralysis!");
@ -104,7 +128,7 @@ const u8 gText_PkmnHealedConfusion[] = _("{B_ATK_NAME_WITH_PREFIX} snapped\nout
const u8 gText_PkmnWasConfused[] = _("{B_EFF_NAME_WITH_PREFIX} became\nconfused!"); 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_PkmnAlreadyConfused[] = _("{B_DEF_NAME_WITH_PREFIX} is\nalready confused!");
const u8 gText_PkmnFellInLove[] = _("{B_DEF_NAME_WITH_PREFIX}\nfell in love!"); 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_ACTIVE_NAME_WITH_PREFIX}!"); 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_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_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_PkmnChangedType[] = _("{B_ATK_NAME_WITH_PREFIX} transformed\ninto the {B_BUFF1} type!");
@ -137,7 +161,7 @@ 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_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_PkmnCrashed[] = _("{B_ATK_NAME_WITH_PREFIX} kept going\nand crashed!");
const u8 gText_PkmnShroudedInMist[] = _("{B_ATK_PREFIX2} became\nshrouded in MIST!"); const u8 gText_PkmnShroudedInMist[] = _("{B_ATK_PREFIX2} became\nshrouded in MIST!");
const u8 gText_PkmnProtectedByMist[] = _("{B_ACTIVE_NAME_WITH_PREFIX} is protected\nby 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_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_PkmnHitWithRecoil[] = _("{B_ATK_NAME_WITH_PREFIX} is hit\nwith recoil!");
const u8 gText_PkmnProtectedItself2[] = _("{B_ATK_NAME_WITH_PREFIX} protected\nitself!"); const u8 gText_PkmnProtectedItself2[] = _("{B_ATK_NAME_WITH_PREFIX} protected\nitself!");
@ -149,7 +173,7 @@ const u8 gText_PkmnEvadedAttack[] = _("{B_DEF_NAME_WITH_PREFIX} evaded\nthe atta
const u8 gText_PkmnSappedByLeechSeed[] = _("{B_ATK_NAME_WITH_PREFIX}s health is\nsapped by LEECH SEED!"); 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_PkmnFastAsleep[] = _("{B_ATK_NAME_WITH_PREFIX} is fast\nasleep.");
const u8 gText_PkmnWokeUp[] = _("{B_ATK_NAME_WITH_PREFIX} woke up!"); const u8 gText_PkmnWokeUp[] = _("{B_ATK_NAME_WITH_PREFIX} woke up!");
const u8 gText_PkmnUproarKeptAwake[] = _("But {B_ACTIVE_NAME_WITH_PREFIX}s UPROAR\nkept it awake!"); 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_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_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_PkmnMakingUproar[] = _("{B_ATK_NAME_WITH_PREFIX} is making\nan UPROAR!");
@ -188,7 +212,7 @@ const u8 gText_PkmnLockedInNightmare[] = _("{B_ATK_NAME_WITH_PREFIX} is locked\n
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_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_PkmnAfflictedByCurse[] = _("{B_ATK_NAME_WITH_PREFIX} is afflicted\nby the CURSE!");
const u8 gText_SpikesScattered[] = _("SPIKES were scattered all around\nthe opponents side!"); const u8 gText_SpikesScattered[] = _("SPIKES were scattered all around\nthe opponents side!");
const u8 gText_PkmnHurtBySpikes[] = _("{B_ACTIVE_NAME_WITH_PREFIX} is hurt\nby SPIKES!"); 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_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_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_PkmnBracedItself[] = _("{B_ATK_NAME_WITH_PREFIX} braced\nitself!");
@ -231,25 +255,25 @@ const u8 gText_PkmnLostPPGrudge[] = _("{B_ATK_NAME_WITH_PREFIX}s {B_BUFF1} lo
const u8 gText_PkmnShroudedItself[] = _("{B_ATK_NAME_WITH_PREFIX} shrouded\nitself in {B_CURRENT_MOVE}!"); 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_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_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_ACTIVE_NAME_WITH_PREFIX}s move!"); const u8 gText_PkmnSnatchedMove[] = _("{B_DEF_NAME_WITH_PREFIX} SNATCHED\n{B_SCR_ACTIVE_NAME_WITH_PREFIX}s move!");
const u8 gText_ElectricityWeakened[] = _("Electricitys power was\nweakened!"); const u8 gText_ElectricityWeakened[] = _("Electricitys power was\nweakened!");
const u8 gText_FireWeakened[] = _("Fires power was\nweakened!"); const u8 gText_FireWeakened[] = _("Fires power was\nweakened!");
const u8 gText_XFoundOneY[] = _("{B_ATK_NAME_WITH_PREFIX} found\none {B_LAST_ITEM}!"); 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_SoothingAroma[] = _("A soothing aroma wafted\nthrough the area!");
const u8 gText_ItemsCantBeUsedNow[] = _("Items cant be used now.{PAUSE 64}"); const u8 gText_ItemsCantBeUsedNow[] = _("Items cant be used now.{PAUSE 64}");
const u8 gText_ForXCommaYZ[] = _("For {B_ACTIVE_NAME_WITH_PREFIX},\n{B_LAST_ITEM} {B_BUFF1}"); const u8 gText_ForXCommaYZ[] = _("For {B_SCR_ACTIVE_NAME_WITH_PREFIX},\n{B_LAST_ITEM} {B_BUFF1}");
const u8 gText_PkmnUsedXToGetPumped[] = _("{B_ACTIVE_NAME_WITH_PREFIX} used\n{B_LAST_ITEM} to get pumped!"); 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 couldnt move!"); const u8 gText_PkmnLostFocus[] = _("{B_ATK_NAME_WITH_PREFIX} lost its\nfocus and couldnt move!");
const u8 gText_PkmnWasDraggedOut[] = _("{B_DEF_NAME_WITH_PREFIX} was\ndragged out!\p"); const u8 gText_PkmnWasDraggedOut[] = _("{B_DEF_NAME_WITH_PREFIX} was\ndragged out!\p");
const u8 gText_TheWallShattered[] = _("The wall shattered!"); const u8 gText_TheWallShattered[] = _("The wall shattered!");
const u8 gText_ButNoEffect[] = _("But it had no effect!"); const u8 gText_ButNoEffect[] = _("But it had no effect!");
const u8 gText_PkmnHasNoMovesLeft[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} has no\nmoves left!\p"); const u8 gText_PkmnHasNoMovesLeft[] = _("{B_ACTIVE_NAME_WITH_PREFIX} has no\nmoves left!\p");
const u8 gText_PkmnMoveIsDisabled[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}s {B_CURRENT_MOVE}\nis disabled!\p"); const u8 gText_PkmnMoveIsDisabled[] = _("{B_ACTIVE_NAME_WITH_PREFIX}s {B_CURRENT_MOVE}\nis disabled!\p");
const u8 gText_PkmnCantUseMoveTorment[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} cant use the same\nmove in a row due to the TORMENT!\p"); const u8 gText_PkmnCantUseMoveTorment[] = _("{B_ACTIVE_NAME_WITH_PREFIX} cant use the same\nmove in a row due to the TORMENT!\p");
const u8 gText_PkmnCantUseMoveTaunt[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} cant use\n{B_CURRENT_MOVE} after the TAUNT!\p"); const u8 gText_PkmnCantUseMoveTaunt[] = _("{B_ACTIVE_NAME_WITH_PREFIX} cant use\n{B_CURRENT_MOVE} after the TAUNT!\p");
const u8 gText_PkmnCantUseMoveSealed[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} cant use the\nsealed {B_CURRENT_MOVE}!\p"); const u8 gText_PkmnCantUseMoveSealed[] = _("{B_ACTIVE_NAME_WITH_PREFIX} cant use the\nsealed {B_CURRENT_MOVE}!\p");
const u8 gText_PkmnMadeItRain[] = _("{B_ACTIVE_NAME_WITH_PREFIX}s {B_SCR_ACTIVE_ABILITY}\nmade it rain!"); const u8 gText_PkmnMadeItRain[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}s {B_SCR_ACTIVE_ABILITY}\nmade it rain!");
const u8 gText_PkmnRaisedSpeed[] = _("{B_ACTIVE_NAME_WITH_PREFIX}s {B_SCR_ACTIVE_ABILITY}\nraised its SPEED!"); 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_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_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_PkmnRestoredHPUsing[] = _("{B_DEF_NAME_WITH_PREFIX} restored HP\nusing its {B_DEF_ABILITY}!");
@ -261,37 +285,37 @@ const u8 gText_PkmnPreventsPoisoningWith[] = _("{B_EFF_NAME_WITH_PREFIX}s {B_
const u8 gText_PkmnPreventsConfusionWith[] = _("{B_DEF_NAME_WITH_PREFIX}s {B_DEF_ABILITY}\nprevents confusion!"); 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_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_PkmnAnchorsItselfWith[] = _("{B_DEF_NAME_WITH_PREFIX} anchors\nitself with {B_DEF_ABILITY}!");
const u8 gText_PkmnCutsAttackWith[] = _("{B_ACTIVE_NAME_WITH_PREFIX}s {B_SCR_ACTIVE_ABILITY}\ncuts {B_DEF_NAME_WITH_PREFIX}s ATTACK!"); 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_ACTIVE_NAME_WITH_PREFIX}s {B_SCR_ACTIVE_ABILITY}\nprevents stat loss!"); 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_PkmnHurtsWith[] = _("{B_DEF_NAME_WITH_PREFIX}s {B_DEF_ABILITY}\nhurt {B_ATK_NAME_WITH_PREFIX}!");
const u8 gText_PkmnTraced[] = _("{B_ACTIVE_NAME_WITH_PREFIX} TRACED\n{B_BUFF1}s {B_BUFF2}!"); 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 {STRING 27}\nprevents burns!"); const u8 gText_PkmnsXPreventsBurns[] = _("{B_EFF_NAME_WITH_PREFIX}s {STRING 27}\nprevents burns!");
const u8 gText_PkmnsXBlocksY[] = _("{B_DEF_NAME_WITH_PREFIX}s {B_DEF_ABILITY}\nblocks {B_CURRENT_MOVE}!"); const u8 gText_PkmnsXBlocksY[] = _("{B_DEF_NAME_WITH_PREFIX}s {B_DEF_ABILITY}\nblocks {B_CURRENT_MOVE}!");
const u8 gText_PkmnsXBlocksY2[] = _("{B_ACTIVE_NAME_WITH_PREFIX}s {B_SCR_ACTIVE_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 {STRING 24}\nrestored its HP a little!"); const u8 gText_PkmnsXRestoredHPALittle2[] = _("{B_ATK_NAME_WITH_PREFIX}s {STRING 24}\nrestored its HP a little!");
const u8 gText_PkmnsXWhippedUpSandstorm[] = _("{B_ACTIVE_NAME_WITH_PREFIX}s {B_SCR_ACTIVE_ABILITY}\nwhipped up a sandstorm!"); const u8 gText_PkmnsXWhippedUpSandstorm[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}s {B_SCR_ACTIVE_ABILITY}\nwhipped up a sandstorm!");
const u8 gText_PkmnsXIntensifiedSun[] = _("{B_ACTIVE_NAME_WITH_PREFIX}s {B_SCR_ACTIVE_ABILITY}\nintensified the suns rays!"); const u8 gText_PkmnsXIntensifiedSun[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}s {B_SCR_ACTIVE_ABILITY}\nintensified the suns rays!");
const u8 gText_PkmnsXPreventsYLoss[] = _("{B_ACTIVE_NAME_WITH_PREFIX}s {B_SCR_ACTIVE_ABILITY}\nprevents {B_BUFF1} loss!"); 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_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_PkmnsXMadeYIneffective[] = _("{B_DEF_NAME_WITH_PREFIX}s {B_DEF_ABILITY}\nmade {B_CURRENT_MOVE} ineffective!");
const u8 gText_PkmnsXCuredYProblem[] = _("{B_ACTIVE_NAME_WITH_PREFIX}s {B_SCR_ACTIVE_ABILITY}\ncured its {B_BUFF1} problem!"); 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_ItSuckedLiquidOoze[] = _("It sucked up the\nLIQUID OOZE!");
const u8 gText_PkmnTransformed[] = _("{B_ACTIVE_NAME_WITH_PREFIX} transformed!"); 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_PkmnsXTookAttack[] = _("{B_DEF_NAME_WITH_PREFIX}s {B_DEF_ABILITY}\ntook the attack!");
const u8 gText_PkmnsXPreventsSwitching[] = _("{B_BUFF1}s {STRING 23}\nprevents switching!\p"); const u8 gText_PkmnsXPreventsSwitching[] = _("{B_BUFF1}s {STRING 23}\nprevents switching!\p");
const u8 gText_PreventedFromWorking[] = _("{B_DEF_NAME_WITH_PREFIX}s {B_DEF_ABILITY}\nprevented {B_ACTIVE_NAME_WITH_PREFIX}s\l{B_BUFF1} from working!"); 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_ACTIVE_NAME_WITH_PREFIX}s {B_SCR_ACTIVE_ABILITY}\nmade it ineffective!"); 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 {STRING 27}\nprevents flinching!"); const u8 gText_PkmnsXPreventsFlinching[] = _("{B_EFF_NAME_WITH_PREFIX}s {STRING 27}\nprevents flinching!");
const u8 gText_PkmnsXPreventsYsZ[] = _("{B_ATK_NAME_WITH_PREFIX}s {STRING 24}\nprevents {B_DEF_NAME_WITH_PREFIX}s\l{B_DEF_ABILITY} from working!"); const u8 gText_PkmnsXPreventsYsZ[] = _("{B_ATK_NAME_WITH_PREFIX}s {STRING 24}\nprevents {B_DEF_NAME_WITH_PREFIX}s\l{B_DEF_ABILITY} from working!");
const u8 gText_PkmnsXCuredItsYProblem[] = _("{B_ACTIVE_NAME_WITH_PREFIX}s {B_SCR_ACTIVE_ABILITY}\ncured its {B_BUFF1} problem!"); 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_ACTIVE_NAME_WITH_PREFIX}s {B_SCR_ACTIVE_ABILITY}\nhad no effect on {B_EFF_NAME_WITH_PREFIX}!"); 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_StatSharply[] = _("sharply ");
const u8 gText_StatRose[] = _("rose!"); const u8 gText_StatRose[] = _("rose!");
const u8 gText_StatHarshly[] = _("harshly "); const u8 gText_StatHarshly[] = _("harshly ");
const u8 gText_StatFell[] = _("fell!"); const u8 gText_StatFell[] = _("fell!");
const u8 gText_PkmnsStatChanged[] = _("{B_ATK_NAME_WITH_PREFIX}s {B_BUFF1}\n{B_BUFF2}"); 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_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_ACTIVE_NAME_WITH_PREFIX} {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_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_PkmnsStatChanged4[] = _("{B_DEF_NAME_WITH_PREFIX}s {B_BUFF1}\n{B_BUFF2}");
const u8 gText_StatsWontIncrease2[] = _("{B_ATK_NAME_WITH_PREFIX}s stats wont\ngo any higher!"); const u8 gText_StatsWontIncrease2[] = _("{B_ATK_NAME_WITH_PREFIX}s stats wont\ngo any higher!");
@ -462,18 +486,18 @@ const u8 gText_SandstormIsRaging[] = _("A sandstorm is raging.");
const u8 gText_BoxIsFull[] = _("The BOX is full!\nYou cant catch any more!\p"); const u8 gText_BoxIsFull[] = _("The BOX is full!\nYou cant catch any more!\p");
const u8 gText_EnigmaBerry[] = _("ENIGMA BERRY"); const u8 gText_EnigmaBerry[] = _("ENIGMA BERRY");
const u8 gText_BerrySuffix[] = _(" BERRY"); const u8 gText_BerrySuffix[] = _(" BERRY");
const u8 gText_PkmnsItemCuredParalysis[] = _("{B_ACTIVE_NAME_WITH_PREFIX}s {B_LAST_ITEM}\ncured paralysis!"); const u8 gText_PkmnsItemCuredParalysis[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}s {B_LAST_ITEM}\ncured paralysis!");
const u8 gText_PkmnsItemCuredPoison[] = _("{B_ACTIVE_NAME_WITH_PREFIX}s {B_LAST_ITEM}\ncured poison!"); const u8 gText_PkmnsItemCuredPoison[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}s {B_LAST_ITEM}\ncured poison!");
const u8 gText_PkmnsItemHealedBurn[] = _("{B_ACTIVE_NAME_WITH_PREFIX}s {B_LAST_ITEM}\nhealed its burn!"); const u8 gText_PkmnsItemHealedBurn[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}s {B_LAST_ITEM}\nhealed its burn!");
const u8 gText_PkmnsItemDefrostedIt[] = _("{B_ACTIVE_NAME_WITH_PREFIX}s {B_LAST_ITEM}\ndefrosted it!"); const u8 gText_PkmnsItemDefrostedIt[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}s {B_LAST_ITEM}\ndefrosted it!");
const u8 gText_PkmnsItemWokeIt[] = _("{B_ACTIVE_NAME_WITH_PREFIX}s {B_LAST_ITEM}\nwoke it from its sleep!"); const u8 gText_PkmnsItemWokeIt[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}s {B_LAST_ITEM}\nwoke it from its sleep!");
const u8 gText_PkmnsItemSnappedOut[] = _("{B_ACTIVE_NAME_WITH_PREFIX}s {B_LAST_ITEM}\nsnapped it out of confusion!"); const u8 gText_PkmnsItemSnappedOut[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}s {B_LAST_ITEM}\nsnapped it out of confusion!");
const u8 gText_PkmnsItemCuredProblem[] = _("{B_ACTIVE_NAME_WITH_PREFIX}s {B_LAST_ITEM}\ncured its {B_BUFF1} problem!"); const u8 gText_PkmnsItemCuredProblem[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}s {B_LAST_ITEM}\ncured its {B_BUFF1} problem!");
const u8 gText_PkmnsItemNormalizedStatus[] = _("{B_ACTIVE_NAME_WITH_PREFIX}s {B_LAST_ITEM}\nnormalized its status!"); const u8 gText_PkmnsItemNormalizedStatus[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}s {B_LAST_ITEM}\nnormalized its status!");
const u8 gText_PkmnsItemRestoredHealth[] = _("{B_ACTIVE_NAME_WITH_PREFIX}s {B_LAST_ITEM}\nrestored health!"); const u8 gText_PkmnsItemRestoredHealth[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}s {B_LAST_ITEM}\nrestored health!");
const u8 gText_PkmnsItemRestoredPP[] = _("{B_ACTIVE_NAME_WITH_PREFIX}s {B_LAST_ITEM}\nrestored {B_BUFF1}s PP!"); const u8 gText_PkmnsItemRestoredPP[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}s {B_LAST_ITEM}\nrestored {B_BUFF1}s PP!");
const u8 gText_PkmnsItemRestoredStatus[] = _("{B_ACTIVE_NAME_WITH_PREFIX}s {B_LAST_ITEM}\nrestored its status!"); const u8 gText_PkmnsItemRestoredStatus[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX}s {B_LAST_ITEM}\nrestored its status!");
const u8 gText_PkmnsItemRestoredHPALittle[] = _("{B_ACTIVE_NAME_WITH_PREFIX}s {B_LAST_ITEM}\nrestored its HP a little!"); 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_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_PkmnHungOnWithX[] = _("{B_DEF_NAME_WITH_PREFIX} hung on\nusing its {B_LAST_ITEM}!");
const u8 gText_EmptyString3[] = _(""); const u8 gText_EmptyString3[] = _("");
@ -910,7 +934,7 @@ 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_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_PkmnStoppedEvolving[] = _("Huh? {STR_VAR_1}\nstopped evolving!\p");
const u8 gText_EllipsisQuestionMark[] = _("……?\p"); const u8 gText_EllipsisQuestionMark[] = _("……?\p");
const u8 gText_WhatWillPkmnDo[] = _("What will\n{B_SCR_ACTIVE_NAME_WITH_PREFIX} do?"); 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_WhatWillPkmnDo2[] = _("What will\n{B_PLAYER_NAME} do?");
const u8 gText_WhatWillWallyDo[] = _("What will\nWALLY do?"); const u8 gText_WhatWillWallyDo[] = _("What will\nWALLY do?");
const u8 gText_LinkStandby[] = _("{PAUSE 16}Link standby…"); const u8 gText_LinkStandby[] = _("{PAUSE 16}Link standby…");
@ -1013,10 +1037,10 @@ const u8 gText_InGamePartnerSentOutZGoN[] = _("{B_PARTNER_CLASS} {B_PARTNER_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_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_Trainer2LoseText[] = _("{B_TRAINER2_LOSE_TEXT}");
const u8 gText_PkmnIncapableOfPower[] = _("{B_ATK_NAME_WITH_PREFIX} appears incapable\nof using its power!"); 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_ACTIVE_NAME_WITH_PREFIX}s eyes!"); const u8 gText_GlintAppearsInEye[] = _("A glint appears in\n{B_SCR_ACTIVE_NAME_WITH_PREFIX}s eyes!");
const u8 gText_PkmnGettingIntoPosition[] = _("{B_ACTIVE_NAME_WITH_PREFIX} is getting into\nposition!"); const u8 gText_PkmnGettingIntoPosition[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is getting into\nposition!");
const u8 gText_PkmnBeganGrowlingDeeply[] = _("{B_ACTIVE_NAME_WITH_PREFIX} began growling deeply!"); const u8 gText_PkmnBeganGrowlingDeeply[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} began growling deeply!");
const u8 gText_PkmnEagerForMore[] = _("{B_ACTIVE_NAME_WITH_PREFIX} is eager for more!"); const u8 gText_PkmnEagerForMore[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is eager for more!");
const u16 gUnknown_085CCF0A[] = const u16 gUnknown_085CCF0A[] =
{ {
@ -1080,7 +1104,7 @@ const u16 gUnknown_085CD336[] =
0x0104, 0x0110, 0x011b, 0x0141, 0x0157, 0x0000, 0x0104, 0x0110, 0x011b, 0x0141, 0x0157, 0x0000,
}; };
const u8 gUnknown_085CD422[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0}; static const u8 sDummyWeirdStatusString[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0};
const u16 gUnknown_085CD42C[] = const u16 gUnknown_085CD42C[] =
{ {
@ -1426,3 +1450,620 @@ void BufferStringBattle(u16 stringID)
BattleStringExpandPlaceholdersToDisplayedString(stringPtr); 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;
extern u8 gUnknown_0203C7B4;
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;
}
}
}