Prev: F3A2 Up: Map Next: F3D3
F3A4: Put special objects randomly in a room
Used by the routine at F345.
Input
B Number of objects to add.
F3A4 LD A,R Load A with the memory refresh register R, which is pseudo-random.
F3A6 AND $3F Store only the lower 6 bits.
F3A8 CP $30 Loop until the value is less than or equal to 30 which is the number of rooms
F3AA JR NC,$F3A4
F3AC LD C,A Put this value in C.
F3AD LD A,C Get the randomly generated value.
F3AE ADD A,$11 Add 0B.
F3B0 CP $30 If the value is now greater than 30 subtract 30 so the it cycles round from 00 - 30 and always holds a valid room.
F3B2 JR C,$F3B6
F3B4 SUB $30
F3B6 LD C,A Store the new value.
F3B7 ADD A,A Multiply the value by 4. and put it in HL.
F3B8 ADD A,A
F3B9 LD L,A
F3BA LD H,$00
F3BC LD E,L Multiply this by 4 to get an appropriate offset for a room.
F3BD LD D,H
F3BE ADD HL,HL
F3BF ADD HL,DE
F3C0 LD DE,($F3A2) Get the base rooms object data pointer in DE. (F3A2)
F3C4 ADD HL,DE Add the offset to get to the desired room.
F3C5 LD DE,($F3A0) Get the base room's flags in DE. (F3A0)
F3C9 LD A,(HL) Get the object flags.
F3CA AND D If the room can't support this object type, discard this and pick another one.
F3CB JR NZ,$F3AD
F3CD LD A,(HL) Get the object flags, and do a logical or against the allowed flags.
F3CE OR E
F3CF LD (HL),A
F3D0 DJNZ $F3AD Loop until all the objects are done.
F3D2 RET
Prev: F3A2 Up: Map Next: F3D3