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 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 POP BC POP HL RET Generation_Head_Explosion: PUSH HL INC HL LD A, (HL+) LD E, A LD A, (HL+) LD D, A CALL =RNG_Step AND $03 ADD $06 LD B, A SRA A XOR $ff INC A ADD E LD E, A CALL =RNG_Step AND $03 ADD $06 LD C, A SRA A XOR $ff INC A ADD D LD D, A LD L, C Room_Generation.X_loop: LD H, B 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 $00 JR NZ, =Room_Generation.Y_loop DEC L LD A, L CP $00 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 $07 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 INC HL INC HL INC HL JR =Dungeon_Generation.Head_explosion_loop Dungeon_Generation.Head_explosion_loop.end: RET