aboutsummaryrefslogtreecommitdiff
path: root/enemiesattacks
diff options
context:
space:
mode:
authorAstatin <[email protected]>2025-01-16 18:13:21 +0900
committerAstatin <[email protected]>2025-01-16 18:13:21 +0900
commit02038990a93c0b4cf58269b5456327ea64b998b7 (patch)
tree8f23c7270bc705d17d9d380d3a927f12f20ca1fa /enemiesattacks
parentdc5a9431bf4438000dcd028aa6b9c17c9ca492d8 (diff)
Move basic enemy attack & walker AI to enemiesattacks
Diffstat (limited to 'enemiesattacks')
-rw-r--r--enemiesattacks/basic.gbasm30
-rw-r--r--enemiesattacks/walk.gbasm137
2 files changed, 167 insertions, 0 deletions
diff --git a/enemiesattacks/basic.gbasm b/enemiesattacks/basic.gbasm
new file mode 100644
index 0000000..882b1ae
--- /dev/null
+++ b/enemiesattacks/basic.gbasm
@@ -0,0 +1,30 @@
+Basic_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, B
+ SUB $04
+ LD B, A
+ ; LD A, $mem_bunny_health
+ ; SUB $01
+ ; JR C, =.health_underflow_fix
+ ; DAA
+ ; LD $mem_bunny_health, A
+ ; JR =.Skip_health_underflow_fix
+
+ ; .health_underflow_fix:
+ ; LD A, $00
+ ; LD $mem_bunny_health, A
+ ; .Skip_health_underflow_fix:
+
+ RET
diff --git a/enemiesattacks/walk.gbasm b/enemiesattacks/walk.gbasm
new file mode 100644
index 0000000..aa66848
--- /dev/null
+++ b/enemiesattacks/walk.gbasm
@@ -0,0 +1,137 @@
+Walking: ; 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_x
+ LD $tmp_var_1, A
+
+ LD A, $mem_bunny_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_y
+ LD $tmp_var_1, A
+
+ LD A, $mem_bunny_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_right
+ JR =.Check_Horizontal_Collision
+ .Go_Left:
+ LD A, $enum_direction_left
+
+ .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
+ LD A, C
+ 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_down
+ JR =.Direction_check_end
+ .Go_Up:
+ LD A, $enum_direction_up
+
+ .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:
+ LD A, D
+ PUSH BC
+ CALL =Get_Position_After_Move
+ LD A, C
+ CALL =Is_Collisionable
+ CALL =Carve_Entity_Collision_Map
+ POP BC
+ CP $00
+ RET Z
+ RES 3, D
+
+ RET