Prev: A4B8 Up: Map Next: A579
A4F6: Checks for scenery collisions at a road fork
The variant of check_scenery_collisions used once the fork is visible and the fork countdown has reached zero. Off-road is judged from the left and fork-right x-position tables rather than the centre ones, and the only object tested is the short pole on the side of the fork the player did not take.
Used by the routine at check_scenery_collisions.
Input
HL' Road position minimum, inherited from check_scenery_collisions and stored as is
DE' Road position maximum, inherited from check_scenery_collisions and stored as is
check_fork_scenery_collisions A4F6 LD HL,($E8FE) HL = *$E8FE -- checking the final word of the road drawing (left) table
A4F9 LD A,H A = H (0 or 255)
A4FA AND A Set flags
A4FB JR NZ,fc_a510 Jump to fc_a510 if A isn't zero
A4FD PUSH HL Jump to fc_a510 if HL < $6A
A4FE LD BC,$006A
A501 SBC HL,BC
A503 POP HL
A504 JR C,fc_a510
A506 LD C,$85 HL -= $85
A508 SBC HL,BC
A50A INC A A++ -- A == 1 => partially off-road
A50B JR C,fc_not_fork_set Jump to fc_not_fork_set if HL < $85
A50D INC A A++ -- A == 2 => fully off-road
A50E JR fc_not_fork_set Jump to fc_not_fork_set
fc_a510 A510 LD HL,($EDFC) HL = *$EDFC
A513 LD A,H A = H
A514 AND A Set flags
A515 LD A,$00 A = 0
A517 JR NZ,fc_not_fork_set JR NZ,fc_not_fork_set
A519 PUSH HL Jump to fc_not_fork_set if HL >= $8E
A51A LD BC,$008E
A51D SBC HL,BC
A51F POP HL
A520 JR NC,fc_not_fork_set
A522 LD C,$7C HL -= $7C
A524 SBC HL,BC
A526 INC A A++ -- A == 1 => partially off-road
A527 JR NC,fc_not_fork_set Jump to fc_not_fork_set if HL >= $7C
A529 INC A A++ -- A == 2 => fully off-road
Set the off-road flag etc.
fc_not_fork_set A52A LD ($A23E),A off_road = A
A52D XOR A *$B3DC = 0
A52E LD ($B3DC),A
A531 EXX
A532 LD ($B396),HL *$B396 = HL
A535 LD ($B3A4),DE *$B3A4 = DE
A539 LD A,($A249) Jump to fc_a55c if fork_taken was 1 (right fork taken)
A53C AND A
A53D JR NZ,fc_a55c
A53F LD HL,($5CFC) Get address of right hand short pole object
A542 LD C,(HL) C = *HL++ -- max object boundary
A543 INC HL
A544 LD E,(HL) E = *HL++ -- min object boundary
A545 INC HL
A546 LD A,(HL) A = *HL -- unused
A547 LD B,$00 B = 0
A549 LD D,B D = B
A54A LD HL,($EAFE) HL = *$EAFE
A54D PUSH HL Return if HL >= BC
A54E SBC HL,BC
A550 POP HL
A551 RET NC
A552 SBC HL,DE Return if HL < DE
A554 RET C
A555 LD A,$8C A = $8C -- the speed cap scenery_hit takes in A'
A557 EX AF,AF' Bank
A558 XOR A A = 0 -- flip right, per scenery_hit's A
A559 JP csc_hit_scenery Exit via csc_hit_scenery
fc_a55c A55C LD HL,($5D02) HL = *$5D02
A55F LD C,(HL) C = *HL++
A560 INC HL
A561 LD E,(HL) E = *HL++
A562 INC HL
A563 LD B,$00 B = 0
A565 LD D,B D = B
A566 LD HL,($EAFC) HL = *$EAFC
A569 PUSH HL Return if HL < BC
A56A SBC HL,BC
A56C POP HL
A56D RET C
A56E SBC HL,DE Return if HL >= DE
A570 RET NC
A571 LD A,$8C A = $8C -- the speed cap scenery_hit takes in A'
A573 EX AF,AF' Bank
A574 LD A,$01 A = 1 -- flip left, per scenery_hit's A
A576 JP csc_hit_scenery Exit via csc_hit_scenery
Prev: A4B8 Up: Map Next: A579