3D spaceshooter with online scoreboard, online demos, ship building. Now entirely defunct, but might be resurrected
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
sector/src/net/sector/effects/Effects.java

273 lines
8.3 KiB

package net.sector.effects;
import java.util.Random;
import net.sector.Constants;
import net.sector.effects.particles.*;
import net.sector.sounds.Sounds;
import net.sector.util.Utils;
import com.porcupine.coord.Coord;
import com.porcupine.coord.Vec;
import com.porcupine.math.Calc;
/**
* Effects helper
*
* @author Ondřej Hruška (MightyPork)
*/
public class Effects {
/** RNG */
private static Random rand = new Random();
/**
* Add fire from jet engine (rocket)
*
* @param manager particle manager
* @param center engine pos
* @param motion engine motion
* @param repeatCount repeat count
*/
public static void addEngineFire(ParticleManager manager, Coord center, Vec motion, int repeatCount) {
addEngineFire(manager, center, motion, repeatCount, 0);
}
/**
* Add fire from jet engine (rocket)
*
* @param manager particle manager
* @param center engine pos
* @param motion engine motion
* @param repeatCount repeat count
* @param type 0 red, 1 blue
*/
public static void addEngineFire(ParticleManager manager, Coord center, Vec motion, int repeatCount, int type) {
addEngineFire(manager, center, motion, repeatCount, type, 1);
}
/**
* Add fire from jet engine (rocket)
*
* @param manager particle manager
* @param center engine pos
* @param motion engine motion
* @param repeatCount repeat count
* @param type 0 red, 1 blue
* @param size particle max size
*/
public static void addEngineFire(ParticleManager manager, Coord center, Vec motion, int repeatCount, int type, double size) {
Coord pos;
Vec pmotion;
double rotSpeed;
for (int i = 0; i < repeatCount; i++) {
pos = center.random_offset(0.02);
pmotion = motion.copy();
rotSpeed = 0;
ParticleFire p;
manager.add(p = (ParticleFire) new ParticleFire(pos, pmotion, rotSpeed, (0.2 + rand.nextDouble() * 0.2) * size, false)
.setGlobalMovement(false));
p.maxAge = (int) (Constants.FPS_UPDATE * 0.3 * size);
p.setType(type);
}
}
/**
* Add orb effect
*
* @param manager particle manager
* @param center center
* @param motionSource velocity of explosion source
* @param radius burst radius (3D units)
* @param particles number of particles
* @param color particle average color (0 blue, 1 red, 2 green)
* @param globalMovement should the particles move with "asteroid shift"?
*/
public static void addOrbBurst(ParticleManager manager, Coord center, Vec motionSource, double radius, int particles, int color,
boolean globalMovement, boolean gaussian) {
if (!Utils.canCoordBeSeen(center, 20)) return;
Coord pos;
Vec motion;
for (int i = 0; i < particles; i++) {
pos = center.random_offset(gaussian ? Math.abs(Calc.clampd(rand.nextGaussian() * radius, 0, radius * 1.2)) : radius);
motion = (Vec) motionSource.mul(0.5).add(Vec.random(-0.005, 0.005));
manager.add(new ParticleOrb(pos, motion, 0.2 + (0.2 + rand.nextDouble()) * 0.3, color).setGlobalMovement(globalMovement));
}
}
/**
* Add fire burst
*
* @param manager particle manager
* @param center center
* @param motionSource velocity of explosion source
* @param radius burst radius (3D units)
* @param particles number of particles
* @param globalMovement should the particles move with "asteroid shift"?
*/
public static void addFireBurst(ParticleManager manager, Coord center, Vec motionSource, double radius, int particles, boolean globalMovement,
boolean gaussian) {
if (!Utils.canCoordBeSeen(center, 20)) return;
Coord pos;
Vec motion;
for (int i = 0; i < particles; i++) {
pos = center.random_offset(gaussian ? Math.abs(Calc.clampd(rand.nextGaussian() * radius, 0, radius * 1.2)) : radius);
motion = (Vec) motionSource.mul(0.8).add(Vec.random(-0.005, 0.005));
double rotSpeed = -10 + rand.nextDouble() * 20;
manager.add(new ParticleFire(pos, motion, rotSpeed, true).setGlobalMovement(globalMovement));
}
}
/**
* Add explosion
*
* @param manager particle manager
* @param center center
* @param motionSource velocity of explosion source
* @param strength explosion strength
* @param globalMovement should the particles move with "asteroid shift"?
* @param sound make sound
*/
public static void addEMPExplosion(ParticleManager manager, Coord center, Vec motionSource, double strength, boolean globalMovement, boolean sound) {
if (!Utils.canCoordBeSeen(center, 20)) return;
Coord pos;
Vec motion;
for (int i = 0; i < strength * 5; i++) {
pos = center.random_offset(0.02 * strength);
motion = (Vec) motionSource.mul(0.5).add(Vec.random(-0.005, 0.005));
manager.add(new ParticleEMP(pos, motion, 0.3 + (0.2 + rand.nextDouble()) * 0.3 * strength).setGlobalMovement(globalMovement));
}
if (sound && center.distTo(new Coord(0, 0, 0)) < 80 /*25*/) {
float pitch = 0.3f + rand.nextFloat() * 0.6f;
float gain = Calc.clampf((float) strength * 0.12f, 0, 1.5f) * 0.3f;
Sounds.explosion().playEffectLinearZ(pitch, gain, 60, false, center);
Sounds.shot_emp_hit.playEffectLinearZ(pitch, gain, 60, false, center);
}
}
/**
* Add explosion
*
* @param manager particle manager
* @param center center
* @param motionSource velocity of explosion source
* @param strength explosion strength
* @param shards add shards
* @param globalMovement should the particles move with "asteroid shift"?
*/
public static void addExplosion(ParticleManager manager, Coord center, Vec motionSource, double strength, boolean shards, boolean globalMovement) {
addExplosion(manager, center, motionSource, strength, shards, globalMovement, true);
}
/**
* Add explosion
*
* @param manager particle manager
* @param center center
* @param motionSource velocity of explosion source
* @param strength explosion strength
* @param shards add shards
* @param globalMovement should the particles move with "asteroid shift"?
* @param sound enable sounds
*/
public static void addExplosion(ParticleManager manager, Coord center, Vec motionSource, double strength, boolean shards, boolean globalMovement,
boolean sound) {
if (!Utils.canCoordBeSeen(center, 20)) return;
Coord pos;
Vec motion;
double rotSpeed;
for (int i = 0; i < strength * 5; i++) {
pos = center.random_offset(0.01 * strength);
motion = (Vec) motionSource.mul(0.5).add(Vec.random(-0.005, 0.005));
rotSpeed = -10 + rand.nextDouble() * 20;
manager.add(new ParticleFire(pos, motion, rotSpeed, 0.6 + (0.7 + rand.nextDouble()) * 0.6 * strength).setGlobalMovement(globalMovement));
if (i < strength * 3 && shards) {
pos = center.random_offset(0.04);
motion = (Vec) motionSource.mul(0.5).add(Vec.random(-0.02, 0.02));
rotSpeed = -10 + rand.nextDouble() * 20;
manager.add(new ParticleSmoke(pos, motion, rotSpeed).setGlobalMovement(globalMovement));
}
if (i < strength * 2 && shards) {
pos = center.random_offset(0.04);
motion = (Vec) motionSource.mul(0.5).add(Vec.random(-0.02, 0.02));
rotSpeed = -10 + rand.nextDouble() * 20;
manager.add(new ParticleShard(pos, motion, rotSpeed).setGlobalMovement(globalMovement));
}
}
if (sound && center.distTo(new Coord(0, 0, 0)) < 80 /*25*/) {
float pitch = 0.6f + rand.nextFloat() * 1.7f;
float gain = Calc.clampf((float) strength * 0.09f, 0, 1.5f) * 0.3f;
Sounds.explosion().playEffectLinearZ(pitch, gain, 60, false, center);
}
}
//
// /**
// * Add stars
// *
// * @param manager particle manager
// * @param center stars center
// * @param count stars count
// */
// public static void addStar(ParticleManager manager, Coord center, int count) {
// Coord pos;
// Vec motion;
// double rotSpeed;
//
// for (int i = 0; i < count; i++) {
// pos = center.random_offset(0.3);
// motion = Vec.random(-0.005, 0.005);
// rotSpeed = -5 + rand.nextDouble() * 10;
//
// manager.add(new ParticleStar(pos, motion, rotSpeed, 0.3 + (0.1 + rand.nextDouble()) * 0.8));
// }
// }
/**
* Add binary particles for splash
*
* @param manager particle manager
* @param center center
* @param count binaries count
*/
public static void addBinaries(ParticleManager manager, Coord center, int count) {
Coord pos;
Vec motion;
double rotSpeed;
for (int i = 0; i < count; i++) {
pos = center.random_offset(0.3);
motion = Vec.random(-0.005, 0.005);
rotSpeed = -3 + rand.nextDouble() * 6;
manager.add(new ParticleBinary(pos, motion, rotSpeed, 0.1 + (rand.nextDouble()) * 0.35));
}
}
}