aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--definitions.gbasm2
-rw-r--r--enemiesattacks.gbasm2
-rw-r--r--enemiesattacks/basic.gbasm2
-rw-r--r--enemiesattacks/freeze.gbasm17
-rw-r--r--enemiesattacks/laser.gbasm2
-rw-r--r--enemiesattacks/walkaway.gbasm135
-rw-r--r--entity/actions.gbasm4
-rw-r--r--entity/bunny.gbasm8
-rw-r--r--entity/fox.gbasm4
-rw-r--r--entity/frog.gbasm2
-rw-r--r--entity/init.gbasm2
-rw-r--r--entity/list.gbasm38
-rw-r--r--entity/penguin.gbasm146
-rw-r--r--main.gbasm2
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
diff --git a/main.gbasm b/main.gbasm
index 231020a..6f2dc5c 100644
--- a/main.gbasm
+++ b/main.gbasm
@@ -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"