aboutsummaryrefslogtreecommitdiff
path: root/map/loading/dungeontiles.gbasm
diff options
context:
space:
mode:
Diffstat (limited to 'map/loading/dungeontiles.gbasm')
-rw-r--r--map/loading/dungeontiles.gbasm405
1 files changed, 405 insertions, 0 deletions
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