![]() |
Routines |
| Prev: B3F6 | Up: Map | Next: B495 |
|
This handles the hero using the snips to cut through a wire fence.
|
||||
|
Check the hero's position against the four vertically-oriented fences.
|
||||
| action_wiresnips | B417 | LD HL,$B589 | Point HL at the 12th entry of the walls array: the start of the vertically-oriented fences PLUS three bytes so it points at the maxy value. | |
| B41A | LD DE,$81B9 | Point DE at hero_map_position.y | ||
| B41D | LD B,$04 | Set B for four iterations (four vertical fences) | ||
|
Start loop
|
||||
| action_wiresnips_0 | B41F | PUSH HL | Preserve the wall entry pointer during this iteration | |
|
Are we in range on the Y axis?
|
||||
| B420 | LD A,(DE) | Fetch hero_map_position.y | ||
| B421 | CP (HL) | Is it >= wall->maxy? | ||
| B422 | JR NC,snips_next_vert | Jump to the next iteration if so | ||
| B424 | DEC HL | Step HL back to wall->miny | ||
| B425 | CP (HL) | Is it < wall->miny? | ||
| B426 | JR C,snips_next_vert | Jump to the next iteration if so | ||
|
Are we adjacent to the wall on the X axis?
|
||||
| B428 | DEC DE | Step DE back to hero_map_position.x | ||
| B429 | LD A,(DE) | Fetch hero_map_position.x | ||
| B42A | DEC HL | Step HL back to wall->maxx | ||
| B42B | CP (HL) | Is it == wall->maxx? | ||
| B42C | JR Z,snips_crawl_tl | Jump to snips_crawl_tl if so | ||
| B42E | DEC A | Try the opposite side | ||
| B42F | CP (HL) | Is it == wall->maxx? | ||
| B430 | JR Z,snips_crawl_br | Jump to snips_crawl_br if so | ||
| B432 | INC DE | Advance DE to hero_map_position.y | ||
| snips_next_vert | B433 | POP HL | Restore wall array pointer | |
| B434 | LD A,L | Advance HL to the next wall array element PLUS 3 bytes | ||
| B435 | ADD A,$06 | |||
| B437 | LD L,A | |||
| B438 | JR NC,action_wiresnips_1 | |||
| B43A | INC H | |||
| action_wiresnips_1 | B43B | DJNZ action_wiresnips_0 | ...loop | |
|
Check the hero's position against the three horizontally-oriented fences.
|
||||
| B43D | DEC DE | Step DE back to hero_map_position.x | ||
|
Point HL at the 16th entry of walls array (start of horizontal fences).
|
||||
| B43E | DEC HL | Step HL back to the 16th entry of the walls array PLUS 0 bytes (it's three ahead prior to this) | ||
| B43F | DEC HL | |||
| B440 | DEC HL | |||
| B441 | LD B,$03 | Set B for three iterations (three horizontal fences) | ||
|
Start loop
|
||||
| action_wiresnips_2 | B443 | PUSH HL | Preserve wall array pointer during this iteration | |
|
Are we in range on the X axis?
|
||||
| B444 | LD A,(DE) | Fetch hero_map_position.x | ||
| B445 | CP (HL) | Is it < wall->minx? | ||
| B446 | JR C,snips_next_horz | Jump to the next iteration if so | ||
| B448 | INC HL | Advance HL to wall->maxx | ||
| B449 | CP (HL) | Is x >= wall->maxx? | ||
| B44A | JR NC,snips_next_horz | Jump to the next iteration if so | ||
|
Are we adjacent to the wall on the Y axis?
|
||||
| B44C | INC DE | Advance DE to hero_map_position.y | ||
| B44D | LD A,(DE) | Fetch hero_map_position.y | ||
| B44E | INC HL | Advance HL to wall->miny | ||
| B44F | CP (HL) | Is it == wall->miny? | ||
| B450 | JR Z,snips_crawl_tr | Jump to snips_crawl_tr if so | ||
| B452 | DEC A | Try the opposite side | ||
| B453 | CP (HL) | Is it == wall->maxy? | ||
| B454 | JR Z,snips_crawl_bl | Jump to snips_crawl_bl if so | ||
| B456 | DEC DE | Step DE back to hero_map_position.x | ||
| snips_next_horz | B457 | POP HL | Restore wall array pointer | |
| B458 | LD A,L | Advance HL to the next wall array element PLUS 3 bytes | ||
| B459 | ADD A,$06 | |||
| B45B | LD L,A | |||
| B45C | JR NC,action_wiresnips_3 | |||
| B45E | INC H | |||
| action_wiresnips_3 | B45F | DJNZ action_wiresnips_2 | ...loop | |
| B461 | RET | Return | ||
| snips_crawl_tl | B462 | LD A,$04 | Set A to 4 (direction_TOP_LEFT + vischar_DIRECTION_CRAWL) | |
| B464 | JR snips_tail | Jump forward | ||
| snips_crawl_tr | B466 | LD A,$05 | Set A to 5 (direction_TOP_RIGHT + vischar_DIRECTION_CRAWL) | |
| B468 | JR snips_tail | Jump forward | ||
| snips_crawl_br | B46A | LD A,$06 | Set A to 6 (direction_BOTTOM_RIGHT + vischar_DIRECTION_CRAWL) | |
| B46C | JR snips_tail | Jump forward | ||
| snips_crawl_bl | B46E | LD A,$07 | Set A to 7 (direction_BOTTOM_LEFT + vischar_DIRECTION_CRAWL) | |
|
A is the direction + crawl flag. Proceed to making the hero cut the wire.
|
||||
| snips_tail | B470 | POP HL | Restore wall array pointer | |
| B471 | LD HL,$800E | Set hero's vischar.direction field (direction and walk/crawl flag) to the direction selected above | ||
| B474 | LD (HL),A | |||
| B475 | DEC L | Set hero's vischar.input field to input_KICK | ||
| B476 | LD (HL),$80 | |||
| B478 | LD HL,$8001 | Set hero's vischar.flags to vischar_FLAGS_CUTTING_WIRE | ||
| B47B | LD (HL),$02 | |||
| B47D | LD A,$0C | Set hero's vischar.mi.pos.height to 12 | ||
| B47F | LD ($8013),A | |||
| B482 | LD HL,$CE2E | Set vischar.mi.sprite to the prisoner sprite set | ||
| B485 | LD ($8015),HL | |||
| B488 | LD A,($A12F) | Lock out the player until the game counter is now + 96 | ||
| B48B | ADD A,$60 | |||
| B48D | LD ($A145),A | |||
| B490 | LD B,$0B | Queue the message "CUTTING THE WIRE" and exit via | ||
| B492 | JP queue_message | |||
| Prev: B3F6 | Up: Map | Next: B495 |