aboutsummaryrefslogtreecommitdiff
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
parentfa37dcacf1ff0de66f5c4eed7b89be6006d6d77b (diff)
Read action buttons and set it in the entity direction highest nibble
-rw-r--r--bunny.gbasm313
-rw-r--r--buttons.gbasm24
-rw-r--r--definitions.gbasm3
-rw-r--r--entities.gbasm600
-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
-rw-r--r--main.gbasm23
11 files changed, 866 insertions, 923 deletions
diff --git a/bunny.gbasm b/bunny.gbasm
deleted file mode 100644
index d19b161..0000000
--- a/bunny.gbasm
+++ /dev/null
@@ -1,313 +0,0 @@
-Initialize_Bunny:
- 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
-
- 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
-
- 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
-
- 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
-
- 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
-
- 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
-
- 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
-
- 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
-
- 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
-
-
-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
-
-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_collision
-
- LD A, $mem_button_direction
- CP $00
- JP Z, =Move_Bunny.end
- SET 3, A
- 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
-
- PUSH AF
- PUSH HL
- LD HL, $9ba0
- CALL =Print_8bit
- POP HL
-
- CALL =Carve_Entity_Collision_Map
- POP AF
- 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/buttons.gbasm b/buttons.gbasm
index b5e94ff..fd17f71 100644
--- a/buttons.gbasm
+++ b/buttons.gbasm
@@ -5,6 +5,14 @@ Pad_Button_Check:
LD A, $20
LD $reg_joypad, A
LD A, $reg_joypad
+ LD A, $reg_joypad
+ LD A, $reg_joypad
+ LD A, $reg_joypad
+ LD A, $reg_joypad
+ LD A, $reg_joypad
+ LD A, $reg_joypad
+ LD A, $reg_joypad
+ LD A, $reg_joypad
LD C, A
LD A, $00
@@ -29,8 +37,22 @@ Pad_Button_Check:
LD A, $enum_direction_down
Pad_Button_Check.End:
+ LD $mem_button_direction, A
- LD $mem_button_direction, A
+ LD A, $10
+ LD $reg_joypad, A
+ LD A, $reg_joypad
+ LD A, $reg_joypad
+ LD A, $reg_joypad
+ LD A, $reg_joypad
+ LD A, $reg_joypad
+ LD A, $reg_joypad
+ LD A, $reg_joypad
+ LD A, $reg_joypad
+ LD A, $reg_joypad
+ XOR $0f
+ AND $0f
+ LD $mem_button_action, A
POP BC
POP AF
diff --git a/definitions.gbasm b/definitions.gbasm
index d44be40..ac77344 100644
--- a/definitions.gbasm
+++ b/definitions.gbasm
@@ -14,6 +14,7 @@
.DEFINE intial_duplication_probablity $01
.DEFINE mem_button_direction ($c002)
+.DEFINE mem_button_action ($c003)
.DEFINE mem_moving_animation_step ($c004)
.DEFINE mem_bunny_sprite ($c980)
.DEFINE mem_bunny_x ($c981)
@@ -75,7 +76,7 @@
; sprite: u8,
; x: u8,
; y: u8,
-; direction: u8 (bit 3 = is_moving, bit 2-0: direction),
+; direction: u8 (animation = bit 7-4, bit 3 = is_moving, bit 2-0: direction),
; ai_function_pointer: 16
; _padding: u16
; }
diff --git a/entities.gbasm b/entities.gbasm
deleted file mode 100644
index 28df2d8..0000000
--- a/entities.gbasm
+++ /dev/null
@@ -1,600 +0,0 @@
-Prepare_Entities:
- LD A, $00
- LD $tmp_var_1, A
- LD HL, $mem_entities_list
- CALL =Prepare_Entity
- CALL =Prepare_Entity
- CALL =Prepare_Entity
- CALL =Prepare_Entity
- CALL =Prepare_Entity
- CALL =Prepare_Entity
- CALL =Prepare_Entity
- CALL =Prepare_Entity
- CALL =Prepare_Entity
- CALL =Prepare_Entity
- CALL =Prepare_Entity
- CALL =Prepare_Entity
- CALL =Prepare_Entity
- CALL =Prepare_Entity
- CALL =Prepare_Entity
- CALL =Prepare_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
-
-Prepare_Entity:
- LD A, (HL+)
- LD E, A
-
- CP $00
- JP Z, =Prepare_Entity.skip
-
- LD A, (HL+)
- ADD $80
- LD D, A
- LD A, $mem_viewport_x
- LD B, A
- SUB $82
- CP D
- JP NC, =Prepare_Entity.skip
- ADD $0e
- CP D
- JP C, =Prepare_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, =Prepare_Entity.skip
- ADD $0d
- CP D
- JP C, =Prepare_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, =Prepare_Entity.Viewport_offset_end
- AND $07
- CP $enum_direction_down
- JR Z, =Prepare_Entity.Viewport_offset_down
- CP $enum_direction_right
- JR Z, =Prepare_Entity.Viewport_offset_right
- CP $enum_direction_up
- JR Z, =Prepare_Entity.Viewport_offset_up
-
- Prepare_Entity.Viewport_offset_left:
- LD A, $reg_viewport_x
- SUB $08
- AND $0f
- XOR $ff
- ADD $12
- ADD B
-
- LD B, A
- JR =Prepare_Entity.Viewport_offset_end
-
- Prepare_Entity.Viewport_offset_right:
- LD A, $reg_viewport_x
- SUB $08
- AND $0f
- XOR $ff
- ADD B
-
- LD B, A
-
- JR =Prepare_Entity.Viewport_offset_end
-
- Prepare_Entity.Viewport_offset_up:
- LD A, $reg_viewport_y
- SUB $08
- AND $0f
- XOR $ff
- ADD $12
- ADD C
-
- LD C, A
-
- JR =Prepare_Entity.Viewport_offset_end
-
- Prepare_Entity.Viewport_offset_down:
- LD A, $reg_viewport_y
- SUB $08
- AND $0f
- XOR $ff
- ADD C
-
- LD C, A
-
- Prepare_Entity.Viewport_offset_end:
-
- LD A, (HL+)
- BIT 3, A
- LD D, A
- LD A, $00
- JR Z, =Prepare_Entity.Not_Moving_Animation
-
- LD A, D
- AND $07
-
- CP $enum_direction_down
- JR Z, =Prepare_Entity.moving_offset_down
- CP $enum_direction_right
- JR Z, =Prepare_Entity.moving_offset_right
- CP $enum_direction_up
- JR Z, =Prepare_Entity.moving_offset_up
-
- Prepare_Entity.moving_offset_left:
- LD A, $mem_moving_animation_step
- XOR $ff
- ADD B
- LD B, A
-
- JR =Prepare_Entity.moving_offset_end
-
- Prepare_Entity.moving_offset_right:
- LD A, $mem_moving_animation_step
- INC A
- ADD B
- LD B, A
-
- JR =Prepare_Entity.moving_offset_end
-
- Prepare_Entity.moving_offset_up:
- LD A, $mem_moving_animation_step
- XOR $ff
- ADD C
- LD C, A
-
- JR =Prepare_Entity.moving_offset_end
-
- Prepare_Entity.moving_offset_down:
- LD A, $mem_moving_animation_step
- INC A
- ADD C
- LD C, A
-
- Prepare_Entity.moving_offset_end:
-
-
- LD A, $mem_moving_animation_step
- Prepare_Entity.Not_Moving_Animation:
-
- SUB $08
- BIT 7, A
- JR Z, =Prepare_Entity.Hop_ABS1_end
-
- ; Adding hop animation to Y
- XOR $ff
- INC A
- Prepare_Entity.Hop_ABS1_end:
- SUB $04
- BIT 7, A
- JR Z, =Prepare_Entity.Hop_ABS2_end
- XOR $ff
- INC A
- Prepare_Entity.Hop_ABS2_end:
- ADD C
-
- LD C, A
-
- LD A, D
- AND $07
-
- CP $enum_direction_left
- JR Z, =Prepare_Entity.Left_Direction_sprite
- CP $enum_direction_right
- JR Z, =Prepare_Entity.Right_Direction_sprite
- CP $enum_direction_up
- JR Z, =Prepare_Entity.Up_Direction_sprite
- JP =Prepare_Entity.Down_Direction_sprite
-
- Prepare_Entity.Left_Direction_sprite:
- LD D, $00
- JP =Prepare_Entity.Write_OBJ
-
- Prepare_Entity.Right_Direction_sprite:
- LD A, $02
- ADD E
- LD E, A
- LD D, $20
- JP =Prepare_Entity.Write_OBJ
-
- Prepare_Entity.Up_Direction_sprite:
- LD A, $04
- ADD E
- LD E, A
- LD D, $00
- JP =Prepare_Entity.Write_OBJ
-
- Prepare_Entity.Down_Direction_sprite:
- LD A, $08
- ADD E
- LD E, A
- LD D, $00
- JP =Prepare_Entity.Write_OBJ
-
- Prepare_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
-
- Prepare_Entity.skip:
- LD A, L
- AND $f8
- ADD $08
- LD L, A
- RET
-
-Entities_Behaviours:
- CALL =Reset_Entities_Collision_Map
-
- LD HL, $mem_entities_list
- CALL =Entity_Behaviour
- CALL =Entity_Behaviour
- CALL =Entity_Behaviour
- CALL =Entity_Behaviour
- CALL =Entity_Behaviour
- CALL =Entity_Behaviour
- CALL =Entity_Behaviour
- CALL =Entity_Behaviour
- CALL =Entity_Behaviour
- CALL =Entity_Behaviour
- CALL =Entity_Behaviour
- CALL =Entity_Behaviour
- CALL =Entity_Behaviour
- CALL =Entity_Behaviour
- CALL =Entity_Behaviour
- CALL =Entity_Behaviour
- RET
-
-Entity_Behaviour:
- LD A, (HL+)
- CP $00
- JR Z, =Entity_Behaviour.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_Behaviour.interaction_end
- PUSH BC
- PUSH DE
- RET
- Entity_Behaviour.interaction_end:
-
- POP HL
-
- Entity_Behaviour.skip:
- LD A, L
- AND $f8
- ADD $08
- LD L, A
- RET
-
-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
- 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
-
-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
-
-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/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
+
+
diff --git a/main.gbasm b/main.gbasm
index 0b4493d..1a08035 100644
--- a/main.gbasm
+++ b/main.gbasm
@@ -6,7 +6,7 @@ Entrypoint:
New_Dungeon:
LD SP, $fffe
CALL =Dungeon_Generation
- CALL =Initialize_Bunny
+ CALL =Initialize_Entities
CALL =Initialize_Objects
CALL =Load_Tile
CALL =Load_Map
@@ -25,23 +25,30 @@ VBLANK_Entrypoint:
CALL =Display_Prepared_Block
CALL =Display_Object
CALL $OAM_DMA_Transfer_routine
+ LD HL, $9800
+ LD A, $mem_bunny_direction
+ CALL =Print_8bit
CALL =Object_Interactions_Check
CALL =Pad_Button_Check
- CALL =Entities_Behaviours
+ CALL =Entities_Actions
CALL =Prepare_Scrolling_Map
- CALL =Prepare_Entities
+ CALL =Display_Entities
RET
.INCLUDE "tiles.gbasm"
+.INCLUDE "rng.gbasm"
+.INCLUDE "utils.gbasm"
+.INCLUDE "buttons.gbasm"
.INCLUDE "map/loading.gbasm"
.INCLUDE "map/generation.gbasm"
.INCLUDE "map/objects.gbasm"
-.INCLUDE "bunny.gbasm"
-.INCLUDE "buttons.gbasm"
-.INCLUDE "rng.gbasm"
-.INCLUDE "utils.gbasm"
-.INCLUDE "entities.gbasm"
+.INCLUDE "entity/init.gbasm"
+.INCLUDE "entity/bunny.gbasm"
+.INCLUDE "entity/actions.gbasm"
+.INCLUDE "entity/collisions.gbasm"
+.INCLUDE "entity/display.gbasm"
+.INCLUDE "entity/utils.gbasm"
.INCLUDE "tileset.gbasm"