Carve_Map: ; X in C, Y in B PUSH BC PUSH HL LD A, C AND $e0 JR NZ, =Carve_Map.end LD A, B AND $e0 JR NZ, =Carve_Map.end LD A, C LD H, $00 CP $10 RL B AND $0f CP $08 RL B AND $07 LD L, A LD C, B LD B, $c8 LD A, (BC) OR (HL) LD (BC), A Carve_Map.end: POP HL POP BC RET Generation_Head_Mitosis: PUSH HL PUSH BC LD A, $mem_next_free_head_lower_bytes LD C, A LD A, (HL) DEC A XOR $02 LD B, A CALL =RNG_Step AND $01 XOR B INC A LD B, $next_free_head_higher_bytes LD (BC), A DEC A XOR $01 INC A LD (HL), A INC HL INC BC LD A, (HL+) LD (BC), A INC BC LD A, (HL+) LD (BC), A INC BC LD A, C LD $mem_next_free_head_lower_bytes, A SLA E SLA E SLA E POP BC POP HL RET Enforce_Map_Bounds: ; X OR Y in A CP $80 JR NC, =Enforce_Map_Bounds.Zero CP $1f JR NC, =Enforce_Map_Bounds.Thirty_one RET Enforce_Map_Bounds.Zero: LD A, $00 RET Enforce_Map_Bounds.Thirty_one: LD A, $1f RET Generation_Head_Explosion: PUSH HL INC HL LD A, (HL+) LD E, A ; X LD A, (HL+) LD D, A ; Y LD H, $c8 LD A, $mem_number_of_rooms SLA A SLA A ADD $80 LD L, A LD A, E CALL =RNG_Step AND $03 ADD $06 LD B, A SRA A XOR $ff INC A ADD E CALL =Enforce_Map_Bounds LD E, A ; X ADD B CALL =Enforce_Map_Bounds SUB E LD B, A LD A, E LD (HL+), A LD A, B ; X size LD (HL+), A LD A, D CALL =RNG_Step AND $03 ADD $06 LD C, A SRA A XOR $ff INC A ADD D CALL =Enforce_Map_Bounds LD D, A ; Y ADD C CALL =Enforce_Map_Bounds SUB D LD C, A LD A, D LD (HL+), A LD A, C LD (HL+), A LD L, B Room_Generation.X_loop: LD H, C Room_Generation.Y_loop: PUSH BC LD A, D ADD H LD B, A LD A, E ADD L LD C, A CALL =Carve_Map POP BC DEC H LD A, H CP $ff JR NZ, =Room_Generation.Y_loop DEC L LD A, L CP $ff JR NZ, =Room_Generation.X_loop POP HL RET Dungeon_Generation: ; Head initialization LD HL, $mem_dungeon_generation_heads CALL =RNG_Step AND $03 INC A LD (HL+), A LD A, $10 LD (HL+), A LD (HL+), A LD E, $intial_duplication_probablity LD A, L LD $mem_next_free_head_lower_bytes, A LD A, $40 PUSH AF Dungeon_Generation.Step: LD HL, $mem_dungeon_generation_heads Dungeon_Generation.Head_loop: LD B, (HL) LD A, B CP $00 JR Z, =Dungeon_Generation.Head_loop.end LD A, E CP $00 JR Z, =Dungeon_Generation.Head_Mitosis.end DEC A LD C, A CALL =RNG_Step AND C CP $00 CALL Z, =Generation_Head_Mitosis Dungeon_Generation.Head_Mitosis.end: CALL =RNG_Step AND $0f JR NZ, =Dungeon_Generation.Direction_Change.end Dungeon_Generation.Direction_Change: DEC B CALL =RNG_Step AND $01 XOR B XOR $02 INC A LD B, A LD (HL), B Dungeon_Generation.Direction_Change.end: INC HL LD C, (HL) LD A, B CP $enum_direction_left JR NZ =Dungeon_Generation.Left.end Dungeon_Generation.Left: DEC C Dungeon_Generation.Left.end: CP $enum_direction_right JR NZ =Dungeon_Generation.Right.end Dungeon_Generation.Right: INC C Dungeon_Generation.Right.end: LD A, C AND $e0 JR NZ, =Dungeon_Generation.DonT_Update_X LD (HL), C Dungeon_Generation.DonT_Update_X: INC HL LD C, (HL) LD A, B CP $enum_direction_up JR NZ =Dungeon_Generation.Up.end Dungeon_Generation.Up: DEC C Dungeon_Generation.Up.end: CP $enum_direction_down JR NZ =Dungeon_Generation.Down.end Dungeon_Generation.Down: INC C Dungeon_Generation.Down.end: LD A, C AND $e0 JR NZ, =Dungeon_Generation.DonT_Update_Y LD (HL), C Dungeon_Generation.DonT_Update_Y: DEC HL LD A, (HL+) LD C, A LD A, (HL+) LD B, A LD A, C CALL =Carve_Map JP =Dungeon_Generation.Head_loop Dungeon_Generation.Head_loop.end: POP AF DEC A PUSH AF CP $00 JR NZ, =Dungeon_Generation.Step POP AF LD HL, $mem_dungeon_generation_heads Dungeon_Generation.Head_explosion_loop: LD B, (HL) LD A, B CP $00 JR Z, =Dungeon_Generation.Head_explosion_loop.end CALL =Generation_Head_Explosion LD A, $mem_number_of_rooms INC A LD $mem_number_of_rooms, A INC HL INC HL INC HL JR =Dungeon_Generation.Head_explosion_loop Dungeon_Generation.Head_explosion_loop.end: RET Reset_Map: LD HL, $c6ff LD BC, $0281 JP =bzero