diff options
author | Astatin <[email protected]> | 2024-09-19 18:56:32 +0900 |
---|---|---|
committer | Astatin <astatin@redacted> | 2024-09-19 18:56:32 +0900 |
commit | ec1f79b44203735f581c7f85b6c23216aaf587a6 (patch) | |
tree | 0ae669440b2dce7f2e23cfadebb3dc0ab42efcba /entity | |
parent | fa37dcacf1ff0de66f5c4eed7b89be6006d6d77b (diff) |
Read action buttons and set it in the entity direction highest nibble
Diffstat (limited to 'entity')
-rw-r--r-- | entity/actions.gbasm | 148 | ||||
-rw-r--r-- | entity/bunny.gbasm | 126 | ||||
-rw-r--r-- | entity/collisions.gbasm | 120 | ||||
-rw-r--r-- | entity/display.gbasm | 284 | ||||
-rw-r--r-- | entity/init.gbasm | 100 | ||||
-rw-r--r-- | entity/utils.gbasm | 48 |
6 files changed, 826 insertions, 0 deletions
diff --git a/entity/actions.gbasm b/entity/actions.gbasm new file mode 100644 index 0000000..c39781e --- /dev/null +++ b/entity/actions.gbasm @@ -0,0 +1,148 @@ +Entities_Actions: + CALL =Reset_Entities_Collision_Map + + LD HL, $mem_entities_list + CALL =Entity_Action + CALL =Entity_Action + CALL =Entity_Action + CALL =Entity_Action + CALL =Entity_Action + CALL =Entity_Action + CALL =Entity_Action + CALL =Entity_Action + CALL =Entity_Action + CALL =Entity_Action + CALL =Entity_Action + CALL =Entity_Action + CALL =Entity_Action + CALL =Entity_Action + CALL =Entity_Action + CALL =Entity_Action + RET + +Entity_Action: + LD A, (HL+) + CP $00 + JR Z, =Entity_Action.skip + + INC HL + INC HL + INC HL + + LD A, (HL+) + LD D, A + LD A, (HL+) + LD E, A + + PUSH HL + + LD A, L + AND $f8 + LD L, A + + ; This is confusing but this thing is actually CALL DE + LD BC, =Entity_Action.interaction_end + PUSH BC + PUSH DE + RET + Entity_Action.interaction_end: + + POP HL + + Entity_Action.skip: + LD A, L + AND $f8 + ADD $08 + LD L, A + RET + +Fox_AI: + PUSH HL + + INC HL + INC HL + INC HL + + LD A, $mem_map_loading_flags + BIT 1, A + JR Z, =Fox_AI.Update_Position.end + + LD A, (HL) + BIT 3, A + JR Z, =Fox_AI.Update_Position.end + + RES 3, A + DEC A + + LD C, A + AND $01 + SLA A + AND $02 + DEC A + LD B, A + + LD A, L + AND $f8 + INC A + LD L, A + + BIT 1, C + JR NZ, =Fox_AI.vertical_tile_move + + Fox_AI.horizontal_tile_move: + LD A, (HL) + ADD B + LD (HL), A + JP =Fox_AI.Update_Position.end + + Fox_AI.vertical_tile_move: + INC HL + LD A, (HL) + ADD B + LD (HL), A + + Fox_AI.Update_Position.end: + + LD A, L + AND $f8 + ADD $03 + LD L, A + + LD A, $mem_moving_animation_step + CP $01 + JR NZ, =Fox_AI.end + + LD A, $mem_bunny_direction + BIT 3, A + JR Z, =Fox_AI.end + + CALL =RNG_Step + AND $08 + LD B, A + + LD A, $04 + CALL =RNG_Bound + INC A + OR $08 + LD B, A + + 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 + + RES 3, B + + Fox_AI.change_direction: + LD (HL), B + + Fox_AI.end: + + POP HL + RET + + diff --git a/entity/bunny.gbasm b/entity/bunny.gbasm new file mode 100644 index 0000000..81e19a6 --- /dev/null +++ b/entity/bunny.gbasm @@ -0,0 +1,126 @@ +Move_Bunny: + PUSH HL + LD C, $00 ; (bit 0 = has_scrolled, bit 1 = has ended movement) + LD A, $mem_bunny_direction + BIT 3, A + JR NZ, =Move_Bunny.check_direction + + LD B, $00 + Move_Bunny.check_start_action: + LD A, $mem_button_action + BIT 0, A + JR Z, =Move_Bunny.check_start_action.end + LD B, $10 + Move_Bunny.check_start_action.end: + LD A, $mem_bunny_direction + AND $0f + OR B + LD $mem_bunny_direction, A + + LD A, $mem_bunny_direction + AND $f0 + LD B, A + LD A, $mem_button_direction + CP $00 + JP Z, =Move_Bunny.end + SET 3, A + OR B + LD $mem_bunny_direction, A + + Move_Bunny.check_collision: + LD A, $mem_moving_animation_step + CP $00 + JR NZ, =Move_Bunny.check_collision.end + + ; THIS ASSUMES THAT THE BUNNY IS ALWAYS THE FIRST ENTITY IN THE LIST + LD HL, $mem_entities_list + LD A, $mem_bunny_direction + + PUSH BC + CALL =Get_Position_After_Move + LD A, C + CALL =Is_Collisionable + CALL =Carve_Entity_Collision_Map + POP BC + CP $00 + JR Z, =Move_Bunny.check_collision.end + + Move_Bunny.check_collision.collision: + LD A, $mem_bunny_direction + RES 3, A + LD $mem_bunny_direction, A + JP =Move_Bunny.end + + Move_Bunny.check_collision.end: + + Move_Bunny.check_direction: + LD A, $mem_bunny_direction + + DEC A + LD B, $01 ; Direction of the movement (+1) + BIT 0, A + JR NZ, =Move_Bunny.check_direction_end + LD B, $FF ; Direction of the movement (-1) + + Move_Bunny.check_direction_end: + + BIT 1, A + JR NZ, =Move_Bunny.vertical_viewport_move + + Move_Bunny.horizontal_viewport_move: + SET 0, C + LD A, $reg_viewport_x + ADD B + LD $reg_viewport_x, A + JP =Move_Bunny.check_end_of_movement + + Move_Bunny.vertical_viewport_move: + SET 0, C + LD A, $reg_viewport_y + ADD B + LD $reg_viewport_y, A + + Move_Bunny.check_end_of_movement: + LD A, $mem_moving_animation_step + INC A + AND $0f + LD $mem_moving_animation_step, A + JR NZ, =Move_Bunny.end + SET 1, C + LD A, $mem_bunny_direction + RES 3, A + LD $mem_bunny_direction, A + AND $07 + DEC A + + BIT 1, A + JR NZ, =Move_Bunny.vertical_tile_move + + Move_Bunny.horizontal_tile_move: + BIT 0, C + JR Z, =Move_Bunny.horizontal_tile_move.move_viewport_end + LD A, $mem_viewport_x + ADD B + LD $mem_viewport_x, A + Move_Bunny.horizontal_tile_move.move_viewport_end: + LD A, $mem_bunny_x + ADD B + LD $mem_bunny_x, A + JP =Move_Bunny.end + + Move_Bunny.vertical_tile_move: + BIT 0, C + JR Z, =Move_Bunny.vertical_tile_move.move_viewport_end + LD A, $mem_viewport_y + ADD B + LD $mem_viewport_y, A + Move_Bunny.vertical_tile_move.move_viewport_end: + LD A, $mem_bunny_y + ADD B + LD $mem_bunny_y, A + + Move_Bunny.end: + LD A, C + LD $mem_map_loading_flags, A + POP HL + RET diff --git a/entity/collisions.gbasm b/entity/collisions.gbasm new file mode 100644 index 0000000..186af65 --- /dev/null +++ b/entity/collisions.gbasm @@ -0,0 +1,120 @@ +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 + +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 diff --git a/entity/display.gbasm b/entity/display.gbasm new file mode 100644 index 0000000..2a54e76 --- /dev/null +++ b/entity/display.gbasm @@ -0,0 +1,284 @@ +Display_Entities: + LD A, $00 + LD $tmp_var_1, A + LD HL, $mem_entities_list + CALL =Display_Entity + CALL =Display_Entity + CALL =Display_Entity + CALL =Display_Entity + CALL =Display_Entity + CALL =Display_Entity + CALL =Display_Entity + CALL =Display_Entity + CALL =Display_Entity + CALL =Display_Entity + CALL =Display_Entity + CALL =Display_Entity + CALL =Display_Entity + CALL =Display_Entity + CALL =Display_Entity + CALL =Display_Entity + LD BC, $00a0 + LD HL, $mem_oam_buffer + + LD A, $tmp_var_1 + ADD L + LD L, A + + LD A, $tmp_var_1 + XOR $ff + INC A + ADD C + LD C, A + + CALL =bzero + + RET + +Display_Entity: + LD A, (HL+) + LD E, A + + CP $00 + JP Z, =Display_Entity.skip + + LD A, (HL+) + ADD $80 + LD D, A + LD A, $mem_viewport_x + LD B, A + SUB $82 + CP D + JP NC, =Display_Entity.skip + ADD $0e + CP D + JP C, =Display_Entity.skip + LD A, D + SUB $80 + SUB B + AND $0f + SWAP A + LD B, A + + + LD A, (HL+) + ADD $80 + LD D, A + LD A, $mem_viewport_y + LD C, A + SUB $82 + CP D + JP NC, =Display_Entity.skip + ADD $0d + CP D + JP C, =Display_Entity.skip + LD A, D + SUB $80 + SUB C + AND $0f + SWAP A + ADD $02 + LD C, A + + LD A, $mem_bunny_direction + BIT 3, A + JR Z, =Display_Entity.Viewport_offset_end + AND $07 + CP $enum_direction_down + JR Z, =Display_Entity.Viewport_offset_down + CP $enum_direction_right + JR Z, =Display_Entity.Viewport_offset_right + CP $enum_direction_up + JR Z, =Display_Entity.Viewport_offset_up + + Display_Entity.Viewport_offset_left: + LD A, $reg_viewport_x + SUB $08 + AND $0f + XOR $ff + ADD $12 + ADD B + + LD B, A + JR =Display_Entity.Viewport_offset_end + + Display_Entity.Viewport_offset_right: + LD A, $reg_viewport_x + SUB $08 + AND $0f + XOR $ff + ADD B + + LD B, A + + JR =Display_Entity.Viewport_offset_end + + Display_Entity.Viewport_offset_up: + LD A, $reg_viewport_y + SUB $08 + AND $0f + XOR $ff + ADD $12 + ADD C + + LD C, A + + JR =Display_Entity.Viewport_offset_end + + Display_Entity.Viewport_offset_down: + LD A, $reg_viewport_y + SUB $08 + AND $0f + XOR $ff + ADD C + + LD C, A + + Display_Entity.Viewport_offset_end: + + LD A, (HL+) + BIT 3, A + LD D, A + LD A, $00 + JR Z, =Display_Entity.Not_Moving_Animation + + LD A, D + AND $07 + + CP $enum_direction_down + JR Z, =Display_Entity.moving_offset_down + CP $enum_direction_right + JR Z, =Display_Entity.moving_offset_right + CP $enum_direction_up + JR Z, =Display_Entity.moving_offset_up + + Display_Entity.moving_offset_left: + LD A, $mem_moving_animation_step + XOR $ff + ADD B + LD B, A + + JR =Display_Entity.moving_offset_end + + Display_Entity.moving_offset_right: + LD A, $mem_moving_animation_step + INC A + ADD B + LD B, A + + JR =Display_Entity.moving_offset_end + + Display_Entity.moving_offset_up: + LD A, $mem_moving_animation_step + XOR $ff + ADD C + LD C, A + + JR =Display_Entity.moving_offset_end + + Display_Entity.moving_offset_down: + LD A, $mem_moving_animation_step + INC A + ADD C + LD C, A + + Display_Entity.moving_offset_end: + + + LD A, $mem_moving_animation_step + Display_Entity.Not_Moving_Animation: + + SUB $08 + BIT 7, A + JR Z, =Display_Entity.Hop_ABS1_end + + ; Adding hop animation to Y + XOR $ff + INC A + Display_Entity.Hop_ABS1_end: + SUB $04 + BIT 7, A + JR Z, =Display_Entity.Hop_ABS2_end + XOR $ff + INC A + Display_Entity.Hop_ABS2_end: + ADD C + LD C, A + + LD A, D + AND $07 + + CP $enum_direction_left + JR Z, =Display_Entity.Left_Direction_sprite + CP $enum_direction_right + JR Z, =Display_Entity.Right_Direction_sprite + CP $enum_direction_up + JR Z, =Display_Entity.Up_Direction_sprite + JP =Display_Entity.Down_Direction_sprite + + Display_Entity.Left_Direction_sprite: + LD D, $00 + JP =Display_Entity.Write_OBJ + + Display_Entity.Right_Direction_sprite: + LD A, $02 + ADD E + LD E, A + LD D, $20 + JP =Display_Entity.Write_OBJ + + Display_Entity.Up_Direction_sprite: + LD A, $04 + ADD E + LD E, A + LD D, $00 + JP =Display_Entity.Write_OBJ + + Display_Entity.Down_Direction_sprite: + LD A, $08 + ADD E + LD E, A + LD D, $00 + JP =Display_Entity.Write_OBJ + + Display_Entity.Write_OBJ: + PUSH HL + ; First OBJ (left) + LD HL, $mem_oam_buffer + LD A, $tmp_var_1 + LD L, A + LD A, C + LD (HL+), A + LD A, B + LD (HL+), A + LD A, E + INC A + LD (HL+), A + LD A, D + LD (HL+), A + + ; Second OBJ + LD A, B + ADD $08 + LD B, A + + LD A, C + LD (HL+), A + LD A, B + LD (HL+), A + LD A, E + XOR $02 + INC A + LD (HL+), A + LD A, D + LD (HL+), A + LD A, L + LD $tmp_var_1, A + POP HL + + Display_Entity.skip: + LD A, L + AND $f8 + ADD $08 + LD L, A + RET diff --git a/entity/init.gbasm b/entity/init.gbasm new file mode 100644 index 0000000..3c007b9 --- /dev/null +++ b/entity/init.gbasm @@ -0,0 +1,100 @@ +Initialize_Entities: + LD HL, $mem_entities_list + LD A, $01 + LD (HL+), A + + LD A, $mem_number_of_rooms + CALL =RNG_Bound + SLA A + SLA A + ADD $80 + LD C, A + + LD B, $c8 + + LD A, (BC) + LD D, A + INC BC + LD A, (BC) + INC A + CALL =RNG_Bound + ADD D + + LD (HL+), A + + INC BC + + LD A, (BC) + LD D, A + INC BC + LD A, (BC) + INC A + CALL =RNG_Bound + ADD D + LD (HL+), A + INC HL + LD BC, =Move_Bunny + LD A, B + LD (HL+), A + LD A, C + LD (HL+), A + INC HL + INC HL + + CALL =Initialize_Fox + CALL =Initialize_Fox + CALL =Initialize_Fox + CALL =Initialize_Fox + CALL =Initialize_Fox + CALL =Initialize_Fox + CALL =Initialize_Fox + CALL =Initialize_Fox + CALL =Initialize_Fox + CALL =Initialize_Fox + CALL =Initialize_Fox + CALL =Initialize_Fox + CALL =Initialize_Fox + CALL =Initialize_Fox + CALL =Initialize_Fox + +Fix_Bunny_screen: + LD A, $mem_bunny_x + SUB $05 + LD $mem_viewport_x, A + + LD A, $mem_bunny_y + SUB $04 + LD $mem_viewport_y, A + + LD A, $mem_viewport_x + SWAP A + AND $f0 + OR $08 + LD $reg_viewport_x, A + + LD A, $mem_viewport_y + SWAP A + AND $f0 + OR $08 + LD $reg_viewport_y, A + + RET + +Initialize_Fox: + LD A, $0d + LD (HL+), A + LD A, $mem_bunny_x + LD (HL+), A + LD A, $mem_bunny_y + LD (HL+), A + LD A, $03 + LD (HL+), A + LD BC, =Fox_AI + LD A, B + LD (HL+), A + LD A, C + LD (HL+), A + INC HL + INC HL + + RET diff --git a/entity/utils.gbasm b/entity/utils.gbasm new file mode 100644 index 0000000..23abb3a --- /dev/null +++ b/entity/utils.gbasm @@ -0,0 +1,48 @@ +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 + AND $f8 + LD L, A + + INC HL + + LD A, (HL+) + LD C, A + LD A, (HL+) + LD B, A + + POP AF + BIT 3, A + JR Z, =Get_Position_After_Move.direction_end + + PUSH BC + + DEC A + LD B, A + + SLA A + AND $02 + DEC A + + BIT 1, B + JR NZ, =Get_Position_After_Move.vertical + + Get_Position_After_Move.horizontal: + POP BC + ADD C + LD C, A + JR =Get_Position_After_Move.direction_end + + Get_Position_After_Move.vertical: + POP BC + ADD B + LD B, A + + Get_Position_After_Move.direction_end: + + POP HL + RET + + |