aboutsummaryrefslogtreecommitdiff
path: root/map
diff options
context:
space:
mode:
authorAstatin <[email protected]>2024-08-15 22:46:34 +0900
committerAstatin <astatin@redacted>2024-08-15 22:46:34 +0900
commitc5ee7cfdd9ecb83bc1547a66ab1895685e49aaa4 (patch)
tree648bd418cb427c6f88a471bd46349aba8361f26c /map
parent16e0ec4460954b65f3b972fab00f3ad7527062ff (diff)
Generate a single tunnel in dungeon generation
Diffstat (limited to 'map')
-rw-r--r--map/generation.gbasm168
-rw-r--r--map/loading.gbasm276
2 files changed, 444 insertions, 0 deletions
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