aboutsummaryrefslogtreecommitdiff
path: root/enemy.c
diff options
context:
space:
mode:
Diffstat (limited to 'enemy.c')
-rw-r--r--enemy.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/enemy.c b/enemy.c
index 5901445..467b45c 100644
--- a/enemy.c
+++ b/enemy.c
@@ -18,6 +18,8 @@ int get_enemy_hp(Enemy_Type t) {
switch (t) {
case enemy_demon:
return 3;
+ case enemy_fly:
+ return 2;
}
return 0;
}
@@ -30,6 +32,12 @@ void get_enemy_rect(Enemy_Type t, Rect* d) {
d->w = 12;
d->h = 14;
break;
+ case enemy_fly:
+ d->x = 2;
+ d->y = 6;
+ d->w = 11;
+ d->h = 7;
+ break;
}
}
@@ -45,6 +53,7 @@ void init_enemy(Enemy* e, Enemy_Type t, int x, int y) {
e->face = face_left;
e->state = enemy_state_patrol;
e->inv = 0;
+ e->timer = 0;
}
void update_enemy_anim(Enemy* e) {
@@ -214,11 +223,75 @@ void update_demon_move(Enemy* e, World* w) {
}
}
+void update_fly_move(Enemy* e, World* w) {
+ (void)e;
+ (void)w;
+ if (e->state == enemy_state_patrol) {
+ const Map* m = &w->map;
+ const Player* p = &w->player;
+ int d2g = 0, d2c = 0, y;
+ int tx = (e->x >> fbits) / map_tile_size;
+ int ty = (e->y >> fbits) / map_tile_size;
+ for (y = ty; y < map_h; y++, d2g++)
+ if (m->collision[tx + y * map_w])
+ break;
+ for (y = ty; y >= 0; y--, d2c++)
+ if (m->collision[tx + y * map_w])
+ break;
+ ty =
+ ((e->y >> fbits) + (map_tile_size >> 1)) /
+ map_tile_size;
+ if (e->face == face_left) {
+ tx = (
+ (e->x >> fbits) - (map_tile_size >> 1)) /
+ map_tile_size;
+ } else {
+ tx = (
+ (e->x >> fbits) + map_tile_size +
+ (map_tile_size >> 1)) /
+ map_tile_size;
+ }
+ if (tile_at(m, tx, ty))
+ e->face = !e->face;
+ if (d2g < 3 && d2c > 2)
+ e->vy -= 3 * (f1 / (d2g + 1));
+ e->vx = e->face == face_right? f1: -f1;
+ if (!e->grounded)
+ e->vx = (e->vx << fbits) / f1;
+ if (
+ e->timer > enemy_arrow_cooldown &&
+ p->y > e->y &&
+ absolute((e->x + f1 * 8) - (p->x + f1 * 8)) < f1 * 8
+ ) {
+ Rect r;
+ r.x = 0;
+ r.y = 0;
+ r.w = 3;
+ r.h = 12;
+ e->timer = 0;
+ inst_projectile(
+ w,
+ e->x + f1 * 8,
+ e->y,
+ &r,
+ asset_id_arrow_anm
+ );
+ }
+ }
+ e->anim =
+ e->face == face_left?
+ asset_id_fly_left_anm:
+ asset_id_fly_right_anm;
+}
+
void update_enemy_move(Enemy* e, World* w) {
switch (e->t) {
case enemy_demon:
update_demon_move(e, w);
break;
+ case enemy_fly:
+ update_fly_move(e, w);
+ break;
}
}
@@ -227,6 +300,7 @@ int update_enemy(Enemy* e, World* w) {
update_enemy_hurt(e, w);
update_enemy_move(e, w);
update_enemy_phys(e, &w->map);
+ e->timer++;
return e->hp <= 0;
}