<!DOCTYPE html><html lang="es"><head> <meta charset="UTF-8">  <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>ERROR 404 &middot; notengosuelto.com</title>  <meta name="robots" content="noindex, nofollow">
<style>
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}html,body{width:100%;height:100%;background:#1a3a8a;overflow:hidden;font-family:'Courier New',Courier,monospace;touch-action:none;user-select:none;-webkit-user-select:none}canvas{position:fixed;image-rendering:pixelated;image-rendering:crisp-edges;display:block}#ui{position:fixed;top:0;left:0;right:0;display:flex;justify-content:space-between;align-items:flex-start;padding:clamp(6px,1.2vw,14px) clamp(8px,1.8vw,20px);pointer-events:none;z-index:10;font-family:'Courier New',Courier,monospace;gap:clamp(6px,1.2vw,14px)}.hud-panel{background:rgba(255,255,255,0.92);border:3px solid #1a1128;box-shadow:3px 3px 0 #1a1128,inset -2px -2px 0 #d8e4f0,inset 2px 2px 0 #ffffff;padding:clamp(4px,0.8vw,8px) clamp(8px,1.4vw,14px);display:flex;align-items:center;gap:clamp(4px,0.8vw,10px);image-rendering:pixelated}.hud-left,.hud-right{flex-direction:column;align-items:flex-start;gap:clamp(2px,0.4vw,5px)}.hud-center{background:rgba(26,17,40,0.88);border-color:#F4C30A;box-shadow:3px 3px 0 #1a1128,inset -2px -2px 0 #8a6a10,inset 2px 2px 0 #ffe980}.hud-row{display:flex;align-items:baseline;gap:clamp(4px,0.8vw,8px);line-height:1}.hud-label{color:#6a5330;font-size:clamp(9px,1.3vw,13px);font-weight:bold;letter-spacing:1px;text-transform:uppercase}.hud-value{color:#1a1128;font-size:clamp(12px,2vw,20px);font-weight:bold;letter-spacing:1px;text-shadow:1px 1px 0 #d8e4f0;font-variant-numeric:tabular-nums;min-width:clamp(20px,3vw,40px);text-align:left}.hud-hearts{font-size:clamp(14px,2.4vw,24px);letter-spacing:clamp(2px,0.5vw,6px);line-height:1;filter:drop-shadow(2px 2px 0 rgba(0,0,0,0.4))}.hud-right{align-items:flex-end}.hud-right .hud-row{justify-content:flex-end}@media (max-width:500px){.hud-label{display:none}.hud-panel{padding:4px 8px}#ui{padding:4px 6px;gap:4px}}#bk{position:fixed;bottom:10px;left:50%;transform:translateX(-50%);color:#F4C30A;font-size:13px;text-decoration:none;border:2px solid #F4C30A;padding:3px 14px;border-radius:0;z-index:10;background:rgba(10,20,40,0.75);font-family:'Courier New',monospace;letter-spacing:1px;box-shadow:2px 2px 0 #000a}#bk:hover{color:#fff;border-color:#fff;background:rgba(0,20,40,0.9)}#portrait{display:none;position:fixed;inset:0;background:#0c1a30;color:#87ceeb;align-items:center;justify-content:center;flex-direction:column;gap:14px;z-index:200;text-align:center;padding:24px}.p404big{font-size:54px;font-weight:bold;color:#F4C30A;font-family:'Courier New',monospace;text-shadow:3px 3px 0 rgba(0,0,0,0.55)}.psite{font-size:11px;color:#5bb8e0;letter-spacing:2px;margin-top:-6px}.pmsg{font-size:13px;color:#ccd8e8}.port-actions{display:flex;gap:12px;margin-top:6px}.port-btn{color:#F4C30A;border:2px solid #F4C30A;padding:7px 20px;border-radius:0;text-decoration:none;font-size:13px;font-family:'Courier New',monospace;background:rgba(0,0,0,0.4)}.port-btn:hover{color:#fff;border-color:#fff}@media(orientation:portrait){#portrait{display:flex}}
</style></head>
<body><div id="portrait"> <div class="p404big">ERROR 404</div><div class="psite">notengosuelto.com</div><span style="font-size:40px">&#128241;</span><div class="pmsg">P&aacute;gina no encontrada.<br><strong>Gira el m&oacute;vil para jugar.</strong></div>
  <div class="port-actions"><a class="port-btn" href="/">&larr; Inicio</a></div>
</div>
<div id="ui"><div class="hud-panel hud-left"> <span id="sc" class="hud-value">0</span></div>
  <div class="hud-panel hud-center"><span id="lv-hearts" class="hud-hearts">&#10084;&#65039;&#10084;&#65039;&#10084;&#65039;</span></div>
  <div class="hud-panel hud-right"><div class="hud-row"><span id="lv" class="hud-value">1</span></div><div class="hud-row"><span id="hi" class="hud-value"></span></div></div>
</div><canvas id="g"></canvas><a id="bk" href="/">&larr; Ir a notengosuelto.com</a>
<script>"use strict";var PALETTE={skyTop:'#1a3a8a',skyMid1:'#2458b8',skyMid2:'#3d87d7',skyLow1:'#74b9ee',skyLow2:'#a8d8f5',skyHorizon:'#d4ecff',grassHi:'#4fae2a',grass:'#3d9220',grassMid:'#2d7418',grassLow:'#1a5508',stripeA:'#4aa525',stripeB:'#368119',horizonLine:'#e8f6ff',horizonGrass:'#6bc734',mountainFar:'#a9bfd0',mountainMid:'#7e96ab',mountainNear:'#4f6880',uiGold:'#F4C30A',uiGoldDark:'#C7A502',uiRed:'#cc3333',uiGreen:'#22aa44',uiText:'#1a1a00',uiWhite:'#ffffff',uiInk:'#1a1128',overlay:'rgba(10,20,40,0.72)'};var FONT_RETRO='bold 14px "Courier New", Courier, monospace';var FONT_RETRO_BIG='bold 18px "Courier New", Courier, monospace';var FONT_RETRO_HUGE='bold 40px "Courier New", Courier, monospace';var IW=800,IH=320,GROUND=248;var PL_W=44,PL_H=40,PL_HX=5,PL_HY=5;var OT_NEWS=0,OT_COOKIE=1,OT_APP=2,OT_ZOMBIE=3,OT_RATE=4;var OBS_DEF_W=[80,106,90,46,82];var OBS_DEF_H=[108,75,100,80,92];var OBS_DEF_SM=[1.0,1.0,1.0,0.9,1.0];var GRAVITY=2600,JUMP_VY_MIN=-680,JUMP_VY_MAX=-980;var JUMP_HOLD_BST=3000,JUMP_HOLD_MAX=0.16,FLAPPY_BOOST=-360;var COYOTE_TIME=0.08,GOLDEN_DUR=5.0,BUBBLE_DUR=1.8;var INVINCIBLE_DUR=1.2,DT_CAP=0.05,MAX_LIVES=3;var LEVELS=[[0,290],[200,342],[500,392],[900,438],[1500,478]];var SKY_MESSAGES=["Buscabas chollos? Ve a portada","ERROR 404 - notengosuelto.com","Sin anuncios. Sin cookies. Sin cuenta.","Sin pop-up. Sin newsletter. Sin tracking","No tengo suelto."];var PIXEL_SIZE=4;var BAYER4=[[0,8,2,10],[12,4,14,6],[3,11,1,9],[15,7,13,5]];var SKY_BANDS=[{stop:0.00,color:PALETTE.skyTop},{stop:0.22,color:PALETTE.skyMid1},{stop:0.45,color:PALETTE.skyMid2},{stop:0.70,color:PALETTE.skyLow1},{stop:0.90,color:PALETTE.skyLow2},{stop:1.00,color:PALETTE.skyHorizon}];var GROUND_BANDS=[{stop:0.00,color:PALETTE.grassHi},{stop:0.25,color:PALETTE.grass},{stop:0.55,color:PALETTE.grassMid},{stop:1.00,color:PALETTE.grassLow}];var canvas=document.getElementById('g');var ctx=canvas.getContext('2d');canvas.width=IW;canvas.height=IH;function fitCanvas() {try {var sw=window.innerWidth,sh=window.innerHeight;var s=Math.max(1,Math.floor(Math.min(sw/IW,sh/IH)));var cw=IW*s,ch=IH*s;canvas.width=IW;canvas.height=IH;canvas.style.width=cw+'px';canvas.style.height=ch+'px';canvas.style.left=Math.round((sw-cw)/2)+'px';canvas.style.top=Math.round((sh-ch)/2)+'px';canvas.style.position='fixed';ctx.setTransform(1,0,0,1,0,0);ctx.imageSmoothingEnabled=false;} catch (e) {console.error('[404] fitCanvas:',e&&e.message?e.message:'unknown');}} fitCanvas();try {new ResizeObserver(fitCanvas).observe(document.documentElement);} catch (e) {window.addEventListener('resize',fitCanvas);} var scoreEl=document.getElementById('sc');var heartsEl=document.getElementById('lv-hearts');var levelEl=document.getElementById('lv');var hiEl=document.getElementById('hi');function renderHearts(n) {var s='';for (var i=0;i<MAX_LIVES;i++) s+=i<n?'\u2764\uFE0F':'\uD83D\uDDA4';heartsEl.textContent=s;} function R(x,y,w,h,c) {ctx.fillStyle=c;ctx.fillRect(x|0,y|0,w|0,h|0);} function pxSnap(v) {return Math.floor(v/PIXEL_SIZE)*PIXEL_SIZE;} function bandColor(bands,t) {for (var i=0;i<bands.length-1;i++) {if (t<=bands[i+1].stop) return bands[i].color;} return bands[bands.length-1].color;} function shade(hex,factor) {if (typeof hex!=='string'||hex.charAt(0)!=='#'||hex.length<7) {return'#888888';} var r=parseInt(hex.slice(1,3),16);var g=parseInt(hex.slice(3,5),16);var b=parseInt(hex.slice(5,7),16);if (isNaN(r)||isNaN(g)||isNaN(b)) return'#888888';var q=function (c) {var v=Math.round(c*factor);if (v<0) v=0;else if (v>255) v=255;v=Math.round(v/8)*8;return v;};var toHex=function (n) {var s=n.toString(16);return s.length===1?'0'+s:s;};return'#'+toHex(q(r))+toHex(q(g))+toHex(q(b));} var STRIP_W=IW*2;var bgCanvas=document.createElement('canvas');bgCanvas.width=IW;bgCanvas.height=IH;var bgCtx=bgCanvas.getContext('2d');function bakeBlissSky(c) {var grad=c.createLinearGradient(0,0,0,GROUND);grad.addColorStop(0.00,'#1e5bbf');grad.addColorStop(0.35,'#3a82d8');grad.addColorStop(0.70,'#7fb8ee');grad.addColorStop(1.00,'#cfe5f7');c.fillStyle=grad;c.fillRect(0,0,IW,GROUND);} bakeBlissSky(bgCtx);var hillFarStrip=document.createElement('canvas');hillFarStrip.width=STRIP_W;hillFarStrip.height=IH;var hillFarCtx=hillFarStrip.getContext('2d');var hillNearStrip=document.createElement('canvas');hillNearStrip.width=STRIP_W;hillNearStrip.height=IH;var hillNearCtx=hillNearStrip.getContext('2d');function bakeBlissHills(c,baseY,amp1,freq1,amp2,freq2,colorTop,colorBot,shadowColor) {var grad=c.createLinearGradient(0,baseY-amp1-amp2,0,IH);grad.addColorStop(0.00,colorTop);grad.addColorStop(1.00,colorBot);c.fillStyle=grad;c.beginPath();c.moveTo(0,IH);for (var x=0;x<=STRIP_W;x+=2) {var y=baseY-Math.sin(x*freq1)*amp1-Math.sin(x*freq2+1.3)*amp2;c.lineTo(x,y);} c.lineTo(STRIP_W,IH);c.closePath();c.fill();c.save();c.globalAlpha=0.55;c.strokeStyle=shadowColor;c.lineWidth=1;c.beginPath();for (var xx=0;xx<=STRIP_W;xx+=2) {var yy=baseY-Math.sin(xx*freq1)*amp1-Math.sin(xx*freq2+1.3)*amp2+2;if (xx===0) c.moveTo(xx,yy);else c.lineTo(xx,yy);} c.stroke();c.restore();} bakeBlissHills(hillFarCtx,GROUND+18,14,0.006,5,0.015,'#8cbc6a','#6a9a48','#a0c878');bakeBlissHills(hillNearCtx,GROUND-2,30,0.007,11,0.019,'#5ba828','#2d6815','#7cb840');var farStrip=document.createElement('canvas');farStrip.width=STRIP_W;farStrip.height=IH;var farCtx=farStrip.getContext('2d');var midStrip=document.createElement('canvas');midStrip.width=STRIP_W;midStrip.height=IH;var midCtx=midStrip.getContext('2d');function drawBlissCloud(c,cx,cy,scale,alpha) {var PX=Math.max(3,Math.round(4*scale));var pattern=[[0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0],[0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0],[0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[0,2,2,1,1,1,1,1,1,1,1,1,1,2,2,0],[0,0,0,2,2,2,2,1,1,1,1,2,2,0,0,0]];var rows=pattern.length;var cols=pattern[0].length;var ox=Math.round(cx-(cols*PX)/2);var oy=Math.round(cy-(rows*PX)/2);c.save();c.globalAlpha=alpha;for (var ry=0;ry<rows;ry++) {for (var rx=0;rx<cols;rx++) {var v=pattern[ry][rx];if (v===0) continue;c.fillStyle=(v===1)?'#ffffff':'#d8e4f0';c.fillRect(ox+rx*PX,oy+ry*PX,PX,PX);}} c.restore();} (function bakeClouds() {var farSeeds=[[80,40,1.1],[260,28,0.9],[460,50,1.3],[680,35,1.0],[920,45,1.1],[1180,30,0.95],[1420,55,1.2]];var midSeeds=[[140,65,1.4],[380,55,1.2],[640,70,1.5],[880,50,1.3],[1140,75,1.4],[1380,60,1.25]];for (var k=0;k<farSeeds.length;k++) {drawBlissCloud(farCtx,farSeeds[k][0],farSeeds[k][1],farSeeds[k][2],0.75);} for (var m=0;m<midSeeds.length;m++) {drawBlissCloud(midCtx,midSeeds[m][0],midSeeds[m][1],midSeeds[m][2],0.9);}})();var GROUND_STRIPE_H=8;var GROUND_STRIPE_W=48;var groundStrip=document.createElement('canvas');groundStrip.width=STRIP_W;groundStrip.height=GROUND_STRIPE_H;(function bakeGroundStrip() {var gsCtx=groundStrip.getContext('2d');for (var gi=0;gi<STRIP_W/GROUND_STRIPE_W;gi++) {gsCtx.fillStyle=((gi&1)===0)?'#5ba828':'#4a8f20';gsCtx.fillRect(gi*GROUND_STRIPE_W,0,GROUND_STRIPE_W,GROUND_STRIPE_H);}})();ctx.font=FONT_RETRO;var MSG_WIDTHS=new Float32Array(SKY_MESSAGES.length);for (var _m=0;_m<SKY_MESSAGES.length;_m++) {MSG_WIDTHS[_m]=ctx.measureText(SKY_MESSAGES[_m]).width;} var GS={IDLE:0,PLAYING:1,DEAD:2};var gameState=GS.IDLE;var score=0,hiScore=0,lives=MAX_LIVES;var speed=LEVELS[0][1],currentLevel=0,lastTime=0;var farScrollX=0,midScrollX=0,groundScrollX=0;var hillFarScrollX=0,hillNearScrollX=0;var chargeNextT=20+Math.random()*8;var chargePendingT=0;var chargeIsActive=false;var chargeObsType=0;var chargeSpawned=false;var redVignetteT=0;var shakeT=0,shakeAmp=0;var lvFlashT=0,lvFlashNum=1;var bubbleT=0,invincibleT=0,zombieFlashT=0,lifeGainFlashT=0;var obsTimer=1.8,amzTimer=16+Math.random()*8;var msgTimer=6,msgNextI=0;var cursorVelBias=0;var pl={x:110,y:GROUND-PL_H,vy:0,golden:false,goldenT:0,animFrame:0,animT:0,dead:false,worried:false};var isJumping=false,jumpHeld=false,jumpHoldT=0;var flappyAvail=false,flappyForced=false;var coyoteT=0,lastTapTime=0,jumpPressQ=false;var SL_N=10;var sl_x=new Float32Array(SL_N);var sl_y=new Float32Array(SL_N);var sl_len=new Float32Array(SL_N);for (var _i=0;_i<SL_N;_i++) {sl_x[_i]=Math.random()*IW;sl_y[_i]=8+Math.random()*(GROUND-16);sl_len[_i]=60+Math.random()*160;} var OBS_N=8;var obs_active=new Uint8Array(OBS_N);var obs_type=new Uint8Array(OBS_N);var obs_x=new Float32Array(OBS_N);var obs_y=new Float32Array(OBS_N);var obs_w=new Float32Array(OBS_N);var obs_h=new Float32Array(OBS_N);var obs_smult=new Float32Array(OBS_N);var obs_dodged=new Uint8Array(OBS_N);var obs_seen=new Uint8Array(OBS_N);var obs_seed=new Uint8Array(OBS_N);var COIN_N=16;var coin_act=new Uint8Array(COIN_N);var coin_coll=new Uint8Array(COIN_N);var coin_x=new Float32Array(COIN_N);var coin_y=new Float32Array(COIN_N);var coin_anim=new Float32Array(COIN_N);var CPN_N=2;var cpn_act=new Uint8Array(CPN_N);var cpn_x=new Float32Array(CPN_N);var cpn_y=new Float32Array(CPN_N);var AMZ_N=3,AMZ_W=118,AMZ_H=26;var amz_act=new Uint8Array(AMZ_N);var amz_x=new Float32Array(AMZ_N);var amz_baseY=new Float32Array(AMZ_N);var amz_bobT=new Float32Array(AMZ_N);var amz_flashT=new Float32Array(AMZ_N);var MSG_N=2;var msg_act=new Uint8Array(MSG_N);var msg_x=new Float32Array(MSG_N);var msg_y=new Float32Array(MSG_N);var msg_idx=new Uint8Array(MSG_N);function freeObs() {for (var i=0;i<OBS_N;i++) if (!obs_active[i]) return i;return-1;} function freeCoin() {for (var i=0;i<COIN_N;i++) if (!coin_act[i]) return i;return-1;} function freeCpn() {for (var i=0;i<CPN_N;i++) if (!cpn_act[i]) return i;return-1;} function freeAmz() {for (var i=0;i<AMZ_N;i++) if (!amz_act[i]) return i;return-1;} function freeMsg() {for (var i=0;i<MSG_N;i++) if (!msg_act[i]) return i;return-1;} function resetGame() {pl.x=110;pl.y=GROUND-PL_H;pl.vy=0;firstZombieSpawned=false;pl.golden=false;pl.goldenT=0;pl.animFrame=0;pl.animT=0;pl.dead=false;pl.worried=false;isJumping=false;jumpHeld=false;jumpHoldT=0;flappyAvail=false;flappyForced=false;coyoteT=0;lastTapTime=0;speed=LEVELS[0][1];score=0;lives=MAX_LIVES;currentLevel=0;farScrollX=0;midScrollX=0;groundScrollX=0;hillFarScrollX=0;hillNearScrollX=0;obsTimer=1.8;amzTimer=16+Math.random()*8;msgTimer=6;msgNextI=0;chargeNextT=20+Math.random()*8;chargePendingT=0;chargeIsActive=false;chargeSpawned=false;redVignetteT=0;shakeT=0;shakeAmp=0;lvFlashT=0;bubbleT=0;invincibleT=0;zombieFlashT=0;lifeGainFlashT=0;cursorVelBias=0;obs_active.fill(0);obs_dodged.fill(0);obs_seen.fill(0);coin_act.fill(0);coin_coll.fill(0);cpn_act.fill(0);amz_act.fill(0);msg_act.fill(0);scoreEl.textContent='PUNTOS: 0';levelEl.textContent='NIVEL 1';renderHearts(MAX_LIVES);} var firstZombieSpawned=false;function spawnObstacle(forceType,smultOvr) {var slot=freeObs();if (slot===-1) return;var t;if (forceType!==undefined) {t=forceType;} else {if (!firstZombieSpawned) {if (Math.random()<0.35) {t=OT_ZOMBIE;firstZombieSpawned=true;} else {var r=Math.random();t=(r<0.28?OT_NEWS:r<0.54?OT_COOKIE:r<0.74?OT_APP:r<0.88?OT_RATE:OT_ZOMBIE);if (t===OT_ZOMBIE) firstZombieSpawned=true;}} else {var r=Math.random();t=(r<0.28?OT_NEWS:r<0.54?OT_COOKIE:r<0.74?OT_APP:r<0.88?OT_RATE:OT_ZOMBIE);}} obs_active[slot]=1;obs_type[slot]=t;obs_x[slot]=IW+12;obs_w[slot]=OBS_DEF_W[t];obs_h[slot]=OBS_DEF_H[t];obs_y[slot]=GROUND-OBS_DEF_H[t];if (t===OT_COOKIE) obs_y[slot]-=4;obs_smult[slot]=(smultOvr!==undefined)?smultOvr:OBS_DEF_SM[t];obs_dodged[slot]=0;obs_seen[slot]=0;obs_seed[slot]=(Math.random()*255)|0;if (t!==OT_ZOMBIE) {spawnCoinArc(IW+12+OBS_DEF_W[t]*0.5,obs_y[slot]-16,t);}} function spawnCoinArc(cX,topY,obsType) {var arcH=(obsType===OT_COOKIE)?48:(obsType===-1?78:82);var count=(obsType===-1)?6:4;for (var i=0;i<count;i++) {var slot=freeCoin();if (slot===-1) break;var tt=i/(count-1);var p=1-(2*tt-1)*(2*tt-1);coin_act[slot]=1;coin_coll[slot]=0;coin_anim[slot]=0;coin_x[slot]=cX-(count*17)+i*36;coin_y[slot]=topY-p*arcH;}} function spawnCoupon() {var slot=freeCpn();if (slot===-1) return;cpn_act[slot]=1;cpn_x[slot]=IW+12;cpn_y[slot]=GROUND-120;} function spawnAmazonButton() {var slot=freeAmz();if (slot===-1) return;amz_act[slot]=1;amz_x[slot]=IW+12;amz_baseY[slot]=GROUND-125+(Math.random()-0.5)*24;amz_bobT[slot]=Math.random()*6.28;amz_flashT[slot]=0;} function spawnSkyMessage() {var slot=freeMsg();if (slot===-1) return;msg_act[slot]=1;msg_x[slot]=IW+20;msg_y[slot]=14+Math.random()*44;msg_idx[slot]=msgNextI%SKY_MESSAGES.length;msgNextI++;} document.addEventListener('keydown',function (e) {if ((e.code==='Space'||e.code==='ArrowUp')&&!e.repeat) {e.preventDefault();jumpPressQ=true;jumpHeld=true;} if (e.code==='Escape'&&gameState!==GS.IDLE) {gameState=GS.IDLE;resetGame();}});document.addEventListener('keyup',function (e) {if (e.code==='Space'||e.code==='ArrowUp') jumpHeld=false;});canvas.addEventListener('touchstart',function (e) {e.preventDefault();jumpPressQ=true;jumpHeld=true;},{passive:false});canvas.addEventListener('touchend',function (e) {e.preventDefault();jumpHeld=false;},{passive:false});canvas.addEventListener('click',function () {jumpPressQ=true;});window.addEventListener('mousemove',function (e) {var norm=(e.clientX/window.innerWidth)*2-1;cursorVelBias=norm*38;});window.addEventListener('mouseleave',function () {cursorVelBias=0;});function processInput() {if (!jumpPressQ) return;jumpPressQ=false;if (gameState===GS.IDLE) {resetGame();gameState=GS.PLAYING;lastTime=performance.now();pl.vy=JUMP_VY_MIN;jumpHoldT=0;isJumping=true;flappyAvail=true;flappyForced=false;lastTapTime=performance.now();coyoteT=0;return;} if (gameState===GS.DEAD) {gameState=GS.IDLE;return;} var now=performance.now();if (coyoteT>0&&!isJumping) {pl.vy=JUMP_VY_MIN;jumpHoldT=0;isJumping=true;flappyAvail=true;flappyForced=false;coyoteT=0;lastTapTime=now;} else if (flappyAvail&&(flappyForced||(now-lastTapTime)<280)) {pl.vy=pl.vy+FLAPPY_BOOST;if (pl.vy<JUMP_VY_MAX) pl.vy=JUMP_VY_MAX;flappyAvail=false;flappyForced=false;lastTapTime=now;triggerShake(1.5,0.06);}} function aabb(ax,ay,aw,ah,bx,by,bw,bh) {return ax<bx+bw&&ax+aw>bx&&ay<by+bh&&ay+ah>by;} function triggerShake(amp,dur) {shakeAmp=amp;shakeT=dur;} function triggerLevelUp(n) {lvFlashT=1.6;lvFlashNum=n;} function triggerBubble() {bubbleT=BUBBLE_DUR;} function loseLife() {lives--;renderHearts(lives);if (lives<=0) {pl.dead=true;gameState=GS.DEAD;triggerShake(9,0.35);if (score>hiScore) {hiScore=score;hiEl.textContent='RECORD: '+(hiScore|0);}} else {invincibleT=INVINCIBLE_DUR*1.8;triggerShake(6,0.22);zombieFlashT=0.4;}} function gainLife() {if (lives<MAX_LIVES) {lives++;renderHearts(lives);lifeGainFlashT=0.9;}} function update(dt) {var wasOnGround=pl.y>=GROUND-PL_H-1;coyoteT=wasOnGround?COYOTE_TIME:Math.max(0,coyoteT-dt);processInput();if (jumpHeld&&isJumping&&pl.vy<0) {jumpHoldT+=dt;if (jumpHoldT<JUMP_HOLD_MAX) {pl.vy-=JUMP_HOLD_BST*dt;if (pl.vy<JUMP_VY_MAX) pl.vy=JUMP_VY_MAX;}} pl.vy+=GRAVITY*dt;pl.y+=pl.vy*dt;if (pl.y>=GROUND-PL_H) {pl.y=GROUND-PL_H;pl.vy=0;if (isJumping) {isJumping=false;flappyAvail=false;flappyForced=false;}} pl.animT+=dt;if (pl.animT>=0.11) {pl.animT=0;pl.animFrame^=1;} if (pl.golden) {pl.goldenT-=dt;if (pl.goldenT<=0) {pl.golden=false;pl.goldenT=0;}} if (invincibleT>0) invincibleT-=dt;if (zombieFlashT>0) zombieFlashT-=dt;if (bubbleT>0) bubbleT-=dt;if (lifeGainFlashT>0) lifeGainFlashT-=dt;pl.worried=chargeIsActive;var i;while (currentLevel<LEVELS.length-1&&score>=LEVELS[currentLevel+1][0]) {currentLevel++;speed=LEVELS[currentLevel][1];triggerLevelUp(currentLevel+1);levelEl.textContent='NIVEL '+(currentLevel+1);} var effSpeed=speed+cursorVelBias;chargeNextT-=dt;if (chargeNextT<=0&&!chargeIsActive&&!chargeSpawned) {chargeIsActive=true;chargePendingT=0.48;chargeSpawned=false;var cr=Math.random();chargeObsType=cr<0.4?OT_NEWS:cr<0.7?OT_APP:OT_RATE;chargeNextT=9999;} if (chargeIsActive) {chargePendingT-=dt;if (chargePendingT<=0) {chargeIsActive=false;chargeSpawned=true;redVignetteT=0.9;spawnObstacle(chargeObsType,2.3);chargeNextT=20+Math.random()*14;}} if (chargeSpawned&&!chargeIsActive&&chargeNextT<9999) chargeSpawned=false;if (redVignetteT>0) redVignetteT-=dt;if (lvFlashT>0) lvFlashT-=dt;if (shakeT>0) shakeT-=dt;farScrollX-=effSpeed*0.05*dt;if (farScrollX<=-IW) farScrollX+=IW;midScrollX-=effSpeed*0.18*dt;if (midScrollX<=-IW) midScrollX+=IW;hillFarScrollX-=effSpeed*0.30*dt;if (hillFarScrollX<=-IW) hillFarScrollX+=IW;hillNearScrollX-=effSpeed*0.55*dt;if (hillNearScrollX<=-IW) hillNearScrollX+=IW;var STRIPE_SPEED=54;groundScrollX+=(effSpeed/300)*STRIPE_SPEED*dt;var slSpd=effSpeed*2.6+120;for (i=0;i<SL_N;i++) {sl_x[i]-=slSpd*dt;if (sl_x[i]+sl_len[i]<0) {sl_x[i]=IW+Math.random()*80;sl_y[i]=8+Math.random()*(GROUND-16);sl_len[i]=60+Math.random()*160;}} for (i=0;i<MSG_N;i++) {if (msg_act[i]) {msg_x[i]-=effSpeed*0.12*dt;if (msg_x[i]+(MSG_WIDTHS[msg_idx[i]]+24)<0) msg_act[i]=0;}} score+=effSpeed*dt*0.05;scoreEl.textContent='PUNTOS: '+(score|0);obsTimer-=dt;if (obsTimer<=0) {if (!chargeIsActive) spawnObstacle();var tf=currentLevel/(LEVELS.length-1);obsTimer=2.5-tf*1.0+(Math.random()*0.5-0.25);if (obsTimer<0.9) obsTimer=0.9;} amzTimer-=dt;if (amzTimer<=0) {spawnAmazonButton();amzTimer=14+Math.random()*10;} msgTimer-=dt;if (msgTimer<=0) {spawnSkyMessage();msgTimer=9+Math.random()*6;} var phx=pl.x+PL_HX,phy=pl.y+PL_HY;var phw=PL_W-PL_HX*2,phh=PL_H-PL_HY;var activeInZone=0;for (i=0;i<OBS_N;i++) {if (!obs_active[i]) continue;if (obs_x[i]<pl.x+PL_W+60&&obs_x[i]+obs_w[i]>pl.x-60) activeInZone++;} for (i=0;i<OBS_N;i++) {if (!obs_active[i]) continue;obs_x[i]-=effSpeed*obs_smult[i]*dt;if (obs_x[i]+obs_w[i]<0) {obs_active[i]=0;obs_dodged[i]=0;continue;} if (obs_dodged[i]===0&&obs_x[i]+obs_w[i]<pl.x) {obs_dodged[i]=1;if (obs_type[i]===OT_ZOMBIE) triggerBubble();if (activeInZone>=2) gainLife();} if (pl.golden||invincibleT>0) continue;var hit=aabb(phx,phy,phw,phh,obs_x[i]+5,obs_y[i]+4,obs_w[i]-10,obs_h[i]-4);if (hit) {if (obs_type[i]===OT_ZOMBIE) {score=Math.max(0,score-20);scoreEl.textContent='PUNTOS: '+(score|0);invincibleT=INVINCIBLE_DUR;zombieFlashT=0.35;triggerShake(4,0.14);obs_active[i]=0;} else {obs_active[i]=0;loseLife();}}} for (i=0;i<COIN_N;i++) {if (!coin_act[i]) continue;coin_x[i]-=effSpeed*dt;if (pl.golden) {var dx=(pl.x+PL_W*0.5)-coin_x[i];var dy=(pl.y+PL_H*0.5)-coin_y[i];var d=Math.sqrt(dx*dx+dy*dy)+1;coin_x[i]+=(dx/d)*400*dt;coin_y[i]+=(dy/d)*400*dt;} if (coin_x[i]+14<0) {coin_act[i]=0;continue;} if (!coin_coll[i]&&aabb(phx,phy,phw,phh,coin_x[i]-11,coin_y[i]-11,22,22)) {coin_coll[i]=1;score+=5;} if (coin_coll[i]) {coin_anim[i]+=dt*3;if (coin_anim[i]>=1) {coin_act[i]=0;coin_anim[i]=0;}}} for (i=0;i<CPN_N;i++) {if (!cpn_act[i]) continue;cpn_x[i]-=effSpeed*dt;if (cpn_x[i]+44<0) {cpn_act[i]=0;continue;} if (aabb(phx,phy,phw,phh,cpn_x[i]-20,cpn_y[i]-14,40,28)) {cpn_act[i]=0;pl.golden=true;pl.goldenT=GOLDEN_DUR;}} for (i=0;i<AMZ_N;i++) {if (!amz_act[i]) continue;amz_x[i]-=effSpeed*dt;amz_bobT[i]+=dt*2.4;if (amz_flashT[i]>0) amz_flashT[i]-=dt;if (amz_x[i]+AMZ_W<0) {amz_act[i]=0;continue;} var bY=amz_baseY[i]+Math.sin(amz_bobT[i])*10;var pBot=pl.y+PL_H;if (!pl.golden&&pl.vy>=-20&&pBot>=bY-5&&pBot<=bY+14&&pl.x+PL_W-8>amz_x[i]&&pl.x+8<amz_x[i]+AMZ_W) {pl.y=bY-PL_H;pl.vy=-640;isJumping=true;flappyAvail=true;flappyForced=true;coyoteT=0;amz_flashT[i]=0.45;spawnCoinArc(amz_x[i]+AMZ_W*0.5,bY-88,-1);}}} function drawPiggy(x,y,frame,golden,worried) {var xr=x|0,yr=y|0;var body=golden?'#FFD700':'#ffb6c8';var shade2=golden?'#c8a000':'#e8789a';var hi=golden?'#ffe980':'#ffd0dc';var nose=golden?'#e0b400':'#ff8aaa';var dark=PALETTE.uiInk;var white=PALETTE.uiWhite;var t=performance.now()/300;var bob=(Math.sin(t)*1.5)|0;var ear=(Math.sin(t*1.3)*1)|0;var tw=(Math.sin(t*2)>0)?1:0;var ex=(Math.sin(t*0.9)*1)|0;var blink=(Math.sin(t*0.7)>0.92);R(xr+6,yr+14+bob,34,22,body);R(xr+10,yr+10+bob,24,10,body);R(xr+12,yr+32+bob,20,8,shade2);R(xr+34,yr+18+bob,10,12,body);R(xr+40,yr+22+bob,10,8,nose);R(xr+40,yr+30+bob,10,2,shade2);R(xr+46,yr+25+bob,3,3,dark);R(xr+47,yr+26+bob,1,1,shade2);if (blink) {R(xr+30,yr+20+bob,6,2,dark);} else if (worried) {R(xr+30,yr+18+bob,6,3,dark);R(xr+32,yr+18+bob,2,2,white);} else {R(xr+30+ex,yr+18+bob,6,6,dark);R(xr+32+ex,yr+20+bob,2,2,white);} R(xr+28,yr+6+ear+bob,8,8,body);R(xr+30,yr+8+ear+bob,4,4,shade2);R(xr+18,yr+8+bob,6,6,shade2);if (frame===0) {R(xr+12,yr+36+bob,8,8,shade2);R(xr+26,yr+38+bob,8,6,shade2);} else {R(xr+12,yr+38+bob,8,6,shade2);R(xr+26,yr+36+bob,8,8,shade2);} R(xr+34,yr+26+bob,5,4,'#ffaabb');R(xr+4+tw,yr+22+bob,3,3,shade2);R(xr+2+tw,yr+24+bob,3,3,shade2);R(xr+4+tw,yr+26+bob,3,3,shade2);R(xr+14,yr+12+bob,10,4,hi);R(xr+18,yr+10+bob,10,2,dark);if (golden) {var ts=performance.now()/260;var sx=[xr-6,xr+52,xr+20,xr-2,xr+46];var sy=[yr+10,yr+6,yr-6,yr+40,yr+44];for (var k=0;k<5;k++) {if (Math.sin(ts+k*1.2)>0.3) R(sx[k],sy[k],3,3,'#FFE840');}}} function drawZombie(x,y,frame,seed) {var xr=x|0,yr=y|0;var skin='#8cb87a',darkSkin='#527040';var shirt='#3a6038',pant='#2a4028';var dark=PALETTE.uiInk;var blood='#cc1111',bloodHi='#ff4444';var ztitles=['Dame 1€','89% más barato','¡¡Chollazo!!','Corre que se agotan','Prueba Zombie Premium','Activa Recurrente','Activa Notificaciones','Activa Alertas'];var text=ztitles[seed%ztitles.length];var t=performance.now()*0.003+seed*0.37;var bob=Math.sin(t*1.15)*2+Math.sin(t*2.3)*0.6;var sway=Math.sin(t*0.82)*2;var lean=-2+Math.sin(t*0.55)*3;var headLag=Math.sin(t*0.55-0.45)*3;var armJerk=Math.sin(t*3.7)*1.5;var twitch=Math.sin(t*9+seed*1.7)>0.94?2:0;var legFront=frame===0?1:-2;var legBack=frame===0?-2:1;R(xr+14+lean*0.15,yr+46+bob+legFront,10,20,pant);R(xr+4+lean*0.15,yr+48+bob+legBack,10,18,pant);R(xr+14+lean*0.15,yr+64+bob+legFront,10,4,darkSkin);R(xr+4+lean*0.15,yr+64+bob+legBack,10,4,darkSkin);R(xr+8+sway-2,yr+20+bob,22,26,shirt);R(xr+20+sway,yr+24+bob+1,8,16,shirt);R(xr+22+sway,yr+38+bob+2,6,10,skin);var reach=5+Math.sin(t*1.05)*2+armJerk;R(xr-10-reach,yr+24+bob+twitch,18,8,shirt);R(xr-22-reach,yr+22+bob+twitch,12,10,skin);R(xr-26-reach,yr+24+bob+twitch,6,6,skin);R(xr-2+lean*0.3,yr+4+bob+headLag,20,18,skin);R(xr+0+lean*0.3,yr+6+bob+headLag,16,14,skin);R(xr+2+lean*0.3,yr+10+bob+headLag,5,5,blood);R(xr+10+lean*0.3,yr+12+bob+headLag,5,5,blood);R(xr+3+lean*0.3,yr+11+bob+headLag,2,2,bloodHi);R(xr+11+lean*0.3,yr+13+bob+headLag,2,2,bloodHi);R(xr+4+lean*0.3,yr+18+bob+headLag,8,3,dark);R(xr+12+sway,yr+30+bob,4,6,darkSkin);ctx.save();ctx.font=FONT_RETRO;var metrics=ctx.measureText(text);var padX=6;var bw=Math.max(26,Math.ceil(metrics.width)+padX*2);var bh=18;var bx=Math.round(xr+8-bw/2+sway+lean*0.4);var by=Math.round(yr-16+bob+headLag*0.6-4);ctx.fillStyle='#fffde7';ctx.fillRect(bx,by,bw,bh);ctx.fillRect(bx+10,by+bh,6,3);ctx.fillRect(bx+14,by+bh+3,4,3);ctx.strokeStyle='#666';ctx.lineWidth=1;ctx.strokeRect(bx+0.5,by+0.5,bw,bh);ctx.fillStyle='#222';ctx.textAlign='center';ctx.textBaseline='middle';ctx.fillText(text,bx+bw/2,by+bh/2+1);ctx.restore();} function drawNewsletterPopup(x,y,w,h,seed) {var xr=x|0,yr=y|0;R(xr+4,yr+4,w,h,'#00000044');var hues=['#2a5bbf','#5a2abf','#2a8abf','#3a6bcf','#bf2a5b'];R(xr,yr,w,h,'#f2f0e8');R(xr,yr,w,22,hues[seed%hues.length]);R(xr+w-16,yr+4,12,12,PALETTE.uiRed);ctx.fillStyle='#fff';ctx.font='bold 8px monospace';ctx.fillText('X',xr+w-13,yr+13);var titles=['EMAIL','TU TFNO','CAPTCHA','+CHOLLOS','VERIFICA','ALERTAS'];ctx.fillStyle=PALETTE.uiGold;ctx.font='bold 13px monospace';ctx.textAlign='center';ctx.textBaseline='middle';ctx.fillText(titles[seed%titles.length],xr+w/2-8,yr+11);ctx.textAlign='left';ctx.textBaseline='alphabetic';R(xr+6,yr+28,w-12,4,'#bbb');R(xr+6,yr+36,w-18,4,'#ccc');R(xr+6,yr+44,w-22,4,'#ddd');R(xr+6,yr+54,w-12,16,'#fff');ctx.strokeStyle='#999';ctx.lineWidth=1;ctx.strokeRect(xr+6,yr+54,w-12,16);ctx.fillStyle='#bbb';ctx.font='7px monospace';ctx.fillText('tu@email.com',xr+10,yr+65);var ctaCol=['#cc3333','#27ae60','#e67e22','#8e44ad','#c0392b'];R(xr+6,yr+74,w-12,18,ctaCol[seed%ctaCol.length]);ctx.fillStyle='#fff';ctx.font='bold 7px monospace';var ctas=['SEGUIR','ALERTAS','CONFIRMA','UNETE','ENVIAR','AVISOS','VENDE ALMA'];ctx.fillText(ctas[seed%ctas.length],xr+11,yr+86);ctx.fillStyle='#aaa';ctx.font='6px monospace';ctx.fillText('No gracias',xr+20,yr+102);} function drawCookieBanner(x,y,w,h,seed) {var xr=x|0,yr=y|0;var bgCols=['#fffdf9','#fffaf6','#fffdf8','#fff9f4'];var headCols=['#f1e6d2','#efe3d6','#f3e8d8','#eee4d4'];var btnCols=['#ffd54f','#ffcf47','#ffd24a','#ffd85a'];var bg=bgCols[seed&3];var head=headCols[seed&3];var btn=btnCols[seed&3];var border='#cfc6b5';var shadowCol='#00000022';var titleCol='#6a5330';var textCol='#8a8478';var line1='#bdb5a8';var line2='#d5cec3';var cookieCol='#c98a45';var cookieEdge='#9d6832';var chipCol='#6f421e';var btnBorder='#c29a18';var btnText='#5b4300';var closeCol='#a59b8c';var headerH=14,pad=4,btnH=16;var btnY=yr+h-btnH-3;var iconZoneW=Math.max(22,Math.min(30,((w*0.22)|0)));var bodyX=xr+iconZoneW+4;var bodyW=w-iconZoneW-8;function bigCookie(cx,cy,r) {ctx.fillStyle=cookieCol;ctx.beginPath();ctx.arc(cx,cy,r,0,Math.PI*2);ctx.fill();ctx.fillStyle=bg;ctx.beginPath();ctx.arc(cx+r*0.66,cy-r*0.58,r*0.36,0,Math.PI*2);ctx.arc(cx+r*0.26,cy-r*0.92,r*0.20,0,Math.PI*2);ctx.fill();ctx.fillStyle=chipCol;ctx.beginPath();ctx.arc(cx-r*0.38,cy-r*0.34,1.2,0,Math.PI*2);ctx.arc(cx-r*0.10,cy-r*0.02,1.3,0,Math.PI*2);ctx.arc(cx+r*0.20,cy+r*0.18,1.2,0,Math.PI*2);ctx.arc(cx-r*0.22,cy+r*0.30,1.2,0,Math.PI*2);ctx.arc(cx+r*0.02,cy-r*0.42,1.0,0,Math.PI*2);ctx.fill();ctx.strokeStyle=cookieEdge;ctx.lineWidth=1;ctx.beginPath();ctx.arc(cx,cy,r-0.5,0,Math.PI*2);ctx.stroke();} R(xr+2,yr+2,w,h,shadowCol);R(xr,yr,w,h,bg);R(xr,yr,w,1,border);R(xr,yr+h-1,w,1,border);R(xr,yr,1,h,border);R(xr+w-1,yr,1,h,border);R(xr,yr,w,headerH,head);R(xr,yr+headerH-1,w,1,border);ctx.fillStyle=titleCol;ctx.font='bold 8px monospace';ctx.textAlign='center';ctx.textBaseline='middle';ctx.fillText('COOKIES',xr+w/2,yr+7);ctx.fillStyle=closeCol;ctx.font='bold 7px monospace';ctx.fillText('x',xr+w-8,yr+7);ctx.textAlign='left';ctx.textBaseline='alphabetic';R(xr+2,yr+headerH+2,iconZoneW,h-headerH-5,'#efe4d1');R(xr+iconZoneW+2,yr+headerH+2,1,h-headerH-5,'#d8cfbf');bigCookie(xr+2+(iconZoneW/2|0),yr+headerH+2+(((h-headerH-5)/2)|0)-2,Math.max(8,Math.min(11,((h-headerH-8)/2)|0)));ctx.fillStyle=textCol;ctx.font='bold 5px monospace';ctx.fillText('cookies',bodyX,yr+headerH+8);R(bodyX,yr+headerH+10,Math.max(18,bodyW-6),2,line1);R(bodyX,yr+headerH+14,Math.max(14,bodyW-14),2,line2);R(xr+pad,btnY,w-pad*2,btnH,btn);R(xr+pad,btnY,w-pad*2,1,'#fff1ad');R(xr+pad,btnY+btnH-1,w-pad*2,1,btnBorder);R(xr+pad,btnY,1,btnH,btnBorder);R(xr+w-pad-1,btnY,1,btnH,btnBorder);ctx.fillStyle=btnText;ctx.font='bold 8px monospace';ctx.textAlign='center';ctx.textBaseline='middle';ctx.fillText('ACEPTAR',xr+w/2,btnY+8);ctx.textAlign='left';ctx.textBaseline='alphabetic';} function drawAppModal(x,y,w,h,seed) {var xr=x|0,yr=y|0;R(xr+4,yr+4,w,h,'#00000044');R(xr,yr,w,h,'#f8f8fa');var headcols=['#1a73e8','#e83a1a','#1aae74','#e8741a'];R(xr,yr,w,24,headcols[seed%headcols.length]);R(xr+w-16,yr+4,12,12,PALETTE.uiRed);ctx.fillStyle='#fff';ctx.font='bold 8px monospace';ctx.fillText('X',xr+w-13,yr+13);var appnames=['APP','NEW APP','MI APP','DESCARGA'];ctx.fillStyle=PALETTE.uiGold;ctx.font='bold 13px monospace';ctx.textAlign='center';ctx.textBaseline='middle';ctx.fillText(appnames[seed%appnames.length],xr+w/2-8,yr+12);ctx.textAlign='left';ctx.textBaseline='alphabetic';R(xr+8,yr+30,20,34,'#222');R(xr+10,yr+32,16,30,'#4ab8e0');R(xr+15,yr+59,6,4,'#fff');ctx.fillStyle=PALETTE.uiGold;ctx.font='9px monospace';ctx.fillText('\u2605\u2605\u2605\u2605\u2605',xr+32,yr+44);ctx.fillStyle='#555';ctx.font='6px monospace';var ratings=['47293','12.4K','8391','203K'];ctx.fillText(ratings[seed%ratings.length]+' valoraciones',xr+32,yr+54);var ctacols=['#1a73e8','#e83a1a','#27ae60','#8e44ad'];R(xr+6,yr+70,w-12,18,ctacols[seed%ctacols.length]);ctx.fillStyle='#fff';ctx.font='bold 7px monospace';var appctals=['Descarga APP','VOTA APP','Abrir en app','Descargar'];ctx.fillText(appctals[seed%appctals.length],xr+10,yr+82);ctx.fillStyle='#bbb';ctx.font='6px monospace';ctx.fillText('No, prefiero web lenta',xr+6,yr+96);} function drawRateModal(x,y,w,h,seed) {var xr=x|0,yr=y|0;R(xr+4,yr+4,w,h,'#00000044');R(xr,yr,w,h,'#fffdf6');var headcols=['#f4a800','#ff6b35','#f7b731','#f0a500'];R(xr,yr,w,22,headcols[seed%headcols.length]);R(xr+w-16,yr+4,12,12,PALETTE.uiRed);ctx.fillStyle='#fff';ctx.font='bold 8px monospace';ctx.fillText('X',xr+w-13,yr+13);ctx.fillStyle=PALETTE.uiInk;ctx.font='bold 10px monospace';ctx.textAlign='center';ctx.textBaseline='middle';var rtitles=['Dame 5\u2605','Valora','5 estrellas','Vota'];ctx.fillText(rtitles[seed%rtitles.length],xr+w/2,yr+11);ctx.textAlign='left';ctx.textBaseline='alphabetic';ctx.font='20px monospace';ctx.textAlign='center';ctx.textBaseline='middle';ctx.fillText('\uD83D\uDE0A',xr+w/2,yr+36);ctx.textAlign='left';ctx.textBaseline='alphabetic';for (var s=0;s<5;s++) {ctx.fillStyle=PALETTE.uiGold;ctx.font='bold 14px monospace';ctx.textBaseline='middle';ctx.fillText('\u2605',xr+6+s*15,yr+56);} ctx.textBaseline='alphabetic';R(xr+6,yr+68,w-12,16,'#f4a800');ctx.fillStyle='#fff';ctx.font='bold 7px monospace';var rctals=['YO y YO','PUNTUAR','DAR 5','DAME+'];ctx.fillText(rctals[seed%rctals.length],xr+10,yr+79);ctx.fillStyle='#aaa';ctx.font='6px monospace';ctx.fillText('Ahora no',xr+22,yr+94);} function drawCoin(cx,cy,animFrac) {ctx.save();if (animFrac>0) {ctx.globalAlpha=1-animFrac;ctx.translate(cx|0,cy|0);var sc=1+animFrac*0.6;ctx.scale(sc,sc);ctx.translate(-(cx|0),-(cy|0));} R(cx-10,cy-10,20,20,PALETTE.uiGold);R(cx-12,cy-7,24,14,PALETTE.uiGold);R(cx-7,cy-12,14,24,PALETTE.uiGold);R(cx-7,cy-7,14,14,'#D4A000');ctx.fillStyle='#FFE878';ctx.font='bold 9px monospace';ctx.textAlign='center';ctx.textBaseline='middle';ctx.fillText('\u20AC',cx|0,(cy|0)+1);ctx.restore();ctx.textAlign='left';ctx.textBaseline='alphabetic';} function drawCoupon(cx,cy) {var bob=Math.sin(performance.now()/380)*4;var xr=cx|0,yr=(cy+bob)|0;ctx.save();ctx.globalAlpha=0.18+0.12*Math.sin(performance.now()/180);R(xr-26,yr-18,52,36,PALETTE.uiGold);ctx.globalAlpha=1;R(xr-20,yr-13,40,26,PALETTE.uiGold);R(xr-18,yr-11,36,22,'#FFFADC');ctx.strokeStyle='#C8A000';ctx.setLineDash([3,2]);ctx.lineWidth=1;ctx.strokeRect(xr-18,yr-11,36,22);ctx.setLineDash([]);ctx.fillStyle='#8B6914';ctx.font='bold 7px monospace';ctx.textAlign='center';ctx.textBaseline='middle';ctx.fillText('\u2605FREE\u2605',xr,yr);ctx.restore();ctx.textAlign='left';ctx.textBaseline='alphabetic';} function drawAmazonButton(x,y,flashT) {var xr=x|0,yr=y|0;var fl=flashT>0.2;R(xr,yr,AMZ_W,AMZ_H,fl?'#fff8cc':'#FFD814');R(xr,yr+AMZ_H-4,AMZ_W,4,PALETTE.uiGoldDark);R(xr,yr,AMZ_W,3,PALETTE.uiGoldDark);ctx.fillStyle='#111';ctx.font='bold 8px monospace';ctx.textAlign='center';ctx.textBaseline='middle';ctx.fillText('Comprar ahora \u2192',xr+AMZ_W/2,yr+AMZ_H/2);ctx.textAlign='left';ctx.textBaseline='alphabetic';} function drawBubble() {if (bubbleT<=0) return;var text='No tengo suelto!';ctx.save();var alpha=Math.min(bubbleT,0.4)*2.5;var rise=(BUBBLE_DUR-bubbleT)*12;var bx=(pl.x-24)|0;var by=(pl.y-46-rise)|0;ctx.globalAlpha=alpha;ctx.font='bold 13px monospace';var textMetrics=ctx.measureText(text);var textW=textMetrics.width;var textH=13;var padX=10;var padY=6;var bw=(textW+padX*2)|0;var bh=(textH+padY*2)|0;bx-=(bw/2-24)|0;R(bx,by,bw,bh,'#fffde7');R(bx+2,by-2,bw-4,bh+4,'#fffde7');ctx.strokeStyle='#f0f0f0';ctx.lineWidth=1;ctx.strokeRect(bx,by,bw,bh);R(bx+bw*0.5,by+bh,6,5,'#fffde7');R(bx+bw*0.5+2,by+bh+5,4,4,'#fffde7');ctx.fillStyle='#333';ctx.textAlign='center';ctx.textBaseline='middle';ctx.fillText(text,bx+bw/2,by+bh/2);ctx.restore();ctx.textAlign='left';ctx.textBaseline='alphabetic';} function drawSkyMessage(x,y,idx) {var tw=MSG_WIDTHS[idx];var bw=(tw+28)|0;var bh=22;var PX=4;R(x,y,bw,bh,'#ffffff');R(x,y,PX,PX,'#00000000');R(x-PX*2,y+PX,PX*2,bh-PX*2,'#ffffff');R(x-PX*3,y+PX*2,PX,bh-PX*4,'#ffffff');R(x+bw,y+PX,PX*2,bh-PX*2,'#ffffff');R(x+bw+PX*2,y+PX*2,PX,bh-PX*4,'#ffffff');R(x+PX*2,y-PX,bw-PX*4,PX,'#ffffff');R(x+PX*4,y-PX*2,bw-PX*8,PX,'#ffffff');R(x+PX*2,y+bh,bw-PX*4,PX,'#d8e4f0');R(x+PX*4,y+bh+PX,bw-PX*8,PX,'#d8e4f0');ctx.fillStyle='#1a3a7a';ctx.font=FONT_RETRO;ctx.textBaseline='middle';ctx.textAlign='center';ctx.fillText(SKY_MESSAGES[idx],x+bw/2,y+bh/2);ctx.textBaseline='alphabetic';ctx.textAlign='left';} function drawSpeedLines(effSpeed) {var lvFrac=currentLevel/(LEVELS.length-1);var a=lvFrac*0.16+(chargeIsActive?0.38:0)+(redVignetteT>0?0.10:0);if (a<0.02) return;ctx.strokeStyle='#ffffff';ctx.lineWidth=1;for (var i=0;i<SL_N;i++) {ctx.globalAlpha=a*(0.3+0.7*((i*0.19)%1));ctx.beginPath();ctx.moveTo((sl_x[i]+sl_len[i])|0,sl_y[i]|0);ctx.lineTo(sl_x[i]|0,sl_y[i]|0);ctx.stroke();} ctx.globalAlpha=1;} function drawLifeGainFlash() {if (lifeGainFlashT<=0) return;var a=lifeGainFlashT>0.6?(0.9-lifeGainFlashT)*3:lifeGainFlashT/0.6;ctx.save();ctx.globalAlpha=a*0.5;R(0,0,IW,IH,'#00ff88');ctx.globalAlpha=a;ctx.fillStyle='#004400';ctx.font=FONT_RETRO_BIG;ctx.textAlign='center';ctx.fillText('+1 VIDA',IW/2,IH/2);ctx.restore();ctx.textAlign='left';} function drawGoldenHUD() {ctx.fillStyle=PALETTE.uiGold;ctx.font='bold 9px monospace';ctx.textAlign='right';ctx.fillText('\u2605 ENVIO GRATIS: '+pl.goldenT.toFixed(1)+'s \u2605',IW-10,20);ctx.textAlign='left';} function drawLevelUpFlash() {if (lvFlashT<=0) return;var a=lvFlashT>1.2?(1.6-lvFlashT)*2.5:lvFlashT/1.2;ctx.save();ctx.globalAlpha=a*0.82;R(0,0,IW,IH,PALETTE.uiGold);ctx.globalAlpha=a;ctx.fillStyle='#1a3a00';ctx.font='bold 26px monospace';ctx.textAlign='center';ctx.fillText('NIVEL '+lvFlashNum,IW/2,IH/2+10);ctx.restore();ctx.textAlign='left';} var UI={top:0,scaleY:1};function updateUILayout() {var header=document.querySelector('header');var headerH=header?header.offsetHeight:0;UI.top=Math.max(60,headerH);UI.scaleY=IH/300;} function Y(y) {return (UI.top+y*UI.scaleY)|0;} var _idleBtn1=null,_idleBtn2=null;function drawIdleScreen() {updateUILayout();ctx.save();ctx.globalAlpha=0.72;R(0,0,IW,IH,'#0a1a30');ctx.restore();ctx.fillStyle='rgba(0,0,0,0.45)';ctx.font=FONT_RETRO_HUGE;ctx.textAlign='center';ctx.textBaseline='top';ctx.fillText('ERROR 404',IW/2+4,Y(0));ctx.fillStyle=PALETTE.uiGold;ctx.fillText('ERROR 404',IW/2,Y(0));ctx.textBaseline='alphabetic';ctx.fillStyle='#8ac8e8';ctx.font='bold 18px monospace';ctx.fillText('Notengosuelto.com',IW/2,Y(60));ctx.fillStyle='#e0e8f0';ctx.fillText('Esta pagina no existe',IW/2,Y(86));var btn1x=(IW/2-120)|0;var btn2x=(IW/2+10)|0;var btny=Y(102);var btnH=22,btnW=108;R(btn1x-2,btny-2,btnW+4,btnH+4,PALETTE.uiInk);R(btn1x,btny,btnW,btnH,PALETTE.uiGold);ctx.fillStyle=PALETTE.uiText;ctx.font='bold 11px monospace';ctx.textAlign='center';ctx.textBaseline='middle';ctx.fillText('Volver',btn1x+btnW/2,btny+btnH/2);R(btn2x-2,btny-2,btnW+4,btnH+4,PALETTE.uiInk);R(btn2x,btny,btnW,btnH,PALETTE.uiGreen);ctx.fillStyle='#fff';ctx.fillText('\u25B6 JUGAR',btn2x+btnW/2,btny+btnH/2);ctx.textBaseline='alphabetic';ctx.textAlign='center';ctx.fillStyle='#aaeebb';ctx.font='bold 14px monospace';ctx.fillText('TAP / ESPACIO = saltar  -  Doble TAP = + Alto',IW/2,Y(150));ctx.fillStyle='#cc8888';if (((performance.now()/500)|0)%2===0) {ctx.fillStyle='#4cff80';ctx.font='bold 16px monospace';ctx.fillText('[ ESPACIO / TAP PARA JUGAR ]',IW/2,Y(180));} ctx.textAlign='left';_idleBtn1={x:btn1x,y:btny,w:btnW,h:btnH};_idleBtn2={x:btn2x,y:btny,w:btnW,h:btnH};} function drawDeadScreen() {updateUILayout();ctx.save();ctx.globalAlpha=0.72;R(0,0,IW,IH,'#0a1a30');ctx.restore();ctx.fillStyle='rgba(0,0,0,0.45)';ctx.font='bold 25px monospace';ctx.textAlign='center';ctx.textBaseline='top';ctx.fillText('GAME OVER',IW/2+2,Y(70));ctx.fillStyle='#e74c3c';ctx.fillText('GAME OVER',IW/2,Y(70));ctx.textBaseline='alphabetic';ctx.fillStyle='#f0f0f0';ctx.font='bold 16px monospace';ctx.fillText('Puntos: '+(score|0)+'  ||  Record: '+(hiScore|0),IW/2,Y(120));ctx.fillStyle='#aaccee';ctx.font='bold 16px monospace';ctx.fillText('Gana vidas esquivando obstáculos Flash.',IW/2,Y(145));if (((performance.now()/500)|0)%2===0) {ctx.fillStyle=PALETTE.uiGold;ctx.font='bold 14px monospace';ctx.fillText('[ ESPACIO / TAP PARA CONTINUAR ]',IW/2,Y(170));} ctx.textAlign='left';} canvas.addEventListener('click',function (e) {if (gameState!==GS.IDLE) return;var rect=canvas.getBoundingClientRect();var scaleX=IW/rect.width;var scaleY=IH/rect.height;var cx=(e.clientX-rect.left)*scaleX;var cy=(e.clientY-rect.top)*scaleY;if (_idleBtn1&&cx>=_idleBtn1.x&&cx<=_idleBtn1.x+_idleBtn1.w&&cy>=_idleBtn1.y&&cy<=_idleBtn1.y+_idleBtn1.h) {window.location.href='/';}});function drawBG() {ctx.drawImage(bgCanvas,0,0);var tile;for (tile=0;tile<=1;tile++) {ctx.drawImage(farStrip,farScrollX+tile*IW,0,IW,IH,0,0,IW,IH);ctx.drawImage(midStrip,midScrollX+tile*IW,0,IW,IH,0,0,IW,IH);} var hfx=hillFarScrollX%STRIP_W;if (hfx>0) hfx-=STRIP_W;ctx.drawImage(hillFarStrip,hfx,0);ctx.drawImage(hillFarStrip,hfx+STRIP_W,0);var hnx=hillNearScrollX%STRIP_W;if (hnx>0) hnx-=STRIP_W;ctx.drawImage(hillNearStrip,hnx,0);ctx.drawImage(hillNearStrip,hnx+STRIP_W,0);var gx=groundScrollX%STRIP_W;if (gx<0) gx+=STRIP_W;ctx.drawImage(groundStrip,-gx,GROUND);ctx.drawImage(groundStrip,STRIP_W-gx,GROUND);} function draw() {ctx.setTransform(1,0,0,1,0,0);ctx.imageSmoothingEnabled=false;var sx=0,sy=0;if (shakeT>0) {sx=(Math.random()-0.5)*shakeAmp;sy=(Math.random()-0.5)*shakeAmp;} ctx.save();if (sx||sy) ctx.translate(sx|0,sy|0);drawBG();var effSpeed=speed+cursorVelBias;drawSpeedLines(effSpeed);for (var i=0;i<AMZ_N;i++) {if (amz_act[i]) drawAmazonButton(amz_x[i],amz_baseY[i]+Math.sin(amz_bobT[i])*10,amz_flashT[i]);} for (i=0;i<OBS_N;i++) {if (!obs_active[i]) continue;var t=obs_type[i],sd=obs_seed[i];var ox=obs_x[i],oy=obs_y[i],ow=obs_w[i],oh=obs_h[i];var isPopup=t===OT_NEWS||t===OT_COOKIE||t===OT_APP||t===OT_RATE;if (isPopup) {var pad=((shakeT>0?shakeAmp:0)|0)+3;if (ox+ow>0&&ox<IW&&oy+oh>0&&oy<IH) obs_seen[i]=1;if (!obs_seen[i]) {if (ox+ow<-pad||ox>IW+pad||oy+oh<-pad||oy>IH+pad) continue;} else {var minY=pad,maxY=IH-oh-pad;if (maxY<minY) oy=((IH-oh)/2)|0;else if (oy<minY) oy=minY;else if (oy>maxY) oy=maxY;}} if (t===OT_NEWS) drawNewsletterPopup(ox,oy,ow,oh,sd);else if (t===OT_COOKIE) drawCookieBanner(ox,oy,ow,oh,sd);else if (t===OT_APP) drawAppModal(ox,oy,ow,oh,sd);else if (t===OT_RATE) drawRateModal(ox,oy,ow,oh,sd);else drawZombie(obs_x[i],obs_y[i]+15,pl.animFrame,sd);} for (i=0;i<COIN_N;i++) if (coin_act[i]) drawCoin(coin_x[i],coin_y[i],coin_coll[i]?coin_anim[i]:0);for (i=0;i<CPN_N;i++) if (cpn_act[i]) drawCoupon(cpn_x[i],cpn_y[i]);if (!pl.dead) {drawPiggy(pl.x,pl.y,pl.animFrame,pl.golden,pl.worried);if (zombieFlashT>0) {ctx.save();ctx.globalAlpha=zombieFlashT*1.6;R(pl.x-4,pl.y-4,PL_W+8,PL_H+8,'#ff2200');ctx.restore();} if (invincibleT>0&&((invincibleT*10)|0)%2===0) {ctx.save();ctx.globalAlpha=0.38;R(pl.x,pl.y,PL_W,PL_H,'#ffffff');ctx.restore();} if (pl.golden) drawGoldenHUD();drawBubble();} for (i=0;i<MSG_N;i++) if (msg_act[i]) drawSkyMessage(msg_x[i],msg_y[i],msg_idx[i]);if (redVignetteT>0) {ctx.save();ctx.globalAlpha=redVignetteT*0.30;R(0,0,IW,IH,'#cc0000');ctx.restore();} drawLifeGainFlash();drawLevelUpFlash();ctx.restore();if (gameState===GS.IDLE) drawIdleScreen();if (gameState===GS.DEAD) drawDeadScreen();} function loop(now) {var raw=(now-lastTime)/1000;var dt=raw>DT_CAP?DT_CAP:raw;lastTime=now;if (gameState===GS.PLAYING) update(dt);else processInput();draw();requestAnimationFrame(loop);} resetGame();lastTime=performance.now();requestAnimationFrame(loop);
</script></body></html>