Not Youre Lock
0
📅 Tägliche Challange verfügbar

🐍 SNAKE

Score: 0
g>
🐦
FLAPPY BIRD
tippe / klicke um zu fliegen
🧱
BREAKOUT
zerstöre alle blöcke
🌸
MEMORY
finde alle paare
ES WAR UNNÖTIG HAHAHA
🏆
Achievement unlocked!

🎨 Themes

Wähle dein Theme — freischalten durch GRS Score

✦ Collectibles ✦

versteckte Figuren — finde sie alle

Achievements

Unlocked: 0/41
W. D. Gaster
████████████ ██ ████ ████ ████? ████ ██ ████ ████ ██████ ████. ██████ ██ ██████. ... ...du hättest das nicht lesen sollen.
[ klicken zum schließen ]
🌸
🌼
💐
🌺
🌻
🌷
🍀
🌾
ITS A PRANK
alles war nur ne Story
nix davon hatt sich aufs echte leben wiedergespiegelt
:(
Dein PC ist auf ein Problem gestoßen und muss neu gestartet werden.
Es werden einige Fehlerinformationen gesammelt, dann wird ein Neustart durchgeführt.\n\n0% abgeschlossen\n\nWenn du weitere Informationen benötigst, kannst du online nach diesem Fehler suchen:\nSTOP CODE: EASTER_EGG_INITIATED\n\nFehlerhafte Datei: lock.html
0% abgeschlossen
W O R D L E
// ══════════════════════════════════════ // PHASE 5 — WAHRE FORM (True Form) // Gaster multiplies into many copies, attacks from all sides // ══════════════════════════════════════ // ═══════════════════════════════════════ // PHASE 5 — FLOWEY ENDING INSPIRATION // 6 captured human souls orbit Gaster and fight for him. // Beat him → souls rebel and free the player. // ═══════════════════════════════════════ const P5_SOUL_COLS = ['#ff4444','#ff8800','#ffff44','#44ff88','#44ccff','#cc44ff']; const P5_SOUL_NAMES= ['Gerechtigkeit','Tapferkeit','Geduld','Freundlichkeit','Integrität','Ausdauer']; let p5Timer=0, p5Copies=[], p5Particles=[], p5HP=0; let p5SoulAttacking=false, p5SoulAtkIdx=0, p5SoulAtkTimer=0, p5SoulAtkPhase=0; let p5SoulOrbs=[]; // the 6 soul orbs orbiting Gaster let p5SoulState='controlled'; // 'controlled' | 'rebelling' | 'freed' let p5RebellionTimer=0; const P5_POOL=['blaster','ring_burst','spiral','aimed_burst','rain', 'ring_burst','blaster','aimed_burst','spiral']; function sbInitP5(){ p5Timer=0; sbProjectiles=[]; sbHeld=null; sbGreenMode=false; sbFloorItems=[]; sbFloatMsg={on:false,text:'',t:0,color:'#fff'}; sbPlayer={x:sbW/2,y:sbH*0.78,tx:sbW/2,ty:sbH*0.78,hp:3,maxHp:3,iframes:0}; sbBoss={x:sbW/2,y:sbH*0.20,hp:80,maxHp:80,phase:5,angry:true,speed:5.0, armLA:-0.5,armRA:0.5,armLT:-0.3,armRT:0.3,eyeGlow:1,mouthOpen:0.9, atkTimer:28,atkType:null,atkPhase:0,atkData:{}, shakeX:0,shakeY:0,moveTarget:{x:sbW/2,y:sbH*0.20},dead:false,glitchT:0, fwActive:false,fwTimer:0,raging:false,rageTimer:0}; p5SoulState='controlled'; p5RebellionTimer=0; // 6 soul orbs — they orbit Gaster and periodically fire p5SoulOrbs = P5_SOUL_COLS.map((col,i)=>({ col, name:P5_SOUL_NAMES[i], ang: (i/6)*Math.PI*2, orbitR: 80+i*5, orbSpd: 0.025+i*0.003, atkTimer: 40+i*18, x:sbW/2, y:sbH*0.2, r:11, freed:false, freeTx:0, freeTy:0, freeVx:0, freeVy:0, freePulse:0, freeAlpha:1, })); // Start p5 music sbPlayPhaseMusic('p5-music', 0.78); sbAud.volume=0; p5SoulAttacking=false; p5SoulAtkIdx=0; p5SoulAtkTimer=0; p5SoulAtkPhase=0; sbShowMsg('ALLE SEELEN GEHÖREN MIR.','#ff2200',220); sbPlayTalk(); // Re-register mouse tracking for soul movement sbCv.onmousemove=e=>{ if(!sbPlayer)return; sbPlayer.tx=e.clientX; sbPlayer.ty=e.clientY; }; sbCv.ontouchmove=e=>{ if(!sbPlayer)return; e.preventDefault(); sbPlayer.tx=e.touches[0].clientX; sbPlayer.ty=e.touches[0].clientY; }; sbCv.onclick=sbHandleClick; sbCv.ontouchend=e=>{e.preventDefault();sbHandleClick(e);}; } function sbTickP5(){ p5Timer++; sbTimer++; // ── Background ── const flashAl=Math.max(0,(sbBoss.glitchT||0)/14*0.45); const hp=sbBoss.hp/sbBoss.maxHp; // Shifts from deep black to reddish/rainbow as HP drops const bgR=Math.round(4+flashAl*255+(1-hp)*18); const bgG=Math.round(0+flashAl*200); const bgB=Math.round(8+flashAl*200); sbX.fillStyle=`rgb(${bgR},${bgG},${bgB})`; sbX.fillRect(0,0,sbW,sbH); sbX.fillStyle=`rgba(2,0,8,${0.82-flashAl})`; sbX.fillRect(0,0,sbW,sbH); // Glitch scanlines (more as HP drops) const glitchLines=3+Math.round((1-hp)*9); for(let i=0;i0){ sbBoss.glitchT--; for(let i=0;i<12;i++){ const hue=(p5Timer*3+i*30)%360; sbX.fillStyle=`rgba(${Math.random()<0.5?'255,50,50':'50,255,180'},0.1)`; sbX.fillRect(Math.random()*sbW,Math.random()*sbH,30+Math.random()*200,3+Math.random()*8); } } // ── Rainbow background aura when HP low ── if(hp<0.4){ const auraHue=(p5Timer*1.5)%360; sbX.fillStyle=`hsla(${auraHue},100%,50%,${(0.4-hp)*0.08})`; sbX.fillRect(0,0,sbW,sbH); } // ── Boss movement ── sbBoss.shakeX*=0.8; sbBoss.shakeY*=0.8; const dx=sbBoss.moveTarget.x-sbBoss.x,dy=sbBoss.moveTarget.y-sbBoss.y,d2=Math.sqrt(dx*dx+dy*dy); if(d2>8){sbBoss.x+=dx/d2*sbBoss.speed;sbBoss.y+=dy/d2*sbBoss.speed;} else sbPickBossTarget(); sbBoss.armLA+=(sbBoss.armLT-sbBoss.armLA)*0.07; sbBoss.armRA+=(sbBoss.armRT-sbBoss.armRA)*0.07; if(Math.abs(sbBoss.armLA-sbBoss.armLT)<0.02){sbBoss.armLT=-0.2-Math.random()*0.9;sbBoss.armRT=0.2+Math.random()*0.9;} // Escalation if(hp<0.67&&hp>0.33){sbBoss.speed=6.5;sbBoss.atkTimer=Math.min(sbBoss.atkTimer,22);} if(hp<=0.33){sbBoss.speed=8.5;} // ── Boss attacks ── if(!sbBoss.atkType){sbBoss.atkTimer--;if(sbBoss.atkTimer<=0)sbLaunchAttack(P5_POOL);} else sbUpdateAttack(); // ── Soul orbs ── if(p5SoulState==='controlled'){ p5SoulOrbs.forEach((orb,oi)=>{ // Orbit Gaster orb.ang+=orb.orbSpd*(1+(1-hp)*0.8); const effectiveR=orb.orbitR*(0.85+Math.sin(p5Timer*0.04+oi)*0.15); orb.x=sbBoss.x+Math.cos(orb.ang)*effectiveR; orb.y=sbBoss.y+Math.sin(orb.ang)*effectiveR*0.65; // Fire bullets at player periodically orb.atkTimer--; if(orb.atkTimer<=0){ orb.atkTimer=55+Math.floor(Math.random()*30)-(Math.floor((1-hp)*20)); if(sbPlayer){ const toX=sbPlayer.x-orb.x, toY=sbPlayer.y-orb.y; const tl=Math.sqrt(toX*toX+toY*toY)||1; const spd=4+Math.random()*2; // 2-3 shots in a spread const shots=hp<0.5?3:2; for(let s=0;s{ if(orb.freed){ orb.x+=orb.freeVx; orb.y+=orb.freeVy; orb.freeAlpha=Math.max(0,orb.freeAlpha-0.008); orb.freePulse+=0.12; } else { // Fly at Gaster const toX=sbBoss.x-orb.x, toY=sbBoss.y-orb.y; const tl=Math.sqrt(toX*toX+toY*toY)||1; orb.x+=toX/tl*6; orb.y+=toY/tl*5.5; // Hit Gaster if(tl<40&&!orb.freed){ orb.freed=true; sbBoss.hp=Math.max(0,sbBoss.hp-12); sbBoss.shakeX=(Math.random()-0.5)*30; sbBoss.shakeY=(Math.random()-0.5)*30; sbBoss.glitchT=35; sbBoss.mouthOpen=1.0; // Fly away after hitting const escAng=Math.random()*Math.PI*2; orb.freeVx=Math.cos(escAng)*3.5; orb.freeVy=Math.sin(escAng)*3.5; sbPlayBlast(); // Particle burst for(let k=0;k<18;k++){ const a=Math.random()*Math.PI*2, spd=1+Math.random()*4; sbFloweyParticles.push({x:orb.x,y:orb.y, vx:Math.cos(a)*spd,vy:Math.sin(a)*spd-1, col:orb.col,r:3+Math.random()*4,life:1,type:'dust',grav:0.05,wobble:0}); } } } // Draw if(orb.freeAlpha>0.02){ const pulse2=0.8+Math.sin(p5Timer*0.15+oi)*0.2; sbX.save(); sbX.globalAlpha=orb.freeAlpha; sbX.shadowColor=orb.col; sbX.shadowBlur=28; sbX.fillStyle=orb.col; sbX.beginPath(); sbX.arc(orb.x,orb.y,orb.r*(orb.freed?pulse2*0.7:pulse2+0.4),0,Math.PI*2); sbX.fill(); sbX.restore(); sbX.globalAlpha=1; } }); // Update sbFloweyParticles for(let i=sbFloweyParticles.length-1;i>=0;i--){ const fp=sbFloweyParticles[i]; fp.x+=fp.vx; fp.y+=fp.vy; fp.vy+=fp.grav||0; fp.life-=0.012; if(fp.life<=0){sbFloweyParticles.splice(i,1);continue;} sbX.globalAlpha=fp.life; sbX.fillStyle=fp.col; sbX.beginPath(); sbX.arc(fp.x,fp.y,fp.r*fp.life,0,Math.PI*2); sbX.fill(); } sbX.globalAlpha=1; // Check if all souls freed → trigger true victory const allFreed=p5SoulOrbs.every(o=>o.freed); if(allFreed&&p5RebellionTimer>80){ sbBoss.dead=true; sbTriggerFloweyVictory(); return; } } // ── Main boss combat (only while souls are controlled) ── if(p5SoulState==='controlled'){ sbUpdateProjectiles(); sbCheckCollisions(); for(const p of sbProjectiles)if(p.type==='blaster')sbDrawBlaster(p); for(const p of sbProjectiles)if(p.type!=='blaster')sbDrawProjectile(p); } // Draw main Gaster — larger in P5 sbDrawGasterSprite(sbBoss.x+sbBoss.shakeX,sbBoss.y+sbBoss.shakeY, p5SoulState==='rebelling'?1.0+p5RebellionTimer*0.003:1.18,{ mouthOpen:sbBoss.mouthOpen,phase:5,angry:true, armLA:sbBoss.armLA,armRA:sbBoss.armRA }); sbDrawSoul(); sbDrawHeld(); sbDrawFloorItems(); // HP bar — rainbow as HP drops const bw2=260,bxp2=sbW/2-bw2/2; const hpHue=Math.round(hp*120); const hpCol2=`hsl(${hpHue},100%,55%)`; sbX.fillStyle='rgba(0,0,0,0.6)'; sbX.fillRect(bxp2,8,bw2,38); sbX.font='10px Courier New'; sbX.fillStyle='#ccc'; sbX.textAlign='center'; sbX.fillText('☈ W.D. GASTER — WAHRE FORM',sbW/2,22); sbX.textAlign='left'; sbX.fillStyle='#111'; sbX.fillRect(bxp2,26,bw2,13); sbX.fillStyle=hpCol2; sbX.shadowColor=hpCol2; sbX.shadowBlur=10; sbX.fillRect(bxp2,26,bw2*hp,13); sbX.shadowBlur=0; sbX.strokeStyle='#333'; sbX.lineWidth=1; sbX.strokeRect(bxp2,26,bw2,13); const pm2=14,pbh2=11; sbX.fillStyle='rgba(0,0,0,0.5)'; sbX.fillRect(pm2,sbH-pm2-pbh2-22,150,pbh2+24); sbX.font='10px Courier New'; sbX.fillStyle='#f44'; sbX.fillText('❤ Leben',pm2+4,sbH-pm2-pbh2-8); sbX.fillStyle='#2a1a1a'; sbX.fillRect(pm2,sbH-pm2-pbh2,140,pbh2); sbX.fillStyle='#ff3344'; sbX.fillRect(pm2,sbH-pm2-pbh2,140*(sbPlayer.hp/sbPlayer.maxHp),pbh2); sbX.strokeStyle='#444'; sbX.lineWidth=1; sbX.strokeRect(pm2,sbH-pm2-pbh2,140,pbh2); sbDrawFloatMsg(); // ── Soul attack phase before rebellion ── if(sbBoss.hp<=0&&!sbBoss.dead&&p5SoulState==='controlled'&&!p5SoulAttacking){ sbBoss.hp=1; p5SoulAttacking=true; p5SoulAtkIdx=0; p5SoulAtkTimer=0; p5SoulAtkPhase=0; sbBoss.atkType=null; sbProjectiles=[]; sbBoss.speed=0; sbBoss.atkTimer=9999; sbShowMsg('* Die Seelen erwachen...','#ffff44',200); sbPlayTalk(); } if(p5SoulAttacking) sbTickSoulAttacks(); // ── Trigger rebellion when all soul attacks done ── if(sbBoss.hp<=0&&!sbBoss.dead&&p5SoulState==='controlled'&&p5SoulAttacking&&p5SoulAtkIdx>=6){ p5SoulAttacking=false; sbBoss.hp=1; p5SoulState='rebelling'; sbBoss.atkType=null; sbProjectiles=[]; sbHeld=null; sbBoss.speed=0; sbFloweyParticles=[]; sbAud.playbackRate=0.55; sbShowMsg('* Die Seelen...\n* Sie hören dir nicht mehr zu.','#ffff44',300); sbPlayTalk(); let shk2=0; const ri2=setInterval(()=>{ document.body.style.transform=`translate(${(Math.random()-0.5)*14}px,${(Math.random()-0.5)*14}px)`; if(shk2++>35){clearInterval(ri2);document.body.style.transform='';} },55); } } // ══════════════════════════════════════ // PHOTOSHOP FLOWEY–STYLE VICTORY // ══════════════════════════════════════ let sbFloweyParticles=[], sbFloweyTimer=0, sbFloweyPhase=0; function sbTriggerFloweyVictory(){ sbScene='p5_victory'; sbTimer=0; sbProjectiles=[]; sbHeld=null; sbGreenMode=false; sbEndFwHack(); sbStopAllPhaseMusic(); let mv=sbAud.volume; const mfo=setInterval(()=>{mv=Math.max(0,mv-0.03);sbAud.volume=mv;if(mv<=0){clearInterval(mfo);sbAud.pause();}},60); // Fade in ending theme const endAud=document.getElementById('end-music'); if(endAud){endAud.currentTime=0;endAud.volume=0;endAud.play().catch(()=>{}); let ev=0;const efi=setInterval(()=>{ev=Math.min(0.82,ev+0.012);endAud.volume=ev;if(ev>=0.82)clearInterval(efi);},90);} // Generate soul fragment particles from Gaster's position sbFloweyParticles=[]; const bx=sbBoss?sbBoss.x:sbW/2, by=sbBoss?sbBoss.y:sbH*0.25; // 7 colored soul fragments — like the 7 human souls const soulCols=['#ff4444','#ff8800','#ffff44','#44ff44','#44ffff','#4444ff','#aa44ff']; for(let s=0;s<7;s++){ const ang=(s/7)*Math.PI*2-Math.PI/2; const spd=2.5+Math.random()*2; sbFloweyParticles.push({ x:bx+(Math.random()-0.5)*40,y:by+(Math.random()-0.5)*40, vx:Math.cos(ang)*spd,vy:Math.sin(ang)*spd - 1.5, col:soulCols[s],r:8+Math.random()*5,life:1,type:'soul', grav:0.04,wobble:Math.random()*Math.PI*2 }); } // 300 dust/pixel particles for(let i=0;i<300;i++){ const ang=Math.random()*Math.PI*2,spd=0.3+Math.random()*4; const hue=Math.random()*360; sbFloweyParticles.push({ x:bx+(Math.random()-0.5)*100,y:by+(Math.random()-0.5)*100, vx:Math.cos(ang)*spd,vy:Math.sin(ang)*spd-Math.random()*2, col:`hsl(${hue},80%,65%)`,r:1+Math.random()*3.5,life:1,type:'dust', grav:0.025+Math.random()*0.03,wobble:Math.random()*Math.PI*2 }); } sbFloweyTimer=0; sbFloweyPhase=0; } function sbTickVictory(){ sbFloweyTimer++; sbTimer++; // ── Phase 0 (0-80): Gaster shatters ── // ── Phase 1 (80-200): White screen fills ── // ── Phase 2 (200-320): "..." text ── // ── Phase 3 (320-500): Determination text ── // ── Phase 4 (500+): Close ── if(sbFloweyTimer>80&&sbFloweyPhase===0) sbFloweyPhase=1; if(sbFloweyTimer>200&&sbFloweyPhase===1) sbFloweyPhase=2; if(sbFloweyTimer>320&&sbFloweyPhase===2) sbFloweyPhase=3; // Background const wt=Math.max(0,Math.min(1,(sbFloweyTimer-100)/120)); const bgR=Math.round(8+wt*247),bgG=Math.round(2+wt*247),bgB=Math.round(12+wt*247); sbX.fillStyle=`rgb(${bgR},${bgG},${bgB})`; sbX.fillRect(0,0,sbW,sbH); // ── Rainbow flash rings (phase 0) ── if(sbFloweyPhase===0){ const ringCount=5; for(let r=0;r=0;i--){ const p=sbFloweyParticles[i]; p.x+=p.vx+Math.sin(sbFloweyTimer*0.05+p.wobble)*0.4; p.y+=p.vy; p.vy+=p.grav; if(p.type==='soul'){ p.vy+=Math.sin(sbFloweyTimer*0.04+p.wobble)*0.05; p.life-=0.004; }else p.life-=0.006+Math.random()*0.004; if(p.life<=0){sbFloweyParticles.splice(i,1);continue;} const al=p.life*Math.min(1,wt<0.8?1:1-(wt-0.8)/0.2); sbX.globalAlpha=al; sbX.fillStyle=p.col; if(p.type==='soul'){ // Draw heart shape for soul fragments sbX.shadowColor=p.col; sbX.shadowBlur=14; const s=p.r,sx=p.x,sy=p.y; sbX.beginPath(); sbX.moveTo(sx,sy+s*0.42); sbX.bezierCurveTo(sx,sy+s*0.42,sx-s*1.6,sy-s*0.32,sx-s*0.9,sy-s*0.92); sbX.bezierCurveTo(sx-s*0.42,sy-s*1.44,sx,sy-s*0.82,sx,sy-s*0.18); sbX.bezierCurveTo(sx,sy-s*0.82,sx+s*0.42,sy-s*1.44,sx+s*0.9,sy-s*0.92); sbX.bezierCurveTo(sx+s*1.6,sy-s*0.32,sx,sy+s*0.42,sx,sy+s*0.42); sbX.fill(); sbX.shadowBlur=0; }else{ sbX.beginPath(); sbX.arc(p.x,p.y,p.r*p.life,0,Math.PI*2); sbX.fill(); } sbX.globalAlpha=1; } // ── Text phases ── sbX.textAlign='center'; const textCol=`rgba(${Math.round((1-wt)*255+wt*20)},${Math.round((1-wt)*255+wt*20)},${Math.round((1-wt)*255+wt*20)},1)`; if(sbFloweyPhase>=2){ const a2=Math.min(1,(sbFloweyTimer-200)/30); sbX.globalAlpha=a2; sbX.font=`bold ${Math.round(sbW*0.06)}px 'Courier New'`; sbX.fillStyle=wt>0.5?'#111':'#fff'; sbX.shadowColor=wt>0.5?'rgba(0,0,0,0.2)':'rgba(255,255,255,0.4)'; sbX.shadowBlur=20; sbX.fillText('...',sbW/2,sbH*0.44); sbX.shadowBlur=0; sbX.globalAlpha=1; } if(sbFloweyPhase>=3){ const a3=Math.min(1,(sbFloweyTimer-320)/40); sbX.globalAlpha=a3; sbX.font=`${Math.round(sbW*0.028)}px 'Courier New'`; sbX.fillStyle=wt>0.5?'#222':'#ddd'; const lines=[ 'Du bist mit ENTSCHLOSSENHEIT erfüllt.', '', '...und etwas, das sich wie Abschied anfühlt.', ]; lines.forEach((ln,i)=>{sbX.fillText(ln,sbW/2,sbH*0.44+70+i*34);}); sbX.globalAlpha=1; } // Photoshop Flowey reference text if(sbFloweyTimer>420&&sbFloweyTimer<520){ const a4=Math.min(1,(sbFloweyTimer-420)/25)*Math.max(0,1-(sbFloweyTimer-480)/40); sbX.globalAlpha=a4; sbX.font=`bold ${Math.round(sbW*0.022)}px 'Courier New'`; sbX.fillStyle=wt>0.5?'#c00':'#ff6666'; sbX.shadowColor='rgba(255,0,0,0.6)'; sbX.shadowBlur=15; sbX.fillText('* W.D. Gaster hat seinen WILLEN verloren.',sbW/2,sbH*0.65); sbX.shadowBlur=0; sbX.globalAlpha=1; } sbX.textAlign='left'; // Unlock achievements if(sbFloweyTimer===60){ unlockAch('sb_win'); if(sbHitsTaken===0)unlockAch('sb_no_hit'); if(Date.now()-sbFightStart<240000)unlockAch('sb_speed'); if(sbTotalDeaths>0)unlockAch('sb_comeback'); if(sbPlayer&&sbPlayer.hp===1)unlockAch('sb_last_hp'); if(sbCaughtWords>=10)unlockAch('sb_all_caught'); sbApplyTheEndTheme(); } if(sbFloweyTimer>560){lockBody.style.opacity='1';sbCloseBoss();} }