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.

Contents

  1. Define alternative plural phrases
  2. Define plural trainer classes
  3. Use "ENEMIES want to battle!"
  4. Use "ENEMIES were defeated!"
  5. Use "ENEMIES are about to use…"

1. Define alternative plural phrases

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.)

2. Define plural trainer classes

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.

3. Use "ENEMIES want to battle!"

Edit engine/battle/core.asm again:

 BattleStartMessage:
 	...
	farcall Battle_GetTrainerName

+	ld hl, WantToBattlePluralText
+	call IsPluralTrainer
+	jr z, .PrintBattleStartText
 	ld hl, WantsToBattleText
 	jr .PrintBattleStartText

 .wild
 	...

4. Use "ENEMIES were defeated!"

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

5. Use "ENEMIES are about to use…"

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!

Screenshot

⚠️ **GitHub.com Fallback** ⚠️