aboutsummaryrefslogtreecommitdiff
path: root/src/engine/enemy_ai.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/enemy_ai.c')
-rw-r--r--src/engine/enemy_ai.c99
1 files changed, 99 insertions, 0 deletions
diff --git a/src/engine/enemy_ai.c b/src/engine/enemy_ai.c
new file mode 100644
index 0000000..81d04d9
--- /dev/null
+++ b/src/engine/enemy_ai.c
@@ -0,0 +1,99 @@
+#include "engine/enemy_ai.h"
+
+int8_t hh_get_direction(int32_t player_x, int32_t enemy_x){
+ int movement_direction = player_x - enemy_x; // = player.pos.x - player.prev_pos.x;
+ if (movement_direction > 0) {
+ return 1; // move in positive direction
+ } else if (movement_direction < 0) {
+ return -1; // move in negative direction
+ } else {
+ return 0; // don't move
+ }
+}
+void hh_update_enemy_movement(hh_entity* enemy){
+ hh_entity enemy_new = {0};
+ enemy_new = *enemy;
+ enemy_new.vel = (vec2){
+ .x = enemy->vel.x,
+ .y = enemy->vel.y,
+ };
+
+ enemy_new.pos = (vec2){
+ .x = enemy->pos.x + enemy_new.vel.x,
+ .y = enemy->pos.y + enemy_new.vel.y,
+ };
+
+
+ *enemy = hh_background_collision ( *enemy, enemy_new);
+}
+void hh_slime_ai(hh_entity* enemy, hh_entity player){
+ int8_t direction = hh_get_direction(player.pos.x, enemy->pos.x);
+ if((player.pos.x - enemy->pos.x) >= -hunt_player && (player.pos.x - enemy->pos.x) <= hunt_player){
+ hh_movement_entity(enemy, direction);
+ }
+ hh_gravity_entity(enemy);
+ hh_update_enemy_movement(enemy);
+
+}
+
+void hh_jump_slime_ai(hh_entity* enemy, hh_entity player){
+ int8_t direction = hh_get_direction(player.pos.x, enemy->pos.x);
+ hh_gravity_entity(enemy);
+ if((player.pos.x - enemy->pos.x) >= -hunt_player && (player.pos.x - enemy->pos.x) <= hunt_player){
+ hh_movement_entity(enemy, direction);
+ // TODO: fix this if statement and make it cleaner. this makes the enemy jump when the player mets the condition
+ if((player.pos.y - enemy->pos.y) < -16 && (player.pos.y - enemy->pos.y) >= -100 && (player.pos.x - enemy->pos.x) >= -10 && (player.pos.x - enemy->pos.x) <= 10){
+ hh_jump_entity(enemy);
+ }
+ }
+
+ hh_update_enemy_movement(enemy);
+
+}
+#define terror_owl_attack_timer 100
+#define terror_owl_follow_player_delay 5
+#define terror_owl_attack_player_delay 12
+#define terror_owl_dive_speed 3
+#define delay_frames 2
+#define terror_owl_minimal_distance_from_player 100
+void hh_terror_owl_ai(hh_entity* enemy, hh_entity player){
+ static int count=0;
+ static int last_y_location=0;
+
+ if (count < terror_owl_attack_timer) {
+ // Move towards player position smoothly
+ int delta_x = (-50 + player.pos.x - enemy->pos.x) / terror_owl_follow_player_delay;
+ enemy->pos.x += delta_x;
+ enemy->pos.y = player.pos.y - terror_owl_minimal_distance_from_player;
+
+ count++;
+ last_y_location=player.pos.y;
+ } else {
+ if(enemy->pos.y <= last_y_location){
+ int delta_x = (player.pos.x - enemy->pos.x) / terror_owl_attack_player_delay;
+ enemy->pos.x += delta_x;
+ enemy->pos.y += terror_owl_dive_speed;
+ }
+ else{
+ count = 0;
+ }
+ }
+
+}
+void hh_update_enemy(hh_entity* enemy , hh_entity player, vec_cor cam_pos){
+ // static hh_e_entity_type type;
+ switch (enemy->object_type)
+ {
+ case slime:
+ hh_slime_ai(enemy,player);
+ break;
+ case jumping_slime:
+ hh_jump_slime_ai(enemy,player);
+ break;
+ case terror_owl:
+ hh_terror_owl_ai(enemy,player);
+ break;
+ default:
+ break;
+ }
+}