KevinBlast/marble/server/scripts/fireworks.cs

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