Prev: FC39 Up: Map Next: FD2B
FCB6: Handler: Train
Used by the routine at RunHandlers.
Handler_Train FCB6 LD A,($D405) Return if train spawning is set to be off (*TrainState is equal to FE).
FCB9 CP $FE
FCBB RET Z
FCBC CP $FF Jump to Handler_Train_Movement if a train is already active (*TrainState is equal to FF).
FCBE JR Z,Handler_Train_Movement
Else the counter is a counter, so count it down.
FCC0 DEC A Decrease *TrainState by one.
FCC1 LD ($D405),A
FCC4 RET NZ Return if *TrainState is still in progress.
Else the countdown is complete so set the counter/ state to indicate that a train has been spawned and then spawn a train!
FCC5 LD A,$FF Write FF to *TrainState.
FCC7 LD ($D405),A
Randomly bring the train in from either the left or right hand side of the play area.
FCCA CALL RandomNumber Get a random number of either zero or one.
FCCD AND %00000001
FCCF JR NZ,Handler_SpawnTrainRight Jump to Handler_SpawnTrainRight if the random number is one.
Train moves from left-to-right.
FCD1 LD A,$13 Write 13 to *TrainYPosition.
FCD3 LD ($D407),A
FCD6 LD A,$F0 Write F0 to *TrainXPosition.
FCD8 LD ($D406),A
FCDB JR Handler_Train_Movement Jump to Handler_Train_Movement.
Bit 7 signifies that this train moves from right-to-left.
Handler_SpawnTrainRight FCDD LD A,$93 Write 93 (13 + bit 7 set) to *TrainYPosition.
FCDF LD ($D407),A
FCE2 LD A,$20 Write 20 to *TrainXPosition.
FCE4 LD ($D406),A
Handler_Train_Movement FCE7 LD A,($D407) A=*TrainYPosition.
FCEA AND %01000000 Keep only bit 6.
Set the carry flag according to bit 6.
FCEC RLCA Rotate A left twice, moving bit 6 to bit 0 and setting the carry flag if bit 0 was set.
FCED RLCA
FCEE LD C,A C=A.
Which direction should the train be moving in?
FCEF LD A,($D407) Jump to Handler_MoveTrain_RightToLeft if *TrainYPosition is higher than 80 (bit 7 is set).
FCF2 CP $80
FCF4 JR NC,Handler_MoveTrain_RightToLeft
Handles moving the train from the left-to-right hand side of the play area.
FCF6 AND %00111111 Strip off the right-to-left flag.
FCF8 LD B,A B=train Y position.
FCF9 LD A,($D406) A=*TrainXPosition.
FCFC INC A Increment A by one.
FCFD ADD A,C A+=C.
Draw the train.
DrawTrain FCFE LD ($D406),A Write A to *TrainXPosition.
FD01 LD C,A C=train X position.
FD02 LD A,$79 A=sprite ID 79.
ID Sprite
79 sprite-121-left
FD04 PUSH BC Stash the train position on the stack.
FD05 CALL PrintSprite Call PrintSprite.
FD08 POP BC Restore the train position from the stack.
Draws the centre sprite of the train three times.
FD09 LD A,$03 A=03 (counter).
DrawTrain_Loop FD0B PUSH AF Stash the counter on the stack.
FD0C INC C Increment the X position by two to draw the next section of the train.
FD0D INC C
FD0E LD A,$7B A=sprite ID 7B.
ID Sprite
7B sprite-123-left
FD10 PUSH BC Stash the train position on the stack.
FD11 CALL PrintSprite Call PrintSprite.
FD14 POP BC Restore the train position and counter from the stack.
FD15 POP AF
FD16 DEC A Decrease the counter held by A by one.
FD17 JR NZ,DrawTrain_Loop Jump to DrawTrain_Loop until all centre sprites have been drawn.
Now draw the rear section of the train.
FD19 INC C Increment the X position by two to draw the next section of the train.
FD1A INC C
FD1B LD A,$79 A=sprite ID 79.
ID Sprite
79 sprite-121-right
FD1D CALL PrintSprite_Mirrored Call PrintSprite_Mirrored.
FD20 RET Return.
Handles moving the train from the right-to-left hand side of the play area.
Handler_MoveTrain_RightToLeft FD21 AND %00111111 Strip off the right-to-left flag.
FD23 LD B,A B=train Y position.
FD24 LD A,($D406) A=*TrainXPosition.
FD27 DEC A Decrease A by one.
FD28 SUB C A-=C.
FD29 JR DrawTrain Jump to DrawTrain.
Prev: FC39 Up: Map Next: FD2B