From a4235c9ff85cc54f8cc1f4a832f19e64eda74b59 Mon Sep 17 00:00:00 2001
From: DizzyEggg <jajkodizzy@wp.pl>
Date: Sun, 11 Nov 2018 18:33:16 +0100
Subject: [PATCH] Document battle arena

---
 asm/macros/battle_script.inc                  |  26 +-
 .../battle_arena_move_mind_ratings.inc        | 357 ------------
 data/battle_frontier_2.s                      |  34 --
 data/battle_scripts_1.s                       | 104 ++--
 include/battle.h                              |  12 +-
 include/battle_arena.h                        |  14 +
 include/battle_scripts.h                      |   2 +-
 include/constants/battle_script_commands.h    |   7 +
 src/battle_arena.c                            | 546 ++++++++++++++++--
 src/battle_controller_opponent.c              |   9 +-
 src/battle_controller_player.c                |  10 +-
 src/battle_interface.c                        |   4 +-
 src/battle_main.c                             |  11 +-
 src/battle_script_commands.c                  |  41 +-
 src/battle_util.c                             |   4 +-
 15 files changed, 614 insertions(+), 567 deletions(-)
 delete mode 100644 data/battle_frontier/battle_arena_move_mind_ratings.inc
 create mode 100644 include/battle_arena.h

diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc
index 927a0edd1..8ab0f3ce5 100644
--- a/asm/macros/battle_script.inc
+++ b/asm/macros/battle_script.inc
@@ -1251,20 +1251,20 @@
 	various \battler, 8
 	.endm
 	
-	.macro various9 battler
-	various \battler, 9
+	.macro arenajudgmentwindow
+	various BS_ATTACKER, VARIOUS_ARENA_JUDGMENT_WINDOW
 	.endm
 	
-	.macro various10 battler
-	various \battler, 10
+	.macro arenaopponentmonlost
+	various BS_ATTACKER, VARIOUS_ARENA_OPPONENT_MON_LOST
 	.endm
 	
-	.macro various11 battler
-	various \battler, 11
+	.macro arenaplayermonlost
+	various BS_ATTACKER, VARIOUS_ARENA_PLAYER_MON_LOST
 	.endm
 	
-	.macro various12 battler
-	various \battler, 12
+	.macro arenabothmonlost
+	various BS_ATTACKER, VARIOUS_ARENA_BOTH_MONS_LOST
 	.endm
 	
 	.macro forfeityesnobox battler
@@ -1279,12 +1279,12 @@
 	various \battler, 15
 	.endm
 	
-	.macro various16 battler
-	various \battler, 16
+	.macro arenajudmengtstring id
+	various \id, VARIOUS_ARENA_JUDGMENT_STRING
 	.endm
 	
-	.macro various17 battler
-	various \battler, 17
+	.macro arenawaitmessage id
+	various \id, VARIOUS_ARENA_WAIT_STRING
 	.endm
 	
 	.macro waitcry battler
@@ -1307,7 +1307,7 @@
 	various BS_ATTACKER, VARIOUS_VOLUME_UP
 	.endm
 	
-	.macro various23 battler
+	.macro setalreadystatusedmoveattempt battler
 	various \battler, 23
 	.endm
 	
