aboutsummaryrefslogtreecommitdiff
path: root/map/loading
diff options
context:
space:
mode:
authorAstatin <[email protected]>2025-06-17 17:42:44 +0200
committerAstatin <[email protected]>2025-06-17 17:42:44 +0200
commitb84a1c2c0ebb484e23753c2f9db8742389fcc99a (patch)
tree0036439ad1a5cc4c08c4bef79c0255b851a894f2 /map/loading
parenta9142d0163f41c89196ea201ce8245899c701b82 (diff)
loading ldtk tilemaps + adding dungeon structure that can be loaded at runtime
Diffstat (limited to 'map/loading')
-rw-r--r--map/loading/dungeoninfos.gbasm132
-rw-r--r--map/loading/dungeontiles.gbasm405
-rw-r--r--map/loading/romtiles.gbasm81
3 files changed, 618 insertions, 0 deletions
diff --git a/map/loading/dungeoninfos.gbasm b/map/loading/dungeoninfos.gbasm
new file mode 100644
index 0000000..2b8fceb
--- /dev/null
+++ b/map/loading/dungeoninfos.gbasm
@@ -0,0 +1,132 @@
+Load_Dungeon_Txt: ; pointer to Dungeon struct in HL, bank in A
+ .CHANGE_BANK_TO_A
+
+ LD A, (HL+)
+ LD E, A
+ LD A, (HL+)
+ LD B, A
+ LD A, (HL+)
+ LD C, A
+ LD A, E
+ .CHANGE_BANK_TO_A
+
+ PUSH BC
+ LD H, B
+ LD L, C
+
+ CALL =strlen
+ LD B, A
+
+ LD A, $14
+ SUB B
+ SRA A
+
+ LD HL, $9e80
+ ADD L
+ LD L, A
+ LD A, H
+ ADC $00
+ LD H, A
+ POP BC
+ CALL =Print_str
+
+ RET
+
+Load_Dungeon_Spawn_patterns: ; pointer to Dungeon struct in HL bank in A
+ .CHANGE_BANK_TO_A
+ LD A, L
+ ADD $07
+ LD L, A
+ LD A, H
+ ADC $00
+ LD H, A
+
+ LD A, (HL+)
+ LD B, A
+ LD A, L
+ ADD B
+ LD L, A
+ LD A, H
+ ADC $00
+ LD H, A
+
+ INC HL
+
+ ; TODO FIX THE THING WHEN THERE'S MORE THAN 256/7 FLOORS
+ LD A, $mem_floor_count_bin
+ LD C, A
+ LD B, $07
+ CALL =MUL
+ LD C, A
+ LD B, (HL)
+ CALL =MUL
+ CALL =RNG_Step
+ AND $01
+ ADD E
+ LD E, A
+ LD D, $00
+ LD B, D
+ LD C, E
+ SLA E
+ RL D
+ SLA E
+ RL D
+ LD A, E
+ ADD C
+ LD E, A
+ LD A, D
+ ADC B
+ LD D, A
+
+
+ INC HL
+ LD A, L
+ ADD E
+ LD L, A
+ LD A, H
+ ADC D
+ LD H, A
+
+ LD BC, $mem_loaded_enemies_indices
+ LD A, (HL+)
+ LD (BC), A
+ INC BC
+ LD A, (HL+)
+ LD (BC), A
+ INC BC
+ LD A, (HL+)
+ LD (BC), A
+ INC BC
+ LD A, (HL+)
+ LD (BC), A
+
+ LD A, (HL)
+ LD $mem_entity_spawning_pattern, A
+
+ RET
+
+Load_Generation_Events: ; bank in A, dungeon ptr in HL
+ .CHANGE_BANK_TO_A
+ LD A, L
+ ADD $07
+ LD L, A
+ LD A, H
+ ADC $00
+ LD H, A
+ LD B, $00
+ LD C, (HL)
+ INC HL
+ LD D, H
+ LD E, L
+ LD HL, $mem_dungeon_generation_events
+ CALL =memcpy
+
+ LD A, C
+ CPL
+ INC A
+ ADD $80
+ LD C, A
+
+ CALL =bzero
+
+ RET
diff --git a/map/loading/dungeontiles.gbasm b/map/loading/dungeontiles.gbasm
new file mode 100644
index 0000000..5f91197
--- /dev/null
+++ b/map/loading/dungeontiles.gbasm
@@ -0,0 +1,405 @@
+Load_Prepared_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
+ .For_Y:
+ .For_X:
+ LD A, C
+ CALL =Load_Block
+ LD A, ($mem_prepared_block_position)
+ SUB high($VRAM_tilemap_1)
+ ADD high($mem_map_loading_buffer)
+ LD ($mem_prepared_block_position), A
+ CALL =Display_Main_Prepared_Block
+
+ INC C
+ LD A, C
+ CP E
+ JR NZ, =.For_X
+
+ INC B
+ LD A, B
+ CP D
+ JR NZ, =.For_Y
+
+ RET
+
+Load_Next_Block_Row: ; (+1/-1 direction in B, block number (between 0-f) in C
+ PUSH AF
+ PUSH BC
+ PUSH DE
+ LD A, B
+ CP $01
+ JR NZ, =Load_Next_Block_Row.Up
+
+ LD A, $mem_viewport_y
+ ADD $0C
+ LD B, A
+ JR =Load_Next_Block_Row.Set_X_Limits
+
+ Load_Next_Block_Row.Up:
+ LD A, $mem_viewport_y
+ SUB $02
+ LD B, A
+
+ Load_Next_Block_Row.Set_X_Limits:
+ LD A, $mem_viewport_x
+ SUB $03
+ LD D, A
+ LD A, C
+ ADD D
+ LD D, A
+ LD A, $mem_viewport_x
+ ADD $0D
+ LD E, A
+ LD A, D
+ CALL =Load_Block
+
+ POP DE
+ POP BC
+ POP AF
+ RET
+
+Load_Next_Block_Column: ; (+1/-1 direction in B), block number (between 0-f) in C
+ PUSH AF
+ PUSH BC
+ PUSH DE
+ LD A, B
+ CP $01
+ JR NZ, =Load_Next_Block_Column.Left
+
+ LD A, $mem_viewport_x
+ ADD $0C
+ LD D, A
+ JR =Load_Next_Block_Column.Set_Y_Limits
+
+ Load_Next_Block_Column.Left:
+ LD A, $mem_viewport_x
+ SUB $02
+ LD D, A
+
+ Load_Next_Block_Column.Set_Y_Limits:
+ LD A, $mem_viewport_y
+ SUB $03
+ LD B, A
+ LD A, $mem_viewport_y
+ ADD $0D
+ LD E, A
+ LD A, C
+ ADD B
+ LD B, A
+ LD A, D
+ CALL =Load_Block
+
+ POP DE
+ POP BC
+ POP AF
+ RET
+
+Prepare_Scrolling_Map:
+ LD A, $mem_map_loading_flags
+ BIT 0, A
+ JR Z, =Display_Scrolling_Map.End
+
+ LD A, $mem_moving_animation_step
+ LD C, A
+
+ LD A, $mem_bunny_direction
+ AND $07
+ DEC A
+ AND $01
+ ADD A
+ DEC A
+ LD B, A
+ LD A, $mem_bunny_direction
+ AND $07
+ DEC A
+
+ BIT 1, A
+ JR NZ, =Display_Scrolling_Map.vertical
+
+ Display_Scrolling_Map.horizontal:
+ CALL =Load_Next_Block_Column
+ JR =Display_Scrolling_Map.End
+
+ Display_Scrolling_Map.vertical:
+ CALL =Load_Next_Block_Row
+
+ Display_Scrolling_Map.End:
+ RET
+
+Construct_Tile_Address: ; 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
+ ADD A
+ OR E
+ LD E, A
+ LD A, D
+ OR high($VRAM_tilemap_1)
+ LD D, A
+
+ POP BC
+ POP AF
+
+ RET
+
+Load_Block:
+Load_Block_From_Solid: ; X in A, Y in B
+ PUSH BC
+ PUSH AF
+ .After_AF_BC_Push:
+
+ PUSH DE
+
+ CALL =Construct_Tile_Address
+
+ 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
+
+ LD A, $mem_map_loading_flags
+ SET 2, A
+ LD $mem_map_loading_flags, A
+
+
+ POP DE
+
+ LD A, D
+ LD ($mem_prepared_block_position), A
+ LD A, E
+ LD ($mem_prepared_block_position+1), A
+
+ POP AF
+
+ CALL =Is_Solid
+ CP $00
+
+ JR Z, =Load_Block.Empty
+ Load_Block.Solid:
+ LD A, C
+ AND 0b0101
+ SRA A
+ RRA
+ RLCA
+ ADD $20
+
+ LD ($mem_prepared_block_tile), A
+
+ LD A, C
+ AND 0b0110
+ SRA A
+ ADD $24
+
+ LD ($mem_prepared_block_tile+1), A
+
+ LD A, C
+ AND 0b1001
+ SRA A
+ RRA
+ RLCA
+ SRA A
+ RRA
+ RLCA
+ ADD $28
+
+ LD ($mem_prepared_block_tile+2), A
+
+ LD A, C
+ AND 0b1010
+ SRA A
+ RRA
+ RRA
+ RLCA
+ ADD $2c
+
+ LD ($mem_prepared_block_tile+3), A
+
+
+ JR =Load_Block.End
+
+ Load_Block.Empty:
+ LD A, $00
+ LD ($mem_prepared_block_tile), A
+ LD ($mem_prepared_block_tile+1), A
+ LD ($mem_prepared_block_tile+2), A
+ LD ($mem_prepared_block_tile+3), A
+
+ Load_Block.End:
+
+ POP DE
+ POP AF
+ POP BC
+ RET
+
+Load_Additional_Block:
+ LD A, $mem_display_flag
+ BIT 6, A
+ RET Z
+ LD A, $mem_additional_loading_block_y
+ LD B, A
+ LD A, $mem_additional_loading_block_x
+ CALL =Load_Block
+ .COPY_4BYTES $mem_additional_loading_block_tile, $mem_prepared_block_tile
+ LD A, ($mem_prepared_block_position)
+ LD ($mem_additional_loading_block_position), A
+ LD A, ($mem_prepared_block_position+1)
+ LD ($mem_additional_loading_block_position+1), A
+
+ RET
+
+Display_Prepared_Blocks:
+ LD A, $mem_map_loading_flags
+ BIT 2, A
+ JR Z, =.Skip_Main
+
+ LD A, $mem_map_loading_flags
+ RES 2, A
+ LD $mem_map_loading_flags, A
+
+ CALL =Display_Main_Prepared_Block
+
+ .Skip_Main:
+ LD A, $mem_display_flag
+ BIT 6, A
+ RET Z
+ RES 6, A
+ LD $mem_display_flag, A
+
+ .COPY_4BYTES $mem_prepared_block_tile, $mem_additional_loading_block_tile
+
+ LD A, ($mem_additional_loading_block_position)
+ LD ($mem_prepared_block_position), A
+ LD A, ($mem_additional_loading_block_position+1)
+ LD ($mem_prepared_block_position+1), A
+ JP =Display_Main_Prepared_Block
+
+Display_Main_Prepared_Block:
+ PUSH AF
+ PUSH BC
+ PUSH DE
+
+ LD A, ($mem_prepared_block_position)
+ LD D, A
+
+ LD A, ($mem_prepared_block_position+1)
+ LD E, A
+
+ LD A, ($mem_prepared_block_tile)
+ LD (DE), A
+
+ INC E
+ LD A, ($mem_prepared_block_tile+1)
+ LD (DE), A
+
+ LD A, E
+ OR $20
+ DEC A
+ LD E, A
+ LD A, ($mem_prepared_block_tile+2)
+ LD (DE), A
+
+ INC E
+ LD A, ($mem_prepared_block_tile+3)
+ LD (DE), A
+
+ POP DE
+ POP BC
+ POP AF
+ 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, high($mem_dungeon_map)
+ 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/loading/romtiles.gbasm b/map/loading/romtiles.gbasm
new file mode 100644
index 0000000..989a201
--- /dev/null
+++ b/map/loading/romtiles.gbasm
@@ -0,0 +1,81 @@
+Load_ROM_Block: ; X in A, Y in B
+ PUSH BC
+ PUSH AF
+
+ CP $20
+ JP NC, =Load_Block_From_Solid.After_AF_BC_Push
+
+ PUSH BC
+ LD C, A
+ LD A, B
+ CP $20
+ LD A, C
+ POP BC
+ JP NC, =Load_Block_From_Solid.After_AF_BC_Push
+
+ PUSH DE
+ PUSH HL
+
+ LD C, A
+
+
+ CALL =Construct_Tile_Address
+
+ LD A, $mem_map_loading_flags
+ SET 2, A
+ LD $mem_map_loading_flags, A
+
+ LD A, ($mem_rom_tilemap_addr+1)
+ LD H, A
+ LD A, ($mem_rom_tilemap_addr+2)
+ LD L, A
+ LD A, ($mem_rom_tilemap_addr)
+ .CHANGE_BANK_TO_A
+
+ SLA C
+ SLA B
+ LD A, $00
+ SRA B
+ RR A
+ SRA B
+ RR A
+ OR C
+ LD C, A
+
+ DBG
+
+ LD A, L
+ ADD C
+ LD L, A
+ LD A, H
+ ADC B
+ LD H, A
+
+ LD A, D
+ LD ($mem_prepared_block_position), A
+ LD A, E
+ LD ($mem_prepared_block_position+1), A
+
+ LD A, (HL+)
+ LD ($mem_prepared_block_tile), A
+ LD A, (HL)
+ LD ($mem_prepared_block_tile+1), A
+
+ LD A, L
+ DEC A
+ ADD $40
+ LD L, A
+ LD A, H
+ ADC $00
+ LD H, A
+
+ LD A, (HL+)
+ LD ($mem_prepared_block_tile+2), A
+ LD A, (HL)
+ LD ($mem_prepared_block_tile+3), A
+
+ POP HL
+ POP DE
+ POP AF
+ POP BC
+ RET