summaryrefslogtreecommitdiff
path: root/home/trainers.asm
diff options
context:
space:
mode:
authorlibjet <libj3t@gmail.com>2020-02-19 20:08:53 +0000
committerlibjet <libj3t@gmail.com>2020-02-19 20:08:53 +0000
commit20950e734d57acf65f2d4156a03b3bde9af75bd8 (patch)
tree85f267a824cf1be7ec5b20ea9c25bebb1da82a32 /home/trainers.asm
parent80c1fcee10440ac1de77119ea5119cd28bdf42b5 (diff)
Add home/trainers.asm
Diffstat (limited to 'home/trainers.asm')
-rwxr-xr-xhome/trainers.asm254
1 files changed, 254 insertions, 0 deletions
diff --git a/home/trainers.asm b/home/trainers.asm
new file mode 100755
index 00000000..c86c8aeb
--- /dev/null
+++ b/home/trainers.asm
@@ -0,0 +1,254 @@
+CheckTrainerBattle::
+ ldh a, [hROMBank]
+ push af
+
+ call SwitchToMapScriptsBank
+ call _CheckTrainerBattle
+
+ pop bc
+ ld a, b
+ rst Bankswitch
+ ret
+
+_CheckTrainerBattle::
+; Check if any trainer on the map sees the player and wants to battle.
+
+; Skip the player object.
+ ld a, 2
+ ld de, wMap2Object
+
+.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 OBJECTTYPE_TRAINER
+ 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, MAPOBJECT_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
+ ldh [hLastTalked], a
+ ld a, b
+ ld [wSeenTrainerDistance], a
+ ld a, c
+ ld [wSeenTrainerDirection], a
+ jr LoadTrainer_continue
+
+TalkToTrainer::
+ ld a, 1
+ ld [wSeenTrainerDistance], a
+ ld a, -1
+ ld [wSeenTrainerDirection], a
+
+LoadTrainer_continue::
+ call GetMapScriptsBank
+ ld [wSeenTrainerBank], a
+
+ ldh a, [hLastTalked]
+ call GetMapObject
+
+ ld hl, MAPOBJECT_SCRIPT_POINTER
+ add hl, bc
+ ld a, [wSeenTrainerBank]
+ call GetFarHalfword
+ ld de, wTempTrainer
+ ld bc, wTempTrainerEnd - wTempTrainer
+ ld a, [wSeenTrainerBank]
+ call FarCopyBytes
+ xor a
+ ld [wRunningTrainerBattleScript], a
+ scf
+ ret
+
+FacingPlayerDistance_bc::
+ push de
+ call FacingPlayerDistance
+ ld b, d
+ ld c, e
+ pop de
+ ret
+
+FacingPlayerDistance::
+; Return carry if the sprite at bc is facing the player,
+; its distance in d, and its direction in e.
+
+ 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, [wPlayerStandingMapX]
+ cp d
+ jr z, .CheckY
+
+ ld a, [wPlayerStandingMapY]
+ cp e
+ jr z, .CheckX
+
+ and a
+ ret
+
+.CheckY:
+ ld a, [wPlayerStandingMapY]
+ 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, [wPlayerStandingMapX]
+ 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
+
+CheckTrainerFlag::
+ 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 GetMapScriptsBank
+ 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
+
+PrintWinLossText::
+ ld a, [wBattleType]
+ cp BATTLETYPE_CANLOSE
+ jr .canlose ; ??????????
+
+; unused
+ ld hl, wWinTextPointer
+ jr .ok
+
+.canlose
+ ld a, [wBattleResult]
+ ld hl, wWinTextPointer
+ and a ; WIN?
+ jr z, .ok
+ ld hl, wLossTextPointer
+
+.ok
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call GetMapScriptsBank
+ call FarPrintText
+ call WaitBGMap
+ call WaitPressAorB_BlinkCursor
+ ret \ No newline at end of file