diff --git a/data/battle_frontier/battle_arena_move_mind_ratings.inc b/data/battle_frontier/battle_arena_move_mind_ratings.inc
deleted file mode 100644
index e1d0b26a9..000000000
--- a/data/battle_frontier/battle_arena_move_mind_ratings.inc
+++ /dev/null
@@ -1,357 +0,0 @@
-	.align 2
-gBattleArenaMoveMindRatings:: @ 8611DC0
-	.byte  0 @ -
-	.byte  1 @ Pound
-	.byte  1 @ Karate Chop
-	.byte  1 @ Double Slap
-	.byte  1 @ Comet Punch
-	.byte  1 @ Mega Punch
-	.byte  1 @ Pay Day
-	.byte  1 @ Fire Punch
-	.byte  1 @ Ice Punch
-	.byte  1 @ Thunder Punch
-	.byte  1 @ Scratch
-	.byte  1 @ Vice Grip
-	.byte  1 @ Guillotine
-	.byte  1 @ Razor Wind
-	.byte  0 @ Swords Dance
-	.byte  1 @ Cut
-	.byte  1 @ Gust
-	.byte  1 @ Wing Attack
-	.byte  0 @ Whirlwind
-	.byte  1 @ Fly
-	.byte  1 @ Bind
-	.byte  1 @ Slam
-	.byte  1 @ Vine Whip
-	.byte  1 @ Stomp
-	.byte  1 @ Double Kick
-	.byte  1 @ Mega Kick
-	.byte  1 @ Jump Kick
-	.byte  1 @ Rolling Kick
-	.byte  0 @ Sand-Attack
-	.byte  1 @ Headbutt
-	.byte  1 @ Horn Attack
-	.byte  1 @ Fury Attack
-	.byte  1 @ Horn Drill
-	.byte  1 @ Tackle
-	.byte  1 @ Body Slam
-	.byte  1 @ Wrap
-	.byte  1 @ Take Down
-	.byte  1 @ Thrash
-	.byte  1 @ Double-Edge
-	.byte  0 @ Tail Whip
-	.byte  1 @ Poison Sting
-	.byte  1 @ Twineedle
-	.byte  1 @ Pin Missile
-	.byte  0 @ Leer
-	.byte  1 @ Bite
-	.byte  0 @ Growl
-	.byte  0 @ Roar
-	.byte  0 @ Sing
-	.byte  0 @ Supersonic
-	.byte  1 @ Sonic Boom
-	.byte  0 @ Disable
-	.byte  1 @ Acid
-	.byte  1 @ Ember
-	.byte  1 @ Flamethrower
-	.byte  0 @ Mist
-	.byte  1 @ Water Gun
-	.byte  1 @ Hydro Pump
-	.byte  1 @ Surf
-	.byte  1 @ Ice Beam
-	.byte  1 @ Blizzard
-	.byte  1 @ Psybeam
-	.byte  1 @ Bubble Beam
-	.byte  1 @ Aurora Beam
-	.byte  1 @ Hyper Beam
-	.byte  1 @ Peck
-	.byte  1 @ Drill Peck
-	.byte  1 @ Submission
-	.byte  1 @ Low Kick
-	.byte  0 @ Counter
-	.byte  1 @ Seismic Toss
-	.byte  1 @ Strength
-	.byte  1 @ Absorb
-	.byte  1 @ Mega Drain
-	.byte  0 @ Leech Seed
-	.byte  0 @ Growth
-	.byte  1 @ Razor Leaf
-	.byte  1 @ Solar Beam
-	.byte  0 @ Poison Powder
-	.byte  0 @ Stun Spore
-	.byte  0 @ Sleep Powder
-	.byte  1 @ Petal Dance
-	.byte  0 @ String Shot
-	.byte  1 @ Dragon Rage
-	.byte  1 @ Fire Spin
-	.byte  1 @ Thunder Shock
-	.byte  1 @ Thunderbolt
-	.byte  0 @ Thunder Wave
-	.byte  1 @ Thunder
-	.byte  1 @ Rock Throw
-	.byte  1 @ Earthquake
-	.byte  1 @ Fissure
-	.byte  1 @ Dig
-	.byte  0 @ Toxic
-	.byte  1 @ Confusion
-	.byte  1 @ Psychic
-	.byte  0 @ Hypnosis
-	.byte  0 @ Meditate
-	.byte  0 @ Agility
-	.byte  1 @ Quick Attack
-	.byte  1 @ Rage
-	.byte  0 @ Teleport
-	.byte  1 @ Night Shade
-	.byte  0 @ Mimic
-	.byte  0 @ Screech
-	.byte  0 @ Double Team
-	.byte  0 @ Recover
-	.byte  0 @ Harden
-	.byte  0 @ Minimize
-	.byte  0 @ Smokescreen
-	.byte  0 @ Confuse Ray
-	.byte  0 @ Withdraw
-	.byte  0 @ Defense Curl
-	.byte  0 @ Barrier
-	.byte  0 @ Light Screen
-	.byte  0 @ Haze
-	.byte  0 @ Reflect
-	.byte  0 @ Focus Energy
-	.byte  0 @ Bide
-	.byte  0 @ Metronome
-	.byte  0 @ Mirror Move
-	.byte  1 @ Self-Destruct
-	.byte  1 @ Egg Bomb
-	.byte  1 @ Lick
-	.byte  1 @ Smog
-	.byte  1 @ Sludge
-	.byte  1 @ Bone Club
-	.byte  1 @ Fire Blast
-	.byte  1 @ Waterfall
-	.byte  1 @ Clamp
-	.byte  1 @ Swift
-	.byte  1 @ Skull Bash
-	.byte  1 @ Spike Cannon
-	.byte  1 @ Constrict
-	.byte  0 @ Amnesia
-	.byte  0 @ Kinesis
-	.byte  0 @ Soft-Boiled
-	.byte  1 @ Hi Jump Kick
-	.byte  0 @ Glare
-	.byte  1 @ Dream Eater
-	.byte  0 @ Poison Gas
-	.byte  1 @ Barrage
-	.byte  1 @ Leech Life
-	.byte  0 @ Lovely Kiss
-	.byte  1 @ Sky Attack
-	.byte  0 @ Transform
-	.byte  1 @ Bubble
-	.byte  1 @ Dizzy Punch
-	.byte  0 @ Spore
-	.byte  0 @ Flash
-	.byte  1 @ Psywave
-	.byte  0 @ Splash
-	.byte  0 @ Acid Armor
-	.byte  1 @ Crabhammer
-	.byte  1 @ Explosion
-	.byte  1 @ Fury Swipes
-	.byte  1 @ Bonemerang
-	.byte  0 @ Rest
-	.byte  1 @ Rock Slide
-	.byte  1 @ Hyper Fang
-	.byte  0 @ Sharpen
-	.byte  0 @ Conversion
-	.byte  1 @ Tri Attack
-	.byte  1 @ Super Fang
-	.byte  1 @ Slash
-	.byte  0 @ Substitute
-	.byte  1 @ Struggle
-	.byte  0 @ Sketch
-	.byte  1 @ Triple Kick
-	.byte  1 @ Thief
-	.byte  0 @ Spider Web
-	.byte  0 @ Mind Reader
-	.byte  0 @ Nightmare
-	.byte  1 @ Flame Wheel
-	.byte  1 @ Snore
-	.byte  0 @ Curse
-	.byte  1 @ Flail
-	.byte  0 @ Conversion 2
-	.byte  1 @ Aeroblast
-	.byte  0 @ Cotton Spore
-	.byte  1 @ Reversal
-	.byte  0 @ Spite
-	.byte  1 @ Powder Snow
-	.byte -1 @ Protect
-	.byte  1 @ Mach Punch
-	.byte  0 @ Scary Face
-	.byte  1 @ Faint Attack
-	.byte  0 @ Sweet Kiss
-	.byte  0 @ Belly Drum
-	.byte  1 @ Sludge Bomb
-	.byte  1 @ Mud-Slap
-	.byte  1 @ Octazooka
-	.byte  0 @ Spikes
-	.byte  1 @ Zap Cannon
-	.byte  0 @ Foresight
-	.byte  0 @ Destiny Bond
-	.byte  0 @ Perish Song
-	.byte  1 @ Icy Wind
-	.byte -1 @ Detect
-	.byte  1 @ Bone Rush
-	.byte  0 @ Lock-On
-	.byte  1 @ Outrage
-	.byte  0 @ Sandstorm
-	.byte  1 @ Giga Drain
-	.byte -1 @ Endure
-	.byte  0 @ Charm
-	.byte  1 @ Rollout
-	.byte  1 @ False Swipe
-	.byte  0 @ Swagger
-	.byte  0 @ Milk Drink
-	.byte  1 @ Spark
-	.byte  1 @ Fury Cutter
-	.byte  1 @ Steel Wing
-	.byte  0 @ Mean Look
-	.byte  0 @ Attract
-	.byte  0 @ Sleep Talk
-	.byte  0 @ Heal Bell
-	.byte  1 @ Return
-	.byte  1 @ Present
-	.byte  1 @ Frustration
-	.byte  0 @ Safeguard
-	.byte  0 @ Pain Split
-	.byte  1 @ Sacred Fire
-	.byte  1 @ Magnitude
-	.byte  1 @ Dynamic Punch
-	.byte  1 @ Megahorn
-	.byte  1 @ Dragon Breath
-	.byte  0 @ Baton Pass
-	.byte  0 @ Encore
-	.byte  1 @ Pursuit
-	.byte  1 @ Rapid Spin
-	.byte  0 @ Sweet Scent
-	.byte  1 @ Iron Tail
-	.byte  1 @ Metal Claw
-	.byte  1 @ Vital Throw
-	.byte  0 @ Morning Sun
-	.byte  0 @ Synthesis
-	.byte  0 @ Moonlight
-	.byte  1 @ Hidden Power
-	.byte  1 @ Cross Chop
-	.byte  1 @ Twister
-	.byte  0 @ Rain Dance
-	.byte  0 @ Sunny Day
-	.byte  1 @ Crunch
-	.byte  0 @ Mirror Coat
-	.byte  0 @ Psych Up
-	.byte  1 @ Extreme Speed
-	.byte  1 @ Ancient Power
-	.byte  1 @ Shadow Ball
-	.byte  1 @ Future Sight
-	.byte  1 @ Rock Smash
-	.byte  1 @ Whirlpool
-	.byte  1 @ Beat Up
-	.byte -1 @ Fake Out
-	.byte  1 @ Uproar
-	.byte  0 @ Stockpile
-	.byte  1 @ Spit Up
-	.byte  0 @ Swallow
-	.byte  1 @ Heat Wave
-	.byte  0 @ Hail
-	.byte  0 @ Torment
-	.byte  0 @ Flatter
-	.byte  0 @ Will-O-Wisp
-	.byte  0 @ Memento
-	.byte  1 @ Facade
-	.byte  1 @ Focus Punch
-	.byte  1 @ Smelling Salt
-	.byte  0 @ Follow Me
-	.byte  0 @ Nature Power
-	.byte  0 @ Charge
-	.byte  0 @ Taunt
-	.byte  0 @ Helping Hand
-	.byte  0 @ Trick
-	.byte  0 @ Role Play
-	.byte  0 @ Wish
-	.byte  0 @ Assist
-	.byte  0 @ Ingrain
-	.byte  1 @ Superpower
-	.byte  0 @ Magic Coat
-	.byte  0 @ Recycle
-	.byte  1 @ Revenge
-	.byte  1 @ Brick Break
-	.byte  0 @ Yawn
-	.byte  1 @ Knock Off
-	.byte  1 @ Endeavor
-	.byte  1 @ Eruption
-	.byte  0 @ Skill Swap
-	.byte  0 @ Imprison
-	.byte  0 @ Refresh
-	.byte  0 @ Grudge
-	.byte  0 @ Snatch
-	.byte  1 @ Secret Power
-	.byte  1 @ Dive
-	.byte  1 @ Arm Thrust
-	.byte  0 @ Camouflage
-	.byte  0 @ Tail Glow
-	.byte  1 @ Luster Purge
-	.byte  1 @ Mist Ball
-	.byte  0 @ Feather Dance
-	.byte  0 @ Teeter Dance
-	.byte  1 @ Blaze Kick
-	.byte  0 @ Mud Sport
-	.byte  1 @ Ice Ball
-	.byte  1 @ Needle Arm
-	.byte  0 @ Slack Off
-	.byte  1 @ Hyper Voice
-	.byte  1 @ Poison Fang
-	.byte  1 @ Crush Claw
-	.byte  1 @ Blast Burn
-	.byte  1 @ Hydro Cannon
-	.byte  1 @ Meteor Mash
-	.byte  1 @ Astonish
-	.byte  1 @ Weather Ball
-	.byte  0 @ Aromatherapy
-	.byte  0 @ Fake Tears
-	.byte  1 @ Air Cutter
-	.byte  1 @ Overheat
-	.byte  0 @ Odor Sleuth
-	.byte  1 @ Rock Tomb
-	.byte  1 @ Silver Wind
-	.byte  0 @ Metal Sound
-	.byte  0 @ Grass Whistle
-	.byte  0 @ Tickle
-	.byte  0 @ Cosmic Power
-	.byte  1 @ Water Spout
-	.byte  1 @ Signal Beam
-	.byte  1 @ Shadow Punch
-	.byte  1 @ Extrasensory
-	.byte  1 @ Sky Uppercut
-	.byte  1 @ Sand Tomb
-	.byte  1 @ Sheer Cold
-	.byte  1 @ Muddy Water
-	.byte  1 @ Bullet Seed
-	.byte  1 @ Aerial Ace
-	.byte  1 @ Icicle Spear
-	.byte  0 @ Iron Defense
-	.byte  0 @ Block
-	.byte  0 @ Howl
-	.byte  1 @ Dragon Claw
-	.byte  1 @ Frenzy Plant
-	.byte  0 @ Bulk Up
-	.byte  1 @ Bounce
-	.byte  1 @ Mud Shot
-	.byte  1 @ Poison Tail
-	.byte  1 @ Covet
-	.byte  1 @ Volt Tackle
-	.byte  1 @ Magical Leaf
-	.byte  0 @ Water Sport
-	.byte  0 @ Calm Mind
-	.byte  1 @ Leaf Blade
-	.byte  0 @ Dragon Dance
-	.byte  1 @ Rock Blast
-	.byte  1 @ Shock Wave
-	.byte  1 @ Water Pulse
-	.byte  1 @ Doom Desire
-	.byte  1 @ Psycho Boost
diff --git a/data/battle_frontier_2.s b/data/battle_frontier_2.s
index 3d80f1173..2b1eab991 100644
--- a/data/battle_frontier_2.s
+++ b/data/battle_frontier_2.s
@@ -102,37 +102,3 @@ gUnknown_08611DB0:: @ 8611DB0
 gUnknown_08611DB8:: @ 8611DB8
 	.4byte gUnknown_08611D5C
 	.4byte gUnknown_08611D94
-
-@ 8611DC0
-	.include "data/battle_frontier/battle_arena_move_mind_ratings.inc"
-
-	.align 2
-gUnknown_08611F24:: @ 8611F24
-	.byte 0x00, 0x00, 0x00, 0x40, 0x00, 0xf0, 0x00, 0x00
-
-	.align 2
-gUnknown_08611F2C:: @ 8611F2C
-	.2byte 0x0000, 0x0001, 0xffff, 0x0000
-
-	.align 2
-gUnknown_08611F34:: @ 8611F34
-	.2byte 0x0004, 0x0001, 0xffff, 0x0000
-
-	.align 2
-gUnknown_08611F3C:: @ 8611F3C
-	.2byte 0x0008, 0x0001, 0xffff, 0x0000
-
-	.align 2
-gUnknown_08611F44:: @ 8611F44
-	.2byte 0x000c, 0x0001, 0xffff, 0x0000
-
-	.align 2
-gUnknown_08611F4C:: @ 8611F4C
-	.4byte gUnknown_08611F2C
-	.4byte gUnknown_08611F34
-	.4byte gUnknown_08611F3C
-	.4byte gUnknown_08611F44
-
-	.align 2
-gUnknown_08611F5C:: @ 8611F5C
-	spr_template 0x03e8, 0xffff, gUnknown_08611F24, gUnknown_08611F4C, NULL, gDummySpriteAffineAnimTable, sub_81A5698
diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s
index edf49eda5..be91c7c7e 100644
--- a/data/battle_scripts_1.s
+++ b/data/battle_scripts_1.s
@@ -318,7 +318,7 @@ BattleScript_EffectSleep::
 	goto BattleScript_MoveEnd
 
 BattleScript_AlreadyAsleep::
