Routines |
Prev: C4E0 | Up: Map | Next: C651 |
This resets a visible character (vischar). It could be a person or a stove/crate object.
Used by the routines at transition, reset_nonplayer_visible_characters, reset_map_and_characters and purge_invisible_characters.
|
||||||||
reset_visible_character | C5D3 | LD A,(HL) | Fetch the vischar's character index | |||||
C5D4 | CP $FF | Is it character_NONE? ($FF) | ||||||
C5D6 | RET Z | Return if so | ||||||
C5D7 | CP $1A | Is it a stove/crate character? (character_26_STOVE_1+) | ||||||
C5D9 | JR C,rvc_humans | Jump if not | ||||||
C5DB | EX AF,AF' | Bank | ||||||
It's a stove or crate character.
|
||||||||
C5DC | LD (HL),$FF | Set vischar.character to $FF (character_NONE) | ||||||
C5DE | INC L | Advance HL to vischar.flags | ||||||
C5DF | LD (HL),$FF | Reset flags to $FF (vischar_FLAGS_EMPTY_SLOT) | ||||||
C5E1 | LD A,$06 | Point HL at counter_and_flags | ||||||
C5E3 | ADD A,L | |||||||
C5E4 | LD L,A | |||||||
C5E5 | LD (HL),$00 | Set counter_and_flags to zero | ||||||
C5E7 | ADD A,$08 | Point HL at vischar.mi.pos | ||||||
C5E9 | LD L,A | |||||||
C5EA | EX AF,AF' | Unbank | ||||||
Save the old position.
|
||||||||
C5EB | LD DE,$69AE | Point DE at movable_items[0] / stove 1 | ||||||
C5EE | CP $1A | Is A character_26_STOVE_1? | ||||||
C5F0 | JR Z,rvc_copy_mi | Jump if so | ||||||
C5F2 | LD DE,$69C0 | Point DE at movable_items[2] / stove 2 | ||||||
C5F5 | CP $1B | Is A character_27_STOVE_2? | ||||||
C5F7 | JR Z,rvc_copy_mi | Jump if so | ||||||
C5F9 | LD DE,$69B7 | Otherwise point DE at movable_items[1] / crate | ||||||
Note: The DOS version of the game has a difference here. Instead of copying the current vischar's position into the movable_items's position, it only copies the first two bytes. The code is setup for a copy of six bytes (cx is set to 3) but the 'movsw' ought to be a 'rep movsw' for it to work. It fixes the bug where stoves get left in place after a restarted game, but almost looks like an accident.
|
||||||||
rvc_copy_mi | C5FC | LD BC,$0006 | Copy six bytes to the movable_items entry | |||||
C5FF | LDIR | |||||||
C601 | RET | Return | ||||||
A non-object character.
|
||||||||
rvc_humans | C602 | EX DE,HL | Bank vischar pointer | |||||
C603 | CALL get_character_struct | Get character struct for A, result in HL | ||||||
C606 | RES 6,(HL) | Clear flag characterstruct_FLAG_ON_SCREEN | ||||||
C608 | LD A,$1C | Point DE at vischar.room | ||||||
C60A | ADD A,E | |||||||
C60B | LD E,A | |||||||
C60C | LD A,(DE) | Fetch vischar.room | ||||||
C60D | INC HL | Copy it to charstr.room | ||||||
C60E | LD (HL),A | |||||||
C60F | EX AF,AF' | Bank room index | ||||||
C610 | EX DE,HL | Unbank vischar pointer | ||||||
C611 | LD A,L | Point HL at vischar.counter_and_flags | ||||||
C612 | SUB $15 | |||||||
C614 | LD L,A | |||||||
C615 | LD (HL),$00 | Clear vischar.counter_and_flags | ||||||
C617 | ADD A,$08 | Point HL at vischar.mi.pos | ||||||
C619 | LD L,A | |||||||
Save the old position.
|
||||||||
C61A | INC DE | Point DE at charstr.pos.x | ||||||
C61B | EX AF,AF' | Unbank room index | ||||||
C61C | AND A | Are we outdoors? | ||||||
C61D | JR NZ,rvc_indoors | Jump if not | ||||||
Outdoors.
|
||||||||
C61F | CALL pos_to_tinypos | Scale down vischar.mi.pos to charstr.pos | ||||||
C622 | JR rvc_reset_common | (else) | ||||||
Indoors.
|
||||||||
rvc_indoors | C624 | LD B,$03 | Set B for three iterations | |||||
Start loop
|
||||||||
rvc_indoors_loop | C626 | LD A,(HL) | Copy coordinate | |||||
C627 | LD (DE),A | |||||||
C628 | INC L | Advance the source pointer | ||||||
C629 | INC L | |||||||
C62A | INC DE | |||||||
C62B | DJNZ rvc_indoors_loop | ...loop | ||||||
rvc_reset_common | C62D | LD A,L | Reset HL to point to the original vischar | |||||
C62E | SUB $15 | |||||||
C630 | LD L,A | |||||||
C631 | LD A,(HL) | Fetch character index | ||||||
C632 | LD (HL),$FF | Set vischar.character to $FF (character_NONE) | ||||||
C634 | INC L | Advance HL to vischar.flags | ||||||
C635 | LD (HL),$FF | Reset flags to $FF (vischar_FLAGS_EMPTY_SLOT) | ||||||
C637 | INC L | Advance HL to vischar.route | ||||||
Guard dogs only.
|
||||||||
C638 | CP $10 | Is this a guard dog character? character_16_GUARD_DOG_1..character_19_GUARD_DOG_4 | ||||||
C63A | JR C,rvc_end | |||||||
C63C | CP $14 | |||||||
C63E | JR NC,rvc_end | |||||||
Choose random locations in the fenced off area (right side).
|
||||||||
rvc_dogs | C640 | LD (HL),$FF | Set route to (routeindex_255_WANDER,0) ($FF,$00) -- wander from locations 0..7 | |||||
C642 | INC L | |||||||
C643 | LD (HL),$00 | |||||||
C645 | CP $12 | Is this character_18_GUARD_DOG_3 or character_19_GUARD_DOG_4? | ||||||
C647 | JR C,rvc_dogs_done | Jump if not | ||||||
Choose random locations in the fenced off area (bottom side).
|
||||||||
C649 | LD (HL),$18 | Set route.step to $18 -- wander from locations 24..31 | ||||||
rvc_dogs_done | C64B | DEC L | Point HL at vischar.route | |||||
rvc_end | C64C | LDI | Copy route into charstr | |||||
C64E | LDI | |||||||
C650 | RET | Return |
Prev: C4E0 | Up: Map | Next: C651 |