diff options
Diffstat (limited to 'entities.gbasm')
-rw-r--r-- | entities.gbasm | 155 |
1 files changed, 141 insertions, 14 deletions
diff --git a/entities.gbasm b/entities.gbasm index 3c279be..28df2d8 100644 --- a/entities.gbasm +++ b/entities.gbasm @@ -1,7 +1,7 @@ Prepare_Entities: LD A, $00 LD $tmp_var_1, A - LD HL, $mem_entites_list + LD HL, $mem_entities_list CALL =Prepare_Entity CALL =Prepare_Entity CALL =Prepare_Entity @@ -39,7 +39,6 @@ Prepare_Entity: LD A, (HL+) LD E, A - CP $00 JP Z, =Prepare_Entity.skip @@ -285,7 +284,9 @@ Prepare_Entity: RET Entities_Behaviours: - LD HL, $mem_entites_list + CALL =Reset_Entities_Collision_Map + + LD HL, $mem_entities_list CALL =Entity_Behaviour CALL =Entity_Behaviour CALL =Entity_Behaviour @@ -340,9 +341,49 @@ Entity_Behaviour: LD L, A RET -Entity_collision: ; entity (whatever alignement) in HL, direction to test in A, Result in A - PUSH HL +Carve_Entity_Collision_Map: ; X in C, Y in B PUSH BC + PUSH HL + PUSH AF + + LD A, C + AND $e0 + JR NZ, =Carve_Entity_Collision_Map.end + + LD A, B + AND $e0 + JR NZ, =Carve_Entity_Collision_Map.end + + LD A, C + + LD H, $00 + CP $10 + RL B + AND $0f + CP $08 + RL B + AND $07 + LD L, A + + LD A, B + LD BC, $mem_entities_collisions + OR C + LD C, A + LD A, (BC) + + OR (HL) + LD (BC), A + + Carve_Entity_Collision_Map.end: + + POP AF + POP HL + POP BC + RET + + +Get_Position_After_Move: ; entity (whatever alignement) in HL, direction to test in A, X Result in C, Y result in B + PUSH HL PUSH AF LD A, L @@ -357,6 +398,9 @@ Entity_collision: ; entity (whatever alignement) in HL, direction to test in A, LD B, A POP AF + BIT 3, A + JR Z, =Get_Position_After_Move.direction_end + PUSH BC DEC A @@ -367,24 +411,21 @@ Entity_collision: ; entity (whatever alignement) in HL, direction to test in A, DEC A BIT 1, B - JR NZ, =Entity_collision.vertical + JR NZ, =Get_Position_After_Move.vertical - Entity_collision.horizontal: + Get_Position_After_Move.horizontal: POP BC ADD C LD C, A - JR =Entity_collision.direction_end + JR =Get_Position_After_Move.direction_end - Entity_collision.vertical: + Get_Position_After_Move.vertical: POP BC ADD B LD B, A - Entity_collision.direction_end: - LD A, C - CALL =Is_Solid + Get_Position_After_Move.direction_end: - POP BC POP HL RET @@ -458,7 +499,12 @@ Fox_AI: OR $08 LD B, A - CALL =Entity_collision + PUSH BC + CALL =Get_Position_After_Move + LD A, C + CALL =Is_Collisionable + CALL =Carve_Entity_Collision_Map + POP BC CP $00 JR Z, =Fox_AI.change_direction @@ -471,3 +517,84 @@ Fox_AI: POP HL RET + +Is_Collisionable: ; X in A, Y in B, Result A + PUSH BC + PUSH HL + + CP $20 + JR NC, =Is_Collisionable.Solid + + LD C, A + LD A, B + CP $20 + JR NC, =Is_Collisionable.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, $mem_dungeon_map_high + LD A, (BC) + PUSH AF + LD A, C + LD BC, $mem_entities_collisions + OR C + LD C, A + LD A, (BC) + XOR $ff ; 1 in the dungeon map means walkable, 1 in the entity map means unwalkable, we need to invert it. + LD B, A + POP AF + AND B + + AND (HL) + CP $01 + LD A, $00 + RL A + + POP HL + POP BC + RET + + Is_Collisionable.Solid: + LD A, $01 + POP HL + POP BC + + RET + +Reset_Entities_Collision_Map: + LD A, $mem_moving_animation_step + CP $02 + JR NZ, =Reset_Entities_Collision_Map.end + + LD HL, $mem_entities_collisions + LD BC, $0080 + CALL =bzero + + LD HL, $mem_entities_list + Reset_Entities_Collision_Map.loop: + INC L + INC L + INC L + + LD A, (HL) + CALL =Get_Position_After_Move + CALL =Carve_Entity_Collision_Map + + LD A, L + AND $f8 + ADD $08 + LD L, A + CP $00 + JR NZ, =Reset_Entities_Collision_Map.loop + + Reset_Entities_Collision_Map.end: + RET |