Prev: D71C Up: Map Next: D794
D730: Tunnel section - Generate a SPIDER or BAT encounter
Input
C Pseudo-random number generated (DB06) in previous routine
The previous routine has decided to generate a creature in the tunnel.
First check that there aren't already too many creatures (3). If not, generate one (50/50 chance of SPIDER/BAT):
D730 LD A,($EC9D) Number of creatures currently on-screen in the tunnel
D733 INC A Increase by 1
D734 CP $03 There's a limit of 3 creatures on-screen
D736 JR NC,$D794 If adding this creature would make it 4, skip the routine.
It's OK to generate a creature:
D738 LD ($EC9D),A It's < 3 creatures. Store the creature count byte
D73B LD A,$0E Item type #14 designates a tunnel object - boundary wall, bat or spider (creatures are later differentiated from walls using the byte at stored EB46)
D73D LD ($EB43),A
D740 LD A,$01 Starting frame offset (no offset)
D742 LD ($EB50),A
Randomize starting position of creature in relation to tunnel wall:
D745 LD A,C Retrieve random number generated earlier
D746 AND $0F Keep bits 0-4 (values = 0-15)
D748 SUB $07 Subtract 7 (value range now between -7 and +8)
D74A LD B,A Store in B register
D74B LD A,($EC9E) Get tunnel horizontal position
D74E ADD A,B Add the random offset calculated earlier (-7 to +8)
D74F LD ($EB48),A Store as graphic's horizontal position (in half character/4-pixel steps)
D752 LD B,A Put in B register
Determine whether the creature will be a SPIDER or a BAT:
D753 LD A,C Retrieve random number
D754 AND $01 Check bit 1 for 0 or 1 (50/50) - to run one of the next two sections.
D756 JR Z,$D769
Generate a SPIDER
D758 LD A,$04 Creature type = 4
D75A LD ($EB46),A
D75D LD A,($EC9E) Horizontal tunnel wall position (half-character/4-pixel steps)
D760 SUB B Subtract the graphic's horizontal position calculated earlier
D761 ADD A,A ...Double it...
D762 LD ($EB4C),A ...and store as position (movement) offset
D765 LD A,$7D Graphic number for spider graphic address at 98BB
D767 JR $D77D
Generate a BAT
D769 LD A,$08 Creature type = 8
D76B LD ($EB46),A
D76E LD A,C Retrieve random number generated earlier
D76F AND $7F Filter out bit 7, giving a random number in the range of 0-127
D771 SUB $3F ...And subtract 63, giving a random number in the range of -63 to +64
D773 LD ($EB4C),A Store as horizontal position (movement) speed/offset
D776 LD A,$24 Set vertical position (movement) speed/offset (36 pixels). This will cause the bat to start by moving quickly down the screen.
D778 LD ($EB4D),A
D77B LD A,$7F Graphic number for bat graphic address at 98BF
Set up creature graphic
D77D LD C,A Temporarily store the graphic number in C register
D77E LD A,$FE Tunnel item identifier (boundary wall, bat or spider) - ends up in byte 9 of data set at 7C00
D780 LD ($EB4B),A
D783 LD A,$08 Set vertical position (8 pixels from top of screen)
D785 LD ($EB4A),A
D788 LD A,C Retrieve graphic number
D789 CALL $E0C2 Set up the graphics
D78C CALL $E0B0 ...and copy into room data set at 7C00
D78F LD (HL),$FF Set end-of-data marker at start of next data set
D791 LD ($EB72),HL ...And store the address pointer to it.
Prev: D71C Up: Map Next: D794