diff options
-rwxr-xr-x | engine/math.asm | 190 | ||||
-rwxr-xr-x | engine/npc_movement.asm | 525 | ||||
-rw-r--r-- | main.asm | 7 |
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 @@ -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] |