summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xengine/math.asm190
-rwxr-xr-xengine/npc_movement.asm525
-rw-r--r--main.asm7
3 files changed, 719 insertions, 3 deletions
diff --git a/engine/math.asm b/engine/math.asm
new file mode 100755
index 00000000..7cc35eb4
--- /dev/null
+++ b/engine/math.asm
@@ -0,0 +1,190 @@
+Multiply_:: ; 67bd
+
+; hMultiplier is one byte.
+ ld a, 8
+ ld b, a
+
+ xor a
+ ld [hProduct], a
+ ld [hMathBuffer + 1], a
+ ld [hMathBuffer + 2], a
+ ld [hMathBuffer + 3], a
+ ld [hMathBuffer + 4], a
+
+.loop
+ ld a, [hMultiplier]
+ srl a
+ ld [hMultiplier], a
+ jr nc, .next
+
+ ld a, [hMathBuffer + 4]
+ ld c, a
+ ld a, [hMultiplicand + 2]
+ add c
+ ld [hMathBuffer + 4], a
+
+ ld a, [hMathBuffer + 3]
+ ld c, a
+ ld a, [hMultiplicand + 1]
+ adc c
+ ld [hMathBuffer + 3], a
+
+ ld a, [hMathBuffer + 2]
+ ld c, a
+ ld a, [hMultiplicand + 0]
+ adc c
+ ld [hMathBuffer + 2], a
+
+ ld a, [hMathBuffer + 1]
+ ld c, a
+ ld a, [hProduct]
+ adc c
+ ld [hMathBuffer + 1], a
+
+.next
+ dec b
+ jr z, .done
+
+; hMultiplicand <<= 1
+
+ ld a, [hMultiplicand + 2]
+ add a
+ ld [hMultiplicand + 2], a
+
+ ld a, [hMultiplicand + 1]
+ rla
+ ld [hMultiplicand + 1], a
+
+ ld a, [hMultiplicand + 0]
+ rla
+ ld [hMultiplicand + 0], a
+
+ ld a, [hProduct]
+ rla
+ ld [hProduct], a
+
+ jr .loop
+
+.done
+ ld a, [hMathBuffer + 4]
+ ld [hProduct + 3], a
+
+ ld a, [hMathBuffer + 3]
+ ld [hProduct + 2], a
+
+ ld a, [hMathBuffer + 2]
+ ld [hProduct + 1], a
+
+ ld a, [hMathBuffer + 1]
+ ld [hProduct + 0], a
+
+ ret
+
+Divide_:: ; 681d
+ xor a
+ ld [hMathBuffer + 0], a
+ ld [hMathBuffer + 1], a
+ ld [hMathBuffer + 2], a
+ ld [hMathBuffer + 3], a
+ ld [hMathBuffer + 4], a
+
+ ld a, 9
+ ld e, a
+
+.loop
+ ld a, [hMathBuffer + 0]
+ ld c, a
+ ld a, [hDividend + 1]
+ sub c
+ ld d, a
+
+ ld a, [hDivisor]
+ ld c, a
+ ld a, [hDividend + 0]
+ sbc c
+ jr c, .next
+
+ ld [hDividend + 0], a
+
+ ld a, d
+ ld [hDividend + 1], a
+
+ ld a, [hMathBuffer + 4]
+ inc a
+ ld [hMathBuffer + 4], a
+
+ jr .loop
+
+.next
+ ld a, b
+ cp 1
+ jr z, .done
+
+ ld a, [hMathBuffer + 4]
+ add a
+ ld [hMathBuffer + 4], a
+
+ ld a, [hMathBuffer + 3]
+ rla
+ ld [hMathBuffer + 3], a
+
+ ld a, [hMathBuffer + 2]
+ rla
+ ld [hMathBuffer + 2], a
+
+ ld a, [hMathBuffer + 1]
+ rla
+ ld [hMathBuffer + 1], a
+
+ dec e
+ jr nz, .next2
+
+ ld e, 8
+ ld a, [hMathBuffer + 0]
+ ld [hDivisor], a
+ xor a
+ ld [hMathBuffer + 0], a
+
+ ld a, [hDividend + 1]
+ ld [hDividend + 0], a
+
+ ld a, [hDividend + 2]
+ ld [hDividend + 1], a
+
+ ld a, [hDividend + 3]
+ ld [hDividend + 2], a
+
+.next2
+ ld a, e
+ cp 1
+ jr nz, .okay
+ dec b
+
+.okay
+ ld a, [hDivisor]
+ srl a
+ ld [hDivisor], a
+
+ ld a, [hMathBuffer + 0]
+ rr a
+ ld [hMathBuffer + 0], a
+
+ jr .loop
+
+.done
+ ld a, [hDividend + 1]
+ ld [hDivisor], a
+
+ ld a, [hMathBuffer + 4]
+ ld [hDividend + 3], a
+
+ ld a, [hMathBuffer + 3]
+ ld [hDividend + 2], a
+
+ ld a, [hMathBuffer + 2]
+ ld [hDividend + 1], a
+
+ ld a, [hMathBuffer + 1]
+ ld [hDividend + 0], a
+
+ ret
diff --git a/engine/npc_movement.asm b/engine/npc_movement.asm
new file mode 100755
index 00000000..78939e47
--- /dev/null
+++ b/engine/npc_movement.asm
@@ -0,0 +1,525 @@
+CheckNPCMovementPermissions: ; 6fa0 (1:6fa0)
+ ld hl, $6
+ add hl, bc
+ bit 5, [hl]
+ jr z, .asm_6fb8
+ ld hl, $4
+ add hl, bc
+ bit 4, [hl]
+ push hl
+ push bc
+ call Function700b
+ pop bc
+ pop hl
+ ret c
+ jr .asm_6fc8
+
+.asm_6fb8
+ ld hl, $4
+ add hl, bc
+ bit 4, [hl]
+ jr nz, .asm_6fc8
+ push hl
+ push bc
+ call Function6fe6
+ pop bc
+ pop hl
+ ret c
+.asm_6fc8
+ bit 6, [hl]
+ jr nz, .asm_6fd4
+ push hl
+ push bc
+ call WillPersonBumpIntoSomeoneElse
+ pop bc
+ pop hl
+ ret c
+.asm_6fd4
+ bit 5, [hl]
+ jr nz, .asm_6fe4
+ push hl
+ call HasPersonReachedMovementLimit
+ pop hl
+ ret c
+ push hl
+ call IsPersonMovingOffEdgeOfScreen
+ pop hl
+ ret c
+.asm_6fe4
+ and a
+ ret
+
+Function6fe6: ; 6fe6 (1:6fe6)
+ call Function703e
+ ret c
+ ld hl, $10
+ add hl, bc
+ ld d, [hl]
+ ld hl, $11
+ add hl, bc
+ ld e, [hl]
+ ld hl, $6
+ add hl, bc
+ bit 7, [hl]
+ jp nz, Function7080
+ ld hl, $e
+ add hl, bc
+ ld a, [hl]
+ ld d, a
+ call GetTileCollision
+ and a
+ jr z, Function701d
+ scf
+ ret
+
+Function700b: ; 700b (1:700b)
+ call Function703e
+ ret c
+ ld hl, $e
+ add hl, bc
+ ld a, [hl]
+ call GetTileCollision
+ cp $1
+ jr z, Function701d
+ scf
+ ret
+
+Function701d
+ ld hl, $e
+ add hl, bc
+ ld a, [hl]
+ call Function705e
+ ret nc
+ push af
+ ld hl, $7
+ add hl, bc
+ ld a, [hl]
+ and $3
+ ld e, a
+ ld d, $0
+ ld hl, .data_703a
+ add hl, de
+ pop af
+ and [hl]
+ ret z
+ scf
+ ret
+
+.data_703a
+ db 1 << DOWN, 1 << UP, 1 << RIGHT, 1 << LEFT
+
+Function703e: ; 703e (1:703e)
+ ld hl, $f
+ add hl, bc
+ ld a, [hl]
+ call Function705e
+ ret nc
+ push af
+ ld hl, $7
+ add hl, bc
+ and $3
+ ld e, a
+ ld d, $0
+ ld hl, .data_705a
+ add hl, de
+ pop af
+ and [hl]
+ ret z
+ scf
+ ret
+
+.data_705a
+ db 1 << UP, 1 << DOWN, 1 << LEFT, 1 << RIGHT
+
+Function705e: ; 705e (1:705e)
+ ld d, a
+ and $f0
+ cp $b0
+ jr z, .asm_706b
+ cp $c0
+ jr z, .asm_706b
+ xor a
+ ret
+
+.asm_706b
+ ld a, d
+ and $7
+ ld e, a
+ ld d, $0
+ ld hl, .data_7078
+ add hl, de
+ ld a, [hl]
+ scf
+ ret
+
+.data_7078
+ db 8, 4, 1, 2
+ db 10, 6, 9, 5
+
+Function7080: ; 7080 (1:7080)
+ ld hl, $7
+ add hl, bc
+ ld a, [hl]
+ and $3
+ jr z, .asm_7091
+ dec a
+ jr z, .asm_7096
+ dec a
+ jr z, .asm_709a
+ jr .asm_709e
+
+.asm_7091
+ inc e
+ push de
+ inc d
+ jr .asm_70a1
+
+.asm_7096
+ push de
+ inc d
+ jr .asm_70a1
+
+.asm_709a
+ push de
+ inc e
+ jr .asm_70a1
+
+.asm_709e
+ inc d
+ push de
+ inc e
+.asm_70a1
+ call GetCoordTile
+ call GetTileCollision
+ pop de
+ and a
+ jr nz, .asm_70b6
+ call GetCoordTile
+ call GetTileCollision
+ and a
+ jr nz, .asm_70b6
+ xor a
+ ret
+
+.asm_70b6
+ scf
+ ret
+
+CheckFacingObject
+ call GetFacingTileCoord
+ call CheckCounterTile
+ jr nz, .asm_70d0
+ ld a, [wPlayerStandingMapX]
+ sub d
+ cpl
+ inc a
+ add d
+ ld d, a
+ ld a, [wPlayerStandingMapY]
+ sub e
+ cpl
+ inc a
+ add e
+ ld e, a
+.asm_70d0
+ ld bc, wObjectStructs
+ ld a, $0
+ ld [hMapObjectIndexBuffer], a
+ call Function7120
+ ret nc
+ ld hl, $7
+ add hl, bc
+ ld a, [hl]
+ cp $ff
+ jr z, .asm_70e6
+ xor a
+ ret
+
+.asm_70e6
+ scf
+ ret
+
+WillPersonBumpIntoSomeoneElse: ; 70e8 (1:70e8)
+ ld hl, $10
+ add hl, bc
+ ld d, [hl]
+ ld hl, $11
+ add hl, bc
+ ld e, [hl]
+ jr Function7120
+
+Function70f4:
+ ld a, [hMapObjectIndexBuffer]
+ call GetObjectStruct
+ call Function7100
+ call Function7120
+ ret
+
+Function7100: ; 7100 (1:7100)
+ ld hl, $10
+ add hl, bc
+ ld d, [hl]
+ ld hl, $11
+ add hl, bc
+ ld e, [hl]
+ call GetSpriteDirection
+ and a
+ jr z, .asm_711a
+ cp $4
+ jr z, .asm_711c
+ cp $8
+ jr z, .asm_711e
+ inc d
+ ret
+
+.asm_711a
+ inc e
+ ret
+
+.asm_711c
+ dec e
+ ret
+
+.asm_711e
+ dec d
+ ret
+
+Function7120: ; 7120 (1:7120)
+ ld bc, wPlayerStruct
+ xor a
+.asm_7124
+ ld [hObjectStructIndexBuffer], a
+ call DoesObjectHaveASprite
+ jr z, .asm_7172
+ ld hl, $4
+ add hl, bc
+ bit 7, [hl]
+ jr nz, .asm_7172
+ ld hl, $6
+ add hl, bc
+ bit 7, [hl]
+ jr z, .asm_7142
+ call Function7250
+ jr nc, .asm_715a
+ jr .asm_7152
+
+.asm_7142
+ ld hl, $10
+ add hl, bc
+ ld a, [hl]
+ cp d
+ jr nz, .asm_715a
+ ld hl, $11
+ add hl, bc
+ ld a, [hl]
+ cp e
+ jr nz, .asm_715a
+.asm_7152
+ ld a, [hMapObjectIndexBuffer]
+ ld l, a
+ ld a, [hConnectedMapWidth]
+ cp l
+ jr nz, .asm_7181
+.asm_715a
+ ld hl, $12
+ add hl, bc
+ ld a, [hl]
+ cp d
+ jr nz, .asm_7172
+ ld hl, $13
+ add hl, bc
+ ld a, [hl]
+ cp e
+ jr nz, .asm_7172
+ ld a, [hConnectionStripLength]
+ ld l, a
+ ld a, [hObjectStructIndexBuffer]
+ cp l
+ jr nz, .asm_7181
+.asm_7172
+ ld hl, $28
+ add hl, bc
+ ld b, h
+ ld c, l
+ ld a, [hConnectedMapWidth]
+ inc a
+ cp $d
+ jr nz, .asm_7124
+ and a
+ ret
+
+.asm_7181
+ scf
+ ret
+
+HasPersonReachedMovementLimit: ; 7183 (1:7183)
+ ld hl, $16
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .asm_71c8
+ and $f
+ jr z, .asm_71a6
+ ld e, a
+ ld d, a
+ ld hl, $14
+ add hl, bc
+ ld a, [hl]
+ sub d
+ ld d, a
+ ld a, [hl]
+ add e
+ ld e, a
+ ld hl, $10
+ add hl, bc
+ ld a, [hl]
+ cp d
+ jr z, .asm_71ca
+ cp e
+ jr z, .asm_71ca
+.asm_71a6
+ ld hl, $16
+ add hl, bc
+ ld a, [hl]
+ swap a
+ and $f
+ jr z, .asm_71c8
+ ld e, a
+ ld d, a
+ ld hl, $15
+ add hl, bc
+ ld a, [hl]
+ sub d
+ ld d, a
+ ld a, [hl]
+ add e
+ ld e, a
+ ld hl, $11
+ add hl, bc
+ ld a, [hl]
+ cp d
+ jr z, .asm_71ca
+ cp e
+ jr z, .asm_71ca
+.asm_71c8
+ xor a
+ ret
+
+.asm_71ca
+ scf
+ ret
+
+IsPersonMovingOffEdgeOfScreen: ; 71cc (1:71cc)
+ ld hl, $10
+ add hl, bc
+ ld a, [wda03]
+ cp [hl]
+ jr z, .asm_71dd
+ jr nc, .asm_71f0
+ add $9
+ cp [hl]
+ jr c, .asm_71f0
+.asm_71dd
+ ld hl, $11
+ add hl, bc
+ ld a, [wda02]
+ cp [hl]
+ jr z, .asm_71ee
+ jr nc, .asm_71f0
+ add $8
+ cp [hl]
+ jr c, .asm_71f0
+.asm_71ee
+ and a
+ ret
+
+.asm_71f0
+ scf
+ ret
+
+Function71f2
+ ld a, [wPlayerStandingMapX]
+ ld d, a
+ ld a, [wPlayerStandingMapY]
+ ld e, a
+ ld bc, wObjectStructs
+ xor a
+.asm_71fe
+ ld [hConnectedMapWidth], a
+ call DoesObjectHaveASprite
+ jr z, .asm_723f
+ ld hl, $3
+ add hl, bc
+ ld a, [hl]
+ cp $15
+ jr nz, .asm_7215
+ call Function7250
+ jr c, .asm_724e
+ jr .asm_723f
+
+.asm_7215
+ ld hl, $11
+ add hl, bc
+ ld a, [hl]
+ cp e
+ jr nz, .asm_722d
+ ld hl, $10
+ add hl, bc
+ ld a, [hl]
+ cp d
+ jr nz, .asm_722d
+ ld a, [hObjectStructIndexBuffer]
+ cp $0
+ jr z, .asm_723f
+ jr .asm_724e
+
+.asm_722d
+ ld hl, $13
+ add hl, bc
+ ld a, [hl]
+ cp e
+ jr nz, .asm_723f
+ ld hl, $12
+ add hl, bc
+ ld a, [hl]
+ cp d
+ jr nz, .asm_723f
+ jr .asm_724e
+
+.asm_723f
+ ld hl, $28
+ add hl, bc
+ ld b, h
+ ld c, l
+ ld a, [hConnectedMapWidth]
+ inc a
+ cp $d
+ jr nz, .asm_71fe
+ xor a
+ ret
+
+.asm_724e
+ scf
+ ret
+
+Function7250: ; 7250 (1:7250)
+ ld hl, $10
+ add hl, bc
+ ld a, d
+ sub [hl]
+ jr c, .asm_726a
+ cp $2
+ jr nc, .asm_726a
+ ld hl, $11
+ add hl, bc
+ ld a, e
+ sub [hl]
+ jr c, .asm_726a
+ cp $2
+ jr nc, .asm_726a
+ scf
+ ret
+
+.asm_726a
+ and a
+ ret
diff --git a/main.asm b/main.asm
index 7d52be23..ba6256a9 100644
--- a/main.asm
+++ b/main.asm
@@ -199,15 +199,16 @@ CheckNickErrors:: ; 677e (1:677e)
db -1 ; end
INCLUDE "engine/math.asm"
+ItemAttributes:
INCLUDE "items/item_attributes.asm"
-CheckNPCMovementPermissions: ; 6fa0
+INCLUDE "engine/npc_movement.asm"
IF DEF(GOLD)
- dr $6fa0, $754e
+ dr $726c, $754e
ENDC
IF DEF(SILVER)
- dr $6f66, $7514
+ dr $7232, $7514
ENDC
SECTION "bank2", ROMX, BANK[$2]