From c5ee7cfdd9ecb83bc1547a66ab1895685e49aaa4 Mon Sep 17 00:00:00 2001 From: Astatin Date: Thu, 15 Aug 2024 22:46:34 +0900 Subject: Generate a single tunnel in dungeon generation --- definitions.gbasm | 10 ++ init.gbasm | 8 +- main.gbasm | 8 +- map.gbasm | 317 --------------------------------------------------- map/generation.gbasm | 168 +++++++++++++++++++++++++++ map/loading.gbasm | 276 ++++++++++++++++++++++++++++++++++++++++++++ rng.gbasm | 2 +- tiles.gbasm | 1 + 8 files changed, 464 insertions(+), 326 deletions(-) delete mode 100644 map.gbasm create mode 100644 map/generation.gbasm create mode 100644 map/loading.gbasm diff --git a/definitions.gbasm b/definitions.gbasm index f6b757e..2df133f 100644 --- a/definitions.gbasm +++ b/definitions.gbasm @@ -10,6 +10,9 @@ .DEFINE VRAM_start $8000 .DEFINE OAM_start $FE00 +.DEFINE dungeon_generation_step $20 +.DEFINE intial_duplication_probablity $2 + .DEFINE mem_bunny_x_px ($c000) .DEFINE mem_bunny_y_px ($c001) .DEFINE mem_button_direction ($c002) @@ -23,6 +26,13 @@ .DEFINE mem_rng_state_1 ($c00a) ; 2 bytes .DEFINE mem_rng_state_2 ($c00b) ; 2 bytes +.DEFINE mem_dungeon_generation_heads $c700 ; Takes the memory from c700 to c717 +; struct head { +; direction: u8 (really u3 but padding), +; x: u8, +; y: u8, +; } + .DEFINE mem_dungeon_map $c800 ; Takes the memory from c800 to c87f .DEFINE enum_direction_left $01 diff --git a/init.gbasm b/init.gbasm index 8483d4a..ac9b67b 100644 --- a/init.gbasm +++ b/init.gbasm @@ -41,12 +41,12 @@ Wait_VBlank: LD $reg_lcd_controller, A Empty_VRAM: ; (Clear screen) - LD hl, $VRAM_start ; We set the HL register to the start of VRAM + LD HL, $VRAM_start ; We set the HL register to the start of VRAM Empty_VRAM.loop: XOR A - LD (HL+), a ; We set the memory pointed to by HL to 0 and increase HL - LD a, $a0 - CP h ; Until h has reached $a0 ($a0000 is the end of VRAM) + LD (HL+), A ; We set the memory pointed to by HL to 0 and increase HL + LD A, $a0 + CP H ; Until h has reached $a0 ($a0000 is the end of VRAM) JR NZ, =Empty_VRAM.loop ; BG Palette diff --git a/main.gbasm b/main.gbasm index a315d48..3dc2427 100644 --- a/main.gbasm +++ b/main.gbasm @@ -2,11 +2,11 @@ .INCLUDE "init.gbasm" Entrypoint: - CALL =Initialize_Dungeon + CALL =Initialize_RNG + CALL =Dungeon_Generation CALL =Initialize_Bunny CALL =Load_Tile CALL =Load_Map - CALL =Initialize_RNG ; LCDC LD A, $87 @@ -21,11 +21,11 @@ VBLANK_Entrypoint: CALL =Pad_Button_Check CALL =Move_Bunny CALL =Display_Bunny - CALL =RNG_Step RET .INCLUDE "tiles.gbasm" -.INCLUDE "map.gbasm" +.INCLUDE "map/loading.gbasm" +.INCLUDE "map/generation.gbasm" .INCLUDE "bunny.gbasm" .INCLUDE "buttons.gbasm" .INCLUDE "rng.gbasm" diff --git a/map.gbasm b/map.gbasm deleted file mode 100644 index d664203..0000000 --- a/map.gbasm +++ /dev/null @@ -1,317 +0,0 @@ -Load_Map: - LD A, $mem_viewport_x - SUB $02 - LD C, A - ADD $10 - LD E, A - LD A, $mem_viewport_y - SUB $02 - LD B, A - ADD $10 - LD D, A - Load_Map.For_Y: - Load_Map.For_X: - LD A, C - CALL =Load_Block - - INC C - LD A, C - CP E - JR NZ, =Load_Map.For_X - - INC B - LD A, B - CP D - JR NZ, =Load_Map.For_Y - - RET - -Load_Row: ; (+1/-1 direction in B) - PUSH AF - PUSH BC - PUSH DE - LD A, B - CP $01 - JR NZ, =Load_Row.Up - - LD A, $mem_viewport_y - ADD $0C - LD B, A - JR =Load_Row.Set_X_Limits - - Load_Row.Up: - LD A, $mem_viewport_y - SUB $02 - LD B, A - - Load_Row.Set_X_Limits: - LD A, $mem_viewport_x - SUB $03 - LD D, A - LD A, $mem_viewport_x - ADD $0D - LD E, A - Load_Row.For_X: - LD A, D - CALL =Load_Block - - INC D - LD A, D - CP E - JR NZ, =Load_Row.For_X - - POP DE - POP BC - POP AF - RET - -Load_Column: ; (+1/-1 direction in B) - PUSH AF - PUSH BC - PUSH DE - LD A, B - CP $01 - JR NZ, =Load_Column.Left - - LD A, $mem_viewport_x - ADD $0C - LD D, A - JR =Load_Column.Set_Y_Limits - - Load_Column.Left: - LD A, $mem_viewport_x - SUB $02 - LD D, A - - Load_Column.Set_Y_Limits: - LD A, $mem_viewport_y - SUB $03 - LD B, A - LD A, $mem_viewport_y - ADD $0D - LD E, A - Load_Column.For_Y: - LD A, D - CALL =Load_Block - - INC B - LD A, B - CP E - JR NZ, =Load_Column.For_Y - - POP DE - POP BC - POP AF - RET - -Load_Block: ; X in A, Y in B - PUSH BC - PUSH AF - PUSH DE - - ; Construct Tile Map address from A and B in DE - PUSH AF - PUSH BC - - AND $0f - LD C, A - LD A, B - AND $0f - LD B, A - LD A, C - - LD D, $00 - LD E, $00 - LD E, B - SWAP E - SLA E - RL D - SLA E - RL D - SLA A - OR E - LD E, A - LD A, D - OR $98 - LD D, A - POP BC - POP AF - - PUSH AF - PUSH DE - - LD C, $00 - LD D, A - - ; Checking down block - LD A, D - INC B - CALL =Is_Solid - OR C - LD C, A - DEC B - SLA C - - ; Checking up block - LD A, D - DEC B - CALL =Is_Solid - OR C - LD C, A - INC B - SLA C - - ; Checking right block - LD A, D - INC A - CALL =Is_Solid - OR C - LD C, A - SLA C - - ; Checking left block - LD A, D - DEC A - CALL =Is_Solid - OR C - LD C, A - SLA C - - SLA C - - LD A, C - ADD $20 - LD C, A - - POP DE - POP AF - - CALL =Is_Solid - - CP $00 - JR Z, =Load_Block.Empty - Load_Block.Solid: - LD A, C - LD (DE), A - LD A, E - OR $20 - LD E, A - LD A, C - OR $02 - LD (DE), A - INC E - LD A, C - OR $03 - LD (DE), A - LD A, E - AND $DF - LD E, A - LD A, C - OR $01 - LD (DE), A - - JR =Load_Block.End - - Load_Block.Empty: - LD A, $00 - LD (DE), A - LD A, E - OR $20 - LD E, A - LD A, $00 - LD (DE), A - INC E - LD A, $00 - LD (DE), A - LD A, E - AND $DF - LD E, A - LD A, $00 - LD (DE), A - - Load_Block.End: - - POP DE - POP AF - POP BC - RET - -Initial_dungeon: - .DB $00, $00, $00, $00, - .DB $00, $00, $00, $00, - .DB $00, $00, $00, $00, - .DB $00, $00, $00, $00, - .DB $00, $00, $00, $00, - .DB $00, $00, $00, $00, - .DB $00, $00, $00, $00, - .DB $03, $e0, $00, $00, - .DB $02, $20, $00, $00, - .DB $02, $20, $00, $00, - .DB $02, $20, $00, $00, - .DB $02, $20, $00, $00, - .DB $02, $20, $00, $00, - .DB $0e, $20, $00, $00, - .DB $3f, $20, $00, $00, - .DB $3f, $20, $00, $00, - .DB $3f, $3f, $80, $00, - .DB $3f, $00, $80, $00, - .DB $3f, $00, $80, $00, - .DB $3f, $00, $80, $00, - .DB $3f, $00, $80, $00, - .DB $3f, $00, $80, $00, - .DB $00, $01, $f8, $00, - .DB $00, $01, $f8, $00, - .DB $00, $01, $f8, $00, - .DB $00, $01, $f8, $00, - .DB $00, $01, $f8, $00, - .DB $00, $01, $ff, $80, - .DB $00, $01, $f8, $80, - .DB $00, $01, $f8, $80, - .DB $00, $00, $ff, $80, - .DB $00, $00, $00, $00, - -Initialize_Dungeon: - LD HL, $mem_dungeon_map - LD DE, =Initial_dungeon - LD BC, $0100 - JP =memcpy - - -Is_Solid: ; X in A, Y in B, Result A - PUSH BC - - CP $20 - JR NC, =Is_Solid.Solid - - LD C, A - LD A, B - CP $20 - JR NC, =Is_Solid.Solid - 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) - - AND (HL) - CP $01 - LD A, $00 - RL A - - POP BC - RET - - Is_Solid.Solid: - LD A, $01 - POP BC - - RET diff --git a/map/generation.gbasm b/map/generation.gbasm new file mode 100644 index 0000000..1bedffc --- /dev/null +++ b/map/generation.gbasm @@ -0,0 +1,168 @@ +Initial_dungeon: + .DB $00, $00, $00, $00, + .DB $00, $00, $00, $00, + .DB $00, $00, $00, $00, + .DB $00, $00, $00, $00, + .DB $00, $00, $00, $00, + .DB $00, $00, $00, $00, + .DB $00, $00, $00, $00, + .DB $03, $e0, $00, $00, + .DB $02, $20, $00, $00, + .DB $02, $20, $00, $00, + .DB $02, $20, $00, $00, + .DB $02, $20, $00, $00, + .DB $02, $20, $00, $00, + .DB $0e, $20, $00, $00, + .DB $3f, $20, $00, $00, + .DB $3f, $20, $00, $00, + .DB $3f, $3f, $80, $00, + .DB $3f, $00, $80, $00, + .DB $3f, $00, $80, $00, + .DB $3f, $00, $80, $00, + .DB $3f, $00, $80, $00, + .DB $3f, $00, $80, $00, + .DB $00, $01, $f8, $00, + .DB $00, $01, $f8, $00, + .DB $00, $01, $f8, $00, + .DB $00, $01, $f8, $00, + .DB $00, $01, $f8, $00, + .DB $00, $01, $ff, $80, + .DB $00, $01, $f8, $80, + .DB $00, $01, $f8, $80, + .DB $00, $00, $ff, $80, + .DB $00, $00, $00, $00, + +Initialize_Dungeon: + LD HL, $mem_dungeon_map + LD DE, =Initial_dungeon + LD BC, $0100 + JP =memcpy + +Carve_Tunnel: ; X in A, Y in B + PUSH BC + PUSH HL + 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 + + POP HL + POP BC + RET + +Dungeon_Generation: + ; Head initialization + LD HL, $mem_dungeon_generation_heads + CALL =RNG_Step + AND $03 + ADD $01 + LD (HL+), A + LD A, $10 + LD (HL+), A + LD (HL+), A + + LD A, $20 + 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 + + 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 $01 + JR NZ =Dungeon_Generation.Left.end + Dungeon_Generation.Left: + DEC C + Dungeon_Generation.Left.end: + + CP $02 + JR NZ =Dungeon_Generation.Right.end + Dungeon_Generation.Right: + INC C + Dungeon_Generation.Right.end: + + 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 $03 + JR NZ =Dungeon_Generation.Up.end + Dungeon_Generation.Up: + DEC C + Dungeon_Generation.Up.end: + + CP $04 + JR NZ =Dungeon_Generation.Down.end + Dungeon_Generation.Down: + INC C + Dungeon_Generation.Down.end: + + 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_Tunnel + 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 + RET diff --git a/map/loading.gbasm b/map/loading.gbasm new file mode 100644 index 0000000..8b3f414 --- /dev/null +++ b/map/loading.gbasm @@ -0,0 +1,276 @@ +Load_Map: + LD A, $mem_viewport_x + SUB $02 + LD C, A + ADD $10 + LD E, A + LD A, $mem_viewport_y + SUB $02 + LD B, A + ADD $10 + LD D, A + Load_Map.For_Y: + Load_Map.For_X: + LD A, C + CALL =Load_Block + + INC C + LD A, C + CP E + JR NZ, =Load_Map.For_X + + INC B + LD A, B + CP D + JR NZ, =Load_Map.For_Y + + RET + +Load_Row: ; (+1/-1 direction in B) + PUSH AF + PUSH BC + PUSH DE + LD A, B + CP $01 + JR NZ, =Load_Row.Up + + LD A, $mem_viewport_y + ADD $0C + LD B, A + JR =Load_Row.Set_X_Limits + + Load_Row.Up: + LD A, $mem_viewport_y + SUB $02 + LD B, A + + Load_Row.Set_X_Limits: + LD A, $mem_viewport_x + SUB $03 + LD D, A + LD A, $mem_viewport_x + ADD $0D + LD E, A + Load_Row.For_X: + LD A, D + CALL =Load_Block + + INC D + LD A, D + CP E + JR NZ, =Load_Row.For_X + + POP DE + POP BC + POP AF + RET + +Load_Column: ; (+1/-1 direction in B) + PUSH AF + PUSH BC + PUSH DE + LD A, B + CP $01 + JR NZ, =Load_Column.Left + + LD A, $mem_viewport_x + ADD $0C + LD D, A + JR =Load_Column.Set_Y_Limits + + Load_Column.Left: + LD A, $mem_viewport_x + SUB $02 + LD D, A + + Load_Column.Set_Y_Limits: + LD A, $mem_viewport_y + SUB $03 + LD B, A + LD A, $mem_viewport_y + ADD $0D + LD E, A + Load_Column.For_Y: + LD A, D + CALL =Load_Block + + INC B + LD A, B + CP E + JR NZ, =Load_Column.For_Y + + POP DE + POP BC + POP AF + RET + +Load_Block: ; X in A, Y in B + PUSH BC + PUSH AF + PUSH DE + + ; Construct Tile Map address from A and B in DE + PUSH AF + PUSH BC + + AND $0f + LD C, A + LD A, B + AND $0f + LD B, A + LD A, C + + LD D, $00 + LD E, $00 + LD E, B + SWAP E + SLA E + RL D + SLA E + RL D + SLA A + OR E + LD E, A + LD A, D + OR $98 + LD D, A + POP BC + POP AF + + PUSH AF + PUSH DE + + LD C, $00 + LD D, A + + ; Checking down block + LD A, D + INC B + CALL =Is_Solid + OR C + LD C, A + DEC B + SLA C + + ; Checking up block + LD A, D + DEC B + CALL =Is_Solid + OR C + LD C, A + INC B + SLA C + + ; Checking right block + LD A, D + INC A + CALL =Is_Solid + OR C + LD C, A + SLA C + + ; Checking left block + LD A, D + DEC A + CALL =Is_Solid + OR C + LD C, A + SLA C + + SLA C + + LD A, C + ADD $20 + LD C, A + + POP DE + POP AF + + CALL =Is_Solid + + CP $00 + JR Z, =Load_Block.Empty + Load_Block.Solid: + LD A, C + LD (DE), A + LD A, E + OR $20 + LD E, A + LD A, C + OR $02 + LD (DE), A + INC E + LD A, C + OR $03 + LD (DE), A + LD A, E + AND $DF + LD E, A + LD A, C + OR $01 + LD (DE), A + + JR =Load_Block.End + + Load_Block.Empty: + LD A, $00 + LD (DE), A + LD A, E + OR $20 + LD E, A + LD A, $00 + LD (DE), A + INC E + LD A, $00 + LD (DE), A + LD A, E + AND $DF + LD E, A + LD A, $00 + LD (DE), A + + Load_Block.End: + + POP DE + POP AF + POP BC + RET + +Is_Solid: ; X in A, Y in B, Result A + PUSH BC + + CP $20 + JR NC, =Is_Solid.Solid + + LD C, A + LD A, B + CP $20 + JR NC, =Is_Solid.Solid + 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) + + AND (HL) + CP $01 + LD A, $00 + RL A + + POP BC + RET + + Is_Solid.Solid: + LD A, $01 + POP BC + + RET diff --git a/rng.gbasm b/rng.gbasm index 8649024..f639946 100644 --- a/rng.gbasm +++ b/rng.gbasm @@ -9,7 +9,7 @@ Debug_RNG: Initialize_RNG: LD A, $42 LD $mem_rng_state_1, A - LD A, $69 + LD A, $15 LD $mem_rng_state_2, A RET diff --git a/tiles.gbasm b/tiles.gbasm index b66222c..faeda8d 100644 --- a/tiles.gbasm +++ b/tiles.gbasm @@ -127,3 +127,4 @@ Load_Number_Font: ; Load number font into the tilemap at tiles 0x10-0x1f INC DE DEC B JR NZ, =Load_Number_Font.loop + RET -- cgit v1.2.3-70-g09d2