-	various23 BS_ATTACKER
+	setalreadystatusedmoveattempt BS_ATTACKER
 	pause 0x20
 	printstring STRINGID_PKMNALREADYASLEEP
 	waitmessage 0x40
@@ -731,7 +731,7 @@ BattleScript_EffectToxic::
 	goto BattleScript_MoveEnd
 
 BattleScript_AlreadyPoisoned::
-	various23 BS_ATTACKER
+	setalreadystatusedmoveattempt BS_ATTACKER
 	pause 0x40
 	printstring STRINGID_PKMNALREADYPOISONED
 	waitmessage 0x40
@@ -779,7 +779,7 @@ BattleScript_RestCantSleep::
 	goto BattleScript_MoveEnd
 
 BattleScript_RestIsAlreadyAsleep::
-	various23 BS_ATTACKER
+	setalreadystatusedmoveattempt BS_ATTACKER
 	pause 0x20
 	printstring STRINGID_PKMNALREADYASLEEP2
 	waitmessage 0x40
@@ -944,7 +944,7 @@ BattleScript_EffectConfuse::
 	goto BattleScript_MoveEnd
 
 BattleScript_AlreadyConfused::
-	various23 BS_ATTACKER
+	setalreadystatusedmoveattempt BS_ATTACKER
 	pause 0x20
 	printstring STRINGID_PKMNALREADYCONFUSED
 	waitmessage 0x40
@@ -1051,7 +1051,7 @@ BattleScript_EffectParalyze::
 	goto BattleScript_MoveEnd
 
 BattleScript_AlreadyParalyzed::
-	various23 BS_ATTACKER
+	setalreadystatusedmoveattempt BS_ATTACKER
 	pause 0x20
 	printstring STRINGID_PKMNISALREADYPARALYZED
 	waitmessage 0x40
@@ -1128,7 +1128,7 @@ BattleScript_SubstituteString::
 	waitmessage 0x40
 	goto BattleScript_MoveEnd
 BattleScript_AlreadyHasSubstitute::
-	various23 BS_ATTACKER
+	setalreadystatusedmoveattempt BS_ATTACKER
 	pause 0x20
 	printstring STRINGID_PKMNHASSUBSTITUTE
 	waitmessage 0x40
@@ -2226,7 +2226,7 @@ BattleScript_WaterVeilPrevents::
 	goto BattleScript_MoveEnd
 
 BattleScript_AlreadyBurned::
-	various23 BS_ATTACKER
+	setalreadystatusedmoveattempt BS_ATTACKER
 	pause 0x20
 	printstring STRINGID_PKMNALREADYHASBURN
 	waitmessage 0x40
@@ -2643,7 +2643,7 @@ BattleScript_TeeterDanceSubstitutePrevents::
 	goto BattleScript_TeeterDanceDoMoveEndIncrement
 
 BattleScript_TeeterDanceAlreadyConfused::
-	various23 BS_ATTACKER
+	setalreadystatusedmoveattempt BS_ATTACKER
 	pause 0x20
 	printstring STRINGID_PKMNALREADYCONFUSED
 	waitmessage 0x40
@@ -4487,54 +4487,54 @@ BattleScript_ArenaTurnBeginning::
 	pause 0x8
 	playse SE_HANTEI1
 	various14 BS_ATTACKER
-	various16 8
-	various17 8
+	arenajudmengtstring 8
+	arenawaitmessage 8
 	pause 0x40
 	various15 BS_ATTACKER
 	volumeup
 	end2
 	
-BattleScript_82DB8E0::
+BattleScript_82DB8E0:: @ Unused battlescript
 	playse SE_PINPON
 	various14 BS_ATTACKER
-	various16 BS_TARGET
-	various17 BS_TARGET
+	arenajudmengtstring BS_TARGET
+	arenawaitmessage BS_TARGET
 	pause 0x40
 	various15 BS_ATTACKER
 	end2
 
-BattleScript_82DB8F3::
-	makevisible 11
+BattleScript_ArenaDoJudgment::
+	makevisible BS_PLAYER1
 	waitstate
 	makevisible BS_OPPONENT1
 	waitstate
 	volumedown
-	playse 0x109
+	playse SE_HANTEI1
 	pause 0x8
-	playse 0x109
+	playse SE_HANTEI1
 	pause 0x40
 	various14 BS_ATTACKER
-	various16 BS_ATTACKER
-	various17 BS_ATTACKER
+	arenajudmengtstring 1
+	arenawaitmessage 1
 	pause 0x40
 	setbyte gBattleCommunication, 0x0
-	various9 BS_ATTACKER
+	arenajudgmentwindow
 	pause 0x40
-	various9 BS_ATTACKER
-	various16 BS_EFFECT_BATTLER
-	various17 BS_EFFECT_BATTLER
-	various9 BS_ATTACKER
-	various16 BS_FAINTED
-	various17 BS_FAINTED
-	various9 BS_ATTACKER
-	various16 0x4
-	various17 0x4
-	various9 BS_ATTACKER
-	jumpifbyte CMP_EQUAL, gBattleCommunication + 1, 0x3, BattleScript_82DB973
-	jumpifbyte CMP_EQUAL, gBattleCommunication + 1, 0x4, BattleScript_82DB992
-	various16 0x5
-	various17 0x5
-	various9 BS_ATTACKER
+	arenajudgmentwindow
+	arenajudmengtstring 2
+	arenawaitmessage 2
+	arenajudgmentwindow
+	arenajudmengtstring 3
+	arenawaitmessage 3
+	arenajudgmentwindow
+	arenajudmengtstring 4
+	arenawaitmessage 4
+	arenajudgmentwindow
+	jumpifbyte CMP_EQUAL, gBattleCommunication + 1, 0x3, BattleScript_ArenaJudgmentPlayerLoses
+	jumpifbyte CMP_EQUAL, gBattleCommunication + 1, 0x4, BattleScript_ArenaJudgmentDraw
+	arenajudmengtstring 5
+	arenawaitmessage 5
+	arenajudgmentwindow
 	various15 BS_ATTACKER
 	printstring STRINGID_DEFEATEDOPPONENTBYREFEREE
 	waitmessage 0x40
@@ -4542,39 +4542,39 @@ BattleScript_82DB8F3::
 	waitcry BS_ATTACKER
 	dofaintanimation BS_OPPONENT1
 	cleareffectsonfaint BS_OPPONENT1
-	various10 BS_ATTACKER
+	arenaopponentmonlost
 	end2
 
-BattleScript_82DB973::
-	various16 0x6
-	various17 0x6
-	various9 BS_ATTACKER
+BattleScript_ArenaJudgmentPlayerLoses:
+	arenajudmengtstring 6
+	arenawaitmessage 6
+	arenajudgmentwindow
 	various15 BS_ATTACKER
 	printstring STRINGID_LOSTTOOPPONENTBYREFEREE
 	waitmessage 0x40
-	playfaintcry 11
+	playfaintcry BS_PLAYER1
 	waitcry BS_ATTACKER
-	dofaintanimation 11
-	cleareffectsonfaint 11
-	various11 BS_ATTACKER
+	dofaintanimation BS_PLAYER1
+	cleareffectsonfaint BS_PLAYER1
+	arenaplayermonlost
 	end2
 
-BattleScript_82DB992::
-	various16 BS_BATTLER_0
-	various17 BS_BATTLER_0
-	various9 BS_ATTACKER
+BattleScript_ArenaJudgmentDraw:
+	arenajudmengtstring 7
+	arenawaitmessage 7
+	arenajudgmentwindow
 	various15 BS_ATTACKER
 	printstring STRINGID_TIEDOPPONENTBYREFEREE
 	waitmessage 0x40
-	playfaintcry 11
+	playfaintcry BS_PLAYER1
 	waitcry BS_ATTACKER
-	dofaintanimation 11
-	cleareffectsonfaint 11
+	dofaintanimation BS_PLAYER1
+	cleareffectsonfaint BS_PLAYER1
 	playfaintcry BS_OPPONENT1
 	waitcry BS_ATTACKER
 	dofaintanimation BS_OPPONENT1
 	cleareffectsonfaint BS_OPPONENT1
-	various12 BS_ATTACKER
+	arenabothmonlost
 	end2
 
 BattleScript_AskIfWantsToForfeitMatch::
diff --git a/include/battle.h b/include/battle.h
index 5f925b925..90bef24ac 100644
--- a/include/battle.h
+++ b/include/battle.h
@@ -498,12 +498,12 @@ struct BattleStruct
     struct BattleTv tv;
     u8 notSureWhatFieldLol[0x28];
     u8 AI_monToSwitchIntoId[MAX_BATTLERS_COUNT];
-    s8 field_298[2];
-    s8 field_29A[2];
-    u16 field_29C[2];
-    u8 field_2A0;
-    u8 field_2A1;
-    u8 field_2A2;
+    s8 arenaMindPoints[2];
+    s8 arenaSkillPoints[2];
+    u16 arenaStartHp[2];
+    u8 arenaLostPlayerMons; // Bits for party member, lost as in referee's decision, not by fainting.
+    u8 arenaLostOpponentMons;
+    u8 alreadyStatusedMoveAttempt; // As bits for battlers; For example when using Thunder Wave on an already paralyzed pokemon.
 };
 
 #define GET_MOVE_TYPE(move, typeArg)                        \
diff --git a/include/battle_arena.h b/include/battle_arena.h
new file mode 100644
index 000000000..bf305ea4e
--- /dev/null
+++ b/include/battle_arena.h
@@ -0,0 +1,14 @@
+#ifndef GUARD_BATTLE_ARENA_H
+#define GUARD_BATTLE_ARENA_H
+
+void CallBattleArenaFunction(void);
+u8 BattleArena_ShowJudgmentWindow(u8 *state);
+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 sub_81A5BF8(void);
+void sub_81A5D44(void);
+
+#endif //GUARD_BATTLE_ARENA_H
diff --git a/include/battle_scripts.h b/include/battle_scripts.h
index 9c4537363..a23fa6948 100644
--- a/include/battle_scripts.h
+++ b/include/battle_scripts.h
@@ -206,7 +206,7 @@ extern const u8 BattleScript_BerryFocusEnergyEnd2[];
 extern const u8 BattleScript_ActionSelectionItemsCantBeUsed[];
 extern const u8 BattleScript_ArenaTurnBeginning[];
 extern const u8 BattleScript_82DB881[];
