This was created with AwakeParticles, which is part of the AwakeLib. I'll release it soon :-)


From right to left: Emitter with circle option; PlaneX emitter and 5 attractors, including a changebmp for the smoke; point emitter with a add_vel attractor on top; point emitter with shield attractor on top

Code:

AP_EmitterCreate( vector(120, 80, 0), AP_EmitterLifetimeInfinite, 20, TestParticleFireRed, AP_EmitterEmitTypeTube, 20, 200, 0, 0 );

AP_EmitterCreate( vector(80, 0, 0), AP_EmitterLifetimeInfinite, 2, TestParticleFireRed, AP_EmitterEmitTypePlaneX, 8, 8, 0, 0 );
AP_EmitterCreate( vector(80, 0, 0), AP_EmitterLifetimeInfinite, 1, TestParticleFireYellow, AP_EmitterEmitTypePlaneX, 8, 8, 0, 0 );

AP_EmitterCreate( vector(0, 0, 0), AP_EmitterLifetimeInfinite, 2, TestParticleFireRed, AP_EmitterEmitTypePoint, 0, 0, 0, 0 );
AP_EmitterCreate( vector(0, 0, 0), AP_EmitterLifetimeInfinite, 1, TestParticleFireYellow, AP_EmitterEmitTypePoint, 0, 0, 0, 0 );

AP_EmitterCreate( vector(-80, 0, 0), AP_EmitterLifetimeInfinite, 2, TestParticleFireRed, AP_EmitterEmitTypePoint, 0, 0, 0, 0 );
AP_EmitterCreate( vector(-80, 0, 0), AP_EmitterLifetimeInfinite, 1, TestParticleFireYellow, AP_EmitterEmitTypePoint, 0, 0, 0, 0 );


AP_AttractorCreate( vector(80, 0, 30), AP_AttractorRangeTypeDistance, vector(20, 0, 0), AP_AttractorEventTypeAddSize, 0, 0.8, 0, 0 );
AP_AttractorCreate( vector(80, 0, 50), AP_AttractorRangeTypeDistance, vector(20, 0, 0), AP_AttractorEventTypeWind, 1, 0, 0, 0 );
AP_AttractorCreate( vector(80, 0, 80), AP_AttractorRangeTypeDistance, vector(20, 0, 0), AP_AttractorEventTypeChangeBmap, AP_AttractorCreateEventBmap("AP_TestParticle3.tga"), 0, 0, 0 );
AP_AttractorCreate( vector(80, 0, 80), AP_AttractorRangeTypeDistance, vector(12, 0, 0), AP_AttractorEventTypeAddAlpha, 2, 0, 0, 0 );
AP_AttractorCreate( vector(80, 0, 80), AP_AttractorRangeTypeDistance, vector(20, 0, 0), AP_AttractorEventTypeAddSize, 0.1, 0.6, 0, 0 );
AP_AttractorCreate( vector(80, 0, 80), AP_AttractorRangeTypeDistance, vector(60, 0, 0), AP_AttractorEventTypeWind, 2, 0.5, 0, 0 );

AP_AttractorCreate( vector(0, 0, 40), AP_AttractorRangeTypeDistance, vector(20, 0, 0), AP_AttractorEventTypeAddVel, -1, 0, 0, 0 );

AP_AttractorCreate( vector(-80, 0, 50), AP_AttractorRangeTypeDistance, vector(20, 0, 0), AP_AttractorEventTypeShield, 20, 20, 0, 0 );