aboutsummaryrefslogtreecommitdiff
path: root/entity
diff options
context:
space:
mode:
authorAstatin <[email protected]>2024-09-19 18:56:32 +0900
committerAstatin <astatin@redacted>2024-09-19 18:56:32 +0900
commitec1f79b44203735f581c7f85b6c23216aaf587a6 (patch)
tree0ae669440b2dce7f2e23cfadebb3dc0ab42efcba /entity
parentfa37dcacf1ff0de66f5c4eed7b89be6006d6d77b (diff)
Read action buttons and set it in the entity direction highest nibble
Diffstat (limited to 'entity')
-rw-r--r--entity/actions.gbasm148
-rw-r--r--entity/bunny.gbasm126
-rw-r--r--entity/collisions.gbasm120
-rw-r--r--entity/display.gbasm284
-rw-r--r--entity/init.gbasm100
-rw-r--r--entity/utils.gbasm48
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
+
+