@@ -10648,7 +10648,7 @@ uint16_t mode_particleFireworks1D(void) {
1064810648 uint8_t *forcecounter;
1064910649
1065010650 if (SEGMENT.call == 0) { // initialization
10651- if (!initParticleSystem1D(PartSys, 4, 150, 4, true)) // init
10651+ if (!initParticleSystem1D(PartSys, 4, 150, 4, true)) // init advanced particle system
1065210652 return mode_static(); // allocation failed or is single pixel
1065310653 PartSys->setKillOutOfBounds(true);
1065410654 PartSys->sources[0].sourceFlags.custom1 = 1; // set rocket state to standby
@@ -10664,11 +10664,8 @@ uint16_t mode_particleFireworks1D(void) {
1066410664 PartSys->setParticleSize(SEGMENT.check3); // 1 or 2 pixel rendering
1066510665 PartSys->setMotionBlur(SEGMENT.custom2); // anable motion blur
1066610666
10667- int32_t gravity = (1 + (SEGMENT.speed >> 3));
10668- if (!SEGMENT.check1) // gravity enabled for sparks
10669- PartSys->setGravity(0); // disable
10670- else
10671- PartSys->setGravity(gravity); // set gravity
10667+ int32_t gravity = (1 + (SEGMENT.speed >> 3)); // gravity value used for rocket speed calculation
10668+ PartSys->setGravity(SEGMENT.speed ? gravity : 0); // set gravity
1067210669
1067310670 if (PartSys->sources[0].sourceFlags.custom1 == 1) { // rocket is on standby
1067410671 PartSys->sources[0].source.ttl--;
@@ -10683,8 +10680,8 @@ uint16_t mode_particleFireworks1D(void) {
1068310680 PartSys->sources[0].source.hue = hw_random16();
1068410681 PartSys->sources[0].var = 10; // emit variation
1068510682 PartSys->sources[0].v = -10; // emit speed
10686- PartSys->sources[0].minLife = 100 ;
10687- PartSys->sources[0].maxLife = 300 ;
10683+ PartSys->sources[0].minLife = 30 ;
10684+ PartSys->sources[0].maxLife = SEGMENT.check2 ? 400 : 40 ;
1068810685 PartSys->sources[0].source.x = 0; // start from bottom
1068910686 uint32_t speed = sqrt((gravity * ((PartSys->maxX >> 2) + hw_random16(PartSys->maxX >> 1))) >> 4); // set speed such that rocket explods in frame
1069010687 PartSys->sources[0].source.vx = min(speed, (uint32_t)127);
@@ -10723,11 +10720,11 @@ uint16_t mode_particleFireworks1D(void) {
1072310720 PartSys->sources[0].maxLife = 1300;
1072410721 PartSys->sources[0].source.ttl = 100 + hw_random16(64 - (SEGMENT.speed >> 2)); // standby time til next launch
1072510722 PartSys->sources[0].sat = 7 + (SEGMENT.custom3 << 3); //color saturation TODO: replace saturation with something more useful?
10726- PartSys->sources[0].size = hw_random16(64 ); // random particle size in explosion
10723+ PartSys->sources[0].size = hw_random16(SEGMENT.intensity ); // random particle size in explosion
1072710724 uint32_t explosionsize = 8 + (PartSys->maxXpixel >> 2) + (PartSys->sources[0].source.x >> (PS_P_RADIUS_SHIFT_1D - 1));
1072810725 explosionsize += hw_random16((explosionsize * SEGMENT.intensity) >> 8);
1072910726 for (uint32_t e = 0; e < explosionsize; e++) { // emit explosion particles
10730- if (SEGMENT.check2)
10727+ if (SEGMENT.check1) // colorful mode
1073110728 PartSys->sources[0].source.hue = hw_random16(); //random color for each particle
1073210729 PartSys->sprayEmit(PartSys->sources[0]); // emit a particle
1073310730 }
@@ -10747,7 +10744,7 @@ uint16_t mode_particleFireworks1D(void) {
1074710744
1074810745 return FRAMETIME;
1074910746}
10750- static const char _data_FX_MODE_PS_FIREWORKS1D[] PROGMEM = "PS Fireworks 1D@Gravity,Explosion,Firing side,Blur,Saturation,, Colorful,Smooth;,!;!;1;sx=150,c2=30,c3=31,o2=1";
10747+ static const char _data_FX_MODE_PS_FIREWORKS1D[] PROGMEM = "PS Fireworks 1D@Gravity,Explosion,Firing side,Blur,Saturation,Colorful,Trail, Smooth;,!;!;1;sx=150,c2=30,c3=31,o1=1 ,o2=1";
1075110748
1075210749/*
1075310750 Particle based Sparkle effect
0 commit comments