aboutsummaryrefslogtreecommitdiff
path: root/map
diff options
context:
space:
mode:
authorAstatin <[email protected]>2024-09-10 16:10:59 +0900
committerAstatin <astatin@redacted>2024-09-10 16:10:59 +0900
commitc3d302cd8332d55bb477b5e93ea0f6027d26c632 (patch)
tree2f050fc21968051e95b624c1dff5c63533bf395f /map
parent8a69fd747d22206afe4ea31a743e58070699b3d9 (diff)
Optimize object displays and preload map scrolling to stay in VBlank
Diffstat (limited to 'map')
-rw-r--r--map/loading.gbasm104
-rw-r--r--map/objects.gbasm173
2 files changed, 170 insertions, 107 deletions
diff --git a/map/loading.gbasm b/map/loading.gbasm
index e42f388..be4c8a4 100644
--- a/map/loading.gbasm
+++ b/map/loading.gbasm
@@ -13,6 +13,7 @@ Load_Map:
Load_Map.For_X:
LD A, C
CALL =Load_Block
+ CALL =Display_Prepared_Block
INC C
LD A, C
@@ -98,7 +99,7 @@ Load_Column: ; (+1/-1 direction in B)
POP AF
RET
-Display_Scrolling_Map:
+Prepare_Scrolling_Map:
LD A, $mem_map_loading_flags
BIT 0, A
JR Z, =Display_Scrolling_Map.End
@@ -211,59 +212,33 @@ Load_Block: ; X in A, Y in B
ADD $20
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_1, A
+ LD A, E
+ LD $mem_prepared_block_position_2, A
+
POP AF
CALL =Is_Solid
-
CP $00
+
JR Z, =Load_Block.Empty
Load_Block.Solid:
LD A, C
- CALL =VBlank_Wait
- LD (DE), A
- LD A, E
- OR $20
- LD E, A
- LD A, C
- OR $02
- CALL =VBlank_Wait
- LD (DE), A
- INC E
- LD A, C
- OR $03
- CALL =VBlank_Wait
- LD (DE), A
- LD A, E
- AND $DF
- LD E, A
- LD A, C
- OR $01
- CALL =VBlank_Wait
- LD (DE), A
+ LD $mem_prepared_block_tile, A
JR =Load_Block.End
Load_Block.Empty:
LD A, $00
- CALL =VBlank_Wait
- LD (DE), A
- LD A, E
- OR $20
- LD E, A
- LD A, $00
- CALL =VBlank_Wait
- LD (DE), A
- INC E
- LD A, $00
- CALL =VBlank_Wait
- LD (DE), A
- LD A, E
- AND $DF
- LD E, A
- LD A, $00
- CALL =VBlank_Wait
- LD (DE), A
+ LD $mem_prepared_block_tile, A
Load_Block.End:
@@ -272,6 +247,53 @@ Load_Block: ; X in A, Y in B
POP BC
RET
+Display_Prepared_Block:
+ PUSH AF
+ PUSH BC
+ PUSH DE
+
+ LD A, $mem_map_loading_flags
+ BIT 2, A
+ JR Z, =Display_Prepared_Block.End
+
+ LD A, $mem_map_loading_flags
+ RES 2, A
+ LD $mem_map_loading_flags, A
+
+ LD A, $mem_prepared_block_position_1
+ LD D, A
+
+ LD A, $mem_prepared_block_position_2
+ LD E, A
+
+ LD A, $mem_prepared_block_tile
+ LD C, A
+
+ 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
+
+ Display_Prepared_Block.End:
+
+ POP DE
+ POP BC
+ POP AF
+ RET
+
Is_Solid: ; X in A, Y in B, Result A
PUSH BC
diff --git a/map/objects.gbasm b/map/objects.gbasm
index bfaa903..22a65ee 100644
--- a/map/objects.gbasm
+++ b/map/objects.gbasm
@@ -3,6 +3,10 @@ Initialize_Objects:
OR $01
LD $mem_map_loading_flags, A
LD HL, $mem_object_list
+ CALL =Spawn_stairs
+ RET
+
+Spawn_stairs:
LD A, $60
LD (HL+), A
@@ -42,6 +46,9 @@ Initialize_Objects:
LD (HL+), A
LD A, C
LD (HL+), A
+ INC HL
+ INC HL
+ INC HL
RET
Stairs_action:
@@ -57,88 +64,109 @@ Stairs_action:
JP =New_Dungeon
-Display_Objects:
- LD A, $mem_map_loading_flags
- BIT 0, A
- JR Z, =Display_Objects.End
- LD A, $mem_moving_animation_step
- CP $00
- JR NZ, =Display_Objects.End
+Display_Object:
LD HL, $mem_object_list
Display_Objects.loop:
- LD A, (HL+)
- CP $00
- JR Z, =Display_Objects.next
- LD C, A
- LD A, (HL+)
- ADD $80
- LD D, A
- LD A, $mem_viewport_x
- SUB $83
- CP D
- JR NC, =Display_Objects.next
- ADD $10
- CP D
- JR C, =Display_Objects.next
- LD A, D
- SUB $80
- LD D, A
+ LD A, $mem_object_load_counter
+ INC A
+ AND $0f
+ LD $mem_object_load_counter, A
+ SLA A
+ SLA A
+ SLA A
+ AND $f8
+ LD L, A
- LD A, (HL+)
- ADD $80
- LD B, A
- LD A, $mem_viewport_y
- SUB $83
- CP B
- JR NC, =Display_Objects.next
- ADD $10
- CP B
- JR C, =Display_Objects.next
- LD A, B
- SUB $80
- LD B, A
+ LD A, (HL+)
+ LD C, A
+ LD A, (HL+)
+ ADD $80
+ LD D, A
+ LD A, $mem_viewport_x
+ SUB $83
+ CP D
+ JR NC, =Display_Objects.End
+ ADD $10
+ CP D
+ JR C, =Display_Objects.End
+ LD A, D
+ SUB $80
+ LD D, A
- LD A, D
- CALL =Construct_Tile_Address
+ LD A, (HL+)
+ ADD $80
+ LD B, A
+ LD A, $mem_viewport_y
+ SUB $83
+ CP B
+ JR NC, =Display_Objects.End
+ ADD $10
+ CP B
+ JR C, =Display_Objects.End
+ LD A, B
+ SUB $80
+ LD B, A
- CALL =VBlank_Wait
- LD A, C
- LD (DE), A
+ LD A, C
+ CP $00
- INC E
- INC C
+ JR Z, =Display_Objects.Nothing
- CALL =VBlank_Wait
- LD A, C
- LD (DE), A
+ LD A, D
+ CALL =Construct_Tile_Address
- INC C
+ LD A, C
+ LD (DE), A
- LD A, E
- XOR $21
- LD E, A
+ INC E
+ INC C
- CALL =VBlank_Wait
- LD A, C
- LD (DE), A
+ LD A, C
+ LD (DE), A
- INC C
- INC E
+ INC C
- CALL =VBlank_Wait
- LD A, C
- LD (DE), A
+ LD A, E
+ XOR $21
+ LD E, A
+
+ LD A, C
+ LD (DE), A
+
+ INC C
+ INC E
+
+ LD A, C
+ LD (DE), A
- Display_Objects.next:
- LD A, L
- AND $f8
- ADD $08
- LD L, A
- CP $80
- JR NZ, =Display_Objects.loop
Display_Objects.End:
RET
+ Display_Objects.Nothing:
+ LD A, D
+ CALL =Load_Block
+ CALL =Display_Prepared_Block
+ RET
+
+Load_Objects:
+ CALL =Display_Object
+ CALL =Display_Object
+ CALL =Display_Object
+ CALL =Display_Object
+ CALL =Display_Object
+ CALL =Display_Object
+ CALL =Display_Object
+ CALL =Display_Object
+ CALL =Display_Object
+ CALL =Display_Object
+ CALL =Display_Object
+ CALL =Display_Object
+ CALL =Display_Object
+ CALL =Display_Object
+ CALL =Display_Object
+ CALL =Display_Object
+ RET
+
Object_Interactions_Check:
LD A, $mem_map_loading_flags
BIT 1, A
@@ -166,8 +194,21 @@ Object_Interactions_Check:
LD A, (HL+)
LD E, A
+ PUSH BC
+
+ ; So we have HL set to the object pointer
+ LD A, L
+ AND $f8
+ LD L, A
+
+ ; This is confusing but this thing is actually CALL DE
+ LD BC, =Object_Interactions_Check.interaction_end
+ PUSH BC
PUSH DE
RET
+ Object_Interactions_Check.interaction_end:
+
+ POP BC
Object_Interactions_Check.next:
LD A, L