/* Turret fires a projectile */ static void turret_shoot(struct SpecialObj *turret) { struct Projectile *bullet; double x = turret->x + cos(turret->angle)*6; double y = turret->y - sin(turret->angle)*6; Vector v = get_muzzle_vel(turret->angle); switch(turret->type) { case 2: bullet = make_missile(x,y,v); bullet->angle = 2*M_PI-turret->angle; turret->timer = 1.5*GAME_SPEED; playwave_3d (WAV_MISSILE, turret->x, turret->y); break; case 1: bullet = make_grenade(x,y,v); turret->timer = 0.9 * GAME_SPEED; playwave_3d (WAV_NORMALWEAP, turret->x, turret->y); break; default: bullet = make_bullet(x,y,v); turret->timer = 0.5 * GAME_SPEED; playwave_3d (WAV_NORMALWEAP, turret->x, turret->y); break; } bullet->owner = turret->owner; add_projectile(bullet); }
/* Shoot */ static int critter_shoot(struct Critter *critter, double angle) { double x = critter->physics.x + cos(angle)* critter->physics.radius; double y = critter->physics.y + sin(angle)* critter->physics.radius; if(is_solid(Round(x),Round(y))) return 0; Vector mvel = {cos(angle) * 10, sin(angle)*10}; add_projectile(make_bullet(x,y,addVectors(critter->physics.vel,mvel))); return 1; };
void WeaponSystem::shoot_gun(GunPosition gun_pos, long time) { Projectile *p = new Projectile; p->init(); Object *front = guns[gun_pos]->get_object("NUC_energy.nogravity$front"); Object *back = guns[gun_pos]->get_object("NUC_energy.nogravity$back"); Vector3 front_pos = front->get_matrix().get_translation(); Vector3 back_pos = back->get_matrix().get_translation(); Vector3 vel = front_pos - back_pos; vel.normalize(); p->set_velocity(vel); p->set_position(front_pos); p->set_speed(125.0); if (heat >= 70) { p->set_dmg(overheat_dmg); } else { p->set_dmg(dmg); } p->calc_matrix(time); NucEmitter *em = p->get_emitter(); Vector4 start_color = em->get_start_color(); Vector4 end_color = em->get_end_color(); float vec_term = (std::max)(0.0, (std::min)(1.0 - heat_factor * 1.51, 1.0)); Vector3 factor_vec = Vector3(1.0, vec_term, vec_term); em->set_start_color(Vector4(start_color.x, start_color.y * factor_vec.y, start_color.z * factor_vec.z, start_color.w)); em->set_end_color(Vector4(end_color.x, end_color.y * factor_vec.y, end_color.z * factor_vec.z, end_color.w)); em->calc_matrix(time); add_projectile(p); muzzle_emitters[gun_pos]->set_active(true); muzzle_emitters[gun_pos]->set_activation_time(time); int anim_idx = guns[gun_pos]->lookup_animation("shoot"); if (anim_idx == -1) return; guns[gun_pos]->start_animation(anim_idx, time); guns[gun_pos]->set_anim_speed(anim_idx, fire_rate); heat += log(heat_rate) * 1.1; heat_rate++; if (heat >= 100){ heat = 100; heat_rate = 0; overheated = true; game::engine::audio_manager->play_sample(game::utils::get_audio_sample_by_name("overheat"), 1.0, AUDIO_PLAYMODE_ONCE); game::engine::audio_manager->play_sample(game::utils::get_audio_sample_by_name("alarm"), 0.4, AUDIO_PLAYMODE_ONCE, Vector3(), &overheat_alarm_source_idx); game::engine::audio_manager->play_sample(game::utils::get_audio_sample_by_name("warning"), 1.5, AUDIO_PLAYMODE_LOOP, Vector3(), &warning_source_idx); } game::engine::audio_manager->play_sample(game::utils::get_audio_sample_by_name("laser_gun"), 1.0, AUDIO_PLAYMODE_ONCE, front_pos); }
/* Shoot in the direction of attack_vector */ static void pilot_shoot(struct Pilot *pilot) { double xoff,yoff; xoff = pilot->attack_vector.x * (pilot->walker.physics.radius+1); yoff = pilot->attack_vector.y * (pilot->walker.physics.radius+1); add_projectile(make_bullet ( pilot->walker.physics.x + xoff, pilot->walker.physics.y + yoff, addVectors(pilot->walker.physics.vel, multVector(pilot->attack_vector,10.0)))); pilot->weap_cooloff = 7; }