MediaWiki:Common.js: Unterschied zwischen den Versionen

Keine Bearbeitungszusammenfassung
Markierung: Zurückgesetzt
Keine Bearbeitungszusammenfassung
Markierung: Zurückgesetzt
Zeile 1.238: Zeile 1.238:


/* ============================================================
/* ============================================================
   ADOS – Silvester Feuerwerk (DAUERHAFT, KEIN ABDUNKELN, ES5)
   ADOS – Feuerwerk mit Raketen (hochschießen + explodieren)
   Läuft optional nur am 31.12/01.01 (Schalter unten)
   ES5 | dauerhaft | kein Abdunkeln | pointer-events:none
   ============================================================ */
   ============================================================ */
(function () {
(function () {
   'use strict';
   'use strict';


   // --- OPTIONAL: nur an Silvester/Neujahr aktiv ---
   // --- OPTIONAL: nur an Silvester/Neujahr ---
   // Wenn du es IMMER willst, setze den nächsten Wert auf false:
   // true = nur 31.12/01.01, false = immer
   var onlyOnNewYears = true;
   var onlyOnNewYears = false;


   function isNewYears() {
   function isNewYears() {
Zeile 1.254: Zeile 1.254:
     return (m === 12 && day === 31) || (m === 1 && day === 1);
     return (m === 12 && day === 31) || (m === 1 && day === 1);
   }
   }
   if (onlyOnNewYears && !isNewYears()) return;
   if (onlyOnNewYears && !isNewYears()) return;


Zeile 1.286: Zeile 1.285:


   var canvas, ctx;
   var canvas, ctx;
   var particles = [];
  var rockets = [];    // Raketenobjekte
   var particles = [];   // Explosionspartikel
   var last = 0;
   var last = 0;
   var running = true;
   var running = true;


   function spawnBurst(x, y) {
  // ---- Rocket Spawn ----
     var count = Math.floor(rand(35, 70));
  function spawnRocket() {
    var w = window.innerWidth;
    var h = window.innerHeight;
 
    // Start unten (leicht random)
    var x = rand(60, w - 60);
    var y = h + rand(10, 80);
 
    // Zielhöhe irgendwo oben/mittig
    var targetY = rand(h * 0.15, h * 0.55);
 
    // Geschwindigkeit / Drift
    var vy = rand(-9.5, -12.5);
    var vx = rand(-1.2, 1.2);
 
    rockets.push({
      x: x,
      y: y,
      vx: vx,
      vy: vy,
      targetY: targetY,
      life: rand(900, 1400), // Sicherheitslimit
      age: 0,
      // Rocket-Farbe / Leuchtpunkt
      r: Math.floor(rand(220, 255)),
      g: Math.floor(rand(180, 240)),
      b: Math.floor(rand(80, 160))
    });
  }
 
  // ---- Explosion ----
   function explode(x, y) {
     var count = Math.floor(rand(45, 90));
     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.0, 5.2);
       var speed = rand(2.0, 6.0);
       particles.push({
       particles.push({
         x: x,
         x: x,
Zeile 1.303: Zeile 1.335:
         life: rand(650, 1200),
         life: rand(650, 1200),
         age: 0,
         age: 0,
         size: rand(1.4, 3.0),
         size: rand(1.4, 3.1),
         // Farben: eher „Feuerwerk/Gold“
         // Explosionsfarbe: Gold/Rot/Blau gemischt
         r: Math.floor(rand(180, 255)),
         r: Math.floor(rand(140, 255)),
         g: Math.floor(rand(120, 230)),
         g: Math.floor(rand(80, 230)),
         b: Math.floor(rand(20, 120))
         b: Math.floor(rand(120, 255))
       });
       });
     }
     }
   }
   }


   // KEIN ABDUNKELN:
   // ---- Render: keine Abdunkelung → clearRect (kein Schleier) ----
  // Wir löschen pro Frame einfach komplett transparent (clearRect)
  // -> keine dunkle Überlagerung, aber Partikel „ziehen“ keine Trails.
   function tick(ts) {
   function tick(ts) {
     if (!running) return;
     if (!running) return;
Zeile 1.321: Zeile 1.351:
     last = ts;
     last = ts;


     ctx.clearRect(0, 0, window.innerWidth, window.innerHeight);
    var w = window.innerWidth;
    var h = window.innerHeight;
 
    // Kein Abdunkeln
     ctx.clearRect(0, 0, w, h);
 
    // --- Rockets updaten/zeichnen ---
    var i, r;
    for (i = rockets.length - 1; i >= 0; i--) {
      r = rockets[i];
      r.age += dt;
 
      // Bewegung
      r.vy += 0.0022 * dt; // Schwerkraft bremst (weniger negativ)
      r.vx *= Math.pow(0.999, dt);
      r.vy *= Math.pow(0.999, dt);
      r.x += r.vx * (dt / 16);
      r.y += r.vy * (dt / 16);
 
      // Rakete erreicht Zielhöhe → explodiert
      if (r.y <= r.targetY) {
        explode(r.x, r.y);
        rockets.splice(i, 1);
        continue;
      }
 
      // Sicherheits-Limit
      if (r.age >= r.life || r.y < -100 || r.x < -100 || r.x > w + 100) {
        rockets.splice(i, 1);
        continue;
      }


     var i, p;
      // Rocket zeichnen: Punkt + kleiner Schweif
      ctx.beginPath();
      ctx.fillStyle = 'rgba(' + r.r + ',' + r.g + ',' + r.b + ',1)';
      ctx.arc(r.x, r.y, 2.2, 0, Math.PI * 2, false);
      ctx.fill();
 
      // Schweif (kurzer Strich nach unten)
      ctx.beginPath();
      ctx.strokeStyle = 'rgba(' + r.r + ',' + r.g + ',' + r.b + ',0.65)';
      ctx.lineWidth = 2;
      ctx.moveTo(r.x, r.y + 10);
      ctx.lineTo(r.x - r.vx * 3, r.y + 22);
      ctx.stroke();
    }
 
    // --- Partikel updaten/zeichnen ---
     var p;
     for (i = particles.length - 1; i >= 0; i--) {
     for (i = particles.length - 1; i >= 0; i--) {
       p = particles[i];
       p = particles[i];
       p.age += dt;
       p.age += dt;
       if (p.age >= p.life) {
       if (p.age >= p.life) {
         particles.splice(i, 1);
         particles.splice(i, 1);
Zeile 1.333: Zeile 1.410:


       // Physik
       // Physik
       p.vy += 0.0027 * dt;
       p.vy += 0.0030 * dt;
       p.vx *= Math.pow(0.998, dt);
       p.vx *= Math.pow(0.998, dt);
       p.vy *= Math.pow(0.998, dt);
       p.vy *= Math.pow(0.998, dt);
Zeile 1.351: Zeile 1.428:
   }
   }


   // Dauerhaft neue Bursts – Frequenz steuerbar
   // ---- Spawner: dauerhaft neue Raketen ----
   function scheduleBursts() {
   function scheduleRockets() {
     function loop() {
     function loop() {
       if (!running) return;
       if (!running) return;
       spawnBurst(rand(80, window.innerWidth - 80), rand(80, window.innerHeight * 0.55));
 
       setTimeout(loop, Math.floor(rand(900, 1800))); // schneller = mehr Feuerwerk
       // 1–2 Raketen pro Spawn
      spawnRocket();
      if (Math.random() < 0.35) spawnRocket();
 
      // Frequenz (anpassen!)
       setTimeout(loop, Math.floor(rand(800, 1500)));
     }
     }
     loop();
     loop();
Zeile 1.370: Zeile 1.452:
     });
     });


     scheduleBursts();
     scheduleRockets();
     requestAnimationFrame(tick);
     requestAnimationFrame(tick);
   }
   }