Prev: A921 Up: Map Next: AA30
A92C: Move the computer controlled characters
Used by the routine at 81AE.
Input
IY - base address of character data (BC67 = Wally - BC6B = Harry)
A92C PUSH IY Store IY
A92E LD A,(IY+$0F) Get the room for the current character in A.
A931 LD ($B951),A Store this. (B951)
A934 LD IY,$BC67 Point IY at the first character.
A938 LD A,($B55F) Get the "computer controlled" player flag.
A93B ADD A,$04 Add 4 to give either 4 (normal) or 5 (demo) characters to move.
A93D LD B,A Set this in B to loop through the characters.
A93E PUSH BC Remember the character count.
A93F LD A,($B55F) Is this player computer controlled?
A942 OR A
A943 JR NZ,$A94C Jump forward if so.
This character is being controlled by the player, so nothing to do
A945 CALL $A921 Check this character is player-controlled.
A948 JR NZ,$A94C Jump forward if not. (Should never get here).
A94A INC IY Otherwise jump to the next character.
This is a computer controlled character, so move them.
A94C LD A,(IY+$0F) Get the room for the current character.
A94F CP (IY+$5A) Does it equal the target room?
A952 JR NZ,$A95B Jump forward if it doesn't.
A954 LD A,(IY-$14) Is the character in the room it wants to get to? (BC53)
A957 OR A
A958 JP NZ,$A991 Jump forward if not.
A95B CALL $AFC4 If the character is in mid-air, drop them to the ground or a platform.
A95E LD A,(IY+$46) Is the character in mid-jump?
A961 OR A
A962 JR Z,$A96A If not, move forward to handle movement.
A964 CALL $B1B9 Otherwise finish off the jump.
A967 JP $A989
A96A LD A,(IY+$37) Is the character falling?
A96D OR A
A96E JR Z,$A975 If not, move forward to handle movement.
A970 CALL $B197 Otherwise, finish off the fall.
A973 JR $A989
The computer character can move, so do so.
A975 LD A,(IY+$64) Get the computer character's next movement table. (BCCB)
A978 ADD A,A Double it to get a word offset.
A979 LD E,A Put the value in DE.
A97A LD D,$00
A97C LD HL,$AAA0 Add the base address for the movement tables. (AAA0)
A97F ADD HL,DE
A980 LD E,(HL) Put the address found in DE.
A981 INC HL
A982 LD D,(HL)
A983 EX DE,HL Swap DE and HL.
A984 LD DE,$A989 Set A989 as a return address.
A987 PUSH DE
A988 JP (HL) Execute the routine.
Control returns from the routine to this point.
A989 POP BC Restore the character count.
A98A INC IY Move to the next character.
A98C DJNZ $A93E Loop until all the characters have moved.
A98E POP IY Restore IY and return.
A990 RET
A991 CALL $AFC4 If the character is in mid-air, drop them to the ground or a platform.
A994 LD A,(IY+$46) Is the character in mid-jump?
A997 OR A
A998 JR Z,$A9A0 If not, move forward to handle movement.
A99A CALL $B1B9 Otherwise finish off the jump.
A99D JP $A989
A9A0 LD A,(IY+$37) Is the character falling?
A9A3 OR A
A9A4 JR Z,$A9AC If not, move forward to handle movement.
A9A6 CALL $B197 Otherwise, finish off the fall.
A9A9 JP $A989
The character can move, so do so.
A9AC LD A,(IY+$0A) Get the Y position.
A9AF CP $98 Is it on the ground?
A9B1 JR Z,$A9CA Jump forward if it is.
A9B3 LD A,(IY+$05) Get the X position.
A9B6 CP $78 Is it less than 78?
A9B8 JR NC,$A9C4 Jump forward if it is.
A9BA LD (IY+$3C),$01 Set the character as mid-air.
A9BE CALL $B288 Move a character.
A9C1 JP $A989 Jump back to finish off the routine.
The character is standing next to the wall, and can be built (?)
A9C4 LD (IY+$3C),$FF
A9C8 JR $A9BE
The character is standing in a room with an item, move them towards sawpping it.
A9CA LD B,(IY-$0F) Get the room object index for this character. (BC58)
A9CD CALL $AA8C Get the address of the room object.
A9D0 INC HL Move to the next position.
A9D1 LD A,(HL) Get the X co-ordinate.
A9D2 PUSH AF Store AF.
A9D3 LD A,(IY+$05) Get the X co-ordinate.
A9D6 CP (HL) Does it match that of the item?
A9D7 JR NC,$A9DF Jump if it's less.
A9D9 LD (IY+$3C),$01 Set the character to go right.
A9DD JR $A9E3
A9DF LD (IY+$3C),$FF Otherwise set them to go left.
A9E3 CALL $B288 Move the character.
A9E6 POP AF Restore A.
A9E7 CP (IY+$05) Is the character's X co-ordinate now the same as the item's.
A9EA JP NZ,$A989 Jump back if it isn't.
A9ED LD B,(IY-$0F) Otherwise get the ID of the object to swap with.
A9F0 CALL $AA30 Swap an item.
A9F3 LD (IY-$14),$00 Mark the character as not in the target room. (BC53)
A9F7 LD E,(IY+$78) Put the address of the character's swap buffer in DE.
A9FA LD D,(IY+$7D)
A9FD LD H,$00 Set H to 0.
A9FF INC (IY-$05) Move to the next index in the buffer.
AA02 LD L,(IY-$05) Put the index in L.
AA05 ADD HL,DE Add the value in HL to the start of the buffer to get the right address.
AA06 LD A,(HL) Get the next swap item.
AA07 CP $FF Is it an end marker?
AA09 JR NZ,$AA10 Jump forward if it isn't.
AA0B EX DE,HL Otherwise, set the index back to 0.
AA0C LD (IY-$05),$00
AA10 LD E,(HL) Get the object ID in the buffer.
AA11 CALL $AE8A Get the address of the object in HL.
AA14 LD A,B Is the object index 0?
AA15 OR A
AA16 JR NZ,$AA24 If so, jump forward.
@labe l=Update_Characters_16
AA18 CALL $AED7 Return the next room that the character should swap in.
AA1B LD C,$00
AA1D LD D,A Put this in D.
AA1E LD A,D Is the next room the current one?
AA1F CP (IY+$0F)
AA22 JR Z,$AA18 Jump back until it isn't.
@labe l=Update_Characters_17
AA24 LD (IY+$5A),D Set the next target room. (BCC1)
AA27 LD (IY-$0F),C Set the room object index. (0?)
AA2A CALL $ADBA Update the character.
AA2D JP $A989 Jump back to finish off the routine.
Prev: A921 Up: Map Next: AA30