summary refs log tree commit diff
path: root/src/flier.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/flier.c')
-rw-r--r--src/flier.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/flier.c b/src/flier.c
index 81596d0..1fd3092 100644
--- a/src/flier.c
+++ b/src/flier.c
@@ -3,6 +3,7 @@
 #include "loader.h"
 #include "tilemap.h"
 #include <stdbool.h>
+#include <stdlib.h>
 #include <math.h>
 #include <string.h>
 #include "particles.h"
@@ -270,12 +271,16 @@ static int flier_update(struct entity *self) {
 		case FLIER_PATROL:
 			move2(self);
 			if (ext->reached_x && ext->reached_y) {
-				ext->current_node++;
+				size_t const last_node = ext->current_node++;
 				if (ext->current_node == ext->path_length) {
 					ext->current_node = 0;
 				}
-				ext->reached_x = false;
-				ext->reached_y = false;
+				if (ext->path[last_node].x != ext->path[ext->current_node].x) {
+					ext->reached_x = false;
+				}
+				if (ext->path[last_node].y != ext->path[ext->current_node].y) {
+					ext->reached_y = false;
+				}
 				anim(self, FLIER_A_IDLE);
 				self->state = FLIER_IDLE;
 				self->timer = ext->idle_time;
@@ -298,6 +303,7 @@ static int flier_update(struct entity *self) {
 			}
 			if (abs(entities.player[0].x - self->x) + abs(entities.player[0].y - self->y) > to_fixed(96)) {
 				self->state = FLIER_IDLE;
+				ext->reached_x = ext->reached_y = false; // not doing this makes them get lost and confused
 			}
 			self->timer--;
 			if (self->timer == 0) {
@@ -316,6 +322,12 @@ static int flier_update(struct entity *self) {
 				self->state = FLIER_ALERT_IDLE;
 				self->timer = ext->attack_delay;
 			}
+			if (abs(entities.player[0].x - self->x) + abs(entities.player[0].y - self->y) > to_fixed(96)) {
+				anim(self, FLIER_A_IDLE);
+				self->state = FLIER_IDLE;
+				self->timer = ext->idle_time;
+				ext->reached_x = ext->reached_y = false; // not doing this makes them get lost and confused
+			}
 			break;
 
 		case FLIER_ALERT_ATTACK:
@@ -335,6 +347,7 @@ static int flier_update(struct entity *self) {
 				anim(self, FLIER_A_IDLE);
 				self->state = FLIER_IDLE;
 				self->timer = ext->idle_time;
+				ext->reached_x = ext->reached_y = false; // not doing this makes them get lost and confused
 			}
 			break;
 	}