From 7b676f5851a2b6fe0001f259afde6e9918b93683 Mon Sep 17 00:00:00 2001 From: YamaArashi Date: Wed, 15 Jul 2015 04:27:59 -0700 Subject: commented movement stuff --- engine/overworld/movement.asm | 234 ++++++++++++++++++++++-------------------- 1 file changed, 123 insertions(+), 111 deletions(-) (limited to 'engine/overworld/movement.asm') diff --git a/engine/overworld/movement.asm b/engine/overworld/movement.asm index 0cbb7f1c..5b9f878d 100644 --- a/engine/overworld/movement.asm +++ b/engine/overworld/movement.asm @@ -12,7 +12,7 @@ UpdatePlayerSprite: ; 4e31 (1:4e31) ; the maximum number for map tiles .checkIfTextBoxInFrontOfSprite aCoord 8, 9 - ld [$ff93], a + ld [hTilePlayerStandingOn], a cp $60 jr c, .lowerLeftTileIsMapTile .disableSprite @@ -21,52 +21,54 @@ UpdatePlayerSprite: ; 4e31 (1:4e31) ret .lowerLeftTileIsMapTile call DetectCollisionBetweenSprites - ld h, $c1 + ld h, wSpriteStateData1 / $100 ld a, [wWalkCounter] and a - jr nz, .asm_4e90 + jr nz, .moving ld a, [wd528] +; check if down bit 2, a - jr z, .notDown + jr z, .checkIfUp xor a ; ld a, SPRITE_FACING_DOWN - jr .done -.notDown + jr .next +.checkIfUp bit 3, a - jr z, .notUp + jr z, .checkIfLeft ld a, SPRITE_FACING_UP - jr .done -.notUp + jr .next +.checkIfLeft bit 1, a - jr z, .notLeft + jr z, .checkIfRight ld a, SPRITE_FACING_LEFT - jr .done -.notLeft + jr .next +.checkIfRight bit 0, a - jr z, .notRight + jr z, .notMoving ld a, SPRITE_FACING_RIGHT - jr .done -.notRight + jr .next +.notMoving +; zero the animation counters xor a ld [wSpriteStateData1 + 7], a ld [wSpriteStateData1 + 8], a - jr .asm_4eab -.done - ld [wSpriteStateData1 + 9], a + jr .calcImageIndex +.next + ld [wSpriteStateData1 + 9], a ; facing direction ld a, [wFontLoaded] bit 0, a - jr nz, .notRight -.asm_4e90 + jr nz, .notMoving +.moving ld a, [wd736] - bit 7, a - jr nz, .asm_4eb6 + bit 7, a ; is the player sprite spinning due to a spin tile? + jr nz, .skipSpriteAnim ld a, [H_CURRENTSPRITEOFFSET] add $7 ld l, a ld a, [hl] inc a ld [hl], a - cp $4 - jr nz, .asm_4eab + cp 4 + jr nz, .calcImageIndex xor a ld [hl], a inc hl @@ -74,28 +76,32 @@ UpdatePlayerSprite: ; 4e31 (1:4e31) inc a and $3 ld [hl], a -.asm_4eab +.calcImageIndex ld a, [wSpriteStateData1 + 8] ld b, a ld a, [wSpriteStateData1 + 9] add b ld [wSpriteStateData1 + 2], a -.asm_4eb6 - ld a, [$ff93] +.skipSpriteAnim +; If the player is standing on a grass tile, make the player's sprite have +; lower priority than the background so that it's partially obscured by the +; grass. Only the lower half of the sprite is permitted to have the priority +; bit set by later logic. + ld a, [hTilePlayerStandingOn] ld c, a ld a, [W_GRASSTILE] cp c ld a, $0 - jr nz, .asm_4ec3 + jr nz, .next2 ld a, $80 -.asm_4ec3 +.next2 ld [wSpriteStateData2 + $07], a ret -Func_4ec7: ; 4ec7 (1:4ec7) +UnusedReadSpriteDataFunction: ; 4ec7 (1:4ec7) push bc push af - ld a, [$ffda] + ld a, [H_CURRENTSPRITEOFFSET] ld c, a pop af add c @@ -103,7 +109,7 @@ Func_4ec7: ; 4ec7 (1:4ec7) pop bc ret -Func_4ed1: ; 4ed1 (1:4ed1) +UpdateNPCSprite: ; 4ed1 (1:4ed1) ld a, [H_CURRENTSPRITEOFFSET] swap a dec a @@ -148,40 +154,43 @@ Func_4ed1: ; 4ed1 (1:4ed1) ld l, a ld a, [hl] ; c2x6: movement byte 1 inc a - jr z, .asm_4f59 ; value $FF + jr z, .randomMovement ; value $FF inc a - jr z, .asm_4f59 ; value $FE + jr z, .randomMovement ; value $FE +; scripted movement dec a - ld [hl], a ; (temporarily) increment movement byte 1 + ld [hl], a ; increment movement byte 1 (movement data index) dec a push hl ld hl, wcf0f dec [hl] ; decrement wcf0f pop hl - ld de, wcc5b - call LoadDEPlusA ; a = [wcc5b + movement byte 1] + ld de, wNPCMovementDirections + call LoadDEPlusA ; a = [wNPCMovementDirections + movement byte 1] cp $e0 jp z, ChangeFacingDirection cp $ff - jr nz, .asm_4f4b - ld [hl], a ; reset movement byte 1 to initial value + jr nz, .next +; reached end of wNPCMovementDirections list + ld [hl], a ; store $ff in movement byte 1, disabling scripted movement ld hl, wd730 res 0, [hl] xor a ld [wSimulatedJoypadStatesIndex], a ld [wWastedByteCD3A], a ret -.asm_4f4b +.next cp $fe - jr nz, .asm_4f5f + jr nz, .determineDirection +; current NPC movement data is $fe. this seems buggy ld [hl], $1 ; set movement byte 1 to $1 - ld de, wcc5b - call LoadDEPlusA ; a = [wcc5b + $fe] (?) - jr .asm_4f5f -.asm_4f59 + ld de, wNPCMovementDirections + call LoadDEPlusA ; a = [wNPCMovementDirections + $fe] (?) + jr .determineDirection +.randomMovement call getTileSpriteStandsOn call Random -.asm_4f5f +.determineDirection ld b, a ld a, [wCurSpriteMovement2] cp $d0 @@ -199,7 +208,7 @@ Func_4ed1: ; 4ed1 (1:4ed1) cp $2 jr z, .moveLeft ; movement byte 2 = $2 only allows left or right .moveDown - ld de, 2*20 + ld de, 2*SCREEN_WIDTH add hl, de ; move tile pointer two rows down ld de, $100 @@ -212,7 +221,7 @@ Func_4ed1: ; 4ed1 (1:4ed1) cp $2 jr z, .moveRight ; movement byte 2 = $2 only allows left or right .moveUp - ld de, -2*20 + ld de, -2*SCREEN_WIDTH add hl, de ; move tile pointer two rows up ld de, $ff00 ld bc, $804 @@ -249,7 +258,7 @@ ChangeFacingDirection: ; 4fc8 (1:4fc8) ; c: new facing direction (0,4,8 or $c) ; d: Y movement delta (-1, 0 or 1) ; e: X movement delta (-1, 0 or 1) -; hl: pointer to tile the sprite would wlak onto +; hl: pointer to tile the sprite would walk onto ; set carry on failure, clears carry on success TryWalking: ; 4fcb (1:4fcb) push hl @@ -470,7 +479,7 @@ CheckSpriteAvailability: ; 50dc (1:50dc) ld l, a ld a, [hl] ; c2x6: movement byte 1 cp $fe - jr c, .skipXVisibilityTest ; movement byte 1 < $fe + jr c, .skipXVisibilityTest ; movement byte 1 < $fe (i.e. the sprite's movement is scripted) ld a, [H_CURRENTSPRITEOFFSET] add $4 ld l, a @@ -572,10 +581,11 @@ CanWalkOntoTile: ; 516e (1:516e) ld l, a ld a, [hl] ; c2x6 (movement byte 1) cp $fe - jr nc, .canMove ; values $fe and $ff + jr nc, .notScripted ; values $fe and $ff +; always allow walking if the movement is scripted and a ret -.canMove +.notScripted ld a, [W_TILESETCOLLISIONPTR] ld l, a ld a, [W_TILESETCOLLISIONPTR+1] @@ -713,53 +723,54 @@ LoadDEPlusA: ; 522f (1:522f) ld a, [de] ret -Func_5236: ; 5236 (1:5236) +DoScriptedNPCMovement: ; 5236 (1:5236) ld a, [wd730] bit 7, a ret z ld hl, wd72e bit 7, [hl] set 7, [hl] - jp z, Func_52a6 + jp z, InitScriptedNPCMovement ld hl, wNPCMovementDirections2 ld a, [wNPCMovementDirections2Index] add l ld l, a - jr nc, .asm_5251 + jr nc, .noCarry inc h -.asm_5251 +.noCarry ld a, [hl] +; check if moving up cp $40 - jr nz, .asm_525f - call Func_52b2 - ld c, $4 - ld a, $fe - jr .asm_5289 -.asm_525f + jr nz, .checkIfMovingDown + call GetSpriteScreenYPointer + ld c, SPRITE_FACING_UP + ld a, -2 + jr .move +.checkIfMovingDown cp $0 - jr nz, .asm_526c - call Func_52b2 - ld c, $0 - ld a, $2 - jr .asm_5289 -.asm_526c + jr nz, .checkIfMovingLeft + call GetSpriteScreenYPointer + ld c, SPRITE_FACING_DOWN + ld a, 2 + jr .move +.checkIfMovingLeft cp $80 - jr nz, .asm_5279 - call Func_52b7 - ld c, $8 - ld a, $fe - jr .asm_5289 -.asm_5279 + jr nz, .checkIfMovingRight + call GetSpriteScreenXPointer + ld c, SPRITE_FACING_LEFT + ld a, -2 + jr .move +.checkIfMovingRight cp $c0 - jr nz, .asm_5286 - call Func_52b7 - ld c, $c - ld a, $2 - jr .asm_5289 -.asm_5286 + jr nz, .noMatch + call GetSpriteScreenXPointer + ld c, SPRITE_FACING_RIGHT + ld a, 2 + jr .move +.noMatch cp $ff ret -.asm_5289 +.move ld b, a ld a, [hl] add b @@ -768,8 +779,8 @@ Func_5236: ; 5236 (1:5236) add $9 ld l, a ld a, c - ld [hl], a - call Func_52c3 + ld [hl], a ; facing direction + call AnimScriptedNPCMovement ld hl, wcf18 dec [hl] ret nz @@ -779,22 +790,23 @@ Func_5236: ; 5236 (1:5236) inc [hl] ret -Func_52a6: ; 52a6 (1:52a6) +InitScriptedNPCMovement: ; 52a6 (1:52a6) xor a ld [wNPCMovementDirections2Index], a ld a, $8 ld [wcf18], a - jp Func_52c3 + jp AnimScriptedNPCMovement -Func_52b2: ; 52b2 (1:52b2) +GetSpriteScreenYPointer: ; 52b2 (1:52b2) ld a, $4 ld b, a - jr asm_52ba + jr GetSpriteScreenXYPointerCommon -Func_52b7: ; 52b7 (1:52b7) +GetSpriteScreenXPointer: ; 52b7 (1:52b7) ld a, $6 ld b, a -asm_52ba: ; 52ba (1:52ba) + +GetSpriteScreenXYPointerCommon: ; 52ba (1:52ba) ld hl, wSpriteStateData1 ld a, [H_CURRENTSPRITEOFFSET] add l @@ -802,12 +814,12 @@ asm_52ba: ; 52ba (1:52ba) ld l, a ret -Func_52c3: ; 52c3 (1:52c3) +AnimScriptedNPCMovement: ; 52c3 (1:52c3) ld hl, wSpriteStateData2 ld a, [H_CURRENTSPRITEOFFSET] add $e ld l, a - ld a, [hl] + ld a, [hl] ; VRAM slot dec a swap a ld b, a @@ -815,47 +827,47 @@ Func_52c3: ; 52c3 (1:52c3) ld a, [H_CURRENTSPRITEOFFSET] add $9 ld l, a - ld a, [hl] - cp $0 - jr z, .asm_52ea - cp $4 - jr z, .asm_52ea - cp $8 - jr z, .asm_52ea - cp $c - jr z, .asm_52ea + ld a, [hl] ; facing direction + cp SPRITE_FACING_DOWN + jr z, .anim + cp SPRITE_FACING_UP + jr z, .anim + cp SPRITE_FACING_LEFT + jr z, .anim + cp SPRITE_FACING_RIGHT + jr z, .anim ret -.asm_52ea +.anim add b ld b, a - ld [$ffe9], a - call Func_5301 + ld [hSpriteVRAMSlotAndFacing], a + call AdvanceScriptedNPCAnimFrameCounter ld hl, wSpriteStateData1 ld a, [H_CURRENTSPRITEOFFSET] add $2 ld l, a - ld a, [$ffe9] + ld a, [hSpriteVRAMSlotAndFacing] ld b, a - ld a, [$ffea] + ld a, [hSpriteAnimFrameCounter] add b ld [hl], a ret -Func_5301: ; 5301 (1:5301) +AdvanceScriptedNPCAnimFrameCounter: ; 5301 (1:5301) ld a, [H_CURRENTSPRITEOFFSET] add $7 ld l, a - ld a, [hl] + ld a, [hl] ; intra-animation frame counter inc a ld [hl], a - cp $4 + cp 4 ret nz xor a - ld [hl], a + ld [hl], a ; reset intra-animation frame counter inc l - ld a, [hl] + ld a, [hl] ; animation frame counter inc a and $3 ld [hl], a - ld [$ffea], a + ld [hSpriteAnimFrameCounter], a ret -- cgit v1.3.1-sl0p From ac78dda7d8a4a6cf9af95f601bdac9fc348c65a6 Mon Sep 17 00:00:00 2001 From: YamaArashi Date: Wed, 15 Jul 2015 13:58:21 -0700 Subject: more movement stuff --- engine/overworld/movement.asm | 28 +++++---- engine/overworld/npc_movement.asm | 98 ++++++++++++++++--------------- engine/overworld/oam.asm | 6 +- home.asm | 4 +- hram.asm | 38 ++++++++++++- main.asm | 117 +++++++++++++++++++------------------- scripts/oakslab.asm | 8 +-- scripts/pallettown.asm | 21 +++---- wram.asm | 9 ++- 9 files changed, 192 insertions(+), 137 deletions(-) (limited to 'engine/overworld/movement.asm') diff --git a/engine/overworld/movement.asm b/engine/overworld/movement.asm index 5b9f878d..30793dec 100644 --- a/engine/overworld/movement.asm +++ b/engine/overworld/movement.asm @@ -188,7 +188,7 @@ UpdateNPCSprite: ; 4ed1 (1:4ed1) call LoadDEPlusA ; a = [wNPCMovementDirections + $fe] (?) jr .determineDirection .randomMovement - call getTileSpriteStandsOn + call GetTileSpriteStandsOn call Random .determineDirection ld b, a @@ -504,7 +504,7 @@ CheckSpriteAvailability: ; 50dc (1:50dc) .skipXVisibilityTest ; make the sprite invisible if a text box is in front of it ; $5F is the maximum number for map tiles - call getTileSpriteStandsOn + call GetTileSpriteStandsOn ld d, $60 ld a, [hli] cp d @@ -685,7 +685,7 @@ CanWalkOntoTile: ; 516e (1:516e) ; calculates the tile pointer pointing to the tile the current sprite stancs on ; this is always the lower left tile of the 2x2 tile blocks all sprites are snapped to ; hl: output pointer -getTileSpriteStandsOn: ; 5207 (1:5207) +GetTileSpriteStandsOn: ; 5207 (1:5207) ld h, $c1 ld a, [H_CURRENTSPRITEOFFSET] add $4 @@ -724,6 +724,10 @@ LoadDEPlusA: ; 522f (1:522f) ret DoScriptedNPCMovement: ; 5236 (1:5236) +; This is an alternative method of scripting an NPC's movement and is only used +; a few times in the game. It is used when the NPC and player must walk together +; in sync, such as when the player is following the NPC somewhere. An NPC can't +; be moved in sync with the player using the other method. ld a, [wd730] bit 7, a ret z @@ -740,28 +744,28 @@ DoScriptedNPCMovement: ; 5236 (1:5236) .noCarry ld a, [hl] ; check if moving up - cp $40 + cp NPC_MOVEMENT_UP jr nz, .checkIfMovingDown call GetSpriteScreenYPointer ld c, SPRITE_FACING_UP ld a, -2 jr .move .checkIfMovingDown - cp $0 + cp NPC_MOVEMENT_DOWN jr nz, .checkIfMovingLeft call GetSpriteScreenYPointer ld c, SPRITE_FACING_DOWN ld a, 2 jr .move .checkIfMovingLeft - cp $80 + cp NPC_MOVEMENT_LEFT jr nz, .checkIfMovingRight call GetSpriteScreenXPointer ld c, SPRITE_FACING_LEFT ld a, -2 jr .move .checkIfMovingRight - cp $c0 + cp NPC_MOVEMENT_RIGHT jr nz, .noMatch call GetSpriteScreenXPointer ld c, SPRITE_FACING_RIGHT @@ -781,11 +785,11 @@ DoScriptedNPCMovement: ; 5236 (1:5236) ld a, c ld [hl], a ; facing direction call AnimScriptedNPCMovement - ld hl, wcf18 + ld hl, wScriptedNPCWalkCounter dec [hl] ret nz - ld a, $8 - ld [wcf18], a + ld a, 8 + ld [wScriptedNPCWalkCounter], a ld hl, wNPCMovementDirections2Index inc [hl] ret @@ -793,8 +797,8 @@ DoScriptedNPCMovement: ; 5236 (1:5236) InitScriptedNPCMovement: ; 52a6 (1:52a6) xor a ld [wNPCMovementDirections2Index], a - ld a, $8 - ld [wcf18], a + ld a, 8 + ld [wScriptedNPCWalkCounter], a jp AnimScriptedNPCMovement GetSpriteScreenYPointer: ; 52b2 (1:52b2) diff --git a/engine/overworld/npc_movement.asm b/engine/overworld/npc_movement.asm index f27df648..aabc2de8 100755 --- a/engine/overworld/npc_movement.asm +++ b/engine/overworld/npc_movement.asm @@ -44,22 +44,25 @@ _EndNPCMovementScript: ; 1a41d (6:641d) ld [wSimulatedJoypadStatesEnd], a ret -ProfOakMovementScriptPointerTable: ; 1a442 (6:6442) - dw Func_1a44c - dw Func_1a485 - dw Func_1a4a1 - dw Func_1a4a6 - dw Func_1a4f4 +PalletMovementScriptPointerTable: ; 1a442 (6:6442) + dw PalletMovementScript_OakMoveLeft + dw PalletMovementScript_PlayerMoveLeft + dw PalletMovementScript_WaitAndWalkToLab + dw PalletMovementScript_WalkToLab + dw PalletMovementScript_Done -Func_1a44c: ; 1a44c (6:644c) +PalletMovementScript_OakMoveLeft: ; 1a44c (6:644c) ld a, [W_XCOORD] sub $a - ld [wcca1], a - jr z, .asm_1a475 - ld b, $0 + ld [wNumStepsToTake], a + jr z, .playerOnLeftTile +; The player is on the right tile of the northern path out of Pallet Town and +; Prof. Oak is below. +; Make Prof. Oak step to the left. + ld b, 0 ld c, a ld hl, wNPCMovementDirections2 - ld a, $80 + ld a, NPC_MOVEMENT_LEFT call FillMemory ld [hl], $ff ld a, [wSpriteIndex] @@ -68,36 +71,39 @@ Func_1a44c: ; 1a44c (6:644c) call MoveSprite ld a, $1 ld [wNPCMovementScriptFunctionNum], a - jr .asm_1a47a -.asm_1a475 + jr .done +; The player is on the left tile of the northern path out of Pallet Town and +; Prof. Oak is below. +; Prof. Oak is already on the right tile. +.playerOnLeftTile ld a, $3 ld [wNPCMovementScriptFunctionNum], a -.asm_1a47a +.done ld hl, W_FLAGS_D733 set 1, [hl] ld a, $fc ld [wJoyIgnore], a ret -Func_1a485: ; 1a485 (6:6485) +PalletMovementScript_PlayerMoveLeft: ; 1a485 (6:6485) ld a, [wd730] - bit 0, a - ret nz - ld a, [wcca1] + bit 0, a ; is an NPC being moved by a script? + ret nz ; return if Oak is still moving + ld a, [wNumStepsToTake] ld [wSimulatedJoypadStatesIndex], a - ld [$ff95], a + ld [hNPCMovementDirections2Index], a predef ConvertNPCMovementDirectionsToJoypadMasks call StartSimulatingJoypadStates ld a, $2 ld [wNPCMovementScriptFunctionNum], a ret -Func_1a4a1: ; 1a4a1 (6:64a1) +PalletMovementScript_WaitAndWalkToLab: ; 1a4a1 (6:64a1) ld a, [wSimulatedJoypadStatesIndex] - and a + and a ; is the player done moving left yet? ret nz -Func_1a4a6: ; 1a4a6 (6:64a6) +PalletMovementScript_WalkToLab: ; 1a4a6 (6:64a6) xor a ld [wOverrideSimulatedJoypadStatesMask], a ld a, [wSpriteIndex] @@ -122,12 +128,12 @@ Func_1a4a6: ; 1a4a6 (6:64a6) ret RLEList_ProfOakWalkToLab: ; 1a4dc (6:64dc) - db $00, $05 - db $80, $01 - db $00, $05 - db $C0, $03 - db $40, $01 - db $E0, $01 + db NPC_MOVEMENT_DOWN, $05 + db NPC_MOVEMENT_LEFT, $01 + db NPC_MOVEMENT_DOWN, $05 + db NPC_MOVEMENT_RIGHT, $03 + db NPC_MOVEMENT_UP, $01 + db $E0, $01 ; stand still db $FF RLEList_PlayerWalkToLab: ; 1a4e9 (6:64e9) @@ -138,7 +144,7 @@ RLEList_PlayerWalkToLab: ; 1a4e9 (6:64e9) db D_DOWN, $06 db $FF -Func_1a4f4: ; 1a4f4 (6:64f4) +PalletMovementScript_Done: ; 1a4f4 (6:64f4) ld a, [wSimulatedJoypadStatesIndex] and a ret nz @@ -152,10 +158,10 @@ Func_1a4f4: ; 1a4f4 (6:64f4) jp EndNPCMovementScript PewterMuseumGuyMovementScriptPointerTable: ; 1a510 (6:6510) - dw Func_1a514 - dw PewterMovementScriptDone + dw PewterMovementScript_WalkToMuseum + dw PewterMovementScript_Done -Func_1a514: ; 1a514 (6:6514) +PewterMovementScript_WalkToMuseum: ; 1a514 (6:6514) ld a, BANK(Music_MuseumGuy) ld [wc0ef], a ld [wc0f0], a @@ -191,13 +197,13 @@ RLEList_PewterMuseumPlayer: ; 1a559 (6:6559) db $FF RLEList_PewterMuseumGuy: ; 1a562 (6:6562) - db $40, $06 - db $80, $0D - db $40, $03 - db $80, $01 + db NPC_MOVEMENT_UP, $06 + db NPC_MOVEMENT_LEFT, $0D + db NPC_MOVEMENT_UP, $03 + db NPC_MOVEMENT_LEFT, $01 db $FF -PewterMovementScriptDone: ; 1a56b (6:656b) +PewterMovementScript_Done: ; 1a56b (6:656b) ld a, [wSimulatedJoypadStatesIndex] and a ret nz @@ -208,10 +214,10 @@ PewterMovementScriptDone: ; 1a56b (6:656b) jp EndNPCMovementScript PewterGymGuyMovementScriptPointerTable: ; 1a57d (6:657d) - dw Func_1a581 - dw PewterMovementScriptDone + dw PewterMovementScript_WalkToGym + dw PewterMovementScript_Done -Func_1a581: ; 1a581 (6:6581) +PewterMovementScript_WalkToGym: ; 1a581 (6:6581) ld a, BANK(Music_MuseumGuy) ld [wc0ef], a ld [wc0f0], a @@ -252,12 +258,12 @@ RLEList_PewterGymPlayer: ; 1a5cd (6:65cd) db $FF RLEList_PewterGymGuy: ; 1a5da (6:65da) - db $00, $02 - db $80, $0F - db $40, $05 - db $80, $0B - db $00, $05 - db $C0, $03 + db NPC_MOVEMENT_DOWN, $02 + db NPC_MOVEMENT_LEFT, $0F + db NPC_MOVEMENT_UP, $05 + db NPC_MOVEMENT_LEFT, $0B + db NPC_MOVEMENT_DOWN, $05 + db NPC_MOVEMENT_RIGHT, $03 db $FF FreezeEnemyTrainerSprite: ; 1a5e7 (6:65e7) diff --git a/engine/overworld/oam.asm b/engine/overworld/oam.asm index 0bd16e1a..41360965 100644 --- a/engine/overworld/oam.asm +++ b/engine/overworld/oam.asm @@ -16,10 +16,10 @@ PrepareOAMData: ld [hOAMBufferOffset], a .spriteLoop - ld [hSpriteDataOffset2], a + ld [hSpriteOffset2], a ld d, wSpriteStateData1 / $100 - ld a, [hSpriteDataOffset2] + ld a, [hSpriteOffset2] ld e, a ld a, [de] ; c1x0 and a @@ -139,7 +139,7 @@ PrepareOAMData: ld [hOAMBufferOffset], a .nextSprite - ld a, [hSpriteDataOffset2] + ld a, [hSpriteOffset2] add $10 cp $100 % $100 jp nz, .spriteLoop diff --git a/home.asm b/home.asm index 8109c9c4..f2226eea 100644 --- a/home.asm +++ b/home.asm @@ -2195,7 +2195,7 @@ RunNPCMovementScript:: ; 310e (0:310e) ld [MBC1RomBank], a ret .NPCMovementScriptPointerTables - dw ProfOakMovementScriptPointerTable + dw PalletMovementScriptPointerTable dw PewterMuseumGuyMovementScriptPointerTable dw PewterGymGuyMovementScriptPointerTable .playerStepOutFromDoor @@ -3078,7 +3078,7 @@ MoveSprite_:: ; 363d (0:363d) ld [wWastedByteCD3A],a ret -; divides [$ffe5] by [$ffe6] and stores the quotient in [$ffe7] +; divides [hDividend2] by [hDivisor2] and stores the quotient in [hQuotient2] DivideBytes:: ; 366b (0:366b) push hl ld hl, $ffe7 diff --git a/hram.asm b/hram.asm index 55f757ff..f3bacee1 100644 --- a/hram.asm +++ b/hram.asm @@ -28,7 +28,7 @@ hPartyMonIndex EQU $FF8C hHalveItemPrices EQU $FF8E -hSpriteDataOffset2 EQU $FF8F +hSpriteOffset2 EQU $FF8F hOAMBufferOffset EQU $FF90 @@ -39,6 +39,11 @@ hTilePlayerStandingOn EQU $FF93 hSpritePriority EQU $FF94 +hNPCMovementDirections2Index EQU $FF95 + +; CalcPositionOfPlayerRelativeToNPC +hNPCSpriteOffset EQU $FF95 + ; Multiplcation and division variables are meant ; to overlap for back-to-back usage. Big endian. @@ -57,6 +62,33 @@ H_NUMTOPRINT EQU $FF96 ; 3 bytes H_POWEROFTEN EQU $FF99 ; 3 bytes H_SAVEDNUMTOPRINT EQU $FF9C ; 3 bytes +; distance in steps between NPC and player +hNPCPlayerYDistance EQU $FF95 +hNPCPlayerXDistance EQU $FF96 + +hFindPathNumSteps EQU $FF97 + +; bit 0: set when the end of the path's Y coordinate matches the target's +; bit 1: set when the end of the path's X coordinate matches the target's +; When both bits are set, the end of the path is at the target's position +; (i.e. the path has been found). +hFindPathFlags EQU $FF98 + +hFindPathYProgress EQU $FF99 +hFindPathXProgress EQU $FF9A + +; 0 = from player to NPC +; 1 = from NPC to player +hNPCPlayerRelativePosPerspective EQU $FF9B + +; bit 0: +; 0 = target is to the south or aligned +; 1 = target is to the north +; bit 1: +; 0 = target is to the east or aligned +; 1 = target is to the west +hNPCPlayerRelativePosFlags EQU $FF9D + hSerialReceivedNewData EQU $FFA9 ; $01 = using external clock @@ -166,6 +198,10 @@ hTilesetType EQU $FFD7 H_CURRENTSPRITEOFFSET EQU $FFDA ; multiple of $10 +hDividend2 EQU $FFE5 +hDivisor2 EQU $FFE6 +hQuotient2 EQU $FFE7 + hSpriteVRAMSlotAndFacing EQU $FFE9 hSpriteAnimFrameCounter EQU $FFEA diff --git a/main.asm b/main.asm index 1d288543..4558f319 100755 --- a/main.asm +++ b/main.asm @@ -4521,72 +4521,75 @@ IsItemInBag_: ; f8a5 (3:78a5) FindPathToPlayer: ; f8ba (3:78ba) xor a - ld hl, $ff97 - ld [hli], a - ld [hli], a - ld [hli], a - ld [hl], a + ld hl, hFindPathNumSteps + ld [hli], a ; hFindPathNumSteps + ld [hli], a ; hFindPathFlags + ld [hli], a ; hFindPathYProgress + ld [hl], a ; hFindPathXProgress ld hl, wNPCMovementDirections2 ld de, $0 .loop - ld a, [$ff99] + ld a, [hFindPathYProgress] ld b, a - ld a, [$ff95] ; Y distance in steps + ld a, [hNPCPlayerYDistance] ; Y distance in steps call CalcDifference ld d, a and a jr nz, .asm_f8da - ld a, [$ff98] - set 0, a - ld [$ff98], a + ld a, [hFindPathFlags] + set 0, a ; current end of path matches the player's Y coordinate + ld [hFindPathFlags], a .asm_f8da - ld a, [$ff9a] + ld a, [hFindPathXProgress] ld b, a - ld a, [$ff96] ; X distance in steps + ld a, [hNPCPlayerXDistance] ; X distance in steps call CalcDifference ld e, a and a jr nz, .asm_f8ec - ld a, [$ff98] - set 1, a - ld [$ff98], a + ld a, [hFindPathFlags] + set 1, a ; current end of path matches the player's X coordinate + ld [hFindPathFlags], a .asm_f8ec - ld a, [$ff98] - cp $3 + ld a, [hFindPathFlags] + cp $3 ; has the end of the path reached the player's position? jr z, .done +; Compare whether the X distance between the player and the current of the path +; is greater or if the Y distance is. Then, try to reduce whichever is greater. ld a, e cp d - jr c, .asm_f90a - ld a, [$ff9d] + jr c, .yDistanceGreater +; x distance is greater + ld a, [hNPCPlayerRelativePosFlags] bit 1, a - jr nz, .asm_f900 + jr nz, .playerIsLeftOfNPC ld d, NPC_MOVEMENT_RIGHT - jr .asm_f902 -.asm_f900 + jr .next1 +.playerIsLeftOfNPC ld d, NPC_MOVEMENT_LEFT -.asm_f902 - ld a, [$ff9a] - add $1 - ld [$ff9a], a - jr .asm_f91c -.asm_f90a - ld a, [$ff9d] +.next1 + ld a, [hFindPathXProgress] + add 1 + ld [hFindPathXProgress], a + jr .storeDirection +.yDistanceGreater + ld a, [hNPCPlayerRelativePosFlags] bit 0, a - jr nz, .asm_f914 + jr nz, .playerIsAboveNPC ld d, NPC_MOVEMENT_DOWN - jr .asm_f916 -.asm_f914 + jr .next2 +.playerIsAboveNPC ld d, NPC_MOVEMENT_UP -.asm_f916 - ld a, [$ff99] - add $1 - ld [$ff99], a -.asm_f91c +.next2 + ld a, [hFindPathYProgress] + add 1 + ld [hFindPathYProgress], a +.storeDirection ld a, d ld [hli], a - ld a, [$ff97] + ld a, [hFindPathNumSteps] inc a - ld [$ff97], a + ld [hFindPathNumSteps], a jp .loop .done ld [hl], $ff @@ -4594,13 +4597,13 @@ FindPathToPlayer: ; f8ba (3:78ba) CalcPositionOfPlayerRelativeToNPC: ; f929 (3:7929) xor a - ld [$ff9d], a + ld [hNPCPlayerRelativePosFlags], a ld a, [wSpriteStateData1 + 4] ; player's sprite screen Y position in pixels ld d, a ld a, [wSpriteStateData1 + 6] ; player's sprite screen X position in pixels ld e, a ld hl, wSpriteStateData1 - ld a, [$ff95] ; sprite offset + ld a, [hNPCSpriteOffset] add l add $4 ld l, a @@ -4614,26 +4617,26 @@ CalcPositionOfPlayerRelativeToNPC: ; f929 (3:7929) jr nc, .NPCSouthOfOrAlignedWithPlayer .NPCNorthOfPlayer push hl - ld hl, $ff9d + ld hl, hNPCPlayerRelativePosFlags bit 0, [hl] set 0, [hl] pop hl jr .divideYDistance .NPCSouthOfOrAlignedWithPlayer push hl - ld hl, $ff9d + ld hl, hNPCPlayerRelativePosFlags bit 0, [hl] res 0, [hl] pop hl .divideYDistance push hl - ld hl, $ffe5 + ld hl, hDividend2 ld [hli], a ld a, 16 ld [hli], a call DivideBytes ; divide Y absolute distance by 16 ld a, [hl] ; quotient - ld [$ff95], a + ld [hNPCPlayerYDistance], a pop hl inc hl ld b, e @@ -4642,35 +4645,35 @@ CalcPositionOfPlayerRelativeToNPC: ; f929 (3:7929) jr nc, .NPCEastOfOrAlignedWithPlayer .NPCWestOfPlayer push hl - ld hl, $ff9d + ld hl, hNPCPlayerRelativePosFlags bit 1, [hl] set 1, [hl] pop hl jr .divideXDistance .NPCEastOfOrAlignedWithPlayer push hl - ld hl, $ff9d + ld hl, hNPCPlayerRelativePosFlags bit 1, [hl] res 1, [hl] pop hl .divideXDistance - ld [$ffe5], a + ld [hDividend2], a ld a, 16 - ld [$ffe6], a + ld [hDivisor2], a call DivideBytes ; divide X absolute distance by 16 - ld a, [$ffe7] ; quotient - ld [$ff96], a - ld a, [$ff9b] + ld a, [hQuotient2] + ld [hNPCPlayerXDistance], a + ld a, [hNPCPlayerRelativePosPerspective] and a ret z - ld a, [$ff9d] + ld a, [hNPCPlayerRelativePosFlags] cpl and $3 - ld [$ff9d], a + ld [hNPCPlayerRelativePosFlags], a ret ConvertNPCMovementDirectionsToJoypadMasks: ; f9a0 (3:79a0) - ld a, [$ff95] + ld a, [hNPCMovementDirections2Index] ld [wNPCMovementDirections2Index], a dec a ld de, wSimulatedJoypadStatesEnd @@ -4684,9 +4687,9 @@ ConvertNPCMovementDirectionsToJoypadMasks: ; f9a0 (3:79a0) call ConvertNPCMovementDirectionToJoypadMask ld [de], a inc de - ld a, [$ff95] + ld a, [hNPCMovementDirections2Index] dec a - ld [$ff95], a + ld [hNPCMovementDirections2Index], a jr nz, .loop ret diff --git a/scripts/oakslab.asm b/scripts/oakslab.asm index 1c255103..b32647b5 100755 --- a/scripts/oakslab.asm +++ b/scripts/oakslab.asm @@ -333,14 +333,14 @@ OaksLabScript10: ; 1cd6d (7:4d6d) ld [$ff8c], a call DisplayTextID ld a, $1 - ld [$ff9b], a + ld [hNPCPlayerRelativePosPerspective], a ld a, $1 swap a - ld [$ff95], a + ld [hNPCSpriteOffset], a predef CalcPositionOfPlayerRelativeToNPC - ld a, [$ff95] + ld a, [hNPCPlayerYDistance] dec a - ld [$ff95], a + ld [hNPCPlayerYDistance], a predef FindPathToPlayer ld de, wNPCMovementDirections2 ld a, $1 diff --git a/scripts/pallettown.asm b/scripts/pallettown.asm index 19a06190..5b042066 100755 --- a/scripts/pallettown.asm +++ b/scripts/pallettown.asm @@ -33,7 +33,7 @@ PalletTownScript0: ; 18e81 (6:4e81) ld a,$FF call PlaySound ; stop music ld a, BANK(Music_MeetProfOak) - ld c,a ; song bank + ld c,a ld a, MUSIC_MEET_PROF_OAK ; “oak appears” music call PlayMusic ld a,$FC @@ -50,7 +50,7 @@ PalletTownScript1: ; 18eb2 (6:4eb2) xor a ld [wcf0d],a ld a,1 - ld [$FF8C],a + ld [hSpriteIndexOrTextID],a call DisplayTextID ld a,$FF ld [wJoyIgnore],a @@ -65,25 +65,25 @@ PalletTownScript1: ; 18eb2 (6:4eb2) PalletTownScript2: ; 18ed2 (6:4ed2) ld a,1 - ld [$FF8C],a - ld a,4 + ld [H_SPRITEINDEX],a + ld a,SPRITE_FACING_UP ld [$FF8D],a call SetSpriteFacingDirectionAndDelay call Delay3 ld a,1 ld [W_YCOORD],a ld a,1 - ld [$FF9B],a + ld [hNPCPlayerRelativePosPerspective],a ld a,1 swap a - ld [$FF95],a + ld [hNPCSpriteOffset],a predef CalcPositionOfPlayerRelativeToNPC - ld hl,$FF95 + ld hl,hNPCPlayerYDistance dec [hl] predef FindPathToPlayer ; load Oak’s movement into wNPCMovementDirections2 ld de,wNPCMovementDirections2 ld a,1 ; oak - ld [$FF8C],a + ld [H_SPRITEINDEX],a call MoveSprite ld a,$FF ld [wJoyIgnore],a @@ -104,8 +104,9 @@ PalletTownScript3: ; 18f12 (6:4f12) ld a,$FC ld [wJoyIgnore],a ld a,1 - ld [$FF8C],a + ld [hSpriteIndexOrTextID],a call DisplayTextID +; set up movement script that causes the player to follow Oak to his lab ld a,$FF ld [wJoyIgnore],a ld a,1 @@ -124,7 +125,7 @@ PalletTownScript3: ; 18f12 (6:4f12) PalletTownScript4: ; 18f4b (6:4f4b) ld a,[wNPCMovementScriptPointerTableNum] - and a + and a ; is the movement script over? ret nz ; trigger the next script diff --git a/wram.asm b/wram.asm index 4658b84d..fa9305ef 100755 --- a/wram.asm +++ b/wram.asm @@ -390,7 +390,9 @@ wSwitchPartyMonTempBuffer:: ; cc97 ; temporary buffer when swapping party mon data ds 10 -wcca1:: ds 49 ; used in overworld npc movement +wNumStepsToTake:: ; cca1 +; used in Pallet Town scripted movement + ds 49 wRLEByteCount:: ; ccd2 ds 1 @@ -988,7 +990,10 @@ wNPCMovementScriptSpriteOffset:: ; cf17 ; sprite offset of sprite being controlled by NPC movement script ds 1 -wcf18:: ds 2 ; used with overworld movement +wScriptedNPCWalkCounter:: ; cf18 + ds 1 + + ds 1 wGBC:: ; cf1a ds 1 -- cgit v1.3.1-sl0p