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 (ES5, ohne =>)
   ADOS – Silvester Feuerwerk (DAUERHAFT, KEIN ABDUNKELN, ES5)
   Aktiv: automatisch zwischen 31.12 und 01.01
   Läuft optional nur am 31.12/01.01 (Schalter unten)
   ============================================================ */
   ============================================================ */
(function () {
(function () {
   'use strict';
   'use strict';


   // --- Datum prüfen (Europe/Berlin; wir nehmen Local Time des Users) ---
   // --- OPTIONAL: nur an Silvester/Neujahr aktiv ---
  // Wenn du es IMMER willst, setze den nächsten Wert auf false:
  var onlyOnNewYears = true;
 
   function isNewYears() {
   function isNewYears() {
     var d = new Date();
     var d = new Date();
     var m = d.getMonth() + 1;     // 1-12
     var m = d.getMonth() + 1;
     var day = d.getDate();       // 1-31
     var day = d.getDate();
    // Silvester + Neujahr
     return (m === 12 && day === 31) || (m === 1 && day === 1);
     return (m === 12 && day === 31) || (m === 1 && day === 1);
   }
   }


  // Nur an Silvester/Neujahr aktiv
   if (onlyOnNewYears && !isNewYears()) return;
   if (!isNewYears()) return;


   // Canvas anlegen
   // Canvas anlegen
Zeile 1.267: Zeile 1.268:
     c.style.pointerEvents = 'none';
     c.style.pointerEvents = 'none';
     c.style.zIndex = '9999';
     c.style.zIndex = '9999';
     c.style.opacity = '0.85';
     c.style.opacity = '1';
     document.body.appendChild(c);
     document.body.appendChild(c);
     return c;
     return c;
Zeile 1.281: Zeile 1.282:
   }
   }


  // Einfache Partikel
   function rand(min, max) { return min + Math.random() * (max - min); }
   function rand(min, max) { return min + Math.random() * (max - min); }
   function clamp(v, a, b) { return Math.max(a, Math.min(b, v)); }
   function clamp(v, a, b) { return Math.max(a, Math.min(b, v)); }
Zeile 1.291: Zeile 1.291:


   function spawnBurst(x, y) {
   function spawnBurst(x, y) {
     var count = Math.floor(rand(40, 70));
     var count = Math.floor(rand(35, 70));
     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.2, 5.5);
       var speed = rand(2.0, 5.2);
       particles.push({
       particles.push({
         x: x,
         x: x,
Zeile 1.301: Zeile 1.301:
         vx: Math.cos(angle) * speed,
         vx: Math.cos(angle) * speed,
         vy: Math.sin(angle) * speed,
         vy: Math.sin(angle) * speed,
         life: rand(700, 1200),
         life: rand(650, 1200),
         age: 0,
         age: 0,
         size: rand(1.5, 3.2),
         size: rand(1.4, 3.0),
         // Farbe: gold/rot/blau/lila
         // Farben: eher „Feuerwerk/Gold“
         r: Math.floor(rand(120, 255)),
         r: Math.floor(rand(180, 255)),
         g: Math.floor(rand(80, 220)),
         g: Math.floor(rand(120, 230)),
         b: Math.floor(rand(120, 255))
         b: Math.floor(rand(20, 120))
       });
       });
     }
     }
   }
   }


  // KEIN ABDUNKELN:
  // 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.318: Zeile 1.321:
     last = ts;
     last = ts;


    // Hintergrund leicht ausfaden
     ctx.clearRect(0, 0, window.innerWidth, window.innerHeight);
     ctx.fillStyle = 'rgba(0,0,0,0.12)';
    ctx.fillRect(0, 0, window.innerWidth, window.innerHeight);


    // Partikel updaten/zeichnen
     var i, p;
     var i, p;
     for (i = particles.length - 1; i >= 0; i--) {
     for (i = particles.length - 1; i >= 0; i--) {
Zeile 1.333: Zeile 1.333:


       // Physik
       // Physik
       p.vy += 0.0028 * dt; // Gravity
       p.vy += 0.0027 * 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.351:
   }
   }


  // Dauerhaft neue Bursts – Frequenz steuerbar
   function scheduleBursts() {
   function scheduleBursts() {
    // alle ~1.2–2.6s ein Burst an zufälliger Position oben/mitte
     function loop() {
     function loop() {
       if (!running) return;
       if (!running) return;
       spawnBurst(rand(80, window.innerWidth - 80), rand(80, window.innerHeight * 0.55));
       spawnBurst(rand(80, window.innerWidth - 80), rand(80, window.innerHeight * 0.55));
       setTimeout(loop, Math.floor(rand(1200, 2600)));
       setTimeout(loop, Math.floor(rand(900, 1800))); // schneller = mehr Feuerwerk
     }
     }
     loop();
     loop();
Zeile 1.362: Zeile 1.362:


   function init() {
   function init() {
    // nur wenn Seite fertig ist
     canvas = createCanvas();
     canvas = createCanvas();
     ctx = fitCanvas(canvas);
     ctx = fitCanvas(canvas);


    // Resize
     window.addEventListener('resize', function () {
     window.addEventListener('resize', function () {
       if (!canvas) return;
       if (!canvas) return;
Zeile 1.372: Zeile 1.370:
     });
     });


    // Start
     scheduleBursts();
     scheduleBursts();
     requestAnimationFrame(tick);
     requestAnimationFrame(tick);
    // Optional: nach 25 Sekunden aus (damit es nicht nervt)
    setTimeout(function () {
      running = false;
      if (canvas && canvas.parentNode) canvas.parentNode.removeChild(canvas);
    }, 25000);
   }
   }