-extern const u8 BattleScript_82DB8F3[];
+extern const u8 BattleScript_ArenaDoJudgment[];
 extern const u8 BattleScript_82DAA0B[];
 extern const u8 BattleScript_AskIfWantsToForfeitMatch[];
 extern const u8 BattleScript_PrintPlayerForfeited[];
diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h
index dc07fda6e..e8a2980a5 100644
--- a/include/constants/battle_script_commands.h
+++ b/include/constants/battle_script_commands.h
@@ -68,12 +68,19 @@
 #define VARIOUS_GET_MOVE_TARGET                 3
 #define VARIOUS_RESET_INTIMIDATE_TRACE_BITS     5
 #define VARIOUS_UPDATE_CHOICE_MOVE_ON_LVL_UP    6
+#define VARIOUS_ARENA_JUDGMENT_WINDOW           9
+#define VARIOUS_ARENA_OPPONENT_MON_LOST         10
+#define VARIOUS_ARENA_PLAYER_MON_LOST           11
+#define VARIOUS_ARENA_BOTH_MONS_LOST            12
 #define VARIOUS_EMIT_YESNOBOX                   13
+#define VARIOUS_ARENA_JUDGMENT_STRING           16
+#define VARIOUS_ARENA_WAIT_STRING               17
 #define VARIOUS_WAIT_CRY                        18
 #define VARIOUS_RETURN_OPPONENT_MON1            19
 #define VARIOUS_RETURN_OPPONENT_MON2            20
 #define VARIOUS_VOLUME_DOWN                     21
 #define VARIOUS_VOLUME_UP                       22
+#define VARIOUS_SET_ALREADY_STATUS_MOVE_ATTEMPT 23
 #define VARIOUS_SET_TELEPORT_OUTCOME            25
 #define VARIOUS_PLAY_TRAINER_DEFEATED_MUSIC     26
 
diff --git a/src/battle_arena.c b/src/battle_arena.c
index 5ab71965b..2d9f82ab6 100644
--- a/src/battle_arena.c
+++ b/src/battle_arena.c
@@ -1,4 +1,5 @@
 #include "global.h"
+#include "battle_arena.h"
 #include "event_data.h"
 #include "palette.h"
 #include "gpu_regs.h"
@@ -19,14 +20,13 @@
 #include "constants/songs.h"
 #include "constants/battle_string_ids.h"
 #include "constants/battle_frontier.h"
+#include "constants/moves.h"
 
 extern u16 gBattle_WIN0H;
 extern u16 gBattle_WIN0V;
 
 extern const u32 gUnknown_08D854E8[];
 extern const u16 gUnknown_08D855E8[];
-extern const struct SpriteTemplate gUnknown_08611F5C;
-extern const s8 gBattleArenaMoveMindRatings[];
 
 // This file's functions.
 static void sub_81A58B4(void);
@@ -36,16 +36,436 @@ static void sub_81A5AC4(void);
 static void sub_81A5B08(void);
 static void sub_81A5B88(void);
 static void sub_81A5BE0(void);
-static void sub_81A5558(u8 x, u8 y, u8 arg2, u8 battler);
+static void SpriteCb_JudgmentIcon(struct Sprite *sprite);
+static void ShowJudgmentSprite(u8 x, u8 y, u8 arg2, u8 battler);
 
 // Const rom data.
