         case DSMODE_PLAYING: loopPlaying(); break;
         }
 
+        particleSystem.draw(this);
+
         t = t2;
         buffer.flush(display);
         stringBuffer.reset();
-    }
-};
+
+        while (millis() - throttle < 50) continue;
+        throttle = millis();
+    }
+};
+
+void Particle::draw(DuinoSays* duinoSays) {
+    const int height = 24;
+    frameAge+=1;
+
+    const uint8_t rel = 255 - frameAge * 255 / maxAge;
+    const int width = 16 * rel >> 8;
+
+    uint8_t r = 255, g = 0, b = 255;
+    switch (type) {
+        case ParticleType::topLeftButton: r = 255, g = 64, b = 32; break;
+        case ParticleType::bottomLeftButton: r = 255, g = 255, b = 64; break;
+        case ParticleType::topRightButton: r = 32, g = 255, b = 32; break;
+        case ParticleType::bottomRightButton: r = 64, g = 64, b = 255; break;
+    }
+
+    duinoSays->buffer.drawRect((x>>8) - width / 2,(y>>8) - height / 2,width,height)->filledRect(duinoSays->buffer.rgb(rel * r >> 8,rel * g >> 8,rel * b >> 8));
+    x+=vx;
+    y+=vy;
+    vx -= vx>>3;
+    vy -= vy>>3;
+}
+
+template<uint8_t maxParticles>
+void ParticleSystem<maxParticles>::draw(DuinoSays* duinoSays) {
+    int n = 0;
+    for (int i=0; i < particleCount; i += 1) {
+        particles[i].draw(duinoSays);
+        if (particles[i].isAlive()) {
+            particles[n++] = particles[i];
+        }
+    }
+    particleCount = n;
+}
 
 void Button::draw(DuinoSays* duinoSays) {
     const bool on = ScreenButtonState::isButtonOn(btn);
     const int width = on ? 7 : 5;
     const int height = on ? 23 : 25;
     duinoSays->buffer.drawRect(x - width / 2,y - height / 2,width,height)->filledRect(on ? pressedColor : normalColor);
+    if (on && ScreenButtonState::isButtonActivated(btn)) {
+        duinoSays->particleSystem.spawn(btn, x,y,x<48?2000:-2000,0, 16);
+    }
 }
 
 DuinoSays duinoSays;

        display.setFlip(0);
        display.setBrightness(8);
        display.setBitDepth(buffer.is16bit()? 1:0);
    }

    void drawButton(bool on, uint16_t normalColor, uint16_t pressedColor, uint8_t x, uint8_t y) {

        return !isAnyButtonOn() && wasAnyButtonOn();
    }

};
uint8_t ScreenButtonState::buttonState;

namespace ParticleType {
    const uint8_t bottomLeftButton = 0;
    const uint8_t topLeftButton = 1;
    const uint8_t topRightButton = 2;
    const uint8_t bottomRightButton = 3;
}

enum DuinoSaysGameMode {
    DSMODE_MAINMENU,
