summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorentrpntr <entrpntr@gmail.com>2020-04-07 12:23:05 -0400
committerentrpntr <entrpntr@gmail.com>2020-04-07 12:30:35 -0400
commita8d30a0d2d8830f05669b88b23c558cc116d3bea (patch)
treedcad5c2b3563639b64943ae33432c5ec7e8f0f27
parent07a5cc60d0c3e37699ad5e45366cb9b093d6b7e7 (diff)
Add engine/battle/ai/items.asm.
-rwxr-xr-xdata/text/common_1.asm6
-rw-r--r--engine/battle/ai/items.asm825
-rwxr-xr-xengine/items/item_effects.asm2
-rwxr-xr-xengine/pokemon/move_mon.asm2
-rw-r--r--main.asm58
-rw-r--r--wram.asm68
6 files changed, 900 insertions, 61 deletions
diff --git a/data/text/common_1.asm b/data/text/common_1.asm
index 7cebc41e..a4bb9ca4 100755
--- a/data/text/common_1.asm
+++ b/data/text/common_1.asm
@@ -31,7 +31,7 @@ UnknownText_0x1bc0a2::
text_ram wStringBuffer1
text_start
line "recovered @"
- text_decimal wLinkBuffer, 2, 3
+ text_decimal wCurHPAnimDeltaHP, 2, 3
text "HP!"
done
@@ -149,7 +149,7 @@ UnknownText_0x1bc37a::
text ", is it?"
done
-Text_EnemyWithdrew::
+_EnemyWithdrewText::
text "<ENEMY>"
line "withdrew"
cont "@"
@@ -157,7 +157,7 @@ Text_EnemyWithdrew::
text "!"
prompt
-Text_EnemyUsedOn::
+_EnemyUsedOnText::
text "<ENEMY>"
line "used @"
text_ram wMonOrItemNameBuffer
diff --git a/engine/battle/ai/items.asm b/engine/battle/ai/items.asm
new file mode 100644
index 00000000..9c9572c7
--- /dev/null
+++ b/engine/battle/ai/items.asm
@@ -0,0 +1,825 @@
+AI_SwitchOrTryItem:
+ and a
+
+ ld a, [wBattleMode]
+ dec a
+ ret z
+
+ ld a, [wLinkMode]
+ and a
+ ret nz
+
+ farcall CheckEnemyLockedIn
+ ret nz
+
+ ld a, [wPlayerSubStatus5]
+ bit SUBSTATUS_CANT_RUN, a
+ jr nz, DontSwitch
+
+ ld a, [wEnemyWrapCount]
+ and a
+ jr nz, DontSwitch
+
+ ld a, [wTrainerClass]
+ dec a
+ ld hl, TrainerClassAttributes + TRNATTR_AI_ITEM_SWITCH
+ ld bc, NUM_TRAINER_ATTRIBUTES
+ call AddNTimes
+.ok
+ bit SWITCH_OFTEN_F, [hl]
+ jp nz, SwitchOften
+ bit SWITCH_RARELY_F, [hl]
+ jp nz, SwitchRarely
+ bit SWITCH_SOMETIMES_F, [hl]
+ jp nz, SwitchSometimes
+ ; fallthrough
+
+DontSwitch:
+ call AI_TryItem
+ ret
+
+SwitchOften:
+ callfar CheckAbleToSwitch
+ ld a, [wEnemySwitchMonParam]
+ and $f0
+ jp z, DontSwitch
+
+ cp $10
+ jr nz, .not_10
+ call Random
+ cp 50 percent + 1
+ jr c, .switch
+ jp DontSwitch
+.not_10
+
+ cp $20
+ jr nz, .not_20
+ call Random
+ cp 79 percent - 1
+ jr c, .switch
+ jp DontSwitch
+.not_20
+
+ ; $30
+ call Random
+ cp 4 percent
+ jp c, DontSwitch
+
+.switch
+ ld a, [wEnemySwitchMonParam]
+ and $f
+ inc a
+ ; In register 'a' is the number (1-6) of the mon to switch to
+ ld [wEnemySwitchMonIndex], a
+ jp AI_TrySwitch
+
+SwitchRarely:
+ callfar CheckAbleToSwitch
+ ld a, [wEnemySwitchMonParam]
+ and $f0
+ jp z, DontSwitch
+
+ cp $10
+ jr nz, .not_10
+ call Random
+ cp 8 percent
+ jr c, .switch
+ jp DontSwitch
+.not_10
+
+ cp $20
+ jr nz, .not_20
+ call Random
+ cp 12 percent
+ jr c, .switch
+ jp DontSwitch
+.not_20
+
+ ; $30
+ call Random
+ cp 79 percent - 1
+ jp c, DontSwitch
+
+.switch
+ ld a, [wEnemySwitchMonParam]
+ and $f
+ inc a
+ ld [wEnemySwitchMonIndex], a
+ jp AI_TrySwitch
+
+SwitchSometimes:
+ callfar CheckAbleToSwitch
+ ld a, [wEnemySwitchMonParam]
+ and $f0
+ jp z, DontSwitch
+
+ cp $10
+ jr nz, .not_10
+ call Random
+ cp 20 percent - 1
+ jr c, .switch
+ jp DontSwitch
+.not_10
+
+ cp $20
+ jr nz, .not_20
+ call Random
+ cp 50 percent + 1
+ jr c, .switch
+ jp DontSwitch
+.not_20
+
+ ; $30
+ call Random
+ cp 20 percent - 1
+ jp c, DontSwitch
+
+.switch
+ ld a, [wEnemySwitchMonParam]
+ and $f
+ inc a
+ ld [wEnemySwitchMonIndex], a
+ jp AI_TrySwitch
+
+CheckSubstatusCantRun:
+ ld a, [wEnemySubStatus5]
+ bit SUBSTATUS_CANT_RUN, a
+ ret
+
+AI_TryItem:
+ ld a, [wEnemyTrainerItem1]
+ ld b, a
+ ld a, [wEnemyTrainerItem2]
+ or b
+ ret z
+
+ call .IsHighestLevel
+ ret nc
+
+ ld a, [wTrainerClass]
+ dec a
+ ld hl, TrainerClassAttributes + TRNATTR_AI_ITEM_SWITCH
+ ld bc, NUM_TRAINER_ATTRIBUTES
+ call AddNTimes
+ ld b, h
+ ld c, l
+ ld hl, AI_Items
+ ld de, wEnemyTrainerItem1
+.loop
+ ld a, [hl]
+ and a
+ inc a
+ ret z
+
+ ld a, [de]
+ cp [hl]
+ jr z, .has_item
+ inc de
+ ld a, [de]
+ cp [hl]
+ jr z, .has_item
+
+ dec de
+ inc hl
+ inc hl
+ inc hl
+ jr .loop
+
+.has_item
+ inc hl
+
+ push hl
+ push de
+ ld de, .callback
+ push de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+.callback
+ pop de
+ pop hl
+
+ inc hl
+ inc hl
+ jr c, .loop
+
+.used_item
+ xor a
+ ld [de], a
+ inc a
+ ld [wEnemyGoesFirst], a
+
+ ld hl, wEnemySubStatus3
+ res SUBSTATUS_BIDE, [hl]
+
+ xor a
+ ld [wEnemyFuryCutterCount], a
+ ld [wEnemyProtectCount], a
+ ld [wEnemyRageCounter], a
+
+ ld hl, wEnemySubStatus4
+ res SUBSTATUS_RAGE, [hl]
+
+ scf
+ ret
+
+.IsHighestLevel:
+ ld a, [wOTPartyCount]
+ ld d, a
+ ld e, 0
+ ld hl, wOTPartyMon1Level
+ ld bc, PARTYMON_STRUCT_LENGTH
+.next
+ ld a, [hl]
+ cp e
+ jr c, .ok
+ ld e, a
+.ok
+ add hl, bc
+ dec d
+ jr nz, .next
+
+ ld a, [wCurOTMon]
+ ld hl, wOTPartyMon1Level
+ call AddNTimes
+ ld a, [hl]
+ cp e
+ jr nc, .yes
+
+.no
+ and a
+ ret
+
+.yes
+ scf
+ ret
+
+AI_Items:
+ dbw FULL_RESTORE, .FullRestore
+ dbw MAX_POTION, .MaxPotion
+ dbw HYPER_POTION, .HyperPotion
+ dbw SUPER_POTION, .SuperPotion
+ dbw POTION, .Potion
+ dbw X_ACCURACY, .XAccuracy
+ dbw FULL_HEAL, .FullHeal
+ dbw GUARD_SPEC, .GuardSpec
+ dbw DIRE_HIT, .DireHit
+ dbw X_ATTACK, .XAttack
+ dbw X_DEFEND, .XDefend
+ dbw X_SPEED, .XSpeed
+ dbw X_SPECIAL, .XSpecial
+ db -1 ; end
+
+.FullHeal:
+ call .Status
+ jp c, .DontUse
+ call EnemyUsedFullHeal
+ jp .Use
+
+.Status:
+ ld a, [wEnemyMonStatus]
+ and a
+ jp z, .DontUse
+
+ ld a, [bc]
+ bit CONTEXT_USE_F, a
+ jr nz, .StatusCheckContext
+ ld a, [bc]
+ bit ALWAYS_USE_F, a
+ jp nz, .Use
+ call Random
+ cp 20 percent - 1
+ jp c, .Use
+ jp .DontUse
+
+.StatusCheckContext:
+ ld a, [wEnemySubStatus5]
+ bit SUBSTATUS_TOXIC, a
+ jr z, .FailToxicCheck
+ ld a, [wEnemyToxicCount]
+ cp 4
+ jr c, .FailToxicCheck
+ call Random
+ cp 50 percent + 1
+ jp c, .Use
+.FailToxicCheck:
+ ld a, [wEnemyMonStatus]
+ and 1 << FRZ | SLP
+ jp z, .DontUse
+ jp .Use
+
+.FullRestore:
+ call .HealItem
+ jp nc, .UseFullRestore
+ ld a, [bc]
+ bit CONTEXT_USE_F, a
+ jp z, .DontUse
+ call .Status
+ jp c, .DontUse
+
+.UseFullRestore:
+ call EnemyUsedFullRestore
+ jp .Use
+
+.MaxPotion:
+ call .HealItem
+ jp c, .DontUse
+ call EnemyUsedMaxPotion
+ jp .Use
+
+.HealItem:
+ ld a, [bc]
+ bit CONTEXT_USE_F, a
+ jr nz, .CheckHalfOrQuarterHP
+ callfar AICheckEnemyHalfHP
+ jp c, .DontUse
+ ld a, [bc]
+ bit UNKNOWN_USE_F, a
+ jp nz, .CheckQuarterHP
+ callfar AICheckEnemyQuarterHP
+ jp nc, .UseHealItem
+ call Random
+ cp 50 percent + 1
+ jp c, .UseHealItem
+ jp .DontUse
+
+.CheckQuarterHP:
+ callfar AICheckEnemyQuarterHP
+ jp c, .DontUse
+ call Random
+ cp 20 percent - 1
+ jp c, .DontUse
+ jr .UseHealItem
+
+.CheckHalfOrQuarterHP:
+ callfar AICheckEnemyHalfHP
+ jp c, .DontUse
+ callfar AICheckEnemyQuarterHP
+ jp nc, .UseHealItem
+ call Random
+ cp 20 percent - 1
+ jp nc, .DontUse
+
+.UseHealItem:
+ jp .Use
+
+.HyperPotion:
+ call .HealItem
+ jp c, .DontUse
+ ld b, 200
+ call EnemyUsedHyperPotion
+ jp .Use
+
+.SuperPotion:
+ call .HealItem
+ jp c, .DontUse
+ ld b, 50
+ call EnemyUsedSuperPotion
+ jp .Use
+
+.Potion:
+ call .HealItem
+ jp c, .DontUse
+ ld b, 20
+ call EnemyUsedPotion
+ jp .Use
+
+.asm_382ae ; This appears to be unused
+ callfar AICheckEnemyMaxHP
+ jr c, .dont_use
+ push bc
+ ld de, wEnemyMonMaxHP + 1
+ ld hl, wEnemyMonHP + 1
+ ld a, [de]
+ sub [hl]
+ jr z, .check_40_percent
+ dec hl
+ dec de
+ ld c, a
+ sbc [hl]
+ and a
+ jr nz, .check_40_percent
+ ld a, c
+ cp b
+ jp c, .check_50_percent
+ callfar AICheckEnemyQuarterHP
+ jr c, .check_40_percent
+
+.check_50_percent
+ pop bc
+ ld a, [bc]
+ bit UNKNOWN_USE_F, a
+ jp z, .Use
+ call Random
+ cp 50 percent + 1
+ jp c, .Use
+
+.dont_use
+ jp .DontUse
+
+.check_40_percent
+ pop bc
+ ld a, [bc]
+ bit UNKNOWN_USE_F, a
+ jp z, .DontUse
+ call Random
+ cp 39 percent + 1
+ jp c, .Use
+ jp .DontUse
+
+.XAccuracy:
+ call .XItem
+ jp c, .DontUse
+ call EnemyUsedXAccuracy
+ jp .Use
+
+.GuardSpec:
+ call .XItem
+ jp c, .DontUse
+ call EnemyUsedGuardSpec
+ jp .Use
+
+.DireHit:
+ call .XItem
+ jp c, .DontUse
+ call EnemyUsedDireHit
+ jp .Use
+
+.XAttack:
+ call .XItem
+ jp c, .DontUse
+ call EnemyUsedXAttack
+ jp .Use
+
+.XDefend:
+ call .XItem
+ jp c, .DontUse
+ call EnemyUsedXDefend
+ jp .Use
+
+.XSpeed:
+ call .XItem
+ jp c, .DontUse
+ call EnemyUsedXSpeed
+ jp .Use
+
+.XSpecial:
+ call .XItem
+ jp c, .DontUse
+ call EnemyUsedXSpecial
+ jp .Use
+
+.XItem:
+ ld a, [wEnemyTurnsTaken]
+ and a
+ jr nz, .notfirstturnout
+ ld a, [bc]
+ bit ALWAYS_USE_F, a
+ jp nz, .Use
+ call Random
+ cp 50 percent + 1
+ jp c, .DontUse
+ ld a, [bc]
+ bit CONTEXT_USE_F, a
+ jp nz, .Use
+ call Random
+ cp 50 percent + 1
+ jp c, .DontUse
+ jp .Use
+.notfirstturnout
+ ld a, [bc]
+ bit ALWAYS_USE_F, a
+ jp z, .DontUse
+ call Random
+ cp 20 percent - 1
+ jp nc, .DontUse
+ jp .Use
+
+.DontUse:
+ scf
+ ret
+
+.Use:
+ and a
+ ret
+
+AIUpdateHUD:
+ call UpdateEnemyMonInParty
+ farcall UpdateEnemyHUD
+ ld a, $1
+ ldh [hBGMapMode], a
+ ld hl, wEnemyItemState
+ dec [hl]
+ scf
+ ret
+
+AIUsedItemSound:
+ push de
+ ld de, SFX_FULL_HEAL
+ call PlaySFX
+ pop de
+ ret
+
+EnemyUsedFullHeal:
+ call AIUsedItemSound
+ call AI_HealStatus
+ ld a, FULL_HEAL
+ jp PrintText_UsedItemOn_AND_AIUpdateHUD
+
+EnemyUsedMaxPotion:
+ ld a, MAX_POTION
+ ld [wCurEnemyItem], a
+ jr FullRestoreContinue
+
+EnemyUsedFullRestore:
+ call AI_HealStatus
+ ld a, FULL_RESTORE
+ ld [wCurEnemyItem], a
+ ld hl, wEnemySubStatus3
+ res SUBSTATUS_CONFUSED, [hl]
+ xor a
+ ld [wEnemyConfuseCount], a
+
+FullRestoreContinue:
+ ld de, wCurHPAnimOldHP
+ ld hl, wEnemyMonHP + 1
+ ld a, [hld]
+ ld [de], a
+ inc de
+ ld a, [hl]
+ ld [de], a
+ inc de
+ ld hl, wEnemyMonMaxHP + 1
+ ld a, [hld]
+ ld [de], a
+ inc de
+ ld [wCurHPAnimMaxHP], a
+ ld [wEnemyMonHP + 1], a
+ ld a, [hl]
+ ld [de], a
+ ld [wCurHPAnimMaxHP + 1], a
+ ld [wEnemyMonHP], a
+ jr EnemyPotionFinish
+
+EnemyUsedPotion:
+ ld a, POTION
+ ld b, 20
+ jr EnemyPotionContinue
+
+EnemyUsedSuperPotion:
+ ld a, SUPER_POTION
+ ld b, 50
+ jr EnemyPotionContinue
+
+EnemyUsedHyperPotion:
+ ld a, HYPER_POTION
+ ld b, 200
+
+EnemyPotionContinue:
+ ld [wCurEnemyItem], a
+ ld hl, wEnemyMonHP + 1
+ ld a, [hl]
+ ld [wCurHPAnimOldHP], a
+ add b
+ ld [hld], a
+ ld [wCurHPAnimNewHP], a
+ ld a, [hl]
+ ld [wCurHPAnimOldHP + 1], a
+ ld [wCurHPAnimNewHP + 1], a
+ jr nc, .ok
+ inc a
+ ld [hl], a
+ ld [wCurHPAnimNewHP + 1], a
+.ok
+ inc hl
+ ld a, [hld]
+ ld b, a
+ ld de, wEnemyMonMaxHP + 1
+ ld a, [de]
+ dec de
+ ld [wCurHPAnimMaxHP], a
+ sub b
+ ld a, [hli]
+ ld b, a
+ ld a, [de]
+ ld [wCurHPAnimMaxHP + 1], a
+ sbc b
+ jr nc, EnemyPotionFinish
+ inc de
+ ld a, [de]
+ dec de
+ ld [hld], a
+ ld [wCurHPAnimNewHP], a
+ ld a, [de]
+ ld [hl], a
+ ld [wCurHPAnimNewHP + 1], a
+
+EnemyPotionFinish:
+ call PrintText_UsedItemOn
+ hlcoord 2, 2
+ xor a
+ ld [wWhichHPBar], a
+ call AIUsedItemSound
+ predef AnimateHPBar
+ jp AIUpdateHUD
+
+AI_TrySwitch:
+; Determine whether the AI can switch based on how many Pokemon are still alive.
+; If it can switch, it will.
+ ld a, [wOTPartyCount]
+ ld c, a
+ ld hl, wOTPartyMon1HP
+ ld d, 0
+.SwitchLoop:
+ ld a, [hli]
+ ld b, a
+ ld a, [hld]
+ or b
+ jr z, .fainted
+ inc d
+.fainted
+ push bc
+ ld bc, PARTYMON_STRUCT_LENGTH
+ add hl, bc
+ pop bc
+ dec c
+ jr nz, .SwitchLoop
+
+ ld a, d
+ cp 2
+ jp nc, AI_Switch
+ and a
+ ret
+
+AI_Switch:
+ ld a, $1
+ ld [wEnemyIsSwitching], a
+ ld [wEnemyGoesFirst], a
+ ld hl, wEnemySubStatus4
+ res SUBSTATUS_RAGE, [hl]
+ xor a
+ ldh [hBattleTurn], a
+ callfar PursuitSwitch
+
+ push af
+ ld a, [wCurOTMon]
+ ld hl, wOTPartyMon1Status
+ ld bc, PARTYMON_STRUCT_LENGTH
+ call AddNTimes
+ ld d, h
+ ld e, l
+ ld hl, wEnemyMonStatus
+ ld bc, MON_MAXHP - MON_STATUS
+ call CopyBytes
+ pop af
+
+ jr c, .skiptext
+ ld hl, EnemyWithdrewText
+ call PrintText
+
+.skiptext
+ ld a, 1
+ ld [wBattleHasJustStarted], a
+ callfar NewEnemyMonStatus
+ callfar ResetEnemyStatLevels
+ ld hl, wPlayerSubStatus1
+ res SUBSTATUS_IN_LOVE, [hl]
+ farcall EnemySwitch
+ farcall ResetBattleParticipants
+ xor a
+ ld [wBattleHasJustStarted], a
+ ld a, [wLinkMode]
+ cp LINK_COLOSSEUM
+ ret z
+
+ scf
+ ret
+
+EnemyWithdrewText:
+ text_far _EnemyWithdrewText
+ text_end
+
+Function384d5: ; This appears to be unused
+ call AIUsedItemSound
+ call AI_HealStatus
+ ld a, FULL_HEAL_RED ; X_SPEED
+ jp PrintText_UsedItemOn_AND_AIUpdateHUD
+
+AI_HealStatus:
+ ld a, [wCurOTMon]
+ ld hl, wOTPartyMon1Status
+ ld bc, PARTYMON_STRUCT_LENGTH
+ call AddNTimes
+ xor a
+ ld [hl], a
+ ld [wEnemyMonStatus], a
+ ; Bug: this should reset SUBSTATUS_NIGHTMARE
+ ; Uncomment the 2 lines below to fix
+ ; ld hl, wEnemySubStatus1
+ ; res SUBSTATUS_NIGHTMARE, [hl]
+ ; Bug: this should reset SUBSTATUS_CONFUSED
+ ; Uncomment the 2 lines below to fix
+ ; ld hl, wEnemySubStatus3
+ ; res SUBSTATUS_CONFUSED, [hl]
+ ld hl, wEnemySubStatus5
+ res SUBSTATUS_TOXIC, [hl]
+ ret
+
+EnemyUsedXAccuracy:
+ call AIUsedItemSound
+ ld hl, wEnemySubStatus4
+ set SUBSTATUS_X_ACCURACY, [hl]
+ ld a, X_ACCURACY
+ jp PrintText_UsedItemOn_AND_AIUpdateHUD
+
+EnemyUsedGuardSpec:
+ call AIUsedItemSound
+ ld hl, wEnemySubStatus4
+ set SUBSTATUS_MIST, [hl]
+ ld a, GUARD_SPEC
+ jp PrintText_UsedItemOn_AND_AIUpdateHUD
+
+EnemyUsedDireHit:
+ call AIUsedItemSound
+ ld hl, wEnemySubStatus4
+ set SUBSTATUS_FOCUS_ENERGY, [hl]
+ ld a, DIRE_HIT
+ jp PrintText_UsedItemOn_AND_AIUpdateHUD
+
+Function3851e: ; This appears to be unused
+ ldh [hDivisor], a
+ ld hl, wEnemyMonMaxHP
+ ld a, [hli]
+ ldh [hDividend], a
+ ld a, [hl]
+ ldh [hDividend + 1], a
+ ld b, 2
+ call Divide
+ ldh a, [hQuotient + 3]
+ ld c, a
+ ldh a, [hQuotient + 2]
+ ld b, a
+ ld hl, wEnemyMonHP + 1
+ ld a, [hld]
+ ld e, a
+ ld a, [hl]
+ ld d, a
+ ld a, d
+ sub b
+ ret nz
+ ld a, e
+ sub c
+ ret
+
+EnemyUsedXAttack:
+ ld b, ATTACK
+ ld a, X_ATTACK
+ jr EnemyUsedXItem
+
+EnemyUsedXDefend:
+ ld b, DEFENSE
+ ld a, X_DEFEND
+ jr EnemyUsedXItem
+
+EnemyUsedXSpeed:
+ ld b, SPEED
+ ld a, X_SPEED
+ jr EnemyUsedXItem
+
+EnemyUsedXSpecial:
+ ld b, SP_ATTACK
+ ld a, X_SPECIAL
+
+; Parameter
+; a = ITEM_CONSTANT
+; b = BATTLE_CONSTANT (ATTACK, DEFENSE, SPEED, SP_ATTACK, SP_DEFENSE, ACCURACY, EVASION)
+EnemyUsedXItem:
+ ld [wCurEnemyItem], a
+ push bc
+ call PrintText_UsedItemOn
+ pop bc
+ farcall RaiseStat
+ jp AIUpdateHUD
+
+; Parameter
+; a = ITEM_CONSTANT
+PrintText_UsedItemOn_AND_AIUpdateHUD:
+ ld [wCurEnemyItem], a
+ call PrintText_UsedItemOn
+ jp AIUpdateHUD
+
+PrintText_UsedItemOn:
+ ld a, [wCurEnemyItem]
+ ld [wNamedObjectIndexBuffer], a
+ call GetItemName
+ ld hl, wStringBuffer1
+ ld de, wMonOrItemNameBuffer
+ ld bc, ITEM_NAME_LENGTH
+ call CopyBytes
+ ld hl, EnemyUsedOnText
+ jp PrintText
+
+EnemyUsedOnText:
+ text_far _EnemyUsedOnText
+ text_end
diff --git a/engine/items/item_effects.asm b/engine/items/item_effects.asm
index cb441179..f50f7fda 100755
--- a/engine/items/item_effects.asm
+++ b/engine/items/item_effects.asm
@@ -2020,7 +2020,7 @@ XSpeed: ; f515
ldh [hBattleTurn], a
ld [wcb45], a
ld [wcbeb], a
- farcall CheckIfStatCanBeRaised
+ farcall RaiseStat
call WaitSFX
farcall BattleCommand_StatUpMessage
farcall BattleCommand_StatUpFailText
diff --git a/engine/pokemon/move_mon.asm b/engine/pokemon/move_mon.asm
index f6ef241e..f60f3a1a 100755
--- a/engine/pokemon/move_mon.asm
+++ b/engine/pokemon/move_mon.asm
@@ -781,7 +781,7 @@ Functiondd6a: ; dd6a (3:5d6a)
ld d, h
ld e, l
ld a, $1
- ld [wCurHPAnim], a
+ ld [wBuffer1], a
predef FillMoves
ld a, [wPartyCount]
dec a
diff --git a/main.asm b/main.asm
index 58e294ad..05dac656 100644
--- a/main.asm
+++ b/main.asm
@@ -297,32 +297,40 @@ PrintMoveDesc::
SECTION "bankc", ROMX, BANK[$c]
dr $30000, $34000
-SECTION "bankd", ROMX, BANK[$d]
+SECTION "bankd", ROMX
dr $34000, $34923
-
CheckTypeMatchup::
- dr $34923, $36313
+ dr $34923, $34a91
+CheckAbleToSwitch::
+ dr $34a91, $36313
-CheckIfStatCanBeRaised:
+RaiseStat:
dr $36313, $364d7
-
BattleCommand_StatUpMessage:
dr $364d7, $3656b
-
BattleCommand_StatUpFailText:
dr $3656b, $366f6
-
CalcPlayerStats:
dr $366f6, $37e9b
GetItemHeldEffect:
dr $37e9b, $38000
-SECTION "banke", ROMX, BANK[$e]
- dr $38000, $394f3
+SECTION "banke", ROMX
+INCLUDE "engine/battle/ai/items.asm"
+ dr $38583, $39217
+
+AICheckEnemyMaxHP::
+ dr $39217, $39247
+AICheckEnemyHalfHP::
+ dr $39247, $3925e
+AICheckEnemyQuarterHP::
+ dr $3925e, $394f3
GetTrainerClassName::
- dr $394f3, $398f2
+ dr $394f3, $39562
+TrainerClassAttributes::
+ dr $39562, $398f2
Battle_GetTrainerName::
dr $398f2, $398fa
GetTrainerName::
@@ -330,27 +338,34 @@ GetTrainerName::
INCLUDE "data/trainers/parties.asm"
-SECTION "bankf", ROMX, BANK[$f]
+SECTION "bankf", ROMX
dr $3c000, $3c551
-
FleeMons::
- dr $3c551, $3d70a
-
+ dr $3c551, $3d39f
+
+EnemySwitch:
+ dr $3d39f, $3d438
+ResetBattleParticipants:
+ dr $3d438, $3d6cb
+NewEnemyMonStatus:
+ dr $3d6cb, $3d6fe
+ResetEnemyStatLevels:
+ dr $3d6fe, $3d70a
CheckPlayerPartyForFitMon::
dr $3d70a, $3d8f5
-
Function3d8f5:
dr $3d8f5, $3d907
-
Function3d907:
- dr $3d907, $3dda9
-
+ dr $3d907, $3dabc
+PursuitSwitch:
+ dr $3dabc, $3dda9
UpdatePlayerHUD::
dr $3dda9, $3de97
-
UpdateEnemyHUD::
- dr $3de97, $3e74b
+ dr $3de97, $3e6e8
+CheckEnemyLockedIn::
+ dr $3e6e8, $3e74b
LoadEnemyMon:
dr $3e74b, $3ec11
_BattleRandom:: ; 3ec11
@@ -358,13 +373,10 @@ _BattleRandom:: ; 3ec11
FillInExpBar::
dr $3f196, $3f243
-
GetBattleMonBackpic::
dr $3f243, $3f282
-
GetEnemyMonFrontpic::
dr $3f282, $3f2c7
-
StartBattle::
dr $3f2c7, $3f55d
Function3f55d:
diff --git a/wram.asm b/wram.asm
index bf367898..cf7a49b9 100644
--- a/wram.asm
+++ b/wram.asm
@@ -1641,8 +1641,8 @@ wBattleMon:: battle_struct wBattleMon ; cb0c
wcb2c:: ds 1 ; cb2c
wcb2d:: ds 1 ; cb2d
-wcb2e:: ds 1 ; cb2e
-wcb2f:: ds 1 ; cb2f
+wEnemyTrainerItem1:: db ; cb2e
+wEnemyTrainerItem2:: db ; cb2f
wcb30:: ds 1 ; cb30
wcb31:: ds 1 ; cb31
wcb32:: ds 1 ; cb32
@@ -1676,13 +1676,13 @@ wcb55:: ds 1 ; cb55
wcb56:: ds 1 ; cb56
wcb57:: ds 1 ; cb57
wcb58:: ds 1 ; cb58
-wcb59:: ds 1 ; cb59
-wcb5a:: ds 1 ; cb5a
+wEnemyConfuseCount:: db ; cb59
+wEnemyToxicCount:: db ; cb5a
wcb5b:: ds 1 ; cb5b
wcb5c:: ds 1 ; cb5c
wcb5d:: ds 1 ; cb5d
-wcb5e:: ds 1 ; cb5e
-wcb5f:: ds 1 ; cb5f
+wEnemyFuryCutterCount:: db ; cb5e
+wEnemyProtectCount:: db ; cb5f
wPlayerDamageTaken::
wcb60:: ds 1 ; cb60
wcb61:: ds 1 ; cb61
@@ -1776,7 +1776,7 @@ wcbb6:: ds 1 ; cbb6
wcbb7:: ds 1 ; cbb7
wcbb8:: ds 1 ; cbb8
wcbb9:: ds 1 ; cbb9
-wcbba:: ds 1 ; cbba
+wEnemyTurnsTaken:: db ; cbba
wcbbb:: ds 1 ; cbbb
wcbbc:: ds 1 ; cbbc
wcbbd:: ds 1 ; cbbd
@@ -1786,7 +1786,7 @@ wcbc0:: ds 1 ; cbc0
wCurPlayerMove:: ds 1 ; cbc1
wCurEnemyMove:: ds 1 ; cbc2
wcbc3:: ds 1 ; cbc3
-wcbc4:: ds 1 ; cbc4
+wEnemyItemState:: db ; cbc4
wcbc5:: ds 1 ; cbc5
wcbc6:: ds 1 ; cbc6
wcbc7:: ds 1 ; cbc7
@@ -1826,16 +1826,16 @@ wcbe9:: ds 1 ; cbe9
wcbea:: ds 1 ; cbea
wcbeb:: ds 1 ; cbeb
wcbec:: ds 1 ; cbec
-wcbed:: ds 1 ; cbed
+wEnemyGoesFirst:: db ; cbed
wcbee:: ds 1 ; cbee
-wcbef:: ds 1 ; cbef
+wEnemyIsSwitching:: db ; cbef
wcbf0:: ds 1 ; cbf0
wcbf1:: ds 1 ; cbf1
wcbf2:: ds 1 ; cbf2
wcbf3:: ds 1 ; cbf3
wcbf4:: ds 1 ; cbf4
-wcbf5:: ds 1 ; cbf5
-wcbf6:: ds 1 ; cbf6
+wEnemySwitchMonParam:: db ; cbf5
+wEnemySwitchMonIndex:: db ; cbf6
wcbf7:: ds 1 ; cbf7
wcbf8:: ds 1 ; cbf8
wLastPlayerMove:: ds 1 ; cbf9
@@ -1855,12 +1855,12 @@ wcc06:: ds 1 ; cc06
wcc07:: ds 1 ; cc07
wcc08:: ds 1 ; cc08
wcc09:: ds 1 ; cc09
-wcc0a:: ds 1 ; cc0a
+wEnemyRageCounter:: db ; cc0a
wcc0b:: ds 1 ; cc0b
wcc0c:: ds 1 ; cc0c
wcc0d:: ds 1 ; cc0d
wcc0e:: ds 1 ; cc0e
-wcc0f:: ds 1 ; cc0f
+wEnemyWrapCount:: db ; cc0f
wcc10:: ds 1 ; cc10
wcc11:: ds 1 ; cc11
wcc12:: ds 1 ; cc12
@@ -2722,8 +2722,17 @@ wTilesetPalettes:: dw ; d0cf
wd0d1:: ds 1 ; d0d1
wd0d2:: ds 1 ; d0d2
-UNION
-wCurHPAnim::
+UNION ; d0d3
+; general-purpose buffers
+wBuffer1:: db ; d0d3
+wBuffer2:: db ; d0d4
+wBuffer3:: db ; d0d5
+wBuffer4:: db ; d0d6
+wBuffer5:: db ; d0d7
+wBuffer6:: db ; d0d8
+
+NEXTU ; d0d3
+; HP bar animations
wCurHPAnimMaxHP:: dw ; d0d3
wCurHPAnimOldHP:: dw ; d0d5
wCurHPAnimNewHP:: dw ; d0d7
@@ -2733,23 +2742,16 @@ wNewHPBarPixels:: db ; d0db
wCurHPAnimDeltaHP:: dw ; d0dc
wCurHPAnimLowHP:: db ; d0de
wCurHPAnimHighHP:: db ; d0df
-wCurHPAnimEnd::
-NEXTU
-wBuffer1:: ds 1 ; d0d3
-wBuffer2:: ds 1 ; d0d4
-wBuffer3:: ds 1 ; d0d5
-wBuffer4:: ds 1 ; d0d6
-wBuffer5:: ds 1 ; d0d7
-wBuffer6:: ds 1 ; d0d8
-wd0d9:: ds 1 ; d0d9
-wd0da:: ds 1 ; d0da
-wd0db:: ds 1 ; d0db
-wLinkBuffer:: ds 1 ; d0dc
-wd0dd:: ds 1 ; d0dd
-wd0de:: ds 1 ; d0de
-wd0df:: ds 1 ; d0df
-ENDU
+NEXTU ; d0d3
+; miscellaneous
+wMagikarpLength:: dw
+wSelectedDecoration:: db
+wOtherDecoration:: db
+ ds 3
+wCurEnemyItem:: db
+ENDU ; d0e0
+
wd0e0:: ds 1 ; d0e0
wd0e1:: ds 1 ; d0e1
wd0e2:: ds 1 ; d0e2
@@ -2839,7 +2841,7 @@ wListMoves_MoveIndicesBuffer:: ds NUM_MOVES
wPutativeTMHMMove:: db ; d14d
wd14e:: ds 1 ; d14e
wWildMon:: ds 1 ; d14f
-wd150:: ds 1 ; d150
+wBattleHasJustStarted:: db ; d150
; d151 has many different short-term uses
wNamedObjectIndexBuffer::