+static const s8 sMindRatings[] =
+{
+    [MOVE_NONE] = 0,
+    [MOVE_POUND] = 1,
+    [MOVE_KARATE_CHOP] = 1,
+    [MOVE_DOUBLE_SLAP] = 1,
+    [MOVE_COMET_PUNCH] = 1,
+    [MOVE_MEGA_PUNCH] = 1,
+    [MOVE_PAY_DAY] = 1,
+    [MOVE_FIRE_PUNCH] = 1,
+    [MOVE_ICE_PUNCH] = 1,
+    [MOVE_THUNDER_PUNCH] = 1,
+    [MOVE_SCRATCH] = 1,
+    [MOVE_VICE_GRIP] = 1,
+    [MOVE_GUILLOTINE] = 1,
+    [MOVE_RAZOR_WIND] = 1,
+    [MOVE_SWORDS_DANCE] = 0,
+    [MOVE_CUT] = 1,
+    [MOVE_GUST] = 1,
+    [MOVE_WING_ATTACK] = 1,
+    [MOVE_WHIRLWIND] = 0,
+    [MOVE_FLY] = 1,
+    [MOVE_BIND] = 1,
+    [MOVE_SLAM] = 1,
+    [MOVE_VINE_WHIP] = 1,
+    [MOVE_STOMP] = 1,
+    [MOVE_DOUBLE_KICK] = 1,
+    [MOVE_MEGA_KICK] = 1,
+    [MOVE_JUMP_KICK] = 1,
+    [MOVE_ROLLING_KICK] = 1,
+    [MOVE_SAND_ATTACK] = 0,
+    [MOVE_HEADBUTT] = 1,
+    [MOVE_HORN_ATTACK] = 1,
+    [MOVE_FURY_ATTACK] = 1,
+    [MOVE_HORN_DRILL] = 1,
+    [MOVE_TACKLE] = 1,
+    [MOVE_BODY_SLAM] = 1,
+    [MOVE_WRAP] = 1,
+    [MOVE_TAKE_DOWN] = 1,
+    [MOVE_THRASH] = 1,
+    [MOVE_DOUBLE_EDGE] = 1,
+    [MOVE_TAIL_WHIP] = 0,
+    [MOVE_POISON_STING] = 1,
+    [MOVE_TWINEEDLE] = 1,
+    [MOVE_PIN_MISSILE] = 1,
+    [MOVE_LEER] = 0,
+    [MOVE_BITE] = 1,
+    [MOVE_GROWL] = 0,
+    [MOVE_ROAR] = 0,
+    [MOVE_SING] = 0,
+    [MOVE_SUPERSONIC] = 0,
+    [MOVE_SONIC_BOOM] = 1,
+    [MOVE_DISABLE] = 0,
+    [MOVE_ACID] = 1,
+    [MOVE_EMBER] = 1,
+    [MOVE_FLAMETHROWER] = 1,
+    [MOVE_MIST] = 0,
+    [MOVE_WATER_GUN] = 1,
+    [MOVE_HYDRO_PUMP] = 1,
+    [MOVE_SURF] = 1,
+    [MOVE_ICE_BEAM] = 1,
+    [MOVE_BLIZZARD] = 1,
+    [MOVE_PSYBEAM] = 1,
+    [MOVE_BUBBLE_BEAM] = 1,
+    [MOVE_AURORA_BEAM] = 1,
+    [MOVE_HYPER_BEAM] = 1,
+    [MOVE_PECK] = 1,
+    [MOVE_DRILL_PECK] = 1,
+    [MOVE_SUBMISSION] = 1,
+    [MOVE_LOW_KICK] = 1,
+    [MOVE_COUNTER] = 0,
+    [MOVE_SEISMIC_TOSS] = 1,
+    [MOVE_STRENGTH] = 1,
+    [MOVE_ABSORB] = 1,
+    [MOVE_MEGA_DRAIN] = 1,
+    [MOVE_LEECH_SEED] = 0,
+    [MOVE_GROWTH] = 0,
+    [MOVE_RAZOR_LEAF] = 1,
+    [MOVE_SOLAR_BEAM] = 1,
+    [MOVE_POISON_POWDER] = 0,
+    [MOVE_STUN_SPORE] = 0,
+    [MOVE_SLEEP_POWDER] = 0,
+    [MOVE_PETAL_DANCE] = 1,
+    [MOVE_STRING_SHOT] = 0,
+    [MOVE_DRAGON_RAGE] = 1,
+    [MOVE_FIRE_SPIN] = 1,
+    [MOVE_THUNDER_SHOCK] = 1,
+    [MOVE_THUNDERBOLT] = 1,
+    [MOVE_THUNDER_WAVE] = 0,
+    [MOVE_THUNDER] = 1,
+    [MOVE_ROCK_THROW] = 1,
+    [MOVE_EARTHQUAKE] = 1,
+    [MOVE_FISSURE] = 1,
+    [MOVE_DIG] = 1,
+    [MOVE_TOXIC] = 0,
+    [MOVE_CONFUSION] = 1,
+    [MOVE_PSYCHIC] = 1,
+    [MOVE_HYPNOSIS] = 0,
+    [MOVE_MEDITATE] = 0,
+    [MOVE_AGILITY] = 0,
+    [MOVE_QUICK_ATTACK] = 1,
+    [MOVE_RAGE] = 1,
+    [MOVE_TELEPORT] = 0,
+    [MOVE_NIGHT_SHADE] = 1,
+    [MOVE_MIMIC] = 0,
+    [MOVE_SCREECH] = 0,
+    [MOVE_DOUBLE_TEAM] = 0,
+    [MOVE_RECOVER] = 0,
+    [MOVE_HARDEN] = 0,
+    [MOVE_MINIMIZE] = 0,
+    [MOVE_SMOKESCREEN] = 0,
+    [MOVE_CONFUSE_RAY] = 0,
+    [MOVE_WITHDRAW] = 0,
+    [MOVE_DEFENSE_CURL] = 0,
+    [MOVE_BARRIER] = 0,
+    [MOVE_LIGHT_SCREEN] = 0,
+    [MOVE_HAZE] = 0,
+    [MOVE_REFLECT] = 0,
+    [MOVE_FOCUS_ENERGY] = 0,
+    [MOVE_BIDE] = 0,
+    [MOVE_METRONOME] = 0,
+    [MOVE_MIRROR_MOVE] = 0,
+    [MOVE_SELF_DESTRUCT] = 1,
+    [MOVE_EGG_BOMB] = 1,
+    [MOVE_LICK] = 1,
+    [MOVE_SMOG] = 1,
+    [MOVE_SLUDGE] = 1,
+    [MOVE_BONE_CLUB] = 1,
+    [MOVE_FIRE_BLAST] = 1,
+    [MOVE_WATERFALL] = 1,
+    [MOVE_CLAMP] = 1,
+    [MOVE_SWIFT] = 1,
+    [MOVE_SKULL_BASH] = 1,
+    [MOVE_SPIKE_CANNON] = 1,
+    [MOVE_CONSTRICT] = 1,
+    [MOVE_AMNESIA] = 0,
+    [MOVE_KINESIS] = 0,
+    [MOVE_SOFT_BOILED] = 0,
+    [MOVE_HI_JUMP_KICK] = 1,
+    [MOVE_GLARE] = 0,
+    [MOVE_DREAM_EATER] = 1,
+    [MOVE_POISON_GAS] = 0,
+    [MOVE_BARRAGE] = 1,
+    [MOVE_LEECH_LIFE] = 1,
+    [MOVE_LOVELY_KISS] = 0,
+    [MOVE_SKY_ATTACK] = 1,
+    [MOVE_TRANSFORM] = 0,
+    [MOVE_BUBBLE] = 1,
+    [MOVE_DIZZY_PUNCH] = 1,
+    [MOVE_SPORE] = 0,
+    [MOVE_FLASH] = 0,
+    [MOVE_PSYWAVE] = 1,
+    [MOVE_SPLASH] = 0,
+    [MOVE_ACID_ARMOR] = 0,
+    [MOVE_CRABHAMMER] = 1,
+    [MOVE_EXPLOSION] = 1,
+    [MOVE_FURY_SWIPES] = 1,
+    [MOVE_BONEMERANG] = 1,
+    [MOVE_REST] = 0,
+    [MOVE_ROCK_SLIDE] = 1,
+    [MOVE_HYPER_FANG] = 1,
+    [MOVE_SHARPEN] = 0,
+    [MOVE_CONVERSION] = 0,
+    [MOVE_TRI_ATTACK] = 1,
+    [MOVE_SUPER_FANG] = 1,
+    [MOVE_SLASH] = 1,
+    [MOVE_SUBSTITUTE] = 0,
+    [MOVE_STRUGGLE] = 1,
+    [MOVE_SKETCH] = 0,
+    [MOVE_TRIPLE_KICK] = 1,
+    [MOVE_THIEF] = 1,
+    [MOVE_SPIDER_WEB] = 0,
+    [MOVE_MIND_READER] = 0,
+    [MOVE_NIGHTMARE] = 0,
+    [MOVE_FLAME_WHEEL] = 1,
+    [MOVE_SNORE] = 1,
+    [MOVE_CURSE] = 0,
+    [MOVE_FLAIL] = 1,
+    [MOVE_CONVERSION_2] = 0,
+    [MOVE_AEROBLAST] = 1,
+    [MOVE_COTTON_SPORE] = 0,
+    [MOVE_REVERSAL] = 1,
+    [MOVE_SPITE] = 0,
+    [MOVE_POWDER_SNOW] = 1,
+    [MOVE_PROTECT] = -1,
+    [MOVE_MACH_PUNCH] = 1,
+    [MOVE_SCARY_FACE] = 0,
+    [MOVE_FAINT_ATTACK] = 1,
+    [MOVE_SWEET_KISS] = 0,
+    [MOVE_BELLY_DRUM] = 0,
+    [MOVE_SLUDGE_BOMB] = 1,
+    [MOVE_MUD_SLAP] = 1,
+    [MOVE_OCTAZOOKA] = 1,
+    [MOVE_SPIKES] = 0,
+    [MOVE_ZAP_CANNON] = 1,
+    [MOVE_FORESIGHT] = 0,
+    [MOVE_DESTINY_BOND] = 0,
+    [MOVE_PERISH_SONG] = 0,
+    [MOVE_ICY_WIND] = 1,
+    [MOVE_DETECT] = -1,
+    [MOVE_BONE_RUSH] = 1,
+    [MOVE_LOCK_ON] = 0,
+    [MOVE_OUTRAGE] = 1,
+    [MOVE_SANDSTORM] = 0,
+    [MOVE_GIGA_DRAIN] = 1,
+    [MOVE_ENDURE] = -1,
+    [MOVE_CHARM] = 0,
+    [MOVE_ROLLOUT] = 1,
+    [MOVE_FALSE_SWIPE] = 1,
+    [MOVE_SWAGGER] = 0,
+    [MOVE_MILK_DRINK] = 0,
+    [MOVE_SPARK] = 1,
+    [MOVE_FURY_CUTTER] = 1,
+    [MOVE_STEEL_WING] = 1,
+    [MOVE_MEAN_LOOK] = 0,
+    [MOVE_ATTRACT] = 0,
+    [MOVE_SLEEP_TALK] = 0,
+    [MOVE_HEAL_BELL] = 0,
+    [MOVE_RETURN] = 1,
+    [MOVE_PRESENT] = 1,
+    [MOVE_FRUSTRATION] = 1,
+    [MOVE_SAFEGUARD] = 0,
+    [MOVE_PAIN_SPLIT] = 0,
+    [MOVE_SACRED_FIRE] = 1,
+    [MOVE_MAGNITUDE] = 1,
+    [MOVE_DYNAMIC_PUNCH] = 1,
+    [MOVE_MEGAHORN] = 1,
+    [MOVE_DRAGON_BREATH] = 1,
+    [MOVE_BATON_PASS] = 0,
+    [MOVE_ENCORE] = 0,
+    [MOVE_PURSUIT] = 1,
+    [MOVE_RAPID_SPIN] = 1,
+    [MOVE_SWEET_SCENT] = 0,
+    [MOVE_IRON_TAIL] = 1,
+    [MOVE_METAL_CLAW] = 1,
+    [MOVE_VITAL_THROW] = 1,
+    [MOVE_MORNING_SUN] = 0,
+    [MOVE_SYNTHESIS] = 0,
+    [MOVE_MOONLIGHT] = 0,
+    [MOVE_HIDDEN_POWER] = 1,
+    [MOVE_CROSS_CHOP] = 1,
+    [MOVE_TWISTER] = 1,
+    [MOVE_RAIN_DANCE] = 0,
+    [MOVE_SUNNY_DAY] = 0,
+    [MOVE_CRUNCH] = 1,
+    [MOVE_MIRROR_COAT] = 0,
+    [MOVE_PSYCH_UP] = 0,
+    [MOVE_EXTREME_SPEED] = 1,
+    [MOVE_ANCIENT_POWER] = 1,
+    [MOVE_SHADOW_BALL] = 1,
+    [MOVE_FUTURE_SIGHT] = 1,
+    [MOVE_ROCK_SMASH] = 1,
+    [MOVE_WHIRLPOOL] = 1,
+    [MOVE_BEAT_UP] = 1,
+    [MOVE_FAKE_OUT] = -1,
+    [MOVE_UPROAR] = 1,
+    [MOVE_STOCKPILE] = 0,
+    [MOVE_SPIT_UP] = 1,
+    [MOVE_SWALLOW] = 0,
+    [MOVE_HEAT_WAVE] = 1,
+    [MOVE_HAIL] = 0,
+    [MOVE_TORMENT] = 0,
+    [MOVE_FLATTER] = 0,
+    [MOVE_WILL_O_WISP] = 0,
+    [MOVE_MEMENTO] = 0,
+    [MOVE_FACADE] = 1,
+    [MOVE_FOCUS_PUNCH] = 1,
+    [MOVE_SMELLING_SALT] = 1,
+    [MOVE_FOLLOW_ME] = 0,
+    [MOVE_NATURE_POWER] = 0,
+    [MOVE_CHARGE] = 0,
+    [MOVE_TAUNT] = 0,
+    [MOVE_HELPING_HAND] = 0,
+    [MOVE_TRICK] = 0,
+    [MOVE_ROLE_PLAY] = 0,
+    [MOVE_WISH] = 0,
+    [MOVE_ASSIST] = 0,
+    [MOVE_INGRAIN] = 0,
+    [MOVE_SUPERPOWER] = 1,
+    [MOVE_MAGIC_COAT] = 0,
+    [MOVE_RECYCLE] = 0,
+    [MOVE_REVENGE] = 1,
+    [MOVE_BRICK_BREAK] = 1,
+    [MOVE_YAWN] = 0,
+    [MOVE_KNOCK_OFF] = 1,
+    [MOVE_ENDEAVOR] = 1,
+    [MOVE_ERUPTION] = 1,
+    [MOVE_SKILL_SWAP] = 0,
+    [MOVE_IMPRISON] = 0,
+    [MOVE_REFRESH] = 0,
+    [MOVE_GRUDGE] = 0,
+    [MOVE_SNATCH] = 0,
+    [MOVE_SECRET_POWER] = 1,
+    [MOVE_DIVE] = 1,
+    [MOVE_ARM_THRUST] = 1,
+    [MOVE_CAMOUFLAGE] = 0,
+    [MOVE_TAIL_GLOW] = 0,
+    [MOVE_LUSTER_PURGE] = 1,
+    [MOVE_MIST_BALL] = 1,
+    [MOVE_FEATHER_DANCE] = 0,
+    [MOVE_TEETER_DANCE] = 0,
+    [MOVE_BLAZE_KICK] = 1,
+    [MOVE_MUD_SPORT] = 0,
+    [MOVE_ICE_BALL] = 1,
+    [MOVE_NEEDLE_ARM] = 1,
+    [MOVE_SLACK_OFF] = 0,
+    [MOVE_HYPER_VOICE] = 1,
+    [MOVE_POISON_FANG] = 1,
+    [MOVE_CRUSH_CLAW] = 1,
+    [MOVE_BLAST_BURN] = 1,
+    [MOVE_HYDRO_CANNON] = 1,
+    [MOVE_METEOR_MASH] = 1,
+    [MOVE_ASTONISH] = 1,
+    [MOVE_WEATHER_BALL] = 1,
+    [MOVE_AROMATHERAPY] = 0,
+    [MOVE_FAKE_TEARS] = 0,
+    [MOVE_AIR_CUTTER] = 1,
+    [MOVE_OVERHEAT] = 1,
+    [MOVE_ODOR_SLEUTH] = 0,
+    [MOVE_ROCK_TOMB] = 1,
+    [MOVE_SILVER_WIND] = 1,
+    [MOVE_METAL_SOUND] = 0,
+    [MOVE_GRASS_WHISTLE] = 0,
+    [MOVE_TICKLE] = 0,
+    [MOVE_COSMIC_POWER] = 0,
+    [MOVE_WATER_SPOUT] = 1,
+    [MOVE_SIGNAL_BEAM] = 1,
+    [MOVE_SHADOW_PUNCH] = 1,
+    [MOVE_EXTRASENSORY] = 1,
+    [MOVE_SKY_UPPERCUT] = 1,
+    [MOVE_SAND_TOMB] = 1,
+    [MOVE_SHEER_COLD] = 1,
+    [MOVE_MUDDY_WATER] = 1,
+    [MOVE_BULLET_SEED] = 1,
+    [MOVE_AERIAL_ACE] = 1,
+    [MOVE_ICICLE_SPEAR] = 1,
+    [MOVE_IRON_DEFENSE] = 0,
+    [MOVE_BLOCK] = 0,
+    [MOVE_HOWL] = 0,
+    [MOVE_DRAGON_CLAW] = 1,
+    [MOVE_FRENZY_PLANT] = 1,
+    [MOVE_BULK_UP] = 0,
+    [MOVE_BOUNCE] = 1,
+    [MOVE_MUD_SHOT] = 1,
+    [MOVE_POISON_TAIL] = 1,
+    [MOVE_COVET] = 1,
+    [MOVE_VOLT_TACKLE] = 1,
+    [MOVE_MAGICAL_LEAF] = 1,
+    [MOVE_WATER_SPORT] = 0,
+    [MOVE_CALM_MIND] = 0,
+    [MOVE_LEAF_BLADE] = 1,
+    [MOVE_DRAGON_DANCE] = 0,
+    [MOVE_ROCK_BLAST] = 1,
+    [MOVE_SHOCK_WAVE] = 1,
+    [MOVE_WATER_PULSE] = 1,
+    [MOVE_DOOM_DESIRE] = 1,
+    [MOVE_PSYCHO_BOOST] = 1,
+};
+
+static const struct OamData sOamData_8611F24 =
+{
+    .y = 0,
+    .affineMode = 0,
+    .objMode = 0,
+    .mosaic = 0,
+    .bpp = 0,
+    .shape = 0,
+    .x = 0,
+    .matrixNum = 0,
+    .size = 1,
+    .tileNum = 0,
+    .priority = 0,
+    .paletteNum = 15,
+    .affineParam = 0
+};
+
+static const union AnimCmd sSpriteAnim_8611F2C[] =
+{
+    ANIMCMD_FRAME(0, 1),
+    ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_8611F34[] =
+{
+    ANIMCMD_FRAME(4, 1),
+    ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_8611F3C[] =
+{
+    ANIMCMD_FRAME(8, 1),
+    ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_8611F44[] =
+{
+    ANIMCMD_FRAME(12, 1),
+    ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_8611F4C[] =
+{
+    sSpriteAnim_8611F2C,
+    sSpriteAnim_8611F34,
+    sSpriteAnim_8611F3C,
+    sSpriteAnim_8611F44
+};
+
+static const struct SpriteTemplate sSpriteTemplate_JudgmentIcon =
+{
+    .tileTag = 0x3E8,
+    .paletteTag = 0xFFFF,
+    .oam = &sOamData_8611F24,
+    .anims = sSpriteAnimTable_8611F4C,
+    .images = NULL,
+    .affineAnims = gDummySpriteAffineAnimTable,
+    .callback = SpriteCb_JudgmentIcon,
+};
+
 static const struct CompressedSpriteSheet gUnknown_08611F74[] =
 {
     {gUnknown_08D854E8, 0x200, 0x3E8},
     {0}
 };
 
-static void (* const gUnknown_08611F84[])(void) =
+static void (* const sArenaFunctions[])(void) =
 {
     sub_81A58B4,
     sub_81A5964,
@@ -69,10 +489,10 @@ static const u16 gUnknown_08611FAC[9] =
 // code
 void CallBattleArenaFunction(void)
 {
-    gUnknown_08611F84[gSpecialVar_0x8004]();
+    sArenaFunctions[gSpecialVar_0x8004]();
 }
 
-u8 sub_81A5258(u8 *state)
+u8 BattleArena_ShowJudgmentWindow(u8 *state)
 {
     s32 i;
     u8 ret = 0;
@@ -120,7 +540,7 @@ u8 sub_81A5258(u8 *state)
             SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
             for (i = 0; i < 8; i++)
             {
-                u8 spriteId = CreateSprite(&gUnknown_08611F5C, 0x40 + (i * 0x10), 84, 0);
+                u8 spriteId = CreateSprite(&sSpriteTemplate_JudgmentIcon, 0x40 + (i * 0x10), 84, 0);
                 StartSpriteAnim(&gSprites[spriteId], 3);
             }
             ret = 1;
@@ -129,8 +549,8 @@ u8 sub_81A5258(u8 *state)
         break;
     case 4:
         PlaySE(SE_HANTEI1);
-        sub_81A5558(80, 40, 0, 0);
-        sub_81A5558(160, 40, 0, 1);
+        ShowJudgmentSprite(80, 40, 0, 0);
+        ShowJudgmentSprite(160, 40, 0, 1);
         BattleStringExpandPlaceholdersToDisplayedString(gText_Judgement);
         BattlePutTextOnWindow(gDisplayedStringBattle, 21);
         (*state)++;
@@ -138,8 +558,8 @@ u8 sub_81A5258(u8 *state)
         break;
     case 5:
         PlaySE(SE_HANTEI1);
-        sub_81A5558(80, 56, 1, 0);
-        sub_81A5558(160, 56, 1, 1);
+        ShowJudgmentSprite(80, 56, 1, 0);
+        ShowJudgmentSprite(160, 56, 1, 1);
         BattleStringExpandPlaceholdersToDisplayedString(gText_Judgement);
         BattlePutTextOnWindow(gDisplayedStringBattle, 21);
         (*state)++;
@@ -147,8 +567,8 @@ u8 sub_81A5258(u8 *state)
         break;
     case 6:
         PlaySE(SE_HANTEI1);
-        sub_81A5558(80, 72, 2, 0);
-        sub_81A5558(160, 72, 2, 1);
+        ShowJudgmentSprite(80, 72, 2, 0);
+        ShowJudgmentSprite(160, 72, 2, 1);
         BattleStringExpandPlaceholdersToDisplayedString(gText_Judgement);
         BattlePutTextOnWindow(gDisplayedStringBattle, 21);
         (*state)++;
@@ -197,32 +617,32 @@ u8 sub_81A5258(u8 *state)
     return ret;
 }
 
-static void sub_81A5558(u8 x, u8 y, u8 arg2, u8 battler)
+static void ShowJudgmentSprite(u8 x, u8 y, u8 category, u8 battler)
 {
     s32 animNum = 0;
-    s32 r6 = 0;
-    s32 r1 = 0;
-    s8 *ptr1 = gBattleStruct->field_298;
-    s8 *ptr2 = gBattleStruct->field_29A;
-    u16 *ptr3 = gBattleStruct->field_29C;
+    s32 pointsPlayer = 0;
+    s32 pointsOpponent = 0;
+    s8 *mindPoints = gBattleStruct->arenaMindPoints;
+    s8 *skillPoints = gBattleStruct->arenaSkillPoints;
+    u16 *hpAtStart = gBattleStruct->arenaStartHp;
 
-    switch (arg2)
+    switch (category)
     {
     case 0:
-        r6 = ptr1[battler];
-        r1 = ptr1[BATTLE_OPPOSITE(battler)];
+        pointsPlayer = mindPoints[battler];
+        pointsOpponent = mindPoints[BATTLE_OPPOSITE(battler)];
         break;
     case 1:
-        r6 = ptr2[battler];
-        r1 = ptr2[BATTLE_OPPOSITE(battler)];
+        pointsPlayer = skillPoints[battler];
+        pointsOpponent = skillPoints[BATTLE_OPPOSITE(battler)];
         break;
     case 2:
-        r6 = (gBattleMons[battler].hp * 100) / ptr3[battler];
-        r1 = (gBattleMons[BATTLE_OPPOSITE(battler)].hp * 100) / ptr3[BATTLE_OPPOSITE(battler)];
+        pointsPlayer = (gBattleMons[battler].hp * 100) / hpAtStart[battler];
+        pointsOpponent = (gBattleMons[BATTLE_OPPOSITE(battler)].hp * 100) / hpAtStart[BATTLE_OPPOSITE(battler)];
         break;
     }
 
-    if (r6 > r1)
+    if (pointsPlayer > pointsOpponent)
     {
         animNum = 2;
         if (battler != 0)
@@ -230,7 +650,7 @@ static void sub_81A5558(u8 x, u8 y, u8 arg2, u8 battler)
         else
             gBattleTextBuff1[0] += 2;
     }
-    else if (r6 == r1)
+    else if (pointsPlayer == pointsOpponent)
     {
         animNum = 1;
         if (battler != 0)
@@ -243,76 +663,76 @@ static void sub_81A5558(u8 x, u8 y, u8 arg2, u8 battler)
         animNum = 0;
     }
 
-    r6 = CreateSprite(&gUnknown_08611F5C, x, y, 0);
-    StartSpriteAnim(&gSprites[r6], animNum);
+    pointsPlayer = CreateSprite(&sSpriteTemplate_JudgmentIcon, x, y, 0);
+    StartSpriteAnim(&gSprites[pointsPlayer], animNum);
 }
 
-void sub_81A5698(struct Sprite *sprite)
+static void SpriteCb_JudgmentIcon(struct Sprite *sprite)
 {
     if (gBattleCommunication[0] > 8)
         DestroySprite(sprite);
 }
 
-void sub_81A56B4(void)
+void BattleArena_InitPoints(void)
 {
-    s8 *ptr1 = gBattleStruct->field_298;
-    s8 *ptr2 = gBattleStruct->field_29A;
-    u16 *ptr3 = gBattleStruct->field_29C;
+    s8 *mindPoints = gBattleStruct->arenaMindPoints;
+    s8 *skillPoints = gBattleStruct->arenaSkillPoints;
+    u16 *hpAtStart = gBattleStruct->arenaStartHp;
 
-    ptr1[0] = 0;
-    ptr1[1] = 0;
-    ptr2[0] = 0;
-    ptr2[1] = 0;
-    ptr3[0] = gBattleMons[0].hp;
-    ptr3[1] = gBattleMons[1].hp;
+    mindPoints[0] = 0;
+    mindPoints[1] = 0;
+    skillPoints[0] = 0;
+    skillPoints[1] = 0;
+    hpAtStart[0] = gBattleMons[0].hp;
+    hpAtStart[1] = gBattleMons[1].hp;
 }
 
-void sub_81A56E8(u8 battler)
+void BattleArena_AddMindPoints(u8 battler)
 {
-    s8 *ptr1 = gBattleStruct->field_298;
+    s8 *mindPoints = gBattleStruct->arenaMindPoints;
 
-    ptr1[battler] += gBattleArenaMoveMindRatings[gCurrentMove];
+    mindPoints[battler] += sMindRatings[gCurrentMove];
 }
 
-void sub_81A5718(u8 battler)
+void BattleArena_AddSkillPoints(u8 battler)
 {
-    s8 *ptr2 = gBattleStruct->field_29A;
+    s8 *skillPoints = gBattleStruct->arenaSkillPoints;
 
     if (gHitMarker & HITMARKER_OBEYS)
     {
-        u8 *ptr4 = &gBattleStruct->field_2A2;
-        if (*ptr4 & gBitTable[battler])
+        u8 *failedMoveBits = &gBattleStruct->alreadyStatusedMoveAttempt;
+        if (*failedMoveBits & gBitTable[battler])
         {
-            *ptr4 &= ~(gBitTable[battler]);
-            ptr2[battler] -= 2;
+            *failedMoveBits &= ~(gBitTable[battler]);
+            skillPoints[battler] -= 2;
         }
         else if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
         {
             if (!(gMoveResultFlags & MOVE_RESULT_MISSED) || gBattleCommunication[6] != 1)
-                ptr2[battler] -= 2;
+                skillPoints[battler] -= 2;
         }
         else if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE && gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE)
         {
-            ptr2[battler] += 1;
+            skillPoints[battler] += 1;
         }
         else if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE)
         {
-            ptr2[battler] += 2;
+            skillPoints[battler] += 2;
         }
         else if (gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE)
         {
-            ptr2[battler] -= 1;
+            skillPoints[battler] -= 1;
         }
         else if (!gProtectStructs[battler].protected)
         {
-            ptr2[battler] += 1;
+            skillPoints[battler] += 1;
         }
     }
 }
 
-void sub_81A57E4(u8 battler, u16 stringId)
+void BattleArena_DeductMindPoints(u8 battler, u16 stringId)
 {
-    s8 *ptr2 = gBattleStruct->field_29A;
+    s8 *skillPoints = gBattleStruct->arenaSkillPoints;
 
     switch (stringId)
     {
@@ -335,18 +755,18 @@ void sub_81A57E4(u8 battler, u16 stringId)
     case STRINGID_PKMNANCHORSITSELFWITH:
     case STRINGID_PKMNPREVENTSSTATLOSSWITH:
     case STRINGID_PKMNSTAYEDAWAKEUSING:
-        ptr2[battler] -= 3;
+        skillPoints[battler] -= 3;
         break;
     }
 }
 
-void sub_81A586C(u8 battler)
+void sub_81A586C(u8 battler) // Unused.
 {
-    u16 *ptr3 = gBattleStruct->field_29C;
+    u16 *hpAtStart = gBattleStruct->arenaStartHp;
 
-    ptr3[battler] = gBattleMons[battler].hp;
-    if (ptr3[BATTLE_OPPOSITE(battler)] > gBattleMons[BATTLE_OPPOSITE(battler)].hp)
-        ptr3[BATTLE_OPPOSITE(battler)] = gBattleMons[BATTLE_OPPOSITE(battler)].hp;
+    hpAtStart[battler] = gBattleMons[battler].hp;
+    if (hpAtStart[BATTLE_OPPOSITE(battler)] > gBattleMons[BATTLE_OPPOSITE(battler)].hp)
+        hpAtStart[BATTLE_OPPOSITE(battler)] = gBattleMons[BATTLE_OPPOSITE(battler)].hp;
 }
 
 static void sub_81A58B4(void)
diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c
index b8b5bd3b8..2629a56c0 100644
--- a/src/battle_controller_opponent.c
+++ b/src/battle_controller_opponent.c
@@ -29,6 +29,9 @@
 #include "pokeball.h"
 #include "data2.h"
 #include "battle_setup.h"
+#include "battle_arena.h"
+#include "battle_tower.h"
+#include "frontier_util.h"
 
 extern u16 gBattle_BG0_X;
 extern u16 gBattle_BG0_Y;
@@ -38,11 +41,7 @@ extern struct UnusedControllerStruct gUnknown_02022D0C;
 extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[];
 
 extern void sub_8172EF0(u8 battlerId, struct Pokemon *mon);
-extern void sub_81A57E4(u8 battlerId, u16 stringId);
-extern u8 GetFrontierBrainTrainerPicIndex(void);
 extern u8 GetTrainerHillTrainerFrontSpriteId(u16 trainerId);
-extern u8 GetFrontierTrainerFrontSpriteId(u16 trainerId);
-extern u8 GetEreaderTrainerFrontSpriteId(void);
 
 // this file's functions
 static void OpponentHandleGetMonData(void);
@@ -1513,7 +1512,7 @@ static void OpponentHandlePrintString(void)
     BufferStringBattle(*stringId);
     BattlePutTextOnWindow(gDisplayedStringBattle, 0);
     gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter;
-    sub_81A57E4(gActiveBattler, *stringId);
+    BattleArena_DeductMindPoints(gActiveBattler, *stringId);
 }
 
 static void OpponentHandlePrintSelectionString(void)
diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c
index 6bc6c6f49..20781ca44 100644
--- a/src/battle_controller_player.c
+++ b/src/battle_controller_player.c
@@ -32,6 +32,7 @@
 #include "recorded_battle.h"
 #include "party_menu.h"
 #include "battle_dome.h"
+#include "battle_arena.h"
 
 extern u8 gUnknown_0203CEE8;
 extern u8 gUnknown_0203CEE9;
@@ -46,7 +47,6 @@ extern const struct CompressedSpritePalette gTrainerBackPicPaletteTable[];
 
 extern void sub_8172EF0(u8 battlerId, struct Pokemon *mon);
 extern void sub_81AABB0(void);
-extern void sub_81A57E4(u8 battlerId, u16 stringId);
 extern void sub_81851A8(u8 *);
 
 // this file's functions
@@ -2537,7 +2537,7 @@ static void PlayerHandlePrintString(void)
     BattlePutTextOnWindow(gDisplayedStringBattle, 0);
     gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter2;
     BattleTv_SetDataBasedOnString(*stringId);
-    sub_81A57E4(gActiveBattler, *stringId);
+    BattleArena_DeductMindPoints(gActiveBattler, *stringId);
 }
 
 static void PlayerHandlePrintSelectionString(void)
@@ -2600,9 +2600,11 @@ static void HandleChooseMoveAfterDma3(void)
     }
 }
 
