summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--asm/macros/battle_anim_script.inc76
-rw-r--r--data/battle_anim_scripts.s46
-rw-r--r--data/battle_scripts_1.s4
-rw-r--r--graphics/battle_anims/unused_water.bin (renamed from graphics/unknown/unknown_593FFC.bin)bin4096 -> 4096 bytes
-rw-r--r--graphics/battle_anims/unused_water_gfx.png (renamed from graphics/unknown/unknown_593C80.png)bin286 -> 286 bytes
-rw-r--r--include/battle.h46
-rw-r--r--include/battle_anim.h8
-rw-r--r--include/battle_arena.h1
-rw-r--r--include/battle_gfx_sfx_util.h1
-rw-r--r--include/battle_main.h14
-rw-r--r--include/battle_pyramid_bag.h1
-rw-r--r--include/battle_transition.h107
-rw-r--r--include/battle_util.h58
-rw-r--r--include/constants/battle.h13
-rw-r--r--include/constants/battle_anim.h2
-rw-r--r--include/contest.h2
-rw-r--r--include/gym_leader_rematch.h6
-rw-r--r--include/recorded_battle.h6
-rw-r--r--src/battle_ai_script_commands.c2
-rw-r--r--src/battle_anim.c227
-rwxr-xr-xsrc/battle_anim_effects_2.c8
-rwxr-xr-xsrc/battle_anim_effects_3.c4
-rw-r--r--src/battle_anim_ice.c4
-rw-r--r--src/battle_anim_mons.c75
-rw-r--r--src/battle_anim_rock.c2
-rw-r--r--src/battle_anim_utility_funcs.c8
-rw-r--r--src/battle_anim_water.c7
-rw-r--r--src/battle_bg.c23
-rw-r--r--src/battle_controller_player.c14
-rw-r--r--src/battle_gfx_sfx_util.c19
-rw-r--r--src/battle_intro.c23
-rw-r--r--src/battle_main.c453
-rw-r--r--src/battle_message.c3
-rw-r--r--src/battle_script_commands.c116
-rw-r--r--src/battle_setup.c63
-rw-r--r--src/battle_tower.c20
-rw-r--r--src/battle_util.c455
-rw-r--r--src/battle_util2.c8
-rw-r--r--src/contest.c12
-rw-r--r--src/data/text/match_call_messages.h2
-rwxr-xr-xsrc/party_menu.c4
-rw-r--r--src/pokeball.c4
-rw-r--r--src/pokemon.c3
-rw-r--r--src/pokenav_match_call_data.c2
-rw-r--r--src/recorded_battle.c82
46 files changed, 1003 insertions, 1032 deletions
diff --git a/.gitignore b/.gitignore
index 38c3e02d6..9286b03c4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -34,3 +34,4 @@ porymap.project.cfg
*.a
.fuse_hidden*
*.sna
+*.diff
diff --git a/asm/macros/battle_anim_script.inc b/asm/macros/battle_anim_script.inc
index 5426cdfba..df8953a85 100644
--- a/asm/macros/battle_anim_script.inc
+++ b/asm/macros/battle_anim_script.inc
@@ -34,20 +34,20 @@
.Lcreatetask_\@_2:
.endm
- .macro delay param0:req
+ .macro delay frames:req
.byte 0x4
- .byte \param0
+ .byte \frames
.endm
.macro waitforvisualfinish
.byte 0x5
.endm
- .macro hang1
+ .macro nop
.byte 0x6
.endm
- .macro hang2
+ .macro nop2
.byte 0x7
.endm
@@ -79,30 +79,30 @@
.byte 0xd
.endm
- .macro call param0:req
+ .macro call ptr:req
.byte 0xe
- .4byte \param0
+ .4byte \ptr
.endm
.macro return
.byte 0xf
.endm
- .macro setarg param0:req, param1:req
+ .macro setarg argId:req, value:req
.byte 0x10
- .byte \param0
- .2byte \param1
+ .byte \argId
+ .2byte \value
.endm
- .macro choosetwoturnanim param0:req, param1:req
+ .macro choosetwoturnanim ptr1:req, ptr2:req
.byte 0x11
- .4byte \param0
- .4byte \param1
+ .4byte \ptr1
+ .4byte \ptr2
.endm
- .macro jumpifmoveturn param0:req, ptr:req
+ .macro jumpifmoveturn value:req, ptr:req
.byte 0x12
- .byte \param0
+ .byte \value
.4byte \ptr
.endm
@@ -144,13 +144,13 @@
.byte \pan
.endm
- .macro panse_1B se:req, param1:req, param2:req, param3:req, param4:req
+ .macro panse se:req, currentPan:req, targetPan:req, incrementPan:req, delay:req
.byte 0x1b
.2byte \se
- .byte \param1
- .byte \param2
- .byte \param3
- .byte \param4
+ .byte \currentPan
+ .byte \targetPan
+ .byte \incrementPan
+ .byte \delay
.endm
.macro loopsewithpan se:req, pan:req, wait:req, times:req
@@ -168,9 +168,9 @@
.byte \wait
.endm
- .macro setbldcnt param0:req
+ .macro setbldcnt bldcnt:req
.byte 0x1e
- .2byte \param0
+ .2byte \bldcnt
.endm
.macro createsoundtask addr:req, argv:vararg
@@ -186,10 +186,10 @@
.byte 0x20
.endm
- .macro jumpargeq param0:req, param1:req, ptr:req
+ .macro jumpargeq argId:req, value:req, ptr:req
.byte 0x21
- .byte \param0
- .2byte \param1
+ .byte \argId
+ .2byte \value
.4byte \ptr
.endm
@@ -208,29 +208,29 @@
.4byte \ptr
.endm
- .macro fadetobgfromset param0:req, param1:req, param2:req
+ .macro fadetobgfromset bgOpponent:req, bgPlayer:req, bgContest:req
.byte 0x25
- .byte \param0
- .byte \param1
- .byte \param2
+ .byte \bgOpponent
+ .byte \bgPlayer
+ .byte \bgContest
.endm
- .macro panse_26 se:req, param1:req, param2:req, param3:req, param4:req
+ .macro panse_adjustnone se:req, currentPan:req, targetPan:req, incrementPan:req, delay:req
.byte 0x26
.2byte \se
- .byte \param1
- .byte \param2
- .byte \param3
- .byte \param4
+ .byte \currentPan
+ .byte \targetPan
+ .byte \incrementPan
+ .byte \delay
.endm
- .macro panse_27 se:req, param1:req, param2:req, param3:req, param4:req
+ .macro panse_adjustall se:req, currentPan:req, targetPan:req, incrementPan:req, delay:req
.byte 0x27
.2byte \se
- .byte \param1
- .byte \param2
- .byte \param3
- .byte \param4
+ .byte \currentPan
+ .byte \targetPan
+ .byte \incrementPan
+ .byte \delay
.endm
.macro monbgprio_28 battler:req
diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s
index 83b1f3cea..208bab8a6 100644
--- a/data/battle_anim_scripts.s
+++ b/data/battle_anim_scripts.s
@@ -2234,7 +2234,7 @@ Move_ICY_WIND:
playsewithpan SE_M_ICY_WIND, 0
waitbgfadein
waitforvisualfinish
- panse_1B SE_M_GUST, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
+ panse SE_M_GUST, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
call IcyWindSwirlingSnowballs
delay 5
call IcyWindSwirlingSnowballs
@@ -2551,7 +2551,7 @@ Move_SING:
monbg ANIM_DEF_PARTNER
createvisualtask AnimTask_MusicNotesRainbowBlend, 2
waitforvisualfinish
- panse_1B SE_M_SING, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
+ panse SE_M_SING, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 7, 0, 12
delay 5
createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 6, 1, 12
@@ -3460,7 +3460,7 @@ Move_HEAT_WAVE:
createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_FLYING_DIRT, 0, 6, 6, RGB_RED
createvisualtask AnimTask_LoadSandstormBackground, 5, TRUE
createvisualtask AnimTask_BlendBackground, 6, 6, RGB_RED
- panse_1B SE_M_HEAT_WAVE, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
+ panse SE_M_HEAT_WAVE, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
delay 4
createvisualtask AnimTask_MoveHeatWaveTargets, 5
delay 12
@@ -4232,7 +4232,7 @@ Move_GRASS_WHISTLE:
waitforvisualfinish
createvisualtask AnimTask_MusicNotesRainbowBlend, 2
waitforvisualfinish
- panse_1B SE_M_GRASSWHISTLE, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
+ panse SE_M_GRASSWHISTLE, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 7, 1, 0
delay 5
createsprite gWavyMusicNotesSpriteTemplate, ANIM_TARGET, 2, 6, 1, 0
@@ -4464,7 +4464,7 @@ Move_WATER_SPORT:
delay 44
playsewithpan SE_M_SURF, SOUND_PAN_ATTACKER
delay 44
- panse_1B SE_M_SURF, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
+ panse SE_M_SURF, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
end
Move_CALM_MIND:
@@ -5475,7 +5475,7 @@ SolarBeamAbsorbEffect:
return
SolarBeamUnleash:
call SetSolarbeamBg
- panse_1B SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
+ panse SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
createvisualtask AnimTask_CreateSmallSolarbeamOrbs, 5
createsprite gSolarbeamBigOrbSpriteTemplate, ANIM_TARGET, 3, 15, 0, 20, 0
delay 4
@@ -5527,7 +5527,7 @@ BlizzardContinue:
createvisualtask AnimTask_StartSlidingBg, 5, -2304, 0, 1, -1
waitbgfadein
waitforvisualfinish
- panse_1B SE_M_BLIZZARD, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
+ panse SE_M_BLIZZARD, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
call BlizzardIceCrystals
call BlizzardIceCrystals
playsewithpan SE_M_BLIZZARD2, SOUND_PAN_TARGET
@@ -5573,7 +5573,7 @@ Move_POWDER_SNOW:
monbg ANIM_DEF_PARTNER
createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 1, 0, 3, RGB_BLACK
waitforvisualfinish
- panse_1B SE_M_GUST, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
+ panse SE_M_GUST, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
call PowderSnowSnowballs
call PowderSnowSnowballs
playsewithpan SE_M_GUST2, SOUND_PAN_TARGET
@@ -5610,7 +5610,7 @@ Move_HYDRO_PUMP:
setalpha 12, 8
createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 40, 1
delay 6
- panse_1B SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
+ panse SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
createvisualtask AnimTask_StartSinAnimTimer, 5, 100
call HydroPumpBeams
call HydroPumpBeams
@@ -5655,7 +5655,7 @@ Move_SIGNAL_BEAM:
loadspritegfx ANIM_TAG_DUCK
createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 25, 1
delay 6
- panse_1B SE_M_BUBBLE_BEAM, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +1, 0
+ panse SE_M_BUBBLE_BEAM, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +1, 0
createvisualtask AnimTask_StartSinAnimTimer, 5, 100
call SignalBeamOrbs
call SignalBeamOrbs
@@ -6297,7 +6297,7 @@ Move_CRABHAMMER:
Move_SURF:
createvisualtask AnimTask_CreateSurfWave, 2, FALSE
delay 24
- panse_1B SE_M_SURF, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
+ panse SE_M_SURF, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
waitforvisualfinish
end
@@ -6309,7 +6309,7 @@ Move_FLAMETHROWER:
createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 46, 1
delay 6
createvisualtask AnimTask_StartSinAnimTimer, 5, 100
- panse_1B SE_M_FLAMETHROWER, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
+ panse SE_M_FLAMETHROWER, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
call FlamethrowerCreateFlames
call FlamethrowerCreateFlames
call FlamethrowerCreateFlames
@@ -6722,7 +6722,7 @@ Move_SUNNY_DAY:
setalpha 13, 3
createvisualtask AnimTask_BlendBattleAnimPal, 10, 0x781, 1, 0, 6, RGB_WHITE
waitforvisualfinish
- panse_26 SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +1, 0
+ panse_adjustnone SE_M_PETAL_DANCE, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +1, 0
call SunnyDayLightRay
call SunnyDayLightRay
call SunnyDayLightRay
@@ -7599,7 +7599,7 @@ Move_MIMIC:
setalpha 11, 5
monbg_22 ANIM_DEF_PARTNER
monbgprio_29
- panse_1B SE_M_MINIMIZE, SOUND_PAN_TARGET, SOUND_PAN_ATTACKER, -3, 0
+ panse SE_M_MINIMIZE, SOUND_PAN_TARGET, SOUND_PAN_ATTACKER, -3, 0
createvisualtask AnimTask_ShrinkTargetCopy, 5, 128, 24
delay 15
createsprite gMimicOrbSpriteTemplate, ANIM_TARGET, 2, -12, 24
@@ -7943,7 +7943,7 @@ Move_PERISH_SONG:
createsprite gPerishSongMusicNoteSpriteTemplate, ANIM_ATTACKER, 4, 15, 0, 240
createsprite gPerishSongMusicNote2SpriteTemplate, ANIM_ATTACKER, 4, 15, 0, 0
delay 20
- panse_1B SE_M_PERISH_SONG, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
+ panse SE_M_PERISH_SONG, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
delay 80
createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 3, 0, 16, RGB_BLACK
createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, 4, 0
@@ -8150,7 +8150,7 @@ Move_WISH:
loadspritegfx ANIM_TAG_SPARKLE_2
createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 3, 0, 10, RGB_BLACK
waitforvisualfinish
- panse_27 SE_M_REFLECT, SOUND_PAN_TARGET, SOUND_PAN_ATTACKER, -3, 0
+ panse_adjustall SE_M_REFLECT, SOUND_PAN_TARGET, SOUND_PAN_ATTACKER, -3, 0
createsprite gWishStarSpriteTemplate, ANIM_ATTACKER, 40
waitforvisualfinish
delay 60
@@ -8591,7 +8591,7 @@ ArmThrustLeft:
goto ArmThrustContinue
Move_MUDDY_WATER:
- panse_1B SE_M_WHIRLPOOL, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
+ panse SE_M_WHIRLPOOL, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
createvisualtask AnimTask_CreateSurfWave, 2, TRUE
waitforvisualfinish
end
@@ -8689,7 +8689,7 @@ Move_MUD_SHOT:
createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 46, 1
delay 6
createvisualtask AnimTask_StartSinAnimTimer, 5, 100
- panse_1B SE_M_WHIRLPOOL, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +1, 0
+ panse SE_M_WHIRLPOOL, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +1, 0
call MudShotOrbs
call MudShotOrbs
call MudShotOrbs
@@ -8717,7 +8717,7 @@ Move_METEOR_MASH:
loadspritegfx ANIM_TAG_GOLD_STARS
loadspritegfx ANIM_TAG_IMPACT
loadspritegfx ANIM_TAG_HANDS_AND_FEET
- panse_1B SE_M_BARRIER, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +3, 0
+ panse SE_M_BARRIER, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +3, 0
fadetobg BG_COSMIC
waitbgfadein
waitforvisualfinish
@@ -8860,7 +8860,7 @@ Move_METAL_SOUND:
waitforvisualfinish
end
MetalSoundRings:
- panse_1B SE_M_SCREECH, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
+ panse SE_M_SCREECH, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
createsprite gMetalSoundSpriteTemplate, ANIM_TARGET, 2, 16, 0, 0, 0, 30, 0
delay 2
return
@@ -9154,7 +9154,7 @@ Move_ROCK_TOMB:
Move_SILVER_WIND:
loadspritegfx ANIM_TAG_SPARKLE_6
- panse_1B SE_M_GUST, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
+ panse SE_M_GUST, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
playsewithpan SE_M_MORNING_SUN, 0
delay 0
monbg ANIM_DEF_PARTNER
@@ -9368,7 +9368,7 @@ Move_HYDRO_CANNON:
delay 10
createvisualtask AnimTask_InvertScreenColor, 2, 257, 257, 257
delay 30
- panse_1B SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
+ panse SE_M_HYDRO_PUMP, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
call HydroCannonBeam
createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 10, 0, 40, 1
createsprite gWaterHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0
@@ -10296,7 +10296,7 @@ Status_Nightmare:
General_CastformChange:
createvisualtask AnimTask_IsMonInvisible, 2
- jumpreteq 1, CastformChangeSkipAnim
+ jumpreteq TRUE, CastformChangeSkipAnim
goto CastformChangeContinue
CastformChangeContinue:
monbg ANIM_ATTACKER
diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s
index 951558234..203ea3125 100644
--- a/data/battle_scripts_1.s
+++ b/data/battle_scripts_1.s
@@ -2829,10 +2829,12 @@ BattleScript_HandleFaintedMon::
jumpifbyte CMP_NOT_EQUAL, gBattleOutcome, 0, BattleScript_FaintedMonEnd
jumpifbattletype BATTLE_TYPE_TRAINER, BattleScript_FaintedMonTryChooseAnother
jumpifword CMP_NO_COMMON_BITS, gHitMarker, HITMARKER_PLAYER_FAINTED, BattleScript_FaintedMonTryChooseAnother
+@ Yes/No for sending out a new Pokémon, when sending out is optional
printstring STRINGID_USENEXTPKMN
setbyte gBattleCommunication, 0
yesnobox
jumpifbyte CMP_EQUAL, gBattleCommunication + 1, 0, BattleScript_FaintedMonTryChooseAnother
+@ Player said no, try to run
jumpifplayerran BattleScript_FaintedMonEnd
printstring STRINGID_CANTESCAPE2
BattleScript_FaintedMonTryChooseAnother::
@@ -2904,7 +2906,7 @@ BattleScript_HandleFaintedMonLoop::
hidepartystatussummary BS_FAINTED
switchinanim BS_FAINTED, FALSE
waitstate
- switchineffects 5
+ switchineffects BS_UNK_5
jumpifbytenotequal gBattlerFainted, gBattlersCount, BattleScript_HandleFaintedMonLoop
BattleScript_HandleFaintedMonMultipleEnd::
end2
diff --git a/graphics/unknown/unknown_593FFC.bin b/graphics/battle_anims/unused_water.bin
index dc2990b0a..dc2990b0a 100644
--- a/graphics/unknown/unknown_593FFC.bin
+++ b/graphics/battle_anims/unused_water.bin
Binary files differ
diff --git a/graphics/unknown/unknown_593C80.png b/graphics/battle_anims/unused_water_gfx.png
index c4a27b929..c4a27b929 100644
--- a/graphics/unknown/unknown_593C80.png
+++ b/graphics/battle_anims/unused_water_gfx.png
Binary files differ
diff --git a/include/battle.h b/include/battle.h
index e32e621cc..5ccff8ce3 100644
--- a/include/battle.h
+++ b/include/battle.h
@@ -32,7 +32,6 @@
#define B_ACTION_EXEC_SCRIPT 10
#define B_ACTION_TRY_FINISH 11
#define B_ACTION_FINISHED 12
-
#define B_ACTION_CANCEL_PARTNER 12 // when choosing an action
#define B_ACTION_NOTHING_FAINTED 13 // when choosing an action
#define B_ACTION_NONE 0xFF
@@ -50,14 +49,17 @@
#define MSG_DISPLAY 7
#define BATTLE_COMMUNICATION_ENTRIES_COUNT 8
-#define MOVE_TARGET_SELECTED 0x0
-#define MOVE_TARGET_DEPENDS 0x1
-#define MOVE_TARGET_USER_OR_SELECTED 0x2
-#define MOVE_TARGET_RANDOM 0x4
-#define MOVE_TARGET_BOTH 0x8
-#define MOVE_TARGET_USER 0x10
-#define MOVE_TARGET_FOES_AND_ALLY 0x20
-#define MOVE_TARGET_OPPONENTS_FIELD 0x40
+#define MOVE_TARGET_SELECTED 0
+#define MOVE_TARGET_DEPENDS (1 << 0)
+#define MOVE_TARGET_USER_OR_SELECTED (1 << 1)
+#define MOVE_TARGET_RANDOM (1 << 2)
+#define MOVE_TARGET_BOTH (1 << 3)
+#define MOVE_TARGET_USER (1 << 4)
+#define MOVE_TARGET_FOES_AND_ALLY (1 << 5)
+#define MOVE_TARGET_OPPONENTS_FIELD (1 << 6)
+
+// For the second argument of GetMoveTarget, when no target override is needed
+#define NO_TARGET_OVERRIDE 0
#define BATTLE_BUFFER_LINK_SIZE 0x1000
@@ -115,7 +117,7 @@ struct ProtectStruct
u32 confusionSelfDmg:1;
u32 targetNotAffected:1;
u32 chargingTurn:1;
- u32 fleeFlag:2; // For RunAway and Smoke Ball.
+ u32 fleeType:2; // 0: Normal, 1: FLEE_ITEM, 2: FLEE_ABILITY
u32 usedImprisonedMove:1;
u32 loveImmobility:1;
u32 usedDisabledMove:1;
@@ -426,7 +428,7 @@ struct BattleStruct
u8 unused_6[3];
u8 givenExpMons; // Bits for enemy party's pokemon that gave exp to player's party.
u8 lastTakenMoveFrom[MAX_BATTLERS_COUNT * MAX_BATTLERS_COUNT * 2]; // a 3-D array [target][attacker][byte]
- u16 castformPalette[MAX_BATTLERS_COUNT][16];
+ u16 castformPalette[NUM_CASTFORM_FORMS][16];
union {
struct LinkBattlerHeader linkBattlerHeader;
u32 battleVideo[2];
@@ -447,12 +449,16 @@ struct BattleStruct
u8 alreadyStatusedMoveAttempt; // As bits for battlers; For example when using Thunder Wave on an already paralyzed pokemon.
};
-#define GET_MOVE_TYPE(move, typeArg) \
-{ \
- if (gBattleStruct->dynamicMoveType) \
- typeArg = gBattleStruct->dynamicMoveType & 0x3F; \
- else \
- typeArg = gBattleMoves[move].type; \
+#define F_DYNAMIC_TYPE_1 (1 << 6)
+#define F_DYNAMIC_TYPE_2 (1 << 7)
+#define DYNAMIC_TYPE_MASK (F_DYNAMIC_TYPE_1 - 1)
+
+#define GET_MOVE_TYPE(move, typeArg) \
+{ \
+ if (gBattleStruct->dynamicMoveType) \
+ typeArg = gBattleStruct->dynamicMoveType & DYNAMIC_TYPE_MASK; \
+ else \
+ typeArg = gBattleMoves[move].type; \
}
#define IS_TYPE_PHYSICAL(moveType)(moveType < TYPE_MYSTERY)
@@ -502,7 +508,7 @@ struct BattleScripting
u8 reshowMainState;
u8 reshowHelperState;
u8 levelUpHP;
- u8 windowsType; // 0 - normal, 1 - battle arena
+ u8 windowsType; // B_WIN_TYPE_*
u8 multiplayerId;
u8 specialTrainerBattleType;
};
@@ -624,8 +630,8 @@ extern u8 gBattleTextBuff3[TEXT_BUFF_ARRAY_COUNT];
extern u32 gBattleTypeFlags;
extern u8 gBattleTerrain;
extern u32 gUnusedFirstBattleVar1;
-extern u8 *gUnknown_0202305C;
-extern u8 *gUnknown_02023060;
+extern u8 *gBattleAnimBgTileBuffer;
+extern u8 *gBattleAnimBgTilemapBuffer;
extern u8 gBattleBufferA[MAX_BATTLERS_COUNT][0x200];
extern u8 gBattleBufferB[MAX_BATTLERS_COUNT][0x200];
extern u8 gActiveBattler;
diff --git a/include/battle_anim.h b/include/battle_anim.h
index ad160e74d..3f73f1daf 100644
--- a/include/battle_anim.h
+++ b/include/battle_anim.h
@@ -64,12 +64,12 @@ s8 BattleAnimAdjustPanning(s8 pan);
s8 BattleAnimAdjustPanning2(s8 pan);
s16 KeepPanInRange(s16 a, int oldPan);
s16 CalculatePanIncrement(s16 sourcePan, s16 targetPan, s16 incrementPan);
-void sub_80A4720(u16 a, u16 *b, u32 c, u8 d);
+void RelocateBattleBgPal(u16 paletteNum, u16 *dest, u32 offset, bool8 largeScreen);
void ResetBattleAnimBg(bool8);
// battle_intro.c
void SetAnimBgAttribute(u8 bgId, u8 attributeId, u8 value);
-void sub_8118FBC(int bgId, u8 arg1, u8 arg2, u8 battlerPosition, u8 arg4, u8 *arg5, u16 *arg6, u16 arg7);
+void DrawBattlerOnBg(int bgId, u8 x, u8 y, u8 battlerPosition, u8 paletteId, u8 *tiles, u16 *tilemap, u16 tilesOffset);
void HandleIntroSlide(u8 terrainId);
int GetAnimBgAttribute(u8 bgId, u8 attributeId);
@@ -107,7 +107,7 @@ void AnimTranslateLinear_WaitEnd(struct Sprite *sprite);
u8 GetBattlerSpriteBGPriority(u8 battlerId);
void *LoadPointerFromVars(s16 bottom, s16 top);
void StorePointerInVars(s16 *bottom, s16 *top, const void *ptr);
-void sub_80A8278(void);
+void InitPrioritiesForVisibleBattlers(void);
void GetBattleAnimBg1Data(struct BattleAnimBgData*);
void GetBattleAnimBgData(struct BattleAnimBgData*, u32 arg1);
u8 GetBattlerSpriteSubpriority(u8 battlerId);
@@ -125,7 +125,7 @@ u8 AnimDummyReturnArg(u8 battler);
s16 CloneBattlerSpriteWithBlend(u8);
void obj_delete_but_dont_free_vram(struct Sprite*);
u8 CreateInvisibleSpriteCopy(int, u8, int);
-void AnimLoadCompressedBgTilemapHandleContest(struct BattleAnimBgData*, const void*, u32);
+void AnimLoadCompressedBgTilemapHandleContest(struct BattleAnimBgData*, const void*, bool32);
void AnimLoadCompressedBgGfx(u32, const u32*, u32);
void UpdateAnimBg3ScreenSize(bool8);
void TranslateSpriteInGrowingCircleOverDuration(struct Sprite *);
diff --git a/include/battle_arena.h b/include/battle_arena.h
index b55fc39b0..c9a18ef61 100644
--- a/include/battle_arena.h
+++ b/include/battle_arena.h
@@ -7,7 +7,6 @@ void BattleArena_InitPoints(void);
void BattleArena_AddMindPoints(u8 battler);
void BattleArena_AddSkillPoints(u8 battler);
void BattleArena_DeductMindPoints(u8 battler, u16 stringId);
-void sub_81A586C(u8 battler);
void DrawArenaRefereeTextBox(void);
void EraseArenaRefereeTextBox(void);
diff --git a/include/battle_gfx_sfx_util.h b/include/battle_gfx_sfx_util.h
index a367bc043..383facd69 100644
--- a/include/battle_gfx_sfx_util.h
+++ b/include/battle_gfx_sfx_util.h
@@ -18,7 +18,6 @@ void DecompressTrainerFrontPic(u16 frontPicId, u8 battlerId);
void DecompressTrainerBackPic(u16 backPicId, u8 battlerId);
void BattleGfxSfxDummy3(u8 gender);
void FreeTrainerFrontPicPalette(u16 frontPicId);
-void sub_805DFFC(void);
bool8 BattleLoadAllHealthBoxesGfx(u8 state);
void LoadBattleBarGfx(u8 arg0);
bool8 BattleInitAllSprites(u8 *state1, u8 *battlerId);
diff --git a/include/battle_main.h b/include/battle_main.h
index 78cf353df..f3e961b7b 100644
--- a/include/battle_main.h
+++ b/include/battle_main.h
@@ -7,7 +7,8 @@ struct TrainerMoney
u8 value;
};
-struct UnknownPokemonStruct4
+// For displaying a multi battle partner's Pokémon in the party menu
+struct MultiPartnerMenuPokemon
{
/*0x00*/ u16 species;
/*0x02*/ u16 heldItem;
@@ -46,8 +47,6 @@ struct UnknownPokemonStruct4
void CB2_InitBattle(void);
void BattleMainCB2(void);
void CB2_QuitRecordedBattle(void);
-void sub_8038528(struct Sprite* sprite);
-void sub_8038A04(void); // unused
void VBlankCB_Battle(void);
void SpriteCB_VsLetterDummy(struct Sprite *sprite);
void SpriteCB_VsLetterInit(struct Sprite *sprite);
@@ -59,13 +58,12 @@ void SpriteCallbackDummy_2(struct Sprite *sprite);
void SpriteCB_FaintOpponentMon(struct Sprite *sprite);
void SpriteCb_ShowAsMoveTarget(struct Sprite *sprite);
void SpriteCb_HideAsMoveTarget(struct Sprite *sprite);
-void SpriteCb_OpponentMonFromBall(struct Sprite *sprite);
+void SpriteCB_OpponentMonFromBall(struct Sprite *sprite);
void SpriteCB_BattleSpriteStartSlideLeft(struct Sprite *sprite);
void SpriteCB_FaintSlideAnim(struct Sprite *sprite);
void DoBounceEffect(u8 battlerId, u8 b, s8 c, s8 d);
void EndBounceEffect(u8 battlerId, bool8 b);
-void SpriteCb_PlayerMonFromBall(struct Sprite *sprite);
-void sub_8039E60(struct Sprite *sprite);
+void SpriteCB_PlayerMonFromBall(struct Sprite *sprite);
void SpriteCB_TrainerThrowObject(struct Sprite *sprite);
void sub_8039E9C(struct Sprite *sprite);
void BeginBattleIntroDummy(void);
@@ -82,9 +80,9 @@ void RunBattleScriptCommands(void);
bool8 TryRunFromBattle(u8 battlerId);
void SpecialStatusesClear(void);
-extern struct UnknownPokemonStruct4 gMultiPartnerParty[MULTI_PARTY_SIZE];
+extern struct MultiPartnerMenuPokemon gMultiPartnerParty[MULTI_PARTY_SIZE];
-extern const struct SpriteTemplate gUnknown_0831AC88;
+extern const struct SpriteTemplate gUnusedBattleInitSprite;
extern const struct OamData gOamData_BattleSpriteOpponentSide;
extern const struct OamData gOamData_BattleSpritePlayerSide;
extern const u8 gTypeEffectiveness[336];
diff --git a/include/battle_pyramid_bag.h b/include/battle_pyramid_bag.h
index b8b3eb20f..258ca56b2 100644
--- a/include/battle_pyramid_bag.h
+++ b/include/battle_pyramid_bag.h
@@ -63,7 +63,6 @@ void CB2_PyramidBagMenuFromStartMenu(void);
void CB2_ReturnToPyramidBagMenu(void);
void UpdatePyramidBagList(void);
void UpdatePyramidBagCursorPos(void);
-void sub_81C4EFC(void);
void GoToBattlePyramidBagMenu(u8 location, void (*exitCallback)(void));
void Task_CloseBattlePyramidBagMessage(u8 taskId);
void TryStoreHeldItemsInPyramidBag(void);
diff --git a/include/battle_transition.h b/include/battle_transition.h
index a33032fb4..784c5f968 100644
--- a/include/battle_transition.h
+++ b/include/battle_transition.h
@@ -11,8 +11,7 @@ void GetBg0TilesDst(u16 **tilemap, u16 **tileset);
extern const struct SpritePalette gSpritePalette_Pokeball;
-enum // TRANSITION_MUGSHOT
-{
+enum {
MUGSHOT_SIDNEY,
MUGSHOT_PHOEBE,
MUGSHOT_GLACIA,
@@ -21,52 +20,64 @@ enum // TRANSITION_MUGSHOT
MUGSHOTS_COUNT
};
-// credits for the names go to Dyskinesia, Tetrable and Farore
-// names are naturally subject to change
+enum {
+ B_TRANSITION_BLUR,
+ B_TRANSITION_SWIRL,
+ B_TRANSITION_SHUFFLE,
+ B_TRANSITION_BIG_POKEBALL,
+ B_TRANSITION_POKEBALLS_TRAIL,
+ B_TRANSITION_CLOCKWISE_BLACKFADE,
+ B_TRANSITION_RIPPLE,
+ B_TRANSITION_WAVE,
+ B_TRANSITION_SLICE,
+ B_TRANSITION_WHITEFADE,
+ B_TRANSITION_GRID_SQUARES,
+ B_TRANSITION_SHARDS,
+ B_TRANSITION_SIDNEY,
+ B_TRANSITION_PHOEBE,
+ B_TRANSITION_GLACIA,
+ B_TRANSITION_DRAKE,
+ B_TRANSITION_CHAMPION,
+ B_TRANSITION_AQUA, // Here below added in Emerald
+ B_TRANSITION_MAGMA,
+ B_TRANSITION_REGICE,
+ B_TRANSITION_REGISTEEL,
+ B_TRANSITION_REGIROCK,
+ B_TRANSITION_KYOGRE,
+ B_TRANSITION_GROUDON,
+ B_TRANSITION_RAYQUAZA,
+ B_TRANSITION_SHRED_SPLIT,
+ B_TRANSITION_BLACKHOLE1,
+ B_TRANSITION_BLACKHOLE2,
+ B_TRANSITION_RECTANGULAR_SPIRAL,
+ B_TRANSITION_FRONTIER_LOGO_WIGGLE,
+ B_TRANSITION_FRONTIER_LOGO_WAVE,
+ B_TRANSITION_FRONTIER_SQUARES,
+ B_TRANSITION_FRONTIER_SQUARES_SCROLL,
+ B_TRANSITION_FRONTIER_SQUARES_SPIRAL,
+ B_TRANSITION_FRONTIER_CIRCLES_MEET,
+ B_TRANSITION_FRONTIER_CIRCLES_CROSS,
+ B_TRANSITION_FRONTIER_CIRCLES_ASYMMETRIC_SPIRAL,
+ B_TRANSITION_FRONTIER_CIRCLES_SYMMETRIC_SPIRAL,
+ B_TRANSITION_FRONTIER_CIRCLES_MEET_IN_SEQ,
+ B_TRANSITION_FRONTIER_CIRCLES_CROSS_IN_SEQ,
+ B_TRANSITION_FRONTIER_CIRCLES_ASYMMETRIC_SPIRAL_IN_SEQ,
+ B_TRANSITION_FRONTIER_CIRCLES_SYMMETRIC_SPIRAL_IN_SEQ,
+ B_TRANSITION_COUNT
+};
-#define B_TRANSITION_BLUR 0
-#define B_TRANSITION_SWIRL 1
-#define B_TRANSITION_SHUFFLE 2
-#define B_TRANSITION_BIG_POKEBALL 3
-#define B_TRANSITION_POKEBALLS_TRAIL 4
-#define B_TRANSITION_CLOCKWISE_BLACKFADE 5
-#define B_TRANSITION_RIPPLE 6
-#define B_TRANSITION_WAVE 7
-#define B_TRANSITION_SLICE 8
-#define B_TRANSITION_WHITEFADE 9
-#define B_TRANSITION_GRID_SQUARES 10
-#define B_TRANSITION_SHARDS 11
-#define B_TRANSITION_SIDNEY 12
-#define B_TRANSITION_PHOEBE 13
-#define B_TRANSITION_GLACIA 14
-#define B_TRANSITION_DRAKE 15
-#define B_TRANSITION_CHAMPION 16
-// added in Emerald
-#define B_TRANSITION_AQUA 17
-#define B_TRANSITION_MAGMA 18
-#define B_TRANSITION_REGICE 19
-#define B_TRANSITION_REGISTEEL 20
-#define B_TRANSITION_REGIROCK 21
-#define B_TRANSITION_KYOGRE 22
-#define B_TRANSITION_GROUDON 23
-#define B_TRANSITION_RAYQUAZA 24
-#define B_TRANSITION_SHRED_SPLIT 25
-#define B_TRANSITION_BLACKHOLE1 26
-#define B_TRANSITION_BLACKHOLE2 27
-#define B_TRANSITION_RECTANGULAR_SPIRAL 28
-#define B_TRANSITION_FRONTIER_LOGO_WIGGLE 29
-#define B_TRANSITION_FRONTIER_LOGO_WAVE 30
-#define B_TRANSITION_FRONTIER_SQUARES 31
-#define B_TRANSITION_FRONTIER_SQUARES_SCROLL 32
-#define B_TRANSITION_FRONTIER_SQUARES_SPIRAL 33
-#define B_TRANSITION_FRONTIER_CIRCLES_MEET 34
-#define B_TRANSITION_FRONTIER_CIRCLES_CROSS 35
-#define B_TRANSITION_FRONTIER_CIRCLES_ASYMMETRIC_SPIRAL 36
-#define B_TRANSITION_FRONTIER_CIRCLES_SYMMETRIC_SPIRAL 37
-#define B_TRANSITION_FRONTIER_CIRCLES_MEET_IN_SEQ 38
-#define B_TRANSITION_FRONTIER_CIRCLES_CROSS_IN_SEQ 39
-#define B_TRANSITION_FRONTIER_CIRCLES_ASYMMETRIC_SPIRAL_IN_SEQ 40
-#define B_TRANSITION_FRONTIER_CIRCLES_SYMMETRIC_SPIRAL_IN_SEQ 41
-#define B_TRANSITION_COUNT 42
+// IDs for GetSpecialBattleTransition
+enum {
+ B_TRANSITION_GROUP_B_TOWER,
+ B_TRANSITION_GROUP_B_DOME = 3,
+ B_TRANSITION_GROUP_B_PALACE,
+ B_TRANSITION_GROUP_B_ARENA,
+ B_TRANSITION_GROUP_B_FACTORY,
+ B_TRANSITION_GROUP_B_PIKE,
+ B_TRANSITION_GROUP_B_PYRAMID = 10,
+ B_TRANSITION_GROUP_TRAINER_HILL,
+ B_TRANSITION_GROUP_SECRET_BASE,
+ B_TRANSITION_GROUP_E_READER,
+};
#endif // GUARD_BATTLE_TRANSITION_H
diff --git a/include/battle_util.h b/include/battle_util.h
index d4e2a23f8..914e44c04 100644
--- a/include/battle_util.h
+++ b/include/battle_util.h
@@ -6,39 +6,43 @@
#define MOVE_LIMITATION_DISABLED (1 << 2)
#define MOVE_LIMITATION_TORMENTED (1 << 3)
#define MOVE_LIMITATION_TAUNT (1 << 4)
-#define MOVE_LIMITATION_IMPRISON (1 << 5)
+#define MOVE_LIMITATION_IMPRISON (1 << 5)
+#define MOVE_LIMITATIONS_ALL 0xFF
-#define ABILITYEFFECT_ON_SWITCHIN 0x0
-#define ABILITYEFFECT_ENDTURN 0x1
-#define ABILITYEFFECT_MOVES_BLOCK 0x2
-#define ABILITYEFFECT_ABSORBING 0x3
-#define ABILITYEFFECT_ON_DAMAGE 0x4
-#define ABILITYEFFECT_IMMUNITY 0x5
-#define ABILITYEFFECT_FORECAST 0x6
-#define ABILITYEFFECT_SYNCHRONIZE 0x7
-#define ABILITYEFFECT_ATK_SYNCHRONIZE 0x8
-#define ABILITYEFFECT_INTIMIDATE1 0x9
-#define ABILITYEFFECT_INTIMIDATE2 0xA
-#define ABILITYEFFECT_TRACE 0xB
-#define ABILITYEFFECT_CHECK_OTHER_SIDE 0xC
-#define ABILITYEFFECT_CHECK_BATTLER_SIDE 0xD
-#define ABILITYEFFECT_FIELD_SPORT 0xE
-#define ABILITYEFFECT_CHECK_FIELD_EXCEPT_BATTLER 0xF
-#define ABILITYEFFECT_COUNT_OTHER_SIDE 0x10
-#define ABILITYEFFECT_COUNT_BATTLER_SIDE 0x11
-#define ABILITYEFFECT_COUNT_ON_FIELD 0x12
-#define ABILITYEFFECT_CHECK_ON_FIELD 0x13
-#define ABILITYEFFECT_MUD_SPORT 0xFD
-#define ABILITYEFFECT_WATER_SPORT 0xFE
-#define ABILITYEFFECT_SWITCH_IN_WEATHER 0xFF
+#define ABILITYEFFECT_ON_SWITCHIN 0
+#define ABILITYEFFECT_ENDTURN 1
+#define ABILITYEFFECT_MOVES_BLOCK 2
+#define ABILITYEFFECT_ABSORBING 3
+#define ABILITYEFFECT_ON_DAMAGE 4
+#define ABILITYEFFECT_IMMUNITY 5
+#define ABILITYEFFECT_FORECAST 6
+#define ABILITYEFFECT_SYNCHRONIZE 7
+#define ABILITYEFFECT_ATK_SYNCHRONIZE 8
+#define ABILITYEFFECT_INTIMIDATE1 9
+#define ABILITYEFFECT_INTIMIDATE2 10
+#define ABILITYEFFECT_TRACE 11
+#define ABILITYEFFECT_CHECK_OTHER_SIDE 12
+#define ABILITYEFFECT_CHECK_BATTLER_SIDE 13
+#define ABILITYEFFECT_FIELD_SPORT 14
+#define ABILITYEFFECT_CHECK_FIELD_EXCEPT_BATTLER 15
+#define ABILITYEFFECT_COUNT_OTHER_SIDE 16
+#define ABILITYEFFECT_COUNT_BATTLER_SIDE 17
+#define ABILITYEFFECT_COUNT_ON_FIELD 18
+#define ABILITYEFFECT_CHECK_ON_FIELD 19
+#define ABILITYEFFECT_MUD_SPORT 253
+#define ABILITYEFFECT_WATER_SPORT 254
+#define ABILITYEFFECT_SWITCH_IN_WEATHER 255
#define ABILITY_ON_OPPOSING_FIELD(battlerId, abilityId)(AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, battlerId, abilityId, 0, 0))
#define ABILITY_ON_FIELD(abilityId)(AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, abilityId, 0, 0))
#define ABILITY_ON_FIELD2(abilityId)(AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, abilityId, 0, 0))
-#define ITEMEFFECT_ON_SWITCH_IN 0x0
-#define ITEMEFFECT_MOVE_END 0x3
-#define ITEMEFFECT_KINGSROCK_SHELLBELL 0x4
+// For the first argument of ItemBattleEffects, to deteremine which block of item effects to try
+#define ITEMEFFECT_ON_SWITCH_IN 0
+#define ITEMEFFECT_NORMAL 1
+#define ITEMEFFECT_DUMMY 2 // Unused, empty
+#define ITEMEFFECT_MOVE_END 3
+#define ITEMEFFECT_KINGSROCK_SHELLBELL 4
#define WEATHER_HAS_EFFECT ((!ABILITY_ON_FIELD(ABILITY_CLOUD_NINE) && !ABILITY_ON_FIELD(ABILITY_AIR_LOCK)))
#define WEATHER_HAS_EFFECT2 ((!ABILITY_ON_FIELD2(ABILITY_CLOUD_NINE) && !ABILITY_ON_FIELD2(ABILITY_AIR_LOCK)))
diff --git a/include/constants/battle.h b/include/constants/battle.h
index f1ce757e7..62e7cbbfa 100644
--- a/include/constants/battle.h
+++ b/include/constants/battle.h
@@ -306,4 +306,17 @@
#define B_WAIT_TIME_MED 48
#define B_WAIT_TIME_SHORT 32
+#define CASTFORM_NORMAL 0
+#define CASTFORM_FIRE 1
+#define CASTFORM_WATER 2
+#define CASTFORM_ICE 3
+#define NUM_CASTFORM_FORMS 4
+#define CASTFORM_SUBSTITUTE (1 << 7)
+
+#define FLEE_ITEM 1
+#define FLEE_ABILITY 2
+
+#define B_WIN_TYPE_NORMAL 0
+#define B_WIN_TYPE_ARENA 1
+
#endif // GUARD_CONSTANTS_BATTLE_H
diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h
index 4622876cc..177ea04bb 100644
--- a/include/constants/battle_anim.h
+++ b/include/constants/battle_anim.h
@@ -318,7 +318,7 @@
#define SOUND_PAN_TARGET 63
// move background ids
-#define BG_DARK_ 0 // the same as BG_DARK but is unused
+#define BG_NONE 0 // the same as BG_DARK but is unused
#define BG_DARK 1
#define BG_GHOST 2
#define BG_PSYCHIC 3
diff --git a/include/contest.h b/include/contest.h
index 9bac63eda..e7acb5a11 100644
--- a/include/contest.h
+++ b/include/contest.h
@@ -294,7 +294,7 @@ struct ContestResources
u8 * contestBgTilemaps[CONTESTANT_COUNT];
void * boxBlinkTiles1;
void * boxBlinkTiles2;
- void * field_3c;
+ void * animBgTileBuffer;
};
#define eContest (*gContestResources->contest)
diff --git a/include/gym_leader_rematch.h b/include/gym_leader_rematch.h
index dd9ead8b7..b31fb5e22 100644
--- a/include/gym_leader_rematch.h
+++ b/include/gym_leader_rematch.h
@@ -66,7 +66,7 @@ enum {
REMATCH_TRENT,
REMATCH_SAWYER,
REMATCH_KIRA_AND_DAN,
- REMATCH_WALLY_3, // Entries above WALLY are considered normal trainers, from Wally below are special trainers
+ REMATCH_WALLY_VR, // Entries above WALLY are considered normal trainers, from Wally below are special trainers
REMATCH_ROXANNE,
REMATCH_BRAWLY,
REMATCH_WATTSON,
@@ -75,7 +75,7 @@ enum {
REMATCH_WINONA,
REMATCH_TATE_AND_LIZA,
REMATCH_JUAN,
- REMATCH_SIDNEY, // Entries below SIDNEY are considered part of REMATCH_ELITE_FOUR_ENTRIES.
+ REMATCH_SIDNEY, // Entries from SIDNEY below are considered part of REMATCH_ELITE_FOUR_ENTRIES.
REMATCH_PHOEBE,
REMATCH_GLACIA,
REMATCH_DRAKE,
@@ -83,7 +83,7 @@ enum {
REMATCH_TABLE_ENTRIES // The total number of rematch entries. Must be last in enum
};
-#define REMATCH_SPECIAL_TRAINER_START REMATCH_WALLY_3
+#define REMATCH_SPECIAL_TRAINER_START REMATCH_WALLY_VR
#define REMATCH_ELITE_FOUR_ENTRIES REMATCH_SIDNEY
void UpdateGymLeaderRematch(void);
diff --git a/include/recorded_battle.h b/include/recorded_battle.h
index 5ae4ac12d..8ea392774 100644
--- a/include/recorded_battle.h
+++ b/include/recorded_battle.h
@@ -9,7 +9,7 @@ extern u8 gRecordedBattleMultiplayerId;
#define B_RECORD_MODE_PLAYBACK 2
void RecordedBattle_Init(u8 arg0);
-void sub_8184E58(void);
+void RecordedBattle_SetTrainerInfo(void);
void RecordedBattle_SetBattlerAction(u8 battlerId, u8 action);
void RecordedBattle_ClearBattlerAction(u8 battlerId, u8 bytesToClear);
u8 RecordedBattle_GetBattlerAction(u8 battlerId);
@@ -30,8 +30,8 @@ u8 GetTextSpeedInRecordedBattle(void);
void RecordedBattle_CopyBattlerMoves(void);
void sub_818603C(u8 arg0);
u32 GetAiScriptsInRecordedBattle(void);
-void sub_8186444(void);
-bool8 sub_8186450(void);
+void RecordedBattle_SetPlaybackFinished(void);
+bool8 RecordedBattle_CanStopPlayback(void);
void GetRecordedBattleRecordMixFriendName(u8 *dst);
u8 GetRecordedBattleRecordMixFriendClass(void);
u8 GetRecordedBattleApprenticeId(void);
diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c
index b1b62fd5b..6fdfb0d7a 100644
--- a/src/battle_ai_script_commands.c
+++ b/src/battle_ai_script_commands.c
@@ -334,7 +334,7 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves)
defaultScoreMoves >>= 1;
}
- moveLimitations = CheckMoveLimitations(gActiveBattler, 0, 0xFF);
+ moveLimitations = CheckMoveLimitations(gActiveBattler, 0, MOVE_LIMITATIONS_ALL);
// Ignore moves that aren't possible to use.
for (i = 0; i < MAX_MON_MOVES; i++)
diff --git a/src/battle_anim.c b/src/battle_anim.c
index 80d511f4c..6cdbed2b7 100644
--- a/src/battle_anim.c
+++ b/src/battle_anim.c
@@ -27,15 +27,14 @@ extern struct MusicPlayerInfo gMPlayInfo_SE2;
extern const u16 gMovesWithQuietBGM[];
extern const u8 *const gBattleAnims_Moves[];
-// this file's functions
static void ScriptCmd_loadspritegfx(void);
static void ScriptCmd_unloadspritegfx(void);
static void ScriptCmd_createsprite(void);
static void ScriptCmd_createvisualtask(void);
static void ScriptCmd_delay(void);
static void ScriptCmd_waitforvisualfinish(void);
-static void ScriptCmd_hang1(void);
-static void ScriptCmd_hang2(void);
+static void ScriptCmd_nop(void);
+static void ScriptCmd_nop2(void);
static void ScriptCmd_end(void);
static void ScriptCmd_playse(void);
static void ScriptCmd_monbg(void);
@@ -55,7 +54,7 @@ static void ScriptCmd_waitbgfadein(void);
static void ScriptCmd_changebg(void);
static void ScriptCmd_playsewithpan(void);
static void ScriptCmd_setpan(void);
-static void ScriptCmd_panse_1B(void);
+static void ScriptCmd_panse(void);
static void ScriptCmd_loopsewithpan(void);
static void ScriptCmd_waitplaysewithpan(void);
static void ScriptCmd_setbldcnt(void);
@@ -66,8 +65,8 @@ static void ScriptCmd_monbg_22(void);
static void ScriptCmd_clearmonbg_23(void);
static void ScriptCmd_jumpifcontest(void);
static void ScriptCmd_fadetobgfromset(void);
-static void ScriptCmd_panse_26(void);
-static void ScriptCmd_panse_27(void);
+static void ScriptCmd_panse_adjustnone(void);
+static void ScriptCmd_panse_adjustall(void);
static void ScriptCmd_monbgprio_28(void);
static void ScriptCmd_monbgprio_29(void);
static void ScriptCmd_monbgprio_2A(void);
@@ -79,8 +78,8 @@ static void ScriptCmd_stopsound(void);
static void RunAnimScriptCommand(void);
static void task_pA_ma0A_obj_to_bg_pal(u8 taskId);
-static void sub_80A46A0(void);
-static void sub_80A4980(u8 taskId);
+static void FlipBattlerBgTiles(void);
+static void Task_ClearMonBg(u8 taskId);
static void sub_80A4BB0(u8 taskId);
static void Task_FadeToBg(u8 taskId);
static void Task_PanFromInitialToTarget(u8 taskId);
@@ -89,11 +88,10 @@ static void Task_WaitAndPlaySE(u8 taskId);
static void LoadDefaultBg(void);
static void LoadMoveBg(u16 bgId);
-// ewram
EWRAM_DATA static const u8 *sBattleAnimScriptPtr = NULL;
EWRAM_DATA static const u8 *sBattleAnimScriptRetAddr = NULL;
EWRAM_DATA void (*gAnimScriptCallback)(void) = NULL;
-EWRAM_DATA static s8 gAnimFramesToWait = 0;
+EWRAM_DATA static s8 sAnimFramesToWait = 0;
EWRAM_DATA bool8 gAnimScriptActive = FALSE;
EWRAM_DATA u8 gAnimVisualTaskCount = 0;
EWRAM_DATA u8 gAnimSoundTaskCount = 0;
@@ -1711,33 +1709,33 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] =
const struct BattleAnimBackground gBattleAnimBackgroundTable[] =
{
- [BG_DARK_] = {gBattleAnimBgImage_Dark, gBattleAnimBgPalette_Dark, gBattleAnimBgTilemap_Dark},
- [BG_DARK] = {gBattleAnimBgImage_Dark, gBattleAnimBgPalette_Dark, gBattleAnimBgTilemap_Dark},
- [BG_GHOST] = {gBattleAnimBgImage_Ghost, gBattleAnimBgPalette_Ghost, gBattleAnimBgTilemap_Ghost},
- [BG_PSYCHIC] = {gBattleAnimBgImage_Psychic, gBattleAnimBgPalette_Psychic, gBattleAnimBgTilemap_Psychic},
- [BG_IMPACT_OPPONENT] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_Impact, gBattleAnimBgTilemap_ImpactOpponent},
- [BG_IMPACT_PLAYER] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_Impact, gBattleAnimBgTilemap_ImpactPlayer},
- [BG_IMPACT_CONTESTS] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_Impact, gBattleAnimBgTilemap_ImpactContests},
- [BG_DRILL] = {gBattleAnimBgImage_Drill, gBattleAnimBgPalette_Drill, gBattleAnimBgTilemap_Drill},
- [BG_DRILL_CONTESTS] = {gBattleAnimBgImage_Drill, gBattleAnimBgPalette_Drill, gBattleAnimBgTilemap_DrillContests},
- [BG_HIGHSPEED_OPPONENT] = {gBattleAnimBgImage_Highspeed, gBattleAnimBgPalette_Highspeed, gBattleAnimBgTilemap_HighspeedOpponent},
- [BG_HIGHSPEED_PLAYER] = {gBattleAnimBgImage_Highspeed, gBattleAnimBgPalette_Highspeed, gBattleAnimBgTilemap_HighspeedPlayer},
- [BG_THUNDER] = {gBattleAnimBgImage_Thunder, gBattleAnimBgPalette_Thunder, gBattleAnimBgTilemap_Thunder},
+ [BG_NONE] = {gBattleAnimBgImage_Dark, gBattleAnimBgPalette_Dark, gBattleAnimBgTilemap_Dark},
+ [BG_DARK] = {gBattleAnimBgImage_Dark, gBattleAnimBgPalette_Dark, gBattleAnimBgTilemap_Dark},
+ [BG_GHOST] = {gBattleAnimBgImage_Ghost, gBattleAnimBgPalette_Ghost, gBattleAnimBgTilemap_Ghost},
+ [BG_PSYCHIC] = {gBattleAnimBgImage_Psychic, gBattleAnimBgPalette_Psychic, gBattleAnimBgTilemap_Psychic},
+ [BG_IMPACT_OPPONENT] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_Impact, gBattleAnimBgTilemap_ImpactOpponent},
+ [BG_IMPACT_PLAYER] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_Impact, gBattleAnimBgTilemap_ImpactPlayer},
+ [BG_IMPACT_CONTESTS] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_Impact, gBattleAnimBgTilemap_ImpactContests},
+ [BG_DRILL] = {gBattleAnimBgImage_Drill, gBattleAnimBgPalette_Drill, gBattleAnimBgTilemap_Drill},
+ [BG_DRILL_CONTESTS] = {gBattleAnimBgImage_Drill, gBattleAnimBgPalette_Drill, gBattleAnimBgTilemap_DrillContests},
+ [BG_HIGHSPEED_OPPONENT] = {gBattleAnimBgImage_Highspeed, gBattleAnimBgPalette_Highspeed, gBattleAnimBgTilemap_HighspeedOpponent},
+ [BG_HIGHSPEED_PLAYER] = {gBattleAnimBgImage_Highspeed, gBattleAnimBgPalette_Highspeed, gBattleAnimBgTilemap_HighspeedPlayer},
+ [BG_THUNDER] = {gBattleAnimBgImage_Thunder, gBattleAnimBgPalette_Thunder, gBattleAnimBgTilemap_Thunder},
[BG_GUILLOTINE_OPPONENT] = {gBattleAnimBgImage_Guillotine, gBattleAnimBgPalette_Guillotine, gBattleAnimBgTilemap_GuillotineOpponent},
- [BG_GUILLOTINE_PLAYER] = {gBattleAnimBgImage_Guillotine, gBattleAnimBgPalette_Guillotine, gBattleAnimBgTilemap_GuillotinePlayer},
+ [BG_GUILLOTINE_PLAYER] = {gBattleAnimBgImage_Guillotine, gBattleAnimBgPalette_Guillotine, gBattleAnimBgTilemap_GuillotinePlayer},
[BG_GUILLOTINE_CONTESTS] = {gBattleAnimBgImage_Guillotine, gBattleAnimBgPalette_Guillotine, gBattleAnimBgTilemap_GuillotineContests},
- [BG_ICE] = {gBattleAnimBgImage_Ice, gBattleAnimBgPalette_Ice, gBattleAnimBgTilemap_Ice},
- [BG_COSMIC] = {gBattleAnimBgImage_Cosmic, gBattleAnimBgPalette_Cosmic, gBattleAnimBgTilemap_Cosmic},
- [BG_IN_AIR] = {gBattleAnimBgImage_InAir, gBattleAnimBgPalette_InAir, gBattleAnimBgTilemap_InAir},
- [BG_SKY] = {gBattleAnimBgImage_Drill, gBattleAnimBgPalette_Sky, gBattleAnimBgTilemap_Drill},
- [BG_SKY_CONTESTS] = {gBattleAnimBgImage_Drill, gBattleAnimBgPalette_Sky, gBattleAnimBgTilemap_DrillContests},
- [BG_AURORA] = {gBattleAnimBgImage_Aurora, gBattleAnimBgPalette_Aurora, gBattleAnimBgTilemap_Aurora},
- [BG_FISSURE] = {gBattleAnimBgImage_Fissure, gBattleAnimBgPalette_Fissure, gBattleAnimBgTilemap_Fissure},
- [BG_BUG_OPPONENT] = {gBattleAnimBgImage_Highspeed, gBattleAnimBgPalette_Bug, gBattleAnimBgTilemap_HighspeedOpponent},
- [BG_BUG_PLAYER] = {gBattleAnimBgImage_Highspeed, gBattleAnimBgPalette_Bug, gBattleAnimBgTilemap_HighspeedPlayer},
- [BG_SOLARBEAM_OPPONENT] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_Solarbeam, gBattleAnimBgTilemap_ImpactOpponent},
- [BG_SOLARBEAM_PLAYER] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_Solarbeam, gBattleAnimBgTilemap_ImpactPlayer},
- [BG_SOLARBEAM_CONTESTS] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_Solarbeam, gBattleAnimBgTilemap_ImpactContests},
+ [BG_ICE] = {gBattleAnimBgImage_Ice, gBattleAnimBgPalette_Ice, gBattleAnimBgTilemap_Ice},
+ [BG_COSMIC] = {gBattleAnimBgImage_Cosmic, gBattleAnimBgPalette_Cosmic, gBattleAnimBgTilemap_Cosmic},
+ [BG_IN_AIR] = {gBattleAnimBgImage_InAir, gBattleAnimBgPalette_InAir, gBattleAnimBgTilemap_InAir},
+ [BG_SKY] = {gBattleAnimBgImage_Drill, gBattleAnimBgPalette_Sky, gBattleAnimBgTilemap_Drill},
+ [BG_SKY_CONTESTS] = {gBattleAnimBgImage_Drill, gBattleAnimBgPalette_Sky, gBattleAnimBgTilemap_DrillContests},
+ [BG_AURORA] = {gBattleAnimBgImage_Aurora, gBattleAnimBgPalette_Aurora, gBattleAnimBgTilemap_Aurora},
+ [BG_FISSURE] = {gBattleAnimBgImage_Fissure, gBattleAnimBgPalette_Fissure, gBattleAnimBgTilemap_Fissure},
+ [BG_BUG_OPPONENT] = {gBattleAnimBgImage_Highspeed, gBattleAnimBgPalette_Bug, gBattleAnimBgTilemap_HighspeedOpponent},
+ [BG_BUG_PLAYER] = {gBattleAnimBgImage_Highspeed, gBattleAnimBgPalette_Bug, gBattleAnimBgTilemap_HighspeedPlayer},
+ [BG_SOLARBEAM_OPPONENT] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_Solarbeam, gBattleAnimBgTilemap_ImpactOpponent},
+ [BG_SOLARBEAM_PLAYER] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_Solarbeam, gBattleAnimBgTilemap_ImpactPlayer},
+ [BG_SOLARBEAM_CONTESTS] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_Solarbeam, gBattleAnimBgTilemap_ImpactContests},
};
static void (* const sScriptCmdTable[])(void) =
@@ -1748,8 +1746,8 @@ static void (* const sScriptCmdTable[])(void) =
ScriptCmd_createvisualtask,
ScriptCmd_delay,
ScriptCmd_waitforvisualfinish,
- ScriptCmd_hang1,
- ScriptCmd_hang2,
+ ScriptCmd_nop,
+ ScriptCmd_nop2,
ScriptCmd_end,
ScriptCmd_playse,
ScriptCmd_monbg,
@@ -1769,7 +1767,7 @@ static void (* const sScriptCmdTable[])(void) =
ScriptCmd_changebg,
ScriptCmd_playsewithpan,
ScriptCmd_setpan,
- ScriptCmd_panse_1B,
+ ScriptCmd_panse,
ScriptCmd_loopsewithpan,
ScriptCmd_waitplaysewithpan,
ScriptCmd_setbldcnt,
@@ -1780,8 +1778,8 @@ static void (* const sScriptCmdTable[])(void) =
ScriptCmd_clearmonbg_23,
ScriptCmd_jumpifcontest,
ScriptCmd_fadetobgfromset,
- ScriptCmd_panse_26,
- ScriptCmd_panse_27,
+ ScriptCmd_panse_adjustnone,
+ ScriptCmd_panse_adjustall,
ScriptCmd_monbgprio_28,
ScriptCmd_monbgprio_29,
ScriptCmd_monbgprio_2A,
@@ -1792,12 +1790,11 @@ static void (* const sScriptCmdTable[])(void) =
ScriptCmd_stopsound
};
-// code
void ClearBattleAnimationVars(void)
{
s32 i;
- gAnimFramesToWait = 0;
+ sAnimFramesToWait = 0;
gAnimScriptActive = FALSE;
gAnimVisualTaskCount = 0;
gAnimSoundTaskCount = 0;
@@ -1837,7 +1834,7 @@ void LaunchBattleAnimation(const u8 *const animsTable[], u16 tableId, bool8 isMo
if (!IsContest())
{
- sub_80A8278();
+ InitPrioritiesForVisibleBattlers();
UpdateOamPriorityInAllHealthboxes(0);
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
@@ -1865,7 +1862,7 @@ void LaunchBattleAnimation(const u8 *const animsTable[], u16 tableId, bool8 isMo
sMonAnimTaskIdArray[1] = TASK_NONE;
sBattleAnimScriptPtr = animsTable[tableId];
gAnimScriptActive = TRUE;
- gAnimFramesToWait = 0;
+ sAnimFramesToWait = 0;
gAnimScriptCallback = RunAnimScriptCommand;
for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++)
@@ -1938,14 +1935,14 @@ static void ClearSpriteIndex(u16 index)
static void WaitAnimFrameCount(void)
{
- if (gAnimFramesToWait <= 0)
+ if (sAnimFramesToWait <= 0)
{
gAnimScriptCallback = RunAnimScriptCommand;
- gAnimFramesToWait = 0;
+ sAnimFramesToWait = 0;
}
else
{
- gAnimFramesToWait--;
+ sAnimFramesToWait--;
}
}
@@ -1954,7 +1951,7 @@ static void RunAnimScriptCommand(void)
do
{
sScriptCmdTable[sBattleAnimScriptPtr[0]]();
- } while (gAnimFramesToWait == 0 && gAnimScriptActive);
+ } while (sAnimFramesToWait == 0 && gAnimScriptActive);
}
static void ScriptCmd_loadspritegfx(void)
@@ -1967,7 +1964,7 @@ static void ScriptCmd_loadspritegfx(void)
LoadCompressedSpritePaletteUsingHeap(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(index)]);
sBattleAnimScriptPtr += 2;
AddSpriteIndex(GET_TRUE_SPRITE_INDEX(index));
- gAnimFramesToWait = 1;
+ sAnimFramesToWait = 1;
gAnimScriptCallback = WaitAnimFrameCount;
}
@@ -2070,9 +2067,9 @@ static void ScriptCmd_createvisualtask(void)
static void ScriptCmd_delay(void)
{
sBattleAnimScriptPtr++;
- gAnimFramesToWait = sBattleAnimScriptPtr[0];
- if (gAnimFramesToWait == 0)
- gAnimFramesToWait = -1;
+ sAnimFramesToWait = sBattleAnimScriptPtr[0];
+ if (sAnimFramesToWait == 0)
+ sAnimFramesToWait = -1;
sBattleAnimScriptPtr++;
gAnimScriptCallback = WaitAnimFrameCount;
}
@@ -2083,19 +2080,19 @@ static void ScriptCmd_waitforvisualfinish(void)
if (gAnimVisualTaskCount == 0)
{
sBattleAnimScriptPtr++;
- gAnimFramesToWait = 0;
+ sAnimFramesToWait = 0;
}
else
{
- gAnimFramesToWait = 1;
+ sAnimFramesToWait = 1;
}
}
-static void ScriptCmd_hang1(void)
+static void ScriptCmd_nop(void)
{
}
-static void ScriptCmd_hang2(void)
+static void ScriptCmd_nop2(void)
{
}
@@ -2109,7 +2106,7 @@ static void ScriptCmd_end(void)
|| sMonAnimTaskIdArray[0] != TASK_NONE || sMonAnimTaskIdArray[1] != TASK_NONE)
{
sSoundAnimFramesToWait = 0;
- gAnimFramesToWait = 1;
+ sAnimFramesToWait = 1;
return;
}
@@ -2118,7 +2115,7 @@ static void ScriptCmd_end(void)
{
if (++sSoundAnimFramesToWait <= 90) // Wait 90 frames, then halt the sound effect.
{
- gAnimFramesToWait = 1;
+ sAnimFramesToWait = 1;
return;
}
else
@@ -2146,7 +2143,7 @@ static void ScriptCmd_end(void)
m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 256);
if (!IsContest())
{
- sub_80A8278();
+ InitPrioritiesForVisibleBattlers();
UpdateOamPriorityInAllHealthboxes(1);
}
gAnimScriptActive = FALSE;
@@ -2160,11 +2157,16 @@ static void ScriptCmd_playse(void)
sBattleAnimScriptPtr += 2;
}
-#define t1_MONBG_BATTLER 0
-#define t1_MON_IN_BG2 1
+// These two tasks share context and similar task data
+// To differentiate them their task data is prefixed t1/t2
+
+// Task data for sub_80A40F4
+#define t1_BattlerSpriteId data[0]
+#define t1_InBg2 data[1]
#define t1_CREATE_ANOTHER_TASK 2
#define t1_IS_SECONDMON_BG 3
+// Task data for task_pA_ma0A_obj_to_bg_pal
#define t2_BATTLER_SPRITE_ID 0
#define t2_MON_IN_BG2 5
#define t2_MONBG_BATTLER 6
@@ -2173,11 +2175,11 @@ static void sub_80A40F4(u8 taskId)
{
u8 newTaskId;
- s16 *selfData = gTasks[taskId].data;
- u8 battlerSpriteId = gBattlerSpriteIds[selfData[t1_MONBG_BATTLER]];
+ s16 *data = gTasks[taskId].data;
+ u8 battlerSpriteId = gBattlerSpriteIds[t1_BattlerSpriteId];
gSprites[battlerSpriteId].invisible = TRUE;
- if (!selfData[t1_CREATE_ANOTHER_TASK])
+ if (!data[t1_CREATE_ANOTHER_TASK])
{
DestroyAnimVisualTask(taskId);
return;
@@ -2188,7 +2190,7 @@ static void sub_80A40F4(u8 taskId)
gTasks[newTaskId].data[1] = gSprites[battlerSpriteId].x + gSprites[battlerSpriteId].x2;
gTasks[newTaskId].data[2] = gSprites[battlerSpriteId].y + gSprites[battlerSpriteId].y2;
- if (!selfData[t1_MON_IN_BG2])
+ if (!t1_InBg2)
{
gTasks[newTaskId].data[3] = gBattle_BG1_X;
gTasks[newTaskId].data[4] = gBattle_BG1_Y;
@@ -2199,9 +2201,9 @@ static void sub_80A40F4(u8 taskId)
gTasks[newTaskId].data[4] = gBattle_BG2_Y;
}
- gTasks[newTaskId].data[t2_MON_IN_BG2] = selfData[t1_MON_IN_BG2];
- gTasks[newTaskId].data[t2_MONBG_BATTLER] = selfData[t1_MONBG_BATTLER];
- sMonAnimTaskIdArray[selfData[t1_IS_SECONDMON_BG]] = newTaskId;
+ gTasks[newTaskId].data[t2_MON_IN_BG2] = t1_InBg2;
+ gTasks[newTaskId].data[t2_MONBG_BATTLER] = t1_BattlerSpriteId;
+ sMonAnimTaskIdArray[data[t1_IS_SECONDMON_BG]] = newTaskId;
DestroyAnimVisualTask(taskId);
}
@@ -2231,8 +2233,8 @@ static void ScriptCmd_monbg(void)
MoveBattlerSpriteToBG(battlerId, toBG_2, FALSE);
taskId = CreateTask(sub_80A40F4, 10);
gAnimVisualTaskCount++;
- gTasks[taskId].data[t1_MONBG_BATTLER] = battlerId;
- gTasks[taskId].data[t1_MON_IN_BG2] = toBG_2;
+ gTasks[taskId].t1_BattlerSpriteId = battlerId;
+ gTasks[taskId].t1_InBg2 = toBG_2;
gTasks[taskId].data[t1_CREATE_ANOTHER_TASK] = TRUE;
gTasks[taskId].data[t1_IS_SECONDMON_BG] = 0;
@@ -2257,7 +2259,7 @@ static void ScriptCmd_monbg(void)
}
sBattleAnimScriptPtr++;
- gAnimFramesToWait = 1;
+ sAnimFramesToWait = 1;
gAnimScriptCallback = WaitAnimFrameCount;
}
@@ -2329,10 +2331,10 @@ void MoveBattlerSpriteToBG(u8 battlerId, bool8 toBG_2, bool8 setSpriteInvisible)
else
battlerPosition = GetBattlerPosition(battlerId);
- sub_8118FBC(1, 0, 0, battlerPosition, animBg.paletteId, animBg.bgTiles, animBg.bgTilemap, animBg.tilesOffset);
+ DrawBattlerOnBg(1, 0, 0, battlerPosition, animBg.paletteId, animBg.bgTiles, animBg.bgTilemap, animBg.tilesOffset);
if (IsContest())
- sub_80A46A0();
+ FlipBattlerBgTiles();
}
else
{
@@ -2359,11 +2361,11 @@ void MoveBattlerSpriteToBG(u8 battlerId, bool8 toBG_2, bool8 setSpriteInvisible)
LoadPalette(&gPlttBufferUnfaded[0x100 + battlerId * 16], 0x90, 0x20);
CpuCopy32(&gPlttBufferUnfaded[0x100 + battlerId * 16], (void*)(BG_PLTT + 0x120), 0x20);
- sub_8118FBC(2, 0, 0, GetBattlerPosition(battlerId), animBg.paletteId, animBg.bgTiles + 0x1000, animBg.bgTilemap + 0x400, animBg.tilesOffset);
+ DrawBattlerOnBg(2, 0, 0, GetBattlerPosition(battlerId), animBg.paletteId, animBg.bgTiles + 0x1000, animBg.bgTilemap + 0x400, animBg.tilesOffset);
}
}
-static void sub_80A46A0(void)
+static void FlipBattlerBgTiles(void)
{
s32 i, j;
struct BattleAnimBgData animBg;
@@ -2377,10 +2379,8 @@ static void sub_80A46A0(void)
{
for (j = 0; j < 4; j++)
{
- u16 temp = ptr[j + i * 32];
-
- ptr[j + i * 32] = ptr[7 - j + i * 32];
- ptr[7 - j + i * 32] = temp;
+ u16 temp;
+ SWAP(ptr[j + i * 32], ptr[7 - j + i * 32], temp);
}
}
for (i = 0; i < 8; i++)
@@ -2391,20 +2391,20 @@ static void sub_80A46A0(void)
}
}
-void sub_80A4720(u16 a, u16 *b, u32 c, u8 d)
+void RelocateBattleBgPal(u16 paletteNum, u16 *dest, u32 offset, bool8 largeScreen)
{
s32 i, j;
- s32 var;
+ s32 size;
- if (d == 0)
- var = 32;
+ if (!largeScreen)
+ size = 32;
else
- var = 64;
- a <<= 12;
- for (i = 0; i < var; i++)
+ size = 64;
+ paletteNum <<= 12;
+ for (i = 0; i < size; i++)
{
for (j = 0; j < 32; j++)
- b[j + i * 32] = ((b[j + i * 32] & 0xFFF) | a) + c;
+ dest[j + i * 32] = ((dest[j + i * 32] & 0xFFF) | paletteNum) + offset;
}
}
@@ -2446,8 +2446,8 @@ static void task_pA_ma0A_obj_to_bg_pal(u8 taskId)
gBattle_BG1_X = x + gTasks[taskId].data[3];
gBattle_BG1_Y = y + gTasks[taskId].data[4];
- src = gPlttBufferFaded + 0x100 + palIndex * 16;
- dst = gPlttBufferFaded + 0x100 + animBg.paletteId * 16 - 256;
+ src = &gPlttBufferFaded[0x100 + palIndex * 16];
+ dst = &gPlttBufferFaded[0x100 + animBg.paletteId * 16 - 256];
CpuCopy32(src, dst, 0x20);
}
else
@@ -2457,8 +2457,8 @@ static void task_pA_ma0A_obj_to_bg_pal(u8 taskId)
gBattle_BG2_X = x + gTasks[taskId].data[3];
gBattle_BG2_Y = y + gTasks[taskId].data[4];
- src = gPlttBufferFaded + 0x100 + palIndex * 16;
- dst = gPlttBufferFaded + 0x100 - 112;
+ src = &gPlttBufferFaded[0x100 + palIndex * 16];
+ dst = &gPlttBufferFaded[0x100 - 112];
CpuCopy32(src, dst, 0x20);
}
}
@@ -2489,14 +2489,14 @@ static void ScriptCmd_clearmonbg(void)
else
animBattlerId = 0;
- taskId = CreateTask(sub_80A4980, 5);
+ taskId = CreateTask(Task_ClearMonBg, 5);
gTasks[taskId].data[0] = animBattlerId;
gTasks[taskId].data[2] = battlerId;
sBattleAnimScriptPtr++;
}
-static void sub_80A4980(u8 taskId)
+static void Task_ClearMonBg(u8 taskId)
{
gTasks[taskId].data[1]++;
if (gTasks[taskId].data[1] != 1)
@@ -2625,8 +2625,8 @@ static void sub_80A4BB0(u8 taskId)
}
}
-#undef t1_MONBG_BATTLER
-#undef t1_MON_IN_BG2
+#undef t1_BattlerSpriteId
+#undef t1_InBg2
#undef t1_CREATE_ANOTHER_TASK
#undef t1_IS_SECONDMON_BG
@@ -2676,6 +2676,10 @@ static void ScriptCmd_return(void)
static void ScriptCmd_setarg(void)
{
+ // Save original address to return to
+ // after the T1_READ_16, + 4.
+ // They could have equivalently just advanced
+ // sBattleAnimScriptPtr by 2 afterwards.
const u8 *addr = sBattleAnimScriptPtr;
u16 value;
u8 argId;
@@ -2809,17 +2813,17 @@ static void LoadMoveBg(u16 bgId)
void *dmaDest;
LZDecompressWram(tilemap, gDecompressionBuffer);
- sub_80A4720(GetBattleBgPaletteNum(), (void*)(gDecompressionBuffer), 0x100, 0);
+ RelocateBattleBgPal(GetBattleBgPaletteNum(), (void*)gDecompressionBuffer, 0x100, FALSE);
dmaSrc = gDecompressionBuffer;
- dmaDest = (void *)(BG_SCREEN_ADDR(26));
+ dmaDest = (void *)BG_SCREEN_ADDR(26);
DmaCopy32(3, dmaSrc, dmaDest, 0x800);
- LZDecompressVram(gBattleAnimBackgroundTable[bgId].image, (void *)(BG_SCREEN_ADDR(4)));
+ LZDecompressVram(gBattleAnimBackgroundTable[bgId].image, (void *)BG_SCREEN_ADDR(4));
LoadCompressedPalette(gBattleAnimBackgroundTable[bgId].palette, GetBattleBgPaletteNum() * 16, 32);
}
else
{
- LZDecompressVram(gBattleAnimBackgroundTable[bgId].tilemap, (void *)(BG_SCREEN_ADDR(26)));
- LZDecompressVram(gBattleAnimBackgroundTable[bgId].image, (void *)(BG_CHAR_ADDR(2)));
+ LZDecompressVram(gBattleAnimBackgroundTable[bgId].tilemap, (void *)BG_SCREEN_ADDR(26));
+ LZDecompressVram(gBattleAnimBackgroundTable[bgId].image, (void *)BG_CHAR_ADDR(2));
LoadCompressedPalette(gBattleAnimBackgroundTable[bgId].palette, 32, 32);
}
}
@@ -2850,11 +2854,11 @@ static void ScriptCmd_waitbgfadeout(void)
if (sAnimBackgroundFadeState == 2)
{
sBattleAnimScriptPtr++;
- gAnimFramesToWait = 0;
+ sAnimFramesToWait = 0;
}
else
{
- gAnimFramesToWait = 1;
+ sAnimFramesToWait = 1;
}
}
@@ -2863,11 +2867,11 @@ static void ScriptCmd_waitbgfadein(void)
if (sAnimBackgroundFadeState == 0)
{
sBattleAnimScriptPtr++;
- gAnimFramesToWait = 0;
+ sAnimFramesToWait = 0;
}
else
{
- gAnimFramesToWait = 1;
+ sAnimFramesToWait = 1;
}
}
@@ -2992,7 +2996,7 @@ static void ScriptCmd_setpan(void)
#define tCurrentPan data[4]
#define tFrameCounter data[8]
-static void ScriptCmd_panse_1B(void)
+static void ScriptCmd_panse(void)
{
u16 songNum;
s8 currentPanArg, incrementPan, incrementPanArg, currentPan, targetPan;
@@ -3002,13 +3006,14 @@ static void ScriptCmd_panse_1B(void)
sBattleAnimScriptPtr++;
songNum = T1_READ_16(sBattleAnimScriptPtr);
currentPanArg = sBattleAnimScriptPtr[2];
- incrementPan = sBattleAnimScriptPtr[3];
+ incrementPan = sBattleAnimScriptPtr[3]; // targetPan, var is re-used
incrementPanArg = sBattleAnimScriptPtr[4];
framesToWait = sBattleAnimScriptPtr[5];
currentPan = BattleAnimAdjustPanning(currentPanArg);
targetPan = BattleAnimAdjustPanning(incrementPan);
incrementPan = CalculatePanIncrement(currentPan, targetPan, incrementPanArg);
+
taskId = CreateTask(Task_PanFromInitialToTarget, 1);
gTasks[taskId].tInitialPan = currentPan;
gTasks[taskId].tTargetPan = targetPan;
@@ -3064,7 +3069,7 @@ void Task_PanFromInitialToTarget(u8 taskId)
}
}
-static void ScriptCmd_panse_26(void)
+static void ScriptCmd_panse_adjustnone(void)
{
u16 songId;
s8 currentPan, targetPan, incrementPan;
@@ -3091,7 +3096,7 @@ static void ScriptCmd_panse_26(void)
sBattleAnimScriptPtr += 6;
}
-static void ScriptCmd_panse_27(void)
+static void ScriptCmd_panse_adjustall(void)
{
u16 songId;
s8 targetPanArg, incrementPanArg, currentPanArg, currentPan, targetPan, incrementPan;
@@ -3254,7 +3259,7 @@ static void ScriptCmd_waitsound(void)
if (gAnimSoundTaskCount != 0)
{
sSoundAnimFramesToWait = 0;
- gAnimFramesToWait = 1;
+ sAnimFramesToWait = 1;
}
else if (IsSEPlaying())
{
@@ -3266,14 +3271,14 @@ static void ScriptCmd_waitsound(void)
}
else
{
- gAnimFramesToWait = 1;
+ sAnimFramesToWait = 1;
}
}
else
{
sSoundAnimFramesToWait = 0;
sBattleAnimScriptPtr++;
- gAnimFramesToWait = 0;
+ sAnimFramesToWait = 0;
}
}
diff --git a/src/battle_anim_effects_2.c b/src/battle_anim_effects_2.c
index 2f4343e73..27149873d 100755
--- a/src/battle_anim_effects_2.c
+++ b/src/battle_anim_effects_2.c
@@ -3250,7 +3250,7 @@ void AnimTask_HeartsBackground(u8 taskId)
SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y);
GetBattleAnimBg1Data(&animBg);
AnimLoadCompressedBgGfx(animBg.bgId, &gBattleAnimBgImage_Attract, animBg.tilesOffset);
- AnimLoadCompressedBgTilemapHandleContest(&animBg, &gBattleAnimBgTilemap_Attract, 0);
+ AnimLoadCompressedBgTilemapHandleContest(&animBg, &gBattleAnimBgTilemap_Attract, FALSE);
LoadCompressedPalette(&gBattleAnimBgPalette_Attract, animBg.paletteId * 16, 32);
gTasks[taskId].func = AnimTask_HeartsBackground_Step;
}
@@ -3328,11 +3328,11 @@ void AnimTask_ScaryFace(u8 taskId)
SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y);
GetBattleAnimBg1Data(&animBg);
if (IsContest())
- AnimLoadCompressedBgTilemapHandleContest(&animBg, &gBattleAnimBgTilemap_ScaryFaceContest, 0);
+ AnimLoadCompressedBgTilemapHandleContest(&animBg, &gBattleAnimBgTilemap_ScaryFaceContest, FALSE);
else if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_OPPONENT)
- AnimLoadCompressedBgTilemapHandleContest(&animBg, &gBattleAnimBgTilemap_ScaryFacePlayer, 0);
+ AnimLoadCompressedBgTilemapHandleContest(&animBg, &gBattleAnimBgTilemap_ScaryFacePlayer, FALSE);
else
- AnimLoadCompressedBgTilemapHandleContest(&animBg, &gBattleAnimBgTilemap_ScaryFaceOpponent, 0);
+ AnimLoadCompressedBgTilemapHandleContest(&animBg, &gBattleAnimBgTilemap_ScaryFaceOpponent, FALSE);
AnimLoadCompressedBgGfx(animBg.bgId, gBattleAnimBgImage_ScaryFace, animBg.tilesOffset);
LoadCompressedPalette(gBattleAnimBgPalette_ScaryFace, animBg.paletteId * 16, 32);
diff --git a/src/battle_anim_effects_3.c b/src/battle_anim_effects_3.c
index 2a649dd8b..267b6db9c 100755
--- a/src/battle_anim_effects_3.c
+++ b/src/battle_anim_effects_3.c
@@ -2388,7 +2388,7 @@ void AnimTask_MorningSunLightBeam(u8 taskId)
SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1);
GetBattleAnimBg1Data(&animBg);
- AnimLoadCompressedBgTilemapHandleContest(&animBg, &gBattleAnimMaskTilemap_LightBeam, 0);
+ AnimLoadCompressedBgTilemapHandleContest(&animBg, &gBattleAnimMaskTilemap_LightBeam, FALSE);
if (IsContest())
{
gBattle_BG1_X = -56;
@@ -2569,7 +2569,7 @@ void AnimTask_DoomDesireLightBeam(u8 taskId)
SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1);
GetBattleAnimBg1Data(&animBg);
- AnimLoadCompressedBgTilemapHandleContest(&animBg, &gBattleAnimMaskTilemap_LightBeam, 0);
+ AnimLoadCompressedBgTilemapHandleContest(&animBg, &gBattleAnimMaskTilemap_LightBeam, FALSE);
if (IsContest())
{
gBattle_BG1_X = -56;
diff --git a/src/battle_anim_ice.c b/src/battle_anim_ice.c
index a0608cfd1..95c64f7ca 100644
--- a/src/battle_anim_ice.c
+++ b/src/battle_anim_ice.c
@@ -1000,7 +1000,7 @@ void AnimTask_HazeScrollingFog(u8 taskId)
GetBattleAnimBg1Data(&animBg);
LoadBgTiles(animBg.bgId, gWeatherFogHorizontalTiles, 0x800, animBg.tilesOffset);
- AnimLoadCompressedBgTilemapHandleContest(&animBg, gBattleAnimFogTilemap, 0);
+ AnimLoadCompressedBgTilemapHandleContest(&animBg, gBattleAnimFogTilemap, FALSE);
LoadPalette(&gFogPalette, animBg.paletteId * 16, 32);
gTasks[taskId].func = AnimTask_HazeScrollingFog_Step;
@@ -1105,7 +1105,7 @@ void AnimTask_LoadMistTiles(u8 taskId)
GetBattleAnimBg1Data(&animBg);
LoadBgTiles(animBg.bgId, gWeatherFogHorizontalTiles, 0x800, animBg.tilesOffset);
- AnimLoadCompressedBgTilemapHandleContest(&animBg, gBattleAnimFogTilemap, 0);
+ AnimLoadCompressedBgTilemapHandleContest(&animBg, gBattleAnimFogTilemap, FALSE);
LoadPalette(&gFogPalette, animBg.paletteId * 16, 32);
gTasks[taskId].data[15] = -1;
diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c
index be409f366..d0ddfdd77 100644
--- a/src/battle_anim_mons.c
+++ b/src/battle_anim_mons.c
@@ -37,15 +37,15 @@ static void sub_80A8D78(struct Task *task, u8 taskId);
EWRAM_DATA static union AffineAnimCmd *gAnimTaskAffineAnim = NULL;
// Const rom data
-static const struct UCoords8 sBattlerCoords[][4] =
+static const struct UCoords8 sBattlerCoords[][MAX_BATTLERS_COUNT] =
{
- {
+ { // Single battle
{ 72, 80 },
{ 176, 40 },
{ 48, 40 },
{ 112, 80 },
},
- {
+ { // Double battle
{ 32, 80 },
{ 200, 40 },
{ 90, 88 },
@@ -54,29 +54,29 @@ static const struct UCoords8 sBattlerCoords[][4] =
};
// One entry for each of the four Castform forms.
-const struct MonCoords gCastformFrontSpriteCoords[] =
+const struct MonCoords gCastformFrontSpriteCoords[NUM_CASTFORM_FORMS] =
{
- { .size = 0x44, .y_offset = 17 }, // NORMAL
- { .size = 0x66, .y_offset = 9 }, // SUN
- { .size = 0x46, .y_offset = 9 }, // RAIN
- { .size = 0x86, .y_offset = 8 }, // HAIL
+ [CASTFORM_NORMAL] = { .size = 0x44, .y_offset = 17 },
+ [CASTFORM_FIRE] = { .size = 0x66, .y_offset = 9 },
+ [CASTFORM_WATER] = { .size = 0x46, .y_offset = 9 },
+ [CASTFORM_ICE] = { .size = 0x86, .y_offset = 8 },
};
-static const u8 sCastformElevations[] =
+static const u8 sCastformElevations[NUM_CASTFORM_FORMS] =
{
- 13, // NORMAL
- 14, // SUN
- 13, // RAIN
- 13, // HAIL
+ [CASTFORM_NORMAL] = 13,
+ [CASTFORM_FIRE] = 14,
+ [CASTFORM_WATER] = 13,
+ [CASTFORM_ICE] = 13,
};
// Y position of the backsprite for each of the four Castform forms.
-static const u8 sCastformBackSpriteYCoords[] =
+static const u8 sCastformBackSpriteYCoords[NUM_CASTFORM_FORMS] =
{
- 0, // NORMAL
- 0, // SUN
- 0, // RAIN
- 0, // HAIL
+ [CASTFORM_NORMAL] = 0,
+ [CASTFORM_FIRE] = 0,
+ [CASTFORM_WATER] = 0,
+ [CASTFORM_ICE] = 0,
};
// Placeholders for pokemon sprites to be created for a move animation effect (e.g. Role Play / Snatch)
@@ -853,8 +853,8 @@ void GetBattleAnimBg1Data(struct BattleAnimBgData *out)
{
if (IsContest())
{
- out->bgTiles = gUnknown_0202305C;
- out->bgTilemap = (u16 *)gUnknown_02023060;
+ out->bgTiles = gBattleAnimBgTileBuffer;
+ out->bgTilemap = (u16 *)gBattleAnimBgTilemapBuffer;
out->paletteId = 14;
out->bgId = 1;
out->tilesOffset = 0;
@@ -862,8 +862,8 @@ void GetBattleAnimBg1Data(struct BattleAnimBgData *out)
}
else
{
- out->bgTiles = gUnknown_0202305C;
- out->bgTilemap = (u16 *)gUnknown_02023060;
+ out->bgTiles = gBattleAnimBgTileBuffer;
+ out->bgTilemap = (u16 *)gBattleAnimBgTilemapBuffer;
out->paletteId = 8;
out->bgId = 1;
out->tilesOffset = 0x200;
@@ -875,8 +875,8 @@ void GetBattleAnimBgData(struct BattleAnimBgData *out, u32 bgId)
{
if (IsContest())
{
- out->bgTiles = gUnknown_0202305C;
- out->bgTilemap = (u16 *)gUnknown_02023060;
+ out->bgTiles = gBattleAnimBgTileBuffer;
+ out->bgTilemap = (u16 *)gBattleAnimBgTilemapBuffer;
out->paletteId = 14;
out->bgId = 1;
out->tilesOffset = 0;
@@ -888,8 +888,8 @@ void GetBattleAnimBgData(struct BattleAnimBgData *out, u32 bgId)
}
else
{
- out->bgTiles = gUnknown_0202305C;
- out->bgTilemap = (u16 *)gUnknown_02023060;
+ out->bgTiles = gBattleAnimBgTileBuffer;
+ out->bgTilemap = (u16 *)gBattleAnimBgTilemapBuffer;
out->paletteId = 9;
out->bgId = 2;
out->tilesOffset = 0x300;
@@ -899,8 +899,8 @@ void GetBattleAnimBgData(struct BattleAnimBgData *out, u32 bgId)
void sub_80A6BFC(struct BattleAnimBgData *out, u8 unused)
{
- out->bgTiles = gUnknown_0202305C;
- out->bgTilemap = (u16 *)gUnknown_02023060;
+ out->bgTiles = gBattleAnimBgTileBuffer;
+ out->bgTilemap = (u16 *)gBattleAnimBgTilemapBuffer;
if (IsContest())
{
out->paletteId = 14;
@@ -937,9 +937,9 @@ void ClearBattleAnimBg(u32 bgId)
void AnimLoadCompressedBgGfx(u32 bgId, const u32 *src, u32 tilesOffset)
{
- CpuFill32(0, gUnknown_0202305C, 0x2000);
- LZDecompressWram(src, gUnknown_0202305C);
- LoadBgTiles(bgId, gUnknown_0202305C, 0x2000, tilesOffset);
+ CpuFill32(0, gBattleAnimBgTileBuffer, 0x2000);
+ LZDecompressWram(src, gBattleAnimBgTileBuffer);
+ LoadBgTiles(bgId, gBattleAnimBgTileBuffer, 0x2000, tilesOffset);
}
static void InitAnimBgTilemapBuffer(u32 bgId, const void *src)
@@ -954,12 +954,12 @@ void AnimLoadCompressedBgTilemap(u32 bgId, const void *src)
CopyBgTilemapBufferToVram(bgId);
}
-void AnimLoadCompressedBgTilemapHandleContest(struct BattleAnimBgData *unk, const void *src, u32 arg2)
+void AnimLoadCompressedBgTilemapHandleContest(struct BattleAnimBgData *data, const void *src, bool32 largeScreen)
{
- InitAnimBgTilemapBuffer(unk->bgId, src);
+ InitAnimBgTilemapBuffer(data->bgId, src);
if (IsContest() == TRUE)
- sub_80A4720(unk->paletteId, unk->bgTilemap, 0, arg2);
- CopyBgTilemapBufferToVram(unk->bgId);
+ RelocateBattleBgPal(data->paletteId, data->bgTilemap, 0, largeScreen);
+ CopyBgTilemapBufferToVram(data->bgId);
}
u8 GetBattleBgPaletteNum(void)
@@ -1947,7 +1947,8 @@ void AnimTask_GetFrustrationPowerLevel(u8 taskId)
DestroyAnimVisualTask(taskId);
}
-void sub_80A8174(u8 priority)
+// Unused
+static void SetPriorityForVisibleBattlers(u8 priority)
{
if (IsBattlerSpriteVisible(gBattleAnimTarget))
gSprites[gBattlerSpriteIds[gBattleAnimTarget]].oam.priority = priority;
@@ -1959,7 +1960,7 @@ void sub_80A8174(u8 priority)
gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]].oam.priority = priority;
}
-void sub_80A8278(void)
+void InitPrioritiesForVisibleBattlers(void)
{
int i;
diff --git a/src/battle_anim_rock.c b/src/battle_anim_rock.c
index 7f292d596..905f51a79 100644
--- a/src/battle_anim_rock.c
+++ b/src/battle_anim_rock.c
@@ -409,7 +409,7 @@ void AnimTask_LoadSandstormBackground(u8 taskId)
GetBattleAnimBg1Data(&animBg);
AnimLoadCompressedBgGfx(animBg.bgId, gBattleAnimBgImage_Sandstorm, animBg.tilesOffset);
- AnimLoadCompressedBgTilemapHandleContest(&animBg, gBattleAnimBgTilemap_Sandstorm, 0);
+ AnimLoadCompressedBgTilemapHandleContest(&animBg, gBattleAnimBgTilemap_Sandstorm, FALSE);
LoadCompressedPalette(gBattleAnimSpritePal_FlyingDirt, animBg.paletteId * 16, 32);
if (gBattleAnimArgs[0] && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
diff --git a/src/battle_anim_utility_funcs.c b/src/battle_anim_utility_funcs.c
index c20fbc9e2..b0eab5b74 100644
--- a/src/battle_anim_utility_funcs.c
+++ b/src/battle_anim_utility_funcs.c
@@ -331,7 +331,7 @@ void AnimTask_DrawFallingWhiteLinesOnAttacker(u8 taskId)
spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
newSpriteId = CreateInvisibleSpriteCopy(gBattleAnimAttacker, spriteId, species);
GetBattleAnimBg1Data(&animBgData);
- AnimLoadCompressedBgTilemapHandleContest(&animBgData, gBattleAnimMaskTilemap_Curse, 0);
+ AnimLoadCompressedBgTilemapHandleContest(&animBgData, gBattleAnimMaskTilemap_Curse, FALSE);
AnimLoadCompressedBgGfx(animBgData.bgId, gBattleAnimMaskImage_Curse, animBgData.tilesOffset);
LoadPalette(sCurseLinesPalette, animBgData.paletteId * 16 + 1, 2);
@@ -470,9 +470,9 @@ static void StatsChangeAnimation_Step2(u8 taskId)
GetBattleAnimBg1Data(&animBgData);
if (sAnimStatsChangeData->data[0] == 0)
- AnimLoadCompressedBgTilemapHandleContest(&animBgData, gBattleStatMask1_Tilemap, 0);
+ AnimLoadCompressedBgTilemapHandleContest(&animBgData, gBattleStatMask1_Tilemap, FALSE);
else
- AnimLoadCompressedBgTilemapHandleContest(&animBgData, gBattleStatMask2_Tilemap, 0);
+ AnimLoadCompressedBgTilemapHandleContest(&animBgData, gBattleStatMask2_Tilemap, FALSE);
AnimLoadCompressedBgGfx(animBgData.bgId, gBattleStatMask_Gfx, animBgData.tilesOffset);
switch (sAnimStatsChangeData->data[1])
@@ -821,7 +821,7 @@ void StartMonScrollingBgMask(u8 taskId, int unused, u16 scrollSpeed, u8 battler,
spriteId2 = CreateInvisibleSpriteCopy(battler2, gBattlerSpriteIds[battler2], species);
GetBattleAnimBg1Data(&animBgData);
- AnimLoadCompressedBgTilemapHandleContest(&animBgData, tilemap, 0);
+ AnimLoadCompressedBgTilemapHandleContest(&animBgData, tilemap, FALSE);
AnimLoadCompressedBgGfx(animBgData.bgId, gfx, animBgData.tilesOffset);
LoadCompressedPalette(palette, animBgData.paletteId * 16, 32);
diff --git a/src/battle_anim_water.c b/src/battle_anim_water.c
index 4ee09f386..1c2d08d6a 100644
--- a/src/battle_anim_water.c
+++ b/src/battle_anim_water.c
@@ -54,9 +54,8 @@ static void AnimTask_WaterSport_Step(u8);
static void CreateWaterSportDroplet(struct Task*);
static void CreateWaterPulseRingBubbles(struct Sprite*, int, int);
-// Both unused
-const u8 gUnknown_8593C80[] = INCBIN_U8("graphics/unknown/unknown_593C80.4bpp");
-const u8 gUnknown_8593FFC[] = INCBIN_U8("graphics/unknown/unknown_593FFC.bin");
+static const u8 sUnusedWater_Gfx[] = INCBIN_U8("graphics/battle_anims/unused_water_gfx.4bpp");
+static const u8 sUnusedWater[] = INCBIN_U8("graphics/battle_anims/unused_water.bin");
static const union AnimCmd sAnim_RainDrop[] =
{
@@ -822,7 +821,7 @@ void AnimTask_CreateSurfWave(u8 taskId)
}
else
{
- AnimLoadCompressedBgTilemapHandleContest(&animBg, gBattleAnimBgTilemap_SurfContest, 1);
+ AnimLoadCompressedBgTilemapHandleContest(&animBg, gBattleAnimBgTilemap_SurfContest, TRUE);
}
AnimLoadCompressedBgGfx(animBg.bgId, gBattleAnimBgImage_Surf, animBg.tilesOffset);
if (gBattleAnimArgs[0] == 0)
diff --git a/src/battle_bg.c b/src/battle_bg.c
index 0ad126509..886a3d107 100644
--- a/src/battle_bg.c
+++ b/src/battle_bg.c
@@ -594,8 +594,8 @@ static const struct WindowTemplate gBattleArenaWindowTemplates[] =
const struct WindowTemplate * const gBattleWindowTemplates[] =
{
- gStandardBattleWindowTemplates,
- gBattleArenaWindowTemplates,
+ [B_WIN_TYPE_NORMAL] = gStandardBattleWindowTemplates,
+ [B_WIN_TYPE_ARENA] = gBattleArenaWindowTemplates,
};
static const struct BattleBackground gBattleTerrainTable[] =
@@ -691,20 +691,19 @@ static const struct BattleBackground gBattleTerrainTable[] =
},
};
-static void sub_8035648(void);
+static void CB2_UnusedBattleInit(void);
-// Unused
-static void sub_8035608(void)
+static void UnusedBattleInit(void)
{
u8 spriteId;
ResetSpriteData();
- spriteId = CreateSprite(&gUnknown_0831AC88, 0, 0, 0);
+ spriteId = CreateSprite(&gUnusedBattleInitSprite, 0, 0, 0);
gSprites[spriteId].invisible = TRUE;
- SetMainCallback2(sub_8035648);
+ SetMainCallback2(CB2_UnusedBattleInit);
}
-static void sub_8035648(void)
+static void CB2_UnusedBattleInit(void)
{
AnimateSprites();
BuildOamBuffer();
@@ -717,13 +716,13 @@ void BattleInitBgsAndWindows(void)
if (gBattleTypeFlags & BATTLE_TYPE_ARENA)
{
- gBattleScripting.windowsType = 1;
- SetBgTilemapBuffer(1, gUnknown_02023060);
- SetBgTilemapBuffer(2, gUnknown_02023060);
+ gBattleScripting.windowsType = B_WIN_TYPE_ARENA;
+ SetBgTilemapBuffer(1, gBattleAnimBgTilemapBuffer);
+ SetBgTilemapBuffer(2, gBattleAnimBgTilemapBuffer);
}
else
{
- gBattleScripting.windowsType = 0;
+ gBattleScripting.windowsType = B_WIN_TYPE_NORMAL;
}
InitWindows(gBattleWindowTemplates[gBattleScripting.windowsType]);
diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c
index 8e7bc9a9f..456fd8cee 100644
--- a/src/battle_controller_player.c
+++ b/src/battle_controller_player.c
@@ -251,16 +251,16 @@ static void HandleInputChooseAction(void)
switch (gActionSelectionCursor[gActiveBattler])
{
- case 0:
+ case B_ACTION_USE_MOVE:
BtlController_EmitTwoReturnValues(1, B_ACTION_USE_MOVE, 0);
break;
- case 1:
+ case B_ACTION_USE_ITEM:
BtlController_EmitTwoReturnValues(1, B_ACTION_USE_ITEM, 0);
break;
- case 2:
+ case B_ACTION_SWITCH:
BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
break;
- case 3:
+ case B_ACTION_RUN:
BtlController_EmitTwoReturnValues(1, B_ACTION_RUN, 0);
break;
}
@@ -858,7 +858,7 @@ static void SetLinkBattleEndCallbacks(void)
if (gReceivedRemoteLinkPlayers == 0)
{
m4aSongNumStop(SE_LOW_HEALTH);
- gMain.inBattle = 0;
+ gMain.inBattle = FALSE;
gMain.callback1 = gPreBattleCallback1;
SetMainCallback2(CB2_InitEndLinkBattle);
if (gBattleOutcome == B_OUTCOME_WON)
@@ -871,7 +871,7 @@ static void SetLinkBattleEndCallbacks(void)
if (IsLinkTaskFinished())
{
m4aSongNumStop(SE_LOW_HEALTH);
- gMain.inBattle = 0;
+ gMain.inBattle = FALSE;
gMain.callback1 = gPreBattleCallback1;
SetMainCallback2(CB2_InitEndLinkBattle);
if (gBattleOutcome == B_OUTCOME_WON)
@@ -901,7 +901,7 @@ void SetBattleEndCallbacks(void)
else
{
m4aSongNumStop(SE_LOW_HEALTH);
- gMain.inBattle = 0;
+ gMain.inBattle = FALSE;
gMain.callback1 = gPreBattleCallback1;
SetMainCallback2(gMain.savedCallback);
}
diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c
index da15c07a0..6c4f1473c 100644
--- a/src/battle_gfx_sfx_util.c
+++ b/src/battle_gfx_sfx_util.c
@@ -115,7 +115,7 @@ u16 ChooseMoveAndTargetInBattlePalace(void)
s32 i, var1, var2;
s32 chosenMoveId = -1;
struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBattler][4]);
- u8 unusableMovesBits = CheckMoveLimitations(gActiveBattler, 0, 0xFF);
+ u8 unusableMovesBits = CheckMoveLimitations(gActiveBattler, 0, MOVE_LIMITATIONS_ALL);
s32 percent = Random() % 100;
// Heavy variable re-use here makes this hard to read without defines
@@ -438,9 +438,10 @@ bool8 TryHandleLaunchBattleTableAnimation(u8 activeBattler, u8 atkBattler, u8 de
{
u8 taskId;
- if (tableId == B_ANIM_CASTFORM_CHANGE && (argument & 0x80))
+ if (tableId == B_ANIM_CASTFORM_CHANGE && (argument & CASTFORM_SUBSTITUTE))
{
- gBattleMonForms[activeBattler] = (argument & ~(0x80));
+ // If Castform is behind substitute, set the new form but skip the animation
+ gBattleMonForms[activeBattler] = (argument & ~CASTFORM_SUBSTITUTE);
return TRUE;
}
if (gBattleSpritesDataPtr->battlerData[activeBattler].behindSubstitute
@@ -593,7 +594,7 @@ void BattleLoadOpponentMonSpriteGfx(struct Pokemon *mon, u8 battlerId)
if (species == SPECIES_CASTFORM)
{
paletteOffset = 0x100 + battlerId * 16;
- LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette[0]);
+ LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette[CASTFORM_NORMAL]);
LoadPalette(gBattleStruct->castformPalette[gBattleMonForms[battlerId]], paletteOffset, 0x20);
}
@@ -656,7 +657,7 @@ void BattleLoadPlayerMonSpriteGfx(struct Pokemon *mon, u8 battlerId)
if (species == SPECIES_CASTFORM)
{
paletteOffset = 0x100 + battlerId * 16;
- LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette[0]);
+ LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette[CASTFORM_NORMAL]);
LoadPalette(gBattleStruct->castformPalette[gBattleMonForms[battlerId]], paletteOffset, 0x20);
}
@@ -895,7 +896,7 @@ void CopyBattleSpriteInvisibility(u8 battlerId)
gBattleSpritesDataPtr->battlerData[battlerId].invisible = gSprites[gBattlerSpriteIds[battlerId]].invisible;
}
-void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool8 notTransform)
+void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool8 castform)
{
u16 paletteOffset;
u32 personalityValue;
@@ -903,7 +904,7 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool8 notTransform
u8 position;
const u32 *lzPaletteData;
- if (notTransform)
+ if (castform)
{
StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerAtk]], gBattleSpritesDataPtr->animationData->animArg);
paletteOffset = 0x100 + battlerAtk * 16;
@@ -976,8 +977,8 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool8 notTransform
if (targetSpecies == SPECIES_CASTFORM)
{
gSprites[gBattlerSpriteIds[battlerAtk]].anims = gMonFrontAnimsPtrTable[targetSpecies];
- LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette[0]);
- LoadPalette(gBattleStruct->castformPalette[0] + gBattleMonForms[battlerDef] * 16, paletteOffset, 32);
+ LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette[CASTFORM_NORMAL]);
+ LoadPalette(gBattleStruct->castformPalette[gBattleMonForms[battlerDef]], paletteOffset, 32);
}
BlendPalette(paletteOffset, 16, 6, RGB_WHITE);
diff --git a/src/battle_intro.c b/src/battle_intro.c
index 0ea65dab1..42fe65974 100644
--- a/src/battle_intro.c
+++ b/src/battle_intro.c
@@ -584,36 +584,35 @@ static void BattleIntroSlidePartner(u8 taskId)
}
}
-void sub_8118FBC(int bgId, u8 arg1, u8 arg2, u8 battlerPosition, u8 arg4, u8 *arg5, u16 *arg6, u16 tilesOffset)
+void DrawBattlerOnBg(int bgId, u8 x, u8 y, u8 battlerPosition, u8 paletteId, u8 *tiles, u16 *tilemap, u16 tilesOffset)
{
int i, j;
u8 battler = GetBattlerAtPosition(battlerPosition);
int offset = tilesOffset;
- CpuCopy16(gMonSpritesGfxPtr->sprites.ptr[battlerPosition] + BG_SCREEN_SIZE * gBattleMonForms[battler], arg5, BG_SCREEN_SIZE);
- LoadBgTiles(bgId, arg5, 0x1000, tilesOffset);
- for (i = arg2; i < arg2 + 8; i++)
+ CpuCopy16(gMonSpritesGfxPtr->sprites.ptr[battlerPosition] + BG_SCREEN_SIZE * gBattleMonForms[battler], tiles, BG_SCREEN_SIZE);
+ LoadBgTiles(bgId, tiles, 0x1000, tilesOffset);
+ for (i = y; i < y + 8; i++)
{
- for (j = arg1; j < arg1 + 8; j++)
+ for (j = x; j < x + 8; j++)
{
- arg6[i * 32 + j] = offset | (arg4 << 12);
+ tilemap[i * 32 + j] = offset | (paletteId << 12);
offset++;
}
}
-
- LoadBgTilemap(bgId, arg6, BG_SCREEN_SIZE, 0);
+ LoadBgTilemap(bgId, tilemap, BG_SCREEN_SIZE, 0);
}
-void unref_sub_8119094(u8 arg0, u8 arg1, u8 battlerPosition, u8 arg3, u8 arg4, u16 arg5, u8 arg6, u8 arg7)
+static void DrawBattlerOnBgDMA(u8 x, u8 y, u8 battlerPosition, u8 arg3, u8 paletteId, u16 arg5, u8 arg6, u8 arg7)
{
int i, j, offset;
DmaCopy16(3, gMonSpritesGfxPtr->sprites.ptr[battlerPosition] + BG_SCREEN_SIZE * arg3, (void *)BG_SCREEN_ADDR(0) + arg5, BG_SCREEN_SIZE);
offset = (arg5 >> 5) - (arg7 << 9);
- for (i = arg1; i < arg1 + 8; i++)
+ for (i = y; i < y + 8; i++)
{
- for (j = arg0; j < arg0 + 8; j++)
+ for (j = x; j < x + 8; j++)
{
- *((u16 *)(BG_VRAM) + (i * 32) + (j + (arg6 << 10))) = offset | (arg4 << 12);
+ *((u16 *)(BG_VRAM) + (i * 32) + (j + (arg6 << 10))) = offset | (paletteId << 12);
offset++;
}
}
diff --git a/src/battle_main.c b/src/battle_main.c
index 8481a108a..6ed9f1232 100644
--- a/src/battle_main.c
+++ b/src/battle_main.c
@@ -61,13 +61,9 @@
#include "constants/trainers.h"
#include "cable_club.h"
-extern struct MusicPlayerInfo gMPlayInfo_SE1;
-extern struct MusicPlayerInfo gMPlayInfo_SE2;
-
extern const struct BgTemplate gBattleBgTemplates[];
extern const struct WindowTemplate *const gBattleWindowTemplates[];
-// this file's functions
static void CB2_InitBattleInternal(void);
static void CB2_PreInitMultiBattle(void);
static void CB2_PreInitIngamePlayerPartnerBattle(void);
@@ -77,19 +73,18 @@ static void CB2_HandleStartBattle(void);
static void TryCorrectShedinjaLanguage(struct Pokemon *mon);
static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 firstTrainer);
static void BattleMainCB1(void);
-static void sub_8038538(struct Sprite *sprite);
static void CB2_EndLinkBattle(void);
static void EndLinkBattleInSteps(void);
-static void sub_80392A8(void);
-static void sub_803937C(void);
-static void sub_803939C(void);
+static void CB2_InitAskRecordBattle(void);
+static void CB2_AskRecordBattle(void);
+static void AskRecordBattle(void);
static void SpriteCb_MoveWildMonToRight(struct Sprite *sprite);
static void SpriteCb_WildMonShowHealthbox(struct Sprite *sprite);
static void SpriteCb_WildMonAnimate(struct Sprite *sprite);
-static void sub_80398D0(struct Sprite *sprite);
+static void SpriteCB_Flicker(struct Sprite *sprite);
static void SpriteCB_AnimFaintOpponent(struct Sprite *sprite);
static void SpriteCb_BlinkVisible(struct Sprite *sprite);
-static void SpriteCallbackDummy_3(struct Sprite *sprite);
+static void SpriteCB_Idle(struct Sprite *sprite);
static void SpriteCB_BattleSpriteSlideLeft(struct Sprite *sprite);
static void TurnValuesCleanUp(bool8 var0);
static void SpriteCB_BounceEffect(struct Sprite *sprite);
@@ -123,8 +118,9 @@ static void HandleEndTurn_BattleLost(void);
static void HandleEndTurn_RanFromBattle(void);
static void HandleEndTurn_MonFled(void);
static void HandleEndTurn_FinishBattle(void);
+static void SpriteCB_UnusedBattleInit(struct Sprite* sprite);
+static void SpriteCB_UnusedBattleInit_Main(struct Sprite *sprite);
-// EWRAM vars
EWRAM_DATA u16 gBattle_BG0_X = 0;
EWRAM_DATA u16 gBattle_BG0_Y = 0;
EWRAM_DATA u16 gBattle_BG1_X = 0;
@@ -141,14 +137,19 @@ 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};
-EWRAM_DATA static u32 sUnusedUnknownArray[25] = {0};
+// The below array is never intentionally used. However, Juan's
+// defeat text (SootopolisCity_Gym_1F_Text_JuanDefeat) is too long
+// for gDisplayedStringBattle and overflows into this array. If it
+// is removed (and none of the buffers above are increased in size)
+// it will instead overflow into useful data.
+EWRAM_DATA static u32 sFlickerArray[25] = {0};
EWRAM_DATA u32 gBattleTypeFlags = 0;
EWRAM_DATA u8 gBattleTerrain = 0;
EWRAM_DATA u32 gUnusedFirstBattleVar1 = 0; // Never read
-EWRAM_DATA struct UnknownPokemonStruct4 gMultiPartnerParty[MULTI_PARTY_SIZE] = {0};
-EWRAM_DATA static struct UnknownPokemonStruct4* sMultiPartnerPartyBuffer = NULL;
-EWRAM_DATA u8 *gUnknown_0202305C = NULL;
-EWRAM_DATA u8 *gUnknown_02023060 = NULL;
+EWRAM_DATA struct MultiPartnerMenuPokemon gMultiPartnerParty[MULTI_PARTY_SIZE] = {0};
+EWRAM_DATA static struct MultiPartnerMenuPokemon* sMultiPartnerPartyBuffer = NULL;
+EWRAM_DATA u8 *gBattleAnimBgTileBuffer = NULL;
+EWRAM_DATA u8 *gBattleAnimBgTilemapBuffer = NULL;
EWRAM_DATA u8 gBattleBufferA[MAX_BATTLERS_COUNT][0x200] = {0};
EWRAM_DATA u8 gBattleBufferB[MAX_BATTLERS_COUNT][0x200] = {0};
EWRAM_DATA u8 gActiveBattler = 0;
@@ -236,7 +237,6 @@ EWRAM_DATA u16 gBattleMovePower = 0;
EWRAM_DATA u16 gMoveToLearn = 0;
EWRAM_DATA u8 gBattleMonForms[MAX_BATTLERS_COUNT] = {0};
-// IWRAM common vars
void (*gPreBattleCallback1)(void);
void (*gBattleMainFunc)(void);
struct BattleResults gBattleResults;
@@ -247,7 +247,6 @@ u8 gMultiUsePlayerCursor;
u8 gNumberOfMovesToChoose;
u8 gBattleControllerData[MAX_BATTLERS_COUNT]; // Used by the battle controllers to store misc sprite/task IDs for each battler
-// rom const data
static const struct ScanlineEffectParams sIntroScanlineParams16Bit =
{
(void *)REG_ADDR_BG3HOFS, SCANLINE_EFFECT_DMACNT_16BIT, 1
@@ -259,7 +258,7 @@ static const struct ScanlineEffectParams sIntroScanlineParams32Bit =
(void *)REG_ADDR_BG3HOFS, SCANLINE_EFFECT_DMACNT_32BIT, 1
};
-const struct SpriteTemplate gUnknown_0831AC88 =
+const struct SpriteTemplate gUnusedBattleInitSprite =
{
.tileTag = 0,
.paletteTag = 0,
@@ -267,7 +266,7 @@ const struct SpriteTemplate gUnknown_0831AC88 =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_8038528,
+ .callback = SpriteCB_UnusedBattleInit,
};
static const u8 sText_ShedinjaJpnName[] = _("ヌケニン"); // Nukenin
@@ -512,53 +511,53 @@ const struct TrainerMoney gTrainerMoneyTable[] =
{TRAINER_CLASS_HIKER, 10},
{TRAINER_CLASS_YOUNG_COUPLE, 8},
{TRAINER_CLASS_WINSTRATE, 10},
- {0xFF, 5},
+ {0xFF, 5}, // Any trainer class not listed above uses this
};
#include "data/text/abilities.h"
static void (* const sTurnActionsFuncsTable[])(void) =
{
- [B_ACTION_USE_MOVE] = HandleAction_UseMove,
- [B_ACTION_USE_ITEM] = HandleAction_UseItem,
- [B_ACTION_SWITCH] = HandleAction_Switch,
- [B_ACTION_RUN] = HandleAction_Run,
+ [B_ACTION_USE_MOVE] = HandleAction_UseMove,
+ [B_ACTION_USE_ITEM] = HandleAction_UseItem,
+ [B_ACTION_SWITCH] = HandleAction_Switch,
+ [B_ACTION_RUN] = HandleAction_Run,
[B_ACTION_SAFARI_WATCH_CAREFULLY] = HandleAction_WatchesCarefully,
- [B_ACTION_SAFARI_BALL] = HandleAction_SafariZoneBallThrow,
- [B_ACTION_SAFARI_POKEBLOCK] = HandleAction_ThrowPokeblock,
- [B_ACTION_SAFARI_GO_NEAR] = HandleAction_GoNear,
- [B_ACTION_SAFARI_RUN] = HandleAction_SafariZoneRun,
- [B_ACTION_WALLY_THROW] = HandleAction_WallyBallThrow,
- [B_ACTION_EXEC_SCRIPT] = HandleAction_RunBattleScript,
- [B_ACTION_TRY_FINISH] = HandleAction_TryFinish,
- [B_ACTION_FINISHED] = HandleAction_ActionFinished,
- [B_ACTION_NOTHING_FAINTED] = HandleAction_NothingIsFainted,
+ [B_ACTION_SAFARI_BALL] = HandleAction_SafariZoneBallThrow,
+ [B_ACTION_SAFARI_POKEBLOCK] = HandleAction_ThrowPokeblock,
+ [B_ACTION_SAFARI_GO_NEAR] = HandleAction_GoNear,
+ [B_ACTION_SAFARI_RUN] = HandleAction_SafariZoneRun,
+ [B_ACTION_WALLY_THROW] = HandleAction_WallyBallThrow,
+ [B_ACTION_EXEC_SCRIPT] = HandleAction_RunBattleScript,
+ [B_ACTION_TRY_FINISH] = HandleAction_TryFinish,
+ [B_ACTION_FINISHED] = HandleAction_ActionFinished,
+ [B_ACTION_NOTHING_FAINTED] = HandleAction_NothingIsFainted,
};
static void (* const sEndTurnFuncsTable[])(void) =
{
- [0] = HandleEndTurn_ContinueBattle, //B_OUTCOME_NONE?
- [B_OUTCOME_WON] = HandleEndTurn_BattleWon,
- [B_OUTCOME_LOST] = HandleEndTurn_BattleLost,
- [B_OUTCOME_DREW] = HandleEndTurn_BattleLost,
- [B_OUTCOME_RAN] = HandleEndTurn_RanFromBattle,
+ [0] = HandleEndTurn_ContinueBattle,
+ [B_OUTCOME_WON] = HandleEndTurn_BattleWon,
+ [B_OUTCOME_LOST] = HandleEndTurn_BattleLost,
+ [B_OUTCOME_DREW] = HandleEndTurn_BattleLost,
+ [B_OUTCOME_RAN] = HandleEndTurn_RanFromBattle,
[B_OUTCOME_PLAYER_TELEPORTED] = HandleEndTurn_FinishBattle,
- [B_OUTCOME_MON_FLED] = HandleEndTurn_MonFled,
- [B_OUTCOME_CAUGHT] = HandleEndTurn_FinishBattle,
- [B_OUTCOME_NO_SAFARI_BALLS] = HandleEndTurn_FinishBattle,
- [B_OUTCOME_FORFEITED] = HandleEndTurn_FinishBattle,
- [B_OUTCOME_MON_TELEPORTED] = HandleEndTurn_FinishBattle,
+ [B_OUTCOME_MON_FLED] = HandleEndTurn_MonFled,
+ [B_OUTCOME_CAUGHT] = HandleEndTurn_FinishBattle,
+ [B_OUTCOME_NO_SAFARI_BALLS] = HandleEndTurn_FinishBattle,
+ [B_OUTCOME_FORFEITED] = HandleEndTurn_FinishBattle,
+ [B_OUTCOME_MON_TELEPORTED] = HandleEndTurn_FinishBattle,
};
-const u8 gStatusConditionString_PoisonJpn[8] = _("どく$$$$$");
-const u8 gStatusConditionString_SleepJpn[8] = _("ねむり$$$$");
-const u8 gStatusConditionString_ParalysisJpn[8] = _("まひ$$$$$");
-const u8 gStatusConditionString_BurnJpn[8] = _("やけど$$$$");
-const u8 gStatusConditionString_IceJpn[8] = _("こおり$$$$");
-const u8 gStatusConditionString_ConfusionJpn[8] = _("こんらん$$$");
-const u8 gStatusConditionString_LoveJpn[8] = _("メロメロ$$$");
+const u8 gStatusConditionString_PoisonJpn[] = _("どく$$$$$");
+const u8 gStatusConditionString_SleepJpn[] = _("ねむり$$$$");
+const u8 gStatusConditionString_ParalysisJpn[] = _("まひ$$$$$");
+const u8 gStatusConditionString_BurnJpn[] = _("やけど$$$$");
+const u8 gStatusConditionString_IceJpn[] = _("こおり$$$$");
+const u8 gStatusConditionString_ConfusionJpn[] = _("こんらん$$$");
+const u8 gStatusConditionString_LoveJpn[] = _("メロメロ$$$");
-const u8 * const gStatusConditionStringsTable[7][2] =
+const u8 * const gStatusConditionStringsTable[][2] =
{
{gStatusConditionString_PoisonJpn, gText_Poison},
{gStatusConditionString_SleepJpn, gText_Sleep},
@@ -569,7 +568,6 @@ const u8 * const gStatusConditionStringsTable[7][2] =
{gStatusConditionString_LoveJpn, gText_Love}
};
-// code
void CB2_InitBattle(void)
{
MoveSaveBlocks_ResetHeap();
@@ -1022,8 +1020,10 @@ static void CB2_HandleStartBattle(void)
}
break;
case 3:
+ // Link battle, send/receive party Pokémon 2 at a time
if (IsLinkTaskFinished())
{
+ // Send Pokémon 1-2
SendBlock(bitmask_all_link_players_but_self(), gPlayerParty, sizeof(struct Pokemon) * 2);
gBattleCommunication[MULTIUSE_STATE]++;
}
@@ -1031,6 +1031,7 @@ static void CB2_HandleStartBattle(void)
case 4:
if ((GetBlockReceivedStatus() & 3) == 3)
{
+ // Recv Pokémon 1-2
ResetBlockReceivedFlags();
memcpy(gEnemyParty, gBlockRecvBuffer[enemyMultiplayerId], sizeof(struct Pokemon) * 2);
gBattleCommunication[MULTIUSE_STATE]++;
@@ -1039,30 +1040,35 @@ static void CB2_HandleStartBattle(void)
case 7:
if (IsLinkTaskFinished())
{
- SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 2, sizeof(struct Pokemon) * 2);
+ // Send Pokémon 3-4
+ SendBlock(bitmask_all_link_players_but_self(), &gPlayerParty[2], sizeof(struct Pokemon) * 2);
gBattleCommunication[MULTIUSE_STATE]++;
}
break;
case 8:
if ((GetBlockReceivedStatus() & 3) == 3)
{
+ // Recv Pokémon 3-4
ResetBlockReceivedFlags();
- memcpy(gEnemyParty + 2, gBlockRecvBuffer[enemyMultiplayerId], sizeof(struct Pokemon) * 2);
+ memcpy(&gEnemyParty[2], gBlockRecvBuffer[enemyMultiplayerId], sizeof(struct Pokemon) * 2);
gBattleCommunication[MULTIUSE_STATE]++;
}
break;
case 11:
if (IsLinkTaskFinished())
{
- SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 4, sizeof(struct Pokemon) * 2);
+ // Send Pokémon 5-6
+ SendBlock(bitmask_all_link_players_but_self(), &gPlayerParty[4], sizeof(struct Pokemon) * 2);
gBattleCommunication[MULTIUSE_STATE]++;
}
break;
case 12:
if ((GetBlockReceivedStatus() & 3) == 3)
{
+ // Recv Pokémon 5-6
ResetBlockReceivedFlags();
- memcpy(gEnemyParty + 4, gBlockRecvBuffer[enemyMultiplayerId], sizeof(struct Pokemon) * 2);
+ memcpy(&gEnemyParty[4], gBlockRecvBuffer[enemyMultiplayerId], sizeof(struct Pokemon) * 2);
+
TryCorrectShedinjaLanguage(&gEnemyParty[0]);
TryCorrectShedinjaLanguage(&gEnemyParty[1]);
TryCorrectShedinjaLanguage(&gEnemyParty[2]);
@@ -1074,13 +1080,15 @@ static void CB2_HandleStartBattle(void)
break;
case 15:
InitBattleControllers();
- sub_8184E58();
+ RecordedBattle_SetTrainerInfo();
gBattleCommunication[SPRITES_INIT_STATE1] = 0;
gBattleCommunication[SPRITES_INIT_STATE2] = 0;
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
+ // Check if both players are using Emerald
+ // to determine if the recorded battle rng
+ // seed needs to be sent
s32 i;
-
for (i = 0; i < 2 && (gLinkPlayers[i].version & 0xFF) == VERSION_EMERALD; i++);
if (i == 2)
@@ -1094,6 +1102,7 @@ static void CB2_HandleStartBattle(void)
}
break;
case 16:
+ // Both players are using Emerald, send rng seed for recorded battle
if (IsLinkTaskFinished())
{
SendBlock(bitmask_all_link_players_but_self(), &gRecordedBattleRngSeed, sizeof(gRecordedBattleRngSeed));
@@ -1101,6 +1110,7 @@ static void CB2_HandleStartBattle(void)
}
break;
case 17:
+ // Receive rng seed for recorded battle (only read it if partner is the link master)
if ((GetBlockReceivedStatus() & 3) == 3)
{
ResetBlockReceivedFlags();
@@ -1110,17 +1120,17 @@ static void CB2_HandleStartBattle(void)
}
break;
case 18:
+ // Finish, start battle
if (BattleInitAllSprites(&gBattleCommunication[SPRITES_INIT_STATE1], &gBattleCommunication[SPRITES_INIT_STATE2]))
{
gPreBattleCallback1 = gMain.callback1;
gMain.callback1 = BattleMainCB1;
SetMainCallback2(BattleMainCB2);
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
- {
gBattleTypeFlags |= BATTLE_TYPE_LINK_IN_BATTLE;
- }
}
break;
+ // Introduce short delays between sending party Pokémon for link
case 5:
case 9:
case 13:
@@ -1138,7 +1148,7 @@ static void CB2_HandleStartBattle(void)
static void CB2_HandleStartMultiPartnerBattle(void)
{
u8 playerMultiplayerId;
- u8 enemyMultiplayerId;
+ u8 partnerMultiplayerId;
RunTasks();
AnimateSprites();
@@ -1146,7 +1156,7 @@ static void CB2_HandleStartMultiPartnerBattle(void)
playerMultiplayerId = GetMultiplayerId();
gBattleScripting.multiplayerId = playerMultiplayerId;
- enemyMultiplayerId = playerMultiplayerId ^ BIT_SIDE;
+ partnerMultiplayerId = playerMultiplayerId ^ BIT_SIDE;
switch (gBattleCommunication[MULTIUSE_STATE])
{
@@ -1222,8 +1232,10 @@ static void CB2_HandleStartMultiPartnerBattle(void)
}
break;
case 3:
+ // Link battle, send/receive party Pokémon in groups
if (IsLinkTaskFinished())
{
+ // Send Pokémon 1-2
SendBlock(bitmask_all_link_players_but_self(), gPlayerParty, sizeof(struct Pokemon) * 2);
gBattleCommunication[MULTIUSE_STATE]++;
}
@@ -1231,16 +1243,17 @@ static void CB2_HandleStartMultiPartnerBattle(void)
case 4:
if ((GetBlockReceivedStatus() & 3) == 3)
{
+ // Recv partner's Pokémon 1-2, and copy partner's and own Pokémon into party positions
ResetBlockReceivedFlags();
if (gLinkPlayers[playerMultiplayerId].id != 0)
{
- memcpy(gPlayerParty, gBlockRecvBuffer[enemyMultiplayerId], sizeof(struct Pokemon) * 2);
- memcpy(gPlayerParty + MULTI_PARTY_SIZE, gBlockRecvBuffer[playerMultiplayerId], sizeof(struct Pokemon) * 2);
+ memcpy(gPlayerParty, gBlockRecvBuffer[partnerMultiplayerId], sizeof(struct Pokemon) * 2);
+ memcpy(&gPlayerParty[MULTI_PARTY_SIZE], gBlockRecvBuffer[playerMultiplayerId], sizeof(struct Pokemon) * 2);
}
else
{
memcpy(gPlayerParty, gBlockRecvBuffer[playerMultiplayerId], sizeof(struct Pokemon) * 2);
- memcpy(gPlayerParty + MULTI_PARTY_SIZE, gBlockRecvBuffer[enemyMultiplayerId], sizeof(struct Pokemon) * 2);
+ memcpy(&gPlayerParty[MULTI_PARTY_SIZE], gBlockRecvBuffer[partnerMultiplayerId], sizeof(struct Pokemon) * 2);
}
gBattleCommunication[MULTIUSE_STATE]++;
}
@@ -1248,23 +1261,25 @@ static void CB2_HandleStartMultiPartnerBattle(void)
case 5:
if (IsLinkTaskFinished())
{
- SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 2, sizeof(struct Pokemon));
+ // Send Pokémon 3
+ SendBlock(bitmask_all_link_players_but_self(), &gPlayerParty[2], sizeof(struct Pokemon));
gBattleCommunication[MULTIUSE_STATE]++;
}
break;
case 6:
if ((GetBlockReceivedStatus() & 3) == 3)
{
+ // Recv partner's Pokémon 3, and copy partner's and own Pokémon into party positions
ResetBlockReceivedFlags();
if (gLinkPlayers[playerMultiplayerId].id != 0)
{
- memcpy(gPlayerParty + 2, gBlockRecvBuffer[enemyMultiplayerId], sizeof(struct Pokemon));
- memcpy(gPlayerParty + 5, gBlockRecvBuffer[playerMultiplayerId], sizeof(struct Pokemon));
+ memcpy(&gPlayerParty[2], gBlockRecvBuffer[partnerMultiplayerId], sizeof(struct Pokemon));
+ memcpy(&gPlayerParty[2 + MULTI_PARTY_SIZE], gBlockRecvBuffer[playerMultiplayerId], sizeof(struct Pokemon));
}
else
{
- memcpy(gPlayerParty + 2, gBlockRecvBuffer[playerMultiplayerId], sizeof(struct Pokemon));
- memcpy(gPlayerParty + 5, gBlockRecvBuffer[enemyMultiplayerId], sizeof(struct Pokemon));
+ memcpy(&gPlayerParty[2], gBlockRecvBuffer[playerMultiplayerId], sizeof(struct Pokemon));
+ memcpy(&gPlayerParty[2 + MULTI_PARTY_SIZE], gBlockRecvBuffer[partnerMultiplayerId], sizeof(struct Pokemon));
}
gBattleCommunication[MULTIUSE_STATE]++;
}
@@ -1272,6 +1287,7 @@ static void CB2_HandleStartMultiPartnerBattle(void)
case 7:
if (IsLinkTaskFinished())
{
+ // Send enemy Pokémon 1-2 to partner
SendBlock(bitmask_all_link_players_but_self(), gEnemyParty, sizeof(struct Pokemon) * 2);
gBattleCommunication[MULTIUSE_STATE]++;
}
@@ -1279,45 +1295,47 @@ static void CB2_HandleStartMultiPartnerBattle(void)
case 8:
if ((GetBlockReceivedStatus() & 3) == 3)
{
+ // Recv enemy Pokémon 1-2 (if not master)
ResetBlockReceivedFlags();
if (GetMultiplayerId() != 0)
- {
memcpy(gEnemyParty, gBlockRecvBuffer[0], sizeof(struct Pokemon) * 2);
- }
gBattleCommunication[MULTIUSE_STATE]++;
}
break;
case 9:
if (IsLinkTaskFinished())
{
- SendBlock(bitmask_all_link_players_but_self(), gEnemyParty + 2, sizeof(struct Pokemon) * 2);
+ // Send enemy Pokémon 3-4 to partner
+ SendBlock(bitmask_all_link_players_but_self(), &gEnemyParty[2], sizeof(struct Pokemon) * 2);
gBattleCommunication[MULTIUSE_STATE]++;
}
break;
case 10:
if ((GetBlockReceivedStatus() & 3) == 3)
{
+ // Recv enemy Pokémon 3-4 (if not master)
ResetBlockReceivedFlags();
if (GetMultiplayerId() != 0)
- {
- memcpy(gEnemyParty + 2, gBlockRecvBuffer[0], sizeof(struct Pokemon) * 2);
- }
+ memcpy(&gEnemyParty[2], gBlockRecvBuffer[0], sizeof(struct Pokemon) * 2);
gBattleCommunication[MULTIUSE_STATE]++;
}
break;
case 11:
if (IsLinkTaskFinished())
{
- SendBlock(bitmask_all_link_players_but_self(), gEnemyParty + 4, sizeof(struct Pokemon) * 2);
+ // Send enemy Pokémon 5-6 to partner
+ SendBlock(bitmask_all_link_players_but_self(), &gEnemyParty[4], sizeof(struct Pokemon) * 2);
gBattleCommunication[MULTIUSE_STATE]++;
}
break;
case 12:
if ((GetBlockReceivedStatus() & 3) == 3)
{
+ // Recv enemy Pokémon 5-6 (if not master)
ResetBlockReceivedFlags();
if (GetMultiplayerId() != 0)
- memcpy(gEnemyParty + 4, gBlockRecvBuffer[0], sizeof(struct Pokemon) * 2);
+ memcpy(&gEnemyParty[4], gBlockRecvBuffer[0], sizeof(struct Pokemon) * 2);
+
TryCorrectShedinjaLanguage(&gPlayerParty[0]);
TryCorrectShedinjaLanguage(&gPlayerParty[1]);
TryCorrectShedinjaLanguage(&gPlayerParty[2]);
@@ -1335,19 +1353,16 @@ static void CB2_HandleStartMultiPartnerBattle(void)
break;
case 13:
InitBattleControllers();
- sub_8184E58();
+ RecordedBattle_SetTrainerInfo();
gBattleCommunication[SPRITES_INIT_STATE1] = 0;
gBattleCommunication[SPRITES_INIT_STATE2] = 0;
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
- {
gBattleCommunication[MULTIUSE_STATE] = 14;
- }
else
- {
gBattleCommunication[MULTIUSE_STATE] = 16;
- }
break;
case 14:
+ // Send rng seed for recorded battle
if (IsLinkTaskFinished())
{
SendBlock(bitmask_all_link_players_but_self(), &gRecordedBattleRngSeed, sizeof(gRecordedBattleRngSeed));
@@ -1355,15 +1370,17 @@ static void CB2_HandleStartMultiPartnerBattle(void)
}
break;
case 15:
+ // Receive rng seed for recorded battle (only read it if partner is the link master)
if ((GetBlockReceivedStatus() & 3) == 3)
{
ResetBlockReceivedFlags();
if (!(gBattleTypeFlags & BATTLE_TYPE_IS_MASTER))
- memcpy(&gRecordedBattleRngSeed, gBlockRecvBuffer[enemyMultiplayerId], sizeof(gRecordedBattleRngSeed));
+ memcpy(&gRecordedBattleRngSeed, gBlockRecvBuffer[partnerMultiplayerId], sizeof(gRecordedBattleRngSeed));
gBattleCommunication[MULTIUSE_STATE]++;
}
break;
case 16:
+ // Finish, start battle
if (BattleInitAllSprites(&gBattleCommunication[SPRITES_INIT_STATE1], &gBattleCommunication[SPRITES_INIT_STATE2]))
{
TrySetLinkBattleTowerEnemyPartyLevel();
@@ -1371,31 +1388,29 @@ static void CB2_HandleStartMultiPartnerBattle(void)
gMain.callback1 = BattleMainCB1;
SetMainCallback2(BattleMainCB2);
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
- {
gBattleTypeFlags |= BATTLE_TYPE_LINK_IN_BATTLE;
- }
}
break;
}
}
-static void sub_80379F8(u8 arrayIdPlus)
+static void SetMultiPartnerMenuParty(u8 offset)
{
s32 i;
- for (i = 0; i < (int)ARRAY_COUNT(gMultiPartnerParty); i++)
- {
- gMultiPartnerParty[i].species = GetMonData(&gPlayerParty[arrayIdPlus + i], MON_DATA_SPECIES);
- gMultiPartnerParty[i].heldItem = GetMonData(&gPlayerParty[arrayIdPlus + i], MON_DATA_HELD_ITEM);
- GetMonData(&gPlayerParty[arrayIdPlus + i], MON_DATA_NICKNAME, gMultiPartnerParty[i].nickname);
- gMultiPartnerParty[i].level = GetMonData(&gPlayerParty[arrayIdPlus + i], MON_DATA_LEVEL);
- gMultiPartnerParty[i].hp = GetMonData(&gPlayerParty[arrayIdPlus + i], MON_DATA_HP);
- gMultiPartnerParty[i].maxhp = GetMonData(&gPlayerParty[arrayIdPlus + i], MON_DATA_MAX_HP);
- gMultiPartnerParty[i].status = GetMonData(&gPlayerParty[arrayIdPlus + i], MON_DATA_STATUS);
- gMultiPartnerParty[i].personality = GetMonData(&gPlayerParty[arrayIdPlus + i], MON_DATA_PERSONALITY);
- gMultiPartnerParty[i].gender = GetMonGender(&gPlayerParty[arrayIdPlus + i]);
+ for (i = 0; i < MULTI_PARTY_SIZE; i++)
+ {
+ gMultiPartnerParty[i].species = GetMonData(&gPlayerParty[offset + i], MON_DATA_SPECIES);
+ gMultiPartnerParty[i].heldItem = GetMonData(&gPlayerParty[offset + i], MON_DATA_HELD_ITEM);
+ GetMonData(&gPlayerParty[offset + i], MON_DATA_NICKNAME, gMultiPartnerParty[i].nickname);
+ gMultiPartnerParty[i].level = GetMonData(&gPlayerParty[offset + i], MON_DATA_LEVEL);
+ gMultiPartnerParty[i].hp = GetMonData(&gPlayerParty[offset + i], MON_DATA_HP);
+ gMultiPartnerParty[i].maxhp = GetMonData(&gPlayerParty[offset + i], MON_DATA_MAX_HP);
+ gMultiPartnerParty[i].status = GetMonData(&gPlayerParty[offset + i], MON_DATA_STATUS);
+ gMultiPartnerParty[i].personality = GetMonData(&gPlayerParty[offset + i], MON_DATA_PERSONALITY);
+ gMultiPartnerParty[i].gender = GetMonGender(&gPlayerParty[offset + i]);
StripExtCtrlCodes(gMultiPartnerParty[i].nickname);
- if (GetMonData(&gPlayerParty[arrayIdPlus + i], MON_DATA_LANGUAGE) != LANGUAGE_JAPANESE)
+ if (GetMonData(&gPlayerParty[offset + i], MON_DATA_LANGUAGE) != LANGUAGE_JAPANESE)
PadNameString(gMultiPartnerParty[i].nickname, CHAR_SPACE);
}
memcpy(sMultiPartnerPartyBuffer, gMultiPartnerParty, sizeof(gMultiPartnerParty));
@@ -1405,15 +1420,15 @@ static void CB2_PreInitMultiBattle(void)
{
s32 i;
u8 playerMultiplierId;
- s32 numPlayers = 4;
- u8 r4 = 0xF;
+ s32 numPlayers = MAX_BATTLERS_COUNT;
+ u8 blockMask = 0xF;
u32 *savedBattleTypeFlags;
void (**savedCallback)(void);
if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER)
{
numPlayers = 2;
- r4 = 3;
+ blockMask = 3;
}
playerMultiplierId = GetMultiplayerId();
@@ -1430,14 +1445,14 @@ static void CB2_PreInitMultiBattle(void)
case 0:
if (gReceivedRemoteLinkPlayers != 0 && IsLinkTaskFinished())
{
- sMultiPartnerPartyBuffer = Alloc(sizeof(struct UnknownPokemonStruct4) * ARRAY_COUNT(gMultiPartnerParty));
- sub_80379F8(0);
- SendBlock(bitmask_all_link_players_but_self(), sMultiPartnerPartyBuffer, sizeof(struct UnknownPokemonStruct4) * ARRAY_COUNT(gMultiPartnerParty));
+ sMultiPartnerPartyBuffer = Alloc(sizeof(gMultiPartnerParty));
+ SetMultiPartnerMenuParty(0);
+ SendBlock(bitmask_all_link_players_but_self(), sMultiPartnerPartyBuffer, sizeof(gMultiPartnerParty));
gBattleCommunication[MULTIUSE_STATE]++;
}
break;
case 1:
- if ((GetBlockReceivedStatus() & r4) == r4)
+ if ((GetBlockReceivedStatus() & blockMask) == blockMask)
{
ResetBlockReceivedFlags();
for (i = 0; i < numPlayers; i++)
@@ -1450,12 +1465,12 @@ static void CB2_PreInitMultiBattle(void)
if ((!(gLinkPlayers[i].id & 1) && !(gLinkPlayers[playerMultiplierId].id & 1))
|| (gLinkPlayers[i].id & 1 && gLinkPlayers[playerMultiplierId].id & 1))
{
- memcpy(gMultiPartnerParty, gBlockRecvBuffer[i], sizeof(struct UnknownPokemonStruct4) * ARRAY_COUNT(gMultiPartnerParty));
+ memcpy(gMultiPartnerParty, gBlockRecvBuffer[i], sizeof(gMultiPartnerParty));
}
}
else
{
- memcpy(gMultiPartnerParty, gBlockRecvBuffer[i], sizeof(struct UnknownPokemonStruct4) * ARRAY_COUNT(gMultiPartnerParty));
+ memcpy(gMultiPartnerParty, gBlockRecvBuffer[i], sizeof(gMultiPartnerParty));
}
}
gBattleCommunication[MULTIUSE_STATE]++;
@@ -1514,8 +1529,8 @@ static void CB2_PreInitIngamePlayerPartnerBattle(void)
switch (gBattleCommunication[MULTIUSE_STATE])
{
case 0:
- sMultiPartnerPartyBuffer = Alloc(sizeof(struct UnknownPokemonStruct4) * ARRAY_COUNT(gMultiPartnerParty));
- sub_80379F8(3);
+ sMultiPartnerPartyBuffer = Alloc(sizeof(gMultiPartnerParty));
+ SetMultiPartnerMenuParty(MULTI_PARTY_SIZE);
gBattleCommunication[MULTIUSE_STATE]++;
*savedCallback = gMain.savedCallback;
*savedBattleTypeFlags = gBattleTypeFlags;
@@ -1773,7 +1788,7 @@ static void CB2_HandleStartMultiBattle(void)
break;
case 7:
InitBattleControllers();
- sub_8184E58();
+ RecordedBattle_SetTrainerInfo();
gBattleCommunication[SPRITES_INIT_STATE1] = 0;
gBattleCommunication[SPRITES_INIT_STATE2] = 0;
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
@@ -1841,11 +1856,12 @@ void BattleMainCB2(void)
UpdatePaletteFade();
RunTasks();
- if (JOY_HELD(B_BUTTON) && gBattleTypeFlags & BATTLE_TYPE_RECORDED && sub_8186450())
+ if (JOY_HELD(B_BUTTON) && gBattleTypeFlags & BATTLE_TYPE_RECORDED && RecordedBattle_CanStopPlayback())
{
+ // Player pressed B during recorded battle playback, end battle
gSpecialVar_Result = gBattleOutcome = B_OUTCOME_PLAYER_TELEPORTED;
ResetPaletteFadeControl();
- BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);
+ BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);
SetMainCallback2(CB2_QuitRecordedBattle);
}
}
@@ -1854,7 +1870,7 @@ static void FreeRestoreBattleData(void)
{
gMain.callback1 = gPreBattleCallback1;
gScanlineEffect.state = 3;
- gMain.inBattle = 0;
+ gMain.inBattle = FALSE;
ZeroEnemyPartyMons();
m4aSongNumStop(SE_LOW_HEALTH);
FreeMonSpritesGfx();
@@ -1875,34 +1891,37 @@ void CB2_QuitRecordedBattle(void)
}
}
-void sub_8038528(struct Sprite* sprite)
+#define sState data[0]
+#define sDelay data[4]
+
+static void SpriteCB_UnusedBattleInit(struct Sprite* sprite)
{
- sprite->data[0] = 0;
- sprite->callback = sub_8038538;
+ sprite->sState = 0;
+ sprite->callback = SpriteCB_UnusedBattleInit_Main;
}
-static void sub_8038538(struct Sprite *sprite)
+static void SpriteCB_UnusedBattleInit_Main(struct Sprite *sprite)
{
- u16 *arr = (u16*)(gDecompressionBuffer);
+ u16 *arr = (u16*)gDecompressionBuffer;
- switch (sprite->data[0])
+ switch (sprite->sState)
{
case 0:
- sprite->data[0]++;
+ sprite->sState++;
sprite->data[1] = 0;
sprite->data[2] = 0x281;
sprite->data[3] = 0;
- sprite->data[4] = 1;
+ sprite->sDelay = 1;
// fall through
case 1:
- sprite->data[4]--;
- if (sprite->data[4] == 0)
+ sprite->sDelay--;
+ if (sprite->sDelay == 0)
{
s32 i;
s32 r2;
s32 r0;
- sprite->data[4] = 2;
+ sprite->sDelay = 2;
r2 = sprite->data[1] + sprite->data[3] * 32;
r0 = sprite->data[2] - sprite->data[3] * 32;
for (i = 0; i < 29; i += 2)
@@ -1913,7 +1932,7 @@ static void sub_8038538(struct Sprite *sprite)
sprite->data[3]++;
if (sprite->data[3] == 21)
{
- sprite->data[0]++;
+ sprite->sState++;
sprite->data[1] = 32;
}
}
@@ -1946,8 +1965,8 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir
if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)
{
- if (gTrainers[trainerNum].partySize > 3)
- monsCount = 3;
+ if (gTrainers[trainerNum].partySize > PARTY_SIZE / 2)
+ monsCount = PARTY_SIZE / 2;
else
monsCount = gTrainers[trainerNum].partySize;
}
@@ -2044,9 +2063,9 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir
return gTrainers[trainerNum].partySize;
}
-void sub_8038A04(void) // unused
+static void sub_8038A04(void) // unused
{
- if (REG_VCOUNT < 0xA0 && REG_VCOUNT >= 0x6F)
+ if (REG_VCOUNT < DISPLAY_HEIGHT && REG_VCOUNT >= 111)
SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_SCREENBASE(24) | BGCNT_TXT256x512);
}
@@ -2246,33 +2265,35 @@ static void EndLinkBattleInSteps(void)
case 1:
if (--gBattleCommunication[1] == 0)
{
- BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);
+ BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);
gBattleCommunication[MULTIUSE_STATE]++;
}
break;
case 2:
if (!gPaletteFade.active)
{
- u8 monsCount;
+ u8 battlerCount;
gMain.anyLinkBattlerHasFrontierPass = RecordedBattle_GetFrontierPassFlag();
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
- monsCount = 4;
+ battlerCount = 4;
else
- monsCount = 2;
+ battlerCount = 2;
- for (i = 0; i < monsCount && (gLinkPlayers[i].version & 0xFF) == VERSION_EMERALD; i++);
+ for (i = 0; i < battlerCount && (gLinkPlayers[i].version & 0xFF) == VERSION_EMERALD; i++);
- if (!gSaveBlock2Ptr->frontier.disableRecordBattle && i == monsCount)
+ if (!gSaveBlock2Ptr->frontier.disableRecordBattle && i == battlerCount)
{
if (FlagGet(FLAG_SYS_FRONTIER_PASS))
{
+ // Ask player if they want to record the battle
FreeAllWindowBuffers();
- SetMainCallback2(sub_80392A8);
+ SetMainCallback2(CB2_InitAskRecordBattle);
}
else if (!gMain.anyLinkBattlerHasFrontierPass)
{
+ // No players can record this battle, end
SetMainCallback2(gMain.savedCallback);
FreeBattleResources();
FreeBattleSpritesData();
@@ -2280,6 +2301,8 @@ static void EndLinkBattleInSteps(void)
}
else if (gReceivedRemoteLinkPlayers == 0)
{
+ // Player can't record battle but
+ // another player can, reconnect with them
CreateTask(Task_ReconnectWithLinkPlayers, 5);
gBattleCommunication[MULTIUSE_STATE]++;
}
@@ -2298,12 +2321,12 @@ static void EndLinkBattleInSteps(void)
}
break;
case 3:
- CpuFill32(0, (void*)(VRAM), VRAM_SIZE);
+ CpuFill32(0, (void*)VRAM, VRAM_SIZE);
for (i = 0; i < 2; i++)
LoadChosenBattleElement(i);
- BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK);
+ BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);
gBattleCommunication[MULTIUSE_STATE]++;
break;
case 4:
@@ -2337,7 +2360,7 @@ static void EndLinkBattleInSteps(void)
case 9:
if (!gMain.anyLinkBattlerHasFrontierPass || gWirelessCommType || gReceivedRemoteLinkPlayers != 1)
{
- gMain.anyLinkBattlerHasFrontierPass = 0;
+ gMain.anyLinkBattlerHasFrontierPass = FALSE;
SetMainCallback2(gMain.savedCallback);
FreeBattleResources();
FreeBattleSpritesData();
@@ -2379,7 +2402,7 @@ u32 GetBattleBgTemplateData(u8 arrayId, u8 caseId)
return ret;
}
-static void sub_80392A8(void)
+static void CB2_InitAskRecordBattle(void)
{
s32 i;
@@ -2407,14 +2430,14 @@ static void sub_80392A8(void)
FreeAllSpritePalettes();
gReservedSpritePaletteCount = 4;
SetVBlankCallback(VBlankCB_Battle);
- SetMainCallback2(sub_803937C);
+ SetMainCallback2(CB2_AskRecordBattle);
BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK);
gBattleCommunication[MULTIUSE_STATE] = 0;
}
-static void sub_803937C(void)
+static void CB2_AskRecordBattle(void)
{
- sub_803939C();
+ AskRecordBattle();
AnimateSprites();
BuildOamBuffer();
RunTextPrinters();
@@ -2422,33 +2445,50 @@ static void sub_803937C(void)
RunTasks();
}
-static void sub_803939C(void)
+
+// States for AskRecordBattle
+#define STATE_INIT 0
+#define STATE_LINK 1
+#define STATE_WAIT_LINK 2
+#define STATE_ASK_RECORD 3
+#define STATE_PRINT_YES_NO 4
+#define STATE_HANDLE_YES_NO 5
+#define STATE_RECORD_NO 6
+#define STATE_END_RECORD_NO 7
+#define STATE_WAIT_END 8
+#define STATE_END 9
+#define STATE_RECORD_YES 10
+#define STATE_RECORD_WAIT 11
+#define STATE_END_RECORD_YES 12
+
+static void AskRecordBattle(void)
{
switch (gBattleCommunication[MULTIUSE_STATE])
{
- case 0:
+ case STATE_INIT:
ShowBg(0);
ShowBg(1);
ShowBg(2);
gBattleCommunication[MULTIUSE_STATE]++;
break;
- case 1:
+ case STATE_LINK:
if (gMain.anyLinkBattlerHasFrontierPass && gReceivedRemoteLinkPlayers == 0)
CreateTask(Task_ReconnectWithLinkPlayers, 5);
gBattleCommunication[MULTIUSE_STATE]++;
break;
- case 2:
+ case STATE_WAIT_LINK:
if (!FuncIsActiveTask(Task_ReconnectWithLinkPlayers))
gBattleCommunication[MULTIUSE_STATE]++;
break;
- case 3:
+ case STATE_ASK_RECORD:
if (!gPaletteFade.active)
{
+ // "Would you like to record your battle on your FRONTIER PASS?"
BattlePutTextOnWindow(gText_RecordBattleToPass, 0);
gBattleCommunication[MULTIUSE_STATE]++;
}
break;
- case 4:
+ case STATE_PRINT_YES_NO:
if (!IsTextPrinterActive(0))
{
HandleBattleWindow(0x18, 8, 0x1D, 0xD, 0);
@@ -2458,11 +2498,12 @@ static void sub_803939C(void)
gBattleCommunication[MULTIUSE_STATE]++;
}
break;
- case 5:
+ case STATE_HANDLE_YES_NO:
if (JOY_NEW(DPAD_UP))
{
if (gBattleCommunication[CURSOR_POSITION] != 0)
{
+ // Moved cursor onto Yes
PlaySE(SE_SELECT);
BattleDestroyYesNoCursorAt(gBattleCommunication[CURSOR_POSITION]);
gBattleCommunication[CURSOR_POSITION] = 0;
@@ -2473,6 +2514,7 @@ static void sub_803939C(void)
{
if (gBattleCommunication[CURSOR_POSITION] == 0)
{
+ // Moved cursor onto No
PlaySE(SE_SELECT);
BattleDestroyYesNoCursorAt(gBattleCommunication[CURSOR_POSITION]);
gBattleCommunication[CURSOR_POSITION] = 1;
@@ -2484,12 +2526,14 @@ static void sub_803939C(void)
PlaySE(SE_SELECT);
if (gBattleCommunication[CURSOR_POSITION] == 0)
{
+ // Selected Yes
HandleBattleWindow(0x18, 8, 0x1D, 0xD, WINDOW_CLEAR);
gBattleCommunication[1] = MoveRecordedBattleToSaveData();
- gBattleCommunication[MULTIUSE_STATE] = 10;
+ gBattleCommunication[MULTIUSE_STATE] = STATE_RECORD_YES;
}
else
{
+ // Selected No
gBattleCommunication[MULTIUSE_STATE]++;
}
}
@@ -2499,19 +2543,20 @@ static void sub_803939C(void)
gBattleCommunication[MULTIUSE_STATE]++;
}
break;
- case 6:
+ case STATE_RECORD_NO:
if (IsLinkTaskFinished() == TRUE)
{
HandleBattleWindow(0x18, 8, 0x1D, 0xD, WINDOW_CLEAR);
if (gMain.anyLinkBattlerHasFrontierPass)
{
+ // Other battlers may be recording, wait for them
SetLinkStandbyCallback();
BattlePutTextOnWindow(gText_LinkStandby3, 0);
}
- gBattleCommunication[MULTIUSE_STATE]++;
+ gBattleCommunication[MULTIUSE_STATE]++; // STATE_END_RECORD_NO
}
break;
- case 8:
+ case STATE_WAIT_END:
if (--gBattleCommunication[1] == 0)
{
if (gMain.anyLinkBattlerHasFrontierPass && !gWirelessCommType)
@@ -2519,10 +2564,10 @@ static void sub_803939C(void)
gBattleCommunication[MULTIUSE_STATE]++;
}
break;
- case 9:
+ case STATE_END:
if (!gMain.anyLinkBattlerHasFrontierPass || gWirelessCommType || gReceivedRemoteLinkPlayers != 1)
{
- gMain.anyLinkBattlerHasFrontierPass = 0;
+ gMain.anyLinkBattlerHasFrontierPass = FALSE;
if (!gPaletteFade.active)
{
SetMainCallback2(gMain.savedCallback);
@@ -2532,24 +2577,24 @@ static void sub_803939C(void)
}
}
break;
- case 10:
+ case STATE_RECORD_YES:
if (gBattleCommunication[1] == 1)
{
PlaySE(SE_SAVE);
BattleStringExpandPlaceholdersToDisplayedString(gText_BattleRecordedOnPass);
BattlePutTextOnWindow(gDisplayedStringBattle, 0);
- gBattleCommunication[1] = 0x80;
+ gBattleCommunication[1] = 128; // Delay
gBattleCommunication[MULTIUSE_STATE]++;
}
else
{
BattleStringExpandPlaceholdersToDisplayedString(BattleFrontier_BattleTowerBattleRoom_Text_RecordCouldntBeSaved);
BattlePutTextOnWindow(gDisplayedStringBattle, 0);
- gBattleCommunication[1] = 0x80;
+ gBattleCommunication[1] = 128; // Delay
gBattleCommunication[MULTIUSE_STATE]++;
}
break;
- case 11:
+ case STATE_RECORD_WAIT:
if (IsLinkTaskFinished() == TRUE && !IsTextPrinterActive(0) && --gBattleCommunication[1] == 0)
{
if (gMain.anyLinkBattlerHasFrontierPass)
@@ -2560,25 +2605,25 @@ static void sub_803939C(void)
gBattleCommunication[MULTIUSE_STATE]++;
}
break;
- case 12:
- case 7:
+ case STATE_END_RECORD_YES:
+ case STATE_END_RECORD_NO:
if (!IsTextPrinterActive(0))
{
if (gMain.anyLinkBattlerHasFrontierPass)
{
if (IsLinkTaskFinished() == TRUE)
{
- BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);
- gBattleCommunication[1] = 0x20;
- gBattleCommunication[MULTIUSE_STATE] = 8;
+ BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);
+ gBattleCommunication[1] = 32; // Delay
+ gBattleCommunication[MULTIUSE_STATE] = STATE_WAIT_END;
}
}
else
{
- BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);
- gBattleCommunication[1] = 0x20;
- gBattleCommunication[MULTIUSE_STATE] = 8;
+ BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);
+ gBattleCommunication[1] = 32; // Delay
+ gBattleCommunication[MULTIUSE_STATE] = STATE_WAIT_END;
}
}
break;
@@ -2599,9 +2644,9 @@ static void TryCorrectShedinjaLanguage(struct Pokemon *mon)
}
}
-u32 GetBattleWindowTemplatePixelWidth(u32 setId, u32 tableId)
+u32 GetBattleWindowTemplatePixelWidth(u32 windowsType, u32 tableId)
{
- return gBattleWindowTemplates[setId][tableId].width * 8;
+ return gBattleWindowTemplates[windowsType][tableId].width * 8;
}
#define sBattler data[0]
@@ -2651,31 +2696,37 @@ void SpriteCallbackDummy_2(struct Sprite *sprite)
}
+#define sNumFlickers data[3]
+#define sDelay data[4]
+
// Unused
-static void sub_80398BC(struct Sprite *sprite)
+static void SpriteCB_InitFlicker(struct Sprite *sprite)
{
- sprite->data[3] = 6;
- sprite->data[4] = 1;
- sprite->callback = sub_80398D0;
+ sprite->sNumFlickers = 6;
+ sprite->sDelay = 1;
+ sprite->callback = SpriteCB_Flicker;
}
-static void sub_80398D0(struct Sprite *sprite)
+static void SpriteCB_Flicker(struct Sprite *sprite)
{
- sprite->data[4]--;
- if (sprite->data[4] == 0)
+ sprite->sDelay--;
+ if (sprite->sDelay == 0)
{
- sprite->data[4] = 8;
+ sprite->sDelay = 8;
sprite->invisible ^= 1;
- sprite->data[3]--;
- if (sprite->data[3] == 0)
+ sprite->sNumFlickers--;
+ if (sprite->sNumFlickers == 0)
{
sprite->invisible = FALSE;
sprite->callback = SpriteCallbackDummy_2;
- sUnusedUnknownArray[0] = 0;
+ sFlickerArray[0] = 0;
}
}
}
+#undef sNumFlickers
+#undef sDelay
+
extern const struct MonCoords gMonFrontPicCoords[];
extern const struct MonCoords gCastformFrontSpriteCoords[];
@@ -2772,7 +2823,7 @@ void SpriteCb_HideAsMoveTarget(struct Sprite *sprite)
sprite->callback = SpriteCallbackDummy_2;
}
-void SpriteCb_OpponentMonFromBall(struct Sprite *sprite)
+void SpriteCB_OpponentMonFromBall(struct Sprite *sprite)
{
if (sprite->affineAnimEnded)
{
@@ -2798,19 +2849,19 @@ static void SpriteCB_BattleSpriteSlideLeft(struct Sprite *sprite)
sprite->x2 -= 2;
if (sprite->x2 == 0)
{
- sprite->callback = SpriteCallbackDummy_3;
+ sprite->callback = SpriteCB_Idle;
sprite->data[1] = 0;
}
}
}
// Unused
-static void sub_80105DC(struct Sprite *sprite)
+static void SetIdleSpriteCallback(struct Sprite *sprite)
{
- sprite->callback = SpriteCallbackDummy_3;
+ sprite->callback = SpriteCB_Idle;
}
-static void SpriteCallbackDummy_3(struct Sprite *sprite)
+static void SpriteCB_Idle(struct Sprite *sprite)
{
}
@@ -2923,23 +2974,25 @@ static void SpriteCB_BounceEffect(struct Sprite *sprite)
#undef sBouncerSpriteId
#undef sWhich
-void SpriteCb_PlayerMonFromBall(struct Sprite *sprite)
+void SpriteCB_PlayerMonFromBall(struct Sprite *sprite)
{
if (sprite->affineAnimEnded)
BattleAnimateBackSprite(sprite, sprite->sSpeciesId);
}
-void sub_8039E60(struct Sprite *sprite)
+static void SpriteCB_TrainerThrowObject_Main(struct Sprite *sprite)
{
sub_8039E9C(sprite);
if (sprite->animEnded)
- sprite->callback = SpriteCallbackDummy_3;
+ sprite->callback = SpriteCB_Idle;
}
+// Sprite callback for a trainer back pic to throw an object
+// (Wally throwing a ball, throwing Pokéblocks/balls in the Safari Zone)
void SpriteCB_TrainerThrowObject(struct Sprite *sprite)
{
StartSpriteAnim(sprite, 1);
- sprite->callback = sub_8039E60;
+ sprite->callback = SpriteCB_TrainerThrowObject_Main;
}
void sub_8039E9C(struct Sprite *sprite)
@@ -3235,7 +3288,7 @@ void FaintClearSetData(void)
gProtectStructs[gActiveBattler].confusionSelfDmg = 0;
gProtectStructs[gActiveBattler].targetNotAffected = 0;
gProtectStructs[gActiveBattler].chargingTurn = 0;
- gProtectStructs[gActiveBattler].fleeFlag = 0;
+ gProtectStructs[gActiveBattler].fleeType = 0;
gProtectStructs[gActiveBattler].usedImprisonedMove = 0;
gProtectStructs[gActiveBattler].loveImmobility = 0;
gProtectStructs[gActiveBattler].usedDisabledMove = 0;
@@ -4352,13 +4405,9 @@ static void HandleTurnActionSelectionState(void)
break;
case B_ACTION_SAFARI_POKEBLOCK:
if ((gBattleBufferB[gActiveBattler][1] | (gBattleBufferB[gActiveBattler][2] << 8)) != 0)
- {
gBattleCommunication[gActiveBattler]++;
- }
else
- {
gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN;
- }
break;
case B_ACTION_SAFARI_GO_NEAR:
gBattleCommunication[gActiveBattler]++;
@@ -4984,15 +5033,15 @@ static void HandleEndTurn_RanFromBattle(void)
}
else
{
- switch (gProtectStructs[gBattlerAttacker].fleeFlag)
+ switch (gProtectStructs[gBattlerAttacker].fleeType)
{
default:
gBattlescriptCurrInstr = BattleScript_GotAwaySafely;
break;
- case 1:
+ case FLEE_ITEM:
gBattlescriptCurrInstr = BattleScript_SmokeBallEscape;
break;
- case 2:
+ case FLEE_ABILITY:
gBattlescriptCurrInstr = BattleScript_RanAwayUsingMonAbility;
break;
}
@@ -5055,7 +5104,7 @@ static void HandleEndTurn_FinishBattle(void)
TryPutBreakingNewsOnAir();
}
- sub_8186444();
+ RecordedBattle_SetPlaybackFinished();
BeginFastPaletteFade(3);
FadeOutMapMusic(5);
gBattleMainFunc = FreeResetData_ReturnToOvOrDoEvolutions;
@@ -5142,7 +5191,7 @@ static void ReturnFromBattleToOverworld(void)
return;
gSpecialVar_Result = gBattleOutcome;
- gMain.inBattle = 0;
+ gMain.inBattle = FALSE;
gMain.callback1 = gPreBattleCallback1;
if (gBattleTypeFlags & BATTLE_TYPE_ROAMER)
diff --git a/src/battle_message.c b/src/battle_message.c
index 1f4bd893f..1dbe0a2dd 100644
--- a/src/battle_message.c
+++ b/src/battle_message.c
@@ -2053,7 +2053,8 @@ static const struct BattleWindowText sTextOnWindowsInfo_Arena[] =
static const struct BattleWindowText *const sBattleTextOnWindowsInfo[] =
{
- sTextOnWindowsInfo_Normal, sTextOnWindowsInfo_Arena
+ [B_WIN_TYPE_NORMAL] = sTextOnWindowsInfo_Normal,
+ [B_WIN_TYPE_ARENA] = sTextOnWindowsInfo_Arena
};
static const u8 sRecordedBattleTextSpeeds[] = {8, 4, 1, 0};
diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c
index e7520b1ee..92f976472 100644
--- a/src/battle_script_commands.c
+++ b/src/battle_script_commands.c
@@ -1834,8 +1834,8 @@ static void Cmd_datahpupdate(void)
if (gBattleStruct->dynamicMoveType == 0)
moveType = gBattleMoves[gCurrentMove].type;
- else if (!(gBattleStruct->dynamicMoveType & 0x40))
- moveType = gBattleStruct->dynamicMoveType & 0x3F;
+ else if (!(gBattleStruct->dynamicMoveType & F_DYNAMIC_TYPE_1))
+ moveType = gBattleStruct->dynamicMoveType & DYNAMIC_TYPE_MASK;
else
moveType = gBattleMoves[gCurrentMove].type;
@@ -3489,6 +3489,8 @@ static void Cmd_getexp(void)
}
}
+// For battles that aren't BATTLE_TYPE_LINK or BATTLE_TYPE_RECORDED_LINK, the only thing this
+// command does is check whether the player has won/lost by totaling each team's HP
static void Cmd_unknown_24(void)
{
u16 HP_count = 0;
@@ -3497,11 +3499,14 @@ static void Cmd_unknown_24(void)
if (gBattleControllerExecFlags)
return;
+ // Get total HP for the player's party to determine if the player has lost
if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId == TRAINER_STEVEN_PARTNER)
{
+ // In multi battle with Steven, skip his Pokémon
for (i = 0; i < MULTI_PARTY_SIZE; i++)
{
- if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG))
+ if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES)
+ && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG))
HP_count += GetMonData(&gPlayerParty[i], MON_DATA_HP);
}
}
@@ -3509,28 +3514,30 @@ static void Cmd_unknown_24(void)
{
for (i = 0; i < PARTY_SIZE; i++)
{
- if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)
- && (!(gBattleTypeFlags & BATTLE_TYPE_ARENA) || !(gBattleStruct->arenaLostPlayerMons & gBitTable[i])))
+ if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES)
+ && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)
+ && (!(gBattleTypeFlags & BATTLE_TYPE_ARENA)
+ || !(gBattleStruct->arenaLostPlayerMons & gBitTable[i])))
{
HP_count += GetMonData(&gPlayerParty[i], MON_DATA_HP);
}
}
}
-
if (HP_count == 0)
gBattleOutcome |= B_OUTCOME_LOST;
-
HP_count = 0;
+ // Get total HP for the enemy's party to determine if the player has won
for (i = 0; i < PARTY_SIZE; i++)
{
- if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES) && !GetMonData(&gEnemyParty[i], MON_DATA_IS_EGG)
- && (!(gBattleTypeFlags & BATTLE_TYPE_ARENA) || !(gBattleStruct->arenaLostOpponentMons & gBitTable[i])))
+ if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES)
+ && !GetMonData(&gEnemyParty[i], MON_DATA_IS_EGG)
+ && (!(gBattleTypeFlags & BATTLE_TYPE_ARENA)
+ || !(gBattleStruct->arenaLostOpponentMons & gBitTable[i])))
{
HP_count += GetMonData(&gEnemyParty[i], MON_DATA_HP);
}
}
-
if (HP_count == 0)
gBattleOutcome |= B_OUTCOME_WON;
@@ -4844,7 +4851,7 @@ static void Cmd_openpartyscreen(void)
else if (!gSpecialStatuses[gActiveBattler].flag40)
{
ChooseMonToSendOut(PARTY_SIZE);
- gSpecialStatuses[gActiveBattler].flag40 = 1;
+ gSpecialStatuses[gActiveBattler].flag40 = TRUE;
}
}
else
@@ -4873,7 +4880,7 @@ static void Cmd_openpartyscreen(void)
else if (!gSpecialStatuses[gActiveBattler].flag40)
{
ChooseMonToSendOut(gBattleStruct->monToSwitchIntoId[2]);
- gSpecialStatuses[gActiveBattler].flag40 = 1;
+ gSpecialStatuses[gActiveBattler].flag40 = TRUE;
}
else
{
@@ -4895,7 +4902,7 @@ static void Cmd_openpartyscreen(void)
else if (!gSpecialStatuses[gActiveBattler].flag40)
{
ChooseMonToSendOut(gBattleStruct->monToSwitchIntoId[0]);
- gSpecialStatuses[gActiveBattler].flag40 = 1;
+ gSpecialStatuses[gActiveBattler].flag40 = TRUE;
}
else if (!(flags & 1))
{
@@ -4916,7 +4923,7 @@ static void Cmd_openpartyscreen(void)
else if (!gSpecialStatuses[gActiveBattler].flag40)
{
ChooseMonToSendOut(gBattleStruct->monToSwitchIntoId[3]);
- gSpecialStatuses[gActiveBattler].flag40 = 1;
+ gSpecialStatuses[gActiveBattler].flag40 = TRUE;
}
else
{
@@ -4938,7 +4945,7 @@ static void Cmd_openpartyscreen(void)
else if (!gSpecialStatuses[gActiveBattler].flag40)
{
ChooseMonToSendOut(gBattleStruct->monToSwitchIntoId[1]);
- gSpecialStatuses[gActiveBattler].flag40 = 1;
+ gSpecialStatuses[gActiveBattler].flag40 = TRUE;
}
else if (!(flags & 2))
{
@@ -5001,7 +5008,7 @@ static void Cmd_openpartyscreen(void)
else if (!gSpecialStatuses[gActiveBattler].flag40)
{
ChooseMonToSendOut(gBattleStruct->monToSwitchIntoId[0]);
- gSpecialStatuses[gActiveBattler].flag40 = 1;
+ gSpecialStatuses[gActiveBattler].flag40 = TRUE;
}
}
if (gBitTable[3] & hitmarkerFaintBits && hitmarkerFaintBits & gBitTable[1])
@@ -5017,7 +5024,7 @@ static void Cmd_openpartyscreen(void)
else if (!gSpecialStatuses[gActiveBattler].flag40)
{
ChooseMonToSendOut(gBattleStruct->monToSwitchIntoId[1]);
- gSpecialStatuses[gActiveBattler].flag40 = 1;
+ gSpecialStatuses[gActiveBattler].flag40 = TRUE;
}
}
gBattlescriptCurrInstr += 6;
@@ -5175,7 +5182,7 @@ static void Cmd_switchineffects(void)
UpdateSentPokesToOpponentValue(gActiveBattler);
gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler);
- gSpecialStatuses[gActiveBattler].flag40 = 0;
+ gSpecialStatuses[gActiveBattler].flag40 = FALSE;
if (!(gSideStatuses[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_SPIKES_DAMAGED)
&& (gSideStatuses[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_SPIKES)
@@ -5230,7 +5237,7 @@ static void Cmd_switchineffects(void)
*hpOnSwitchout = gBattleMons[i].hp;
}
- if (gBattlescriptCurrInstr[1] == 5)
+ if (gBattlescriptCurrInstr[1] == BS_UNK_5)
{
u32 hitmarkerFaintBits = gHitMarker >> 28;
@@ -6282,7 +6289,7 @@ static void Cmd_various(void)
gBattleCommunication[0] = IsRunningFromBattleImpossible();
break;
case VARIOUS_GET_MOVE_TARGET:
- gBattlerTarget = GetMoveTarget(gCurrentMove, 0);
+ gBattlerTarget = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE);
break;
case VARIOUS_GET_BATTLER_FAINTED:
if (gHitMarker & HITMARKER_FAINTED(gActiveBattler))
@@ -6597,7 +6604,7 @@ static void Cmd_trymirrormove(void)
{
gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED;
gCurrentMove = move;
- gBattlerTarget = GetMoveTarget(gCurrentMove, 0);
+ gBattlerTarget = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE);
gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect];
}
else if (validMovesCount)
@@ -6605,7 +6612,7 @@ static void Cmd_trymirrormove(void)
gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED;
i = Random() % validMovesCount;
gCurrentMove = movesArray[i];
- gBattlerTarget = GetMoveTarget(gCurrentMove, 0);
+ gBattlerTarget = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE);
gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect];
}
else
@@ -7805,7 +7812,7 @@ static void Cmd_metronome(void)
{
gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED;
gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect];
- gBattlerTarget = GetMoveTarget(gCurrentMove, 0);
+ gBattlerTarget = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE);
return;
}
}
@@ -8154,7 +8161,7 @@ static void Cmd_trychoosesleeptalkmove(void)
gCalledMove = gBattleMons[gBattlerAttacker].moves[movePosition];
gCurrMovePos = movePosition;
gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED;
- gBattlerTarget = GetMoveTarget(gCalledMove, 0);
+ gBattlerTarget = GetMoveTarget(gCalledMove, NO_TARGET_OVERRIDE);
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
@@ -8758,29 +8765,28 @@ static void Cmd_recoverbasedonsunlight(void)
static void Cmd_hiddenpowercalc(void)
{
- u8 powerBits;
- u8 typeBits;
-
- powerBits = ((gBattleMons[gBattlerAttacker].hpIV & 2) >> 1)
- | ((gBattleMons[gBattlerAttacker].attackIV & 2) << 0)
- | ((gBattleMons[gBattlerAttacker].defenseIV & 2) << 1)
- | ((gBattleMons[gBattlerAttacker].speedIV & 2) << 2)
- | ((gBattleMons[gBattlerAttacker].spAttackIV & 2) << 3)
- | ((gBattleMons[gBattlerAttacker].spDefenseIV & 2) << 4);
+ u8 powerBits = ((gBattleMons[gBattlerAttacker].hpIV & 2) >> 1)
+ | ((gBattleMons[gBattlerAttacker].attackIV & 2) << 0)
+ | ((gBattleMons[gBattlerAttacker].defenseIV & 2) << 1)
+ | ((gBattleMons[gBattlerAttacker].speedIV & 2) << 2)
+ | ((gBattleMons[gBattlerAttacker].spAttackIV & 2) << 3)
+ | ((gBattleMons[gBattlerAttacker].spDefenseIV & 2) << 4);
- typeBits = ((gBattleMons[gBattlerAttacker].hpIV & 1) << 0)
- | ((gBattleMons[gBattlerAttacker].attackIV & 1) << 1)
- | ((gBattleMons[gBattlerAttacker].defenseIV & 1) << 2)
- | ((gBattleMons[gBattlerAttacker].speedIV & 1) << 3)
- | ((gBattleMons[gBattlerAttacker].spAttackIV & 1) << 4)
- | ((gBattleMons[gBattlerAttacker].spDefenseIV & 1) << 5);
+ u8 typeBits = ((gBattleMons[gBattlerAttacker].hpIV & 1) << 0)
+ | ((gBattleMons[gBattlerAttacker].attackIV & 1) << 1)
+ | ((gBattleMons[gBattlerAttacker].defenseIV & 1) << 2)
+ | ((gBattleMons[gBattlerAttacker].speedIV & 1) << 3)
+ | ((gBattleMons[gBattlerAttacker].spAttackIV & 1) << 4)
+ | ((gBattleMons[gBattlerAttacker].spDefenseIV & 1) << 5);
gDynamicBasePower = (40 * powerBits) / 63 + 30;
- gBattleStruct->dynamicMoveType = (15 * typeBits) / 63 + 1;
+ // Subtract 3 instead of 1 below because 2 types are excluded (TYPE_NORMAL and TYPE_MYSTERY)
+ // The final + 1 skips past Normal, and the following conditional skips TYPE_MYSTERY
+ gBattleStruct->dynamicMoveType = ((NUMBER_OF_MON_TYPES - 3) * typeBits) / 63 + 1;
if (gBattleStruct->dynamicMoveType >= TYPE_MYSTERY)
gBattleStruct->dynamicMoveType++;
- gBattleStruct->dynamicMoveType |= 0xC0;
+ gBattleStruct->dynamicMoveType |= F_DYNAMIC_TYPE_1 | F_DYNAMIC_TYPE_2;
gBattlescriptCurrInstr++;
}
@@ -8972,7 +8978,7 @@ static void Cmd_callterrainattack(void) // nature power
{
gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED;
gCurrentMove = sNaturePowerMoves[gBattleTerrain];
- gBattlerTarget = GetMoveTarget(gCurrentMove, 0);
+ gBattlerTarget = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE);
BattleScriptPush(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]);
gBattlescriptCurrInstr++;
}
@@ -9382,7 +9388,7 @@ static void Cmd_assistattackselect(void)
{
gHitMarker &= ~HITMARKER_ATTACKSTRING_PRINTED;
gCalledMove = movesArray[((Random() & 0xFF) * chooseableMovesNo) >> 8];
- gBattlerTarget = GetMoveTarget(gCalledMove, 0);
+ gBattlerTarget = GetMoveTarget(gCalledMove, NO_TARGET_OVERRIDE);
gBattlescriptCurrInstr += 5;
}
else
@@ -9527,7 +9533,7 @@ static void Cmd_pickup(void)
ability = gBaseStats[species].abilities[0];
if (ability == ABILITY_PICKUP
- && species != 0
+ && species != SPECIES_NONE
&& species != SPECIES_EGG
&& heldItem == ITEM_NONE
&& (Random() % 10) == 0)
@@ -9550,7 +9556,7 @@ static void Cmd_pickup(void)
ability = gBaseStats[species].abilities[0];
if (ability == ABILITY_PICKUP
- && species != 0
+ && species != SPECIES_NONE
&& species != SPECIES_EGG
&& heldItem == ITEM_NONE
&& (Random() % 10) == 0)
@@ -9586,7 +9592,7 @@ static void Cmd_docastformchangeanimation(void)
gActiveBattler = gBattleScripting.battler;
if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE)
- *(&gBattleStruct->formToChangeInto) |= 0x80;
+ *(&gBattleStruct->formToChangeInto) |= CASTFORM_SUBSTITUTE;
BtlController_EmitBattleAnimation(0, B_ANIM_CASTFORM_CHANGE, gBattleStruct->formToChangeInto);
MarkBattlerForControllerExec(gActiveBattler);
@@ -9643,15 +9649,15 @@ static void Cmd_setweatherballtype(void)
if (gBattleWeather & B_WEATHER_ANY)
gBattleScripting.dmgMultiplier = 2;
if (gBattleWeather & B_WEATHER_RAIN)
- *(&gBattleStruct->dynamicMoveType) = TYPE_WATER | 0x80;
+ *(&gBattleStruct->dynamicMoveType) = TYPE_WATER | F_DYNAMIC_TYPE_2;
else if (gBattleWeather & B_WEATHER_SANDSTORM)
- *(&gBattleStruct->dynamicMoveType) = TYPE_ROCK | 0x80;
+ *(&gBattleStruct->dynamicMoveType) = TYPE_ROCK | F_DYNAMIC_TYPE_2;
else if (gBattleWeather & B_WEATHER_SUN)
- *(&gBattleStruct->dynamicMoveType) = TYPE_FIRE | 0x80;
+ *(&gBattleStruct->dynamicMoveType) = TYPE_FIRE | F_DYNAMIC_TYPE_2;
else if (gBattleWeather & B_WEATHER_HAIL)
- *(&gBattleStruct->dynamicMoveType) = TYPE_ICE | 0x80;
+ *(&gBattleStruct->dynamicMoveType) = TYPE_ICE | F_DYNAMIC_TYPE_2;
else
- *(&gBattleStruct->dynamicMoveType) = TYPE_NORMAL | 0x80;
+ *(&gBattleStruct->dynamicMoveType) = TYPE_NORMAL | F_DYNAMIC_TYPE_2;
}
gBattlescriptCurrInstr++;
@@ -9663,10 +9669,10 @@ static void Cmd_tryrecycleitem(void)
gActiveBattler = gBattlerAttacker;
usedHeldItem = &gBattleStruct->usedHeldItems[gActiveBattler];
- if (*usedHeldItem != 0 && gBattleMons[gActiveBattler].item == 0)
+ if (*usedHeldItem != ITEM_NONE && gBattleMons[gActiveBattler].item == ITEM_NONE)
{
gLastUsedItem = *usedHeldItem;
- *usedHeldItem = 0;
+ *usedHeldItem = ITEM_NONE;
gBattleMons[gActiveBattler].item = gLastUsedItem;
BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBattler].item);
@@ -9704,7 +9710,7 @@ static void Cmd_pursuitrelated(void)
&& gChosenActionByBattler[gActiveBattler] == B_ACTION_USE_MOVE
&& gChosenMoveByBattler[gActiveBattler] == MOVE_PURSUIT)
{
- gActionsByTurnOrder[gActiveBattler] = 11;
+ gActionsByTurnOrder[gActiveBattler] = B_ACTION_TRY_FINISH;
gCurrentMove = MOVE_PURSUIT;
gBattlescriptCurrInstr += 5;
gBattleScripting.animTurn = 1;
@@ -9849,7 +9855,7 @@ static void Cmd_handleballthrow(void)
}
else
{
- if (gBattleResults.catchAttempts[gLastUsedItem - ITEM_ULTRA_BALL] < 0xFF)
+ if (gBattleResults.catchAttempts[gLastUsedItem - ITEM_ULTRA_BALL] < 255)
gBattleResults.catchAttempts[gLastUsedItem - ITEM_ULTRA_BALL]++;
}
}
diff --git a/src/battle_setup.c b/src/battle_setup.c
index 4337ec29c..172bfc5be 100644
--- a/src/battle_setup.c
+++ b/src/battle_setup.c
@@ -319,7 +319,7 @@ const struct RematchTrainer gRematchTable[REMATCH_TABLE_ENTRIES] =
[REMATCH_TRENT] = REMATCH(TRAINER_TRENT_1, TRAINER_TRENT_2, TRAINER_TRENT_3, TRAINER_TRENT_4, TRAINER_TRENT_5, ROUTE112),
[REMATCH_SAWYER] = REMATCH(TRAINER_SAWYER_1, TRAINER_SAWYER_2, TRAINER_SAWYER_3, TRAINER_SAWYER_4, TRAINER_SAWYER_5, MT_CHIMNEY),
[REMATCH_KIRA_AND_DAN] = REMATCH(TRAINER_KIRA_AND_DAN_1, TRAINER_KIRA_AND_DAN_2, TRAINER_KIRA_AND_DAN_3, TRAINER_KIRA_AND_DAN_4, TRAINER_KIRA_AND_DAN_5, ABANDONED_SHIP_ROOMS2_1F),
- [REMATCH_WALLY_3] = REMATCH(TRAINER_WALLY_VR_2, TRAINER_WALLY_VR_3, TRAINER_WALLY_VR_4, TRAINER_WALLY_VR_5, TRAINER_WALLY_VR_5, VICTORY_ROAD_1F),
+ [REMATCH_WALLY_VR] = REMATCH(TRAINER_WALLY_VR_2, TRAINER_WALLY_VR_3, TRAINER_WALLY_VR_4, TRAINER_WALLY_VR_5, TRAINER_WALLY_VR_5, VICTORY_ROAD_1F),
[REMATCH_ROXANNE] = REMATCH(TRAINER_ROXANNE_1, TRAINER_ROXANNE_2, TRAINER_ROXANNE_3, TRAINER_ROXANNE_4, TRAINER_ROXANNE_5, RUSTBORO_CITY),
[REMATCH_BRAWLY] = REMATCH(TRAINER_BRAWLY_1, TRAINER_BRAWLY_2, TRAINER_BRAWLY_3, TRAINER_BRAWLY_4, TRAINER_BRAWLY_5, DEWFORD_TOWN),
[REMATCH_WATTSON] = REMATCH(TRAINER_WATTSON_1, TRAINER_WATTSON_2, TRAINER_WATTSON_3, TRAINER_WATTSON_4, TRAINER_WATTSON_5, MAUVILLE_CITY),
@@ -460,12 +460,12 @@ static void DoTrainerBattle(void)
TryUpdateGymLeaderRematchFromTrainer();
}
-static void sub_80B0828(void)
+static void DoBattlePyramidTrainerHillBattle(void)
{
if (InBattlePyramid())
- CreateBattleStartTask(GetSpecialBattleTransition(10), 0);
+ CreateBattleStartTask(GetSpecialBattleTransition(B_TRANSITION_GROUP_B_PYRAMID), 0);
else
- CreateBattleStartTask(GetSpecialBattleTransition(11), 0);
+ CreateBattleStartTask(GetSpecialBattleTransition(B_TRANSITION_GROUP_TRAINER_HILL), 0);
IncrementGameStat(GAME_STAT_TOTAL_BATTLES);
IncrementGameStat(GAME_STAT_TRAINER_BATTLES);
@@ -853,16 +853,7 @@ static u8 GetTrainerBattleTransition(void)
return sBattleTransitionTable_Trainer[transitionType][1];
}
-// 0: Battle Tower
-// 3: Battle Dome
-// 4: Battle Palace
-// 5: Battle Arena
-// 6: Battle Factory
-// 7: Battle Pike
-// 10: Battle Pyramid
-// 11: Trainer Hill
-// 12: Secret Base
-// 13: E-Reader
+#define RANDOM_TRANSITION(table)(table[Random() % ARRAY_COUNT(table)])
u8 GetSpecialBattleTransition(s32 id)
{
u16 var;
@@ -873,35 +864,35 @@ u8 GetSpecialBattleTransition(s32 id)
{
switch (id)
{
- case 11:
- case 12:
- case 13:
+ case B_TRANSITION_GROUP_TRAINER_HILL:
+ case B_TRANSITION_GROUP_SECRET_BASE:
+ case B_TRANSITION_GROUP_E_READER:
return B_TRANSITION_POKEBALLS_TRAIL;
- case 10:
- return sBattleTransitionTable_BattlePyramid[Random() % ARRAY_COUNT(sBattleTransitionTable_BattlePyramid)];
- case 3:
- return sBattleTransitionTable_BattleDome[Random() % ARRAY_COUNT(sBattleTransitionTable_BattleDome)];
+ case B_TRANSITION_GROUP_B_PYRAMID:
+ return RANDOM_TRANSITION(sBattleTransitionTable_BattlePyramid);
+ case B_TRANSITION_GROUP_B_DOME:
+ return RANDOM_TRANSITION(sBattleTransitionTable_BattleDome);
}
if (VarGet(VAR_FRONTIER_BATTLE_MODE) != FRONTIER_MODE_LINK_MULTIS)
- return sBattleTransitionTable_BattleFrontier[Random() % ARRAY_COUNT(sBattleTransitionTable_BattleFrontier)];
+ return RANDOM_TRANSITION(sBattleTransitionTable_BattleFrontier);
}
else
{
switch (id)
{
- case 11:
- case 12:
- case 13:
+ case B_TRANSITION_GROUP_TRAINER_HILL:
+ case B_TRANSITION_GROUP_SECRET_BASE:
+ case B_TRANSITION_GROUP_E_READER:
return B_TRANSITION_BIG_POKEBALL;
- case 10:
- return sBattleTransitionTable_BattlePyramid[Random() % ARRAY_COUNT(sBattleTransitionTable_BattlePyramid)];
- case 3:
- return sBattleTransitionTable_BattleDome[Random() % ARRAY_COUNT(sBattleTransitionTable_BattleDome)];
+ case B_TRANSITION_GROUP_B_PYRAMID:
+ return RANDOM_TRANSITION(sBattleTransitionTable_BattlePyramid);
+ case B_TRANSITION_GROUP_B_DOME:
+ return RANDOM_TRANSITION(sBattleTransitionTable_BattleDome);
}
if (VarGet(VAR_FRONTIER_BATTLE_MODE) != FRONTIER_MODE_LINK_MULTIS)
- return sBattleTransitionTable_BattleFrontier[Random() % ARRAY_COUNT(sBattleTransitionTable_BattleFrontier)];
+ return RANDOM_TRANSITION(sBattleTransitionTable_BattleFrontier);
}
var = gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum * 2 + 0]
@@ -1319,7 +1310,7 @@ void BattleSetup_StartTrainerBattle(void)
gMain.savedCallback = CB2_EndTrainerBattle;
if (InBattlePyramid() || InTrainerHillChallenge())
- sub_80B0828();
+ DoBattlePyramidTrainerHillBattle();
else
DoTrainerBattle();
@@ -1575,12 +1566,14 @@ static s32 TrainerIdToRematchTableId(const struct RematchTrainer *table, u16 tra
return -1;
}
-static bool32 sub_80B1D94(s32 rematchTableId)
+// Returns TRUE if the given trainer (by their entry in the rematch table) is not allowed to have rematches.
+// This applies to the Elite Four and Victory Road Wally (if he's not been defeated yet)
+static bool32 IsRematchForbidden(s32 rematchTableId)
{
if (rematchTableId >= REMATCH_ELITE_FOUR_ENTRIES)
return TRUE;
- else if (rematchTableId == REMATCH_WALLY_3)
- return (FlagGet(FLAG_DEFEATED_WALLY_VICTORY_ROAD) == FALSE);
+ else if (rematchTableId == REMATCH_WALLY_VR)
+ return !FlagGet(FLAG_DEFEATED_WALLY_VICTORY_ROAD);
else
return FALSE;
}
@@ -1609,7 +1602,7 @@ static bool32 UpdateRandomTrainerRematches(const struct RematchTrainer *table, u
for (i = 0; i <= REMATCH_SPECIAL_TRAINER_START; i++)
{
- if (table[i].mapGroup == mapGroup && table[i].mapNum == mapNum && !sub_80B1D94(i))
+ if (table[i].mapGroup == mapGroup && table[i].mapNum == mapNum && !IsRematchForbidden(i))
{
if (gSaveBlock1Ptr->trainerRematches[i] != 0)
{
diff --git a/src/battle_tower.c b/src/battle_tower.c
index daf63d016..332f00858 100644
--- a/src/battle_tower.c
+++ b/src/battle_tower.c
@@ -2025,7 +2025,7 @@ void DoSpecialTrainerBattle(void)
}
CreateTask(Task_StartBattleAfterTransition, 1);
PlayMapChosenOrBattleBGM(0);
- BattleTransition_StartOnField(GetSpecialBattleTransition(0));
+ BattleTransition_StartOnField(GetSpecialBattleTransition(B_TRANSITION_GROUP_B_TOWER));
break;
case SPECIAL_BATTLE_SECRET_BASE:
for (i = 0; i < PARTY_SIZE; i++)
@@ -2035,7 +2035,7 @@ void DoSpecialTrainerBattle(void)
}
CreateTask(Task_StartBattleAfterTransition, 1);
PlayMapChosenOrBattleBGM(0);
- BattleTransition_StartOnField(GetSpecialBattleTransition(12));
+ BattleTransition_StartOnField(GetSpecialBattleTransition(B_TRANSITION_GROUP_SECRET_BASE));
break;
case SPECIAL_BATTLE_EREADER:
ZeroEnemyPartyMons();
@@ -2045,7 +2045,7 @@ void DoSpecialTrainerBattle(void)
gTrainerBattleOpponent_A = 0;
CreateTask(Task_StartBattleAfterTransition, 1);
PlayMapChosenOrBattleBGM(0);
- BattleTransition_StartOnField(GetSpecialBattleTransition(13));
+ BattleTransition_StartOnField(GetSpecialBattleTransition(B_TRANSITION_GROUP_E_READER));
break;
case SPECIAL_BATTLE_DOME:
gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOME;
@@ -2055,7 +2055,7 @@ void DoSpecialTrainerBattle(void)
FillFrontierTrainerParty(DOME_BATTLE_PARTY_SIZE);
CreateTask(Task_StartBattleAfterTransition, 1);
CreateTask_PlayMapChosenOrBattleBGM(0);
- BattleTransition_StartOnField(GetSpecialBattleTransition(3));
+ BattleTransition_StartOnField(GetSpecialBattleTransition(B_TRANSITION_GROUP_B_DOME));
break;
case SPECIAL_BATTLE_PALACE:
gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_PALACE;
@@ -2067,7 +2067,7 @@ void DoSpecialTrainerBattle(void)
FillTentTrainerParty(FRONTIER_PARTY_SIZE);
CreateTask(Task_StartBattleAfterTransition, 1);
PlayMapChosenOrBattleBGM(0);
- BattleTransition_StartOnField(GetSpecialBattleTransition(4));
+ BattleTransition_StartOnField(GetSpecialBattleTransition(B_TRANSITION_GROUP_B_PALACE));
break;
case SPECIAL_BATTLE_ARENA:
gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_ARENA;
@@ -2077,7 +2077,7 @@ void DoSpecialTrainerBattle(void)
FillTentTrainerParty(FRONTIER_PARTY_SIZE);
CreateTask(Task_StartBattleAfterTransition, 1);
PlayMapChosenOrBattleBGM(0);
- BattleTransition_StartOnField(GetSpecialBattleTransition(5));
+ BattleTransition_StartOnField(GetSpecialBattleTransition(B_TRANSITION_GROUP_B_ARENA));
break;
case SPECIAL_BATTLE_FACTORY:
gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_FACTORY;
@@ -2086,28 +2086,28 @@ void DoSpecialTrainerBattle(void)
FillFactoryTrainerParty();
CreateTask(Task_StartBattleAfterTransition, 1);
PlayMapChosenOrBattleBGM(0);
- BattleTransition_StartOnField(GetSpecialBattleTransition(6));
+ BattleTransition_StartOnField(GetSpecialBattleTransition(B_TRANSITION_GROUP_B_FACTORY));
break;
case SPECIAL_BATTLE_PIKE_SINGLE:
gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_BATTLE_TOWER;
FillFrontierTrainerParty(FRONTIER_PARTY_SIZE);
CreateTask(Task_StartBattleAfterTransition, 1);
PlayMapChosenOrBattleBGM(0);
- BattleTransition_StartOnField(GetSpecialBattleTransition(7));
+ BattleTransition_StartOnField(GetSpecialBattleTransition(B_TRANSITION_GROUP_B_PIKE));
break;
case SPECIAL_BATTLE_PYRAMID:
gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_PYRAMID;
FillFrontierTrainerParty(FRONTIER_PARTY_SIZE);
CreateTask(Task_StartBattleAfterTransition, 1);
PlayMapChosenOrBattleBGM(0);
- BattleTransition_StartOnField(GetSpecialBattleTransition(10));
+ BattleTransition_StartOnField(GetSpecialBattleTransition(B_TRANSITION_GROUP_B_PYRAMID));
break;
case SPECIAL_BATTLE_PIKE_DOUBLE:
gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TWO_OPPONENTS;
FillFrontierTrainersParties(1);
CreateTask(Task_StartBattleAfterTransition, 1);
PlayMapChosenOrBattleBGM(0);
- BattleTransition_StartOnField(GetSpecialBattleTransition(7));
+ BattleTransition_StartOnField(GetSpecialBattleTransition(B_TRANSITION_GROUP_B_PIKE));
break;
case SPECIAL_BATTLE_STEVEN:
gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER;
diff --git a/src/battle_util.c b/src/battle_util.c
index 7b47bc994..11fd31524 100644
--- a/src/battle_util.c
+++ b/src/battle_util.c
@@ -99,10 +99,10 @@ void HandleAction_UseMove(void)
// choose move
if (gProtectStructs[gBattlerAttacker].noValidMoves)
{
- gProtectStructs[gBattlerAttacker].noValidMoves = 0;
+ gProtectStructs[gBattlerAttacker].noValidMoves = FALSE;
gCurrentMove = gChosenMove = MOVE_STRUGGLE;
gHitMarker |= HITMARKER_NO_PPDEDUCT;
- *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(MOVE_STRUGGLE, 0);
+ *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(MOVE_STRUGGLE, NO_TARGET_OVERRIDE);
}
else if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS || gBattleMons[gBattlerAttacker].status2 & STATUS2_RECHARGE)
{
@@ -114,7 +114,7 @@ void HandleAction_UseMove(void)
{
gCurrentMove = gChosenMove = gDisableStructs[gBattlerAttacker].encoredMove;
gCurrMovePos = gChosenMovePos = gDisableStructs[gBattlerAttacker].encoredMovePos;
- *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, 0);
+ *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE);
}
// check if the encored move wasn't overwritten
else if (gDisableStructs[gBattlerAttacker].encoredMove != MOVE_NONE
@@ -125,12 +125,12 @@ void HandleAction_UseMove(void)
gDisableStructs[gBattlerAttacker].encoredMove = MOVE_NONE;
gDisableStructs[gBattlerAttacker].encoredMovePos = 0;
gDisableStructs[gBattlerAttacker].encoreTimer = 0;
- *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, 0);
+ *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE);
}
else if (gBattleMons[gBattlerAttacker].moves[gCurrMovePos] != gChosenMoveByBattler[gBattlerAttacker])
{
gCurrentMove = gChosenMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos];
- *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, 0);
+ *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE);
}
else
{
@@ -323,11 +323,11 @@ void HandleAction_UseItem(void)
}
else if (gLastUsedItem == ITEM_POKE_DOLL || gLastUsedItem == ITEM_FLUFFY_TAIL)
{
- gBattlescriptCurrInstr = gBattlescriptsForRunningByItem[0];
+ gBattlescriptCurrInstr = gBattlescriptsForRunningByItem[0]; // BattleScript_RunByUsingItem
}
else if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
{
- gBattlescriptCurrInstr = gBattlescriptsForUsingItem[0];
+ gBattlescriptCurrInstr = gBattlescriptsForUsingItem[0]; // BattleScript_PlayerUsesItem
}
else
{
@@ -417,7 +417,7 @@ bool8 TryRunFromBattle(u8 battler)
if (holdEffect == HOLD_EFFECT_CAN_ALWAYS_RUN)
{
gLastUsedItem = gBattleMons[battler].item;
- gProtectStructs[battler].fleeFlag = 1;
+ gProtectStructs[battler].fleeType = FLEE_ITEM;
effect++;
}
else if (gBattleMons[battler].ability == ABILITY_RUN_AWAY)
@@ -430,14 +430,14 @@ bool8 TryRunFromBattle(u8 battler)
if (speedVar > (Random() & 0xFF))
{
gLastUsedAbility = ABILITY_RUN_AWAY;
- gProtectStructs[battler].fleeFlag = 2;
+ gProtectStructs[battler].fleeType = FLEE_ABILITY;
effect++;
}
}
else
{
gLastUsedAbility = ABILITY_RUN_AWAY;
- gProtectStructs[battler].fleeFlag = 2;
+ gProtectStructs[battler].fleeType = FLEE_ABILITY;
effect++;
}
}
@@ -562,7 +562,7 @@ void HandleAction_ThrowPokeblock(void)
gBattleCommunication[MULTISTRING_CHOOSER] = gBattleBufferB[gBattlerAttacker][1] - 1;
gLastUsedItem = gBattleBufferB[gBattlerAttacker][2];
- if (gBattleResults.pokeblockThrows < 0xFF)
+ if (gBattleResults.pokeblockThrows < 255)
gBattleResults.pokeblockThrows++;
if (gBattleStruct->safariPkblThrowCounter < 3)
gBattleStruct->safariPkblThrowCounter++;
@@ -653,7 +653,7 @@ void HandleAction_NothingIsFainted(void)
void HandleAction_ActionFinished(void)
{
- *(gBattleStruct->monToSwitchIntoId + gBattlerByTurnOrder[gCurrentTurnActionNumber]) = 6;
+ *(gBattleStruct->monToSwitchIntoId + gBattlerByTurnOrder[gCurrentTurnActionNumber]) = PARTY_SIZE;
gCurrentTurnActionNumber++;
gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber];
SpecialStatusesClear();
@@ -679,7 +679,6 @@ void HandleAction_ActionFinished(void)
gBattleResources->battleScriptsStack->size = 0;
}
-// rom const data
static const u16 sSoundMovesTable[] =
{
MOVE_GROWL, MOVE_ROAR, MOVE_SING, MOVE_SUPERSONIC, MOVE_SCREECH, MOVE_SNORE,
@@ -709,13 +708,13 @@ u8 GetBattlerForBattleScript(u8 caseId)
case BS_FAINTED:
ret = gBattlerFainted;
break;
- case 5:
+ case BS_UNK_5:
ret = gBattlerFainted;
break;
- case 4:
- case 6:
- case 8:
- case 9:
+ case BS_ATTACKER_WITH_PARTNER:
+ case BS_UNK_6:
+ case BS_ATTACKER_SIDE:
+ case BS_NOT_ATTACKER_SIDE:
case BS_PLAYER1:
ret = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
break;
@@ -763,7 +762,7 @@ void PressurePPLose(u8 target, u8 attacker, u16 move)
void PressurePPLoseOnUsingImprison(u8 attacker)
{
int i, j;
- int imprisonPos = 4;
+ int imprisonPos = MAX_MON_MOVES;
u8 atkSide = GetBattlerSide(attacker);
for (i = 0; i < gBattlersCount; i++)
@@ -797,7 +796,7 @@ void PressurePPLoseOnUsingImprison(u8 attacker)
void PressurePPLoseOnUsingPerishSong(u8 attacker)
{
int i, j;
- int perishSongPos = 4;
+ int perishSongPos = MAX_MON_MOVES;
for (i = 0; i < gBattlersCount; i++)
{
@@ -858,17 +857,17 @@ void MarkBattlerReceivedLinkData(u8 battlerId)
for (i = 0; i < GetLinkPlayerCount(); i++)
gBattleControllerExecFlags |= gBitTable[battlerId] << (i << 2);
- gBattleControllerExecFlags &= ~(0x10000000 << battlerId);
+ gBattleControllerExecFlags &= ~((1 << 28) << battlerId);
}
void CancelMultiTurnMoves(u8 battler)
{
- gBattleMons[battler].status2 &= ~(STATUS2_MULTIPLETURNS);
- gBattleMons[battler].status2 &= ~(STATUS2_LOCK_CONFUSE);
- gBattleMons[battler].status2 &= ~(STATUS2_UPROAR);
- gBattleMons[battler].status2 &= ~(STATUS2_BIDE);
+ gBattleMons[battler].status2 &= ~STATUS2_MULTIPLETURNS;
+ gBattleMons[battler].status2 &= ~STATUS2_LOCK_CONFUSE;
+ gBattleMons[battler].status2 &= ~STATUS2_UPROAR;
+ gBattleMons[battler].status2 &= ~STATUS2_BIDE;
- gStatuses3[battler] &= ~(STATUS3_SEMI_INVULNERABLE);
+ gStatuses3[battler] &= ~STATUS3_SEMI_INVULNERABLE;
gDisableStructs[battler].rolloutTimer = 0;
gDisableStructs[battler].furyCutterCounter = 0;
@@ -927,7 +926,6 @@ void OpponentSwitchInResetSentPokesToOpponentValue(u8 battler)
if (!(gAbsentBattlerFlags & gBitTable[i]))
bits |= gBitTable[gBattlerPartyIndexes[i]];
}
-
gSentPokesToOpponent[flank] = bits;
}
}
@@ -975,7 +973,7 @@ u8 TrySetCantSelectMoveBattleScript(void)
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
{
gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingDisabledMoveInPalace;
- gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1;
+ gProtectStructs[gActiveBattler].palaceUnableToUseMove = TRUE;
}
else
{
@@ -990,7 +988,7 @@ u8 TrySetCantSelectMoveBattleScript(void)
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
{
gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingTormentedMoveInPalace;
- gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1;
+ gProtectStructs[gActiveBattler].palaceUnableToUseMove = TRUE;
}
else
{
@@ -1005,7 +1003,7 @@ u8 TrySetCantSelectMoveBattleScript(void)
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
{
gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedMoveTauntInPalace;
- gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1;
+ gProtectStructs[gActiveBattler].palaceUnableToUseMove = TRUE;
}
else
{
@@ -1020,7 +1018,7 @@ u8 TrySetCantSelectMoveBattleScript(void)
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
{
gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingImprisonedMoveInPalace;
- gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1;
+ gProtectStructs[gActiveBattler].palaceUnableToUseMove = TRUE;
}
else
{
@@ -1036,13 +1034,13 @@ u8 TrySetCantSelectMoveBattleScript(void)
gPotentialItemEffectBattler = gActiveBattler;
- if (holdEffect == HOLD_EFFECT_CHOICE_BAND && *choicedMove != 0 && *choicedMove != 0xFFFF && *choicedMove != move)
+ if (holdEffect == HOLD_EFFECT_CHOICE_BAND && *choicedMove != MOVE_NONE && *choicedMove != 0xFFFF && *choicedMove != move)
{
gCurrentMove = *choicedMove;
gLastUsedItem = gBattleMons[gActiveBattler].item;
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
{
- gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1;
+ gProtectStructs[gActiveBattler].palaceUnableToUseMove = TRUE;
}
else
{
@@ -1055,7 +1053,7 @@ u8 TrySetCantSelectMoveBattleScript(void)
{
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
{
- gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1;
+ gProtectStructs[gActiveBattler].palaceUnableToUseMove = TRUE;
}
else
{
@@ -1082,43 +1080,53 @@ u8 CheckMoveLimitations(u8 battlerId, u8 unusableMoves, u8 check)
for (i = 0; i < MAX_MON_MOVES; i++)
{
- if (gBattleMons[battlerId].moves[i] == 0 && check & MOVE_LIMITATION_ZEROMOVE)
+ // No move
+ if (gBattleMons[battlerId].moves[i] == MOVE_NONE && check & MOVE_LIMITATION_ZEROMOVE)
unusableMoves |= gBitTable[i];
+ // No PP
if (gBattleMons[battlerId].pp[i] == 0 && check & MOVE_LIMITATION_PP)
unusableMoves |= gBitTable[i];
+ // Disable
if (gBattleMons[battlerId].moves[i] == gDisableStructs[battlerId].disabledMove && check & MOVE_LIMITATION_DISABLED)
unusableMoves |= gBitTable[i];
+ // Torment
if (gBattleMons[battlerId].moves[i] == gLastMoves[battlerId] && check & MOVE_LIMITATION_TORMENTED && gBattleMons[battlerId].status2 & STATUS2_TORMENT)
unusableMoves |= gBitTable[i];
+ // Taunt
if (gDisableStructs[battlerId].tauntTimer && check & MOVE_LIMITATION_TAUNT && gBattleMoves[gBattleMons[battlerId].moves[i]].power == 0)
unusableMoves |= gBitTable[i];
+ // Imprison
if (GetImprisonedMovesCount(battlerId, gBattleMons[battlerId].moves[i]) && check & MOVE_LIMITATION_IMPRISON)
unusableMoves |= gBitTable[i];
+ // Encore
if (gDisableStructs[battlerId].encoreTimer && gDisableStructs[battlerId].encoredMove != gBattleMons[battlerId].moves[i])
unusableMoves |= gBitTable[i];
- if (holdEffect == HOLD_EFFECT_CHOICE_BAND && *choicedMove != 0 && *choicedMove != 0xFFFF && *choicedMove != gBattleMons[battlerId].moves[i])
+ // Choice Band
+ if (holdEffect == HOLD_EFFECT_CHOICE_BAND && *choicedMove != MOVE_NONE && *choicedMove != 0xFFFF && *choicedMove != gBattleMons[battlerId].moves[i])
unusableMoves |= gBitTable[i];
}
return unusableMoves;
}
+#define ALL_MOVES_MASK ((1 << MAX_MON_MOVES) - 1)
bool8 AreAllMovesUnusable(void)
{
u8 unusable;
- unusable = CheckMoveLimitations(gActiveBattler, 0, 0xFF);
+ unusable = CheckMoveLimitations(gActiveBattler, 0, MOVE_LIMITATIONS_ALL);
- if (unusable == 0xF) // All moves are unusable.
+ if (unusable == ALL_MOVES_MASK) // All moves are unusable.
{
- gProtectStructs[gActiveBattler].noValidMoves = 1;
+ gProtectStructs[gActiveBattler].noValidMoves = TRUE;
gSelectionBattleScripts[gActiveBattler] = BattleScript_NoMovesLeft;
}
else
{
- gProtectStructs[gActiveBattler].noValidMoves = 0;
+ gProtectStructs[gActiveBattler].noValidMoves = FALSE;
}
- return (unusable == 0xF);
+ return (unusable == ALL_MOVES_MASK);
}
+#undef ALL_MOVES_MASK
u8 GetImprisonedMovesCount(u8 battlerId, u16 move)
{
@@ -1475,12 +1483,12 @@ u8 DoBattlerEndTurnEffects(void)
gBattleStruct->turnEffectsTracker++;
break;
case ENDTURN_ITEMS1: // item effects
- if (ItemBattleEffects(1, gActiveBattler, FALSE))
+ if (ItemBattleEffects(ITEMEFFECT_NORMAL, gActiveBattler, FALSE))
effect++;
gBattleStruct->turnEffectsTracker++;
break;
case ENDTURN_ITEMS2: // item effects again
- if (ItemBattleEffects(1, gActiveBattler, TRUE))
+ if (ItemBattleEffects(ITEMEFFECT_NORMAL, gActiveBattler, TRUE))
effect++;
gBattleStruct->turnEffectsTracker++;
break;
@@ -1608,8 +1616,8 @@ u8 DoBattlerEndTurnEffects(void)
if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP)
&& gBattleMons[gBattlerAttacker].ability != ABILITY_SOUNDPROOF)
{
- gBattleMons[gBattlerAttacker].status1 &= ~(STATUS1_SLEEP);
- gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP;
+ gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE;
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
BattleScriptExecute(BattleScript_MonWokeUpInUproar);
gActiveBattler = gBattlerAttacker;
@@ -1658,7 +1666,7 @@ u8 DoBattlerEndTurnEffects(void)
else if (!(gBattleMons[gActiveBattler].status2 & STATUS2_LOCK_CONFUSE)
&& (gBattleMons[gActiveBattler].status2 & STATUS2_MULTIPLETURNS))
{
- gBattleMons[gActiveBattler].status2 &= ~(STATUS2_MULTIPLETURNS);
+ gBattleMons[gActiveBattler].status2 &= ~STATUS2_MULTIPLETURNS;
if (!(gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION))
{
gBattleCommunication[MOVE_EFFECT_BYTE] = MOVE_EFFECT_CONFUSION | MOVE_EFFECT_AFFECTS_USER;
@@ -1797,7 +1805,7 @@ bool8 HandleWishPerishSongOnTurnEnd(void)
if (gWishFutureKnock.futureSightCounter[gActiveBattler] == 0
&& gWishFutureKnock.futureSightCounter[gActiveBattler ^ BIT_FLANK] == 0)
{
- gSideStatuses[GET_BATTLER_SIDE(gBattlerTarget)] &= ~(SIDE_STATUS_FUTUREATTACK);
+ gSideStatuses[GET_BATTLER_SIDE(gBattlerTarget)] &= ~SIDE_STATUS_FUTUREATTACK;
}
return TRUE;
}
@@ -1934,7 +1942,10 @@ bool8 HandleFaintedMonActions(void)
gBattleStruct->faintedActionsState = 4;
break;
case 6:
- if (AbilityBattleEffects(ABILITYEFFECT_INTIMIDATE1, 0, 0, 0, 0) || AbilityBattleEffects(ABILITYEFFECT_TRACE, 0, 0, 0, 0) || ItemBattleEffects(1, 0, TRUE) || AbilityBattleEffects(ABILITYEFFECT_FORECAST, 0, 0, 0, 0))
+ if (AbilityBattleEffects(ABILITYEFFECT_INTIMIDATE1, 0, 0, 0, 0)
+ || AbilityBattleEffects(ABILITYEFFECT_TRACE, 0, 0, 0, 0)
+ || ItemBattleEffects(ITEMEFFECT_NORMAL, 0, TRUE)
+ || AbilityBattleEffects(ABILITYEFFECT_FORECAST, 0, 0, 0, 0))
return TRUE;
gBattleStruct->faintedActionsState++;
break;
@@ -1951,7 +1962,7 @@ void TryClearRageStatuses(void)
for (i = 0; i < gBattlersCount; i++)
{
if ((gBattleMons[i].status2 & STATUS2_RAGE) && gChosenMoveByBattler[i] != MOVE_RAGE)
- gBattleMons[i].status2 &= ~(STATUS2_RAGE);
+ gBattleMons[i].status2 &= ~STATUS2_RAGE;
}
}
@@ -1983,8 +1994,8 @@ u8 AtkCanceller_UnableToUseMove(void)
switch (gBattleStruct->atkCancellerTracker)
{
case CANCELLER_FLAGS: // flags clear
- gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_DESTINY_BOND);
- gStatuses3[gBattlerAttacker] &= ~(STATUS3_GRUDGE);
+ gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_DESTINY_BOND;
+ gStatuses3[gBattlerAttacker] &= ~STATUS3_GRUDGE;
gBattleStruct->atkCancellerTracker++;
break;
case CANCELLER_ASLEEP: // check being asleep
@@ -1992,8 +2003,8 @@ u8 AtkCanceller_UnableToUseMove(void)
{
if (UproarWakeUpCheck(gBattlerAttacker))
{
- gBattleMons[gBattlerAttacker].status1 &= ~(STATUS1_SLEEP);
- gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP;
+ gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE;
BattleScriptPushCursor();
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP_UPROAR;
gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp;
@@ -2007,7 +2018,7 @@ u8 AtkCanceller_UnableToUseMove(void)
else
toSub = 1;
if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) < toSub)
- gBattleMons[gBattlerAttacker].status1 &= ~(STATUS1_SLEEP);
+ gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_SLEEP;
else
gBattleMons[gBattlerAttacker].status1 -= toSub;
if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP)
@@ -2021,7 +2032,7 @@ u8 AtkCanceller_UnableToUseMove(void)
}
else
{
- gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_NIGHTMARE;
BattleScriptPushCursor();
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP;
gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp;
@@ -2049,7 +2060,7 @@ u8 AtkCanceller_UnableToUseMove(void)
}
else // unfreeze
{
- gBattleMons[gBattlerAttacker].status1 &= ~(STATUS1_FREEZE);
+ gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_FREEZE;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze;
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED;
@@ -2073,7 +2084,7 @@ u8 AtkCanceller_UnableToUseMove(void)
case CANCELLER_RECHARGE: // recharge
if (gBattleMons[gBattlerAttacker].status2 & STATUS2_RECHARGE)
{
- gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_RECHARGE);
+ gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_RECHARGE;
gDisableStructs[gBattlerAttacker].rechargeTimer = 0;
CancelMultiTurnMoves(gBattlerAttacker);
gBattlescriptCurrInstr = BattleScript_MoveUsedMustRecharge;
@@ -2085,7 +2096,7 @@ u8 AtkCanceller_UnableToUseMove(void)
case CANCELLER_FLINCH: // flinch
if (gBattleMons[gBattlerAttacker].status2 & STATUS2_FLINCHED)
{
- gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_FLINCHED);
+ gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_FLINCHED;
gProtectStructs[gBattlerAttacker].flinchImmobility = 1;
CancelMultiTurnMoves(gBattlerAttacker);
gBattlescriptCurrInstr = BattleScript_MoveUsedFlinched;
@@ -2203,14 +2214,14 @@ u8 AtkCanceller_UnableToUseMove(void)
else
{
// This is removed in Emerald for some reason
- //gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_MULTIPLETURNS);
+ //gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_MULTIPLETURNS;
if (gTakenDmg[gBattlerAttacker])
{
gCurrentMove = MOVE_BIDE;
*bideDmg = gTakenDmg[gBattlerAttacker] * 2;
gBattlerTarget = gTakenDmgByBattler[gBattlerAttacker];
if (gAbsentBattlerFlags & gBitTable[gBattlerTarget])
- gBattlerTarget = GetMoveTarget(MOVE_BIDE, 1);
+ gBattlerTarget = GetMoveTarget(MOVE_BIDE, MOVE_TARGET_SELECTED + 1);
gBattlescriptCurrInstr = BattleScript_BideAttack;
}
else
@@ -2227,7 +2238,7 @@ u8 AtkCanceller_UnableToUseMove(void)
{
if (gBattleMoves[gCurrentMove].effect == EFFECT_THAW_HIT)
{
- gBattleMons[gBattlerAttacker].status1 &= ~(STATUS1_FREEZE);
+ gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_FREEZE;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze;
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED_BY_MOVE;
@@ -2268,14 +2279,14 @@ bool8 HasNoMonsToSwitch(u8 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2)
party = gEnemyParty;
id1 = ((battler & BIT_FLANK) / 2);
- for (i = id1 * 3; i < id1 * 3 + 3; i++)
+ for (i = id1 * MULTI_PARTY_SIZE; i < id1 * MULTI_PARTY_SIZE + MULTI_PARTY_SIZE; 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)
break;
}
- return (i == id1 * 3 + 3);
+ return (i == id1 * MULTI_PARTY_SIZE + MULTI_PARTY_SIZE);
}
else if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
@@ -2308,14 +2319,14 @@ bool8 HasNoMonsToSwitch(u8 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2)
id1 = GetLinkTrainerFlankId(id2);
}
- for (i = id1 * 3; i < id1 * 3 + 3; i++)
+ for (i = id1 * MULTI_PARTY_SIZE; i < id1 * MULTI_PARTY_SIZE + MULTI_PARTY_SIZE; 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)
break;
}
- return (i == id1 * 3 + 3);
+ return (i == id1 * MULTI_PARTY_SIZE + MULTI_PARTY_SIZE);
}
else if ((gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) && GetBattlerSide(battler) == B_SIDE_OPPONENT)
{
@@ -2324,9 +2335,9 @@ bool8 HasNoMonsToSwitch(u8 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2)
if (battler == 1)
id1 = 0;
else
- id1 = 3;
+ id1 = MULTI_PARTY_SIZE;
- for (i = id1; i < id1 + 3; i++)
+ for (i = id1; i < id1 + MULTI_PARTY_SIZE; i++)
{
if (GetMonData(&party[i], MON_DATA_HP) != 0
&& GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_NONE
@@ -2368,51 +2379,41 @@ bool8 HasNoMonsToSwitch(u8 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2)
}
}
-enum
-{
- CASTFORM_NO_CHANGE, //0
- CASTFORM_TO_NORMAL, //1
- CASTFORM_TO_FIRE, //2
- CASTFORM_TO_WATER, //3
- CASTFORM_TO_ICE, //4
-};
-
u8 CastformDataTypeChange(u8 battler)
{
u8 formChange = 0;
if (gBattleMons[battler].species != SPECIES_CASTFORM || gBattleMons[battler].ability != ABILITY_FORECAST || gBattleMons[battler].hp == 0)
- return CASTFORM_NO_CHANGE;
+ return 0; // No change
if (!WEATHER_HAS_EFFECT && !IS_BATTLER_OF_TYPE(battler, TYPE_NORMAL))
{
SET_BATTLER_TYPE(battler, TYPE_NORMAL);
- return CASTFORM_TO_NORMAL;
+ return CASTFORM_NORMAL + 1;
}
if (!WEATHER_HAS_EFFECT)
- return CASTFORM_NO_CHANGE;
+ return 0; // No change
if (!(gBattleWeather & (B_WEATHER_RAIN | B_WEATHER_SUN | B_WEATHER_HAIL)) && !IS_BATTLER_OF_TYPE(battler, TYPE_NORMAL))
{
SET_BATTLER_TYPE(battler, TYPE_NORMAL);
- formChange = CASTFORM_TO_NORMAL;
+ formChange = CASTFORM_NORMAL + 1;
}
if (gBattleWeather & B_WEATHER_SUN && !IS_BATTLER_OF_TYPE(battler, TYPE_FIRE))
{
SET_BATTLER_TYPE(battler, TYPE_FIRE);
- formChange = CASTFORM_TO_FIRE;
+ formChange = CASTFORM_FIRE + 1;
}
if (gBattleWeather & B_WEATHER_RAIN && !IS_BATTLER_OF_TYPE(battler, TYPE_WATER))
{
SET_BATTLER_TYPE(battler, TYPE_WATER);
- formChange = CASTFORM_TO_WATER;
+ formChange = CASTFORM_WATER + 1;
}
if (gBattleWeather & B_WEATHER_HAIL && !IS_BATTLER_OF_TYPE(battler, TYPE_ICE))
{
SET_BATTLER_TYPE(battler, TYPE_ICE);
- formChange = CASTFORM_TO_ICE;
+ formChange = CASTFORM_ICE + 1;
}
return formChange;
}
-// The largest function in the game, but even it could not save itself from decompiling.
u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveArg)
{
u8 effect = 0;
@@ -2550,7 +2551,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
break;
case ABILITY_FORECAST:
effect = CastformDataTypeChange(battler);
- if (effect != 0)
+ if (effect)
{
BattleScriptPushCursorAndCallback(BattleScript_CastformChange);
gBattleScripting.battler = battler;
@@ -2571,7 +2572,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
for (target1 = 0; target1 < gBattlersCount; target1++)
{
effect = CastformDataTypeChange(target1);
- if (effect != 0)
+ if (effect)
{
BattleScriptPushCursorAndCallback(BattleScript_CastformChange);
gBattleScripting.battler = target1;
@@ -2616,7 +2617,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
if (gBattleMons[battler].status1 & STATUS1_FREEZE)
StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn);
gBattleMons[battler].status1 = 0;
- gBattleMons[battler].status2 &= ~(STATUS2_NIGHTMARE); // fix nightmare glitch
+ gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; // fix nightmare glitch
gBattleScripting.battler = gActiveBattler = battler;
BattleScriptPushCursorAndCallback(BattleScript_ShedSkinActivates);
BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1);
@@ -2884,7 +2885,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
case ABILITY_VITAL_SPIRIT:
if (gBattleMons[battler].status1 & STATUS1_SLEEP)
{
- gBattleMons[battler].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE;
StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn);
effect = 1;
}
@@ -2919,10 +2920,10 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
gBattleMons[battler].status1 = 0;
break;
case 2: // get rid of confusion
- gBattleMons[battler].status2 &= ~(STATUS2_CONFUSION);
+ gBattleMons[battler].status2 &= ~STATUS2_CONFUSION;
break;
case 3: // get rid of infatuation
- gBattleMons[battler].status2 &= ~(STATUS2_INFATUATION);
+ gBattleMons[battler].status2 &= ~STATUS2_INFATUATION;
break;
}
@@ -2955,7 +2956,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
case ABILITYEFFECT_SYNCHRONIZE: // 7
if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT))
{
- gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT);
+ gHitMarker &= ~HITMARKER_SYNCHRONISE_EFFECT;
gBattleStruct->synchronizeMoveEffect &= ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN);
if (gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC)
gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON;
@@ -2971,7 +2972,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
case ABILITYEFFECT_ATK_SYNCHRONIZE: // 8
if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT))
{
- gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT);
+ gHitMarker &= ~HITMARKER_SYNCHRONISE_EFFECT;
gBattleStruct->synchronizeMoveEffect &= ~(MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN);
if (gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC)
gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON;
@@ -2990,7 +2991,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
if (gBattleMons[i].ability == ABILITY_INTIMIDATE && gStatuses3[i] & STATUS3_INTIMIDATE_POKES)
{
gLastUsedAbility = ABILITY_INTIMIDATE;
- gStatuses3[i] &= ~(STATUS3_INTIMIDATE_POKES);
+ gStatuses3[i] &= ~STATUS3_INTIMIDATE_POKES;
BattleScriptPushCursorAndCallback(BattleScript_IntimidateActivatesEnd3);
gBattleStruct->intimidateBattler = i;
effect++;
@@ -3045,7 +3046,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
if (effect)
{
BattleScriptPushCursorAndCallback(BattleScript_TraceActivates);
- gStatuses3[i] &= ~(STATUS3_TRACE);
+ gStatuses3[i] &= ~STATUS3_TRACE;
gBattleScripting.battler = i;
PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gActiveBattler, gBattlerPartyIndexes[gActiveBattler])
@@ -3061,7 +3062,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
if (gBattleMons[i].ability == ABILITY_INTIMIDATE && (gStatuses3[i] & STATUS3_INTIMIDATE_POKES))
{
gLastUsedAbility = ABILITY_INTIMIDATE;
- gStatuses3[i] &= ~(STATUS3_INTIMIDATE_POKES);
+ gStatuses3[i] &= ~STATUS3_INTIMIDATE_POKES;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_IntimidateActivates;
gBattleStruct->intimidateBattler = i;
@@ -3200,14 +3201,44 @@ void BattleScriptPushCursorAndCallback(const u8 *BS_ptr)
enum
{
- ITEM_NO_EFFECT, // 0
- ITEM_STATUS_CHANGE, // 1
- ITEM_EFFECT_OTHER, // 2
- ITEM_PP_CHANGE, // 3
- ITEM_HP_CHANGE, // 4
- ITEM_STATS_CHANGE, // 5
+ ITEM_NO_EFFECT,
+ ITEM_STATUS_CHANGE,
+ ITEM_EFFECT_OTHER,
+ ITEM_PP_CHANGE,
+ ITEM_HP_CHANGE,
+ ITEM_STATS_CHANGE,
};
+#define TRY_EAT_CONFUSE_BERRY(flavor) \
+ if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn) \
+ { \
+ PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, flavor); \
+ gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam; \
+ if (gBattleMoveDamage == 0) \
+ gBattleMoveDamage = 1; \
+ if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP) \
+ gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp; \
+ gBattleMoveDamage *= -1; \
+ if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, flavor) < 0) \
+ BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); \
+ else \
+ BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); \
+ effect = ITEM_HP_CHANGE; \
+ }
+
+#define TRY_EAT_STAT_UP_BERRY(stat) \
+ if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam \
+ && !moveTurn && gBattleMons[battlerId].statStages[stat] < MAX_STAT_STAGE) \
+ { \
+ PREPARE_STAT_BUFFER(gBattleTextBuff1, stat); \
+ gEffectBattler = battlerId; \
+ SET_STATCHANGER(stat, 1, FALSE); \
+ gBattleScripting.animArg1 = 14 + (stat); \
+ gBattleScripting.animArg2 = 0; \
+ BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); \
+ effect = ITEM_STATS_CHANGE; \
+ }
+
u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
{
int i = 0;
@@ -3282,7 +3313,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
break;
}
break;
- case 1:
+ case ITEMEFFECT_NORMAL:
if (gBattleMons[battlerId].hp)
{
switch (battlerHoldEffect)
@@ -3295,7 +3326,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp;
gBattleMoveDamage *= -1;
BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem);
- effect = 4;
+ effect = ITEM_HP_CHANGE;
}
break;
case HOLD_EFFECT_RESTORE_PP:
@@ -3365,105 +3396,27 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
RecordItemEffectBattle(battlerId, battlerHoldEffect);
}
break;
- // nice copy/paste there gamefreak, making a function for confuse berries was too much eh?
case HOLD_EFFECT_CONFUSE_SPICY:
- if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn)
- {
- PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_SPICY);
-
- gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam;
- if (gBattleMoveDamage == 0)
- gBattleMoveDamage = 1;
- if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP)
- gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp;
- gBattleMoveDamage *= -1;
- if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, FLAVOR_SPICY) < 0)
- BattleScriptExecute(BattleScript_BerryConfuseHealEnd2);
- else
- BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem);
- effect = ITEM_HP_CHANGE;
- }
+ TRY_EAT_CONFUSE_BERRY(FLAVOR_SPICY);
break;
case HOLD_EFFECT_CONFUSE_DRY:
- if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn)
- {
- PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_DRY);
-
- gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam;
- if (gBattleMoveDamage == 0)
- gBattleMoveDamage = 1;
- if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP)
- gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp;
- gBattleMoveDamage *= -1;
- if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, FLAVOR_DRY) < 0)
- BattleScriptExecute(BattleScript_BerryConfuseHealEnd2);
- else
- BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem);
- effect = ITEM_HP_CHANGE;
- }
+ TRY_EAT_CONFUSE_BERRY(FLAVOR_DRY);
break;
case HOLD_EFFECT_CONFUSE_SWEET:
- if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn)
- {
- PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_SWEET);
-
- gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam;
- if (gBattleMoveDamage == 0)
- gBattleMoveDamage = 1;
- if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP)
- gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp;
- gBattleMoveDamage *= -1;
- if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, FLAVOR_SWEET) < 0)
- BattleScriptExecute(BattleScript_BerryConfuseHealEnd2);
- else
- BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem);
- effect = ITEM_HP_CHANGE;
- }
+ TRY_EAT_CONFUSE_BERRY(FLAVOR_SWEET);
break;
case HOLD_EFFECT_CONFUSE_BITTER:
- if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn)
- {
- PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_BITTER);
-
- gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam;
- if (gBattleMoveDamage == 0)
- gBattleMoveDamage = 1;
- if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP)
- gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp;
- gBattleMoveDamage *= -1;
- if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, FLAVOR_BITTER) < 0)
- BattleScriptExecute(BattleScript_BerryConfuseHealEnd2);
- else
- BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem);
- effect = ITEM_HP_CHANGE;
- }
+ TRY_EAT_CONFUSE_BERRY(FLAVOR_BITTER);
break;
case HOLD_EFFECT_CONFUSE_SOUR:
- if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn)
- {
- PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_SOUR);
-
- gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam;
- if (gBattleMoveDamage == 0)
- gBattleMoveDamage = 1;
- if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP)
- gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp;
- gBattleMoveDamage *= -1;
- if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, FLAVOR_SOUR) < 0)
- BattleScriptExecute(BattleScript_BerryConfuseHealEnd2);
- else
- BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem);
- effect = ITEM_HP_CHANGE;
- }
+ TRY_EAT_CONFUSE_BERRY(FLAVOR_SOUR);
break;
- // copy/paste again, smh
case HOLD_EFFECT_ATTACK_UP:
if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam
- && !moveTurn && gBattleMons[battlerId].statStages[STAT_ATK] < MAX_STAT_STAGE)
+ && !moveTurn && gBattleMons[battlerId].statStages[STAT_ATK] < MAX_STAT_STAGE)
{
PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK);
- PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATROSE);
-
+ PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATROSE); // Only the Attack stat-up berry has this
gEffectBattler = battlerId;
SET_STATCHANGER(STAT_ATK, 1, FALSE);
gBattleScripting.animArg1 = 14 + STAT_ATK;
@@ -3473,60 +3426,16 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
}
break;
case HOLD_EFFECT_DEFENSE_UP:
- if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn
- && gBattleMons[battlerId].statStages[STAT_DEF] < MAX_STAT_STAGE)
- {
- PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_DEF);
-
- gEffectBattler = battlerId;
- SET_STATCHANGER(STAT_DEF, 1, FALSE);
- gBattleScripting.animArg1 = 14 + STAT_DEF;
- gBattleScripting.animArg2 = 0;
- BattleScriptExecute(BattleScript_BerryStatRaiseEnd2);
- effect = ITEM_STATS_CHANGE;
- }
+ TRY_EAT_STAT_UP_BERRY(STAT_DEF);
break;
case HOLD_EFFECT_SPEED_UP:
- if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn
- && gBattleMons[battlerId].statStages[STAT_SPEED] < MAX_STAT_STAGE)
- {
- PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPEED);
-
- gEffectBattler = battlerId;
- SET_STATCHANGER(STAT_SPEED, 1, FALSE);
- gBattleScripting.animArg1 = 14 + STAT_SPEED;
- gBattleScripting.animArg2 = 0;
- BattleScriptExecute(BattleScript_BerryStatRaiseEnd2);
- effect = ITEM_STATS_CHANGE;
- }
+ TRY_EAT_STAT_UP_BERRY(STAT_SPEED);
break;
case HOLD_EFFECT_SP_ATTACK_UP:
- if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn
- && gBattleMons[battlerId].statStages[STAT_SPATK] < MAX_STAT_STAGE)
- {
- PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPATK);
-
- gEffectBattler = battlerId;
- SET_STATCHANGER(STAT_SPATK, 1, FALSE);
- gBattleScripting.animArg1 = 14 + STAT_SPATK;
- gBattleScripting.animArg2 = 0;
- BattleScriptExecute(BattleScript_BerryStatRaiseEnd2);
- effect = ITEM_STATS_CHANGE;
- }
+ TRY_EAT_STAT_UP_BERRY(STAT_SPATK);
break;
case HOLD_EFFECT_SP_DEFENSE_UP:
- if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn
- && gBattleMons[battlerId].statStages[STAT_SPDEF] < MAX_STAT_STAGE)
- {
- PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPDEF);
-
- gEffectBattler = battlerId;
- SET_STATCHANGER(STAT_SPDEF, 1, FALSE);
- gBattleScripting.animArg1 = 14 + STAT_SPDEF;
- gBattleScripting.animArg2 = 0;
- BattleScriptExecute(BattleScript_BerryStatRaiseEnd2);
- effect = ITEM_STATS_CHANGE;
- }
+ TRY_EAT_STAT_UP_BERRY(STAT_SPDEF);
break;
case HOLD_EFFECT_CRITICAL_UP:
if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn
@@ -3540,16 +3449,16 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
case HOLD_EFFECT_RANDOM_STAT_UP:
if (!moveTurn && gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam)
{
- for (i = 0; i < 5; i++)
+ for (i = 0; i < NUM_STATS - 1; i++)
{
if (gBattleMons[battlerId].statStages[STAT_ATK + i] < MAX_STAT_STAGE)
break;
}
- if (i != 5)
+ if (i != NUM_STATS - 1)
{
do
{
- i = Random() % 5;
+ i = Random() % (NUM_STATS - 1);
} while (gBattleMons[battlerId].statStages[STAT_ATK + i] == MAX_STAT_STAGE);
PREPARE_STAT_BUFFER(gBattleTextBuff1, i + 1);
@@ -3575,7 +3484,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
case HOLD_EFFECT_CURE_PAR:
if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS)
{
- gBattleMons[battlerId].status1 &= ~(STATUS1_PARALYSIS);
+ gBattleMons[battlerId].status1 &= ~STATUS1_PARALYSIS;
BattleScriptExecute(BattleScript_BerryCurePrlzEnd2);
effect = ITEM_STATUS_CHANGE;
}
@@ -3591,7 +3500,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
case HOLD_EFFECT_CURE_BRN:
if (gBattleMons[battlerId].status1 & STATUS1_BURN)
{
- gBattleMons[battlerId].status1 &= ~(STATUS1_BURN);
+ gBattleMons[battlerId].status1 &= ~STATUS1_BURN;
BattleScriptExecute(BattleScript_BerryCureBrnEnd2);
effect = ITEM_STATUS_CHANGE;
}
@@ -3599,7 +3508,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
case HOLD_EFFECT_CURE_FRZ:
if (gBattleMons[battlerId].status1 & STATUS1_FREEZE)
{
- gBattleMons[battlerId].status1 &= ~(STATUS1_FREEZE);
+ gBattleMons[battlerId].status1 &= ~STATUS1_FREEZE;
BattleScriptExecute(BattleScript_BerryCureFrzEnd2);
effect = ITEM_STATUS_CHANGE;
}
@@ -3607,8 +3516,8 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
case HOLD_EFFECT_CURE_SLP:
if (gBattleMons[battlerId].status1 & STATUS1_SLEEP)
{
- gBattleMons[battlerId].status1 &= ~(STATUS1_SLEEP);
- gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleMons[battlerId].status1 &= ~STATUS1_SLEEP;
+ gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE;
BattleScriptExecute(BattleScript_BerryCureSlpEnd2);
effect = ITEM_STATUS_CHANGE;
}
@@ -3616,7 +3525,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
case HOLD_EFFECT_CURE_CONFUSION:
if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION)
{
- gBattleMons[battlerId].status2 &= ~(STATUS2_CONFUSION);
+ gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION;
BattleScriptExecute(BattleScript_BerryCureConfusionEnd2);
effect = ITEM_EFFECT_OTHER;
}
@@ -3632,7 +3541,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
}
if (gBattleMons[battlerId].status1 & STATUS1_SLEEP)
{
- gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE;
StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn);
i++;
}
@@ -3656,12 +3565,12 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn);
i++;
}
- if (!(i > 1))
+ if (i <= 1)
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM;
else
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_NORMALIZED_STATUS;
gBattleMons[battlerId].status1 = 0;
- gBattleMons[battlerId].status2 &= ~(STATUS2_CONFUSION);
+ gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION;
BattleScriptExecute(BattleScript_BerryCureChosenStatusEnd2);
effect = ITEM_STATUS_CHANGE;
}
@@ -3669,7 +3578,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
case HOLD_EFFECT_CURE_ATTRACT:
if (gBattleMons[battlerId].status2 & STATUS2_INFATUATION)
{
- gBattleMons[battlerId].status2 &= ~(STATUS2_INFATUATION);
+ gBattleMons[battlerId].status2 &= ~STATUS2_INFATUATION;
StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn);
BattleScriptExecute(BattleScript_BerryCureChosenStatusEnd2);
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM;
@@ -3696,7 +3605,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
}
}
break;
- case 2:
+ case ITEMEFFECT_DUMMY:
break;
case ITEMEFFECT_MOVE_END:
for (battlerId = 0; battlerId < gBattlersCount; battlerId++)
@@ -3717,7 +3626,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
case HOLD_EFFECT_CURE_PAR:
if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS)
{
- gBattleMons[battlerId].status1 &= ~(STATUS1_PARALYSIS);
+ gBattleMons[battlerId].status1 &= ~STATUS1_PARALYSIS;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_BerryCureParRet;
effect = ITEM_STATUS_CHANGE;
@@ -3735,7 +3644,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
case HOLD_EFFECT_CURE_BRN:
if (gBattleMons[battlerId].status1 & STATUS1_BURN)
{
- gBattleMons[battlerId].status1 &= ~(STATUS1_BURN);
+ gBattleMons[battlerId].status1 &= ~STATUS1_BURN;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_BerryCureBrnRet;
effect = ITEM_STATUS_CHANGE;
@@ -3744,7 +3653,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
case HOLD_EFFECT_CURE_FRZ:
if (gBattleMons[battlerId].status1 & STATUS1_FREEZE)
{
- gBattleMons[battlerId].status1 &= ~(STATUS1_FREEZE);
+ gBattleMons[battlerId].status1 &= ~STATUS1_FREEZE;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_BerryCureFrzRet;
effect = ITEM_STATUS_CHANGE;
@@ -3753,8 +3662,8 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
case HOLD_EFFECT_CURE_SLP:
if (gBattleMons[battlerId].status1 & STATUS1_SLEEP)
{
- gBattleMons[battlerId].status1 &= ~(STATUS1_SLEEP);
- gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleMons[battlerId].status1 &= ~STATUS1_SLEEP;
+ gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_BerryCureSlpRet;
effect = ITEM_STATUS_CHANGE;
@@ -3763,7 +3672,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
case HOLD_EFFECT_CURE_CONFUSION:
if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION)
{
- gBattleMons[battlerId].status2 &= ~(STATUS2_CONFUSION);
+ gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_BerryCureConfusionRet;
effect = ITEM_EFFECT_OTHER;
@@ -3772,7 +3681,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
case HOLD_EFFECT_CURE_ATTRACT:
if (gBattleMons[battlerId].status2 & STATUS2_INFATUATION)
{
- gBattleMons[battlerId].status2 &= ~(STATUS2_INFATUATION);
+ gBattleMons[battlerId].status2 &= ~STATUS2_INFATUATION;
StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn);
BattleScriptPushCursor();
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM;
@@ -3784,32 +3693,28 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
if (gBattleMons[battlerId].status1 & STATUS1_ANY || gBattleMons[battlerId].status2 & STATUS2_CONFUSION)
{
if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY)
- {
StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn);
- }
+
if (gBattleMons[battlerId].status1 & STATUS1_SLEEP)
{
- gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE);
+ gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE;
StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn);
}
+
if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS)
- {
StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn);
- }
+
if (gBattleMons[battlerId].status1 & STATUS1_BURN)
- {
StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn);
- }
+
if (gBattleMons[battlerId].status1 & STATUS1_FREEZE)
- {
StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn);
- }
+
if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION)
- {
StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn);
- }
+
gBattleMons[battlerId].status1 = 0;
- gBattleMons[battlerId].status2 &= ~(STATUS2_CONFUSION);
+ gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION;
BattleScriptPushCursor();
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM;
gBattlescriptCurrInstr = BattleScript_BerryCureChosenStatusRet;
@@ -3895,8 +3800,8 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
void ClearFuryCutterDestinyBondGrudge(u8 battlerId)
{
gDisableStructs[battlerId].furyCutterCounter = 0;
- gBattleMons[battlerId].status2 &= ~(STATUS2_DESTINY_BOND);
- gStatuses3[battlerId] &= ~(STATUS3_GRUDGE);
+ gBattleMons[battlerId].status2 &= ~STATUS2_DESTINY_BOND;
+ gStatuses3[battlerId] &= ~STATUS3_GRUDGE;
}
void HandleAction_RunBattleScript(void) // identical to RunBattleScriptCommands
@@ -3911,7 +3816,7 @@ u8 GetMoveTarget(u16 move, u8 setTarget)
u8 moveTarget;
u8 side;
- if (setTarget)
+ if (setTarget != NO_TARGET_OVERRIDE)
moveTarget = setTarget - 1;
else
moveTarget = gBattleMoves[move].target;
@@ -4037,7 +3942,7 @@ u8 IsMonDisobedient(void)
// is not obedient
if (gCurrentMove == MOVE_RAGE)
- gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_RAGE);
+ gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_RAGE;
if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP && (gCurrentMove == MOVE_SNORE || gCurrentMove == MOVE_SLEEP_TALK))
{
gBattlescriptCurrInstr = BattleScript_IgnoresWhileAsleep;
@@ -4048,7 +3953,7 @@ u8 IsMonDisobedient(void)
calc = (gBattleMons[gBattlerAttacker].level + obedienceLevel) * rnd >> 8;
if (calc < obedienceLevel)
{
- calc = CheckMoveLimitations(gBattlerAttacker, gBitTable[gCurrMovePos], 0xFF);
+ calc = CheckMoveLimitations(gBattlerAttacker, gBitTable[gCurrMovePos], MOVE_LIMITATIONS_ALL);
if (calc == 0xF) // all moves cannot be used
{
// Randomly select, then print a disobedient string
@@ -4066,7 +3971,7 @@ u8 IsMonDisobedient(void)
gCalledMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos];
gBattlescriptCurrInstr = BattleScript_IgnoresAndUsesRandomMove;
- gBattlerTarget = GetMoveTarget(gCalledMove, 0);
+ gBattlerTarget = GetMoveTarget(gCalledMove, NO_TARGET_OVERRIDE);
gHitMarker |= HITMARKER_DISOBEDIENT_MOVE;
return 2;
}
diff --git a/src/battle_util2.c b/src/battle_util2.c
index 3838f22bb..794b4f36a 100644
--- a/src/battle_util2.c
+++ b/src/battle_util2.c
@@ -34,8 +34,8 @@ void AllocateBattleResources(void)
gLinkBattleSendBuffer = AllocZeroed(BATTLE_BUFFER_LINK_SIZE);
gLinkBattleRecvBuffer = AllocZeroed(BATTLE_BUFFER_LINK_SIZE);
- gUnknown_0202305C = AllocZeroed(0x2000);
- gUnknown_02023060 = AllocZeroed(0x1000);
+ gBattleAnimBgTileBuffer = AllocZeroed(0x2000);
+ gBattleAnimBgTilemapBuffer = AllocZeroed(0x1000);
if (gBattleTypeFlags & BATTLE_TYPE_SECRET_BASE)
{
@@ -66,8 +66,8 @@ void FreeBattleResources(void)
FREE_AND_SET_NULL(gLinkBattleSendBuffer);
FREE_AND_SET_NULL(gLinkBattleRecvBuffer);
- FREE_AND_SET_NULL(gUnknown_0202305C);
- FREE_AND_SET_NULL(gUnknown_02023060);
+ FREE_AND_SET_NULL(gBattleAnimBgTileBuffer);
+ FREE_AND_SET_NULL(gBattleAnimBgTilemapBuffer);
}
}
diff --git a/src/contest.c b/src/contest.c
index a87e8f28b..3b700c6b9 100644
--- a/src/contest.c
+++ b/src/contest.c
@@ -1136,9 +1136,9 @@ static void AllocContestResources(void)
gContestResources->contestBgTilemaps[3] = AllocZeroed(0x1000);
gContestResources->boxBlinkTiles1 = AllocZeroed(0x800);
gContestResources->boxBlinkTiles2 = AllocZeroed(0x800);
- gContestResources->field_3c = AllocZeroed(0x2000);
- gUnknown_0202305C = gContestResources->field_3c;
- gUnknown_02023060 = gContestResources->contestBgTilemaps[1];
+ gContestResources->animBgTileBuffer = AllocZeroed(0x2000);
+ gBattleAnimBgTileBuffer = gContestResources->animBgTileBuffer;
+ gBattleAnimBgTilemapBuffer = gContestResources->contestBgTilemaps[1];
}
static void FreeContestResources(void)
@@ -1158,10 +1158,10 @@ static void FreeContestResources(void)
FREE_AND_SET_NULL(gContestResources->contestBgTilemaps[3]);
FREE_AND_SET_NULL(gContestResources->boxBlinkTiles1);
FREE_AND_SET_NULL(gContestResources->boxBlinkTiles2);
- FREE_AND_SET_NULL(gContestResources->field_3c);
+ FREE_AND_SET_NULL(gContestResources->animBgTileBuffer);
FREE_AND_SET_NULL(gContestResources);
- gUnknown_0202305C = NULL;
- gUnknown_02023060 = NULL;
+ gBattleAnimBgTileBuffer = NULL;
+ gBattleAnimBgTilemapBuffer = NULL;
}
void CB2_StartContest(void)
diff --git a/src/data/text/match_call_messages.h b/src/data/text/match_call_messages.h
index c86329ee2..22790c5fb 100644
--- a/src/data/text/match_call_messages.h
+++ b/src/data/text/match_call_messages.h
@@ -454,7 +454,7 @@ const u8 *const gMatchCallFlavorTexts[REMATCH_TABLE_ENTRIES][CHECK_PAGE_ENTRY_CO
[REMATCH_TRENT] = MCFLAVOR(Hiker_Trent),
[REMATCH_SAWYER] = MCFLAVOR(Hiker_Sawyer),
[REMATCH_KIRA_AND_DAN] = MCFLAVOR(YoungCouple_LoisAndHal),
- [REMATCH_WALLY_3] = MCFLAVOR(PkmnTrainer_Wally),
+ [REMATCH_WALLY_VR] = MCFLAVOR(PkmnTrainer_Wally),
[REMATCH_ROXANNE] = MCFLAVOR(RockinWhiz_Roxanne),
[REMATCH_BRAWLY] = MCFLAVOR(TheBigHit_Brawly),
[REMATCH_WATTSON] = MCFLAVOR(SwellShock_Wattson),
diff --git a/src/party_menu.c b/src/party_menu.c
index 5711c3055..a55d397d2 100755
--- a/src/party_menu.c
+++ b/src/party_menu.c
@@ -944,7 +944,7 @@ static void DisplayPartyPokemonDataToTeachMove(u8 slot, u16 item, u8 tutor)
static void DisplayPartyPokemonDataForMultiBattle(u8 slot)
{
struct PartyMenuBox *menuBox = &sPartyMenuBoxes[slot];
- u8 actualSlot = slot - (3);
+ u8 actualSlot = slot - MULTI_PARTY_SIZE;
if (gMultiPartnerParty[actualSlot].species == SPECIES_NONE)
{
@@ -6103,7 +6103,7 @@ static void SlideMultiPartyMenuBoxSpritesOneStep(u8 taskId)
s16 *data = gTasks[taskId].data;
u8 i;
- for (i = 3; i < PARTY_SIZE; i++)
+ for (i = MULTI_PARTY_SIZE; i < PARTY_SIZE; i++)
{
if (gMultiPartnerParty[i - MULTI_PARTY_SIZE].species != SPECIES_NONE)
{
diff --git a/src/pokeball.c b/src/pokeball.c
index 52d47b534..3d5d664e1 100644
--- a/src/pokeball.c
+++ b/src/pokeball.c
@@ -801,9 +801,9 @@ static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite)
StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[sprite->sBattler]], BATTLER_AFFINE_EMERGE);
if (GetBattlerSide(sprite->sBattler) == B_SIDE_OPPONENT)
- gSprites[gBattlerSpriteIds[sprite->sBattler]].callback = SpriteCb_OpponentMonFromBall;
+ gSprites[gBattlerSpriteIds[sprite->sBattler]].callback = SpriteCB_OpponentMonFromBall;
else
- gSprites[gBattlerSpriteIds[sprite->sBattler]].callback = SpriteCb_PlayerMonFromBall;
+ gSprites[gBattlerSpriteIds[sprite->sBattler]].callback = SpriteCB_PlayerMonFromBall;
AnimateSprite(&gSprites[gBattlerSpriteIds[sprite->sBattler]]);
gSprites[gBattlerSpriteIds[sprite->sBattler]].data[1] = 0x1000;
diff --git a/src/pokemon.c b/src/pokemon.c
index 62c444121..06a7a01f1 100644
--- a/src/pokemon.c
+++ b/src/pokemon.c
@@ -38,6 +38,7 @@
#include "constants/abilities.h"
#include "constants/battle_frontier.h"
#include "constants/battle_move_effects.h"
+#include "constants/battle_script_commands.h"
#include "constants/hold_effects.h"
#include "constants/item_effects.h"
#include "constants/items.h"
@@ -3103,7 +3104,7 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de
if (!typeOverride)
type = gBattleMoves[move].type;
else
- type = typeOverride & 0x3F;
+ type = typeOverride & DYNAMIC_TYPE_MASK;
attack = attacker->attack;
defense = defender->defense;
diff --git a/src/pokenav_match_call_data.c b/src/pokenav_match_call_data.c
index 46ce43d4c..29dd62621 100644
--- a/src/pokenav_match_call_data.c
+++ b/src/pokenav_match_call_data.c
@@ -336,7 +336,7 @@ static const struct MatchCallWally sWallyMatchCallHeader =
.type = MC_TYPE_WALLY,
.mapSec = 0,
.flag = FLAG_ENABLE_WALLY_MATCH_CALL,
- .rematchTableIdx = REMATCH_WALLY_3,
+ .rematchTableIdx = REMATCH_WALLY_VR,
.desc = gText_WallyMatchCallDesc,
.textData = sWallyTextScripts,
.locationData = sWallyLocationData
diff --git a/src/recorded_battle.c b/src/recorded_battle.c
index e29792766..69ee90210 100644
--- a/src/recorded_battle.c
+++ b/src/recorded_battle.c
@@ -65,7 +65,7 @@ struct RecordedBattleSave
u8 recordMixFriendName[PLAYER_NAME_LENGTH + 1];
u8 recordMixFriendClass;
u8 apprenticeId;
- u16 easyChatSpeech[6];
+ u16 easyChatSpeech[EASY_CHAT_BATTLE_WORDS_COUNT];
u8 recordMixFriendLanguage;
u8 apprenticeLanguage;
u8 battleRecord[MAX_BATTLERS_COUNT][BATTLER_RECORD_SIZE];
@@ -93,11 +93,11 @@ EWRAM_DATA static struct Pokemon sSavedPlayerParty[PARTY_SIZE] = {0};
EWRAM_DATA static struct Pokemon sSavedOpponentParty[PARTY_SIZE] = {0};
EWRAM_DATA static u16 sPlayerMonMoves[2][MAX_MON_MOVES] = {0};
EWRAM_DATA static struct PlayerInfo sPlayers[MAX_BATTLERS_COUNT] = {0};
-EWRAM_DATA static bool8 sUnknown_0203CCD0 = 0;
+EWRAM_DATA static bool8 sIsPlaybackFinished = 0;
EWRAM_DATA static u8 sRecordMixFriendName[PLAYER_NAME_LENGTH + 1] = {0};
EWRAM_DATA static u8 sRecordMixFriendClass = 0;
EWRAM_DATA static u8 sApprenticeId = 0;
-EWRAM_DATA static u16 sEasyChatSpeech[6] = {0};
+EWRAM_DATA static u16 sEasyChatSpeech[EASY_CHAT_BATTLE_WORDS_COUNT] = {0};
EWRAM_DATA static u8 sBattleOutcome = 0;
static u8 sRecordMixFriendLanguage;
@@ -113,7 +113,7 @@ void RecordedBattle_Init(u8 mode)
s32 i, j;
sRecordMode = mode;
- sUnknown_0203CCD0 = FALSE;
+ sIsPlaybackFinished = FALSE;
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
@@ -124,16 +124,14 @@ void RecordedBattle_Init(u8 mode)
if (mode == B_RECORD_MODE_RECORDING)
{
for (j = 0; j < BATTLER_RECORD_SIZE; j++)
- {
sBattleRecords[i][j] = 0xFF;
- }
sBattleFlags = gBattleTypeFlags;
sAI_Scripts = gBattleResources->ai->aiFlags;
}
}
}
-void sub_8184E58(void)
+void RecordedBattle_SetTrainerInfo(void)
{
s32 i, j;
@@ -150,6 +148,7 @@ void sub_8184E58(void)
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
+ // Link recorded battle, record info for all trainers
u8 linkPlayersCount;
u8 text[30];
@@ -163,6 +162,7 @@ void sub_8184E58(void)
sPlayers[i].battlerId = gLinkPlayers[i].id;
sPlayers[i].language = gLinkPlayers[i].language;
+ // Record names
if (i < linkPlayersCount)
{
StringCopy(text, gLinkPlayers[i].name);
@@ -178,10 +178,11 @@ void sub_8184E58(void)
}
else
{
+ // Local battle, just record own info
sPlayers[0].trainerId = (gSaveBlock2Ptr->playerTrainerId[0])
- | (gSaveBlock2Ptr->playerTrainerId[1] << 8)
- | (gSaveBlock2Ptr->playerTrainerId[2] << 16)
- | (gSaveBlock2Ptr->playerTrainerId[3] << 24);
+ | (gSaveBlock2Ptr->playerTrainerId[1] << 8)
+ | (gSaveBlock2Ptr->playerTrainerId[2] << 16)
+ | (gSaveBlock2Ptr->playerTrainerId[3] << 24);
sPlayers[0].gender = gSaveBlock2Ptr->playerGender;
sPlayers[0].battlerId = 0;
@@ -195,9 +196,7 @@ void sub_8184E58(void)
void RecordedBattle_SetBattlerAction(u8 battlerId, u8 action)
{
if (sBattlerRecordSizes[battlerId] < BATTLER_RECORD_SIZE && sRecordMode != B_RECORD_MODE_PLAYBACK)
- {
sBattleRecords[battlerId][sBattlerRecordSizes[battlerId]++] = action;
- }
}
void RecordedBattle_ClearBattlerAction(u8 battlerId, u8 bytesToClear)
@@ -220,7 +219,7 @@ u8 RecordedBattle_GetBattlerAction(u8 battlerId)
{
gSpecialVar_Result = gBattleOutcome = B_OUTCOME_PLAYER_TELEPORTED; // hah
ResetPaletteFadeControl();
- BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);
+ BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);
SetMainCallback2(CB2_QuitRecordedBattle);
return 0xFF;
}
@@ -249,9 +248,7 @@ u8 RecordedBattle_BufferNewBattlerData(u8 *dst)
dst[idx++] = sBattlerRecordSizes[i] - sBattlerPrevRecordSizes[i];
for (j = 0; j < sBattlerRecordSizes[i] - sBattlerPrevRecordSizes[i]; j++)
- {
dst[idx++] = sBattleRecords[i][sBattlerPrevRecordSizes[i] + j];
- }
sBattlerPrevRecordSizes[i] = sBattlerRecordSizes[i];
}
@@ -283,9 +280,7 @@ void RecordedBattle_RecordAllBattlerData(u8 *src)
u8 numActions = GetNextRecordedDataByte(src, &idx, &size);
for (i = 0; i < numActions; i++)
- {
sBattleRecords[battlerId][sBattlerSavedRecordSizes[battlerId]++] = GetNextRecordedDataByte(src, &idx, &size);
- }
}
}
}
@@ -318,7 +313,7 @@ static bool32 IsRecordedBattleSaveValid(struct RecordedBattleSave *save)
static bool32 RecordedBattleToSave(struct RecordedBattleSave *battleSave, struct RecordedBattleSave *saveSection)
{
- memset(saveSection, 0, 0x1000);
+ memset(saveSection, 0, SECTOR_SIZE);
memcpy(saveSection, battleSave, sizeof(*battleSave));
saveSection->checksum = CalcByteArraySum((void*)(saveSection), sizeof(*saveSection) - 4);
@@ -338,7 +333,7 @@ bool32 MoveRecordedBattleToSaveData(void)
saveAttempts = 0;
battleSave = AllocZeroed(sizeof(struct RecordedBattleSave));
- savSection = AllocZeroed(0x1000);
+ savSection = AllocZeroed(SECTOR_SIZE);
for (i = 0; i < PARTY_SIZE; i++)
{
@@ -349,9 +344,7 @@ bool32 MoveRecordedBattleToSaveData(void)
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
for (j = 0; j < PLAYER_NAME_LENGTH + 1; j++)
- {
battleSave->playersName[i][j] = sPlayers[i].name[j];
- }
battleSave->playersGender[i] = sPlayers[i].gender;
battleSave->playersLanguage[i] = sPlayers[i].language;
battleSave->playersBattlers[i] = sPlayers[i].battlerId;
@@ -471,12 +464,8 @@ bool32 MoveRecordedBattleToSaveData(void)
}
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
- {
for (j = 0; j < BATTLER_RECORD_SIZE; j++)
- {
battleSave->battleRecord[i][j] = sBattleRecords[i][j];
- }
- }
while (1)
{
@@ -585,29 +574,21 @@ static void SetVariablesForRecordedBattle(struct RecordedBattleSave *src)
sAI_Scripts = src->AI_scripts;
for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++)
- {
sRecordMixFriendName[i] = src->recordMixFriendName[i];
- }
sRecordMixFriendClass = src->recordMixFriendClass;
sApprenticeId = src->apprenticeId;
sRecordMixFriendLanguage = src->recordMixFriendLanguage;
sApprenticeLanguage = src->apprenticeLanguage;
- for (i = 0; i < 6; i++)
- {
+ for (i = 0; i < EASY_CHAT_BATTLE_WORDS_COUNT; i++)
sEasyChatSpeech[i] = src->easyChatSpeech[i];
- }
gSaveBlock2Ptr->frontier.lvlMode = src->lvlMode;
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
- {
for (j = 0; j < BATTLER_RECORD_SIZE; j++)
- {
sBattleRecords[i][j] = src->battleRecord[i][j];
- }
- }
}
void PlayRecordedBattle(void (*CB2_After)(void))
@@ -741,17 +722,20 @@ void sub_818603C(u8 arg0)
for (battlerId = 0; battlerId < gBattlersCount; battlerId++)
{
- if (GetBattlerSide(battlerId) != B_SIDE_OPPONENT) // player's side only
+ // Player's side only
+ if (GetBattlerSide(battlerId) != B_SIDE_OPPONENT)
{
if (arg0 == 1)
{
+ // Check if any of the battler's moves have changed
for (j = 0; j < MAX_MON_MOVES; j++)
{
if (gBattleMons[battlerId].moves[j] != sPlayerMonMoves[battlerId / 2][j])
break;
}
- if (j != MAX_MON_MOVES) // player's mon's move has been changed
+ if (j != MAX_MON_MOVES)
{
+ // At least one of the moves has been changed
RecordedBattle_SetBattlerAction(battlerId, ACTION_MOVE_CHANGE);
for (j = 0; j < MAX_MON_MOVES; j++)
{
@@ -779,9 +763,8 @@ void sub_818603C(u8 arg0)
RecordedBattle_GetBattlerAction(battlerId);
for (j = 0; j < MAX_MON_MOVES; j++)
- {
- ppBonuses[j] = ((gBattleMons[battlerId].ppBonuses & ((3 << (j << 1)))) >> (j << 1));
- }
+ ppBonuses[j] = ((gBattleMons[battlerId].ppBonuses & (3 << (j << 1))) >> (j << 1));
+
for (j = 0; j < MAX_MON_MOVES; j++)
{
array1[j] = RecordedBattle_GetBattlerAction(battlerId);
@@ -806,9 +789,8 @@ void sub_818603C(u8 arg0)
if (!(gBattleMons[battlerId].status2 & STATUS2_TRANSFORMED))
{
for (j = 0; j < MAX_MON_MOVES; j++)
- {
ppBonuses[j] = ((GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PP_BONUSES, NULL) & ((3 << (j << 1)))) >> (j << 1));
- }
+
for (j = 0; j < MAX_MON_MOVES; j++)
{
movePp.moves[j] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_MOVE1 + array1[j], NULL);
@@ -822,12 +804,10 @@ void sub_818603C(u8 arg0)
}
var = 0;
for (j = 0; j < MAX_MON_MOVES; j++)
- {
var |= (array3[j]) << (j << 1);
- }
+
SetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PP_BONUSES, &var);
}
-
gChosenMoveByBattler[battlerId] = gBattleMons[battlerId].moves[*(gBattleStruct->chosenMovePositions + battlerId)];
}
}
@@ -840,24 +820,24 @@ u32 GetAiScriptsInRecordedBattle(void)
return sAI_Scripts;
}
-void sub_8186444(void)
+// Used to determine when the player is allowed to press B to end a recorded battle's playback
+void RecordedBattle_SetPlaybackFinished(void)
{
- sUnknown_0203CCD0 = TRUE;
+ sIsPlaybackFinished = TRUE;
}
-bool8 sub_8186450(void)
+bool8 RecordedBattle_CanStopPlayback(void)
{
- return (sUnknown_0203CCD0 == FALSE);
+ return (sIsPlaybackFinished == FALSE);
}
void GetRecordedBattleRecordMixFriendName(u8 *dst)
{
s32 i;
- for (i = 0; i < 8; i++)
+ for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++)
dst[i] = sRecordMixFriendName[i];
-
- dst[7] = EOS;
+ dst[PLAYER_NAME_LENGTH] = EOS;
ConvertInternationalString(dst, sRecordMixFriendLanguage);
}