diff options
Diffstat (limited to 'enemy.c')
-rw-r--r-- | enemy.c | 74 |
1 files changed, 74 insertions, 0 deletions
@@ -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; } |