summaryrefslogtreecommitdiff
path: root/home/trainers.asm
diff options
context:
space:
mode:
Diffstat (limited to 'home/trainers.asm')
-rw-r--r--home/trainers.asm263
1 files changed, 263 insertions, 0 deletions
diff --git a/home/trainers.asm b/home/trainers.asm
new file mode 100644
index 000000000..857a95629
--- /dev/null
+++ b/home/trainers.asm
@@ -0,0 +1,263 @@
+CheckTrainerBattle2:: ; 3600
+ ld a, [hROMBank]
+ push af
+
+ call SwitchToMapScriptHeaderBank
+ call CheckTrainerBattle
+
+ pop bc
+ ld a, b
+ rst Bankswitch
+ ret
+; 360d
+
+CheckTrainerBattle:: ; 360d
+; Check if any trainer on the map sees the player and wants to battle.
+
+; Skip the player object.
+ ld a, 1
+ ld de, MapObjects + OBJECT_LENGTH
+
+.loop
+
+; Start a battle if the object:
+
+ push af
+ push de
+
+; Has a sprite
+ ld hl, MAPOBJECT_SPRITE
+ add hl, de
+ ld a, [hl]
+ and a
+ jr z, .next
+
+; Is a trainer
+ ld hl, MAPOBJECT_COLOR
+ add hl, de
+ ld a, [hl]
+ and $f
+ cp $2
+ jr nz, .next
+
+; Is visible on the map
+ ld hl, MAPOBJECT_OBJECT_STRUCT_ID
+ add hl, de
+ ld a, [hl]
+ cp -1
+ jr z, .next
+
+; Is facing the player...
+ call GetObjectStruct
+ call FacingPlayerDistance_bc
+ jr nc, .next
+
+; ...within their sight range
+ ld hl, MAPOBJECT_RANGE
+ add hl, de
+ ld a, [hl]
+ cp b
+ jr c, .next
+
+; And hasn't already been beaten
+ push bc
+ push de
+ ld hl, MAPOBJECT_SCRIPT_POINTER
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld b, CHECK_FLAG
+ call EventFlagAction
+ ld a, c
+ pop de
+ pop bc
+ and a
+ jr z, .startbattle
+
+.next
+ pop de
+ ld hl, OBJECT_LENGTH
+ add hl, de
+ ld d, h
+ ld e, l
+
+ pop af
+ inc a
+ cp NUM_OBJECTS
+ jr nz, .loop
+ xor a
+ ret
+
+.startbattle
+ pop de
+ pop af
+ ld [hLastTalked], a
+ ld a, b
+ ld [EngineBuffer2], a
+ ld a, c
+ ld [EngineBuffer3], a
+ jr LoadTrainer_continue
+; 3674
+
+TalkToTrainer:: ; 3674
+ ld a, 1
+ ld [EngineBuffer2], a
+ ld a, -1
+ ld [EngineBuffer3], a
+
+LoadTrainer_continue:: ; 367e
+ call GetMapScriptHeaderBank
+ ld [EngineBuffer1], a
+
+ ld a, [hLastTalked]
+ call GetMapObject
+
+ ld hl, MAPOBJECT_SCRIPT_POINTER
+ add hl, bc
+ ld a, [EngineBuffer1]
+ call GetFarHalfword
+ ld de, wTempTrainerHeader
+ ld bc, wTempTrainerHeaderEnd - wTempTrainerHeader
+ ld a, [EngineBuffer1]
+ call FarCopyBytes
+ xor a
+ ld [wRunningTrainerBattleScript], a
+ scf
+ ret
+; 36a5
+
+FacingPlayerDistance_bc:: ; 36a5
+
+ push de
+ call FacingPlayerDistance
+ ld b, d
+ ld c, e
+ pop de
+ ret
+; 36ad
+
+FacingPlayerDistance:: ; 36ad
+; Return carry if the sprite at bc is facing the player,
+; and its distance in d.
+
+ ld hl, OBJECT_NEXT_MAP_X ; x
+ add hl, bc
+ ld d, [hl]
+
+ ld hl, OBJECT_NEXT_MAP_Y ; y
+ add hl, bc
+ ld e, [hl]
+
+ ld a, [PlayerStandingMapX]
+ cp d
+ jr z, .CheckY
+
+ ld a, [PlayerStandingMapY]
+ cp e
+ jr z, .CheckX
+
+ and a
+ ret
+
+.CheckY:
+ ld a, [PlayerStandingMapY]
+ sub e
+ jr z, .NotFacing
+ jr nc, .Above
+
+; Below
+ cpl
+ inc a
+ ld d, a
+ ld e, OW_UP
+ jr .CheckFacing
+
+.Above:
+ ld d, a
+ ld e, OW_DOWN
+ jr .CheckFacing
+
+.CheckX:
+ ld a, [PlayerStandingMapX]
+ sub d
+ jr z, .NotFacing
+ jr nc, .Left
+
+; Right
+ cpl
+ inc a
+ ld d, a
+ ld e, OW_LEFT
+ jr .CheckFacing
+
+.Left:
+ ld d, a
+ ld e, OW_RIGHT
+
+.CheckFacing:
+ call GetSpriteDirection
+ cp e
+ jr nz, .NotFacing
+ scf
+ ret
+
+.NotFacing:
+ and a
+ ret
+; 36f5
+
+CheckTrainerFlag:: ; 36f5
+ push bc
+ ld hl, OBJECT_MAP_OBJECT_INDEX
+ add hl, bc
+ ld a, [hl]
+ call GetMapObject
+ ld hl, MAPOBJECT_SCRIPT_POINTER
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call GetMapScriptHeaderBank
+ call GetFarHalfword
+ ld d, h
+ ld e, l
+ push de
+ ld b, CHECK_FLAG
+ call EventFlagAction
+ pop de
+ ld a, c
+ and a
+ pop bc
+ ret
+; 3718
+
+PrintWinLossText:: ; 3718
+ ld a, [BattleType]
+ cp BATTLETYPE_CANLOSE
+ jr .canlose ; ??????????
+
+; unreferenced
+ ld hl, wWinTextPointer
+ jr .ok
+
+.canlose
+ ld a, [wBattleResult]
+ ld hl, wWinTextPointer
+ and $f
+ jr z, .ok
+ ld hl, wLossTextPointer
+
+.ok
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call GetMapScriptHeaderBank
+ call FarPrintText
+ call WaitBGMap
+ call WaitPressAorB_BlinkCursor
+ ret
+; 3741