Chase H.Q. | Routines |
Prev: AB33 | Up: Map | Next: AC3C |
Spawns hittable hazards in the road, like barriers and tumbleweeds.
|
||||
spawn_hazards | AB9A | LD A,($A254) | Return if allow_spawning is zero | |
AB9D | AND A | |||
AB9E | RET Z | |||
AB9F | CPL | C = 20 - allow_spawning (is 1/2 here) | ||
ABA0 | ADD A,$15 | |||
ABA2 | LD C,A | |||
ABA3 | LD A,($A240) | Load road_buffer_offset into A | ||
ABA6 | ADD A,$A0 | Add 160 so it's the hazards data offset | ||
ABA8 | ADD A,C | A += C | ||
ABA9 | LD L,A | Point HL at road buffer hazards data | ||
ABAA | LD H,$EE | |||
ABAC | LD A,(HL) | A = *HL -- load the hazard byte | ||
ABAD | AND A | Set flags | ||
ABAE | RET Z | Return if zero | ||
ABAF | CP $04 | Is it 4? | ||
ABB1 | LD DE,$0000 | DE = 0 | ||
ABB4 | JR C,sh_abb9 | Jump if < 4 -- stop spawning barriers etc? jump/fork too? | ||
ABB6 | LD E,$03 | E = 3 | ||
ABB8 | SUB E | A -= E | ||
sh_abb9 | ABB9 | LD B,$32 | B = 50 | |
ABBB | DEC A | A-- | ||
ABBC | JR Z,sh_abf2 | Jump if zero [A == 1] | ||
ABBE | LD B,$DC | B = $DC | ||
ABC0 | DEC A | A-- | ||
ABC1 | JR Z,sh_abf2 | Jump if zero [A == 2] | ||
ABC3 | INC L | L += 2 | ||
ABC4 | INC L | |||
ABC5 | LD (HL),D | *HL = D | ||
ABC6 | INC L | L += 2 | ||
ABC7 | INC L | |||
ABC8 | LD (HL),D | *HL = D | ||
ABC9 | LD A,E | A = E | ||
ABCA | CP $03 | Is it 3? | ||
ABCC | JR NZ,sh_abeb | Jump if non-zero | ||
ABCE | LD A,($A221) | Load inhibit_collision_detection | ||
ABD1 | AND A | Set flags | ||
ABD2 | JR Z,sh_abe2 | Jump if zero | ||
Flag was set.
|
||||
ABD4 | LD B,$20 | B = 32 | ||
ABD6 | CALL sh_spawn | Call sh_spawn | ||
ABD9 | LD B,$56 | B = 86 | ||
ABDB | CALL sh_spawn | Call sh_spawn | ||
ABDE | LD B,$8C | B = 140 | ||
ABE0 | JR sh_abf2 | Calls sh_spawn then returns | ||
sh_abe2 | ABE2 | LD B,$50 | B = 80 | |
ABE4 | CALL sh_spawn | Call sh_spawn | ||
ABE7 | LD B,$A0 | B = 160 | ||
ABE9 | JR sh_abf2 | Calls sh_spawn then returns | ||
sh_abeb | ABEB | LD B,$46 | B = 70 | |
ABED | CALL sh_spawn | Call sh_spawn | ||
ABF0 | LD B,$B4 | B = 180 | ||
sh_abf2 | ABF2 | CALL sh_spawn | Call sh_spawn | |
ABF5 | RET | Return | ||
I:B Stored at entry+5 e.g. $20/$46/$56/$50/$B4
I:C Stored at entry+1 e.g. $13
|
||||
sh_spawn | ABF6 | EXX | Bank entry registers | |
ABF7 | LD B,$06 | 6 iterations | ||
ABF9 | LD HL,$A188 | Point HL at hazards table | ||
ABFC | LD DE,$0014 | Stride of 20 bytes | ||
sh_loop | ABFF | RLC (HL) | Check the flag byte to see if the entry is used (it's either $00 if empty, or $FF if used, so rotating it in place is not a problem) | |
AC01 | JR NC,sh_found_spare | Jump to sh_found_spare if it didn't carry | ||
AC03 | ADD HL,DE | Move to the next entry | ||
AC04 | DJNZ sh_loop | Loop while iterations remain | ||
AC06 | POP HL | |||
AC07 | RET | Return | ||
HL points to the unused entry
|
||||
sh_found_spare | AC08 | PUSH HL | IX = HL | |
AC09 | POP IX | |||
AC0B | LD BC,$0013 | Zero 20 bytes at HL | ||
AC0E | LD D,H | |||
AC0F | LD E,L | |||
AC10 | INC DE | |||
AC11 | LD (HL),$00 | |||
AC13 | LDIR | |||
AC15 | EXX | Restore entry registers | ||
AC16 | LD HL,$AC3C | wordat(IX + 11) = Address of hazard_hit routine | ||
AC19 | LD (IX+$0C),H | |||
AC1C | LD (IX+$0B),L | |||
Gets hit when on the dirt track. sampled DE = $3 (tumbleweed), $0 (barrier)
|
||||
AC1F | LD HL,($5CF6) | Point HL at the hazards data table entry (*$5CF6 -> hittable_objects_defs + 3) | ||
AC22 | ADD HL,DE | |||
AC23 | LD A,(HL) | Copy flag TBD | ||
AC24 | LD (IX+$08),A | |||
AC27 | INC HL | |||
AC28 | LD A,(HL) | Copy lod address (e.g. tumbleweed_lods) | ||
AC29 | LD (IX+$09),A | |||
AC2C | INC HL | |||
AC2D | LD A,(HL) | |||
AC2E | LD (IX+$0A),A | |||
AC31 | LD (IX+$05),B | IX[5] = B TBD -- passed in | ||
AC34 | LD (IX+$01),C | IX[1] = C TBD | ||
AC37 | LD (IX+$00),$FF | Mark the entry as used | ||
AC3B | RET | Return |
Prev: AB33 | Up: Map | Next: AC3C |