431 lines
9.8 KiB
C#
431 lines
9.8 KiB
C#
//-----------------------------------------------------------------------------
|
|
// FireWorks, currently implemented using the particle engine.
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
datablock ParticleData(FireWorkSmoke)
|
|
{
|
|
textureName = "~/data/particles/saturn";
|
|
dragCoefficient = 1;
|
|
gravityCoefficient = 0;
|
|
inheritedVelFactor = 0;
|
|
windCoefficient = 0;
|
|
constantAcceleration = 0;
|
|
lifetimeMS = 2000;
|
|
lifetimeVarianceMS = 200;
|
|
spinSpeed = 0;
|
|
spinRandomMin = -90.0;
|
|
spinRandomMax = 90.0;
|
|
useInvAlpha = true;
|
|
|
|
colors[0] = "1 1 0 0";
|
|
colors[1] = "1 0 0 1.0";
|
|
colors[2] = "1 0 0 0.0";
|
|
|
|
sizes[0] = 0.1;
|
|
sizes[1] = 0.2;
|
|
sizes[2] = 0.3;
|
|
|
|
times[0] = 0.0;
|
|
times[1] = 0.2;
|
|
times[2] = 1.0;
|
|
};
|
|
|
|
datablock ParticleEmitterData(FireWorkSmokeEmitter)
|
|
{
|
|
ejectionPeriodMS = 100;
|
|
periodVarianceMS = 0;
|
|
ejectionVelocity = 1;
|
|
velocityVariance = 0.2;
|
|
ejectionOffset = 0.75;
|
|
thetaMin = 0;
|
|
thetaMax = 90;
|
|
phiReferenceVel = 0;
|
|
phiVariance = 360;
|
|
//overrideAdvances = false;
|
|
//orientParticles = true;
|
|
lifetimeMS = 5000;
|
|
particles = "FireWorkSmoke";
|
|
};
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
datablock ParticleData(RedFireWorkSpark)
|
|
{
|
|
textureName = "~/data/particles/star";
|
|
dragCoefficient = 0;
|
|
gravityCoefficient = 0.0;
|
|
windCoefficient = 0;
|
|
inheritedVelFactor = 0.2;
|
|
constantAcceleration = 0.0;
|
|
lifetimeMS = 500;
|
|
lifetimeVarianceMS = 50;
|
|
useInvAlpha = true;
|
|
|
|
colors[0] = "1 1 0 1.0";
|
|
colors[1] = "1 1 0 1.0";
|
|
colors[2] = "1 0 0 0.0";
|
|
|
|
sizes[0] = 0.2;
|
|
sizes[1] = 0.2;
|
|
sizes[2] = 0.2;
|
|
|
|
times[0] = 0.0;
|
|
times[1] = 0.5;
|
|
times[2] = 1.0;
|
|
};
|
|
|
|
datablock ParticleEmitterData(RedFireWorkSparkEmitter)
|
|
{
|
|
ejectionPeriodMS = 15;
|
|
periodVarianceMS = 0;
|
|
ejectionVelocity = 1;
|
|
velocityVariance = 0.25;
|
|
ejectionOffset = 0.0;
|
|
thetaMin = 0;
|
|
thetaMax = 180;
|
|
phiReferenceVel = 0;
|
|
phiVariance = 360;
|
|
overrideAdvances = false;
|
|
orientParticles = false;
|
|
lifetimeMS = 300;
|
|
particles = "RedFireWorkSpark";
|
|
};
|
|
|
|
datablock ExplosionData(RedFireWorkSparkExplosion)
|
|
{
|
|
emitter[0] = RedFireWorkSparkEmitter;
|
|
|
|
// Turned off..
|
|
shakeCamera = false;
|
|
impulseRadius = 0;
|
|
lightStartRadius = 0;
|
|
lightEndRadius = 0;
|
|
};
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
datablock ParticleData(RedFireWorkTrail)
|
|
{
|
|
textureName = "~/data/particles/spark";
|
|
dragCoefficient = 1;
|
|
gravityCoefficient = 0;
|
|
inheritedVelFactor = 0;
|
|
windCoefficient = 0;
|
|
constantAcceleration = 0;
|
|
lifetimeMS = 600;
|
|
lifetimeVarianceMS = 100;
|
|
spinSpeed = 0;
|
|
spinRandomMin = -90.0;
|
|
spinRandomMax = 90.0;
|
|
useInvAlpha = true;
|
|
|
|
colors[0] = "1 1 0 1.0";
|
|
colors[1] = "1 0 0 1.0";
|
|
colors[2] = "1 0 0 0.0";
|
|
|
|
sizes[0] = 0.1;
|
|
sizes[1] = 0.05;
|
|
sizes[2] = 0.01;
|
|
|
|
times[0] = 0.0;
|
|
times[1] = 0.5;
|
|
times[2] = 1.0;
|
|
};
|
|
|
|
datablock ParticleEmitterData(RedFireWorkTrailEmitter)
|
|
{
|
|
ejectionPeriodMS = 30;
|
|
periodVarianceMS = 0;
|
|
ejectionVelocity = 0.1;
|
|
velocityVariance = 0.0;
|
|
ejectionOffset = 0.0;
|
|
thetaMin = 170;
|
|
thetaMax = 180;
|
|
phiReferenceVel = 0;
|
|
phiVariance = 360;
|
|
//overrideAdvances = false;
|
|
//orientParticles = true;
|
|
lifetimeMS = 5000;
|
|
particles = "RedFireWorkTrail";
|
|
};
|
|
|
|
datablock DebrisData(RedFireWork)
|
|
{
|
|
//shapeFile = "file";
|
|
texture = "~data/particles/spark";
|
|
emitters = "RedFireWorkTrailEmitter";
|
|
|
|
explosion = RedFireWorkSparkExplosion;
|
|
elasticity = 0.2;
|
|
friction = 1;
|
|
numBounces = 1;
|
|
bounceVariance = 0;
|
|
explodeOnMaxBounce = true;
|
|
staticOnMaxBounce = false;
|
|
snapOnMaxBounce = false;
|
|
minSpinSpeed = 0;
|
|
maxSpinSpeed = 0;
|
|
render2D = false;
|
|
lifetime = 1.5;
|
|
lifetimeVariance = 0.4;
|
|
velocity = 2;
|
|
velocityVariance = 0.5;
|
|
fade = false;
|
|
useRadiusMass = false;
|
|
baseRadius = 0.2;
|
|
gravModifier = 0.05;
|
|
terminalVelocity = 6;
|
|
ignoreWater = true;
|
|
};
|
|
|
|
datablock ExplosionData(RedFireWorkExplosion)
|
|
{
|
|
//soundProfile = ExplodeSfx;
|
|
lifeTimeMS = 1200;
|
|
offset = 0.1;
|
|
|
|
debris = RedFireWork;
|
|
debrisThetaMin = 0;
|
|
debrisThetaMax = 90;
|
|
debrisPhiMin = 0;
|
|
debrisPhiMax = 360;
|
|
debrisNum = 10;
|
|
debrisNumVariance = 2;
|
|
debrisVelocity = 3;
|
|
debrisVelocityVariance = 0.5;
|
|
|
|
// Misc.
|
|
shakeCamera = false;
|
|
impulseRadius = 0;
|
|
lightStartRadius = 0;
|
|
lightEndRadius = 0;
|
|
};
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
datablock ParticleData(BlueFireWorkSpark)
|
|
{
|
|
textureName = "~/data/particles/bubble";
|
|
dragCoefficient = 0;
|
|
gravityCoefficient = 0.0;
|
|
windCoefficient = 0;
|
|
inheritedVelFactor = 0.2;
|
|
constantAcceleration = 0.0;
|
|
lifetimeMS = 2000;
|
|
lifetimeVarianceMS = 200;
|
|
useInvAlpha = true;
|
|
|
|
colors[0] = "0 0 1 1.0";
|
|
colors[1] = "0.5 0.5 1 1.0";
|
|
colors[2] = "1 1 1 0.0";
|
|
|
|
sizes[0] = 0.2;
|
|
sizes[1] = 0.2;
|
|
sizes[2] = 0.2;
|
|
|
|
times[0] = 0.0;
|
|
times[1] = 0.5;
|
|
times[2] = 1.0;
|
|
};
|
|
|
|
datablock ParticleEmitterData(BlueFireWorkSparkEmitter)
|
|
{
|
|
ejectionPeriodMS = 60;
|
|
periodVarianceMS = 0;
|
|
ejectionVelocity = 0.5;
|
|
velocityVariance = 0.25;
|
|
ejectionOffset = 0.0;
|
|
thetaMin = 0;
|
|
thetaMax = 180;
|
|
phiReferenceVel = 0;
|
|
phiVariance = 360;
|
|
overrideAdvances = false;
|
|
orientParticles = false;
|
|
lifetimeMS = 300;
|
|
particles = "BlueFireWorkSpark";
|
|
};
|
|
|
|
datablock ExplosionData(BlueFireWorkSparkExplosion)
|
|
{
|
|
emitter[0] = BlueFireWorkSparkEmitter;
|
|
|
|
// Turned off..
|
|
shakeCamera = false;
|
|
impulseRadius = 0;
|
|
lightStartRadius = 0;
|
|
lightEndRadius = 0;
|
|
};
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
datablock ParticleData(BlueFireWorkTrail)
|
|
{
|
|
textureName = "~/data/particles/spark";
|
|
dragCoefficient = 1;
|
|
gravityCoefficient = 0;
|
|
inheritedVelFactor = 0;
|
|
windCoefficient = 0;
|
|
constantAcceleration = 0;
|
|
lifetimeMS = 600;
|
|
lifetimeVarianceMS = 100;
|
|
spinSpeed = 0;
|
|
spinRandomMin = -90.0;
|
|
spinRandomMax = 90.0;
|
|
useInvAlpha = true;
|
|
|
|
colors[0] = "0 0 1 1.0";
|
|
colors[1] = "0.5 0.5 1 1.0";
|
|
colors[2] = "1 1 1 0.0";
|
|
|
|
sizes[0] = 0.1;
|
|
sizes[1] = 0.05;
|
|
sizes[2] = 0.01;
|
|
|
|
times[0] = 0.0;
|
|
times[1] = 0.5;
|
|
times[2] = 1.0;
|
|
};
|
|
|
|
datablock ParticleEmitterData(BlueFireWorkTrailEmitter)
|
|
{
|
|
ejectionPeriodMS = 30;
|
|
periodVarianceMS = 0;
|
|
ejectionVelocity = 0.1;
|
|
velocityVariance = 0.0;
|
|
ejectionOffset = 0.0;
|
|
thetaMin = 170;
|
|
thetaMax = 180;
|
|
phiReferenceVel = 0;
|
|
phiVariance = 360;
|
|
//overrideAdvances = false;
|
|
//orientParticles = true;
|
|
lifetimeMS = 5000;
|
|
particles = "BlueFireWorkTrail";
|
|
};
|
|
|
|
datablock DebrisData(BlueFireWork)
|
|
{
|
|
//shapeFile = "file";
|
|
texture = "~data/particles/spark";
|
|
emitters = "BlueFireWorkTrailEmitter";
|
|
|
|
explosion = BlueFireWorkSparkExplosion;
|
|
elasticity = 0.2;
|
|
friction = 1;
|
|
numBounces = 1;
|
|
bounceVariance = 0;
|
|
explodeOnMaxBounce = true;
|
|
staticOnMaxBounce = false;
|
|
snapOnMaxBounce = false;
|
|
minSpinSpeed = 0;
|
|
maxSpinSpeed = 0;
|
|
render2D = false;
|
|
lifetime = 1.5;
|
|
lifetimeVariance = 0.4;
|
|
velocity = 2;
|
|
velocityVariance = 0.5;
|
|
fade = false;
|
|
useRadiusMass = false;
|
|
baseRadius = 0.2;
|
|
gravModifier = 0.05;
|
|
terminalVelocity = 6;
|
|
ignoreWater = true;
|
|
};
|
|
|
|
datablock ExplosionData(BlueFireWorkExplosion)
|
|
{
|
|
//soundProfile = ExplodeSfx;
|
|
lifeTimeMS = 1200;
|
|
offset = 0.2;
|
|
|
|
debris = BlueFireWork;
|
|
debrisThetaMin = 0;
|
|
debrisThetaMax = 90;
|
|
debrisPhiMin = 0;
|
|
debrisPhiMax = 360;
|
|
debrisNum = 10;
|
|
debrisNumVariance = 2;
|
|
debrisVelocity = 3;
|
|
debrisVelocityVariance = 0.5;
|
|
|
|
// Misc.
|
|
shakeCamera = false;
|
|
impulseRadius = 0;
|
|
lightStartRadius = 0;
|
|
lightEndRadius = 0;
|
|
};
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
datablock ParticleEmitterNodeData(FireWorkNode)
|
|
{
|
|
timeMultiple = 1;
|
|
};
|
|
|
|
function startFireWorks(%pad)
|
|
{
|
|
// Create the cleanup group
|
|
if (!isObject(FireWorks)) {
|
|
new SimGroup(FireWorks);
|
|
MissionCleanup.add(FireWorks);
|
|
}
|
|
|
|
// Create a ParticleNode to run the emitter
|
|
%position = %pad.getPosition();
|
|
%rotation = %pad.rotation;
|
|
|
|
%obj = new ParticleEmitterNode(){
|
|
datablock = FireWorkNode;
|
|
emitter = FireWorkSmokeEmitter;
|
|
position = %position;
|
|
rotation = %rotation;
|
|
};
|
|
FireWorks.add(%obj);
|
|
|
|
// Create the explosions
|
|
$Game::FireWorkSchedule = schedule(0,0,"launchWave",0,%position, %rotation);
|
|
}
|
|
|
|
function endFireWorks(%position)
|
|
{
|
|
if (isObject(FireWorks))
|
|
FireWorks.delete();
|
|
cancel($Game::FireWorkSchedule);
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
$FireWorkWave[0] = "RedFireWorkExplosion";
|
|
$FireWorkWave[1] = "BlueFireWorkExplosion";
|
|
|
|
function launchWave(%wave,%position, %rotation)
|
|
{
|
|
// Create the explosions
|
|
for (%i = 0; %i < 2; %i++) {
|
|
%obj = new Explosion() {
|
|
datablock = $FireWorkWave[%i];
|
|
position = %position;
|
|
rotation = %rotation;
|
|
};
|
|
FireWorks.add(%obj);
|
|
}
|
|
|
|
// Schedule next wave
|
|
if (%wave < 3) {
|
|
%delay = 500 + 1000 * getRandom();
|
|
$Game::FireWorkSchedule = schedule(%delay,0,"launchWave",%wave + 1,%position, %rotation);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|