diff options
author | Astatin <[email protected]> | 2024-09-10 16:10:59 +0900 |
---|---|---|
committer | Astatin <astatin@redacted> | 2024-09-10 16:10:59 +0900 |
commit | c3d302cd8332d55bb477b5e93ea0f6027d26c632 (patch) | |
tree | 2f050fc21968051e95b624c1dff5c63533bf395f /map/objects.gbasm | |
parent | 8a69fd747d22206afe4ea31a743e58070699b3d9 (diff) |
Optimize object displays and preload map scrolling to stay in VBlank
Diffstat (limited to 'map/objects.gbasm')
-rw-r--r-- | map/objects.gbasm | 173 |
1 files changed, 107 insertions, 66 deletions
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 |