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;  } |