Correct grammar for plural trainers like Twins - pret/pokecrystal GitHub Wiki
Battles begin with the phrase "ENEMY wants to battle!" and end with "ENEMY was defeated!" This makes sense if "ENEMY" is something like "YOUNGSTER JOEY", but it's ungrammatical for plural trainers like "TWINS AMY & MAY".
Gen 3 addressed this issue by changing the phrases to "ENEMY would like to battle!" and "Player defeated ENEMY!" And then Gen 4 changed the starting phrase to "You are challenged by ENEMY!" But some people don't like the politeness of Gen 3, or the passive voice of Gen 4. (*ahem*) Plus they're both more verbose than the original Gen 2 phrases, which really matters when the textboxes are so small, and the "ENEMY" name can take up an entire line (like "MYSTICALMAN EUSINE").
The alternative is to use the correct grammar for plural trainers: "ENEMIES want to battle!" and "ENEMIES were defeated!" This is fairly simple to implement. If you've worked with event scripts before but not assembly code, this is a good feature to start with.
- Define alternative plural phrases
- Define plural trainer classes
- Use "ENEMIES want to battle!"
- Use "ENEMIES were defeated!"
- Use "ENEMIES are about to use…"
Edit data/text/battle.asm:
WantsToBattleText::
text "<ENEMY>"
line "wants to battle!"
prompt
+
+WantToBattlePluralText::
+ text "<ENEMY>"
+ line "want to battle!"
+ prompt
...
BattleText_EnemyWasDefeated:
text "<ENEMY>"
line "was defeated!"
prompt
+
+BattleText_PluralEnemyWereDefeated:
+ text "<ENEMY>"
+ line "were defeated!"
+ prompt
...
BattleText_EnemyIsAboutToUseWillPlayerChangeMon:
text "<ENEMY>"
line "is about to use"
cont "@"
text_ram wEnemyMonNickname
text "."
para "Will <PLAYER>"
line "change #MON?"
done
+
+BattleText_PluralEnemyAreAboutToUseWillPlayerChangeMon:
+ text "<ENEMY>"
+ line "are about to use"
+ cont "@"
+ text_ram wEnemyMonNickname
+ text "."
+
+ para "Will <PLAYER>"
+ line "change #MON?"
+ done
(Yes, while looking through the file I found a third phrase using "<ENEMY>
" that needed a different plural form. All the rest are okay as-is.)
Edit engine/battle/core.asm:
IsKantoGymLeader:
ld hl, KantoGymLeaders
jr IsGymLeaderCommon
IsGymLeader:
ld hl, GymLeaders
IsGymLeaderCommon:
push de
ld a, [wOtherTrainerClass]
ld de, 1
call IsInArray
pop de
ret
INCLUDE "data/trainers/leaders.asm"
+
+IsPluralTrainer:
+; return z for plural trainers
+ ld a, [wOtherTrainerClass]
+ cp TWINS
+ ret
IsPluralTrainer
sets the zero flag if [wOtherTrainerClass]
is TWINS
. If you had more plural classes, like ACE_DUO
or SIS_AND_BRO
, you could check for them all like this:
IsPluralTrainer:
; return z for plural trainers
ld a, [wOtherTrainerClass]
cp TWINS
ret z
cp ACE_DUO
ret z
; ...etc
cp SIS_AND_BRO
ret
We're not using the more complicated IsGymLeaderCommon
method, which calls IsInArray
, because it's overkill without a long list of items to check.
Now we just have to find where those three original phrases are used, and call IsPluralTrainer
to decide whether to use the new phrases instead.
Edit engine/battle/core.asm again:
BattleStartMessage:
...
farcall Battle_GetTrainerName
+ ld hl, WantToBattlePluralText
+ call IsPluralTrainer
+ jr z, .PrintBattleStartText
ld hl, WantsToBattleText
jr .PrintBattleStartText
.wild
...
Edit engine/battle/core.asm again:
WinTrainerBattle:
...
callfar Battle_GetTrainerName
+ ld hl, BattleText_PluralEnemyWereDefeated
+ call IsPluralTrainer
+ jr z, .got_defeat_phrase
ld hl, BattleText_EnemyWasDefeated
+.got_defeat_phrase:
call StdBattleTextbox
Edit engine/battle/core.asm again:
OfferSwitch:
ld a, [wCurPartyMon]
push af
callfar Battle_GetTrainerName
+ ld hl, BattleText_PluralEnemyAreAboutToUseWillPlayerChangeMon
+ call IsPluralTrainer
+ jr z, .got_switch_phrase
ld hl, BattleText_EnemyIsAboutToUseWillPlayerChangeMon
+.got_switch_phrase:
call StdBattleTextbox
...
That's all!