diff options
Diffstat (limited to 'home')
-rw-r--r-- | home/map.asm | 8 | ||||
-rwxr-xr-x | home/trainers.asm | 254 |
2 files changed, 258 insertions, 4 deletions
diff --git a/home/map.asm b/home/map.asm index d1c522d8..5a35ffab 100644 --- a/home/map.asm +++ b/home/map.asm @@ -947,7 +947,7 @@ ClearObjectStructs:: ; 2550 (0:2550) ret RestoreFacingAfterWarp:: - call GetMapScriptHeaderBank + call GetMapScriptsBank rst Bankswitch ld hl, wd08f ld a, [hli] @@ -1253,7 +1253,7 @@ CallMapScript:: ld a, [wd15f] and a ret nz - call GetMapScriptHeaderBank + call GetMapScriptsBank jr CallScript RunMapCallback:: ; 2764 (0:2764) @@ -1263,7 +1263,7 @@ RunMapCallback:: ; 2764 (0:2764) call SwitchToMapScriptsBank call FindCallback jr nc, .asm_2779 - call GetMapScriptHeaderBank + call GetMapScriptsBank ld b, a ld d, h ld e, l @@ -2256,7 +2256,7 @@ SwitchToMapScriptsBank:: ; 2d2b (0:2d2b) rst Bankswitch ret -GetMapScriptHeaderBank:: ; 2d30 (0:2d30) +GetMapScriptsBank:: ; 2d30 (0:2d30) ld a, [wd08c] ret 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 |