+// arenaMindPoints is used here as a placeholder for a timer.
+
 static void PlayerChooseMoveInBattlePalace(void)
 {
-    if (--*(gBattleStruct->field_298 + gActiveBattler) == 0)
+    if (--*(gBattleStruct->arenaMindPoints + gActiveBattler) == 0)
     {
         gBattlePalaceMoveSelectionRngValue = gRngValue;
         BtlController_EmitTwoReturnValues(1, 10, ChooseMoveAndTargetInBattlePalace());
@@ -2614,7 +2616,7 @@ static void PlayerHandleChooseMove(void)
 {
     if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
     {
-        *(gBattleStruct->field_298 + gActiveBattler) = 8;
+        *(gBattleStruct->arenaMindPoints + gActiveBattler) = 8;
         gBattlerControllerFuncs[gActiveBattler] = PlayerChooseMoveInBattlePalace;
     }
     else
diff --git a/src/battle_interface.c b/src/battle_interface.c
index d89d6164d..ec8a06094 100644
--- a/src/battle_interface.c
+++ b/src/battle_interface.c
@@ -1610,7 +1610,7 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo,
                 {
                     gSprites[ballIconSpritesIds[i]].oam.tileNum += 3;
                 }
-                else if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleStruct->field_2A0 & gBitTable[j]) // hmm...?
+                else if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleStruct->arenaLostPlayerMons & gBitTable[j])
                 {
                     gSprites[ballIconSpritesIds[i]].oam.tileNum += 3;
                 }
@@ -1659,7 +1659,7 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo,
                 {
                     gSprites[ballIconSpritesIds[5 - var]].oam.tileNum += 3;
                 }
-                else if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleStruct->field_2A1 & gBitTable[j]) // hmm...?
+                else if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleStruct->arenaLostOpponentMons & gBitTable[j]) // hmm...?
                 {
                     gSprites[ballIconSpritesIds[5 - var]].oam.tileNum += 3;
                 }
