MediaWiki:Common.js: Unterschied zwischen den Versionen

Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 1.237: Zeile 1.237:


/* ============================================================
/* ============================================================
   ADOS – Feuerwerk mit Raketen + Explosion (ES5)
   ADOS – Feuerwerk (klassisch Silvester) – Raketen steigen hoch + explodieren
   - dauerhaft
   ES5 | dauerhaft | kein Abdunkeln | Canvas transparent
  - KEIN Abdunkeln
  - KEIN Aufhellen (kein Weiß-Schleier)
  - Canvas transparent, pro Frame clearRect
   ============================================================ */
   ============================================================ */
(function () {
(function () {
Zeile 1.281: Zeile 1.278:
     var ctx = c.getContext('2d');
     var ctx = c.getContext('2d');
     ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
     ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
     // Glow-Look für Partikel
     // Glow-/Leuchteffekt (klassischer Feuerwerkslook)
     ctx.globalCompositeOperation = 'lighter';
     ctx.globalCompositeOperation = 'lighter';
     return ctx;
     return ctx;
Zeile 1.295: Zeile 1.292:
   var running = true;
   var running = true;


  // ---- Rocket Spawn (klassisch: moderat schnell) ----
   function spawnRocket() {
   function spawnRocket() {
     var w = window.innerWidth;
     var w = window.innerWidth;
Zeile 1.301: Zeile 1.299:
     var x = rand(60, w - 60);
     var x = rand(60, w - 60);
     var y = h + rand(20, 120);
     var y = h + rand(20, 120);
    var targetY = rand(h * 0.12, h * 0.50);


     var vy = rand(-7.5, -10.5);
     // Explosionshöhe (klassisch: eher im oberen Mittelfeld)
     var vx = rand(-0.8, 0.8);
     var targetY = rand(h * 0.12, h * 0.48);


    // Geschwindigkeit (klassisch: sichtbar, aber nicht hektisch)
    var vy = rand(-10.5, -14.5);
    var vx = rand(-1.2, 1.2);
    // Raketenleuchten (warm/gold)
     var r = Math.floor(rand(220, 255));
     var r = Math.floor(rand(220, 255));
     var g = Math.floor(rand(170, 240));
     var g = Math.floor(rand(170, 240));
Zeile 1.315: Zeile 1.317:
       targetY: targetY,
       targetY: targetY,
       age: 0,
       age: 0,
       life: rand(2200, 3200),
       life: rand(2400, 3400),
       r: r, g: g, b: b,
       r: r, g: g, b: b,
       trail: []
       trail: []
Zeile 1.321: Zeile 1.323:
   }
   }


  // ---- Explosion (klassisch: kräftig, aber nicht extrem) ----
   function explode(x, y) {
   function explode(x, y) {
     var count = Math.floor(rand(35, 70));
    // Partikelanzahl: klassisch mittel
     var count = Math.floor(rand(55, 95));
     var i;
     var i;


     for (i = 0; i < count; i++) {
     for (i = 0; i < count; i++) {
       var angle = rand(0, Math.PI * 2);
       var angle = rand(0, Math.PI * 2);
       var speed = rand(2.5, 7.5);
      // Geschwindigkeit: klassisch „Knall“
       var speed = rand(2.8, 6.8);


      // Farben: Mix aus bunt + gold (klassisch)
       var rr = Math.floor(rand(120, 255));
       var rr = Math.floor(rand(120, 255));
       var gg = Math.floor(rand(80, 240));
       var gg = Math.floor(rand(80, 240));
       var bb = Math.floor(rand(120, 255));
       var bb = Math.floor(rand(120, 255));


       // Gold-Bias
       // Gold/Amber-Bias für „klassisch“
       if (Math.random() < 0.40) {
       if (Math.random() < 0.35) {
         rr = Math.floor(rand(220, 255));
         rr = Math.floor(rand(220, 255));
         gg = Math.floor(rand(150, 230));
         gg = Math.floor(rand(150, 230));
Zeile 1.345: Zeile 1.351:
         vy: Math.sin(angle) * speed,
         vy: Math.sin(angle) * speed,
         age: 0,
         age: 0,
         life: rand(900, 1600),
         life: rand(900, 1500),
         size: rand(1.8, 3.8),
         size: rand(1.8, 3.4),
         r: rr, g: gg, b: bb
         r: rr, g: gg, b: bb
       });
       });
Zeile 1.361: Zeile 1.367:
     var h = window.innerHeight;
     var h = window.innerHeight;


     // WICHTIG: transparent löschen (kein Weiß/Schwarz-Schleier)
     // Transparent löschen: kein Abdunkeln, kein Weiß-Schleier
     ctx.globalCompositeOperation = 'source-over';
     ctx.globalCompositeOperation = 'source-over';
     ctx.clearRect(0, 0, w, h);
     ctx.clearRect(0, 0, w, h);
Zeile 1.372: Zeile 1.378:
       r.age += dt;
       r.age += dt;


      // Trail
       r.trail.push({ x: r.x, y: r.y });
       r.trail.push({ x: r.x, y: r.y });
       if (r.trail.length > 18) r.trail.shift();
       if (r.trail.length > 16) r.trail.shift();


       r.vy += 0.004 * (dt / 16);
      // Physik: sanfte Schwerkraft (klassisch)
       r.vy += 0.006 * (dt / 16);
       r.x += r.vx * (dt / 16);
       r.x += r.vx * (dt / 16);
       r.y += r.vy * (dt / 16);
       r.y += r.vy * (dt / 16);


      // Explosions-Trigger
       if (r.y <= r.targetY) {
       if (r.y <= r.targetY) {
         explode(r.x, r.y);
         explode(r.x, r.y);
Zeile 1.385: Zeile 1.394:
       }
       }


      // Safety
       if (r.age >= r.life || r.y < -200 || r.x < -200 || r.x > w + 200) {
       if (r.age >= r.life || r.y < -200 || r.x < -200 || r.x > w + 200) {
         rockets.splice(i, 1);
         rockets.splice(i, 1);
Zeile 1.390: Zeile 1.400:
       }
       }


       // Trail
       // Trail zeichnen (klassisch: sichtbar, aber nicht zu dick)
       ctx.beginPath();
       ctx.beginPath();
       ctx.lineWidth = 3.0;
       ctx.lineWidth = 2.6;
       ctx.strokeStyle = 'rgba(' + r.r + ',' + r.g + ',' + r.b + ',0.35)';
       ctx.strokeStyle = 'rgba(' + r.r + ',' + r.g + ',' + r.b + ',0.30)';
       var t;
       var t;
       for (t = 0; t < r.trail.length; t++) {
       for (t = 0; t < r.trail.length; t++) {
Zeile 1.405: Zeile 1.415:
       ctx.beginPath();
       ctx.beginPath();
       ctx.fillStyle = 'rgba(' + r.r + ',' + r.g + ',' + r.b + ',1)';
       ctx.fillStyle = 'rgba(' + r.r + ',' + r.g + ',' + r.b + ',1)';
       ctx.arc(r.x, r.y, 3.0, 0, Math.PI * 2, false);
       ctx.arc(r.x, r.y, 2.7, 0, Math.PI * 2, false);
       ctx.fill();
       ctx.fill();
     }
     }
Zeile 1.420: Zeile 1.430:
       }
       }


       p.vy += 0.020 * (dt / 16);
      // Physik
       p.vx *= Math.pow(0.985, dt / 16);
       p.vy += 0.018 * (dt / 16);
       p.vy *= Math.pow(0.985, dt / 16);
       p.vx *= Math.pow(0.986, dt / 16);
       p.vy *= Math.pow(0.986, dt / 16);
       p.x += p.vx * (dt / 16);
       p.x += p.vx * (dt / 16);
       p.y += p.vy * (dt / 16);
       p.y += p.vy * (dt / 16);
Zeile 1.437: Zeile 1.448:
   }
   }


  // ---- Spawn-Frequenz (klassisch: alle ~1.2–2.2s) ----
   function scheduleRockets() {
   function scheduleRockets() {
     function loop() {
     function loop() {
       if (!running) return;
       if (!running) return;


      // meist 1 Rakete, manchmal 2 (klassisch)
       spawnRocket();
       spawnRocket();
       if (Math.random() < 0.20) spawnRocket();
       if (Math.random() < 0.28) spawnRocket();


       setTimeout(loop, Math.floor(rand(650, 1200)));
       setTimeout(loop, Math.floor(rand(1200, 2200)));
     }
     }
     loop();
     loop();