diff options
-rw-r--r-- | definitions.gbasm | 2 | ||||
-rw-r--r-- | enemiesattacks.gbasm | 2 | ||||
-rw-r--r-- | enemiesattacks/basic.gbasm | 2 | ||||
-rw-r--r-- | enemiesattacks/freeze.gbasm | 17 | ||||
-rw-r--r-- | enemiesattacks/laser.gbasm | 2 | ||||
-rw-r--r-- | enemiesattacks/walkaway.gbasm | 135 | ||||
-rw-r--r-- | entity/actions.gbasm | 4 | ||||
-rw-r--r-- | entity/bunny.gbasm | 8 | ||||
-rw-r--r-- | entity/fox.gbasm | 4 | ||||
-rw-r--r-- | entity/frog.gbasm | 2 | ||||
-rw-r--r-- | entity/init.gbasm | 2 | ||||
-rw-r--r-- | entity/list.gbasm | 38 | ||||
-rw-r--r-- | entity/penguin.gbasm | 146 | ||||
-rw-r--r-- | main.gbasm | 2 |
14 files changed, 359 insertions, 7 deletions
diff --git a/definitions.gbasm b/definitions.gbasm index 90f6ed9..045a01b 100644 --- a/definitions.gbasm +++ b/definitions.gbasm @@ -104,6 +104,8 @@ .DEFINE mem_animation_wait_frames ($c02e) +.DEFINE mem_bunny_status_clear_turn_counter ($c02f) + .DEFINE mem_next_free_head_lower_bytes ($c6ff) .DEFINE mem_dungeon_generation_heads $c700 ; Takes the memory from c700 to c717 diff --git a/enemiesattacks.gbasm b/enemiesattacks.gbasm index 1ab8094..4434c1d 100644 --- a/enemiesattacks.gbasm +++ b/enemiesattacks.gbasm @@ -44,5 +44,7 @@ Check_player_next_to: ; BC = XY of the enemy. D is unchanged. Direction to face RET .INCLUDE "enemiesattacks/walk.gbasm" +.INCLUDE "enemiesattacks/walkaway.gbasm" .INCLUDE "enemiesattacks/basic.gbasm" .INCLUDE "enemiesattacks/laser.gbasm" +.INCLUDE "enemiesattacks/freeze.gbasm" diff --git a/enemiesattacks/basic.gbasm b/enemiesattacks/basic.gbasm index 64805eb..ed2a633 100644 --- a/enemiesattacks/basic.gbasm +++ b/enemiesattacks/basic.gbasm @@ -1,4 +1,4 @@ -Basic_Attack: ; Direction to face in E. Result in BC (XY), Direction in D +Basic_Enemy_Attack: ; Direction to face in E. Result in BC (XY), Direction in D LD A, E OR $10 LD D, A diff --git a/enemiesattacks/freeze.gbasm b/enemiesattacks/freeze.gbasm new file mode 100644 index 0000000..321e924 --- /dev/null +++ b/enemiesattacks/freeze.gbasm @@ -0,0 +1,17 @@ +Freeze_Enemy_Attack: ; Direction to face in E. Result in BC (XY), Direction in D + LD A, E + OR $10 + LD D, A + + LD A, $01 + LD $mem_bunny_status, A + LD A, $02 + LD $mem_bunny_flags, A + LD A, $mem_bunny_direction + AND $07 + LD $mem_bunny_direction, A + CALL =Fix_Bunny_screen + LD A, $04 + LD $mem_bunny_status_clear_turn_counter, A + + RET diff --git a/enemiesattacks/laser.gbasm b/enemiesattacks/laser.gbasm index b351141..4a0d029 100644 --- a/enemiesattacks/laser.gbasm +++ b/enemiesattacks/laser.gbasm @@ -48,7 +48,7 @@ Laser_sight_check: ; BC = XY of the enemy. D is unchanged. Direction to face in LD E, $enum_direction_up RET -Laser_Attack: ; Direction to face in E. Result in BC (XY), Direction in D +Laser_Enemy_Attack: ; Direction to face in E. Result in BC (XY), Direction in D PUSH DE PUSH BC diff --git a/enemiesattacks/walkaway.gbasm b/enemiesattacks/walkaway.gbasm new file mode 100644 index 0000000..2fc21fe --- /dev/null +++ b/enemiesattacks/walkaway.gbasm @@ -0,0 +1,135 @@ +Walking_Away: ; entity XY in BC, Breaks DE + ; Is Bunny close enough to follow + LD A, $mem_bunny_x + SUB B + .ABS + CP $08 + JR NC, =.Random_walker + + LD A, $mem_bunny_y + SUB C + .ABS + CP $08 + JR NC, =.Random_walker + + JR =.Follow_bunny + + .Random_walker: + CALL =RNG_Step + LD E, $00 + RR A + RR E + SWAP E + AND $03 + INC A + OR E + LD D, A + JP =.Check_Collision + + .Follow_bunny: + LD A, $mem_bunny_predicted_x + LD $tmp_var_1, A + + LD A, $mem_bunny_predicted_y + LD $tmp_var_2, A + + CALL =RNG_Step + AND $02 + LD $tmp_var_3, A + + CP $00 + JR Z, =.skip_invert_axis + + LD A, $mem_bunny_predicted_y + LD $tmp_var_1, A + + LD A, $mem_bunny_predicted_x + LD $tmp_var_2, A + + LD E, B + LD B, C + LD C, E + + .skip_invert_axis: + + ; Choose direction + LD A, B + ADD $80 + LD E, A + LD A, $tmp_var_1 + ADD $80 + CP E + JR Z =.Vertical + JR C =.Go_Left + + .Go_Right: + LD A, $enum_direction_left + JR =.Check_Horizontal_Collision + .Go_Left: + LD A, $enum_direction_right + + .Check_Horizontal_Collision: + LD E, A + DEC E + LD A, $tmp_var_3 + XOR E + INC E + INC A + OR $08 + PUSH BC + CALL =Get_Position_After_Move + CALL =Is_Collisionable + POP BC + CP $00 + LD A, E + JR Z, =.Direction_check_end + + .Vertical: + LD A, C + ADD $80 + LD E, A + LD A, $tmp_var_2 + ADD $80 + CP E + + JR Z =.No_movement + JR C =.Go_Up + .Go_Down: + LD A, $enum_direction_up + JR =.Direction_check_end + .Go_Up: + LD A, $enum_direction_down + + .Direction_check_end: + + DEC A + LD E, A + LD A, $tmp_var_3 + XOR E + INC A + OR $08 + LD D, A + + ; Check collision + + .No_movement: + LD A, $tmp_var_3 + CP $00 + JR Z, =.skip_invert_axis2 + LD E, B + LD B, C + LD C, E + .skip_invert_axis2: + + .Check_Collision: + PUSH BC + LD A, D + CALL =Get_Position_After_Move + CALL =Is_Collisionable + CALL =Carve_Entity_Collision_Map + POP BC + CP $00 + RET Z + RES 3, D + + RET diff --git a/entity/actions.gbasm b/entity/actions.gbasm index 4de9f21..d6977e9 100644 --- a/entity/actions.gbasm +++ b/entity/actions.gbasm @@ -115,6 +115,10 @@ Turn_Jump_table: JP =Frog_Turn NOP + ; 04 + JP =Penguin_Turn + NOP + Interaction_Jump_table: ; 00 RET diff --git a/entity/bunny.gbasm b/entity/bunny.gbasm index 3804b6a..40cd047 100644 --- a/entity/bunny.gbasm +++ b/entity/bunny.gbasm @@ -16,6 +16,13 @@ Move_Bunny: LD A, $mem_bunny_direction AND $07 LD $mem_bunny_direction, A + + LD A, $mem_bunny_status_clear_turn_counter + DEC A + CP $00 + LD $mem_bunny_status_clear_turn_counter, A + JR Z, =.Unfreeze + CALL =RNG_Step CP $55 JP NC, =.Skip_turn @@ -27,6 +34,7 @@ Move_Bunny: CP $55 JP NC, =.Skip_turn + .Unfreeze: LD A, $00 LD $mem_bunny_status, A LD A, $mem_bunny_flags diff --git a/entity/fox.gbasm b/entity/fox.gbasm index 67723f8..d82cc66 100644 --- a/entity/fox.gbasm +++ b/entity/fox.gbasm @@ -110,7 +110,7 @@ Fox_Turn: CP $00 JR Z, =.Try_Walking - CALL =Basic_Attack + CALL =Basic_Enemy_Attack JR =.Start_action_or_movement.end @@ -147,7 +147,7 @@ Fox_Turn: CP $00 JR Z, =.laser_sight_check_fail - CALL =Laser_Attack + CALL =Laser_Enemy_Attack LD A, L AND $f0 diff --git a/entity/frog.gbasm b/entity/frog.gbasm index b7d6511..428e88a 100644 --- a/entity/frog.gbasm +++ b/entity/frog.gbasm @@ -85,7 +85,7 @@ Frog_Turn: LD A, E CP $00 JR Z, =.Try_Walking - CALL =Basic_Attack + CALL =Basic_Enemy_Attack JR =.Start_action_or_movement.end diff --git a/entity/init.gbasm b/entity/init.gbasm index 361f600..2bb9242 100644 --- a/entity/init.gbasm +++ b/entity/init.gbasm @@ -217,7 +217,7 @@ Initialize_Enemy: ; HL => pointer to entity struct LD (HL+), A LD A, L - ADD $07 + ADD $06 LD L, A RET diff --git a/entity/list.gbasm b/entity/list.gbasm index 9a2de26..054a563 100644 --- a/entity/list.gbasm +++ b/entity/list.gbasm @@ -25,7 +25,7 @@ Entity_list: .DB $03 ; Interaction Jump Table index - .DB $03 + .DB $01 ; Starting health .DB $02 @@ -35,6 +35,42 @@ Entity_list: .PADTO =.Frog+8 + .Cat: + ; Sprite address + .DB =OBJ_Tile_Image_Data.Cat + + ; Turn Jump Table index + .DB $03 + + ; Interaction Jump Table index + .DB $01 + + ; Starting health + .DB $02 + + ; Starting mana + .DB $00 + + .PADTO =.Cat+8 + + .Penguin: + ; Sprite address + .DB =OBJ_Tile_Image_Data.Penguin + + ; Turn Jump Table index + .DB $04 + + ; Interaction Jump Table index + .DB $01 + + ; Starting health + .DB $05 + + ; Starting mana + .DB $03 + + .PADTO =.Penguin+8 + .Mouse: ; Sprite address .DB =OBJ_Tile_Image_Data.Mouse diff --git a/entity/penguin.gbasm b/entity/penguin.gbasm new file mode 100644 index 0000000..363516b --- /dev/null +++ b/entity/penguin.gbasm @@ -0,0 +1,146 @@ +Penguin_Turn: + LD A, $mem_map_loading_flags + BIT 3, A + RET Z + + PUSH HL + PUSH BC + PUSH DE + INC HL + LD A, (HL+) + LD B, A + LD A, (HL+) + LD C, A + LD A, (HL+) + LD D, A + + .Health_check: + LD A, L + AND $f0 + ADD $06 + LD L, A + + LD A, (HL) + CP $00 + JR NZ, =.Health_check.end + + LD A, L + AND $f0 + LD L, A + + LD (HL), $00 + LD A, $mem_enemies_alive_count + DEC A + LD $mem_enemies_alive_count, A + JP NZ, =.Skip_turn + .Health_check.end: + + .Freeze_shiver: + LD A, $mem_moving_animation_step + CP $00 + JP NZ, =.Freeze_shiver.end + LD A, L + AND $f0 + ADD $08 + LD L, A + LD A, $01 + CP (HL) + JR NZ, =.Freeze_shiver.end + LD A, D + AND $07 + LD D, A + CALL =RNG_Step + CP $55 + JP NC, =.Skip_turn + LD A, D + OR $40 + LD D, A + + CALL =RNG_Step + CP $55 + JP NC, =.Skip_turn + + LD A, $00 + LD (HL-), A + RES 1, (HL) + JP =.Skip_turn + .Freeze_shiver.end: + + .Should_turn_be_skipped: + LD A, L + AND $f0 + ADD $08 + LD L, A + + BIT 0, (HL) + JP NZ, =.Skip_turn + + .Start_action_or_movement: + LD A, $mem_moving_animation_step + CP $00 + JP NZ, =.Start_action_or_movement.end + + LD A, $mem_bunny_status + CP $01 + JR NZ, =.Try_Freeze_Attack + .Run_away: + CALL =Walking_Away + + JR =.Start_action_or_movement.end + + .Try_Freeze_Attack: + LD A, L + AND $f0 + ADD $09 + LD L, A + XOR A + CP (HL) + JR Z, =.Try_Walking + + CALL =Check_player_next_to + LD A, E + CP $00 + JR Z, =.Try_Walking + CALL =Freeze_Enemy_Attack + + LD A, L + AND $f0 + ADD $09 + LD L, A + + DEC (HL) + + JR =.Start_action_or_movement.end + + .Try_Walking: + CALL =Walking + .Start_action_or_movement.end: + + .End_movement: + LD A, $mem_moving_animation_step + CP $0f + JP NZ, =.End_movement.end + LD A, D + AND $07 + BIT 3, D + LD D, A + JR Z, =.End_movement.end + LD A, $01 + .ADD_A_TO_DIRECTION_BC + .End_movement.end: + + .Skip_Turn: + LD A, L + AND $f0 + LD L, A + INC HL + LD A, B + LD (HL+), A + LD A, C + LD (HL+), A + LD A, D + LD (HL+), A + POP DE + POP BC + POP HL + RET @@ -81,6 +81,7 @@ New_Dungeon: LD (HL+), A LD (HL+), A LD (HL+), A + LD A, $03 LD (HL+), A CALL =Dungeon_Generation CALL =Initialize_Entities @@ -236,6 +237,7 @@ STAT_Entrypoint: .INCLUDE "entity/bunny.gbasm" .INCLUDE "entity/fox.gbasm" .INCLUDE "entity/frog.gbasm" +.INCLUDE "entity/penguin.gbasm" .INCLUDE "entity/actions.gbasm" .INCLUDE "entity/collisions.gbasm" .INCLUDE "entity/display.gbasm" |