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 | |
parent | fa37dcacf1ff0de66f5c4eed7b89be6006d6d77b (diff) |
Read action buttons and set it in the entity direction highest nibble
-rw-r--r-- | bunny.gbasm | 313 | ||||
-rw-r--r-- | buttons.gbasm | 24 | ||||
-rw-r--r-- | definitions.gbasm | 3 | ||||
-rw-r--r-- | entities.gbasm | 600 | ||||
-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 | ||||
-rw-r--r-- | main.gbasm | 23 |
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 + + @@ -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" |