[GO BACK]
Weird Worlds mod tutorial: Particles
Last updated 11/26/2006
Overview
Weird Worlds has a robust particle effects system that is used for all
the flashy special effects in the game, from weapon muzzle flashes to
ship explosions to supernovas. This tutorial will provide a couple of
examples of these effects and explain how they work.
There are two main places where you'll find particle effects: the
effects.ini in the main gamedata folder, and the .ini files of items
that require special effects (weapons and shields).
New: Mods can now include new global special effects in files
besides effects.ini, for example effects_ravian.ini. These need to be
declared in game.ini.
Global effects
Global particle effects are defined in effects.ini and additional effects
files placed in the gamedata folder and declared in game.ini. The ones
in effects.ini are universal stuff... Exploding starships, supernovas
and so on. If you want to change these, copy the file into your mod's gamedata
folder, open it up in your favorite text editor and have a look.
In the file, you'll see a number of "EMIT" entries. These are particle
emitters. Each one describes what kind of particles to shoot, which way
and how fast. You will notice that occasionally there's more than one
with the same name (up to 4). All of those emitters are used at the
same time, as is the case with the supernova explosion. There are
certain rules for each global effect which we'll cover after looking
at this example; behold, the flames that shoot out of a burning ship!
EMIT flamejet
This line gives the particle emitter a name. Any emitter with the name
"flamejet" will be used when a ship is on fire. These particles will
come out of the visible hardpoints on the ship's hull. See the
Starship tutorial on more information
about those.
REFR entity
This is the reference location for the particle emitter. When it comes
to global effects this has generally no meaning, it's just there to
make the emitter entry complete. Maybe I'll do a weapon effect example
later, where the reference actually matters (you'll specify whether it's
at the muzzle of the gun, or when the weapon impacts something etc).
FILE combat/particle.tga
ANIM 32 32 0
This is the particle's graphic and its animation settings. The numbers
are the start and end frames of the animation, and the framerate
in frames per second (in this case it's only using one frame so the
rate can be set to zero). You'll notice in some cases the framerate
is set to -1; this causes the animation to last exactly as long as the
lifetime of the particle (like an animated explosion for example). If
it's set to -2, a random frame between the start and end is picked
but the particle doesn't animate. This is used for the random debris
pieces.
When you make new particle sprites, you should put as many of them as
possible on one new "sheet" and use the frame numbers to pick which
sprite you're using. You should not add them onto the original
particle.tga.
Note that particles use "pre-multiplied alpha" for blending. This means
glowing particles are simply drawn on black with a totally transparent
alpha channel; while opaque or alpha-blended particles will use the
alpha channel as opacity. See the Starship tutorial
for an example of constructing a 32-bit .tga image in Photoshop.
FLAG zoomin zoomout
The flags change the behavior of the particle in various ways:
relative - if emitted from a combat entity, use relative speed
fadein - particle starts transparent/dark and becomes opaque/bright over time
fadeout - particle fades out to transparent/dark at the end of its life
zoomin - particle starts small and grows to its full size over time
zoomout - particle shrinks down and disappears at the end of its life
slowdown - particle slows down over time, as if by friction
worldtime - use starmap time instead of real time (such as nova shockwave)
rotoffs - causes the OFFS to be rotated by the angle of the particle
trail - turns the particles into a continuous trail
RATE 4
How often a particle is emitted. Specifically how much time there is
between particles (in 1/100's of a second). This one shoots one out
once every 0.04 seconds.
SIZE 12
Size of the particle sprite (in meters). This is the maximum size it will
reach during its life. In this case with the zoomin/zoomout flags, the
particle will start with zero size, grow to 12 meters, and then shrink
down again.
LIFE 60
Lifetime of the particle (how long it stays visible) in 1/100's of a
second (ie. this one lives 0.6 seconds).
OFFS 0 0 0
Location and angular offset (X Y Angle). If these are set to non-zero,
the particle will appear "X" meters to the side or "Y" meters forward/back
of the reference location, or rotated by "Angle" degrees.
New: Normally the location offset is based on the entity's reference
frame, e.g. OFFS 0 -8 0 is always 8 meters back from the center of the entity. If
you use the "rotoffs" flag, the location is rotated depending on the angle
such that this would mean 8 meters in the direction opposite to the particle's
initial direction. For example, this can be used to make (randomly angled) particles appear
along a circle around the entity like the "charge-up" effect seen in the
superpirate sample mod in v1.2.
SPED 0 40
The X and Y velocity of the particle. X is sideways, Y is forward. A third
number can be added to impart an angular velocity (spin).
RAND 0 0 30 0 20
Randomness added to the particle. The first three are randomness of the
offset (in this case the particle may be randomly rotated 30 degrees
left or right but is never moved right/left or forward/back), then the
randomness of speed (this will add or subtract up to 20m/s from the
forward speed). A sixth number can be added for randomizing angular
velocity.
NUMB 1
How many particles to spew out at once. A "stream" of particles like
the fire usually only create one particle at once. Explosions and such
may create clouds of particles where the number is higher.
END EMIT
This closes the EMIT entry.
List of global emitters in effects.ini
Descriptions of each emitter name and how they're used.
flamejet
Flames that shoot out of ship hardpoints when it's about to explode.
sparkjet
Sparks from destroyed ship systems.
brokenoff
Flames from broken hull pieces
debristrail
A thin trail of fire behind the random "machinery chunks" (below)
debris
Random pieces of machinery that fly out when a ship explodes. Note the
"SPEW debristrail" line that refers to the previous particle emitter.
The number of debris chunks that actually appear depends on the hull
size. These are also used when ships collide.
shipexp
Starship explosion #1. This is the animated explosion sprite that
appears on the ship. The size and lifetime are scaled by the hull
size divided by 64. For example if a hull 128 meters long explodes,
the explosion is twice as big and lasts twice as long as set in this
particle emitter.
shipexp2
Starship explosion #2. This is the "shock wave", or ring of white
streaks that shoot out in all directions. It's scaled similarly to
the previous one, with the addition that the number of particles is
also scaled (so the big ship creates more particles).
hyperin
Particles displayed on the starmap when you engage the hyperdrive.
hyperout
Particles displayed on the starmap when you come out of hyperspace at
your destination stars. Also used for Klakar arriving in combat.
novasparks
Clouds of fiery plasma spewed out from a nova explosion.
novashock1
Various shockwave effects playing in realtime. One of these is a tiny,
invisible particle that stays in place and spews out the aforementioned
clouds over time.
novashock2
Nova shockwaves that play out in world time, to visualize the lethal
radius of the nova explosion. The lifetime of these particles (in days)
is multiplied by the size of the nova in lightyears.
collapser1
Vacuum collapser shockwave, works similarly to the nova.
Note that the emitters systemhit, onfire and shockexp are
obsolete and no longer in use. As of v1.2, it is also possible to define burning
and explosion effects for each hull. While the above are still used as the
"default" effects, a hull can use its own set of effects defined in a separate
file. For examples, see the ravian hulls and effects_ravian.ini.
Weapon example
Alright, let's examine a weapon with particle effects and see how
they differ from the global effects.ini emitters. For this example
I'll use wp_projrail.ini (Neptunium Railgun).
Within the DATA block of the weapon, we find two particle emitters.
One thing that's immediately apparent is that they don't have names
set on the EMIT line. This is because nothing else refers to these
emitters by name. Rather, the reference location determines when
these particle effects are used.
The first emitter is the muzzle flash. The animation frame is the
familiar fiery globe. Twenty of these are emitted straight ahead
at 40m/s velocity with +/-40m/s randomness. This gives us a nice
elongated but irregular glob of fire that spews out of the gun barrel.
Note the "relative" flag that means the muzzle flash particles are
affected by the ship's motion.
EMIT
REFR muzzle
FILE combat/particle.tga
ANIM 32 32 0
OFFS 0 0 0
FLAG relative zoomout
SPED 0 40 0
RAND 0 0 0 0 40 360
SIZE 6
LIFE 50
NUMB 20
END EMIT
The second emitter is the impact effect, so the reference location is
set to "impact". This is a very simple animated "spark explosion" with
8 frames. The framerate is set to -1 so it plays exactly once during
the 0.3sec lifetime of the particle.
EMIT
REFR impact
FILE combat/particle.tga
ANIM 16 23 -1
SIZE 16
LIFE 30
NUMB 1
END EMIT
List of reference locations
projectile - particles come out of the projectile (like a smoke trail).
impact - particles are triggered when the weapon hits a starship.
expire - particles appear at the end of the projectile's life.
muzzle - particles appear at the muzzle of the gun.
destroy - particles appear if the projectile is shot down by point defense.
Missile trail example
This example is from wp_missfiss.ini, using the v1.2 particle trail effects.
If you were to replace the FILE and ANIM with one of those glowing orbs, and
remove the "trail" and "stretch" flags, this emitter would look identical to
the old missile trails. Basically, it still emits particles at regular
intervals. The new effect simply "connects" those particles with a stretched
sprite similar to a beam weapon effect. This allows the game to use fewer
particles and still produce a solid trail.
The FILE command loads a sheet similar to what's used for beam weapons.
The important part is that graphics/combat/trail.ini sets the graphic to
"repeat" just like the beams do. The ANIM frame we're using, however,
doesn't tile so we'll be handling this a bit differently.
The FLAG command sets a couple of important flags: trail and stretch.
The "trail" flag obviously turns on the beam-like trail rendering. What the
"stretch" flag does is stretch the sprite so that its "bottom" is where the
trail starts (the missile) and the "top" is where it ends (smoke fading off
into space). This allows you to use a trail that changes color from "fire"
at the missile to "smoke" further away. Without the stretch, one would have
to use a tiling animation frame. See wp_projprot.ini for an example of this.
As with regular particles, the "length" of the trail is determined by how
fast the particles move (SPED) and how long they live (LIFE).
EMIT
REFR projectile
FILE combat/trail.tga
ANIM 1 1 0
RATE 20
OFFS 0 -4 180
FLAG relative trail zoomin fadeout stretch
SPED 0 80 0
RAND 0 0 2 0 0 0
SIZE 32
LIFE 180
NUMB 1
END EMIT
Shield "particle" example
Let's take a quick look at sy_shieldelmx.ini (Electron Matrix Shield)
and its particle emitter. This emitter is responsible for the shield
bubble effect that can be seen when the shield absorbs a weapon hit.
It looks pretty normal but is actually not a real particle emitter at
all. When the game is displaying a ship it'll use the data stored in
this emitter entry to determine how to draw its shield. Note that the
size is a percentage of the hull size, so normally it'll always be 100
for a shield that envelops the whole ship.
EMIT
REFR impact
FILE combat/shield.tga
ANIM 0 0 1
SIZE 100
LIFE 10
NUMB 1
END EMIT
[GO BACK]
|