diff --git a/src/battle_main.c b/src/battle_main.c
index e08e12194..5fcdb29d1 100644
--- a/src/battle_main.c
+++ b/src/battle_main.c
@@ -53,6 +53,7 @@
 #include "pokeball.h"
 #include "party_menu.h"
 #include "battle_tower.h"
+#include "battle_arena.h"
 
 struct UnknownPokemonStruct4
 {
@@ -109,9 +110,7 @@ extern const u8 gText_Love[];
 // functions
 extern void sub_81B9150(void);
 extern void sub_80B3AF8(u8 taskId); // cable club
-extern void sub_81A56B4(void); // battle frontier 2
 extern u8 sub_81A9E28(void); // battle frontier 2
-extern void sub_81A56E8(u8 battlerId); // battle frontier 2
 extern void sub_81B8FB0(u8, u8); // party menu
 extern u8 pokemon_order_func(u8); // party menu
 extern bool8 InBattlePyramid(void);
@@ -3085,8 +3084,8 @@ static void BattleStartClearSetData(void)
 
     gBattleResults.shinyWildMon = IsMonShiny(&gEnemyParty[0]);
 
-    gBattleStruct->field_2A0 = 0;
-    gBattleStruct->field_2A1 = 0;
+    gBattleStruct->arenaLostPlayerMons = 0;
+    gBattleStruct->arenaLostOpponentMons = 0;
 }
 
 void SwitchInClearSetData(void)
