diff options
author | Astatin <[email protected]> | 2025-06-17 17:42:44 +0200 |
---|---|---|
committer | Astatin <[email protected]> | 2025-06-17 17:42:44 +0200 |
commit | b84a1c2c0ebb484e23753c2f9db8742389fcc99a (patch) | |
tree | 0036439ad1a5cc4c08c4bef79c0255b851a894f2 /map/loading | |
parent | a9142d0163f41c89196ea201ce8245899c701b82 (diff) |
loading ldtk tilemaps + adding dungeon structure that can be loaded at runtime
Diffstat (limited to 'map/loading')
-rw-r--r-- | map/loading/dungeoninfos.gbasm | 132 | ||||
-rw-r--r-- | map/loading/dungeontiles.gbasm | 405 | ||||
-rw-r--r-- | map/loading/romtiles.gbasm | 81 |
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 |