Prev: DBE5 Up: Map Next: DD38
DCA1: Handler: Spawn Humans
Used by the routine at RunHandlers.
Just return if the number of active humans is already at the maximum amount for this level.
Handler_SpawnHumans DCA1 LD A,($D3F4) Return if *NumberHumans is equal to *MaxHumansCount.
DCA4 LD B,A
DCA5 LD A,($D211)
DCA8 CP B
DCA9 RET Z
Add a hint of randomness to whether we proceed or not. Roughly 50% chance.
DCAA CALL RandomNumber B=random number.
DCAD LD B,A
DCAE LD A,($D210) A=*HumanGeneratorLimiter (this appears to only ever be set to 80).
DCB1 CP B Return if A is lower than B.
DCB2 RET C
Creates a random number between 0000-02FD.
DCB3 CALL RandomNumber Call RandomNumber.
DCB6 LD H,$00 HL=random number between 0000-00FF.
DCB8 LD L,A
DCB9 CALL RandomNumber Call RandomNumber.
DCBC LD B,H BC=random number between 0000-00FF.
DCBD LD C,A
DCBE CALL RandomNumber Call RandomNumber.
DCC1 LD D,H DE=random number between 0000-00FF.
DCC2 LD E,A
DCC3 ADD HL,DE Add them all together: HL=HL+DE+BC.
DCC4 ADD HL,BC
DCC5 LD B,H BC=HL.
DCC6 LD C,L
Adding 65 to H gives an address range of anywhere between 6500-67FD.
DCC7 LD A,$65 H+=65.
DCC9 ADD A,H
DCCA LD H,A
DCCB LD A,(HL) Jump to FoundSolidMatter if *HL is not zero.
DCCC AND A
DCCD JR NZ,FoundSolidMatter
The address in the buffer isn't compatible with containing a human, so have one more try...
DCCF DEC H Decrease H by three.
DCD0 DEC H
DCD1 DEC H
Just give up here if we still haven't found a building to land on.
DCD2 LD A,(HL) Return if *HL is zero.
DCD3 AND A
DCD4 RET Z
The routine has found "something" but we still need to check that it's compatible with containing a human.
FoundSolidMatter DCD5 AND %01000000 Keep only bit 6.
DCD7 LD D,A D=A.
DCD8 LD A,(HL) A=*HL.
DCD9 CP $07 Return if A is higher than 07.
DCDB RET NC
DCDC CP $03 Return if A is lower than 03.
DCDE RET C
DCDF AND %00000001 Keep only bit 0.
DCE1 JR Z,Handler_SpawnHumans_0 Jump to Handler_SpawnHumans_0 if the result is zero.
DCE3 LD A,$07 A=07.
DCE5 OR D Set the bits from D.
DCE6 LD (HL),A Write A to *HL.
DCE7 INC L Increment L by one.
DCE8 LD A,$08 A=08.
DCEA OR D Set the bits from D.
DCEB LD (HL),A Write A to *HL.
DCEC DEC L Decrease L by one.
DCED JR Handler_SpawnHumans_1 Jump to Handler_SpawnHumans_1.
Handler_SpawnHumans_0 DCEF LD A,$08 A=08.
DCF1 OR D Set the bits from D.
DCF2 LD (HL),A Write A to *HL.
DCF3 DEC L Decrease L by one.
DCF4 LD A,$07 A=07.
DCF6 OR D Set the bits from D.
DCF7 LD (HL),A Write A to *HL.
DCF8 INC L Increment L by one.
DCF9 DEC C Decrease C by one.
Handler_SpawnHumans_1 DCFA PUSH BC Stash BC on the stack.
DCFB LD A,$68 B+=68.
DCFD ADD A,B
DCFE LD B,A
DCFF LD A,$FF Write FF to *BC.
DD01 LD (BC),A
DD02 INC C Increment C by one.
DD03 LD (BC),A Write A to *BC.
DD04 EX DE,HL Exchange the DE and HL registers.
Register that a new human has been created.
DD05 LD A,($D3F4) Increment *NumberHumans by one.
DD08 INC A
DD09 LD ($D3F4),A
Loop to find an empty slot.
DD0C LD HL,$D251 HL=MonsterSpriteModifier (Table_Humans-04).
Handler_Humans_FindSlot DD0F INC HL Increment HL by four.
DD10 INC HL
DD11 INC HL
DD12 INC HL
DD13 LD A,(HL) Jump to Handler_Humans_FindSlot if *HL is not zero.
DD14 AND A
DD15 JR NZ,Handler_Humans_FindSlot
Found an empty slot.
All humans start as type 01.
DD17 LD (HL),$01 Write human type 01 to *HL.
Set a random countdown value.
DD19 INC HL Increment HL by one.
DD1A CALL RandomNumber Get a random number between 1F-3E.
DD1D AND %00011111
DD1F ADD A,$1F
DD21 LD (HL),A Write A as the countdown to *HL.
DD22 INC HL Increment HL by one.
DD23 POP BC Restore BC from the stack.
DD24 LD A,C A=C.
DD25 AND %00011111 Keep only bits 0-4.
DD27 LD (HL),A Write A to *HL.
DD28 INC HL Increment HL by one.
DD29 LD A,B A=B.
DD2A RLCA Rotate A left three positions (bits 5 to 7 are now in positions 0 to 2).
DD2B RLCA
DD2C RLCA
DD2D LD B,A Store the result in B.
DD2E LD A,C A=C.
DD2F RLCA Rotate A left three positions (bits 5 to 7 are now in positions 0 to 2).
DD30 RLCA
DD31 RLCA
DD32 AND %00000111 Keep only bits 0-2.
DD34 OR B Set the bits from B.
DD35 DEC A Decrease A by one.
DD36 LD (HL),A Write A to *HL.
DD37 RET Return.
Prev: DBE5 Up: Map Next: DD38