@@ -3423,7 +3422,7 @@ static void BattleIntroDrawTrainersOrMonsSprites(void)
         }
 
         if (gBattleTypeFlags & BATTLE_TYPE_ARENA)
-            sub_81A56B4();
+            BattleArena_InitPoints();
     }
     gBattleMainFunc = BattleIntroDrawPartySummaryScreens;
 }
@@ -5479,7 +5478,7 @@ static void HandleAction_UseMove(void)
     }
 
     if (gBattleTypeFlags & BATTLE_TYPE_ARENA)
-        sub_81A56E8(gBattlerAttacker);
+        BattleArena_AddMindPoints(gBattlerAttacker);
 
     gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT;
 }
diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c
index b652049c4..0b5921942 100644
--- a/src/battle_script_commands.c
+++ b/src/battle_script_commands.c
@@ -43,6 +43,7 @@
 #include "battle_setup.h"
 #include "overworld.h"
 #include "party_menu.h"
+#include "battle_arena.h"
 
 extern u16 gBattle_BG1_X;
 extern u16 gBattle_BG1_Y;
@@ -54,17 +55,13 @@ extern struct MusicPlayerInfo gMPlayInfo_BGM;
 extern const u8* const gBattleScriptsForMoveEffects[];
 
 // functions
-extern void sub_81A5718(u8 battlerId); // battle frontier 2
-extern void sub_81A56B4(void); // battle frontier 2
 extern void ShowSelectMovePokemonSummaryScreen(struct Pokemon* party, u8 monPartyId, u8 monCount, void (*callback)(void), u16 move); // pokemon summary screen
 extern u8 sub_81C1B94(void); // pokemon summary screen
 extern void sub_81D388C(struct Pokemon* mon, void* statStoreLocation); // pokenav.s
 extern void sub_81D3640(u8 arg0, void* statStoreLocation1, void* statStoreLocation2, u8 arg3, u8 arg4, u8 arg5); // pokenav.s
 extern void sub_81D3784(u8 arg0, void* statStoreLocation1, u8 arg2, u8 arg3, u8 arg4); // pokenav.s
 extern u8* GetMonNickname(struct Pokemon* mon, u8* dst); // party_menu
-extern u8 sub_81A5258(u8* arg0); // battle frontier 2
-extern void sub_81A5BF8(void); // battle frontier 2
-extern void sub_81A5D44(void); // battle frontier 2
+extern u8 BattleArena_ShowJudgmentWindow(u8* arg0); // battle frontier 2
 extern void sub_81B8E80(u8 battlerId, u8, u8); // party menu
 extern bool8 sub_81B1250(void); // ?
 extern bool8 InBattlePike(void);
@@ -3549,7 +3546,7 @@ static void atk24(void)
         for (i = 0; i < 6; i++)
         {
             if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)
-             && (!(gBattleTypeFlags & BATTLE_TYPE_ARENA) || !(gBattleStruct->field_2A0 & gBitTable[i])))
+             && (!(gBattleTypeFlags & BATTLE_TYPE_ARENA) || !(gBattleStruct->arenaLostPlayerMons & gBitTable[i])))
             {
                 HP_count += GetMonData(&gPlayerParty[i], MON_DATA_HP);
             }
@@ -3562,7 +3559,7 @@ static void atk24(void)
     for (HP_count = 0, i = 0; i < 6; i++)
     {
         if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES) && !GetMonData(&gEnemyParty[i], MON_DATA_IS_EGG)
-            && (!(gBattleTypeFlags & BATTLE_TYPE_ARENA) || !(gBattleStruct->field_2A1 & gBitTable[i])))
+            && (!(gBattleTypeFlags & BATTLE_TYPE_ARENA) || !(gBattleStruct->arenaLostOpponentMons & gBitTable[i])))
         {
             HP_count += GetMonData(&gEnemyParty[i], MON_DATA_HP);
         }
@@ -4243,7 +4240,7 @@ static void atk3C_return(void)
 static void atk3D_end(void)
 {
     if (gBattleTypeFlags & BATTLE_TYPE_ARENA)
-        sub_81A5718(gBattlerAttacker);
+        BattleArena_AddSkillPoints(gBattlerAttacker);
 
     gMoveResultFlags = 0;
     gActiveBattler = 0;
@@ -5000,7 +4997,7 @@ static void atk4E_switchinanim(void)
     gBattlescriptCurrInstr += 3;
 
     if (gBattleTypeFlags & BATTLE_TYPE_ARENA)
-        sub_81A56B4();
+        BattleArena_InitPoints();
 }
 
 static void atk4F_jumpifcantswitch(void)
@@ -6697,34 +6694,34 @@ static void atk76_various(void)
             gBattleCommunication[MULTISTRING_CHOOSER] = sUnknown_0831C4F8[GetNatureFromPersonality(gBattleMons[gActiveBattler].personality)];
         }
         break;
-    case 9:
-        i = sub_81A5258(gBattleCommunication);
+    case VARIOUS_ARENA_JUDGMENT_WINDOW:
+        i = BattleArena_ShowJudgmentWindow(&gBattleCommunication[0]);
         if (i == 0)
             return;
 
         gBattleCommunication[1] = i;
         break;
-    case 10:
+    case VARIOUS_ARENA_OPPONENT_MON_LOST:
         gBattleMons[1].hp = 0;
         gHitMarker |= HITMARKER_FAINTED(1);
-        gBattleStruct->field_2A1 |= gBitTable[gBattlerPartyIndexes[1]];
+        gBattleStruct->arenaLostOpponentMons |= gBitTable[gBattlerPartyIndexes[1]];
         gDisableStructs[1].truantUnknownBit = 1;
         break;
-    case 11:
+    case VARIOUS_ARENA_PLAYER_MON_LOST:
         gBattleMons[0].hp = 0;
         gHitMarker |= HITMARKER_FAINTED(0);
         gHitMarker |= HITMARKER_x400000;
-        gBattleStruct->field_2A0 |= gBitTable[gBattlerPartyIndexes[0]];
+        gBattleStruct->arenaLostPlayerMons |= gBitTable[gBattlerPartyIndexes[0]];
         gDisableStructs[0].truantUnknownBit = 1;
         break;
-    case 12:
+    case VARIOUS_ARENA_BOTH_MONS_LOST:
         gBattleMons[0].hp = 0;
         gBattleMons[1].hp = 0;
         gHitMarker |= HITMARKER_FAINTED(0);
         gHitMarker |= HITMARKER_FAINTED(1);
         gHitMarker |= HITMARKER_x400000;
-        gBattleStruct->field_2A0 |= gBitTable[gBattlerPartyIndexes[0]];
-        gBattleStruct->field_2A1 |= gBitTable[gBattlerPartyIndexes[1]];
+        gBattleStruct->arenaLostPlayerMons |= gBitTable[gBattlerPartyIndexes[0]];
+        gBattleStruct->arenaLostOpponentMons |= gBitTable[gBattlerPartyIndexes[1]];
         gDisableStructs[0].truantUnknownBit = 1;
         gDisableStructs[1].truantUnknownBit = 1;
         break;
@@ -6738,11 +6735,11 @@ static void atk76_various(void)
     case 15:
         sub_81A5D44();
         break;
-    case 16:
+    case VARIOUS_ARENA_JUDGMENT_STRING:
         BattleStringExpandPlaceholdersToDisplayedString(gRefereeStringsTable[gBattlescriptCurrInstr[1]]);
         BattlePutTextOnWindow(gDisplayedStringBattle, 0x16);
         break;
-    case 17:
+    case VARIOUS_ARENA_WAIT_STRING:
         if (IsTextPrinterActive(0x16))
             return;
         break;
@@ -6775,8 +6772,8 @@ static void atk76_various(void)
     case VARIOUS_VOLUME_UP:
         m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100);
         break;
-    case 23:
-        gBattleStruct->field_2A2 |= gBitTable[gActiveBattler];
+    case VARIOUS_SET_ALREADY_STATUS_MOVE_ATTEMPT:
+        gBattleStruct->alreadyStatusedMoveAttempt |= gBitTable[gActiveBattler];
         break;
     case 24:
         if (sub_805725C(gActiveBattler))
diff --git a/src/battle_util.c b/src/battle_util.c
index 1aaffc053..6fb5f4bdc 100644
--- a/src/battle_util.c
+++ b/src/battle_util.c
@@ -1200,8 +1200,8 @@ bool8 HandleWishPerishSongOnTurnEnd(void)
             for (i = 0; i < 2; i++)
                 CancelMultiTurnMoves(i);
 
-            gBattlescriptCurrInstr = BattleScript_82DB8F3;
-            BattleScriptExecute(BattleScript_82DB8F3);
+            gBattlescriptCurrInstr = BattleScript_ArenaDoJudgment;
+            BattleScriptExecute(BattleScript_ArenaDoJudgment);
             gBattleStruct->wishPerishSongState++;
             return TRUE;
         }