@idosgames/game-kit 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import {b,m,l,i,c,j,n,f,k,e}from'./chunk-NBIYNARI.js';export{o as ART,l as DEFAULT_CAST,m as DEFAULT_LOOK,g as DEFAULT_PALETTE,n as FX_TOPIC,j as INPUT_TOPIC,e as Transform,k as VIEW_RESIZED_TOPIC,f as Visual,c as World,q as artAspect,r as artDocument,d as createFixedStepper,a as createRng,b as defineComponent,p as hasArt,i as mergePalette,h as resolveColor}from'./chunk-NBIYNARI.js';function Rn(e){if(!jd.test(e))throw new Error(`registry: bad kind name "${e}"`);return Object.freeze({name:e})}var Il=/^[a-z0-9][a-z0-9-]*(?:\.[a-z0-9][a-z0-9-]*)*$/,jd=/^[a-z][a-z0-9-]*$/;function Uo(e){let t=new Map,n=r=>{let o=t.get(r);return o||(o=new Map,t.set(r,o)),o},s={define(r,o,c){if(!o||typeof o!="object")throw new Error(`registry: ${r.name} entry must be an object`);if(typeof o.id!="string"||!Il.test(o.id))throw new Error(`registry: ${r.name} has a bad id "${String(o.id)}"`);if(!Number.isInteger(o.version)||o.version<1)throw new Error(`registry: ${r.name} "${o.id}" needs an integer version \u2265 1`);let d=n(r.name);if((d.has(o.id)||(e?.has(r,o.id)??false))&&!c?.override)throw new Error(`registry: ${r.name} "${o.id}" is already defined (pass { override: true } to replace it)`);let _=Object.freeze({...o});return d.set(o.id,_),_},get(r,o){let c=t.get(r.name)?.get(o);return c||e?.get(r,o)},require(r,o){let c=s.get(r,o);if(!c)throw new Error(`registry: no ${r.name} "${o}"`);return c},has(r,o){return s.get(r,o)!==void 0},list(r){let o=new Map;for(let c of e?.list(r)??[])o.set(c.id,c);for(let[c,d]of t.get(r.name)??[])o.set(c,d);return [...o.values()].sort((c,d)=>c.id<d.id?-1:c.id>d.id?1:0)},extend(){return Uo(s)}};return s}var Zt=class extends Error{constructor(n,s,r){super(`${n} at ${r} in "${s}"`);this.source=s;this.at=r;this.name="ExprError";}source;at},Nl=2e3,Ia=64,nt=e=>{let t=typeof e=="number"?e:typeof e=="boolean"?e?1:0:Number(e);return Number.isFinite(t)?t:0},nr=e=>typeof e=="string"?e.length>0:!!e,Na={min:(...e)=>e.length?Math.min(...e):0,max:(...e)=>e.length?Math.max(...e):0,abs:(e=0)=>Math.abs(e),floor:(e=0)=>Math.floor(e),ceil:(e=0)=>Math.ceil(e),round:(e=0)=>Math.round(e),sqrt:(e=0)=>Math.sqrt(Math.max(0,e)),pow:(e=0,t=1)=>Math.pow(e,t),log:(e=1)=>e>0?Math.log(e):0,clamp:(e=0,t=0,n=1)=>Math.min(Math.max(e,t),n),lerp:(e=0,t=0,n=0)=>e+(t-e)*n,sign:(e=0)=>Math.sign(e),step:(e=0,t=0)=>t<e?0:1},Xd=["&&","||","==","!=","<=",">=","+","-","*","/","%","^","<",">","!","?",":","(",")",","];function Yd(e){let t=[],n=0;for(;n<e.length;){let s=e[n];if(s===" "||s===" "||s===`
2
- `||s==="\r"){n++;continue}if(s>="0"&&s<="9"||s==="."&&/[0-9]/.test(e[n+1]??"")){let o=/^(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?/.exec(e.slice(n));if(!o)throw new Zt("bad number",e,n);t.push({t:"num",v:Number(o[0]),at:n}),n+=o[0].length;continue}if(s==="'"||s==='"'){let o=e.indexOf(s,n+1);if(o<0)throw new Zt("unclosed string",e,n);t.push({t:"str",v:e.slice(n+1,o),at:n}),n=o+1;continue}if(/[A-Za-z_$]/.test(s)){let o=/^[A-Za-z_$][A-Za-z0-9_$]*(?:\.[A-Za-z_$][A-Za-z0-9_$]*)*/.exec(e.slice(n));if(!o)throw new Zt("bad name",e,n);t.push({t:"id",v:o[0],at:n}),n+=o[0].length;continue}let r=Xd.find(o=>e.startsWith(o,n));if(!r)throw new Zt(`unexpected "${s}"`,e,n);t.push({t:"op",v:r,at:n}),n+=r.length;}return t.push({t:"end",at:e.length}),t}var $l={"||":1,"&&":2,"==":3,"!=":3,"<":4,"<=":4,">":4,">=":4,"+":5,"-":5,"*":6,"/":6,"%":6,"^":8};function Jd(e){let t=Yd(e),n=0,s=()=>t[n],r=()=>t[n++],o=G=>{let B=s();return B.t==="op"&&B.v===G},c=G=>{let B=r();if(B.t!=="op"||B.v!==G)throw new Zt(`expected "${G}"`,e,B.at)},d=G=>{if(G>Ia)throw new Zt("formula is nested too deep",e,s().at);let B=x(0,G+1);if(!o("?"))return B;r();let Q=d(G+1);c(":");let ae=d(G+1);return {k:"cond",c:B,a:Q,b:ae}},x=(G,B)=>{if(B>Ia)throw new Zt("formula is nested too deep",e,s().at);let Q=_(B+1);for(;;){let ae=s();if(ae.t!=="op")break;let q=$l[ae.v];if(q===void 0||q<G)break;r();let ue=ae.v==="^"?x(q,B+1):x(q+1,B+1);Q={k:"bin",op:ae.v,a:Q,b:ue};}return Q},_=G=>{if(G>Ia)throw new Zt("formula is nested too deep",e,s().at);return o("-")||o("!")?{k:"un",op:r().v,a:x($l["^"],G+1)}:O(G+1)},O=G=>{let B=r();if(B.t==="num")return {k:"num",v:B.v};if(B.t==="str")return {k:"str",v:B.v};if(B.t==="op"&&B.v==="("){let Q=d(G+1);return c(")"),Q}if(B.t==="id"){if(B.v==="true")return {k:"bool",v:true};if(B.v==="false")return {k:"bool",v:false};if(o("(")){if(!Object.prototype.hasOwnProperty.call(Na,B.v))throw new Zt(`unknown function "${B.v}"`,e,B.at);r();let Q=[];if(!o(")"))for(;;){if(Q.push(d(G+1)),o(",")){r();continue}break}return c(")"),{k:"call",fn:B.v,args:Q}}return {k:"var",path:B.v.split(".")}}throw new Zt(B.t==="end"?"unexpected end":"unexpected token",e,B.at)},M=d(0),$=s();if($.t!=="end")throw new Zt("unexpected token",e,$.at);return M}function Zd(e,t){let n=e;for(let s of t){if(n===null||typeof n!="object"||!Object.prototype.hasOwnProperty.call(n,s))return 0;n=n[s];}return typeof n=="number"||typeof n=="string"||typeof n=="boolean"?n:0}function Jt(e,t){switch(e.k){case "num":case "str":case "bool":return e.v;case "var":return Zd(t,e.path);case "un":return e.op==="-"?-nt(Jt(e.a,t)):!nr(Jt(e.a,t));case "cond":return nr(Jt(e.c,t))?Jt(e.a,t):Jt(e.b,t);case "call":return nt(Na[e.fn](...e.args.map(n=>nt(Jt(n,t)))));case "bin":{if(e.op==="&&")return nr(Jt(e.a,t))&&nr(Jt(e.b,t));if(e.op==="||")return nr(Jt(e.a,t))||nr(Jt(e.b,t));let n=Jt(e.a,t),s=Jt(e.b,t);switch(e.op){case "==":return typeof n=="string"||typeof s=="string"?String(n)===String(s):nt(n)===nt(s);case "!=":return typeof n=="string"||typeof s=="string"?String(n)!==String(s):nt(n)!==nt(s);case "<":return nt(n)<nt(s);case "<=":return nt(n)<=nt(s);case ">":return nt(n)>nt(s);case ">=":return nt(n)>=nt(s);case "+":return typeof n=="string"||typeof s=="string"?`${n}${s}`:nt(n)+nt(s);case "-":return nt(n)-nt(s);case "*":return nt(n)*nt(s);case "/":{let r=nt(s);return r===0?0:nt(n)/r}case "%":{let r=nt(s);return r===0?0:nt(n)%r}case "^":return nt(Math.pow(nt(n),nt(s)))}return 0}}}function Hn(e,t){switch(e.k){case "var":t.add(e.path.join("."));return;case "un":Hn(e.a,t);return;case "bin":Hn(e.a,t),Hn(e.b,t);return;case "cond":Hn(e.c,t),Hn(e.a,t),Hn(e.b,t);return;case "call":for(let n of e.args)Hn(n,t);return;default:return}}var qo=new Map;function dn(e){let t=qo.get(e);if(t)return t;if(e.length>Nl)throw new Zt("formula is too long",e,Nl);let n=Jd(e),s=new Set;Hn(n,s);let r={source:e,reads:[...s],eval:o=>Jt(n,o),num:o=>nt(Jt(n,o)),bool:o=>nr(Jt(n,o))};return qo.size>5e3&&qo.clear(),qo.set(e,r),r}function $a(e){try{return dn(e),null}catch(t){return t instanceof Error?t.message:String(t)}}function Ba(e,t,n=0){return e===void 0?n:typeof e=="number"?Number.isFinite(e)?e:n:dn(e).num(t)}var co=Rn("effect"),Qd=/^[a-z][a-z0-9_]*$/,Bl=e=>{let t=e.name;if(typeof t!="string"||!Qd.test(t))throw new Error(`effect ${e.type}: bad var name`);return t},zl=[{id:"set-var",version:1,required:["name","value"],formulas:["value"],run(e,t){let n=t.value,s=typeof n=="string"?dn(n).eval(e.scope):typeof n=="number"||typeof n=="boolean"?n:0;e.world.vars[Bl(t)]=s;}},{id:"add-var",version:1,required:["name","amount"],formulas:["amount","min","max"],run(e,t){let n=Bl(t),s=e.world.vars[n],r=(typeof s=="number"?s:0)+e.num(t.amount);t.min!==void 0&&(r=Math.max(r,e.num(t.min))),t.max!==void 0&&(r=Math.min(r,e.num(t.max))),e.world.vars[n]=r;}},{id:"emit",version:1,required:["topic"],run(e,t){let n=t.topic;if(typeof n!="string"||n.length===0)throw new Error("effect emit: topic required");let s=t.payload,r={};if(s&&typeof s=="object")for(let[o,c]of Object.entries(s))r[o]=typeof c=="string"?dn(c).eval(e.scope):c;e.world.emit(n,r);}}];function po(e){for(let t of zl)e.has(co,t.id)||e.define(co,t);}function jo(e,t,n,s){let r=new Set;e.forEach((o,c)=>{let d=`${n}.${c}`;if(!o||typeof o!="object"){s.push({level:"error",path:d,code:"RULE_SHAPE",message:"a rule must be an object"});return}if(typeof o.id!="string"||o.id.length===0?s.push({level:"error",path:`${d}.id`,code:"RULE_ID",message:"a rule needs an id"}):r.has(o.id)?s.push({level:"error",path:`${d}.id`,code:"RULE_DUPLICATE",message:`rule "${o.id}" is defined twice`}):r.add(o.id),(typeof o.on!="string"||o.on.length===0)&&s.push({level:"error",path:`${d}.on`,code:"RULE_TRIGGER",message:"a rule needs an event topic in `on`"}),o.when!==void 0)try{dn(String(o.when));}catch(x){s.push({level:"error",path:`${d}.when`,code:"RULE_FORMULA",message:x.message});}if(!Array.isArray(o.do)||o.do.length===0){s.push({level:"error",path:`${d}.do`,code:"RULE_EFFECTS",message:"a rule needs at least one effect"});return}o.do.forEach((x,_)=>{let O=`${d}.do.${_}`,M=typeof x?.type=="string"?t.get(co,x.type):void 0;if(!M){s.push({level:"error",path:`${O}.type`,code:"EFFECT_UNKNOWN",message:`unknown effect "${String(x?.type)}"`});return}for(let $ of M.required??[])x[$]===void 0&&s.push({level:"error",path:`${O}.${$}`,code:"EFFECT_PARAM",message:`effect "${M.id}" needs "${$}"`});for(let $ of M.formulas??[]){let G=x[$];if(typeof G=="string")try{dn(G);}catch(B){s.push({level:"error",path:`${O}.${$}`,code:"RULE_FORMULA",message:B.message});}}});});}function za(e,t,n,s={}){let r=t.map(d=>({def:d,...d.when!==void 0?{when:dn(d.when)}:{},effects:d.do.map(x=>({spec:x,def:n.require(co,x.type)})),hits:0,runs:0,lastRunAt:Number.NEGATIVE_INFINITY})),o=new Map;for(let d of r){let x=o.get(d.def.on)??[];x.push(d),o.set(d.def.on,x);}let c=[...o.entries()].map(([d,x])=>e.on(d,_=>{for(let O of x){if(O.def.once&&O.runs>0)continue;let M={event:_,vars:e.vars,tick:e.tick,time:e.time};if(O.when&&!O.when.bool(M)||(O.hits++,O.def.every!==void 0&&O.def.every>1&&O.hits%O.def.every!==0)||O.def.cooldown!==void 0&&e.time-O.lastRunAt<O.def.cooldown)continue;O.runs++,O.lastRunAt=e.time;let $={world:e,rule:O.def,event:_,scope:M,num:(G,B=0)=>typeof G=="number"||typeof G=="string"?Ba(G,M,B):B};for(let G of O.effects)try{G.def.run($,G.spec);}catch(B){s.onError?.(O.def,B);}}}));return ()=>c.forEach(d=>d())}var Wa=e=>e.some(t=>t.level==="error");function Xo(e,t,n,s){let r={};for(let[o,c]of Object.entries(e))r[o]=c.default;if(!t)return r;for(let[o,c]of Object.entries(t)){let d=e[o],x=`${n}.${o}`;if(!d){s.push({level:"warning",path:x,code:"PARAM_UNKNOWN",message:`unknown parameter "${o}"`});continue}switch(d.type){case "number":{if(typeof c!="number"||!Number.isFinite(c)){s.push({level:"warning",path:x,code:"PARAM_TYPE",message:"expected a number, default used"});break}let _=d.integer?Math.round(c):c;d.min!==void 0&&_<d.min&&(_=d.min),d.max!==void 0&&_>d.max&&(_=d.max),_!==c&&s.push({level:"warning",path:x,code:"PARAM_CLAMPED",message:`${c} \u2192 ${_}`}),r[o]=_;break}case "enum":typeof c=="string"&&d.values.includes(c)?r[o]=c:s.push({level:"warning",path:x,code:"PARAM_ENUM",message:`not one of ${d.values.join(", ")}, default used`});break;case "boolean":typeof c=="boolean"?r[o]=c:s.push({level:"warning",path:x,code:"PARAM_TYPE",message:"expected true/false, default used"});break;case "string":if(typeof c=="string"){let _=d.maxLength??500;r[o]=c.length>_?c.slice(0,_):c,c.length>_&&s.push({level:"warning",path:x,code:"PARAM_CLAMPED",message:`cut to ${_} characters`});}else s.push({level:"warning",path:x,code:"PARAM_TYPE",message:"expected text, default used"});break}}return r}var Yo=["phaser","three","dom"],Vn=Rn("block"),Gn=Rn("preset");var Wl=["store","premium","character","inventory","lootboxes","boosts","leaderboard","rewards","quests","collections","craft","marketplace","deals","events","coop-events","season","pvp","mailbox","reward-window","idle"],ep=/^system:([a-z][a-z0-9-]*)$/,tp=new Set(["currency","item"]);function Ha(e,t,n,s){let r=new Set(e.map(x=>x.id)),o=new Set(t.map(x=>x.id)),c=new Map,d=new Map;n.forEach((x,_)=>{let O=`flows.${_}`;o.has(x.resource)||s.push({level:"error",path:`${O}.resource`,code:"FLOW_RESOURCE_UNKNOWN",message:`no resource "${x.resource}"`});let M=ep.exec(x.by);M?Wl.includes(M[1])||s.push({level:"warning",path:`${O}.by`,code:"FLOW_SYSTEM_UNKNOWN",message:`"${x.by}" is not a platform system`}):r.has(x.by)||s.push({level:"error",path:`${O}.by`,code:"FLOW_BY_UNKNOWN",message:`"${x.by}" is neither a mode of the spec nor "system:<id>"`}),x.kind!=="source"&&x.kind!=="sink"&&s.push({level:"error",path:`${O}.kind`,code:"FLOW_KIND",message:'kind is "source" or "sink"'});let $=x.kind==="source"?c:d;$.set(x.resource,($.get(x.resource)??0)+1);}),t.forEach((x,_)=>{let O=`resources.${_}`,M=c.get(x.id)??0,$=d.get(x.id)??0;M===0&&s.push({level:"error",path:O,code:"RESOURCE_NO_SOURCE",message:`nothing produces "${x.id}"`}),tp.has(x.kind)&&$===0&&s.push({level:"error",path:O,code:"RESOURCE_NO_SINK",message:`nothing spends "${x.id}"`});});}var kr=Rn("asset-pack"),uo=Rn("link"),np=(e,t="en")=>e.names[t]??e.names.en??e.id;function rp(e,t,n){let s=[],r=n.get(uo,t);if(!r)return s.push({level:"error",path:"link",code:"LINK_UNKNOWN",message:`no link "${t}"`}),{spec:e,systems:[],issues:s};let o=e.modes.find(d=>d.role==="core")??e.modes[0],c=o?n.get(Gn,o.preset)?.genre:void 0;return !c||!r.core.includes(c)?(s.push({level:"error",path:"link",code:"LINK_GENRE",message:`link "${t}" fits ${r.core.join(", ")}, not "${c??"?"}"`}),{spec:e,systems:[],issues:s}):{spec:r.apply(e),systems:r.systems,issues:s}}var ho=1;function pn(e,t,n){let s=e?.content[t];if(!s||s.length===0)return n;let r=n.filter(o=>!s.includes(o));return r.length>0?r:n}var Vl=Object.freeze({window:"round",adMultiplier:3,vipMultiplier:5}),op={};function Gl(e,t){let n={...e},s=n.v===void 0?1:n.v;if(typeof s!="number"||!Number.isInteger(s)||s<1)return t.push({level:"error",path:"v",code:"SPEC_VERSION",message:"v must be an integer \u2265 1"}),null;if(s>ho)return t.push({level:"error",path:"v",code:"SPEC_TOO_NEW",message:`spec v${s} is newer than this kit (v${ho})`}),null;for(;s<ho;){let r=op[s];if(!r)return t.push({level:"error",path:"v",code:"SPEC_NO_MIGRATION",message:`no migration from v${s}`}),null;n=r(n),s++;}return n.v=ho,n}var Va=/^[a-z][a-z0-9_]*$/,sp=/^#[0-9a-fA-F]{6}(?:[0-9a-fA-F]{2})?$/,ap=/^[a-z]{2}(?:-[A-Z]{2})?$/,ip=/^[a-z][a-z0-9_.-]*$/,Hl=["none","async","coop","pvp"],ut=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),fo=e=>Array.isArray(e)?e:[];function lp(e,t){let n=[];if(!ut(e))return n.push({level:"error",path:"",code:"SPEC_SHAPE",message:"a spec must be an object"}),{ok:false,issues:n};let s=Gl(e,n);if(!s)return {ok:false,issues:n};let r=s;Yo.includes(r.engine)||n.push({level:"error",path:"engine",code:"SPEC_ENGINE",message:`engine is one of ${Yo.join(", ")}`});let o=fo(r.modes);o.length===0&&n.push({level:"error",path:"modes",code:"SPEC_NO_MODES",message:"a game needs at least one mode"});let c=new Set,d=[];o.forEach((q,ue)=>{let fe=`modes.${ue}`;if(!ut(q)){n.push({level:"error",path:fe,code:"MODE_SHAPE",message:"a mode must be an object"});return}typeof q.id!="string"||!Va.test(q.id)?n.push({level:"error",path:`${fe}.id`,code:"MODE_ID",message:"mode id: snake_case, starts with a letter"}):c.has(q.id)?n.push({level:"error",path:`${fe}.id`,code:"MODE_DUPLICATE",message:`mode "${q.id}" is defined twice`}):c.add(q.id);let ie=typeof q.preset=="string"?t.get(Gn,q.preset):void 0;if(!ie){n.push({level:"error",path:`${fe}.preset`,code:"MODE_PRESET_UNKNOWN",message:`no preset "${String(q.preset)}"`});return}ie.engine!==r.engine&&n.push({level:"error",path:`${fe}.preset`,code:"MODE_ENGINE",message:`preset "${ie.id}" runs on ${ie.engine}, the spec on ${String(r.engine)}`}),q.role!==void 0&&!["core","meta","embedded"].includes(q.role)&&n.push({level:"error",path:`${fe}.role`,code:"MODE_ROLE",message:"role is core, meta or embedded"});let ve=Xo(ie.params??{},ut(q.params)?q.params:void 0,`${fe}.params`,n),se={},Me=new Set(ie.blocks);for(let oe of ie.blocks){let ce=t.get(Vn,oe);if(!ce){n.push({level:"error",path:`${fe}.preset`,code:"PRESET_BLOCK_UNKNOWN",message:`preset "${ie.id}" uses unknown block "${oe}"`});continue}ce.engines&&!ce.engines.includes(ie.engine)&&n.push({level:"error",path:`${fe}.preset`,code:"BLOCK_ENGINE",message:`block "${oe}" is not drawn by ${ie.engine}`});for(let ee of ce.requires??[])Me.has(ee)||n.push({level:"error",path:`${fe}.preset`,code:"BLOCK_REQUIRES",message:`block "${oe}" needs "${ee}" in the same preset`});let Ae={};for(let[ee,xe]of Object.entries(ie.blockParams?.[oe]??{})){let je=ce.params?.[ee];if(typeof xe=="string"&&(je?.type==="number"||je?.type==="boolean"))try{let we=dn(xe).eval({params:ve});Ae[ee]=je.type==="number"?Number(we):!!we;}catch(we){n.push({level:"error",path:`${fe}.preset`,code:"PRESET_FORMULA",message:`preset "${ie.id}", ${oe}.${ee}: ${we.message}`});}else Ae[ee]=xe;}let Se={...Ae,...ut(q.blockParams)&&ut(q.blockParams[oe])?q.blockParams[oe]:{}};se[oe]=Xo(ce.params??{},Se,`${fe}.blockParams.${oe}`,n);}if(ut(q.blockParams))for(let oe of Object.keys(q.blockParams))Me.has(oe)||n.push({level:"warning",path:`${fe}.blockParams.${oe}`,code:"BLOCK_NOT_IN_PRESET",message:`preset "${ie.id}" has no block "${oe}"`});let De=[...ie.rules??[],...fo(q.rules)];jo(De,t,`${fe}.rules`,n);let ge={};if(q.content!==void 0)if(!ut(q.content))n.push({level:"warning",path:`${fe}.content`,code:"CONTENT_SHAPE",message:"content is { kind: { without: [ids] } }; ignored"});else for(let[oe,ce]of Object.entries(q.content)){let Ae=ut(ce)?ce.without:void 0;Array.isArray(Ae)&&Ae.every(Se=>typeof Se=="string")?ge[oe]=[...Ae]:n.push({level:"warning",path:`${fe}.content.${oe}`,code:"CONTENT_SHAPE",message:"expected { without: [ids] }; ignored"});}d.push({id:q.id,role:q.role??(ue===0?"core":"meta"),preset:ie,params:ve,blockParams:se,rules:De,content:ge});}),o.length>0&&!o.some((q,ue)=>ut(q)?(q.role??(ue===0?"core":"meta"))==="core":false)&&n.push({level:"error",path:"modes",code:"SPEC_NO_CORE",message:"one mode must be the core (what the player plays)"});let x=fo(r.resources),_=new Set;x.forEach((q,ue)=>{let fe=`resources.${ue}`;if(!ut(q)||typeof q.id!="string"||!Va.test(q.id)){n.push({level:"error",path:fe,code:"RESOURCE_ID",message:"resource id: snake_case, starts with a letter"});return}_.has(q.id)&&n.push({level:"error",path:`${fe}.id`,code:"RESOURCE_DUPLICATE",message:`resource "${q.id}" is defined twice`}),_.add(q.id),["currency","item","score","local"].includes(q.kind)||n.push({level:"error",path:`${fe}.kind`,code:"RESOURCE_KIND",message:"kind is currency, item, score or local"}),(q.kind==="currency"||q.kind==="item")&&q.ref!==void 0&&(typeof q.ref!="string"||q.ref.length===0)&&n.push({level:"error",path:`${fe}.ref`,code:"RESOURCE_REF",message:"ref is the engine currency or item id"});});let O=fo(r.flows);O.forEach((q,ue)=>{if(typeof q?.amount=="string"){let fe=$a(q.amount);fe&&n.push({level:"error",path:`flows.${ue}.amount`,code:"FLOW_FORMULA",message:fe});}}),Ha(o.filter(ut),x.filter(q=>ut(q)&&typeof q.id=="string"),O.filter(ut),n);let M=fo(r.rules);jo(M,t,"rules",n);let $={};if(r.vars!==void 0)if(!ut(r.vars))n.push({level:"error",path:"vars",code:"VARS_SHAPE",message:"vars must be an object"});else for(let[q,ue]of Object.entries(r.vars))Va.test(q)?typeof ue=="number"||typeof ue=="string"||typeof ue=="boolean"?$[q]=ue:n.push({level:"error",path:`vars.${q}`,code:"VAR_TYPE",message:"a var is a number, text or true/false"}):n.push({level:"error",path:`vars.${q}`,code:"VAR_NAME",message:"var name: snake_case"});let G=typeof r.assets=="string"&&r.assets?t.get(kr,r.assets):void 0;if(r.assets!==void 0&&!G&&n.push({level:"warning",path:"assets",code:"ASSETS_UNKNOWN",message:`no asset pack "${String(r.assets)}"; the default look is used`}),r.palette!==void 0)if(!ut(r.palette))n.push({level:"error",path:"palette",code:"PALETTE_SHAPE",message:"palette must be an object"});else for(let[q,ue]of Object.entries(r.palette))(typeof ue!="string"||!sp.test(ue))&&n.push({level:"warning",path:`palette.${q}`,code:"PALETTE_COLOR",message:"a colour is #rrggbb or #rrggbbaa; ignored"});if(r.texts!==void 0)if(!ut(r.texts))n.push({level:"error",path:"texts",code:"TEXTS_SHAPE",message:"texts must be an object"});else for(let[q,ue]of Object.entries(r.texts)){if(ip.test(q)||n.push({level:"error",path:`texts.${q}`,code:"TEXT_KEY",message:"text key: lower case, digits, _ . -"}),!ut(ue)){n.push({level:"error",path:`texts.${q}`,code:"TEXT_SHAPE",message:"a text is { lang: text }"});continue}for(let[fe,ie]of Object.entries(ue))(!ap.test(fe)||typeof ie!="string")&&n.push({level:"error",path:`texts.${q}.${fe}`,code:"TEXT_LANG",message:"language code like en or pt-BR, value text"});ue.en===void 0&&n.push({level:"warning",path:`texts.${q}`,code:"TEXT_NO_EN",message:"no English text: other languages fall back to it"});}let B={...Vl};if(r.rewards!==void 0)if(!ut(r.rewards))n.push({level:"error",path:"rewards",code:"REWARDS_SHAPE",message:"rewards must be an object"});else {let q=(fe,ie,ve)=>{let se=r.rewards[fe];if(se===void 0)return;if(typeof se!="number"||!Number.isFinite(se)){n.push({level:"warning",path:`rewards.${fe}`,code:"PARAM_TYPE",message:"expected a number, default used"});return}let Me=Math.min(Math.max(se,ie),ve);Me!==se&&n.push({level:"warning",path:`rewards.${fe}`,code:"PARAM_CLAMPED",message:`${se} \u2192 ${Me}`}),B[fe]=Me;};q("adMultiplier",1,10),q("vipMultiplier",1,20);let ue=r.rewards.window;ue!==void 0&&(typeof ue=="string"&&/^[A-Za-z0-9_-]{1,64}$/.test(ue)?B.window=ue:n.push({level:"warning",path:"rewards.window",code:"PARAM_TYPE",message:"expected a window id, default used"}));}let Q=r.multiplayer??"none";Hl.includes(Q)||n.push({level:"error",path:"multiplayer",code:"SPEC_MULTIPLAYER",message:`multiplayer is one of ${Hl.join(", ")}`});let ae=!Wa(n);return {ok:ae,issues:n,spec:r,...ae?{resolved:{spec:r,engine:r.engine,seed:typeof r.seed=="string"&&r.seed.length>0?r.seed:"game",modes:d,resources:x,flows:O,rules:M,vars:$,rewards:B,multiplayer:Q,palette:i({...G?.palette,...ut(r.palette)?r.palette:{}}),texts:dp(G?.texts,ut(r.texts)?r.texts:void 0),look:{style:G?G.style??G.id:m.style,cast:cp({...l,...G?.cast},r.cast)}}}:{}}}function cp(e,t){let n={...e};if(!ut(t))return n;for(let[s,r]of Object.entries(t)){if(!ut(r))continue;let o={...n[s]};typeof r.preset=="string"&&(o.preset=r.preset),Array.isArray(r.races)&&r.races.every(c=>typeof c=="string")&&r.races.length>0&&(o.races=r.races),ut(r.parts)&&(o.parts={...o.parts,...r.parts}),ut(r.colors)&&(o.colors={...o.colors,...r.colors}),n[s]=o;}return n}function dp(e,t){let n={};for(let s of [e,t])for(let[r,o]of Object.entries(s??{}))if(o&&typeof o=="object")for(let[c,d]of Object.entries(o))typeof d=="string"&&((n[r]??={})[c]=d);return n}function pp(){let e=Uo();return po(e),e}function up(e,t,n,s={}){let r=e.modes.find(d=>d.id===t);if(!r)throw new Error(`game: no mode "${t}"`);let o=new c({seed:`${e.seed}/${r.id}${s.salt!==void 0?`/${s.salt}`:""}`,vars:e.vars});for(let d of r.preset.blocks)n.require(Vn,d).setup?.({world:o,spec:e,mode:r,params:r.blockParams[d]??{},registry:n});let c$1=za(o,[...r.rules,...e.rules],n,{...s.onRuleError?{onError:s.onRuleError}:{}});return o.emit("mode-started",{mode:r.id}),o.flushEvents(),{world:o,mode:r,stop:c$1}}var Ie=e=>({w:Number(e.vars.view_w??720),h:Number(e.vars.view_h??1280)}),Ze=e=>e.vars.state==="playing",Kn=e=>e.vars.started_tick===e.tick,qe=(e,t,n)=>{let s=Number(e.vars[t]??0)+n;return e.vars[t]=s,s},nn=(e,t)=>Number(e[t]);function Et(e$1,t,n,s,r){let o=e$1.create();return e$1.set(o,e,{x:t,y:n}),e$1.set(o,f,s),r&&e$1.set(o,r.type,r.data),o}var rt=(e,t)=>{for(let n of e.query(t))e.destroy(n);};function _r(e){let t=new Set,n={down:false,x:0,y:0};return e.on(j,s=>{let r=s;r.type==="key"?t.add(r.key):r.type==="key-up"?t.delete(r.key):r.type==="press"||r.type==="move"?(n.down=true,n.x=r.x,n.y=r.y):r.type==="release"&&(n.down=false);}),{keys:t,pointer:n,axis(){return {x:(t.has("right")?1:0)-(t.has("left")?1:0),y:(t.has("down")?1:0)-(t.has("up")?1:0)}}}}function Fn(e,t,n,s){let r=e.h*(s.bottom-s.top),o=Math.floor(Math.min(e.w*(s.widthShare??.94)/t,r/n)),c=(e.w-o*t)/2,d=e.h*s.top+(r-o*n)/2;return {cols:t,rows:n,cell:o,left:c,top:d}}var Qe=(e,t,n)=>({x:e.left+e.cell*(t+.5),y:e.top+e.cell*(n+.5)});function Tn(e,t,n){let s=Math.floor((t-e.left)/e.cell),r=Math.floor((n-e.top)/e.cell);return s>=0&&s<e.cols&&r>=0&&r<e.rows?{col:s,row:r}:null}var Ul=["piece1","piece2","piece3","piece4","piece5","piece6"];b("kit.status");var Zo=e=>{let t=Math.max(0,Math.ceil(e));return `${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`},V=(e,t)=>e.emit(n,t),Mr=b("kit.backdrop");function Tt(e,t,n,s={}){for(let O of e.query(Mr))e.destroy(O);let r=Ie(e),o=(O,M,$,G)=>Et(e,M,$,G,{type:Mr,data:{speed:O}});if(t==="top"){let O=s.pan?1:0;o(O,r.w/2,r.h/2,{shape:"tile",art:"floor",w:r.w,h:r.h,unit:Math.min(r.w,r.h)*.24,depth:-100});let M=e.rng.stream("backdrop"),$=Math.round(r.w*r.h/52e3),G=Math.min(r.w,r.h);for(let B=0;B<$;B++){let Q=G*M.range(.06,.1);o(O,M.range(0,r.w),M.range(0,r.h),{shape:"sprite",art:`decor${M.int(1,4)}`,w:Q,h:Q,depth:-95});}return}let c=n??r.h*.62;o(0,r.w/2,r.h/2,{shape:"sprite",art:"sky",w:r.w,h:r.h,depth:-100});let d=Math.min(r.w,r.h)*.34;o(.02,r.w*.74,c*.3,{shape:"sprite",art:"sun",w:d,h:d,depth:-99});let x=Math.min(r.h*.32,r.w*.55);o(.12,r.w/2,c-x/2,{shape:"tile",art:"far",w:r.w,h:x,depth:-90});let _=x*.62;o(.4,r.w/2,c-_/2+2,{shape:"tile",art:"near",w:r.w,h:_,depth:-80}),t==="board"?o(0,r.w/2,(r.h+c)/2,{shape:"tile",art:"ground",w:r.w,h:r.h-c+4,unit:x*.7,depth:-79}):o(0,r.w/2,(r.h+c)/2,{shape:"rect",w:r.w,h:r.h-c,color:"#140f0c",alpha:.92,depth:-79});}function mo(e,t){for(let n of e.query(Mr)){let s=e.need(n,Mr).speed;if(s<=0)continue;let r=e.need(n,f);r.shape==="tile"&&(r.scrollX=(r.scrollX??0)+t*s);}}function ql(e$1,t,n){let s=Ie(e$1),r=Math.min(s.w,s.h)*.1;for(let o of e$1.query(Mr)){if(e$1.need(o,Mr).speed<=0)continue;let c=e$1.need(o,f);if(c.shape==="tile"){c.scrollX=(c.scrollX??0)+t,c.scrollY=(c.scrollY??0)+n;continue}let d=e$1.need(o,e);d.x-=t,d.y-=n,d.x<-r?d.x+=s.w+2*r:d.x>s.w+r&&(d.x-=s.w+2*r),d.y<-r?d.y+=s.h+2*r:d.y>s.h+r&&(d.y-=s.h+2*r);}}function et(e,t,n){let s=e.get(t,f);s?.shape==="actor"&&(s.pose=n);}function He(e,t,n){let s=e.get(t,f);s?.shape==="actor"&&(s.act=n,s.actN=(s.actN??0)+1);}var Er=b("kit.fading"),Kl=new WeakSet;function rr(e,t,n){e.set(t,Er,{left:n,total:n}),!Kl.has(e)&&(Kl.add(e),e.addSystem({id:"kit.fading",order:90,run(s,r){for(let o of s.query(Er)){let c=s.need(o,Er);c.left-=r;let d=s.get(o,f);d&&(d.alpha=Math.max(0,Math.min(1,c.left/c.total*2))),c.left<=0&&s.destroy(o);}}}));}var Vt=(e,t,n=5)=>n+t/Math.max(1,Ie(e).h),Sr=b("kit.hint"),Fl=new WeakSet,Jo=(e,t,n)=>({x:e+n*.11,y:t+n*.42});function ft(e$1,t,n,s=n,r){Ot(e$1);let o=r??Math.min(Ie(e$1).w,Ie(e$1).h)*.13,c={kind:t,ax:n.x,ay:n.y,bx:s.x,by:s.y,size:o,t:0},d=Jo(n.x,n.y,o);Et(e$1,n.x,n.y,{shape:"circle",r:o*.22,color:"#ffffff",alpha:0,depth:89},{type:Sr,data:{...c,part:"ring"}}),Et(e$1,d.x,d.y,{shape:"sprite",art:"hand",w:o,h:o,alpha:0,depth:90},{type:Sr,data:{...c,part:"hand"}}),!Fl.has(e$1)&&(Fl.add(e$1),e$1.addSystem({id:"kit.hints",order:95,run(x,_){for(let O of x.query(Sr)){let M=x.need(O,Sr);M.t+=_;let $=x.need(O,e),G=x.need(O,f);if(M.kind==="tap"){let B=M.t%1.2/1.2,Q=B>.35&&B<.55;if(M.part==="hand"){let ae=Jo(M.ax,M.ay+(Q?M.size*.06:0),M.size);$.x=ae.x,$.y=ae.y,$.scale=Q?.9:1,G.alpha=Math.min(1,M.t*4);}else {let ae=B<.4?0:(B-.4)/.6;$.scale=1+ae*2.2,G.alpha=B<.4?0:.55*(1-ae);}}else if(M.kind==="swipe"){let B=M.t%1.6/1.6,Q=B<.15?0:B>.75?1:(B-.15)/.6,ae=Q*Q*(3-2*Q),q=M.ax+(M.bx-M.ax)*ae,ue=M.ay+(M.by-M.ay)*ae;if(M.part==="hand"){let fe=Jo(q,ue,M.size);$.x=fe.x,$.y=fe.y,G.alpha=B<.1?B*10:B>.85?Math.max(0,(1-B)/.15):1;}else $.x=q,$.y=ue,G.alpha=B>.15&&B<.8?.35:0;}else {let B=M.t*3,Q=M.ax+Math.cos(B)*M.bx,ae=M.ay+Math.sin(B)*M.bx;if(M.part==="hand"){let q=Jo(Q,ae,M.size);$.x=q.x,$.y=q.y,G.alpha=Math.min(1,M.t*3);}else $.x=Q,$.y=ae,G.alpha=.3;}}}}));}function Ot(e){for(let t of e.query(Sr))e.destroy(t);}var un=e=>e.query(Sr).length>0,ht=(e,t)=>e.vars[`learned:${t}`]===true;function vt(e,t){ht(e,t)||(e.vars[`learned:${t}`]=true,Ot(e));}var Rr=b("round.start"),$t="round-started",Bt="round-over",zt="round-ended",Ga="start-round",Wt="show-start",Gt="revive-offer",Kt="revive",Ft="give-up",Qo={id:"round",version:1,setup({world:e$1}){e$1.vars.state="ready",e$1.vars.score=0,e$1.vars.coins=0,e$1.vars.best=typeof e$1.vars.best=="number"?e$1.vars.best:0,e$1.vars.round=0;let t=s=>{for(let d of s.query(Rr))s.destroy(d);if(s.vars.state!=="ready")return;let r=Ie(s),o=Math.min(r.w,r.h)*.26,c={x:r.w/2,y:r.h*.55};Et(s,r.w/2,r.h/2,{shape:"rect",w:r.w,h:r.h,color:"#05040a",alpha:.4,depth:84},{type:Rr,data:{t:-1}}),Et(s,c.x,c.y,{shape:"sprite",art:"play",w:o,h:o,color:"accent",depth:85},{type:Rr,data:{t:0}}),ft(s,"tap",{x:c.x+o*.12,y:c.y+o*.1});},n=()=>{for(let s of e$1.query(Rr))e$1.destroy(s);Ot(e$1),e$1.vars.state="playing",e$1.vars.score=0,e$1.vars.coins=0,e$1.vars.round=Number(e$1.vars.round??0)+1,e$1.vars.started_tick=e$1.tick,e$1.emit($t,{round:e$1.vars.round});};e$1.on(j,s=>{let r=s;e$1.vars.state==="ready"&&(r.type==="tap"||r.type==="key"&&r.key==="action")&&n();}),e$1.on(Ga,()=>{e$1.vars.state!=="playing"&&n();}),e$1.on(Wt,()=>{e$1.vars.state==="ended"&&(e$1.vars.state="ready",t(e$1));}),e$1.on(k,()=>t(e$1)),e$1.addSystem({id:"round.start",order:96,run(s,r){for(let o of s.query(Rr)){let c=s.need(o,Rr);c.t<0||(c.t+=r,s.need(o,e).scale=1+.06*Math.sin(c.t*5));}}}),t(e$1),e$1.on(Bt,s=>{if(e$1.vars.state!=="playing")return;e$1.vars.state="ended",Ot(e$1);let r=Number(e$1.vars.score??0),o=Math.max(Number(e$1.vars.best??0),r);e$1.vars.best=o,e$1.emit(zt,{score:r,coins:Number(e$1.vars.coins??0),best:o,reason:typeof s.reason=="string"?s.reason:"over",...s.stats&&typeof s.stats=="object"?{stats:s.stats}:{}});});}};var es=["wall","barrier","pit","mover","train","rock"];var go=["magnet","shield","double","dash","flight"],fn={magnet:{art:"magnet",color:"danger",seconds:6,var:"meta:magnet_t",weight:3},shield:{art:"shield",color:"muted",seconds:8,var:"meta:shield_t",weight:2.5},double:{art:"coin2x",color:"coin",seconds:8,var:"meta:double_t",weight:2.5},dash:{art:"boot",color:"accent",seconds:2.5,var:"meta:dash_t",weight:1.5},flight:{art:"wing",color:"secondary",seconds:4,var:"meta:flight_t",weight:1}},yo=20,jl={wall:1,barrier:2,pit:3,mover:4,train:5,rock:6};function Tr(e,t=.5){let n=Math.max(1,Math.min(yo,Math.floor(e))),s=(n-1)/(yo-1),r=es.filter(d=>jl[d]<=n),o=es.find(d=>jl[d]===n)??null,c=330+t*120+s*220;return {level:n,length:Math.round(16e3+(n-1)*3e3),speed:c,topSpeed:c*(1.25+s*.1),density:Math.min(.72,.3+t*.12+s*.3),kinds:r,fresh:o,coinStar:.6,firstClearGold:60+(n-1)*25}}var Or=e=>Math.floor(e/30),Dr=[{id:"hero",cast:"hero",gems:0,perk:"none"},{id:"hero2",cast:"hero2",gems:150,perk:"heart"},{id:"hero3",cast:"hero3",gems:300,perk:"power"}],Ka="kit-runner",Fa=[{id:"MagnetTime",var:"meta:magnet_t",art:"magnet",color:"danger",perLevel:.6,unit:"s",maxLevel:15,price:20,growth:.12},{id:"ShieldTime",var:"meta:shield_t",art:"shield",color:"muted",perLevel:.8,unit:"s",maxLevel:15,price:25,growth:.12},{id:"DoubleTime",var:"meta:double_t",art:"coin2x",color:"coin",perLevel:.8,unit:"s",maxLevel:15,price:25,growth:.12},{id:"DashTime",var:"meta:dash_t",art:"boot",color:"accent",perLevel:.3,unit:"s",maxLevel:15,price:30,growth:.12},{id:"FlightTime",var:"meta:flight_t",art:"wing",color:"secondary",perLevel:.4,unit:"s",maxLevel:15,price:35,growth:.12},{id:"Luck",var:"meta:luck",art:"clover",color:"accent",perLevel:5,unit:"%",maxLevel:20,price:30,growth:.1},{id:"HeadStart",var:"meta:head_start",art:"lightning",color:"primary",perLevel:.4,unit:"s",maxLevel:10,price:50,growth:.15},{id:"Greed",var:"meta:greed",art:"coin",color:"coin",perLevel:2,unit:"%",maxLevel:25,price:40,growth:.1}],Xl={game:"runner",character:Ka,stats:Fa,heroes:Dr,levels:yo,firstClearGold:e=>Tr(e).firstClearGold,stars:3};var xt=b("runner.item"),On=b("runner.player"),ts=b("runner.stripe"),Yl=b("runner.hud"),At=(e,t)=>{let n=Number(e.vars.view_w??720),s=Number(e.vars.view_h??1280),r=Math.min(s*.11,n*.2,s*.5/t),o=s*.6-r*t/2;return {viewW:n,viewH:s,top:o,laneH:r,playerX:Math.min(n*.24,s*.3)}},Ar=(e,t)=>e.top+e.laneH*(t+.72),bo=(e,t)=>{let n=Number(e.vars[t]??0);return Number.isFinite(n)?n:0},Mt={wall:1.3,barrier:.5,mover:1,train:.95,rock:1.05,jump:1.25,flight:1.9},ns={id:"lane-runner",version:2,engines:["phaser"],requires:["round"],params:{lanes:{type:"number",default:3,min:2,max:5,integer:true},difficulty:{type:"number",default:.5,min:0,max:1},coinRate:{type:"number",default:.7,min:0,max:1},powerRate:{type:"number",default:.22,min:0,max:1},lives:{type:"number",default:3,min:1,max:9,integer:true},coinScore:{type:"number",default:10,min:0,max:1e3,integer:true},graceTime:{type:"number",default:1.2,min:0,max:5},jumpTime:{type:"number",default:.62,min:.3,max:1.5},lengthScale:{type:"number",default:1,min:.05,max:5}},setup({world:e$1,params:t,mode:n}){let s=f=>nn(t,f),r=s("lanes"),o=e$1.rng.stream("lane-runner"),c=null,d=f=>({...f,kinds:[...pn(n,"obstacles",f.kinds)]}),x=pn(n,"powers",go),_=d(Tr(1,s("difficulty"))),O=_.length,M=0,$=0,G=0,B=false,Q=false,ae=false,q=0,ue=0,fe=0,ie=0,ve=0,se=0,Me=0,De=3,ge=0,oe=false,ce=new Map,Ae=new Map,Se=()=>Dr.find(f=>f.id===e$1.vars["meta:hero"])??Dr[0],ee=f=>(fn[f].seconds+bo(e$1,fn[f].var))*(Se().perk==="power"?1.25:1),xe=()=>e$1.vars.reviving===true,je=()=>{for(let y of e$1.query(ts))e$1.destroy(y);let f$1=At(e$1,r);Tt(e$1,"side",f$1.top+2);for(let y=0;y<r;y++){let l=e$1.create();e$1.set(l,ts,{index:y}),e$1.set(l,e,{x:f$1.viewW/2,y:f$1.top+f$1.laneH*(y+.5)}),e$1.set(l,f,{shape:"tile",art:"road",w:f$1.viewW,h:f$1.laneH,unit:f$1.laneH*1.28,depth:-20+y*.1});}let m=f$1.viewH-(f$1.top+f$1.laneH*r),p=e$1.create();e$1.set(p,ts,{index:-1}),e$1.set(p,e,{x:f$1.viewW/2,y:f$1.viewH-m/2+1}),e$1.set(p,f,{shape:"tile",art:"ground",w:f$1.viewW,h:m+2,unit:f$1.laneH*1.2,depth:-21});},we=(f,m,p)=>Ar(f,m.lane)-m.alt-p/2,te=(f,m,p,y,l)=>{let u=f.laneH,b=9+p;switch(m){case "wall":return {v:{shape:"sprite",art:"obstacle",w:y,h:u*Mt.wall,depth:b},h:u*Mt.wall};case "barrier":return {v:{shape:"sprite",art:"hurdle",w:y,h:u*Mt.barrier,depth:b},h:u*Mt.barrier};case "pit":return {v:{shape:"sprite",art:"pit",w:y,h:u*.42,depth:-19+p*.1+.05},h:-u*.42};case "mover":return {v:{shape:"actor",cast:"foe",h:u*1.5,pose:"run",facing:-1,depth:b},h:u*1.5};case "train":return {v:{shape:"sprite",art:"wagon",w:y,h:u*Mt.train,depth:b},h:u*Mt.train};case "ramp":return {v:{shape:"sprite",art:"ramp",w:y,h:u*Mt.train,depth:b},h:u*Mt.train};case "rock":return {v:{shape:"sprite",art:"shadow",w:y,h:u*.3,alpha:.5,depth:-19+p*.1+.06},h:-u*.3};case "coin":return {v:{shape:"sprite",art:"coin",w:y,h:y,depth:b+.2},h:y};case "power":return {v:{shape:"sprite",art:fn[l??"magnet"].art,color:fn[l??"magnet"].color,w:y,h:y,depth:b+.2},h:y};case "finish":return {v:{shape:"sprite",art:"finish",w:u*.7,h:u*r+u*.9,depth:8},h:0}}},me=(f$1,m,p,y={})=>{let l=At(e$1,r),u=y.size??(f$1==="coin"?l.laneH*.42:f$1==="power"?l.laneH*.62:l.laneH*.85),b=y.alt??(f$1==="coin"?l.laneH*.5:f$1==="power"?l.laneH*.6:0),A=e$1.create();e$1.set(A,xt,{lane:m,kind:f$1,size:u,alt:b,...y.power!==void 0?{power:y.power}:{}});let{v:I,h:N}=te(l,f$1,m,u,y.power),U=l.viewW+l.laneH+u/2+p,X=f$1==="finish"?l.top+l.laneH*r/2:N<0?Ar(l,m)+N/2+l.laneH*.08:we(l,{lane:m,alt:b},N);return e$1.set(A,e,{x:U,y:X}),e$1.set(A,f,I),f$1==="coin"&&ie++,A},Ee=(f,m,p,y)=>{let l=At(e$1,r);for(let u=0;u<p;u++)me("coin",f,m+u*l.laneH*.75,y!==void 0?{alt:y}:{});},Re=(f,m)=>{let p=1+bo(e$1,"meta:luck");o.chance(Math.min(.9,s("powerRate")*p))&&me("power",f,m,{power:o.weighted(x,y=>fn[y].weight)});},Ce=f=>_.kinds.includes(f),Y=()=>[...Array(r).keys()],Le=f=>{let m=["wall",...Ce("barrier")?["barrier"]:[],...Ce("pit")?["pit"]:[]],p=new Map;for(let u of Y())o.chance(_.density)&&p.set(u,o.pick(m));p.size>=r&&p.delete(o.int(0,r-1));let y=At(e$1,r);for(let[u,b]of p)me(b,u,f,b==="pit"?{size:y.laneH*1.25}:{});let l=Y().filter(u=>!p.has(u));l.length>0&&o.chance(s("coinRate"))&&Ee(o.pick(l),f-y.laneH,3);for(let[u,b]of p)(b==="barrier"||b==="pit")&&o.chance(.5)&&Ee(u,f-y.laneH*.75,3,y.laneH*1.3);},Ye=()=>{let m=At(e$1,r).laneH,p=l=>l+Math.round(_.density*3),y=[{id:"scatter",weight:3,make:l=>{let u=p(2);for(let b=0;b<u;b++)Le(b*l);return Re(o.int(0,r-1),u*l-l/2),u*l}},{id:"rest",weight:1,make:l=>{let u=o.int(0,r-1);for(let b=0;b<4;b++)Ee(u,b*l*.8,3),u=Math.max(0,Math.min(r-1,u+(o.chance(.5)?1:-1)));return Re(u,4*l*.8),4*l*.8}}];return _.level>=3&&y.push({id:"corridor",weight:2,make:l=>{let u=p(3),b=o.int(0,r-1);for(let A=0;A<u;A++){for(let I of Y())I!==b&&me("wall",I,A*l);Ee(b,A*l-m*.4,2),A%2===1&&(b=Math.max(0,Math.min(r-1,b+(o.chance(.5)?1:-1))));}return u*l}}),(Ce("barrier")||Ce("pit"))&&y.push({id:"hurdles",weight:2,make:()=>{let l=Math.max(m*3.6,_.speed*s("jumpTime")*1.45),u=2+Math.round(_.density*2),b=[...Ce("barrier")?["barrier"]:[],...Ce("pit")?["pit"]:[]],A=o.int(0,r-1);for(let I=0;I<u;I++){for(let N of Y()){let U=o.pick(b);me(U,N,I*l,U==="pit"?{size:m*1.25}:{});}Ee(A,I*l-m*.75,3,m*1.3);}return u*l}}),Ce("train")&&y.push({id:"train",weight:2,make:l=>{let u=o.int(0,r-1),b=m*o.int(5,8),A=o.chance(.75),I=m*1.4;A&&me("ramp",u,0,{size:I}),me("train",u,(A?I:0)+b/2-m*.42,{size:b}),A&&Ee(u,I+m*.4,Math.floor(b/(m*.75))-1,m*(Mt.train+.5));let N=Y().filter(X=>X!==u),U=o.pick(N);if(o.chance(.5))me("train",U,l*.5+b/2,{size:b*.8});else for(let X=0;X<2;X++)me("wall",U,l*(.5+X*1.4));return (A?I:0)+b+l*.5}}),Ce("mover")&&y.push({id:"movers",weight:1.5,make:l=>{let u=1+(o.chance(_.density)?1:0),b=new Set;for(let I=0;I<u;I++){let N=o.int(0,r-1);b.has(N)&&(N=(N+1)%r),b.add(N),me("mover",N,I*l*1.6,{size:m*.6});}let A=Y().filter(I=>!b.has(I));return A.length>0&&Ee(o.pick(A),0,4),u*l*1.6}}),Ce("rock")&&y.push({id:"rocks",weight:1.5,make:l=>{let u=2+(o.chance(_.density)?1:0);for(let b=0;b<u;b++){let A=o.int(0,r-1);me("rock",A,b*l*1.2,{size:m*.9});let I=Y().filter(N=>N!==A);Ee(o.pick(I),b*l*1.2,2);}return u*l*1.2}}),y},at=f=>{let m=At(e$1,r),p=Math.floor(r/2),y=_.fresh;if(y===null||y==="wall")return 0;if(y==="barrier"||y==="pit"){for(let l=0;l<3;l++)me(y,p,l*f*1.6,y==="pit"?{size:m.laneH*1.25}:{}),Ee(p,l*f*1.6-m.laneH*.75,3,m.laneH*1.3);return 3*f*1.6}return y==="train"?(me("ramp",p,0,{size:m.laneH*1.4}),me("train",p,m.laneH*1.4+m.laneH*3-m.laneH*.42,{size:m.laneH*6}),Ee(p,m.laneH*1.8,7,m.laneH*(Mt.train+.5)),m.laneH*8+f):(me(y,p,0,{size:y==="mover"?m.laneH*.6:m.laneH*.9}),f*1.5)},_e=()=>{let f=Math.max(At(e$1,r).laneH*2.1,300-_.density*110),m;if(!oe&&_.fresh!==null&&_.fresh!=="wall")oe=true,m=at(f);else {let p=Ye();m=(G>0&&G%4===3?p.find(l=>l.id==="rest"):o.weighted(p,l=>l.weight)).make(f);}G++,$=Number(e$1.vars.distance??0)+m+f*1.2;},Pt=(f,m,p)=>{let y=f.laneH*1.05;return {x:f.playerX,y:Ar(f,m)-p-y/2,h:y}},Ge=()=>{let f$1=At(e$1,r);(c===null||!e$1.isAlive(c))&&(c=e$1.create(),e$1.set(c,On,{lane:Math.floor(r/2),size:f$1.laneH*.5,alt:0,vy:0}),e$1.set(c,f,{shape:"actor",cast:Se().cast,h:0,pose:"idle",depth:10}));let m=e$1.need(c,On);m.size=f$1.laneH*.5;let p=Pt(f$1,m.lane,m.alt);e$1.set(c,e,{x:p.x,y:p.y});let y=e$1.need(c,f);y.shape==="actor"&&(y.cast=Se().cast,y.h=p.h,y.depth=10+m.lane);},Xe=()=>{for(let m of e$1.query(xt))e$1.destroy(m);_t(),_=d(Tr(bo(e$1,"meta:chapter")||1,s("difficulty"))),O=Math.round(_.length*s("lengthScale")),De=s("lives")+(Se().perk==="heart"?1:0),e$1.vars.distance=0,e$1.vars.meters=0,e$1.vars.level_length=O,e$1.vars.runner_length_scale=s("lengthScale"),e$1.vars.runner_level=_.level,e$1.vars.speed=_.speed,e$1.vars.lives=De,e$1.vars.coins=0,e$1.vars.score=0,e$1.vars.mult=1,e$1.vars.stars=0,e$1.vars.reviving=false,M=0,$=At(e$1,r).laneH*2,G=0,B=false,Q=false,ae=false,q=0,ue=0,fe=0,ie=0,ve=0,se=0,Me=0,ge=0,oe=false,ce.clear();let f=bo(e$1,"meta:head_start");if(f>0&&ce.set("dash",f),c!==null&&e$1.isAlive(c)){let m=e$1.need(c,On);m.lane=Math.floor(r/2),m.alt=0,m.vy=0;}Ge();},tt=f=>{if(!Ze(e$1)||xe()||c===null)return;let m=e$1.need(c,On),p=Math.min(r-1,Math.max(0,m.lane+f));p!==m.lane&&vt(e$1,"runner-lanes"),m.lane=p;},ot=()=>{let f=At(e$1,r),m=s("jumpTime");return 8*f.laneH*Mt.jump/(m*m)},ct=(f,m,p)=>{let y=At(f,r),l=y.playerX,u=y.laneH*.22,b=0;for(let A of f.query(xt)){let I=f.need(A,xt);if(I.lane!==m||I.kind!=="train"&&I.kind!=="ramp")continue;let N=f.need(A,e),U=N.x-I.size/2,X=N.x+I.size/2;if(l+u<U||l-u>X)continue;let ye=y.laneH*Mt.train;if(I.kind==="ramp")b=Math.max(b,ye*Math.max(0,Math.min(1,(l-U)/I.size)));else if(p>=ye-y.laneH*.12)b=Math.max(b,ye);else return null}return b},it=()=>{if(!Ze(e$1)||xe()||c===null||ce.has("flight"))return;let f=e$1.need(c,On),m=ct(e$1,f.lane,f.alt)??0;f.alt-m>2||(f.vy=ot()*s("jumpTime")/2,Me++,vt(e$1,"runner-jump"),Ot(e$1),e$1.emit("jumped",{}),He(e$1,c,"jump"));},bt=()=>{if(ht(e$1,"runner-lanes")||c===null)return;let f=At(e$1,r),m=f.playerX+f.laneH*1.6,p=Ar(f,Math.floor(r/2))-f.laneH*.4;ft(e$1,"swipe",{x:m,y:p+f.laneH*.5},{x:m,y:p-f.laneH*.9},f.laneH);},Ke=(f$1,m,p,y)=>{let l=Ae.get(f$1);(l===void 0||!e$1.isAlive(l))&&(l=e$1.create(),e$1.set(l,Yl,{id:f$1}),Ae.set(f$1,l)),e$1.set(l,e,{x:m,y:p}),e$1.set(l,f,y);},ze=f=>{let m=Ae.get(f);m!==void 0&&e$1.destroy(m),Ae.delete(f);};function _t(){for(let f of Ae.values())e$1.destroy(f);Ae.clear(),rt(e$1,Yl);}let Fe=(f,m,p,y,l,u,b,A=41)=>{let I=Math.max(0,Math.min(1,Math.round(u*100)/100));Ke(`${f}:bg`,m,p,{shape:"rect",w:y,h:l,color:"#000000",alpha:.45,radius:l/2,depth:A});let N=Math.max(0,(y-4)*I);N<1?ze(`${f}:fill`):Ke(`${f}:fill`,m-(y-4)/2+N/2,p,{shape:"rect",w:N,h:l-4,color:b,radius:(l-4)/2,depth:A+.01});},Ct=f=>{let m=At(f,r),p=Math.min(m.viewW,m.viewH),y=m.viewH*.085,l=m.viewW*.66,u=Math.max(10,p*.026),b=Number(f.vars.distance??0)/Math.max(1,O);Fe("way",m.viewW/2,y,l,u,b,"accent");let A=p*.055;Ke("flag",m.viewW/2+l/2+A*.45,y-A*.25,{shape:"sprite",art:"flag",w:A,h:A,depth:42}),Ke("lvl",m.viewW/2-l/2-p*.05,y,{shape:"text",text:`${_.level}`,size:Math.round(p*.04),color:"text",bold:true,depth:42});let I=y+p*.07,N=p*.05,U=Number(f.vars.lives??0);for(let Pe=0;Pe<De;Pe++)Ke(`h${Pe}`,m.viewW*.07+Pe*N*1.1,I,{shape:"sprite",art:"heart",w:N,h:N,alpha:Pe<U?1:.25,depth:42});for(let Pe=De;Pe<10;Pe++)ze(`h${Pe}`);let X=p*.045,ye=String(f.vars.coins??0);Ke("coin:i",m.viewW*.93-ye.length*X*.6-X*.7,I,{shape:"sprite",art:"coin",w:X,h:X,depth:42}),Ke("coin",m.viewW*.93-ye.length*X*.6/2,I,{shape:"text",text:ye,size:Math.round(X),color:"text",bold:true,depth:42});let ke=Number(f.vars.mult??1);ke>1?Ke("mult",m.viewW*.9,I+X*1.2,{shape:"text",text:`x${ke}`,size:Math.round(X*1.05),color:"coin",bold:true,depth:42}):ze("mult");let Ue=p*.055,st=0;for(let Pe of go){let re=ce.get(Pe);if(re===void 0){ze(`p:${Pe}`),ze(`pb:${Pe}:bg`),ze(`pb:${Pe}:fill`);continue}let H=m.viewW*.07+st*Ue*1.25,J=I+N*1.25;Ke(`p:${Pe}`,H,J,{shape:"sprite",art:fn[Pe].art,color:fn[Pe].color,w:Ue,h:Ue,depth:42}),Fe(`pb:${Pe}`,H,J+Ue*.7,Ue,Math.max(6,p*.011),re/Math.max(.1,ee(Pe)),"coin",42),st++;}},Ht=(f,m)=>{if(!Ze(f)||Q)return;Q=true;let p=m==="cleared",y=p?1+(ie>0&&ve>=ie*_.coinStar?1:0)+(se===0?1:0):0;f.vars.stars=y,p&&f.vars["meta:first_clear"]===true&&qe(f,"coins",_.firstClearGold);let l=Or(Number(f.vars.distance??0));f.vars.score=ge+l*2+(p?500*y:0),f.vars.reviving=false,f.emit(Bt,{reason:m,stats:{chapter:_.level,seconds:Math.floor(q),cleared:p,stars:y,coins:ve,meters:l,jumps:Me,hits:se}});},It=f=>{if(f.vars.revive_ready===true&&!ae){f.vars.reviving=true,Ot(f),f.emit(Gt,{});return}Ht(f,"crashed");},tn=f=>{if(!xe())return;ae=true,f.vars.reviving=false,f.vars.lives=Math.max(1,Math.ceil(De/2)),M=2.5,ce.set("shield",Math.max(ce.get("shield")??0,3));let m=At(f,r);for(let p of f.query(xt)){let y=f.need(p,xt);if(y.kind==="coin"||y.kind==="power"||y.kind==="finish")continue;let l=f.need(p,e);l.x-y.size/2<m.playerX+m.laneH*6&&(V(f,{kind:"burst",x:l.x,y:l.y,color:"coin",n:8,size:m.laneH*.6}),f.destroy(p));}if(c!==null){let p=f.need(c,On);p.alt=0,p.vy=0,et(f,c,"run");let y=f.need(c,e);V(f,{kind:"ring",x:y.x,y:y.y,color:"coin",size:m.laneH*4});}V(f,{kind:"flash",color:"coin"});},pt=(f,m)=>{if(c===null)return;let p=f.need(m,e),y=At(f,r);if(ce.has("dash")){V(f,{kind:"burst",x:p.x,y:p.y,color:"accent",n:14,size:y.laneH*.8}),V(f,{kind:"shake",power:.6}),f.need(m,xt).kind!=="pit"&&f.destroy(m);return}if(M>0)return;if(ce.has("shield")){ce.delete("shield"),M=.8,V(f,{kind:"ring",x:y.playerX,y:f.need(c,e).y,color:"muted",size:y.laneH*2}),f.need(m,xt).kind!=="pit"&&f.destroy(m);return}se++,ue=0,f.vars.mult=1;let l=Number(f.vars.lives??1)-1;f.vars.lives=l,f.emit("player-hit",{lives:l}),V(f,{kind:"burst",x:p.x,y:p.y,color:"danger",n:14,size:y.laneH*.9}),V(f,{kind:"shake",power:1.5}),He(f,c,"hit"),f.need(m,xt).kind!=="pit"&&f.destroy(m),M=s("graceTime"),l<=0&&It(f);},w=(f,m)=>{let p=f.need(m,xt),y=f.need(m,e),l=At(f,r);if(p.kind==="power"&&p.power!==void 0){ce.set(p.power,ee(p.power)),f.emit("power-up",{id:p.power}),V(f,{kind:"ring",x:y.x,y:y.y,color:fn[p.power].color,size:l.laneH*1.6}),f.destroy(m);return}ue++;let u=Math.min(5,1+Math.floor(ue/12));u>Number(f.vars.mult??1)&&V(f,{kind:"pop",x:l.playerX,y:y.y-l.laneH,text:`x${u}`,color:"coin",size:Math.round(l.laneH*.42)}),f.vars.mult=u;let b=(ce.has("double")?2:1)*(1+bo(f,"meta:greed"));fe+=b;let A=Math.floor(fe);fe-=A,A>0&&qe(f,"coins",A),ve++,ge+=Math.round(b*s("coinScore")*u),f.emit("coin-collected",{value:b}),V(f,{kind:"burst",x:y.x,y:y.y,color:"coin",n:6,size:p.size*1.3}),f.destroy(m);};e$1.on(j,f=>{let m=f;e$1.vars.started_tick!==e$1.tick&&(m.type==="swipe"&&(m.dir==="up"||m.dir==="down")?tt(m.dir==="up"?-1:1):m.type==="swipe"&&m.dir==="right"?it():m.type==="key"&&(m.key==="left"||m.key==="up")?tt(-1):m.type==="key"&&(m.key==="right"||m.key==="down")?tt(1):(m.type==="key"&&m.key==="action"||m.type==="tap")&&it());}),e$1.on($t,()=>{Xe(),c!==null&&et(e$1,c,"run"),bt();}),e$1.on(Wt,Xe),e$1.on(Kt,()=>tn(e$1)),e$1.on(Ft,()=>{xe()&&(e$1.vars.reviving=false,Ht(e$1,"crashed"));}),e$1.on(zt,f=>{c!==null&&e$1.isAlive(c)&&et(e$1,c,f.reason==="cleared"?"dance":"die");for(let m of e$1.query(xt))e$1.need(m,xt).kind==="mover"&&et(e$1,m,"idle");_t();}),e$1.on(k,()=>{je(),c!==null&&Ge();let f$1=At(e$1,r);for(let m of e$1.query(xt)){let p=e$1.need(m,xt),{v:y,h:l}=te(f$1,p.kind,p.lane,p.size,p.power);e$1.set(m,f,y),e$1.need(m,e).y=p.kind==="finish"?f$1.top+f$1.laneH*r/2:l<0?Ar(f$1,p.lane)+l/2+f$1.laneH*.08:we(f$1,p,l);}}),e$1.addSystem({id:"lane-runner",order:0,run(f$1,m){if(!Ze(f$1)||c===null||Q||xe())return;let p=At(f$1,r),y=p.laneH;q+=m;let l=Number(f$1.vars.distance??0),b=(_.speed+(_.topSpeed-_.speed)*Math.min(1,l/Math.max(1,O)))*(ce.has("dash")?1.6:1);f$1.vars.speed=Math.round(b);let A=b*m;f$1.vars.distance=l+A,f$1.vars.meters=Or(l+A),M>0&&(M=Math.max(0,M-m));for(let[re,H]of [...ce])H-m<=0?(ce.delete(re),re==="flight"&&(M=Math.max(M,.8))):ce.set(re,H-m);mo(f$1,A);for(let re of f$1.query(ts)){let H=f$1.need(re,f);H.shape==="tile"&&(H.scrollX=(H.scrollX??0)+A);}let I=O-(l+A);if(!B&&I<=p.viewW-p.playerX+y){B=true;let re=me("finish",0,0);f$1.need(re,e).x=p.playerX+I;}else !B&&l>=$&&I>p.viewW&&_e();let N=f$1.need(c,On),U=ce.has("flight");if(U)N.alt+=(y*Mt.flight-N.alt)*Math.min(1,m*6),N.vy=0,Math.floor((l+A)/(y*.9))!==Math.floor(l/(y*.9))&&me("coin",N.lane,0,{alt:y*(Mt.flight+.4)});else {N.vy-=ot()*m,N.alt+=N.vy*m;let re=ct(f$1,N.lane,N.alt);if(re===null){let H=f$1.query(xt).find(J=>{let j=f$1.need(J,xt);return j.lane===N.lane&&j.kind==="train"&&Math.abs(f$1.need(J,e).x-p.playerX)<j.size/2+y*.22});if(H!==void 0&&pt(f$1,H),Q||xe())return;N.alt=Math.max(0,N.alt);}else N.alt<=re&&(N.alt=re,N.vy=0);}let X=f$1.need(c,e),ye=Pt(p,N.lane,N.alt);X.y+=(ye.y-X.y)*Math.min(1,m*14),X.x=ye.x;let ke=f$1.need(c,f);ke.shape==="actor"&&(ke.alpha=M>0&&Math.floor(f$1.time*12)%2===0?.35:1,ke.depth=10+N.lane+.5,ke.speed=b,ke.pose=N.alt>2&&N.vy!==0?"air":"run");let Ue=y*.24,st=ce.has("magnet"),Pe=N.alt+y*.5;for(let re of f$1.query(xt)){if(!f$1.isAlive(re)||!f$1.has(re,xt))continue;let H=f$1.need(re,xt),J=f$1.need(re,e);if(J.x-=A,H.kind==="mover"){if(J.x-=b*.35*m,H.to===void 0&&J.x-p.playerX<y*6&&J.x-p.playerX>y*3){let E=[H.lane-1,H.lane+1].filter(a=>a>=0&&a<r);H.to=N.lane!==H.lane&&E.includes(N.lane)?N.lane:o.pick(E),H.warn=.45;}if(H.warn!==void 0&&H.warn>0){H.warn-=m;let E=f$1.need(re,f);E.alpha=Math.floor(f$1.time*14)%2===0?.4:1,H.warn<=0&&H.to!==void 0&&(H.lane=H.to,E.alpha=1,E.depth=9+H.lane);}J.y+=(we(p,H,y*1.5)-J.y)*Math.min(1,m*10);}if(H.kind==="rock"&&!H.landed&&J.x-p.playerX<y*2.6&&(H.landed=true,f$1.set(re,f,{shape:"sprite",art:"rock",w:H.size,h:y*Mt.rock,depth:9+H.lane}),J.y=Ar(p,H.lane)-y*Mt.rock/2,V(f$1,{kind:"burst",x:J.x,y:J.y+y*.4,color:"muted",n:10,size:y*.7}),V(f$1,{kind:"shake",power:.5})),H.kind==="rock"&&!H.landed){let E=f$1.need(re,f);E.shape==="sprite"&&(E.alpha=.35+.3*Math.abs(Math.sin(f$1.time*6)));}if(H.kind==="power"&&(J.y=we(p,H,H.size)+Math.sin(f$1.time*4+J.x*.01)*y*.06),J.x+H.size/2<-y*2){f$1.destroy(re);continue}if(H.kind==="finish"){if(J.x<=p.playerX){V(f$1,{kind:"flash",color:"coin"}),Ht(f$1,"cleared");return}continue}if(H.kind==="coin"&&st&&J.x>p.playerX-y*.5&&J.x<p.playerX+y*4&&(H.pulled=true),H.kind==="coin"&&H.pulled){J.x+=(p.playerX-J.x)*Math.min(1,m*10),J.y+=(X.y-J.y)*Math.min(1,m*10),Math.hypot(J.x-p.playerX,J.y-X.y)<y*.4&&w(f$1,re);continue}let j=H.kind==="barrier"?H.size*.3:H.size/2;if(Math.abs(J.x-p.playerX)>Ue+j||H.lane!==N.lane)continue;if(H.kind==="coin"||H.kind==="power"){(Math.abs(H.alt-Pe)<y*.6||U)&&w(f$1,re);continue}if(U||H.kind==="ramp"||H.kind==="train"||H.kind==="rock"&&!H.landed)continue;let k=H.kind==="wall"?Mt.wall:H.kind==="barrier"?Mt.barrier*.85:H.kind==="mover"?Mt.mover:H.kind==="rock"?Mt.rock:0;if(H.kind==="pit"?N.alt<2&&Math.abs(J.x-p.playerX)<H.size*.32&&pt(f$1,re):N.alt<y*k&&pt(f$1,re),Q||xe())return}ht(f$1,"runner-jump")||f$1.query(xt).find(H=>{let J=f$1.need(H,xt),j=f$1.need(H,e).x-p.playerX;return (J.kind==="barrier"||J.kind==="pit")&&J.lane===N.lane&&j>y*1.5&&j<y*3.2})!==void 0&&!un(f$1)&&ft(f$1,"tap",{x:p.playerX+y*1.2,y:X.y}),f$1.vars.score=ge+Or(l+A)*2,Ct(f$1);}}),je(),Xe();}};var or=[{id:"rainbow",shape:"color",art:"m3_rainbow",make:e=>e>=5},{id:"bomb",shape:"area:1",art:"m3_bomb",make:(e,t)=>t},{id:"col",shape:"col",art:"m3_col",make:(e,t,n)=>e===4&&n==="h"},{id:"row",shape:"row",art:"m3_row",make:(e,t,n)=>e===4&&n==="v"}],Jl=[{a:"row",b:"row",effect:"cross"},{a:"col",b:"col",effect:"cross"},{a:"row",b:"col",effect:"cross"},{a:"bomb",b:"row",effect:"cross:1"},{a:"bomb",b:"col",effect:"cross:1"},{a:"bomb",b:"bomb",effect:"area:2"},{a:"rainbow",b:"plain",effect:"color"},{a:"rainbow",b:"row",effect:"turn"},{a:"rainbow",b:"col",effect:"turn"},{a:"rainbow",b:"bomb",effect:"turn"},{a:"rainbow",b:"rainbow",effect:"all"}],Dn={ice:{id:"ice",layer:"under",hp:1,art:"m3_ice",max:20},slime:{id:"slime",layer:"under",hp:1,art:"m3_slime",spreads:true,max:16},chain:{id:"chain",layer:"over",hp:1,art:"m3_chain",max:10},stone:{id:"stone",layer:"block",hp:1,art:"m3_stone",hitByNear:true,max:10},cage:{id:"cage",layer:"block",hp:1,art:"m3_cage",hitByNear:true}},Ua={"-":{},".":{hole:true},i:{under:{id:"ice",hp:1}},I:{under:{id:"ice",hp:2}},m:{under:{id:"slime",hp:1}},c:{over:{id:"chain",hp:1}},s:{block:{id:"stone",hp:1}},S:{block:{id:"stone",hp:2}},g:{block:{id:"cage",hp:1}}},ko={fire:{beats:["nature"],color:"piece1"},water:{beats:["fire"],color:"piece2"},nature:{beats:["water"],color:"piece3"},light:{beats:["dark"],color:"piece4"},dark:{beats:["light"],color:"piece5"}},qa=[{index:0,art:"gem1",color:"piece1",role:"attack",element:"fire"},{index:1,art:"gem2",color:"piece2",role:"attack",element:"water"},{index:2,art:"gem3",color:"piece3",role:"attack",element:"nature"},{index:3,art:"gem4",color:"piece4",role:"attack",element:"light"},{index:4,art:"gem5",color:"piece5",role:"attack",element:"dark"},{index:5,art:"m3_heart",color:"danger",role:"heal"},{index:6,art:"m3_shield",color:"primary",role:"shield"},{index:7,art:"gem6",color:"piece6",role:"attack"}],So=e=>qa.find(t=>t.index===e),ja=[{id:"goblin",cast:"foe5",element:"nature",hp:1,attack:1,every:3,size:.8},{id:"wolf",cast:"foe",element:"nature",hp:.8,attack:.7,every:2,size:.85},{id:"orc",cast:"foe",variant:5,element:"fire",hp:1.4,attack:1.3,every:3,skill:{kind:"sow",obstacle:"stone",count:2},size:.95},{id:"frost-imp",cast:"foe3",element:"water",hp:1,attack:.9,every:3,skill:{kind:"sow",obstacle:"ice",count:3},size:.85},{id:"spider",cast:"foe4",element:"dark",hp:1.1,attack:1,every:3,skill:{kind:"sow",obstacle:"chain",count:3},size:.85},{id:"golem",cast:"foe2",element:"light",hp:2,attack:1.5,every:4,skill:{kind:"sow",obstacle:"stone",count:3},size:1.05},{id:"slime-beast",cast:"foe2",variant:9,element:"water",hp:1.3,attack:1.1,every:3,skill:{kind:"sow",obstacle:"slime",count:2},size:.95},{id:"shaman",cast:"foe4",variant:7,element:"dark",hp:1,attack:.9,every:3,skill:{kind:"heal",share:.15},size:.9},{id:"troll",cast:"boss",element:"nature",hp:3,attack:1.6,every:3,skill:{kind:"sow",obstacle:"stone",count:3},boss:true,enrage:.5,size:1.2},{id:"frost-queen",cast:"boss",variant:4,element:"water",hp:3.5,attack:1.5,every:3,skill:{kind:"sow",obstacle:"ice",count:5},boss:true,enrage:.5,size:1.2},{id:"spider-queen",cast:"boss",variant:9,element:"dark",hp:4,attack:1.7,every:3,skill:{kind:"sow",obstacle:"chain",count:4},boss:true,enrage:.5,size:1.2},{id:"lich",cast:"boss",variant:13,element:"dark",hp:4.5,attack:1.8,every:3,skill:{kind:"sow",obstacle:"slime",count:3},boss:true,enrage:.5,size:1.25}],Eo=e=>ja.find(t=>t.id===e),rs=100,Zl=4,Ql=1.5,ec=2,tc=1,Xa=[{id:"blast",art:"m3_skill_blast",mana:30,kind:"shape",shape:"area:1",bigShape:"area:2",bigAt:1.5,damage:6},{id:"cross",art:"m3_skill_cross",mana:28,kind:"shape",shape:"cross",bigShape:"cross:1",bigAt:1.5,damage:5},{id:"storm",art:"m3_skill_storm",mana:34,kind:"storm",count:4,damage:4}],os=e=>Xa.find(t=>t.id===e),Lr=[{id:"hero",cast:"hero",gems:0,element:"fire",skill:"blast"},{id:"hero2",cast:"hero2",gems:150,element:"light",skill:"cross"},{id:"hero3",cast:"hero3",gems:300,element:"water",skill:"storm"}],ss={plain:["--------","--------","--------","--------","--------","--------","--------","--------"],diamond:["..----..",".------.","--------","--------","--------","--------",".------.","..----.."],"ice-mid":["--------","--------","--iiii--","--iiii--","--iiii--","--iiii--","--------","--------"],"ice-low":["--------","--------","--------","--------","iiiiiiii","iiiiiiii","IIIIIIII","IIIIIIII"],stones:["--------","--------","--------","ss-ss-ss","--------","--------","--------","--------"],chains:["--------","-c----c-","--c--c--","---cc---","---cc---","--c--c--","-c----c-","--------"],cages:["--------","-g----g-","--------","---gg---","--------","--------","-g----g-","--------"],slime:["--------","--------","--------","--------","--------","--------","mm----mm","mmm--mmm"],hourglass:["--------","--------",".------.","..----..","..----..",".------.","--------","--------"],ring:["--------","--------","--------","---..---","---..---","--------","--------","--------"],"ice-stone":["--------","-S----S-","--IIII--","--IIII--","--IIII--","--IIII--","-S----S-","--------"],fortress:["s------s","-iiiiii-","-i-cc-i-","-ic--ci-","-ic--ci-","-i-cc-i-","-iiiiii-","s------s"],"slime-cages":["-g----g-","--------","--------","---mm---","---mm---","--------","--------","-g----g-"],"cross-holes":["---..---","--------","--------",".------.",".------.","--------","--------","---..---"]},mt=(e,t,n,s,r)=>({kind:"goal",board:e,moves:t,colors:n,goals:s,...r?{drops:r}:{}}),Ut=(e,t,...n)=>({kind:"battle",board:e,elements:t,enemies:n}),on=(e,t)=>({kind:"color",color:e,count:t}),kt=e=>({kind:"clear",obstacle:e}),vo=e=>({kind:"drops",count:e}),as=[mt("plain",20,5,[on(0,12),on(1,12)]),mt("diamond",20,5,[on(2,15),on(3,15)]),Ut("plain",3,"goblin"),mt("ice-mid",22,5,[kt("ice")]),mt("ring",20,5,[on(0,20),on(4,20)]),Ut("plain",3,"goblin","wolf"),mt("stones",22,5,[kt("stone"),on(1,15)]),mt("ice-low",25,5,[kt("ice")]),Ut("diamond",3,"wolf","orc"),Ut("plain",3,"troll"),mt("chains",24,5,[kt("chain")]),mt("plain",25,5,[vo(3)],3),Ut("plain",4,"frost-imp","goblin"),mt("cages",22,5,[kt("cage")]),mt("slime",25,5,[kt("slime")]),Ut("ice-mid",4,"orc","frost-imp"),mt("hourglass",24,5,[vo(3),on(2,20)],3),mt("ice-low",26,5,[kt("ice")]),Ut("plain",4,"spider","frost-imp","wolf"),Ut("plain",4,"frost-queen"),mt("ice-stone",26,5,[kt("ice"),kt("stone")]),mt("cross-holes",26,6,[on(0,20),on(3,20)]),Ut("chains",4,"spider","golem"),mt("fortress",28,5,[kt("ice"),kt("chain")]),mt("slime-cages",26,5,[kt("cage"),kt("slime")]),Ut("plain",4,"slime-beast","golem"),mt("diamond",28,5,[vo(3)],3),mt("ice-low",28,5,[kt("ice"),on(4,20)]),Ut("ring",5,"shaman","golem","spider"),Ut("plain",5,"spider-queen"),mt("fortress",28,6,[kt("ice"),kt("chain")]),mt("slime",28,5,[kt("slime"),vo(3)],3),Ut("ice-stone",5,"golem","shaman"),mt("ice-stone",28,6,[kt("ice"),kt("stone")]),mt("slime-cages",28,6,[kt("cage"),kt("slime")]),Ut("plain",5,"slime-beast","shaman","orc"),mt("cross-holes",30,5,[vo(3),on(1,18)],3),mt("fortress",32,5,[kt("ice"),kt("chain"),on(2,15)]),Ut("diamond",5,"golem","shaman","spider"),Ut("plain",5,"lich")],xo=10,nc=4,is=as.length,Ya=[0,18,45,75];function fp(e){return e.kind==="goal"?[0,1,2,3,4,7].slice(0,Math.max(3,Math.min(6,e.colors))):[...[0,1,2,3,4].slice(0,Math.max(2,Math.min(5,e.elements))),5,6]}function wr(e,t=.5){let n=Math.max(1,Math.min(is,Math.floor(e))),s=as[n-1],r=Math.ceil(n/xo),o=s.kind==="battle"&&s.enemies.some(c=>Eo(c)?.boss);return {level:n,world:r,index:n-(r-1)*xo,def:s,boss:o,colors:fp(s),enemyHp:180*Math.pow(1.07,n-1)*(.8+t*.4),enemyAttack:14*Math.pow(1.06,n-1)*(.8+t*.4),firstClearGold:(o?120:50)+(n-1)*10}}var Ja=e=>Ya[Math.ceil(Math.max(1,e)/xo)-1]??0,Za=(e,t)=>t?e>=.7?3:e>=.35?2:1:e>=.3?3:e>=.1?2:1,rc=5,oc=.5,Qa="kit-match3",ei=[{id:"Attack",var:"meta:attack",art:"m3_skill_blast",color:"danger",perLevel:5,unit:"%",maxLevel:20,price:40,growth:.12},{id:"Health",var:"meta:health",art:"m3_heart",color:"danger",perLevel:6,unit:"%",maxLevel:20,price:40,growth:.12},{id:"Defense",var:"meta:defense",art:"m3_shield",color:"primary",perLevel:5,unit:"%",maxLevel:15,price:45,growth:.12},{id:"SkillPower",var:"meta:skill",art:"m3_skill_cross",color:"secondary",perLevel:8,unit:"%",maxLevel:10,price:50,growth:.12},{id:"ManaGain",var:"meta:mana",art:"m3_skill_storm",color:"secondary",perLevel:5,unit:"%",maxLevel:10,price:50,growth:.12},{id:"Moves",var:"meta:moves",art:"m3_bomb",color:"coin",perLevel:1,unit:"",maxLevel:5,price:120,growth:.2}],sc={game:"match3",character:Qa,stats:ei,heroes:Lr,levels:is,firstClearGold:e=>wr(e).firstClearGold,stars:3,starsToEnter:Ja};var ri=()=>({cleared:[],created:[],fired:[],hits:[],spawned:[],dropsCollected:0,slimeCleared:false}),oi=-1,An=-2,ds=(e,t,n)=>t>=0&&n>=0&&t<e.cols&&n<e.rows,Un=(e,t,n)=>ds(e,t,n)?e.cells[n][t]:null,ps=(e,t)=>t[Math.floor(e.rnd()*t.length)%t.length],ac=[[1,0],[-1,0],[0,1],[0,-1]],ti=e=>e.hole||e.block!==null||e.over!==null,hp=e=>e!==null&&e.color>=0;function us(e,t,n,s,r=0){let o={cols:e[0].length,rows:e.length,cells:e.map(c=>[...c].map(d=>{let x=s[d]??{};return {hole:x.hole===true,piece:null,under:x.under?{...x.under}:null,over:x.over?{...x.over}:null,block:x.block?{...x.block}:null}})),colors:t,nextId:1,dropsToSpawn:r,rnd:n};return ni(o),o}var cs=(e,t,n=null)=>({id:e.nextId++,color:t,special:n});function ni(e){for(let t=0;t<50;t++){for(let n=0;n<e.rows;n++)for(let s=0;s<e.cols;s++){let r=e.cells[n][s];if(r.hole||r.block||r.piece&&r.piece.color<0||r.piece?.special)continue;let o=new Set,c=Un(e,s-1,n)?.piece,d=Un(e,s-2,n)?.piece;c&&d&&c.color>=0&&c.color===d.color&&o.add(c.color);let x=Un(e,s,n-1)?.piece,_=Un(e,s,n-2)?.piece;x&&_&&x.color>=0&&x.color===_.color&&o.add(x.color);let O=e.colors.filter($=>!o.has($)),M=ps(e,O.length>0?O:e.colors);r.piece?r.piece.color=M:r.piece=cs(e,M);}if(Pr(fs(e)).size===0&&Cr(e)!==null)return}}function si(e){for(let t=0;t<e.rows;t++)for(let n=0;n<e.cols;n++){let s=e.cells[t][n].piece;s&&s.color>=0&&!s.special&&!e.cells[t][n].over&&(s.color=-100);}for(let t=0;t<e.rows;t++)for(let n=0;n<e.cols;n++)e.cells[t][n].piece?.color===-100&&(e.cells[t][n].piece.color=ps(e,e.colors));if(ni(e),Cr(e)===null){for(let t of e.cells)for(let n of t)n.over=null;ni(e);}}var fs=e=>e.cells.map(t=>t.map(n=>n.piece&&n.piece.color>=0&&!n.block?n.piece.color:null));function Pr(e){let t=new Set;for(let n of ic(e))for(let[s,r]of n.cells)t.add(`${s},${r}`);return t}function ic(e){let t=[],n=e.length,s=e[0]?.length??0;for(let r=0;r<n;r++)for(let o=0;o<s;){let c=e[r][o],d=1;for(;c!=null&&o+d<s&&e[r][o+d]===c;)d++;c!=null&&d>=3&&t.push({cells:Array.from({length:d},(x,_)=>[o+_,r]),dir:"h"}),o+=d;}for(let r=0;r<s;r++)for(let o=0;o<n;){let c=e[o][r],d=1;for(;c!=null&&o+d<n&&e[o+d][r]===c;)d++;c!=null&&d>=3&&t.push({cells:Array.from({length:d},(x,_)=>[r,o+_]),dir:"v"}),o+=d;}return t}function ai(e){return mp(e)!==null}function mp(e){let t=e.length,n=e[0]?.length??0,s=(r,o)=>{let c=e[r[1]][r[0]];e[r[1]][r[0]]=e[o[1]][o[0]],e[o[1]][o[0]]=c;};for(let r=0;r<t;r++)for(let o=0;o<n;o++)for(let[c,d]of [[1,0],[0,1]]){if(o+c>=n||r+d>=t||e[r][o]===null||e[r+d][o+c]===null)continue;s([o,r],[o+c,r+d]);let x=Pr(e).size>0;if(s([o,r],[o+c,r+d]),x)return [[o,r],[o+c,r+d]]}return null}function Mo(e,t,n){if(Math.abs(t.col-n.col)+Math.abs(t.row-n.row)!==1)return false;let s=Un(e,t.col,t.row),r=Un(e,n.col,n.row);if(!s||!r)return false;for(let o of [s,r])if(o.hole||o.block||o.over||!o.piece)return false;return true}function Cr(e){let t=fs(e);for(let n=0;n<e.rows;n++)for(let s=0;s<e.cols;s++)for(let[r,o]of [[1,0],[0,1]]){let c={col:s,row:n},d={col:s+r,row:n+o};if(!Mo(e,c,d))continue;let x=e.cells[n][s].piece,_=e.cells[d.row][d.col].piece;if(x.color===An&&_.color===An)continue;if(x.special==="rainbow"||_.special==="rainbow")return [c,d];if(x.special&&_.special)return [c,d];let O=t[n][s];t[n][s]=t[d.row][d.col],t[d.row][d.col]=O;let M=Pr(t).size>0;if(t[d.row][d.col]=t[n][s],t[n][s]=O,M)return [c,d]}return null}function ii(e){let t=new Map;for(let n=0;n<e.rows;n++)for(let s=0;s<e.cols;s++){let r=e.cells[n][s].piece;r&&t.set(r.id,{col:s,row:n,piece:r});}return t}function hs(e,t){let n=0;for(let s of e.cells)for(let r of s)for(let o of [r.under,r.over,r.block])o?.id===t&&n++;return n}function li(e,t,n){if(!Mo(e,t,n))return null;let s=e.cells[t.row][t.col],r=e.cells[n.row][n.col],o=s.piece,c=r.piece;if(o.special==="rainbow"||c.special==="rainbow"||o.special&&c.special){s.piece=c,r.piece=o;let x=ri();return vp(e,x,n,o,t,c),fi(e,x),x}s.piece=c,r.piece=o;let d=lc(e,[t,n]);return d||(s.piece=o,r.piece=c,null)}function ms(e){return lc(e,[])}function ys(e,t,n="skill"){let s=ri(),r=t.filter(o=>ds(e,o.col,o.row)).map(o=>({...o,match:false}));return t[0]&&s.fired.push({...t[0],kind:n}),pi(e,s,r),fi(e,s),s}function ci(e,t){let n=[];if(t)return n;let s=Object.values(Dn).filter(r=>r.spreads);for(let r of s){let o=[];for(let x=0;x<e.rows;x++)for(let _=0;_<e.cols;_++)e.cells[x][_].under?.id===r.id&&o.push({col:_,row:x});if(o.length===0)continue;let c=[];for(let x of o)for(let[_,O]of ac){let M=Un(e,x.col+_,x.row+O);M&&!M.hole&&!M.block&&!M.under&&c.push({col:x.col+_,row:x.row+O});}if(c.length===0)continue;let d=ps(e,c);e.cells[d.row][d.col].under={id:r.id,hp:1},n.push(d);}return n}function di(e,t,n){let s=Dn[t];if(!s)return [];let r=[];for(let d=0;d<e.rows;d++)for(let x=0;x<e.cols;x++){let _=e.cells[d][x];_.hole||_.block||!_.piece||_.piece.color<0||_.piece.special||s.layer==="under"&&_.under||s.layer==="over"&&_.over||r.push({col:x,row:d});}let o=[],c=s.max===void 0?n:Math.max(0,s.max-hs(e,t));for(let d=0;d<Math.min(n,c)&&r.length>0;d++){let x=Math.floor(e.rnd()*r.length)%r.length,_=r.splice(x,1)[0],O=e.cells[_.row][_.col],M={id:t,hp:s.hp};s.layer==="under"?O.under=M:s.layer==="over"?O.over=M:(O.block=M,O.piece=null),o.push(_);}return o}function gs(e,t,n){let s=[];for(let o=0;o<e.rows;o++)for(let c=0;c<e.cols;c++){let d=e.cells[o][c].piece;d&&d.color>=0&&!d.special&&!e.cells[o][c].over&&s.push({col:c,row:o});}let r=[];for(let o=0;o<n&&s.length>0;o++){let c=s.splice(Math.floor(e.rnd()*s.length)%s.length,1)[0];e.cells[c.row][c.col].piece.special=e.rnd()<.5?"row":"col",r.push(c);}return r}function lc(e,t){let n=ic(fs(e));if(n.length===0)return null;let s=ri(),r=[];for(let d of n){let x=new Set(d.cells.map(([M,$])=>`${M},${$}`)),_=r.filter(M=>M.some($=>$.cells.some(([G,B])=>x.has(`${G},${B}`)))),O=[d,..._.flat()];for(let M of _)r.splice(r.indexOf(M),1);r.push(O);}let o=[],c=[];for(let d of r){let x=new Map;for(let $ of d)for(let[G,B]of $.cells)x.set(`${G},${B}`,{col:G,row:B});let _=d.reduce(($,G)=>Math.max($,G.cells.length),0),O=d.some($=>$.dir==="h")&&d.some($=>$.dir==="v"),M=or.filter($=>$.make!==null).find($=>$.make(_,O,d.find(G=>G.cells.length===_).dir));if(M){let $=t.find(B=>x.has(`${B.col},${B.row}`))??(O?yp(d):null)??gp(d.find(B=>B.cells.length===_)),G=e.cells[$.row][$.col].piece?.color??0;c.push({at:$,special:M.id,color:G});}for(let $ of x.values())o.push({...$,match:true});}pi(e,s,o);for(let d of c){let x=e.cells[d.at.row][d.at.col];x.piece||x.block||x.hole||(x.piece=cs(e,d.special==="rainbow"?oi:d.color,d.special),s.created.push({...d.at,piece:x.piece}));}return fi(e,s),s}function yp(e){let t=new Set;for(let n of e)for(let[s,r]of n.cells){let o=`${s},${r}`;if(t.has(o))return {col:s,row:r};t.add(o);}return null}var gp=e=>{let[t,n]=e.cells[Math.floor(e.cells.length/2)];return {col:t,row:n}};function pi(e,t,n){let s=new Set,r=new Set;for(;n.length>0;){let o=n.shift(),c=`${o.col},${o.row}`;if(!ds(e,o.col,o.row))continue;let d=e.cells[o.row][o.col];if(d.hole)continue;if(d.block){!o.match&&!r.has(c)&&(r.add(c),ls(t,d,"block",o));continue}if(s.has(c))continue;s.add(c);let x=d.piece;if(x){if(d.over){ls(t,d,"over",o);continue}if(x.color!==An){if(d.piece=null,t.cleared.push({...o,piece:x}),d.under&&(d.under.id==="slime"&&(t.slimeCleared=true),ls(t,d,"under",o)),o.match)for(let[_,O]of ac){let M=Un(e,o.col+_,o.row+O),$=`${o.col+_},${o.row+O}`;M?.block&&!r.has($)&&Dn[M.block.id]?.hitByNear&&(r.add($),ls(t,M,"block",{col:o.col+_,row:o.row+O}));}x.special&&bp(e,t,x.special,o,x.color,n);}}}}function ls(e,t,n,s){let r=t[n];r.hp-=1,e.hits.push({...s,id:r.id,hp:Math.max(0,r.hp)}),r.hp<=0&&(t[n]=null);}function bp(e,t,n,s,r,o){t.fired.push({...s,kind:n});let d=or.find(x=>x.id===n)?.shape??n;for(let x of ui(e,d,s,r))o.push({...x,match:false});}var bs=(e,t,n)=>ui(e,t,n,-1);function ui(e,t,n,s){let r=[],o=d=>{for(let x=0;x<e.cols;x++)r.push({col:x,row:d});},c=d=>{for(let x=0;x<e.rows;x++)r.push({col:d,row:x});};if(t==="row")o(n.row);else if(t==="col")c(n.col);else if(t==="cross")o(n.row),c(n.col);else if(t.startsWith("cross:")){let d=Number(t.slice(6));for(let x=-d;x<=d;x++)o(n.row+x),c(n.col+x);}else if(t.startsWith("area:")){let d=Number(t.slice(5));for(let x=-d;x<=d;x++)for(let _=-d;_<=d;_++)r.push({col:n.col+_,row:n.row+x});}else if(t==="color"){let d=s>=0?s:cc(e);for(let x=0;x<e.rows;x++)for(let _=0;_<e.cols;_++)e.cells[x][_].piece?.color===d&&r.push({col:_,row:x});}else if(t==="all")for(let d=0;d<e.rows;d++)o(d);return r.filter(d=>ds(e,d.col,d.row))}function cc(e){let t=new Map;for(let r of e.cells)for(let o of r)hp(o.piece)&&!o.block&&t.set(o.piece.color,(t.get(o.piece.color)??0)+1);let n=e.colors[0]??0,s=-1;for(let[r,o]of t)o>s&&(s=o,n=r);return n}function vp(e,t,n,s,r,o){let c=[],d=s.special??"plain",x=o.special??"plain",_=Jl.find(M=>M.a===d&&M.b===x||M.a===x&&M.b===d);e.cells[n.row][n.col].piece=null,e.cells[r.row][r.col].piece=null,t.cleared.push({...n,piece:s},{...r,piece:o}),t.fired.push({...r,kind:_?.effect??"combo"});let O=d==="rainbow"?o:s;if(_?.effect==="color"||_?.effect==="turn"){let M=O.color>=0?O.color:cc(e);for(let $=0;$<e.rows;$++)for(let G=0;G<e.cols;G++){let B=e.cells[$][G].piece;B?.color===M&&(_.effect==="turn"&&O.special&&O.special!=="rainbow"&&(B.special=O.special==="row"||O.special==="col"?e.rnd()<.5?"row":"col":O.special),c.push({col:G,row:$,match:false}));}}else for(let M of ui(e,_?.effect??"cross",r,O.color))c.push({...M,match:false});pi(e,t,c);}function fi(e,t){for(let n=0;n<4;n++){for(let r=0;r<e.cols;r++){let o=e.rows-1;for(;o>=0;){if(ti(e.cells[o][r])){o--;continue}let c=o;for(;c-1>=0&&!ti(e.cells[c-1][r]);)c--;let d=[];for(let O=o;O>=c;O--){let M=e.cells[O][r].piece;M&&d.push(M);}let x=o;for(let O of d)e.cells[x--][r].piece=O;let _=-1;for(;x>=c;x--){let O=c===xp(e,r)&&e.dropsToSpawn>0&&Sp(e)<2&&e.rnd()<.35,M=O?cs(e,An):cs(e,ps(e,e.colors));O&&e.dropsToSpawn--,e.cells[x][r].piece=M,t.spawned.push({col:r,row:x,piece:M,from:c+_--});}o=c-1;}}let s=false;for(let r=0;r<e.cols;r++){let o=kp(e,r);if(o<0)continue;let c=e.cells[o][r];c.piece?.color===An&&(c.piece=null,t.dropsCollected++,s=true);}if(!s)break}}var xp=(e,t)=>{for(let n=0;n<e.rows;n++)if(!ti(e.cells[n][t]))return n;return -1},kp=(e,t)=>{for(let n=e.rows-1;n>=0;n--)if(!e.cells[n][t].hole)return e.cells[n][t].block?-1:n;return -1},Sp=e=>{let t=0;for(let n of e.cells)for(let s of n)s.piece?.color===An&&t++;return t};var Ep="boss-spawned",Mp="boss-defeated",qn=b("match3.gem"),dc=b("match3.overlay"),hi=b("match3.layer"),pc=b("match3.backdrop"),uc=b("match3.part"),Ln=(e,t)=>{let n=Number(e.vars[t]??0);return Number.isFinite(n)?n:0},vs={id:"match3",version:2,engines:["phaser"],requires:["round"],params:{difficulty:{type:"number",default:.5,min:0,max:1},pieceScore:{type:"number",default:10,min:1,max:1e3,integer:true},coinEvery:{type:"number",default:8,min:1,max:100,integer:true},moveBonus:{type:"number",default:100,min:0,max:1e4,integer:true}},setup({world:e$1,params:t}){let n=k=>nn(t,k),s=e$1.rng.stream("match3"),r=wr(1,n("difficulty")),o=us(ss.plain,[0,1,2,3,4],()=>s.next(),Ua),c=Pt(),d="idle",x=new Map,_=new Map,O=null,M=null,$=null,G=null,B=0,Q=false,ae=0,q=0,ue=0,fe=0,ie=0,ve=false,se=false,Me={colors:new Map,drops:0},De=rs,ge=rs,oe=0,ce=0,Ae=false,Se=[],ee=null,xe=0,je=0,we=0,te=null,me=[],Ee=new Map,Re=()=>Lr.find(k=>k.id===e$1.vars["meta:hero"])??Lr[0],Ce=()=>os(Re().skill),Y=()=>r.def.kind==="battle",Le=()=>e$1.vars.reviving===true,Ye=()=>Zl*Math.pow(1.06,r.level-1)*(1+Ln(e$1,"meta:attack")),at=()=>1+Ln(e$1,"meta:skill"),_e=()=>Ce().mana;function Pt(){return Fn(Ie(e$1),o.cols,o.rows,{top:.33,bottom:.96,widthShare:.94})}let Ge=()=>c.cell,Xe=new Set,tt=(k,E,a,S,L=1)=>{Xe.add(k);let i=Ee.get(k);(i===void 0||!e$1.isAlive(i))&&(i=e$1.create(),e$1.set(i,uc,{id:k}),Ee.set(k,i)),e$1.set(i,e,{x:E,y:a,scale:L}),e$1.set(i,f,S);},ot=k=>{for(let[E,a]of [...Ee])E.startsWith(k)&&(e$1.destroy(a),Ee.delete(E));},ct=k=>{let E=Ge();if(k===oi)return {shape:"sprite",art:"m3_rainbow",w:E*.9,h:E*.9,depth:3};if(k===An)return {shape:"sprite",art:"m3_crate",w:E*.86,h:E*.86,depth:3};let a=So(k);return {shape:"sprite",art:a?.art??"gem1",w:E*.88,h:E*.88,color:a?.color??"piece1",depth:3}},it=(k,E,a,S,L)=>{let i=Qe(c,E,L),h=e$1.create();return e$1.set(h,qn,{id:k,col:E,row:a,kind:S}),e$1.set(h,e,{x:i.x,y:i.y}),e$1.set(h,f,ct(S)),x.set(k,h),h},bt=()=>{let k=ii(o);for(let[E,a]of [...x])k.has(E)||(e$1.destroy(a),x.delete(E));for(let[E,a]of k){let S=x.get(E);S===void 0&&(S=it(E,a.col,a.row,a.piece.color,a.row-o.rows));let L=e$1.need(S,qn);L.col=a.col,L.row=a.row,L.kind!==a.piece.color&&(L.kind=a.piece.color,e$1.set(S,f,ct(a.piece.color)));let i=a.piece.special&&a.piece.special!=="rainbow"?or.find(D=>D.id===a.piece.special):void 0,h=_.get(E);i&&h===void 0&&(h=e$1.create(),e$1.set(h,dc,{of:E}),e$1.set(h,e,{x:0,y:0}),_.set(E,h)),i&&h!==void 0&&e$1.set(h,f,{shape:"sprite",art:i.art,w:Ge()*.95,h:Ge()*.95,depth:4}),!i&&h!==void 0&&(e$1.destroy(h),_.delete(E));}for(let[E,a]of [..._])k.has(E)||(e$1.destroy(a),_.delete(E));Ke();},Ke=()=>{rt(e$1,hi);let k=Ge();for(let E=0;E<o.rows;E++)for(let a=0;a<o.cols;a++){let S=o.cells[E][a],L=Qe(c,a,E),i=(h,D,R,v=1)=>{if(!D)return;let g=Dn[D.id],T=e$1.create();e$1.set(T,hi,{key:h}),e$1.set(T,e,{x:L.x,y:L.y}),e$1.set(T,f,{shape:"sprite",art:D.hp>=2&&g?.id==="ice"?"m3_ice2":D.hp>=2&&g?.id==="stone"?"m3_stone2":g?.art??"m3_stone",w:k*v,h:k*v,depth:R});};i(`u${a},${E}`,S.under,1.5,.98),i(`o${a},${E}`,S.over,5,.98),i(`b${a},${E}`,S.block,3,.95);}},ze=()=>{rt(e$1,pc),Tt(e$1,"board",c.top+c.cell*o.rows*.35);let k=Ge(),E=Qe(c,(o.cols-1)/2,(o.rows-1)/2),a=k*.25,S=(L,i,h)=>{let D=e$1.create();e$1.set(D,pc,{i:0}),e$1.set(D,e,{x:L,y:i}),e$1.set(D,f,h);};S(E.x,E.y,{shape:"sprite",art:"panel",w:k*o.cols+a*2,h:k*o.rows+a*2,color:"panel",alpha:.9,depth:-10});for(let L=0;L<o.rows;L++)for(let i=0;i<o.cols;i++){if(o.cells[L][i].hole)continue;let h=Qe(c,i,L);S(h.x,h.y,{shape:"sprite",art:"cell",w:k-2,h:k-2,color:(L+i)%2?"panel":"ground",alpha:.85,depth:-9});}},_t=()=>{let k=Ie(e$1),E=k.h*.12,a=c.top-Ge()*.4,S=Math.max(40,(a-E)*.92);if((te===null||!e$1.isAlive(te))&&(te=e$1.create()),e$1.set(te,e,{x:k.w*.15,y:a-S/2}),e$1.set(te,f,{shape:"actor",cast:Re().cast,h:S,pose:"idle",facing:1,depth:20}),ee&&e$1.isAlive(ee.entity)){let L=S*ee.def.size;e$1.set(ee.entity,e,{x:k.w*.82,y:a-L/2});let i=e$1.need(ee.entity,f);i.shape==="actor"&&(i.h=L);}},Fe=()=>r.def.kind!=="goal"?[]:r.def.goals.map(k=>({goal:k,left:k.kind==="color"?Math.max(0,k.count-(Me.colors.get(k.color)??0)):k.kind==="clear"?hs(o,k.obstacle):k.kind==="drops"?Math.max(0,k.count-Me.drops):Math.max(0,k.value-Number(e$1.vars.score??0))})),Ct=()=>Fe().every(k=>k.left===0),Ht=k=>{let E=Ie(e$1).w*.07;if(k.kind==="color"){let a=So(k.color);return {shape:"sprite",art:a?.art??"gem1",w:E,h:E,color:a?.color??"piece1",depth:70}}return k.kind==="clear"?{shape:"sprite",art:Dn[k.obstacle]?.art??"m3_stone",w:E,h:E,depth:70}:k.kind==="drops"?{shape:"sprite",art:"m3_crate",w:E,h:E,depth:70}:{shape:"sprite",art:"coin",w:E,h:E,depth:70}},It=(k,E,a,S,L,i)=>{let h=Math.max(8,S*.09);tt(`${k}:bg`,E,a,{shape:"rect",w:S,h,color:"#000000",alpha:.5,radius:h/2,depth:69});let D=Math.max(1,(S-4)*Math.max(0,Math.min(1,L)));tt(`${k}:fill`,E-(S-4)/2+D/2,a,{shape:"rect",w:D,h:h-4,color:i,radius:(h-4)/2,depth:69.1});},tn=()=>{let k=Ie(e$1),E=Math.min(k.w,k.h),a=(v,g,T,C,P="text",z=E*.045)=>tt(v,g,T,{shape:"text",text:C,size:Math.round(z),color:P,bold:true,depth:70}),S=c.top-Ge()*.4,L=k.h*.085;me=[],Xe.clear();let i=k.w*.36,h=(L+S)/2+E*.02,D=E*.07,R=ce>=_e();if(me.push({id:"skill",x:i,y:h,r:D*1.15}),R&&tt("h:skill:glow",i,h,{shape:"circle",r:D*1.25,color:Ae?"coin":"secondary",alpha:.5+.3*Math.sin(e$1.time*7),depth:68.9}),tt("h:skill:bg",i,h,{shape:"circle",r:D,color:"panel",alpha:.95,depth:69}),tt("h:skill:i",i,h,{shape:"sprite",art:Ce().art,w:D*1.4,h:D*1.4,alpha:R?1:.45,depth:69.2}),It("h:mana",i,h+D*1.45,D*2.2,ce/_e(),"secondary"),Y()){let v=k.w*.15;if(It("h:hp",v,L,k.w*.24,De/ge,"accent"),a("h:hp:t",v+k.w*.12+E*.05,L,`${Math.ceil(De)}`,"text",E*.034),oe>0&&(tt("h:sh:i",v+k.w*.12+E*.05,L+E*.055,{shape:"sprite",art:"m3_shield",w:E*.045,h:E*.045,color:"primary",depth:70}),a("h:sh:t",v+k.w*.12+E*.11,L+E*.055,`${Math.ceil(oe)}`,"primary",E*.03)),ee){let g=k.w*.78;It("h:foe",g,L,k.w*.26,ee.hp/ee.max,"danger"),a("h:foe:t",g-k.w*.13-E*.05,L,`${Math.ceil(ee.hp)}`,"text",E*.034);let T=ko[ee.def.element];tt("h:foe:el",g+k.w*.13+E*.03,L,{shape:"circle",r:E*.018,color:T.color,depth:70});let C=(L+S)/2;tt("h:foe:in:bg",k.w*.62,C,{shape:"circle",r:E*.045,color:ee.in<=1?"danger":"panel",alpha:.95,depth:69}),a("h:foe:in",k.w*.62,C,String(ee.in),"text",E*.045);let P=r.def.kind==="battle"?r.def.enemies.length:0;for(let z=0;z<P;z++)tt(`h:q:${z}`,k.w*.8+(z-(P-1)/2)*E*.04,S+E*.005,{shape:"circle",r:E*.012,color:z<xe?"muted":z===xe?"danger":"text",alpha:.9,depth:70});}}else {a("h:moves",k.w*.5,L+E*.01,String(q),q<=3?"danger":"text",E*.075);let v=Fe(),g=k.w*.64,T=k.w*.11,C=(L+S)/2+E*.02;v.forEach((P,z)=>{let Z=g+z*T;tt(`h:g:${z}`,Z,C,Ht(P.goal)),a(`h:g:${z}:t`,Z,C+E*.06,P.left===0?"\u2713":String(P.left),P.left===0?"accent":"text",E*.038);});}e$1.vars.m3_phase=d,e$1.vars.m3_buttons=me.map(v=>`${v.id}@${Math.round(v.x)},${Math.round(v.y)}`).join(";");for(let[v,g]of [...Ee])!v.startsWith("h:")||Xe.has(v)||(e$1.destroy(g),Ee.delete(v));},pt=()=>{ee&&e$1.isAlive(ee.entity)&&et(e$1,ee.entity,"die");let k=Se.shift();if(k===void 0){ee=null;return}let E=Eo(k),a=e$1.create();e$1.set(a,e,{x:0,y:0}),e$1.set(a,f,{shape:"actor",cast:E.cast,variant:E.variant??s.int(0,99),h:50,pose:"idle",facing:-1,depth:20});let S=E.hp*r.enemyHp;ee={def:E,hp:S,max:S,in:E.every,rage:1,entity:a},_t(),E.boss&&(e$1.emit(Ep,{kind:k}),V(e$1,{kind:"shake",power:1})),w();},w=()=>{if(e$1.vars.moves=q,e$1.vars.hero_hp=Math.ceil(De),e$1.vars.mana=Math.floor(ce),e$1.vars.m3_goals=Fe().map(k=>`${k.goal.kind==="color"?`color${k.goal.color}`:k.goal.kind==="clear"?k.goal.obstacle:k.goal.kind}:${k.left}`).join(","),e$1.vars.m3_enemy=ee?`${ee.def.id}:${Math.ceil(ee.hp)}/${Math.ceil(ee.max)}:${ee.in}`:"",Y()){let k=r.def.kind==="battle"?r.def.enemies.length:1;e$1.vars.level_progress=Math.min(1,(xe+(ee?1-ee.hp/ee.max:0))/k);}else {let k=r.def;if(k.kind==="goal"){let E=k.goals.map(S=>S.kind==="color"||S.kind==="drops"?S.count:S.kind==="score"?S.value:1),a=Fe();e$1.vars.level_progress=a.reduce((S,L,i)=>S+(L.goal.kind==="clear"?L.left===0?1:0:1-L.left/E[i]),0)/Math.max(1,a.length);}}},f$1=()=>{rt(e$1,qn),rt(e$1,dc),rt(e$1,hi),rt(e$1,uc),x.clear(),_.clear(),Ee.clear(),ee&&e$1.isAlive(ee.entity)&&e$1.destroy(ee.entity),ee=null,r=wr(Ln(e$1,"meta:chapter")||1,n("difficulty"));let k=r.def;o=us(ss[k.board]??ss.plain,r.colors,()=>s.next(),Ua,k.kind==="goal"?k.drops??0:0),c=Pt(),ze(),d="idle",O=null,M=null,$=null,G=null,B=0,Q=false,ae=0,Me.colors.clear(),Me.drops=0,q=k.kind==="goal"?k.moves+Ln(e$1,"meta:moves"):0,ue=q,fe=0,ie=0,ve=false,se=false,ge=rs*Math.pow(1.06,r.level-1)*(1+Ln(e$1,"meta:health")),De=ge,oe=0,ce=0,Ae=false,xe=0,je=0,we=0,Se=k.kind==="battle"?[...k.enemies]:[],e$1.vars.m3_level=r.level,e$1.vars.m3_world=r.world,e$1.vars.m3_kind=k.kind,e$1.vars.coins=0,e$1.vars.score=0,e$1.vars.stars=0,e$1.vars.reviving=false,bt(),_t(),k.kind==="battle"&&pt(),w();},m=k=>{if(!k||!ee)return 1;let E=ko[k].beats.includes(ee.def.element),a=k===ee.def.element;return (E?1.5:a?.5:1)*(k===Re().element?1.25:1)},p=(k,E=0)=>{B++,Q||=k.slimeCleared,Me.drops+=k.dropsCollected;let a=E,S=0,L=0,i=Ge();for(let v of k.cleared){let g=v.piece;g.color>=0&&Me.colors.set(g.color,(Me.colors.get(g.color)??0)+1);let T=So(g.color),C=Qe(c,v.col,v.row);V(e$1,{kind:"burst",x:C.x,y:C.y,color:T?.color??"coin",n:6,size:i*.8}),ce=Math.min(_e(),ce+tc*(1+Ln(e$1,"meta:mana"))),!(!Y()||!T)&&(T.role==="attack"?a+=Ye()*m(T.element)*(1+.25*(B-1)):T.role==="heal"?S+=Ql*Math.pow(1.06,r.level-1)*(1+Ln(e$1,"meta:health")):T.role==="shield"&&(L+=ec*Math.pow(1.06,r.level-1)*(1+Ln(e$1,"meta:defense"))));}for(let v of k.fired){let g=Qe(c,v.col,v.row);V(e$1,{kind:"ring",x:g.x,y:g.y,color:"coin",size:i*2.4});}k.fired.length>0&&V(e$1,{kind:"shake",power:.4+Math.min(1,k.fired.length*.2)});for(let v of k.created)e$1.emit("special-made",{kind:v.piece.special});let h=k.cleared.length*n("pieceScore")*B+k.fired.length*30;qe(e$1,"score",h),ae+=k.cleared.length;let R=Math.floor(ae/n("coinEvery"))-Math.floor((ae-k.cleared.length)/n("coinEvery"));R>0&&(qe(e$1,"coins",R),e$1.emit("coin-collected",{value:R})),e$1.emit("pieces-cleared",{count:k.cleared.length,cascade:B}),Y()&&(S>0&&(De=Math.min(ge,De+S),te!==null&&V(e$1,{kind:"pop",x:e$1.need(te,e).x,y:e$1.need(te,e).y-i,text:`+${Math.round(S)}`,color:"accent",size:Math.round(i*.45)})),L>0&&(oe+=L),a>0&&ee&&y(a)),bt(),w();},y=k=>{if(!ee)return;ee.hp-=k,te!==null&&He(e$1,te,"attack"),He(e$1,ee.entity,"hit");let E=e$1.need(ee.entity,e);V(e$1,{kind:"pop",x:E.x,y:E.y-Ge(),text:`-${Math.round(k)}`,color:"danger",size:Math.round(Ge()*.5)}),!(ee.hp>0)&&(xe++,e$1.emit("enemy-defeated",{kind:ee.def.id}),l(),ee.def.boss&&(je++,qe(e$1,"coins",10),e$1.emit(Mp,{kind:ee.def.id}),V(e$1,{kind:"flash",color:"coin"})),pt());},l=()=>{if(!ee)return;et(e$1,ee.entity,"die");let k=ee.entity;e$1.need(k,f).alpha=.6,b(()=>{e$1.isAlive(k)&&e$1.destroy(k);});},u=[],b=k=>u.push({t:.9,f:k}),A=()=>{if(ci(o,Q),Q=false,B=0,bt(),r.def.kind==="goal"){if(Ct())return U();if(q<=0)return ye("out-of-moves")}else {if(!ee)return U();if(ee.in--,ee.in<=0){d="enemy",ie=.45;return}}I();},I=()=>{d="idle",Cr(o)===null&&(si(o),bt(),e$1.emit("board-shuffled",{})),w();},N=()=>{if(!ee)return I();let k=ee.def,E=r.enemyAttack*k.attack*ee.rage;ee.rage=1,He(e$1,ee.entity,"attack");let a=Math.min(oe,E);if(oe-=a,E=(E-a)*(1-Math.min(.6,Ln(e$1,"meta:defense"))),E>0){if(De-=E,te!==null){He(e$1,te,"hit");let L=e$1.need(te,e);V(e$1,{kind:"pop",x:L.x,y:L.y-Ge(),text:`-${Math.round(E)}`,color:"danger",size:Math.round(Ge()*.5)});}V(e$1,{kind:"shake",power:.8}),e$1.emit("player-hit",{hp:Math.ceil(De)});}let S=k.skill;if(S?.kind==="sow"?di(o,S.obstacle,S.count):S?.kind==="heal"?ee.hp=Math.min(ee.max,ee.hp+ee.max*S.share):S?.kind==="rage"&&(ee.rage=S.mult),ee.in=k.enrage&&ee.hp<ee.max*k.enrage?Math.max(1,k.every-1):k.every,bt(),De<=0)return De=0,ye("fell");I();},U=()=>{if(r.def.kind==="goal"){we=Math.min(q,12),e$1.vars.stars=Math.min(ve?1:3,Za(q/Math.max(1,ue),false)),qe(e$1,"score",q*n("moveBonus")),d="finale",ie=.3;return}e$1.vars.stars=Math.min(ve?1:3,Za(De/ge,true)),X("cleared");},X=k=>{if(se)return;se=true,d="over";let E=k==="cleared";E&&e$1.vars["meta:first_clear"]===true&&qe(e$1,"coins",r.firstClearGold),E||(e$1.vars.stars=0),e$1.vars.reviving=false,w(),e$1.emit(Bt,{reason:k,stats:{chapter:r.level,seconds:Math.floor(fe),cleared:E,stars:Number(e$1.vars.stars??0),coins:Number(e$1.vars.coins??0),bosses:je,kills:xe,battle:Y()}});},ye=k=>{if(e$1.vars.revive_ready===true&&!ve){e$1.vars.reviving=true,e$1.vars.m3_revive_reason=k,d="idle",e$1.emit(Gt,{});return}X(k);},ke=()=>{Le()&&(ve=true,e$1.vars.reviving=false,Y()?(De=ge*oc,ee&&(ee.in=ee.def.every)):q+=rc,V(e$1,{kind:"flash",color:"coin"}),I());},Ue=k=>{let E=o.cells[k.row]?.[k.col];if(!E||E.hole)return 0;let a=r.def.kind==="goal"?r.def.goals:[],S=0;for(let i of [E.under,E.over,E.block])i&&(S+=a.some(h=>h.kind==="clear"&&h.obstacle===i.id)?6:3);let L=E.piece;if(L&&!E.block){S+=1,L.special&&(S+=3),a.some(h=>h.kind==="color"&&h.color===L.color)&&(S+=2);let i=So(L.color);Y()&&i?.role==="attack"&&(S+=m(i.element));}if(a.some(i=>i.kind==="drops"))for(let i=0;i<k.row;i++)o.cells[i][k.col].piece?.color===An&&(S+=2);return S},st=k=>{let E={col:Math.floor(o.cols/2),row:Math.floor(o.rows/2)},a=-1;for(let S=0;S<o.rows;S++)for(let L=0;L<o.cols;L++){if(o.cells[S][L].hole)continue;let i=bs(o,k,{col:L,row:S}).reduce((h,D)=>h+Ue(D),0);i>a&&(a=i,E={col:L,row:S});}return E},Pe=()=>{let k=Ce();if(ce<k.mana||d!=="idle")return false;let E=at(),a=[];if(k.kind==="shape"){let i=E>=(k.bigAt??99)&&k.bigShape?k.bigShape:k.shape??"area:1",h=st(i);a=bs(o,i,h);let D=Qe(c,h.col,h.row);V(e$1,{kind:"ring",x:D.x,y:D.y,color:"coin",size:Ge()*4}),V(e$1,{kind:"flash",color:"coin"});}else a=gs(o,"line",Math.round((k.count??3)*E));ce=0,Ae=false,B=0,te!==null&&He(e$1,te,"attack"),e$1.emit("skill-cast",{id:k.id}),vt(e$1,"m3-skill");let S=Y()&&ee?k.damage*Ye()*E*m(Re().element):0,L=ys(o,a,k.id);return p(L,S),d="falling",true},re=k=>{if($){let E=o.cells[$.row]?.[$.col]?.piece?.id,a=E!==void 0?x.get(E):void 0;a!==void 0&&(e$1.need(a,e).scale=1);}if($=k,k){let E=o.cells[k.row]?.[k.col]?.piece?.id,a=E!==void 0?x.get(E):void 0;a!==void 0&&(e$1.need(a,e).scale=1.15);}},H=0,J=(k,E)=>{if(H=0,Ot(e$1),d!=="idle"||Le()||!Mo(o,k,E))return;re(null);let a=o.cells[k.row][k.col].piece.id,S=o.cells[E.row][E.col].piece.id;O=new Map([[a,E],[S,k]]),M=[k,E],d="swapping",vt(e$1,"match3-swap");};e$1.on(j,k=>{let E=k;if(!(!Ze(e$1)||Kn(e$1)||se||Le()))if(E.type==="tap"){if(me.find(L=>Math.hypot(E.x-L.x,E.y-L.y)<=L.r)?.id==="skill"){if(ce<_e())return;Pe()||(Ae=true);return}let S=Tn(c,E.x,E.y);if(!S||d!=="idle")return;$&&Math.abs($.col-S.col)+Math.abs($.row-S.row)===1?J($,S):re($&&$.col===S.col&&$.row===S.row?null:S);}else if(E.type==="press"){let a=Tn(c,E.x,E.y);G=a?{x:E.x,y:E.y,...a}:null;}else if(E.type==="move"&&G){let a=E.x-G.x,S=E.y-G.y;if(Math.max(Math.abs(a),Math.abs(S))<c.cell*.45)return;let L={col:G.col,row:G.row},i=Math.abs(a)>Math.abs(S)?{col:L.col+Math.sign(a),row:L.row}:{col:L.col,row:L.row+Math.sign(S)};G=null,J(L,i);}else E.type==="release"&&(G=null);}),e$1.on($t,()=>{f$1(),e$1.vars.level=r.level;}),e$1.on(Wt,f$1),e$1.on(Kt,ke),e$1.on(Ft,()=>{Le()&&(e$1.vars.reviving=false,X(Y()?"fell":"out-of-moves"));}),e$1.on(zt,k=>{ot("h:"),me=[],te!==null&&e$1.isAlive(te)&&et(e$1,te,k.reason==="cleared"?"dance":"die");}),e$1.on(k,()=>{c=Pt(),ze();for(let[k,E]of x){let a=e$1.need(E,qn);e$1.set(E,f,ct(a.kind));}bt(),_t();});let j$1=k=>{let E=true,a=Math.min(1,k*14),S=Ge();for(let L of e$1.query(qn)){let i=e$1.need(L,qn),h=O?.get(i.id)??i,D=e$1.need(L,e),R=Qe(c,h.col,h.row),v=R.x-D.x,g=R.y-D.y,T=e$1.need(L,f);Math.abs(v)<.5&&Math.abs(g)<.5?(D.x=R.x,D.y=R.y,T.alpha=1):(E=false,T.alpha=D.y<c.top-S*.3?0:1,D.x+=v*a,D.y+=Math.abs(g)>S*.3?Math.sign(g)*Math.min(Math.abs(g),S*12*k):g*a);}for(let[L,i]of _){let h=x.get(L);if(h===void 0)continue;let D=e$1.need(h,e);e$1.set(i,e,{x:D.x,y:D.y,scale:1+.06*Math.sin(e$1.time*6)}),e$1.need(i,f).alpha=e$1.need(h,f).alpha??1;}return E};e$1.addSystem({id:"match3",order:0,run(k,E){for(let a of [...u])a.t-=E,a.t<=0&&(u.splice(u.indexOf(a),1),a.f());if(!Ze(k)||se){j$1(E);return}if(fe+=E,tn(),!Le()&&j$1(E)){if(ie>0){ie-=E;return}if(d==="swapping"&&M){let[a,S]=M;M=null,O=null,B=0;let L=li(o,a,S);if(!L){let i=o.cells[a.row][a.col].piece.id,h=o.cells[S.row][S.col].piece.id;O=new Map([[i,S],[h,a]]),d="returning";return}r.def.kind==="goal"&&q--,p(L),d="falling";return}if(d==="returning"){if(O){O=null;return}d="idle";return}if(d==="falling"){let a=ms(o);if(a){p(a);return}A();return}if(d==="enemy"){N();return}if(d==="finale"){if(we>0){we--,q=Math.max(0,q-1);let S=gs(o,"line",1);S.length>0&&p(ys(o,S,"finale")),bt(),ie=.12;return}let a=ms(o);if(a){p(a);return}X("cleared");return}if(d==="idle"&&Ae){Pe();return}if(d==="idle"){if(H+=E,(!ht(k,"match3-swap")||H>7)&&!un(k)){let a=Cr(o);a&&ft(k,"swipe",Qe(c,a[0].col,a[0].row),Qe(c,a[1].col,a[1].row),c.cell*1.1);}if(ce>=_e()&&!ht(k,"m3-skill")&&!un(k)){let a=me.find(S=>S.id==="skill");a&&ft(k,"tap",a,void 0,c.cell*1.2);}}}}}),f$1();}};var _o=[{id:"garden",prefix:"item",levels:8,color:"accent",gen:"mg_gen_garden"},{id:"bake",prefix:"mg_bake",levels:7,color:"coin",gen:"mg_gen_bake"},{id:"jewel",prefix:"mg_jewel",levels:7,color:"primary",gen:"mg_gen_jewel"},{id:"potion",prefix:"mg_potion",levels:7,color:"secondary",gen:"mg_gen_potion"}],gn=e=>_o.find(t=>t.id===e),mi=3,fc=[0,.2,.35],hc=.06,rn={box:{id:"box",layer:"block",art:["mg_box","mg_box2"],neighbour:true,coins:1},fog:{id:"fog",layer:"cover",art:["mg_fog"],neighbour:true,hides:true},web:{id:"web",layer:"cover",art:["mg_web"],neighbour:true,mergeInto:true},bubble:{id:"bubble",layer:"cover",art:["mg_bubble"],neighbour:false,mergeInto:true,ttl:14}},yi=[{id:"joker",art:"mg_joker",effect:"joker"},{id:"scissors",art:"mg_scissors",effect:"split"},{id:"chest",art:"chest",effect:"chest",amount:3},{id:"battery",art:"mg_energy",effect:"energy",amount:6}],wn=e=>yi.find(t=>t.id===e),gi=[[1,.5],[2,.35],[3,.15]],bi={"-":{kind:"free"},".":{kind:"hole"},A:{kind:"gen",chain:0},B:{kind:"gen",chain:1},C:{kind:"gen",chain:2},D:{kind:"gen",chain:3},a:{kind:"item",chain:0,level:1},b:{kind:"item",chain:1,level:1},c:{kind:"item",chain:2,level:1},d:{kind:"item",chain:3,level:1},x:{kind:"block",obstacle:"box",hp:1},X:{kind:"block",obstacle:"box",hp:2},f:{kind:"cover",obstacle:"fog",levels:[1,2,2,3]},w:{kind:"cover",obstacle:"web",levels:[2,2,3]},u:{kind:"cover",obstacle:"bubble",levels:[3,3,4]},J:{kind:"special",special:"joker"},S:{kind:"special",special:"scissors"},K:{kind:"special",special:"chest"},E:{kind:"special",special:"battery"}},mc=7,yc=8,sr={start:["-------","-------","--a-a--","---A---","--a----","-------","-------","-------"],two:["-------","-------","-a---b-","--A-B--","-------","-------","-------","-------"],boxes:["-------","-------","--A-B--","-------","xxxxxxx","x--K--x","x-----x","xxxxxxx"],fog:["fffffff","fffffff","-------","--A-B--","-------","-------","xx-E-xx","xx---xx"],yard:["X-----X","-------","-A-J-B-","-------","xx---xx","fx---xf","ffx-xff","fffffff"],cellar:["XxxxxxX","x-----x","x-A-B-x","x-----x","x--K--x","xfffffx","xfffffx","XxxxxxX"],webs:["-------","-w---w-","--A-B--","---C---","-w---w-","-------","--www--","-------"],mine:["XX---XX","X--S--X","--A-C--","---B---","-------","ffXXXff","fff-fff","fffffff"],workshop:["w--E--w","-------","-A-B-C-","-------","xwxwxwx","-------","x--K--x","XXXXXXX"],vault:["XfffffX","fx---xf","f-A-B-f","f--J--f","f-C---f","fx---xf","XfffffX","XXXXXXX"],bubbles:["-------","-u---u-","--A-B--","---C---","-------","-u---u-","--uuu--","-------"],holes:["..---..",".-----.","--A-B--","---C---","---D---","--fff--",".-fff-.","..---.."],lab:["u-----u","-x-E-x-","--A-D--","-------","--B-C--","-w---w-","xxwuwxx","XXXXXXX"],terrace:["...-...","..---..",".-A-B-.","---J---","-C---D-","-u-x-u-","xxfffxx","XXfffXX"],four:["-------","-A---B-","-------","---J---","-------","-C---D-","xxxxxxx","XXXXXXX"],fortress:["ffXXXff","fx---xf","X-A-B-X","X--S--X","X-C-D-X","fx-K-xf","ffXXXff","fffffff"],maze:["-x-u-x-","-x---x-","-xA-Bx-","--w-w--","-xC-Dx-","-x---x-","-xfffx-","XXfffXX"],palace:["uXXXXXu","X--E--X","X-A-B-X","X--J--X","X-C-D-X","Xw---wX","XffKffX","XXXXXXX"]},vi=[{id:"upgrade",art:"mg_sk_merge",charge:10,effect:"upgrade",count:3},{id:"free",art:"mg_sk_free",charge:9,effect:"free",count:6},{id:"joker",art:"mg_sk_joker",charge:12,effect:"joker",count:2}],Ss=e=>vi.find(t=>t.id===e),Nr=[{id:"hero",cast:"hero",gems:0,skill:"upgrade"},{id:"hero2",cast:"hero2",gems:150,skill:"free"},{id:"hero3",cast:"hero3",gems:300,skill:"joker"}],Ne=(e,t,n,s,r=0,o=3,c)=>({board:e,chains:[...t].map(d=>({g:"garden",b:"bake",j:"jewel",p:"potion"})[d]??"garden"),orders:n,top:s,double:r,visible:o,...c?{slack:c}:{}}),xs=e=>({...e,vip:true}),qt=(e,t)=>({...e,extra:t}),Es=[Ne("start","g",3,3,0,1,1.6),Ne("start","g",4,3,0,2,1.5),Ne("two","gb",4,3,0,2,1.45),Ne("two","gb",5,4,0,2),Ne("boxes","gb",5,4,0,3),Ne("boxes","gb",6,4,.2,3),Ne("fog","gb",6,4,.2,3),Ne("yard","gb",6,5,.2,3),Ne("fog","gb",7,5,.3,3),qt(xs(Ne("cellar","gb",6,5,.3,3)),.92),qt(Ne("webs","gbj",5,4,.2,3),.92),qt(Ne("webs","gbj",6,4,.3,3),.92),qt(Ne("mine","gbj",6,5,.2,3),1.15),qt(Ne("workshop","gbj",6,5,.3,3),.9),qt(Ne("mine","gbj",7,5,.3,3),1.08),qt(Ne("yard","gj",6,5,.3,3),1.15),qt(Ne("workshop","gbj",7,5,.4,3),.92),Ne("vault","gbj",7,5,.3,3),qt(Ne("webs","jbg",7,6,.3,3),.92),xs(Ne("vault","gbj",7,6,.4,3)),qt(Ne("bubbles","gbp",6,5,.2,3),1.15),qt(Ne("bubbles","gbp",6,5,.3,3),1.12),qt(Ne("holes","gbpj",6,5,.3,3),.92),qt(Ne("lab","gbjp",7,5,.3,3),.92),Ne("holes","gbpj",7,5,.4,3),Ne("bubbles","pjg",7,6,.3,3),Ne("lab","gbjp",7,6,.4,3),Ne("terrace","gbjp",8,5,.4,3),Ne("holes","gbpj",8,6,.4,3),xs(Ne("terrace","gbjp",7,6,.4,3)),Ne("four","gbjp",7,5,.3,3),qt(Ne("fortress","gbjp",7,5,.4,3),1.06),Ne("maze","gbjp",7,6,.4,3),Ne("four","gbjp",8,6,.4,3),qt(Ne("fortress","gbjp",8,6,.5,3),1.06),Ne("palace","gbjp",8,6,.4,3),Ne("maze","gbjp",8,6,.5,3),Ne("lab","gbjp",9,6,.5,3),Ne("palace","gbjp",9,6,.5,3),qt(xs(Ne("fortress","gbjp",8,6,.5,3)),1.06)],Ir=10,gc=4,Ms=Es.length,xi=[0,18,45,75];function _p(e){let t=e>>>0;return ()=>{t=t+1831565813>>>0;let n=t;return n=Math.imul(n^n>>>15,n|1),n^=n+Math.imul(n^n>>>7,n|61),((n^n>>>14)>>>0)/4294967296}}var ks=e=>Math.pow(2,Math.max(0,e-1));function Rp(e,t){let n=_p(t*7919+13),s=[],r=e.chains;for(let o=0;o<e.orders;o++){let c=e.orders<=1?1:o/(e.orders-1),d=e.vip===true&&o===e.orders-1,x=2+Math.round(c*(e.top-2)),_=Math.max(2,Math.min(e.top,x-(n()<.3?1:0))),O=r[(o+Math.floor(n()*r.length))%r.length],M=[{chain:O,level:d?Math.min(e.top+1,(gn(O)?.levels??7)-1):_}];if(d||o>0&&r.length>1&&n()<e.double){let $=r[(r.indexOf(O)+1+Math.floor(n()*(r.length-1)))%r.length];M.push({chain:$,level:d?e.top:Math.max(2,_-1)});}s.push({wants:M,vip:d});}return s}function Tp(e){let t=r=>r.reduce((o,c)=>o+ks(c),0)/Math.max(1,r.length),n=gi.reduce((r,[o,c])=>r+ks(o)*c,0),s=0;for(let r of e.join("")){let o=bi[r];if(o){if(o.kind==="item")s+=ks(o.level);else if(o.kind==="cover")s+=t(o.levels)*(rn[o.obstacle]?.mergeInto&&!rn[o.obstacle]?.ttl?.5:.2);else if(o.kind==="special"){let c=wn(o.special);s+=c?.effect==="energy"?c.amount??0:c?.effect==="chest"?n*(c.amount??0):c?.effect==="joker"?3:2;}}}return s}function $r(e,t=.5){let n=Math.max(1,Math.min(Ms,Math.floor(e))),s=Es[n-1],r=Math.ceil(n/Ir),o=Rp(s,n),c=o.reduce((_,O)=>_+O.wants.reduce((M,$)=>M+ks($.level),0),0),d=Math.max(c*.4,c-Tp(sr[s.board]??[])*.7),x=(s.slack??1.32-(r-1)*.08-(n-(r-1)*Ir)*.006)*(1.1-t*.2)*(s.extra??1);return {level:n,world:r,index:n-(r-1)*Ir,def:s,boss:s.vip===true,orders:o,energy:Math.ceil(d*x),firstClearGold:(s.vip?120:50)+(n-1)*10}}var ki=e=>xi[Math.ceil(Math.max(1,e)/Ir)-1]??0,_s=e=>e>=.2?3:e>=.08?2:1,Rs=15,Si="kit-merge",Ei=[{id:"Energy",var:"meta:energy",art:"mg_energy",color:"coin",perLevel:2,unit:"",maxLevel:15,price:40,growth:.12},{id:"GenLuck",var:"meta:luck",art:"mg_joker",color:"secondary",perLevel:2,unit:"%",maxLevel:15,price:45,growth:.12},{id:"Reward",var:"meta:reward",art:"coin",color:"coin",perLevel:5,unit:"%",maxLevel:20,price:40,growth:.12},{id:"SkillPower",var:"meta:skill",art:"mg_sk_merge",color:"secondary",perLevel:8,unit:"%",maxLevel:10,price:50,growth:.12},{id:"Charge",var:"meta:charge",art:"mg_sk_free",color:"primary",perLevel:5,unit:"%",maxLevel:10,price:50,growth:.12}],bc={game:"merge",character:Si,stats:Ei,heroes:Nr,levels:Ms,firstClearGold:e=>$r(e).firstClearGold,stars:3,starsToEnter:ki};var Ts=e=>({kind:"none",at:e,hits:[],coins:0}),Pn=e=>gn(e)?.levels??8,Mi=(e,t,n,s,r="")=>({id:e.nextId++,kind:t,chain:n,level:s,special:r}),Ro=(e,t,n)=>Mi(e,"item",t,n),xc=(e,t)=>Mi(e,"special","",0,t);function _i(e,t,n){let s=Math.max(...e.map(c=>c.length)),r={cols:s,rows:e.length,cells:[],chains:t,nextId:1,rand:n},o=c=>t[c]??null;for(let c=0;c<e.length;c++){let d=[];for(let x=0;x<s;x++){let _=bi[e[c][x]??"-"]??{kind:"free"},O={hole:_.kind==="hole",thing:null,cover:null,block:null};if(_.kind==="gen"){let M=o(_.chain);M&&(O.thing=Mi(r,"gen",M,1));}else if(_.kind==="item"){let M=o(_.chain);M&&(O.thing=Ro(r,M,_.level));}else if(_.kind==="block")O.block={id:_.obstacle,hp:_.hp};else if(_.kind==="cover"){let M=t[Math.floor(n()*t.length)]??"garden",$=Math.min(Pn(M)-1,_.levels[Math.floor(n()*_.levels.length)]??1);O.thing=Ro(r,M,$);let G=rn[_.obstacle];O.cover={id:_.obstacle,hp:1,...G?.ttl?{ttl:G.ttl}:{}};}else _.kind==="special"&&(O.thing=xc(r,_.special));d.push(O);}r.cells.push(d);}return r}var ar=(e,t)=>e.cells[t.row]?.[t.col],kc=(e,t)=>t.col>=0&&t.row>=0&&t.col<e.cols&&t.row<e.rows,Sc=e=>!!e&&!e.hole&&!e.thing&&!e.block,Br=(e,t)=>{let n=ar(e,t);return !!n&&!!n.thing&&!n.cover&&!n.block};function bn(e){let t=[];for(let n=0;n<e.rows;n++)for(let s=0;s<e.cols;s++){let r=e.cells[n][s];r.thing&&t.push({at:{col:s,row:n},thing:r.thing,cell:r});}return t}var Op=e=>e.cells.reduce((t,n)=>t+n.filter(Sc).length,0);function Os(e,t){let n=null,s=1/0;for(let r=0;r<e.rows;r++)for(let o=0;o<e.cols;o++){if(!Sc(e.cells[r][o]))continue;let c=Math.hypot(o-t.col,(r-t.row)*1.05);c<s-1e-9&&(s=c,n={col:o,row:r});}return n}function Ds(e,t){let n=t?.thing;return !t||!n||t.block||n===e||e.kind!==n.kind||e.kind==="special"||t.cover&&!rn[t.cover.id]?.mergeInto||e.chain!==n.chain||e.level!==n.level?false:e.kind==="gen"?e.level<mi:e.level<Pn(e.chain)}function vc(e,t){let n=[],s=0;for(let[r,o]of [[1,0],[-1,0],[0,1],[0,-1]]){let c={col:t.col+r,row:t.row+o};if(!kc(e,c))continue;let d=e.cells[c.row][c.col];for(let x of ["block","cover"]){let _=d[x];if(!_)continue;let O=rn[_.id];if(!O?.neighbour)continue;_.hp--;let M=_.hp<=0;M&&(d[x]=null,s+=O.coins??0),n.push({at:c,id:_.id,gone:M,revealed:M&&!!O.hides});}}return {hits:n,coins:s}}function Ec(e,t,n){if(!Br(e,t)||!kc(e,n)||t.col===n.col&&t.row===n.row)return Ts(t);let s=ar(e,t),r=ar(e,n),o=s.thing;if(r.hole||r.block)return Ts(t);if(Ds(o,r)){let _=r.thing;s.thing=null,_.level++;let O=r.cover?.id;r.cover=null;let M=vc(e,n);return {kind:"merge",at:n,level:_.level,...O?{freed:O}:{},hits:M.hits,coins:M.coins}}let c=o.kind==="special"?wn(o.special):void 0,d=r.thing,x=!r.cover||!!rn[r.cover.id]?.mergeInto;if(c?.effect==="joker"&&d?.kind==="item"&&x&&d.level<Pn(d.chain)){s.thing=null,d.level++;let _=r.cover?.id;r.cover=null;let O=vc(e,n);return {kind:"joker",at:n,level:d.level,..._?{freed:_}:{},hits:O.hits,coins:O.coins}}if(c?.effect==="split"&&d?.kind==="item"&&!r.cover&&d.level>=2){s.thing=null;let _=Os(e,n);return _?(d.level--,e.cells[_.row][_.col].thing=Ro(e,d.chain,d.level),{kind:"split",at:n,level:d.level,second:_,hits:[],coins:0}):(s.thing=o,Ts(t))}return d?r.cover?Ts(t):(s.thing=d,r.thing=o,{kind:"swap",at:n,hits:[],coins:0}):(s.thing=null,r.thing=o,{kind:"move",at:n,hits:[],coins:0})}function Mc(e,t,n=0){let s=ar(e,t)?.thing;if(!s||s.kind!=="gen"||ar(e,t).cover)return null;let r=Os(e,t);if(!r)return null;let o=e.rand(),c=Math.max(1,Math.min(mi,s.level)),d=c>=3&&o<hc?3:o<(fc[c-1]??0)+n?2:1,x=Ro(e,s.chain,Math.min(d,Pn(s.chain)));return e.cells[r.row][r.col].thing=x,{at:r,thing:x,burst:Dp(e)}}function Dp(e){let t=[];for(let n=0;n<e.rows;n++)for(let s=0;s<e.cols;s++){let r=e.cells[n][s];r.cover?.ttl!==void 0&&(r.cover.ttl--,!(r.cover.ttl>0)&&(r.cover=null,r.thing=null,t.push({col:s,row:n})));}return t}var Ap=e=>{let t=0;for(let[n,s]of gi)if(t+=s,e<t)return n;return 1};function _c(e,t){let n=ar(e,t),s=n?.thing;if(!n||!s||s.kind!=="special"||n.cover)return null;let r=wn(s.special);if(r?.effect==="energy")return n.thing=null,{energy:r.amount??5,spawned:[]};if(r?.effect!=="chest")return null;n.thing=null;let o=[];for(let c=0;c<(r.amount??3);c++){let d=Os(e,t);if(!d)break;let x=e.chains[Math.floor(e.rand()*e.chains.length)]??_o[0].id,_=Ro(e,x,Math.min(Pn(x),Ap(e.rand())));e.cells[d.row][d.col].thing=_,o.push({at:d,thing:_});}return o.length===0?(n.thing=s,null):{energy:0,spawned:o}}function Rc(e,t={}){let n=bn(e).filter(o=>Br(e,o.at)&&(o.thing.kind==="item"||t.gens!==false&&o.thing.kind==="gen")),s=null,r=1/0;for(let o of n)for(let c=0;c<e.rows;c++)for(let d=0;d<e.cols;d++){let x=e.cells[c][d];if(!Ds(o.thing,x))continue;let _=(o.thing.kind==="gen"?100:0)+o.thing.level-(x.cover?.5:0);_<r&&(r=_,s=[o.at,{col:d,row:c}]);}return s}function ir(e,t){let n=new Set,s=[],r=bn(e);for(let o of t){let c=r.find(d=>d.thing.kind==="item"&&!d.cell.cover&&!n.has(d.thing.id)&&d.thing.chain===o.chain&&d.thing.level===o.level);if(!c)return null;n.add(c.thing.id),s.push(c.at);}return s}function Ri(e,t){let n=ar(e,t);if(!n?.thing)return null;let s=n.thing;return n.thing=null,s}function Ti(e,t,n){let s=Os(e,n),r=xc(e,t);if(s)return e.cells[s.row][s.col].thing=r,{at:s,thing:r};let o=bn(e).filter(c=>c.thing.kind==="item"&&!c.cell.cover).sort((c,d)=>c.thing.level-d.thing.level)[0];return o?(o.cell.thing=r,{at:o.at,thing:r}):null}function Tc(e){let t=bn(e),n=Op(e)>0;for(let s of t){if(s.thing.kind!=="special"||s.cell.cover)continue;let r=wn(s.thing.special);if(r?.effect==="energy"||r?.effect==="chest"&&n||r?.effect==="joker"&&t.some(o=>o.thing.kind==="item"&&(!o.cell.cover||rn[o.cell.cover.id]?.mergeInto)&&o.thing.level<Pn(o.thing.chain))||r?.effect==="split"&&n&&t.some(o=>o.thing.kind==="item"&&!o.cell.cover&&o.thing.level>=2))return true}return false}function Oc(e,t,n){let s=[];for(let r=0;r<t;r++){let o=bn(e).filter(x=>x.thing.kind==="item"&&!x.cell.cover&&x.thing.level<Pn(x.thing.chain)&&!s.some(_=>_.col===x.at.col&&_.row===x.at.row));if(o.length===0)break;let c=x=>n.some(_=>_.chain===x.thing.chain&&_.level===x.thing.level+1);o.sort((x,_)=>Number(c(_))-Number(c(x))||x.thing.level-_.thing.level);let d=o[0];d.thing.level++,s.push(d.at);}return s}var Oi=90,To=b("merge.item"),Lc=b("merge.order"),Di=b("merge.layer"),Dc=b("merge.backdrop"),Ac=b("merge.part"),zr=b("merge.customer"),Wr=(e,t)=>{let n=Number(e.vars[t]??0);return Number.isFinite(n)?n:0},As={id:"merge",version:2,engines:["phaser"],requires:["round"],params:{difficulty:{type:"number",default:.5,min:0,max:1},orderReward:{type:"number",default:1,min:0,max:100},mergeScore:{type:"number",default:10,min:1,max:1e3,integer:true},energyBonus:{type:"number",default:20,min:0,max:1e4,integer:true}},setup({world:e$1,params:t}){let n=p=>nn(t,p),s=e$1.rng.stream("merge"),r=$r(1,n("difficulty")),o=_i(sr.start,["garden"],()=>s.next()),c=ee(),d=new Map,x=new Map,_=null,O=[],M=[],$=0,G=0,B=0,Q=0,ae=0,q=0,ue=0,fe=0,ie=false,ve=false,se=null,Me=[],De=()=>Nr.find(p=>p.id===e$1.vars["meta:hero"])??Nr[0],ge=()=>Ss(De().skill),oe=()=>e$1.vars.reviving===true,ce=()=>ge().charge,Ae=()=>Wr(e$1,"meta:luck"),Se=()=>O.flatMap(p=>p.order.wants);function ee(){return Fn(Ie(e$1),o.cols,o.rows,{top:.3,bottom:.86,widthShare:.94})}let xe=()=>c.cell,je=new Set,we=(p,y,l,u,b=1)=>{je.add(p);let A=x.get(p);(A===void 0||!e$1.isAlive(A))&&(A=e$1.create(),e$1.set(A,Ac,{id:p}),x.set(p,A)),e$1.set(A,e,{x:y,y:l,scale:b}),e$1.set(A,f,u);},te=()=>{for(let[p,y]of [...x])je.has(p)||(e$1.destroy(y),x.delete(p));},me=p=>{if(p.kind==="special")return wn(p.special)?.art??"chest";let y=gn(p.chain);return p.kind==="gen"?y?.gen??"chest":`${y?.prefix??"item"}${Math.min(p.level,y?.levels??8)}`},Ee=p=>{let y=xe(),l=p.kind==="gen"?.94:.92;return {shape:"sprite",art:me(p),w:y*l,h:y*l,depth:3}},Re=()=>{let p=new Map(bn(o).map(y=>[y.thing.id,y]));for(let[y,l]of [...d])p.has(y)||(e$1.destroy(l),d.delete(y));for(let[y,l]of p){let u=d.get(y);if(u===void 0){u=e$1.create();let I=Qe(c,l.at.col,l.at.row);e$1.set(u,e,{x:I.x,y:I.y,scale:.3}),d.set(y,u);}e$1.set(u,To,{id:y,col:l.at.col,row:l.at.row});let b=Ee(l.thing),A=l.cell.cover&&rn[l.cell.cover.id]?.hides;e$1.set(u,f,{...b,alpha:A?0:1,depth:_?.id===y?30:3});}Ce(),ct();},Ce=()=>{rt(e$1,Di);let p=xe();for(let y=0;y<o.rows;y++)for(let l=0;l<o.cols;l++){let u=o.cells[y][l],b=Qe(c,l,y);for(let[A,I,N]of [["b",u.block,3],["c",u.cover,5]]){if(!I)continue;let U=rn[I.id],X=U?.art[Math.min(U.art.length,Math.max(1,I.hp))-1]??"mg_box",ye=e$1.create();e$1.set(ye,Di,{key:`${A}${l},${y}`}),e$1.set(ye,e,{x:b.x,y:b.y}),e$1.set(ye,f,{shape:"sprite",art:X,w:p*.98,h:p*.98,depth:N,alpha:I.id==="bubble"&&(I.ttl??99)<=3?.55+.4*Math.abs(Math.sin(e$1.time*6)):1});}}},Y=()=>{rt(e$1,Dc),Tt(e$1,"board",c.top+c.cell*o.rows*.3);let p=xe(),y=Qe(c,(o.cols-1)/2,(o.rows-1)/2),l=p*.22,u=(b,A,I)=>{let N=e$1.create();e$1.set(N,Dc,{i:0}),e$1.set(N,e,{x:b,y:A}),e$1.set(N,f,I);};u(y.x,y.y,{shape:"sprite",art:"panel",w:p*o.cols+l*2,h:p*o.rows+l*2,color:"panel",alpha:.9,depth:-10});for(let b=0;b<o.rows;b++)for(let A=0;A<o.cols;A++){if(o.cells[b][A].hole)continue;let I=Qe(c,A,b);u(I.x,I.y,{shape:"sprite",art:"cell",w:p-3,h:p-3,color:(b+A)%2?"panel":"ground",alpha:.85,depth:-9});}},Le=()=>Math.max(1,r.def.visible),Ye=p=>{let y=Ie(e$1),l=Le(),u=Math.min(y.w*.3,xe()*2.6),b=y.w/2+(p-(l-1)/2)*(u+xe()*.2),A=u*(l>2?.62:.72),I=y.h*.118+A/2,N=c.top-xe()*.18;return {x:b,y:I,w:u,h:A,feet:N}},at=(p,y,l)=>{let u=Ye(p),b=Math.max(24,(u.feet-(u.y+u.h/2))*1.05),A=l?-b:u.x,I=e$1.create();return e$1.set(I,e,{x:A,y:u.feet-b/2}),e$1.set(I,f,{shape:"actor",cast:y.vip?"boss":"helper",variant:y.vip?7:s.int(0,99),h:b,pose:l?"walk":"idle",facing:1,speed:Oi,depth:6}),e$1.set(I,zr,{slot:p,to:u.x,leaving:-1}),I},_e=p=>{for(let y=0;y<Le();y++){if(O.some(u=>u.slot===y))continue;let l=M.shift();l&&O.push({order:l,slot:y,customer:at(y,l,p)});}},Pt=(p,y)=>{for(let l of p.query(zr)){let u=p.need(l,zr),b=p.need(l,e),A=p.need(l,f);if(A.shape!=="actor")continue;if(u.leaving>=0){u.leaving+=y,u.leaving>.7&&(A.pose="walk",A.facing=1,b.x+=Oi*1.4*y);continue}let I=u.to-b.x;Math.abs(I)>1?(b.x+=Math.sign(I)*Math.min(Math.abs(I),Oi*2*y),A.pose="walk",A.facing=I>0?1:-1):A.pose==="walk"&&(b.x=u.to,A.pose="idle");}},Ge=p=>Math.max(1,Math.round(p.wants.reduce((y,l)=>y+l.level,0)*n("orderReward")*(p.vip?3:1)*(1+Wr(e$1,"meta:reward")))),Xe=p=>{let y=ir(o,p.order.wants);if(!y)return false;let l=Ye(p.slot);for(let A of y){let I=Qe(c,A.col,A.row);V(e$1,{kind:"burst",x:I.x,y:I.y,color:"coin",n:8,size:xe()*.8}),Ri(o,A);}let u=Ge(p.order);qe(e$1,"coins",u),qe(e$1,"score",u*25),V(e$1,{kind:"burst",x:l.x,y:l.y,color:"coin",n:14,size:l.w*.8}),V(e$1,{kind:"pop",x:l.x,y:l.y-l.h*.5,text:`+${u}`,color:"coin",size:Math.round(l.h*.42)}),e$1.emit("coin-collected",{value:u}),e$1.emit("order-filled",{reward:u,vip:p.order.vip}),vt(e$1,"merge-order"),ae++;let b=e$1.get(p.customer,zr);return b&&(b.leaving=0,He(e$1,p.customer,"cheer"),rr(e$1,p.customer,2.4)),O=O.filter(A=>A!==p),_e(true),Re(),O.length===0&&M.length===0&&bt(),true},tt=(p,y,l,u,b,A)=>{let I=Math.max(8,u*.11);we(`${p}:bg`,y,l,{shape:"rect",w:u,h:I,color:"#000000",alpha:.5,radius:I/2,depth:69});let N=Math.max(1,(u-4)*Math.max(0,Math.min(1,b)));we(`${p}:fill`,y-(u-4)/2+N/2,l,{shape:"rect",w:N,h:I-4,color:A,radius:(I-4)/2,depth:69.1});},ot=()=>{let p=Ie(e$1),y=Math.min(p.w,p.h),l=xe(),u=(H,J,j,k,E="text",a=y*.045,S=70)=>we(H,J,j,{shape:"text",text:k,size:Math.round(a),color:E,bold:true,depth:S});Me=[],je.clear();let b=p.h*.085;we("h:en:i",p.w*.1,b,{shape:"sprite",art:"mg_energy",w:y*.07,h:y*.07,depth:70}),u("h:en",p.w*.1+y*.075,b,String($),$<=3&&B===0?"danger":"text",y*.06),B>0&&u("h:free",p.w*.1+y*.17,b,`+${B}`,"secondary",y*.04);let A=O.length+M.length;we("h:ord:i",p.w*.8,b,{shape:"sprite",art:"ticket",w:y*.075,h:y*.05,color:"panel",depth:70}),u("h:ord",p.w*.8+y*.08,b,String(A),"text",y*.05);for(let H of O){let J=Ye(H.slot);ir(o,H.order.wants)!==null&&we(`h:t${H.slot}:glow`,J.x,J.y,{shape:"rect",w:J.w*1.08,h:J.h*1.14,color:"accent",alpha:.45+.3*Math.sin(e$1.time*6),radius:J.h*.2,depth:7.9}),we(`h:t${H.slot}`,J.x,J.y,{shape:"sprite",art:"ticket",w:J.w,h:J.h,color:H.order.vip?"coin":"panel",depth:8});let k=H.order.wants.length,E=Math.min(J.h*.58,J.w*.86/k);H.order.wants.forEach((a,S)=>{let L=J.x+(S-(k-1)/2)*E*1.05,i=J.y-J.h*.12,h=gn(a.chain);we(`h:t${H.slot}:${S}`,L,i,{shape:"sprite",art:`${h?.prefix??"item"}${Math.min(a.level,h?.levels??8)}`,w:E,h:E,depth:8.1}),ir(o,[a])?u(`h:t${H.slot}:${S}:ok`,L+E*.32,i+E*.32,"\u2713","accent",E*.42,8.2):u(`h:t${H.slot}:${S}:lv`,L+E*.34,i+E*.34,String(a.level),"coin",E*.3,8.2);}),we(`h:t${H.slot}:c`,J.x-J.w*.1,J.y+J.h*.3,{shape:"sprite",art:"coin",w:J.h*.19,h:J.h*.19,depth:8.1}),u(`h:t${H.slot}:cv`,J.x+J.w*.07,J.y+J.h*.3,String(Ge(H.order)),"coin",J.h*.2,8.1),Me.push({id:`order${H.slot}`,x:J.x,y:J.y,r:J.w*.5});}let I=Se();for(let H of bn(o)){if(H.cell.cover&&rn[H.cell.cover.id]?.hides)continue;let J=d.get(H.thing.id);if(J===void 0)continue;let j=e$1.need(J,e),k=_?.id===H.thing.id?31:6;if(H.thing.kind==="gen")for(let E=0;E<H.thing.level;E++)we(`h:i${H.thing.id}:s${E}`,j.x+(E-(H.thing.level-1)/2)*l*.2,j.y+l*.38,{shape:"circle",r:l*.075,color:"coin",depth:k});else H.thing.kind==="item"&&(I.some(E=>E.chain===H.thing.chain&&E.level===H.thing.level)&&(we(`h:i${H.thing.id}:ok`,j.x+l*.3,j.y-l*.3,{shape:"circle",r:l*.12,color:"accent",depth:k}),u(`h:i${H.thing.id}:okt`,j.x+l*.3,j.y-l*.3,"\u2713","#ffffff",l*.18,k+.1)),u(`h:i${H.thing.id}:lv`,j.x+l*.3,j.y+l*.3,String(H.thing.level),"coin",l*.22,k));}let N=c.top+l*o.rows+(p.h-(c.top+l*o.rows))*.5,U=Math.min(y*.075,(p.h-(c.top+l*o.rows))*.38),X=p.w*.3,ye=Q>=ce();Me.push({id:"skill",x:X,y:N,r:U*1.2}),ye&&we("h:skill:glow",X,N,{shape:"circle",r:U*1.28,color:"secondary",alpha:.5+.3*Math.sin(e$1.time*7),depth:68.9}),we("h:skill:bg",X,N,{shape:"circle",r:U,color:"panel",alpha:.95,depth:69}),we("h:skill:i",X,N,{shape:"sprite",art:ge().art,w:U*1.4,h:U*1.4,alpha:ye?1:.45,depth:69.2}),tt("h:charge",X+U*2.6,N,U*2.4,Q/ce(),"secondary");let ke=p.w*.88;Me.push({id:"bin",x:ke,y:N,r:U*1.1});let Ue=_?d.get(_.id):void 0,st=Ue!==void 0?e$1.need(Ue,e):null,Pe=st!==null&&Math.hypot(st.x-ke,st.y-N)<U*1.3;we("h:bin:bg",ke,N,{shape:"circle",r:U,color:Pe?"danger":"panel",alpha:.95,depth:69}),we("h:bin",ke,N,{shape:"sprite",art:"mg_bin",w:U*1.3,h:U*1.3,alpha:_?1:.7,depth:69.2}),(se===null||!e$1.isAlive(se))&&(se=e$1.create(),e$1.set(se,f,{shape:"actor",cast:De().cast,h:U*2.6,pose:"idle",facing:1,depth:20})),e$1.set(se,e,{x:p.w*.11,y:N-U*.1});let re=e$1.need(se,f);re.shape==="actor"&&(re.h=U*2.6),e$1.vars.mg_buttons=Me.map(H=>`${H.id}@${Math.round(H.x)},${Math.round(H.y)}`).join(";"),te();},ct=()=>{e$1.vars.energy=$,e$1.vars.mg_free=B,e$1.vars.mg_charge=Math.floor(Q),e$1.vars.orders_left=O.length+M.length,e$1.vars.mg_orders=O.slice().sort((p,y)=>p.slot-y.slot).map(p=>p.order.wants.map(y=>`${y.chain}:${y.level}`).join("+")).join("|"),e$1.vars.level_progress=r.orders.length?ae/r.orders.length:0;},it=()=>{rt(e$1,To),rt(e$1,Di),rt(e$1,Ac),rt(e$1,zr),d.clear(),x.clear(),se!==null&&e$1.isAlive(se)&&e$1.destroy(se),se=null,r=$r(Wr(e$1,"meta:chapter")||1,n("difficulty")),o=_i(sr[r.def.board]??sr.start,r.def.chains,()=>s.next()),c=ee(),Y(),_=null,O=[],M=[...r.orders],$=Math.max(0,r.energy+Math.round(Wr(e$1,"meta:energy"))),G=$,B=0,Q=0,ae=0,q=0,ue=0,fe=0,ie=false,ve=false,e$1.vars.mg_level=r.level,e$1.vars.mg_world=r.world,e$1.vars.coins=0,e$1.vars.score=0,e$1.vars.stars=0,e$1.vars.reviving=false,_e(false),Re();},bt=()=>{ve||(e$1.vars.stars=Math.min(ie?1:3,_s($/Math.max(1,G))),qe(e$1,"score",$*n("energyBonus")),V(e$1,{kind:"flash",color:"coin"}),Ke("cleared"));},Ke=p=>{if(ve)return;ve=true;let y=p==="cleared";y&&e$1.vars["meta:first_clear"]===true&&qe(e$1,"coins",r.firstClearGold),y||(e$1.vars.stars=0),e$1.vars.reviving=false,ct(),e$1.emit(Bt,{reason:p,stats:{chapter:r.level,seconds:Math.floor(ue),cleared:y,stars:Number(e$1.vars.stars??0),coins:Number(e$1.vars.coins??0),orders:ae,merges:q}});},ze=()=>{if(e$1.vars.revive_ready===true&&!ie){e$1.vars.reviving=true,e$1.emit(Gt,{});return}Ke("out-of-energy");},_t=()=>{oe()&&(ie=true,e$1.vars.reviving=false,$+=Rs,Ti(o,"joker",{col:Math.floor(o.cols/2),row:Math.floor(o.rows/2)}),V(e$1,{kind:"flash",color:"coin"}),Re());},Fe=()=>{if($>0||B>0||Q>=ce()||O.some(l=>ir(o,l.order.wants))||Tc(o))return true;let p=[...Se(),...M.flatMap(l=>l.wants)],y=bn(o);for(let l of y)if(!(!Br(o,l.at)||l.thing.kind!=="item")&&p.some(u=>u.chain===l.thing.chain&&u.level>l.thing.level)&&y.some(u=>Ds(l.thing,u.cell)))return true;return false},Ct=p=>{let y=xe(),l=Qe(c,p.at.col,p.at.row);if(p.kind==="merge"||p.kind==="joker"){let u=o.cells[p.at.row][p.at.col].thing,b=gn(u.chain)?.color??"coin";V(e$1,{kind:"ring",x:l.x,y:l.y,color:b,size:y*1.4}),V(e$1,{kind:"burst",x:l.x,y:l.y,color:"coin",n:8,size:y*.8});let A=d.get(u.id);A!==void 0&&(e$1.need(A,e).scale=1.35),q++,Q=Math.min(ce(),Q+1+Wr(e$1,"meta:charge")),qe(e$1,"score",Math.pow(2,u.level)*n("mergeScore")),e$1.emit("items-merged",{level:u.level,chain:u.chain}),vt(e$1,"merge-merge"),u.kind==="item"&&u.level===Pn(u.chain)&&V(e$1,{kind:"flash",color:"coin"});for(let I of O)I.order.wants.some(N=>N.chain===u.chain&&N.level===u.level)&&He(e$1,I.customer,"wave");}p.kind==="split"&&V(e$1,{kind:"ring",x:l.x,y:l.y,color:"secondary",size:y*1.2}),p.freed&&e$1.emit("obstacle-cleared",{kind:p.freed});for(let u of p.hits){let b=Qe(c,u.at.col,u.at.row);V(e$1,{kind:"burst",x:b.x,y:b.y,color:u.id==="fog"?"#ffffff":"ground",n:u.gone?10:4,size:y*.9}),u.gone&&e$1.emit("obstacle-cleared",{kind:u.id});}p.coins>0&&(qe(e$1,"coins",p.coins),e$1.emit("coin-collected",{value:p.coins}),V(e$1,{kind:"pop",x:l.x,y:l.y-y*.5,text:`+${p.coins}`,color:"coin",size:Math.round(y*.4)})),p.hits.length&&V(e$1,{kind:"shake",power:.25});},Ht=p=>{if($<=0&&B<=0){let A=Qe(c,p.col,p.row);V(e$1,{kind:"pop",x:A.x,y:A.y-xe()*.5,text:"0",color:"danger",size:Math.round(xe()*.4)});return}let y=Mc(o,p,Ae()),l=Qe(c,p.col,p.row);if(!y){V(e$1,{kind:"shake",power:.2}),V(e$1,{kind:"pop",x:l.x,y:l.y-xe()*.5,text:"\u2715",color:"danger",size:Math.round(xe()*.45)});return}B>0?B--:$--,vt(e$1,"merge-generate");let u=d.get(o.cells[p.row][p.col].thing.id);u!==void 0&&(e$1.need(u,e).scale=1.2),V(e$1,{kind:"burst",x:l.x,y:l.y,color:gn(y.thing.chain)?.color??"accent",n:6,size:xe()*.7}),e$1.emit("item-spawned",{level:y.thing.level,chain:y.thing.chain}),Re();let b=d.get(y.thing.id);b!==void 0&&e$1.set(b,e,{x:l.x,y:l.y,scale:.4});for(let A of y.burst){let I=Qe(c,A.col,A.row);V(e$1,{kind:"burst",x:I.x,y:I.y,color:"#ffffff",n:10,size:xe()});}},It=p=>{let y=_c(o,p);if(!y)return;let l=Qe(c,p.col,p.row);V(e$1,{kind:"ring",x:l.x,y:l.y,color:"coin",size:xe()*1.6}),y.energy>0&&($+=y.energy,V(e$1,{kind:"pop",x:l.x,y:l.y-xe()*.5,text:`+${y.energy}`,color:"coin",size:Math.round(xe()*.45)})),Re();for(let u of y.spawned){let b=d.get(u.thing.id);b!==void 0&&e$1.set(b,e,{x:l.x,y:l.y,scale:.4});}},tn=()=>{let p=ge();if(Q<p.charge)return false;let y=1+Wr(e$1,"meta:skill"),l=Math.max(1,Math.round(p.count*y));if(Q=0,se!==null&&He(e$1,se,"cheer"),V(e$1,{kind:"flash",color:"secondary"}),p.effect==="upgrade")for(let u of Oc(o,l,[...Se(),...M.slice(0,2).flatMap(b=>b.wants)])){let b=Qe(c,u.col,u.row);V(e$1,{kind:"ring",x:b.x,y:b.y,color:"secondary",size:xe()*1.4});}else if(p.effect==="free")B+=l;else for(let u=0;u<l;u++)Ti(o,"joker",{col:Math.floor(o.cols/2),row:Math.floor(o.rows/2)});return e$1.emit("skill-cast",{id:p.id}),vt(e$1,"merge-skill"),Re(),true},pt=(p,y)=>Me.find(l=>Math.hypot(p-l.x,y-l.y)<=l.r);e$1.on(j,p=>{let y=p;if(!(!Ze(e$1)||Kn(e$1)||ve||oe())){if(y.type==="press"){Ot(e$1),fe=0;let l=Tn(c,y.x,y.y);if(!l||!Br(o,l))return;let u=o.cells[l.row][l.col].thing.id,b=d.get(u);if(b===void 0)return;let A=e$1.need(b,e);_={id:u,from:l,dx:A.x-y.x,dy:A.y-y.y,x0:y.x,y0:y.y},e$1.need(b,f).depth=30;}else if(y.type==="move"&&_){let l=d.get(_.id);if(l===void 0)return;let u=e$1.need(l,e);u.x=y.x+_.dx,u.y=y.y+_.dy,u.scale=1.12;}else if(y.type==="release"&&_){let l=_;_=null;let u=d.get(l.id);if(u!==void 0&&(e$1.need(u,f).depth=3),Math.hypot(y.x-l.x0,y.y-l.y0)<xe()*.3)return;let b=pt(y.x,y.y),A=o.cells[l.from.row][l.from.col].thing;if(b?.id==="bin"&&A&&A.kind!=="gen"){Ri(o,l.from),vt(e$1,"merge-bin"),Re();return}let I=b?.id.startsWith("order")?O.find(X=>`order${X.slot}`===b.id):void 0;if(I&&A?.kind==="item"&&I.order.wants.some(X=>X.chain===A.chain&&X.level===A.level)&&Xe(I))return;let N=Tn(c,y.x,y.y);if(!N)return;let U=Ec(o,l.from,N);U.kind!=="none"&&Ct(U),Re();}else if(y.type==="tap"){fe=0;let l=pt(y.x,y.y);if(l?.id==="skill"){tn();return}if(l?.id.startsWith("order")){let A=O.find(I=>`order${I.slot}`===l.id);A&&Xe(A);return}let u=Tn(c,y.x,y.y),b=u?o.cells[u.row][u.col].thing:null;if(!u||!b||!Br(o,u))return;if(b.kind==="gen")Ht(u);else if(b.kind==="special")It(u);else {let A=O.find(I=>I.order.wants.some(N=>N.chain===b.chain&&N.level===b.level)&&ir(o,I.order.wants));A&&Xe(A);}}}}),e$1.on($t,()=>{it(),e$1.vars.level=r.level;}),e$1.on(Wt,it),e$1.on(Kt,_t),e$1.on(Ft,()=>{oe()&&(e$1.vars.reviving=false,Ke("out-of-energy"));}),e$1.on(zt,p=>{je.clear(),te(),Me=[],se!==null&&e$1.isAlive(se)&&et(e$1,se,p.reason==="cleared"?"dance":"idle");}),e$1.on(k,()=>{c=ee(),Y();for(let p of O){let y=Ye(p.slot),l=e$1.get(p.customer,zr);l&&(l.to=y.x);let u=e$1.get(p.customer,e),b=Math.max(24,(y.feet-(y.y+y.h/2))*1.05);u&&e$1.set(p.customer,e,{x:y.x,y:y.feet-b/2});let A=e$1.get(p.customer,f);A?.shape==="actor"&&(A.h=b);}Re();});let w=p=>{let y=Math.min(1,p*16);for(let[l,u]of d){if(_?.id===l)continue;let b=e$1.get(u,To);if(!b)continue;let A=e$1.need(u,e),I=Qe(c,b.col,b.row);A.x+=(I.x-A.x)*y,A.y+=(I.y-A.y)*y;let N=A.scale??1;A.scale=N+(1-N)*Math.min(1,p*10);}},f$1=p=>{let y=O.find(u=>ir(o,u.order.wants));if(y&&(!ht(p,"merge-order")||fe>6)){let u=Ye(y.slot);return ft(p,"tap",{x:u.x,y:u.y},void 0,xe()*1.1)}let l=Rc(o,{gens:false});if(l&&(!ht(p,"merge-merge")||fe>6))return ft(p,"swipe",Qe(c,l[0].col,l[0].row),Qe(c,l[1].col,l[1].row),xe()*1.1);if(Q>=ce()&&!ht(p,"merge-skill")){let u=Me.find(b=>b.id==="skill");if(u)return ft(p,"tap",u,void 0,xe()*1.1)}if(!ht(p,"merge-generate")||fe>6){let u=bn(o).find(b=>b.thing.kind==="gen"&&!b.cell.cover);u&&($>0||B>0)&&ft(p,"tap",Qe(c,u.at.col,u.at.row),void 0,xe()*1.1);}},m=0;e$1.addSystem({id:"merge",order:0,run(p,y){Pt(p,y),w(y),!(!Ze(p)||ve)&&(ue+=y,fe+=y,ot(),++m%20===0&&o.cells.some(l=>l.some(u=>u.cover?.ttl!==void 0&&u.cover.ttl<=3))&&Ce(),!(oe()||_)&&(un(p)||f$1(p),Fe()||ze()));}}),it();}};var Lt=10,wc={id:"start",needs:[],rows:["..............","..............","..............","..............","..............","..............",".......o.o.o..",".P............","##############","##############"]},Pc={id:"checkpoint",needs:[],rows:["..........","..........","..........","..........","..........","..........","...o..o...","....C.....","##########","##########"]},Cc={id:"end",needs:[],rows:["..............","..............","..............","..............","..............","..............",".....o.o......","..........E...","##############","##############"]},Ic={id:"boss",needs:[],rows:["..................","..................","..................","..................","...===......===...","..................","..................","..................","##################","##################"]},ws=[{id:"walk",needs:["walker"],rows:["..............","..............","..............","..............",".....ooo......","....o...o.....","..............",".........W....","##############","##############"]},{id:"two-walkers",needs:["walker"],rows:["..............","..............","..............","......*.......",".....===......","..............","..o........o..","...W......W...","##############","##############"]},{id:"gaps",needs:["gaps"],rows:["..............","..............","..............","..............","..............","....o.....o...","...o.o...o.o..","..............","###...###...##","###...###...##"]},{id:"stairs",needs:["stairs"],rows:["..............","...........*..","..........===.","..............",".......###....",".......###.o..","....##########","....##########","##############","##############"]},{id:"spikes",needs:["spikes"],rows:["..............","..............","..............","..............","..............",".....ooo......","....=====.....","..............","###^^^^^^^####","##############"]},{id:"pits",needs:["pits"],rows:["..............","..............","..............","..............","......o.......",".....===...o..","..o.......===.",".===..........","##..........##","##..........##"]},{id:"spring",needs:["spring"],rows:["..............",".........*....","........####..","..............","..............","..............","..............","...T..........","##############","##############"]},{id:"hopper",needs:["hopper"],rows:["..............","..............","..............","..............",".....o...o....","..............","..............",".......J......","##############","##############"]},{id:"crumble",needs:["crumble"],rows:["..............","..............","..............","..............","..............","...o.o.o.o....","...______.....","..............","##........####","##........####"]},{id:"spiky",needs:["spiky"],rows:["..............","..............","..............","..............","..............","......ooo.....","..............",".......S......","##############","##############"]},{id:"moving",needs:["moving"],rows:["..............","..............","..............","..............",".....o..o.....","..............",".....M........","..............","##..........##","##..........##"]},{id:"flyer",needs:["flyer"],rows:["..............","..............","..............","......F.......","..............","..............","...o......o...","..............","##############","##############"]},{id:"key",needs:["key"],rows:["..............","..............","..K...........",".===..........","..............",".......===....","..............","...........B..","##############","##############"]},{id:"gunner",needs:["gunner"],rows:["..............","..............","..............","..............","..............",".....o.o......","....=====.....","...........G..","##############","##############"]},{id:"heart",needs:["walker","stairs"],rows:["..............","..............","..*...........","..............","......H.......",".....===......","..............","...W......W...","##############","##############"]},{id:"secret-high",needs:["spring","gaps"],rows:["..............","..*...........",".===..........","..............","..............","..............","........T.....","..............","#####...######","#####...######"]}],Ai=4,lr=5,Ps=Ai*lr,Ls={walker:1,gaps:1,spikes:2,stairs:2,pits:3,spring:3,hopper:4,crumble:4,spiky:6,moving:6,flyer:7,key:8,gunner:9},Li=[0,9,24,39];function Hr(e,t=.5){let n=Math.max(1,Math.min(Ps,Math.floor(e))),s=Math.ceil(n/lr),r=n-(s-1)*lr,o=r===lr,c=Object.keys(Ls).filter(x=>Ls[x]<=n),d=Object.keys(Ls).find(x=>Ls[x]===n)??null;return {level:n,world:s,index:r,boss:o,features:c,fresh:d,rooms:o?2:3+Math.min(5,Math.floor((n-1)/2)),pace:.85+t*.3+(n-1)*.02,bossHp:3+s,firstClearGold:(o?150:60)+(n-1)*20}}var wi=e=>Li[Math.ceil(Math.max(1,e)/lr)-1]??0,Pi=[{id:"double",stars:6},{id:"dash",stars:15},{id:"wall",stars:27}],Cs=e=>Pi.filter(t=>e>=t.stars).map(t=>t.id),Vr=[{id:"hero",cast:"hero",gems:0,perk:"none"},{id:"hero2",cast:"hero2",gems:150,perk:"heart"},{id:"hero3",cast:"hero3",gems:300,perk:"jump"}],Ci="kit-platformer",Ii=[{id:"Hearts",var:"meta:hearts",art:"heart",color:"danger",perLevel:1,unit:"",maxLevel:3,price:150,growth:1.2},{id:"JumpPower",var:"meta:jump",art:"boot",color:"accent",perLevel:2,unit:"%",maxLevel:10,price:40,growth:.15},{id:"Magnet",var:"meta:magnet",art:"magnet",color:"danger",perLevel:10,unit:"%",maxLevel:10,price:30,growth:.12},{id:"Grace",var:"meta:grace",art:"shield",color:"muted",perLevel:.2,unit:"s",maxLevel:10,price:35,growth:.12},{id:"Greed",var:"meta:greed",art:"coin",color:"coin",perLevel:2,unit:"%",maxLevel:25,price:40,growth:.1}],Nc={game:"platformer",character:Ci,stats:Ii,heroes:Vr,levels:Ps,firstClearGold:e=>Hr(e).firstClearGold,stars:3,starsToEnter:wi};var Lp="boss-spawned",wp="boss-defeated",Ni="level-cleared",jt=b("platformer.body"),lt=b("platformer.thing"),Oo=b("platformer.strip"),cn=b("platformer.hero"),$c=b("platformer.hud"),jn=(e,t)=>{let n=Number(e.vars[t]??0);return Number.isFinite(n)?n:0},Pp=6,cr=40,Cp=3.3,Ip=6.8,Np=.7,Bc=1.3,Is={id:"platformer",version:2,engines:["phaser"],requires:["round"],params:{difficulty:{type:"number",default:.5,min:0,max:1},lives:{type:"number",default:3,min:1,max:9,integer:true},coinScore:{type:"number",default:10,min:0,max:1e3,integer:true},starScore:{type:"number",default:300,min:0,max:1e4,integer:true},clearBonus:{type:"number",default:500,min:0,max:1e5,integer:true},graceTime:{type:"number",default:1.2,min:0,max:5},doubleJump:{type:"boolean",default:false}},setup({world:e$1,params:t}){let n=w=>nn(t,w),s=_r(e$1),r=Hr(1,n("difficulty")),o=[],c=0,d=null,x=0,_={x:2,y:8},O=3,M=3,$=0,G=false,B=false,Q=0,ae=0,q=0,ue=false,fe=false,ie=[],ve=[false,false,false],se=new Map,Me=new Map,De=()=>Vr.find(w=>w.id===e$1.vars["meta:hero"])??Vr[0],ge=()=>e$1.vars.reviving===true,oe=()=>{let w=Number(e$1.vars.view_w??720),f=Number(e$1.vars.view_h??1280);return Math.min(w/8,f*.66/10)},ce=()=>Number(e$1.vars.view_h??1280)*.86-10*oe(),Ae=()=>Number(e$1.vars.view_w??720)/oe(),Se=(w,f)=>{if(f<0)return ".";if(w<0||w>=c)return "#";if(f>=10)return ".";let m=o[f]?.[w]??".";return m==="_"&&(se.get(`${w},${f}`)??0)>.5?".":m},ee=w=>w==="#",xe=w=>w==="="||w==="_"||w==="^",je=()=>{for(let I of e$1.query(lt))e$1.destroy(I);for(let I of e$1.query(Oo))e$1.destroy(I);se.clear(),r=Hr(jn(e$1,"meta:chapter")||1,n("difficulty"));let w=e$1.rng.stream(`platformer-level-${r.level}`),f=ws.filter(I=>I.needs.every(N=>r.features.includes(N))),m=[],p=r.fresh!==null?f.find(I=>I.needs.includes(r.fresh)):void 0;for(p&&m.push(p);m.length<r.rooms;)m.push(w.pick(f));let y=Math.ceil(m.length/2),l=[wc,...m.slice(0,y),Pc,...m.slice(y),r.boss?Ic:Cc];o=Array.from({length:10},(I,N)=>l.map(U=>U.rows[N]??"").join("")),c=o[0].length;let u=[];for(let I=0;I<10;I++)for(let N=0;N<c;N++)o[I][N]==="*"&&u.push({c:N,r:I});let b=u.length<=3?u:[u[0],u[Math.floor(u.length/2)],u[u.length-1]];for(let I=b.length;I<3;I++)b.push({c:Math.floor(c*(I+1)/4),r:5});let A=0;for(let I=0;I<10;I++)for(let N=0;N<c;N++){let U=o[I][N],X={x:N+.5,y:I+1};U==="P"?_={...X}:U==="o"?me("coin",X.x,I+.85,.5,.5):U==="H"&&A++<1?me("heart",X.x,I+.9,.6,.6):U==="K"?me("key",X.x,I+.9,.6,.6):U==="B"?me("chest",X.x,X.y,1,.8):U==="T"?me("spring",X.x,X.y,1,.5):U==="M"?me("mover",X.x+.5,I+.4,2,.4).baseX=X.x+.5:U==="C"?me("checkpoint",X.x,X.y,.6,1.6):U==="E"?me("flag",X.x,X.y,.8,2.6):U==="W"?me("walker",X.x,X.y,.8,1):U==="S"?me("spiky",X.x,X.y,.8,1):U==="J"?me("hopper",X.x,X.y,.8,1):U==="F"?me("flyer",X.x,X.y,.9,.8):U==="G"&&me("gunner",X.x,X.y,.8,1.1),/[PoHKBTMCEWSJFG*]/.test(U)&&(o[I]=we(o[I],N,"."));}if(b.forEach((I,N)=>me("star",I.c+.5,I.r+.95,.85,.85).tag=String(N)),r.boss){let I=me("boss",c-5,8,2.2,2.4);I.hp=r.bossHp,I.tag="walk",I.t=2;}Ee();},we=(w,f,m)=>w.slice(0,f)+m+w.slice(f+1),te=(w,f,m,p)=>{switch(w){case "walker":return {shape:"actor",cast:"foe",h:m*p*1.35,pose:"walk",depth:8};case "spiky":return {shape:"actor",cast:"foe2",h:m*p*1.4,pose:"walk",depth:8};case "hopper":return {shape:"actor",cast:"foe3",h:m*p*1.35,pose:"idle",depth:8};case "flyer":return {shape:"actor",cast:"foe5",h:m*p*1.4,pose:"air",depth:8};case "gunner":return {shape:"actor",cast:"foe4",h:m*p*1.3,pose:"idle",depth:8};case "boss":return {shape:"actor",cast:"boss",h:m*p*1.2,pose:"walk",depth:8};case "bullet":return {shape:"sprite",art:"shot",color:"danger",w:f*p,h:m*p,depth:9};case "wave":return {shape:"sprite",art:"burst",color:"danger",w:f*p,h:m*p,depth:9};case "coin":return {shape:"sprite",art:"coin",w:f*p,h:m*p,depth:7};case "star":return {shape:"sprite",art:"bigstar",w:f*p,h:m*p,depth:7};case "heart":return {shape:"sprite",art:"heart",w:f*p,h:m*p,depth:7};case "key":return {shape:"sprite",art:"key",w:f*p,h:m*p,depth:7};case "chest":return {shape:"sprite",art:"chest",w:f*p,h:m*p*1.1,depth:6};case "spring":return {shape:"sprite",art:"spring",w:f*p,h:m*p*1.4,depth:6};case "mover":return {shape:"tile",art:"platform",w:f*p,h:m*p,unit:p,depth:5};case "checkpoint":return {shape:"sprite",art:"flag",color:"muted",w:f*p*1.6,h:m*p,depth:5};case "flag":return {shape:"sprite",art:"flag",w:f*p*1.4,h:m*p,depth:5}}};function me(w,f$1,m,p,y){let l=e$1.create(),u={kind:w,vx:0,vy:0,dir:-1,t:0,baseX:f$1,baseY:m,hp:1,tag:"",safe:0};return e$1.set(l,lt,u),e$1.set(l,jt,{x:f$1,y:m,w:p,h:y}),e$1.set(l,e,{x:0,y:0}),e$1.set(l,f,te(w,p,y,oe())),e$1.need(l,lt)}function Ee(){for(let f of e$1.query(Oo))e$1.destroy(f);let w=(Number(e$1.vars.view_h??1280)-(ce()+10*oe()))/oe()+.5;for(let f=0;f<10;f++){let m=0;for(;m<c;){let p=o[f][m];if(p==="."||p==="_"){p==="_"&&Re("_",m,f,1,.45),m++;continue}let y=p==="#"&&Se(m,f-1)!=="#",l=m;for(;l<c&&o[f][l]===p&&(p!=="#"||Se(l,f-1)!=="#"===y);)l++;if(p==="#"&&y){let u=0;for(;f+u<10&&o[f+u][m]==="#";)u++;Re("#",m,f,l-m,u+(f+u>=10?w:0));}else p!=="#"&&Re(p,m,f,l-m,p==="="?.45:.7);m=l;}}}function Re(w,f$1,m,p,y){let l=oe(),u=e$1.create();e$1.set(u,Oo,{char:w}),e$1.set(u,jt,{x:f$1+p/2,y:w==="^"?m+1:m+y,w:p,h:y}),e$1.set(u,e,{x:0,y:0});let b=w==="^"?{shape:"tile",art:"spike",w:p*l,h:y*l,unit:l,depth:4}:w==="#"?{shape:"tile",art:"ground",w:p*l,h:y*l,unit:l*1.2,depth:3}:{shape:"tile",art:"platform",w:p*l,h:y*l,unit:l,depth:3,...w==="_"?{color:"muted",alpha:.85}:{}};e$1.set(u,f,b),w==="_"&&e$1.set(u,lt,{kind:"mover",vx:0,vy:0,dir:0,t:0,baseX:f$1,baseY:m,hp:0,tag:"crumble",safe:0});}let Ce=()=>{(d===null||!e$1.isAlive(d))&&(d=e$1.create(),e$1.set(d,cn,{vx:0,vy:0,grounded:true,facing:1,jumps:0,coyote:0,buffer:0,dash:0,dashCd:0,wall:0,swing:0,swingCd:0}),e$1.set(d,jt,{x:_.x,y:_.y,w:Np,h:Bc}),e$1.set(d,e,{x:0,y:0})),e$1.set(d,f,{shape:"actor",cast:De().cast,h:Bc*oe()*1.25,pose:"idle",depth:10});},Y=()=>Math.sqrt(2*cr*Cp*(1+jn(e$1,"meta:jump"))*(De().perk==="jump"?1.15:1)),Le=()=>{if(d===null)return;let w=e$1.need(d,jt),f=e$1.need(d,cn);w.x=_.x,w.y=_.y,f.vx=0,f.vy=0;for(let m of e$1.query(lt))(e$1.need(m,lt).kind==="bullet"||e$1.need(m,lt).kind==="wave")&&e$1.destroy(m);},Ye=()=>{Ht(),je(),M=n("lives")+jn(e$1,"meta:hearts")+(De().perk==="heart"?1:0),O=M,$=0,G=false,B=false,Q=0,ae=0,q=0,ue=false,fe=!r.boss,ve.fill(false),ie=Cs(jn(e$1,"meta:stars_total")),n("doubleJump")&&!ie.includes("double")&&ie.push("double"),e$1.vars.abilities=ie.join(","),e$1.vars.platformer_level=r.level,e$1.vars.platformer_world=r.world,e$1.vars.lives=O,e$1.vars.coins=0,e$1.vars.score=0,e$1.vars.stars=0,e$1.vars.reviving=false,x=0,Ce(),Le(),d!==null&&(e$1.need(d,cn).facing=1,et(e$1,d,"idle")),r.boss&&e$1.emit(Lp,{}),_t(e$1);},at=()=>{!Ze(e$1)||ge()||d===null||(e$1.need(d,cn).buffer=.13);},_e=()=>{if(d===null)return;let w=e$1.need(d,cn);w.vy<0&&(w.vy*=.5);},Pt=()=>{if(!Ze(e$1)||ge()||d===null||!ie.includes("dash"))return;let w=e$1.need(d,cn);w.dashCd>0||(w.dash=.2,w.dashCd=.8,w.vy=0,He(e$1,d,"attack"));},Ge=()=>{if(!Ze(e$1)||ge()||d===null)return;let w=e$1.need(d,cn);w.swingCd>0||(w.swing=.16,w.swingCd=.32,He(e$1,d,"attack"));};e$1.on(j,w=>{let f=w;e$1.vars.started_tick!==e$1.tick&&(f.type==="key"&&(f.key==="up"||f.key==="action")?at():f.type==="key-up"&&(f.key==="up"||f.key==="action")?_e():f.type==="key"&&f.key==="down"?Pt():f.type==="tap"?Ge():f.type==="swipe"&&f.dir==="up"&&at());});let Xe=(w,f)=>{if(!Ze(w)||G)return;G=true;let m=f==="cleared",p=ve.filter(Boolean).length;w.vars.stars=p,m&&w.vars["meta:first_clear"]===true&&qe(w,"coins",r.firstClearGold),w.vars.score=q*n("coinScore")+p*n("starScore")+(m?n("clearBonus"):0),w.vars.reviving=false,m&&w.emit(Ni,{level:r.level}),w.emit(Bt,{reason:f,stats:{chapter:r.level,seconds:Math.floor(Q),cleared:m,stars:m?p:0,coins:q,bosses:r.boss&&fe?1:0}});},tt=w=>{if(w.vars.revive_ready===true&&!B){w.vars.reviving=true,w.emit(Gt,{});return}Xe(w,"fell");},ot=w=>{ge()&&(B=true,w.vars.reviving=false,O=Math.max(2,Math.ceil(M/2)),w.vars.lives=O,$=2.5,Le(),d!==null&&et(w,d,"idle"),V(w,{kind:"flash",color:"coin"}));},ct=(w,f)=>{if(d===null||$>0||G)return;let m=w.need(d,cn);m.dash>0||(O--,w.vars.lives=O,w.emit("player-hit",{lives:O}),$=n("graceTime")+jn(w,"meta:grace"),m.vy=-Y()*.55,m.vx=(f===null?-m.facing:Math.sign(w.need(d,jt).x-f)||-m.facing)*5,He(w,d,"hit"),V(w,{kind:"shake",power:1.2}),V(w,{kind:"flash",color:"danger"}),O<=0&&tt(w));},it=(w,f,m)=>{let p=w.need(f,lt),y=w.need(f,jt),l=oe();V(w,{kind:"burst",x:Ke(y.x),y:ze(y.y-y.h/2),color:"danger",n:12,size:l*.9}),w.emit("enemy-defeated",{kind:p.kind,by:m}),qe(w,"score",50),w.destroy(f);},bt=(w,f)=>{let m=w.need(f,jt);ae+=1+jn(w,"meta:greed");let p=Math.floor(ae);ae-=p,p>0&&qe(w,"coins",p),q++,w.emit("coin-collected",{value:1}),V(w,{kind:"burst",x:Ke(m.x),y:ze(m.y-m.h/2),color:"coin",n:6,size:oe()*.6}),w.destroy(f);},Ke=w=>w*oe()-x*oe(),ze=w=>ce()+w*oe();function _t(w){oe();for(let m of w.query(jt)){let p=w.need(m,jt),y=w.get(m,e);if(!y)continue;y.x=Ke(p.x),y.y=ze(p.y-p.h/2);let l=w.get(m,f);if(l&&l.shape==="actor"&&w.has(m,lt)){let u=w.need(m,lt);l.facing=u.dir>=0?1:-1,l.alpha=u.safe>0&&Math.floor(w.time*12)%2===0?.35:1,y.y=ze(p.y)-l.h/2;}if(l&&l.shape==="actor"&&w.has(m,cn)&&(y.y=ze(p.y)-l.h/2),l&&w.has(m,Oo)&&w.need(m,Oo).char==="_"){let u=se.get(`${Math.floor(p.x)},${Math.round(p.y-p.h)}`)??0;l.alpha=u>.5?0:u>0?.5+.5*Math.abs(Math.sin(w.time*30)):.85;}}}let Fe=(w,f$1,m,p)=>{let y=Me.get(w);(y===void 0||!e$1.isAlive(y))&&(y=e$1.create(),e$1.set(y,$c,{id:w}),Me.set(w,y)),e$1.set(y,e,{x:f$1,y:m}),e$1.set(y,f,p);},Ct=w=>{let f=Me.get(w);f!==void 0&&e$1.destroy(f),Me.delete(w);};function Ht(){for(let w of Me.values())e$1.destroy(w);Me.clear(),rt(e$1,$c);}let It=w=>{let f=Number(w.vars.view_w??720),m=Number(w.vars.view_h??1280),p=Math.min(f,m),y=m*.085;Fe("lvl",f*.08,y,{shape:"text",text:`${r.world}-${r.index}`,size:Math.round(p*.042),color:"text",bold:true,depth:42});let l=p*.05;for(let I=0;I<M;I++)Fe(`h${I}`,f*.07+I*l*1.1,y+p*.065,{shape:"sprite",art:"heart",w:l,h:l,alpha:I<O?1:.25,depth:42});for(let I=M;I<12;I++)Ct(`h${I}`);let u=p*.06;for(let I=0;I<3;I++)Fe(`s${I}`,f/2+(I-1)*u*1.15,y,{shape:"sprite",art:"bigstar",w:u,h:u,alpha:ve[I]?1:.25,depth:42});let b=p*.045,A=String(w.vars.coins??0);if(Fe("coin:i",f*.92-A.length*b*.6-b*.7,y,{shape:"sprite",art:"coin",w:b,h:b,depth:42}),Fe("coin",f*.92-A.length*b*.6/2,y,{shape:"text",text:A,size:Math.round(b),color:"text",bold:true,depth:42}),ue?Fe("key",f*.92-b*.3,y+p*.065,{shape:"sprite",art:"key",w:b,h:b,depth:42}):Ct("key"),r.boss){let I=w.query(lt).find(ke=>w.need(ke,lt).kind==="boss"),N=I!==void 0?w.need(I,lt).hp/r.bossHp:0,U=f*.5,X=Math.max(10,p*.022);Fe("boss:bg",f/2,y+p*.075,{shape:"rect",w:U,h:X,color:"#000000",alpha:.45,radius:X/2,depth:41});let ye=Math.max(0,(U-4)*Math.round(N*100)/100);ye<1?Ct("boss:fill"):Fe("boss:fill",f/2-(U-4)/2+ye/2,y+p*.075,{shape:"rect",w:ye,h:X-4,color:"danger",radius:(X-4)/2,depth:41.1});}};e$1.on($t,()=>{Ye(),e$1.vars.level=r.level;}),e$1.on(Wt,Ye),e$1.on(Kt,()=>ot(e$1)),e$1.on(Ft,()=>{ge()&&(e$1.vars.reviving=false,Xe(e$1,"fell"));}),e$1.on(zt,w=>{d!==null&&e$1.isAlive(d)&&et(e$1,d,w.reason==="cleared"?"dance":"die"),Ht();}),e$1.on(k,()=>{Tt(e$1,"side",ce()+8*oe()+2);let w=oe();for(let f$1 of e$1.query(lt)){let m=e$1.need(f$1,lt);if(m.tag==="crumble")continue;let p=e$1.need(f$1,jt);e$1.set(f$1,f,te(m.kind,p.w,p.h,w));}Ee(),Ce(),_t(e$1);}),e$1.addSystem({id:"platformer",order:0,run(w,f$1){if(!Ze(w)||d===null||G||ge())return;Q+=f$1,$>0&&($=Math.max(0,$-f$1));let m=w.need(d,jt),p=w.need(d,cn),y=r.pace;for(let[j,k]of [...se]){let E=k+f$1;E>3.5?se.delete(j):se.set(j,E);}let l=s.axis().x;if(l!==0&&(p.facing=l),p.dash>0)p.dash-=f$1,p.vx=p.facing*15,p.vy=0;else {let j=l*Pp,k=p.grounded?60:32;p.vx+=Math.max(-k*f$1,Math.min(k*f$1,j-p.vx)),p.vy+=cr*f$1,p.vy>22&&(p.vy=22);}if(p.dashCd>0&&(p.dashCd-=f$1),p.swingCd>0&&(p.swingCd-=f$1),p.swing>0){p.swing-=f$1;let j={l:p.facing>0?m.x:m.x-1.4,r:p.facing>0?m.x+1.4:m.x,t:m.y-m.h-.2,b:m.y};for(let k of w.query(lt)){if(!w.isAlive(k)||!w.has(k,lt))continue;let E=w.need(k,lt);if(!["walker","spiky","hopper","flyer","gunner","boss","bullet"].includes(E.kind))continue;let a=w.need(k,jt);a.x+a.w/2<j.l||a.x-a.w/2>j.r||a.y-a.h>j.b||a.y<j.t||(E.kind==="bullet"?(V(w,{kind:"burst",x:Ke(a.x),y:ze(a.y-a.h/2),color:"text",n:6,size:oe()*.5}),w.destroy(k)):E.kind==="boss"?tn(w,k,"sword"):it(w,k,"sword"));}}if(p.coyote=p.grounded?.1:Math.max(0,p.coyote-f$1),p.buffer>0){p.buffer-=f$1;let j=ie.includes("double")&&p.jumps<2;p.coyote>0||p.grounded?(p.vy=-Y(),p.jumps=1,p.buffer=0,p.grounded=false,p.coyote=0):p.wall!==0&&ie.includes("wall")?(p.vy=-Y()*.95,p.vx=-p.wall*7,p.facing=-p.wall,p.jumps=1,p.buffer=0):j&&p.jumps>=1&&(p.vy=-Y()*.9,p.jumps=2,p.buffer=0,V(w,{kind:"ring",x:Ke(m.x),y:ze(m.y),color:"text",size:oe()*1.2})),p.buffer===0&&He(w,d,"jump");}let u=m.w/2,b=m.x+p.vx*f$1;p.wall=0;let A=j=>{let k=[];for(let E=Math.floor(j-m.h+.05);E<=Math.floor(j-.05);E++)k.push(E);return k};if(p.vx>0){let j=Math.floor(b+u);A(m.y).some(k=>ee(Se(j,k)))&&(b=j-u-.001,p.grounded||(p.wall=1),p.vx=0);}else if(p.vx<0){let j=Math.floor(b-u);A(m.y).some(k=>ee(Se(j,k)))&&(b=j+1+u+.001,p.grounded||(p.wall=-1),p.vx=0);}p.wall===0&&!p.grounded&&l!==0&&A(m.y).some(j=>ee(Se(Math.floor(b+l*(u+.05)),j)))&&(p.wall=l),m.x=Math.max(u,Math.min(c-u,b));let I=m.y,N=m.y+p.vy*f$1,U=p.grounded;p.grounded=false;let X=[Math.floor(m.x-u+.05),Math.floor(m.x+u-.05)];if(p.vy>=0){let j=Math.floor(N);for(let k of X){let E=Se(k,j),a=j;if((ee(E)||xe(E)&&I<=a+.05)&&N>=a){N=a,p.vy=0,p.grounded=true,p.jumps=0,E==="_"&&!se.has(`${k},${j}`)&&se.set(`${k},${j}`,.001),E==="^"&&(ct(w,null),p.vy=-Y()*.7,p.grounded=false);break}}}else {let j=Math.floor(N-m.h);X.some(k=>ee(Se(k,j)))&&(N=j+1+m.h,p.vy=0);}m.y=N,!U&&p.grounded&&He(w,d,"jump");for(let j of w.query(lt)){let k=w.need(j,lt);if(k.kind!=="mover"||k.tag==="crumble")continue;let E=w.need(j,jt),a=E.x;k.t+=f$1,E.x=k.baseX+Math.sin(k.t*.9)*2.2;let S=E.y-E.h;p.vy>=0&&Math.abs(m.x-E.x)<E.w/2+u*.6&&I<=S+.1&&m.y>=S-.05&&(m.y=S,p.vy=0,p.grounded=true,p.jumps=0,m.x+=E.x-a);}if(m.y>12&&(ct(w,null),$=Math.max($,1),!ge()&&!G&&Le(),G||ge()))return;let ye={l:m.x-u,r:m.x+u,t:m.y-m.h,b:m.y},ke=j=>ye.r>j.x-j.w/2&&ye.l<j.x+j.w/2&&ye.b>j.y-j.h&&ye.t<j.y,Ue=1.2*(1+jn(w,"meta:magnet")),st=m.x;for(let j of w.query(lt)){if(!w.isAlive(j)||!w.has(j,lt))continue;let k=w.need(j,lt),E=w.need(j,jt);switch(k.safe>0&&(k.safe-=f$1),k.kind){case "walker":case "spiky":{k.vx=k.dir*1.6*y;let a=E.x+k.dir*(E.w/2+.05)+k.vx*f$1,S=ee(Se(Math.floor(a),Math.floor(E.y-.5))),L=Se(Math.floor(a),Math.floor(E.y));S||!(ee(L)||xe(L))?k.dir=-k.dir:E.x+=k.vx*f$1;break}case "hopper":{k.t+=f$1,k.vy+=cr*.6*f$1,E.y+=k.vy*f$1,E.y>=k.baseY&&(E.y=k.baseY,k.vy=0,k.t>1.5/y&&(k.t=0,k.vy=-Math.sqrt(2*cr*.6*2.4))),k.dir=st<E.x?-1:1;break}case "flyer":k.t+=f$1*y,E.x=k.baseX+Math.sin(k.t*.9)*3,E.y=k.baseY+Math.sin(k.t*1.8)*.9,k.dir=Math.cos(k.t*.9)>=0?1:-1;break;case "gunner":{if(k.dir=st<E.x?-1:1,k.t+=f$1,k.t>2.2/y&&Math.abs(st-E.x)<9){k.t=0;let a=me("bullet",E.x+k.dir*.6,E.y-.45,.45,.3);a.vx=k.dir*6*y,a.dir=k.dir,He(w,j,"attack");}break}case "bullet":case "wave":if(E.x+=k.vx*f$1,k.t+=f$1,k.t>(k.kind==="wave"?2.2:3.5)||ee(Se(Math.floor(E.x),Math.floor(E.y-.1)))){w.destroy(j);continue}break;case "boss":pt(w,j,k,E,st,f$1);break;case "coin":Math.hypot(E.x-m.x,E.y-(m.y-m.h/2))<Ue&&Ue>1.21&&(E.x+=(m.x-E.x)*Math.min(1,f$1*10),E.y+=(m.y-m.h/2-E.y)*Math.min(1,f$1*10));break;}if(!(!w.isAlive(j)||!ke(E))){switch(k.kind){case "coin":bt(w,j);break;case "star":{let a=Number(k.tag);ve[a]=true,w.vars.stars=ve.filter(Boolean).length,w.emit("star-collected",{index:a}),V(w,{kind:"ring",x:Ke(E.x),y:ze(E.y-E.h/2),color:"coin",size:oe()*2.4}),V(w,{kind:"flash",color:"coin"}),w.destroy(j);break}case "heart":O=Math.min(M,O+1),w.vars.lives=O,V(w,{kind:"ring",x:Ke(E.x),y:ze(E.y-E.h/2),color:"danger",size:oe()*1.6}),w.destroy(j);break;case "key":ue=true,V(w,{kind:"ring",x:Ke(E.x),y:ze(E.y-E.h/2),color:"coin",size:oe()*1.6}),w.destroy(j);break;case "chest":if(ue&&k.tag!=="open"){k.tag="open",ue=false;for(let S=0;S<15;S++)ae+=1+jn(w,"meta:greed"),q++;let a=Math.floor(ae);ae-=a,qe(w,"coins",a),V(w,{kind:"burst",x:Ke(E.x),y:ze(E.y-E.h/2),color:"coin",n:24,size:oe()*1.4}),V(w,{kind:"pop",x:Ke(E.x),y:ze(E.y-E.h*1.4),text:"+15",color:"coin",size:Math.round(oe()*.5)});}break;case "spring":p.vy>0&&m.y-(E.y-E.h)<.5&&(p.vy=-Math.sqrt(2*cr*Ip),p.jumps=1,V(w,{kind:"ring",x:Ke(E.x),y:ze(E.y-E.h),color:"accent",size:oe()*1.4}));break;case "checkpoint":if(k.tag!=="on"){k.tag="on",_={x:E.x,y:E.y};let a=w.need(j,f);a.shape==="sprite"&&(a.color="accent"),w.emit("checkpoint",{}),V(w,{kind:"ring",x:Ke(E.x),y:ze(E.y-E.h/2),color:"accent",size:oe()*2});}break;case "flag":if(fe){Xe(w,"cleared");return}break;case "walker":case "hopper":case "flyer":case "gunner":case "spiky":case "boss":{let a=p.vy>0&&m.y-(E.y-E.h)<.55&&k.kind!=="spiky";p.dash>0&&k.kind!=="boss"?it(w,j,"dash"):a?(p.vy=-Y()*.65,p.jumps=1,k.kind==="boss"?tn(w,j,"stomp"):it(w,j,"stomp")):ct(w,E.x);break}case "bullet":case "wave":ct(w,E.x),w.destroy(j);break;}if(G||ge())return}}let Pe=Ae(),re=Math.max(0,Math.min(Math.max(0,c-Pe),m.x-Pe*.4+p.facing*Pe*.08)),H=x;x+=(re-x)*Math.min(1,f$1*6),mo(w,(x-H)*oe()),w.vars.level_progress=Math.min(1,m.x/Math.max(1,c));let J=w.need(d,f);J.shape==="actor"&&(J.facing=p.facing>=0?1:-1,J.pose=p.grounded?Math.abs(p.vx)>.5?"run":"idle":"air",J.speed=Math.abs(p.vx)*oe(),J.alpha=$>0&&Math.floor(w.time*12)%2===0?.35:1),_t(w),It(w);}});function tn(w,f,m){let p=w.need(f,lt);p.safe>0||(p.hp--,p.safe=1,He(w,f,"hit"),V(w,{kind:"shake",power:1}),p.hp<=0&&(fe=true,w.emit(wp,{}),it(w,f,m),me("flag",c-2,8,.8,2.6)));}function pt(w,f,m,p,y,l){if(m.t-=l,m.vy+=cr*l,p.y=Math.min(m.baseY,p.y+m.vy*l),p.y>=m.baseY){if(m.tag==="slam-air"){m.tag="walk",m.t=1.6,V(w,{kind:"shake",power:1.4});for(let u of [-1,1]){let b=me("wave",p.x+u*1.2,m.baseY,.9,.6);b.vx=u*8*r.pace;}}m.vy=0;}if(m.tag==="walk"){if(m.dir=y<p.x?-1:1,p.x+=m.dir*1.4*r.pace*l,m.t<=0){let u=Math.floor(w.rng.next()*3);if(u===0)m.tag="charge",m.t=1.1,m.vx=m.dir*9*r.pace,et(w,f,"run");else if(u===1)m.tag="slam-air",m.vy=-Math.sqrt(2*cr*4),He(w,f,"jump");else {m.tag="walk",m.t=2.4;for(let b of [c-15,c-3])me("walker",b,m.baseY,.8,1).dir=b<p.x?1:-1;He(w,f,"cheer");}}}else m.tag==="charge"&&(p.x+=m.vx*l,(m.t<=0||ee(Se(Math.floor(p.x+Math.sign(m.vx)*1.2),Math.floor(m.baseY-1))))&&(m.tag="walk",m.t=1.8,et(w,f,"walk")));p.x=Math.max(c-17.5,Math.min(c-1.2,p.x));}Tt(e$1,"side",ce()+8*oe()+2),Ye();}};var Qt=5,Ns=6,$s=6,vn={blaster:{id:"blaster",art:"shot",color:"coin",damage:[10,13,15,18,24],cooldown:[.8,.7,.62,.55,.42],count:[1,1,2,2,3],pierce:[1,1,1,2,3]},blades:{id:"blades",art:"blade",color:"primary",damage:[8,10,12,14,19],cooldown:[.45,.42,.4,.38,.32],count:[2,2,3,3,5],reach:[.15,.16,.17,.18,.21]},aura:{id:"aura",art:"aura",color:"secondary",damage:[5,7,9,11,16],cooldown:[.5,.5,.45,.45,.4],count:[1,1,1,1,1],reach:[.11,.125,.14,.155,.19]},boomerang:{id:"boomerang",art:"boomerang",color:"accent",damage:[16,20,24,28,38],cooldown:[1.8,1.6,1.4,1.25,1],count:[1,1,2,2,3],reach:[.34,.36,.38,.4,.46]},lightning:{id:"lightning",art:"lightning",color:"primary",damage:[18,22,26,30,42],cooldown:[2,1.8,1.6,1.4,1.1],count:[2,3,4,5,7],reach:[.22,.23,.24,.25,.3]},drone:{id:"drone",art:"drone",color:"piece6",damage:[9,11,13,15,21],cooldown:[1,.9,.8,.7,.55],count:[1,1,2,2,3],reach:[.11,.11,.12,.12,.13]}},dr=Object.keys(vn),Gr={might:{id:"might",art:"fist",color:"danger",step:.12},haste:{id:"haste",art:"hourglass",color:"primary",step:.07},area:{id:"area",art:"aura",color:"secondary",step:.1},swift:{id:"swift",art:"boot",color:"accent",step:.08},vigor:{id:"vigor",art:"heart",color:"danger",step:20},armor:{id:"armor",art:"shield",color:"muted",step:1.5},magnet:{id:"magnet",art:"magnet",color:"danger",step:.3},luck:{id:"luck",art:"clover",color:"accent",step:.2},growth:{id:"growth",art:"crystal",color:"accent",step:.1}},Bs=Object.keys(Gr),Cn={swarm:{kind:"swarm",cast:"foe5",hp:.6,speed:118,size:.045,damage:5,xp:1,from:0,weight:3},grunt:{kind:"grunt",cast:"foe",hp:1,speed:95,size:.055,damage:8,xp:1,from:0,weight:4},archer:{kind:"archer",cast:"foe3",hp:1.2,speed:88,size:.055,damage:7,xp:2,from:.8,weight:2},brute:{kind:"brute",cast:"foe2",hp:5,speed:62,size:.085,damage:14,xp:5,from:1.6,weight:1.2},charger:{kind:"charger",cast:"foe4",hp:2.5,speed:80,size:.065,damage:12,xp:3,from:2.4,weight:1.4},bomber:{kind:"bomber",cast:"foe5",hp:1.5,speed:120,size:.055,damage:16,xp:2,from:3.2,weight:1.4},miniboss:{kind:"miniboss",cast:"boss",hp:45,speed:75,size:.12,damage:18,xp:25,from:99,weight:0},boss:{kind:"boss",cast:"boss",hp:160,speed:70,size:.16,damage:24,xp:0,from:99,weight:0}},zc=["swarm","grunt","archer","brute","charger","bomber"],zs=10;function Kr(e,t){let n=Math.max(1,Math.min(zs,Math.floor(e)));return {chapter:n,duration:Math.min(600,t+(n-1)*30),hp:1+(n-1)*.45,damage:1+(n-1)*.12,headStart:(n-1)*.4,firstClearGold:100+(n-1)*60}}var Fr=[{id:"hero",cast:"hero",weapon:"blaster",passive:null,gems:0},{id:"hero2",cast:"hero2",weapon:"blades",passive:"vigor",gems:150},{id:"hero3",cast:"hero3",weapon:"lightning",passive:"area",gems:300}],$i=[{id:"Might",var:"meta:might",art:"fist",color:"danger",perLevel:4,unit:"%",maxLevel:50,price:30,growth:.09},{id:"Vitality",var:"meta:hp",art:"heart",color:"danger",perLevel:8,unit:"",maxLevel:50,price:25,growth:.09},{id:"Armor",var:"meta:armor",art:"shield",color:"muted",perLevel:.5,unit:"",maxLevel:30,price:40,growth:.1},{id:"Swiftness",var:"meta:speed",art:"boot",color:"accent",perLevel:2,unit:"%",maxLevel:25,price:35,growth:.1},{id:"Magnet",var:"meta:magnet",art:"magnet",color:"danger",perLevel:6,unit:"%",maxLevel:25,price:20,growth:.1},{id:"Luck",var:"meta:luck",art:"clover",color:"accent",perLevel:5,unit:"%",maxLevel:25,price:30,growth:.1},{id:"Growth",var:"meta:growth",art:"crystal",color:"accent",perLevel:3,unit:"%",maxLevel:30,price:30,growth:.1},{id:"Recovery",var:"meta:regen",art:"potion",color:"accent",perLevel:.1,unit:"",maxLevel:30,price:45,growth:.1}],Bi="kit-survivors",Wc=30,Hc=10,Vc={game:"survivors",character:Bi,stats:$i,heroes:Fr,levels:zs,firstClearGold:e=>Kr(e,300).firstClearGold,stars:0};var Hs=b("survivors.hero"),$e=b("survivors.foe"),fr=b("survivors.shot"),Nn=b("survivors.bullet"),Xt=b("survivors.drop"),Xn=b("survivors.blade"),pr=b("survivors.aura"),ur=b("survivors.drone"),Do=b("survivors.boomerang"),Ao=b("survivors.zap"),Ur=b("survivors.halo"),Gc=b("survivors.hud"),Yn=b("survivors.joystick"),zi="level-up",Wi="upgrade-picked",Hi="upgrade-pick",Vi="upgrade-reroll";var Vs="boss-spawned",Gi="boss-defeated",Ki=e=>[...Object.entries(e.weapons).map(([t,n])=>`w:${t}:${n}`),...Object.entries(e.passives).map(([t,n])=>`p:${t}:${n}`)].join(","),Kc=e=>{let t={},n={};for(let s of String(e??"").split(",")){let[r,o,c]=s.split(":");r==="w"&&o&&o in vn?t[o]=Number(c):r==="p"&&o&&o in Gr&&(n[o]=Number(c));}return {weapons:t,passives:n}},Fi=e=>e.map(t=>`${t.kind}:${t.id}:${t.level}`).join(","),Fc=e=>String(e??"").split(",").filter(Boolean).map(t=>{let[n,s,r]=t.split(":");return {kind:n,id:s??"",level:Number(r??1)}}),Ws=e=>e.vars.reviving===true,In=(e,t)=>{let n=Number(e.vars[t]??0);return Number.isFinite(n)?n:0},Gs={id:"survivors",version:2,engines:["phaser"],requires:["round"],params:{duration:{type:"number",default:300,min:20,max:900},heroSpeed:{type:"number",default:260,min:80,max:800},hp:{type:"number",default:100,min:10,max:2e3},spawnRate:{type:"number",default:1.2,min:.1,max:10},spawnGrowth:{type:"number",default:.9,min:0,max:10},foeHp:{type:"number",default:10,min:1,max:1e3},foeHpGrowth:{type:"number",default:.45,min:0,max:5},foeDamage:{type:"number",default:1,min:.1,max:10},foeSpeed:{type:"number",default:1,min:.3,max:3},damage:{type:"number",default:1,min:.1,max:100},shotSpeed:{type:"number",default:640,min:100,max:2e3},xpFirst:{type:"number",default:4,min:1,max:100,integer:true},xpGrowth:{type:"number",default:1.25,min:1,max:2},coinRate:{type:"number",default:.25,min:0,max:1},killScore:{type:"number",default:10,min:0,max:1e3,integer:true},bossScore:{type:"number",default:500,min:0,max:1e5,integer:true},clearBonus:{type:"number",default:1e3,min:0,max:1e5,integer:true},graceTime:{type:"number",default:.6,min:0,max:5},maxFoes:{type:"number",default:46,min:5,max:160,integer:true},minibossEvery:{type:"number",default:120,min:0,max:900},eliteEvery:{type:"number",default:50,min:0,max:900}},setup({world:e$1,params:t,mode:n}){let s=e$1.rng.stream("survivors"),r=_r(e$1),o=a=>nn(t,a),c=null,d=null,x=0,_={},O={},M={},$=0,G=0,B=0,Q=1,ae=0,q=0,ue=[],fe="level",ie=0,ve=0,se=0,Me=false,De=0,ge=0,oe=300,ce=Kr(1,300),Ae=false,Se=null,ee=0,xe=0,je=0,we=0,te=null,me=0,Ee=0,Re=false,Ce=new Map,Y={maxHp:100,hp:100,regen:0,armor:0,speed:260,magnet:80,might:1,haste:1,area:1,luck:1,growth:1},Le=()=>Math.min(Ie(e$1).w,Ie(e$1).h),Ye=()=>Le()/720,at=()=>Le()*.07,_e=()=>{let a=Ie(e$1);return {x:a.w/2,y:a.h/2}},Pt=()=>{let a=L=>O[L]??0,S=Y.maxHp;Y.might=(1+In(e$1,"meta:might")+.12*a("might"))*o("damage"),Y.haste=Math.max(.4,1-.07*a("haste")),Y.area=1+.1*a("area"),Y.speed=o("heroSpeed")*Ye()*(1+In(e$1,"meta:speed")+.08*a("swift")),Y.maxHp=o("hp")+In(e$1,"meta:hp")+20*a("vigor"),Y.regen=In(e$1,"meta:regen")+.3*a("vigor"),Y.armor=In(e$1,"meta:armor")+1.5*a("armor"),Y.magnet=Le()*.12*(1+In(e$1,"meta:magnet")+.3*a("magnet")),Y.luck=1+In(e$1,"meta:luck")+.2*a("luck"),Y.growth=1+In(e$1,"meta:growth")+.1*a("growth"),Y.maxHp>S&&(Y.hp+=Y.maxHp-S),Y.hp=Math.min(Y.hp,Y.maxHp),e$1.vars.survivors_build=Ki({weapons:_,passives:O});},Ge=a=>Math.ceil(o("xpFirst")*Math.pow(a,o("xpGrowth"))),Xe=()=>Fr.find(a=>a.id===e$1.vars["meta:hero"])??Fr[0],tt=()=>{let a=_e(),S=at();(c===null||!e$1.isAlive(c))&&(c=e$1.create(),e$1.set(c,Hs,{size:S})),e$1.need(c,Hs).size=S,e$1.set(c,e,{x:a.x,y:a.y}),e$1.set(c,f,{shape:"actor",cast:Xe().cast,h:S*2.3,feet:S*.6,pose:"idle",depth:Vt(e$1,a.y)});},ot=(a,S,L,i)=>{let h=Ce.get(a);(h===void 0||!e$1.isAlive(h))&&(h=e$1.create(),e$1.set(h,Gc,{id:a}),Ce.set(a,h)),e$1.set(h,e,{x:S,y:L}),e$1.set(h,f,i);},ct=a=>{let S=Ce.get(a);S!==void 0&&e$1.destroy(S),Ce.delete(a);},it=()=>{for(let a of Ce.values())e$1.destroy(a);Ce.clear(),rt(e$1,Gc);},bt=(a,S,L,i,h,D,R,v=41)=>{let g=Math.max(0,Math.min(1,Math.round(D*100)/100));ot(`${a}:bg`,S,L,{shape:"rect",w:i,h,color:"#000000",alpha:.45,radius:h/2,depth:v});let T=Math.max(0,(i-4)*g);T<1?ct(`${a}:fill`):ot(`${a}:fill`,S-(i-4)/2+T/2,L,{shape:"rect",w:T,h:h-4,color:R,radius:(h-4)/2,depth:v+.01});},Ke=a=>{let S=Ie(a),L=Le(),i=S.h*.085,h=S.w*.9,D=Math.max(10,L*.026);bt("xp",S.w/2,i,h,D,B/Ge(Q),"accent"),ot("lv",S.w/2+h/2-L*.04,i+D*1.6,{shape:"text",text:`Lv ${Q}`,size:Math.round(L*.032),color:"text",bold:true,depth:42});let R=i+L*.075;if(Se!==null&&a.isAlive(Se)&&a.has(Se,$e)){let F=a.need(Se,$e);bt("boss",S.w/2,R,S.w*.62,Math.max(14,L*.034),F.hp/F.maxHp,"danger"),ot("time",S.w/2,R-L*.05,{shape:"text",text:F.kind==="boss"?"BOSS":"MINI BOSS",size:Math.round(L*.036),color:"danger",bold:true,depth:42}),a.vars.boss_hp=F.hp/F.maxHp;}else ct("boss:bg"),ct("boss:fill"),ot("time",S.w/2,R,{shape:"text",text:Zo(Number(a.vars.time_left??0)),size:Math.round(L*.05),color:"text",bold:true,depth:42}),a.vars.boss_hp=0;let v=Math.round(L*.036);ot("kills:i",S.w*.06,R,{shape:"sprite",art:"skull",w:v*1.1,h:v*1.1,color:"text",depth:42}),ot("kills",S.w*.06+v*.75+String(ve).length*v*.28,R,{shape:"text",text:String(ve),size:v,color:"text",bold:true,depth:42});let g=L*.05,T=0,C=new Set,P=(F,de,le,he,pe,We)=>{C.add(F),ot(`b:${F}`,pe,We,{shape:"sprite",art:de,w:g,h:g,color:le,alpha:.95,depth:41}),ot(`b:${F}:l`,pe+g*.38,We+g*.36,{shape:"text",text:he>=5?"\u2605":String(he),size:Math.round(g*.42),color:he>=5?"coin":"text",bold:true,depth:42});};for(let[F,de]of Object.entries(_)){let le=vn[F];P(F,le.art,le.color,de??1,S.w*.06+T*g*1.12,R+L*.075),T++;}T=0;for(let[F,de]of Object.entries(O)){let le=Gr[F];P(F,le.art,le.color,de??1,S.w*.06+T*g*.95,R+L*.075+g*1.1),T++;}for(let F of [...Ce.keys()])if(F.startsWith("b:")){let de=F.slice(2).replace(/:l$/,"");C.has(de)||ct(F);}let z=at(),Z=_e();bt("hp",Z.x,Z.y+z*1.05,z*1.7,Math.max(7,L*.013),Y.hp/Y.maxHp,Y.hp/Y.maxHp>.35?"accent":"danger",40);},ze=(a=-1)=>{let S=Ie(e$1),L=Le()*.08,i=a>=0?a:s.int(0,3);return {x:i===0?-L:i===1?S.w+L:s.range(-L,S.w+L),y:i===2?-L:i===3?S.h+L:s.range(-L,S.h+L)}},_t=()=>o("foeHp")*ce.hp*(1+o("foeHpGrowth")*(ge/60)),Fe=(a,S,L=false)=>{let i=Cn[a],h=a==="boss"||a==="miniboss",D=Le()*i.size*(L?1.3:1),R=_t()*i.hp*(L?8:1),v=Et(e$1,S.x,S.y,{shape:"actor",cast:i.cast,variant:s.int(0,99),h:D*(h?1.9:a==="brute"?1.75:2.2),feet:D*.6,pose:a==="brute"||h?"walk":"run",depth:Vt(e$1,S.y)},{type:$e,data:{kind:a,hp:R,maxHp:R,speed:i.speed*Ye()*o("foeSpeed")*(1+Math.min(.5,ge/600)),size:D,damage:i.damage*ce.damage*o("foeDamage")*(L?1.4:1),xp:i.xp*(L?5:1),elite:L,t:s.range(0,1.5),phase:"walk",vx:0,vy:0,hurtAt:{},next:0}});return (L||h)&&Et(e$1,S.x,S.y+D*.5,{shape:"sprite",art:"aura_field",w:D*2.2,h:D*1.1,color:h?"danger":"coin",alpha:.85,depth:2},{type:Ur,data:{of:v}}),v},Ct=()=>{let a=ge/60+ce.headStart,S=pn(n,"foes",zc),L=S.filter(R=>Cn[R].from<=a),i=L.length>0?L:[S.reduce((R,v)=>Cn[R].from<=Cn[v].from?R:v)],h=0;for(let R of i)h+=Cn[R].weight;let D=s.range(0,h);for(let R of i)if(D-=Cn[R].weight,D<=0)return R;return i[0]??"grunt"},Ht=()=>e$1.query($e).length,It=(a,S)=>{let L=ge/60+ce.headStart,i=o("spawnRate")*(1+o("spawnGrowth")*L);for(me>0&&(me-=S,i*=.25),Ae&&(i*=.45),te&&(te.left-=S,i*=2.6),De+=S*i;De>=1;)De-=1,!(Ht()>=o("maxFoes"))&&Fe(Ct(),ze(te?te.side:-1));if(te&&te.left<=0&&(te=null),!Ae){if(ge>=je){je=ge+s.range(26,36);let h=we++%3;if(h===0){let D=_e(),R=12+Math.min(12,Math.floor(L*2)),v=Le()*.62;for(let g=0;g<R;g++){let T=g/R*Math.PI*2;Fe(L>3?"grunt":"swarm",{x:D.x+Math.cos(T)*v,y:D.y+Math.sin(T)*v*1.25});}V(a,{kind:"flash",color:"danger"});}else h===1?te={left:4,side:s.int(0,3)}:me=5;}if(o("eliteEvery")>0&&ge>=xe){xe=ge+o("eliteEvery");let h=Ct();Fe(h==="swarm"?"grunt":h,ze(),true);}o("minibossEvery")>0&&ge>=ee&&oe-ge>30&&(ee=ge+o("minibossEvery"),(Se===null||!a.isAlive(Se))&&(Se=Fe("miniboss",ze()),a.emit(Vs,{kind:"miniboss"}),V(a,{kind:"shake",power:1.2})));}},tn=a=>{Ae=true,a.vars.time_left=0;let S=_e();for(let L of a.query($e)){let i=a.get(L,$e);if(!i||i.kind==="miniboss")continue;let h=a.need(L,e);Math.hypot(h.x-S.x,h.y-S.y)<Le()*.3&&w(a,L,null,false);}Se=Fe("boss",{x:S.x,y:S.y-Ie(a).h*.42}),V(a,{kind:"shake",power:2}),V(a,{kind:"flash",color:"danger"}),a.emit(Vs,{kind:"boss"});},pt=(a,S,L,i=1)=>{let h=at(),D=a==="xp"?{shape:"sprite",art:"crystal",w:h*(i>=25?.62:i>=5?.5:.38),h:h*(i>=25?.62:i>=5?.5:.38),color:i>=25?"secondary":i>=5?"primary":"accent",depth:3}:a==="coin"?{shape:"sprite",art:"coin",w:h*.4,h:h*.4,depth:3}:a==="food"?{shape:"sprite",art:"heart",w:h*.5,h:h*.5,depth:3}:a==="magnet"?{shape:"sprite",art:"magnet",w:h*.6,h:h*.6,depth:3}:a==="bomb"?{shape:"sprite",art:"bomb",w:h*.6,h:h*.6,depth:3}:{shape:"sprite",art:"chest",w:h*.9,h:h*.9,color:"coin",depth:3};Et(e$1,S,L,D,{type:Xt,data:{kind:a,value:i,pulled:false}});},w=(a,S,L,i=true)=>{let h=a.get(S,$e);if(!h)return;let D=a.need(S,e),R=D.x,v=D.y;a.remove(S,$e);for(let C of a.query(Ur))a.need(C,Ur).of===S&&a.destroy(C);et(a,S,"die");let g=a.need(S,f);if(g.shape==="actor"&&(g.depth=Vt(a,v)-.2),rr(a,S,1.4),V(a,{kind:"burst",x:R,y:v,color:"danger",n:h.elite||h.kind==="boss"?22:8,size:h.size*1.4}),!i)return;ve+=1,a.vars.kills=ve,a.emit("enemy-defeated",{kind:h.kind,elite:h.elite,by:L});let T=at();if(h.xp>0&&pt("xp",R,v+h.size*.4,h.xp),s.chance(Math.min(.95,o("coinRate")*Y.luck))&&pt("coin",R+T*.3,v+h.size*.4),s.chance(.012*Y.luck)&&pt("food",R-T*.3,v),s.chance(.004)&&!a.query(Xt).some(C=>a.need(C,Xt).kind==="magnet")&&pt("magnet",R,v-T*.3),s.chance(.004)&&pt("bomb",R,v-T*.3),h.elite||h.kind==="miniboss"){pt("chest",R,v);for(let C=0;C<3;C++)pt("coin",R+s.range(-T,T),v+s.range(-T,T));}if(h.kind==="bomber"){let C=Le()*.11*Y.area;V(a,{kind:"ring",x:R,y:v,color:"piece6",size:C*2});for(let P of a.query($e)){let z=a.need(P,e);Math.hypot(z.x-R,z.y-v)<C&&f$1(a,P,_t()*2.5,"blast");}}if((h.kind==="miniboss"||h.kind==="boss")&&(se+=1,a.vars.bosses=se,S===Se&&(Se=null),a.emit(Gi,{kind:h.kind}),V(a,{kind:"shake",power:2}),h.kind==="boss")){for(let C of a.query($e))w(a,C,null,false);u(a,"cleared");}},f$1=(a,S,L,i)=>{if(!a.has(S,$e))return;let h=a.need(S,$e);if(h.hp-=L,(h.elite||h.kind==="boss"||h.kind==="miniboss")&&Ee>0){Ee-=1;let D=a.need(S,e);V(a,{kind:"pop",x:D.x+s.range(-10,10),y:D.y-h.size,text:String(Math.round(L)),color:"text",size:Math.round(Le()*.03)});}h.hp<=0?w(a,S,i):h.kind!=="boss"&&h.kind!=="miniboss"&&He(a,S,"hit");},m=(a,S,L,i,h)=>{let D=a.get(S,$e);if(!D||D.kind==="boss"||D.kind==="miniboss"||D.phase==="dash")return;let R=a.need(S,e),v=R.x-L,g=R.y-i,T=Math.hypot(v,g)||1;R.x+=v/T*h,R.y+=g/T*h;},p=(a,S)=>{if(ie>0||c===null)return;let L=Math.max(1,S-Y.armor);Y.hp-=L,ie=o("graceTime"),a.vars.hp=Math.max(0,Math.ceil(Y.hp)),a.emit("player-hit",{hp:a.vars.hp}),He(a,c,"hit"),V(a,{kind:"flash",color:"danger"}),V(a,{kind:"shake",power:.8});let i=_e();V(a,{kind:"pop",x:i.x,y:i.y-at()*1.4,text:`-${Math.round(L)}`,color:"danger",size:Math.round(Le()*.034)}),Y.hp<=0&&y(a);},y=a=>{if(a.vars.revive_ready===true&&!Me){a.vars.reviving=true,Ot(a),d=null,a.emit(Gt,{});return}u(a,"died");},l=a=>{if(a.vars.reviving!==true)return;Me=true,a.vars.reviving=false,Y.hp=Y.maxHp,a.vars.hp=Math.ceil(Y.hp),ie=2.5;let S=_e();for(let L of a.query($e)){let i=a.need(L,e);if(Math.hypot(i.x-S.x,i.y-S.y)<Le()*.4){let h=a.get(L,$e);if(!h)continue;h.kind==="boss"||h.kind==="miniboss"?m(a,L,S.x,S.y,Le()*.2):w(a,L,"revive");}}for(let L of a.query(Nn))a.destroy(L);V(a,{kind:"ring",x:S.x,y:S.y,color:"coin",size:Le()*.8}),V(a,{kind:"flash",color:"coin"}),c!==null&&et(a,c,"idle");},u=(a,S)=>{if(!Ze(a)||Re)return;Re=true;let L=Math.floor(ge);S==="cleared"&&a.vars["meta:first_clear"]===true&&qe(a,"coins",ce.firstClearGold),a.vars.score=ve*o("killScore")+L*5+se*o("bossScore")+(S==="cleared"?o("clearBonus")*ce.chapter:0),a.vars.choosing=false,a.vars.reviving=false,a.emit(Bt,{reason:S,stats:{kills:ve,seconds:L,bosses:se,chapter:ce.chapter,level:Q,cleared:S==="cleared"}});},b=pn(n,"weapons",dr),A=()=>{let a=[],S=Object.keys(_).length,L=Object.keys(O).length;for(let h of dr){let D=_[h];D!==void 0&&D<5?a.push({o:{kind:"weapon",id:h,level:D+1},weight:3}):D===void 0&&S<6&&b.includes(h)&&a.push({o:{kind:"weapon",id:h,level:1},weight:1.6});}for(let h of Bs){let D=O[h];D!==void 0&&D<5?a.push({o:{kind:"passive",id:h,level:D+1},weight:2}):D===void 0&&L<6&&a.push({o:{kind:"passive",id:h,level:1},weight:1.2});}let i=[];for(;i.length<3&&a.length>0;){let h=0;for(let v of a)h+=v.weight;let D=s.range(0,h),R=0;for(;R<a.length-1&&(D-=a[R].weight,!(D<=0));R++);i.push(a[R].o),a.splice(R,1);}return i.length<3&&i.push({kind:"heal",id:"heal",level:1}),i.length<3&&i.push({kind:"gold",id:"gold",level:1}),i},I=(a,S)=>{ue=A(),fe=S,a.vars.choosing=true,a.vars.survivors_offer=Fi(ue),Ot(a),d=null,rt(a,Yn);let L=_e();V(a,{kind:"ring",x:L.x,y:L.y,color:S==="chest"?"coin":"accent",size:Le()*.5}),a.emit(zi,{level:Q,source:S,options:ue,build:{weapons:{..._},passives:{...O}}});},N=a=>{a.vars.choosing===true||!Ze(a)||(ae>0?(ae-=1,I(a,"level")):q>0&&(q-=1,I(a,"chest")));},U=(a,S)=>{S.kind==="weapon"?(_[S.id]=S.level,M[S.id]=0):S.kind==="passive"?O[S.id]=S.level:S.kind==="heal"?Y.hp=Math.min(Y.maxHp,Y.hp+Y.maxHp*.3):S.kind==="gold"&&qe(a,"coins",10),Pt(),a.vars.hp=Math.ceil(Y.hp),ye(a);},X=(a,S)=>{if(a.vars.choosing!==true)return;let L=ue[S];L&&(U(a,L),ue=[],a.vars.choosing=false,a.vars.survivors_offer="",a.emit(Wi,{kind:L.kind,id:L.id,level:L.level,source:fe}),N(a));},ye=a=>{let S=_e(),L=Le(),i=_.blades,h=i?vn.blades.count[i-1]:0,D=a.query(Xn);for(let P of D)a.need(P,Xn).index>=h&&a.destroy(P);for(let P=0;P<h;P++)D.some(z=>a.isAlive(z)&&a.need(z,Xn).index===P)||Et(a,S.x,S.y,{shape:"sprite",art:"blade",w:L*.075,h:L*.075,color:"primary",depth:31},{type:Xn,data:{index:P}});for(let P of a.query(Xn)){let z=a.need(P,f);z.shape==="sprite"&&(z.w=z.h=L*(i===5?.095:.075)*Math.sqrt(Y.area));}let R=_.aura,v=a.query(pr);if(R){let P=L*vn.aura.reach[R-1]*Y.area;v.length===0&&Et(a,S.x,S.y,{shape:"sprite",art:"aura_field",w:P*2,h:P*2,color:R===5?"coin":"secondary",alpha:.9,depth:1.5},{type:pr,data:{r:P}});for(let z of a.query(pr)){a.need(z,pr).r=P;let Z=a.need(z,f);Z.shape==="sprite"&&(Z.w=Z.h=P*2,Z.color=R===5?"coin":"secondary");}}else for(let P of v)a.destroy(P);let g=_.drone,T=g?vn.drone.count[g-1]:0,C=a.query(ur);for(let P of C)a.need(P,ur).index>=T&&a.destroy(P);for(let P=0;P<T;P++)C.some(z=>a.isAlive(z)&&a.need(z,ur).index===P)||Et(a,S.x,S.y,{shape:"sprite",art:"drone",w:L*.06,h:L*.06,color:"piece6",depth:33},{type:ur,data:{index:P,cd:.3*P}});},ke=(a,S,L,i,h)=>{let D=null,R=i;for(let v of a.query($e)){if(h&&h.includes(v))continue;let g=a.need(v,e),T=Math.hypot(g.x-S,g.y-L);T<R&&(R=T,D=v);}return D},Ue=(a,S,L,i,h,D,R,v,g=1)=>{let T=at()*g,C=o("shotSpeed")*Ye(),P=Et(a,S,L,{shape:"sprite",art:"shot",w:T*.95,h:T*.48,color:v,depth:30},{type:fr,data:{vx:Math.cos(i)*C,vy:Math.sin(i)*C,life:1.4,damage:h,pierce:D,hit:[],by:R}});a.need(P,e).rotation=i;},st=(a,S,L)=>{if(c===null)return;let i=_e(),h=Le(),D=at();for(let R of dr){let v=_[R];if(v===void 0)continue;let g=vn[R],T=v-1,C=g.damage[T]*Y.might;if(M[R]=(M[R]??0)-S,R==="blaster"&&M[R]<=0){let P=ke(a,i.x,i.y,h*.75);if(P===null){M[R]=0;continue}M[R]=g.cooldown[T]*Y.haste;let z=a.need(P,e),Z=Math.atan2(z.y-(i.y-D*.3),z.x-i.x),F=g.count[T];for(let le=0;le<F;le++)Ue(a,i.x,i.y-D*.3,Z+(le-(F-1)/2)*.16,C,g.pierce[T],"blaster",v===5?"piece6":"coin",v===5?1.25:1);He(a,c,"attack");let de=a.need(c,f);de.shape==="actor"&&(de.actRate=1/Math.max(.2,g.cooldown[T]*Y.haste),L||(de.facing=z.x>=i.x?1:-1));}else if(R==="blades"){let P=h*g.reach[T]*Y.area,z=3+.35*v;$+=z*S;let Z=a.query(Xn),F=Z.length||1;for(let de of Z){let le=a.need(de,Xn),he=$+le.index/F*Math.PI*2,pe=a.need(de,e);pe.x=i.x+Math.cos(he)*P,pe.y=i.y-D*.2+Math.sin(he)*P,pe.rotation=$*2.2;let We=h*.04*Math.sqrt(Y.area);for(let Je of a.query($e)){let dt=a.get(Je,$e);if(!dt)continue;let Dt=a.need(Je,e);Math.hypot(Dt.x-pe.x,Dt.y-pe.y)>We+dt.size*.55||a.time-(dt.hurtAt.blades??-9)<g.cooldown[T]||(dt.hurtAt.blades=a.time,f$1(a,Je,C,"blades"),m(a,Je,i.x,i.y,h*.012));}}}else if(R==="aura"){let P=a.query(pr)[0];if(P===void 0)continue;let z=a.need(P,e);if(z.x=i.x,z.y=i.y+D*.3,a.need(P,e).rotation=a.time*.6,M[R]>0)continue;M[R]=g.cooldown[T];let Z=a.need(P,pr).r;for(let F of a.query($e)){let de=a.need(F,e),le=a.get(F,$e);!le||Math.hypot(de.x-i.x,de.y-i.y)>Z+le.size*.3||(f$1(a,F,C,"aura"),m(a,F,i.x,i.y,h*.008));}}else if(R==="boomerang"&&M[R]<=0){let P=ke(a,i.x,i.y,h*.8);if(P===null){M[R]=0;continue}M[R]=g.cooldown[T]*Y.haste;let z=a.need(P,e),Z=Math.atan2(z.y-i.y,z.x-i.x),F=g.count[T];for(let de=0;de<F;de++){let le=Z+de*Math.PI*2/F,he=h*(v===5?.085:.065);Et(a,i.x,i.y,{shape:"sprite",art:"boomerang",w:he,h:he,color:"accent",depth:32},{type:Do,data:{dx:Math.cos(le),dy:Math.sin(le),dist:0,range:h*g.reach[T]*Y.area,back:false,damage:C,hit:[]}});}}else if(R==="lightning"&&M[R]<=0){let P=ke(a,i.x,i.y,h*.55);if(P===null){M[R]=0;continue}M[R]=g.cooldown[T]*Y.haste;let z=[],Z={x:i.x,y:i.y-D},F=P;for(let de=0;de<g.count[T]&&F!==null;de++){let le=a.get(F,$e);if(!le)break;let he=a.need(F,e),pe={x:he.x,y:he.y-le.size*.4};Pe(a,Z,pe,v===5?"coin":"primary"),z.push(F);let We=ke(a,he.x,he.y,h*g.reach[T]*Y.area,z);f$1(a,F,C,"lightning"),Z=pe,F=We;}}else if(R==="drone"){G+=1.8*S;let P=a.query(ur),z=P.length||1,Z=h*g.reach[T];for(let F of P){let de=a.need(F,ur),le=G+de.index/z*Math.PI*2,he=a.need(F,e);if(he.x=i.x+Math.cos(le)*Z,he.y=i.y-D*1.1+Math.sin(le)*Z*.5,de.cd-=S,de.cd>0)continue;let pe=ke(a,he.x,he.y,h*.6);if(pe===null){de.cd=0;continue}de.cd=g.cooldown[T]*Y.haste;let We=a.need(pe,e);Ue(a,he.x,he.y,Math.atan2(We.y-he.y,We.x-he.x),C,v===5?2:1,"drone","piece6",.7);}}}},Pe=(a,S,L,i)=>{let h=Math.hypot(L.x-S.x,L.y-S.y),D=Et(a,(S.x+L.x)/2,(S.y+L.y)/2,{shape:"sprite",art:"zap",w:Math.max(8,h),h:Le()*.035,color:i,depth:34},{type:Ao,data:{life:.16}});a.need(D,e).rotation=Math.atan2(L.y-S.y,L.x-S.x);},re=(a,S)=>{let L=_e(),i=at(),h=Le(),D=Ie(a),R=Math.hypot(D.w,D.h)*.75,v=a.query($e);for(let T of v){let C=a.get(T,$e);if(!C)continue;let P=a.need(T,e),z=L.x-P.x,Z=L.y-P.y,F=Math.hypot(z,Z)||1;z/=F,Z/=F;let de=C.kind==="boss"||C.kind==="miniboss";if(F>(de?R*1.3:R)){let Je=ze();P.x=Je.x,P.y=Je.y;continue}C.t-=S;let le=C.speed,he=z,pe=Z;if(C.kind==="archer"){let Je=h*.3;if(F<Je?le*=-0.6:F<Je*1.4&&(le=0),C.t<=0&&F<h*.6){C.t=2.4,He(a,T,"attack");let dt=260*Ye();Et(a,P.x,P.y-C.size*.6,{shape:"sprite",art:"orb",w:h*.03,h:h*.03,color:"danger",depth:29},{type:Nn,data:{vx:z*dt,vy:Z*dt,life:3,damage:C.damage}});}}else (C.kind==="charger"||C.kind==="miniboss"||C.kind==="boss")&&(C.phase==="walk"&&C.t<=0&&F<h*(de?.6:.38)?C.kind!=="boss"||C.next%3===0?(C.phase="wind",C.t=de?.7:.55,He(a,T,"surprised"),V(a,{kind:"ring",x:P.x,y:P.y,color:"danger",size:C.size*2.2})):H(a,T,C):C.phase==="wind"?(le=0,C.t<=0&&(C.phase="dash",C.t=de?.6:.45,C.vx=z,C.vy=Z)):C.phase==="dash"&&(le=C.speed*(de?4:3.6),he=C.vx,pe=C.vy,C.t<=0&&(C.phase="walk",C.t=de?C.hp<C.maxHp/2?1.6:2.4:2.8,C.kind==="boss"&&(C.next+=1))));P.x+=he*le*S,P.y+=pe*le*S;let We=a.need(T,f);if(We.shape==="actor"&&(Math.abs(L.x-P.x)>C.size*.4&&(We.facing=L.x>=P.x?1:-1),We.depth=Vt(a,P.y),We.speed=Math.abs(le),We.pose=le===0?"idle":C.kind==="brute"||de?"walk":"run"),F<(C.size+i)/2){if(C.kind==="bomber"){V(a,{kind:"ring",x:P.x,y:P.y,color:"piece6",size:h*.22}),p(a,C.damage),w(a,T,null,false);continue}if(ie<=0&&(He(a,T,"attack"),p(a,C.damage),Re||Ws(a)))return}}let g=a.query($e);for(let T=0;T<g.length;T++){let C=a.need(g[T],$e),P=a.need(g[T],e);for(let z=T+1;z<g.length;z++){let Z=a.need(g[z],$e),F=a.need(g[z],e),de=(C.size+Z.size)*.42,le=F.x-P.x,he=F.y-P.y,pe=le*le+he*he;if(pe>=de*de||pe===0)continue;let We=Math.sqrt(pe),Je=(de-We)*.5,dt=le/We*Je,Dt=he/We*Je,_n=C.kind==="boss"||C.kind==="miniboss",yn=Z.kind==="boss"||Z.kind==="miniboss";_n||(P.x-=dt,P.y-=Dt),yn||(F.x+=dt,F.y+=Dt);}}for(let T of a.query(Ur)){let C=a.need(T,Ur).of;if(!a.isAlive(C)||!a.has(C,$e)){a.destroy(T);continue}let P=a.need(C,e),z=a.need(T,e);z.x=P.x,z.y=P.y+a.need(C,$e).size*.55;let Z=a.need(T,f);Z.shape==="sprite"&&(Z.alpha=.6+.3*Math.sin(a.time*6));}},H=(a,S,L)=>{let i=a.need(S,e),h=Le(),D=L.next%3;if(L.next+=1,L.t=L.hp<L.maxHp/2?1.4:2.2,D===1){let R=L.hp<L.maxHp/2?18:12,v=220*Ye();for(let g=0;g<R;g++){let T=g/R*Math.PI*2+a.time;Et(a,i.x,i.y-L.size*.4,{shape:"sprite",art:"orb",w:h*.035,h:h*.035,color:"danger",depth:29},{type:Nn,data:{vx:Math.cos(T)*v,vy:Math.sin(T)*v,life:3.5,damage:L.damage*.6}});}He(a,S,"attack"),V(a,{kind:"ring",x:i.x,y:i.y,color:"danger",size:L.size*3});}else {for(let R=0;R<6;R++){let v=R/6*Math.PI*2;Fe("swarm",{x:i.x+Math.cos(v)*L.size*1.6,y:i.y+Math.sin(v)*L.size*1.6});}He(a,S,"cheer");}},J=(a,S)=>{let L=Ie(a),i=_e(),h=at(),D=Le()*.2;for(let v of a.query(fr)){let g=a.need(v,fr),T=a.need(v,e);if(T.x+=g.vx*S,T.y+=g.vy*S,g.life-=S,g.life<=0||T.x<-D||T.y<-D||T.x>L.w+D||T.y>L.h+D){a.destroy(v);continue}for(let C of a.query($e)){if(g.hit.includes(C))continue;let P=a.get(C,$e);if(!P)continue;let z=a.need(C,e);if(!(Math.abs(z.x-T.x)>P.size/2+4||Math.abs(z.y-(T.y+P.size*.2))>P.size*.9+4)&&(g.hit.push(C),V(a,{kind:"burst",x:T.x,y:T.y,color:"coin",n:4,size:h*.5}),m(a,C,i.x,i.y,Le()*.01),f$1(a,C,g.damage,g.by),g.hit.length>=g.pierce)){a.destroy(v);break}}}for(let v of a.query(Nn)){let g=a.need(v,Nn),T=a.need(v,e);if(T.x+=g.vx*S,T.y+=g.vy*S,g.life-=S,g.life<=0){a.destroy(v);continue}if(Math.hypot(T.x-i.x,T.y-(i.y-h*.3))<h*.55&&(a.destroy(v),p(a,g.damage),Re||Ws(a)))return}let R=Le()*1.5;for(let v of a.query(Do)){let g=a.need(v,Do),T=a.need(v,e);if(T.rotation=(T.rotation??0)+S*14,g.back){let P=i.x-T.x,z=i.y-T.y,Z=Math.hypot(P,z)||1;if(Z<h*.5){a.destroy(v);continue}T.x+=P/Z*R*S,T.y+=z/Z*R*S;}else {let P=R*S*Math.max(.35,1-g.dist/g.range);T.x+=g.dx*P,T.y+=g.dy*P,g.dist+=P,g.dist>=g.range*.98&&(g.back=true,g.hit=[]);}let C=a.need(v,f).w*.5;for(let P of a.query($e)){if(g.hit.includes(P))continue;let z=a.get(P,$e);if(!z)continue;let Z=a.need(P,e);Math.hypot(Z.x-T.x,Z.y-T.y)>C+z.size*.5||(g.hit.push(P),m(a,P,T.x,T.y,Le()*.015),f$1(a,P,g.damage,"boomerang"));}}for(let v of a.query(Ao)){let g=a.need(v,Ao);g.life-=S;let T=a.need(v,f);T.shape==="sprite"&&(T.alpha=Math.max(0,g.life/.16)),g.life<=0&&a.destroy(v);}},j$1=(a,S)=>{let L=_e(),i=at(),D=a.query(Xt).filter(R=>a.need(R,Xt).kind==="xp");if(D.length>90){let R=D.map(P=>({e:P,d:Math.hypot(a.need(P,e).x-L.x,a.need(P,e).y-L.y)})).sort((P,z)=>z.d-P.d).slice(0,30),v=0,g=a.need(R[0].e,e),T=g.x,C=g.y;for(let P of R)v+=a.need(P.e,Xt).value,a.destroy(P.e);pt("xp",T,C,Math.max(25,v));}for(let R of a.query(Xt)){let v=a.need(R,Xt),g=a.need(R,e),T=Math.hypot(L.x-g.x,L.y-g.y);if(T<Y.magnet||v.pulled){v.pulled=true;let C=Le()*(v.kind==="xp"&&T>Y.magnet?2.4:1.4),P=Math.min(1,S*C/Math.max(1,T));g.x+=(L.x-g.x)*P,g.y+=(L.y-g.y)*P;}if(!(T>i*.6))if(a.destroy(R),v.kind==="coin")qe(a,"coins",v.value),a.emit("coin-collected",{value:v.value}),V(a,{kind:"pop",x:L.x,y:L.y-i*1.6,text:`+${v.value}`,size:Math.round(i*.45)});else if(v.kind==="xp"){for(B+=v.value*Y.growth;B>=Ge(Q);)B-=Ge(Q),Q+=1,ae+=1;a.vars.xp_level=Q;}else if(v.kind==="food")Y.hp=Math.min(Y.maxHp,Y.hp+Y.maxHp*.25),a.vars.hp=Math.ceil(Y.hp),V(a,{kind:"ring",x:L.x,y:L.y,color:"accent",size:i*3});else if(v.kind==="magnet"){for(let C of a.query(Xt))(a.need(C,Xt).kind==="xp"||a.need(C,Xt).kind==="coin")&&(a.need(C,Xt).pulled=true);V(a,{kind:"ring",x:L.x,y:L.y,color:"coin",size:Le()*1.2});}else if(v.kind==="bomb"){let C=Ie(a);V(a,{kind:"flash",color:"#ffffff"}),V(a,{kind:"shake",power:2});for(let P of a.query($e)){let z=a.need(P,e);if(z.x<0||z.y<0||z.x>C.w||z.y>C.h)continue;let Z=a.get(P,$e);Z&&f$1(a,P,Z.kind==="boss"||Z.kind==="miniboss"?Z.maxHp*.1:Z.hp+1,"bomb");}}else v.kind==="chest"&&(q+=1,V(a,{kind:"burst",x:L.x,y:L.y,color:"coin",n:20,size:i*2}));}N(a);},k$1=()=>{for(let S of [$e,fr,Nn,Xt,Xn,pr,ur,Do,Ao,Ur,Yn])rt(e$1,S);rt(e$1,Er),it(),Tt(e$1,"top",void 0,{pan:true}),e$1.vars.field_x=0,e$1.vars.field_y=0,d=null,x=0,ce=Kr(In(e$1,"meta:chapter")||1,o("duration")),oe=ce.duration;let a=Xe();_={[a.weapon]:1},O=a.passive?{[a.passive]:1}:{};for(let S of dr)M[S]=.4;B=0,Q=1,ae=0,q=0,ue=[],ie=0,ve=0,se=0,Me=false,Re=false,De=0,ge=0,Ae=false,Se=null,ee=o("minibossEvery")>0?o("minibossEvery"):1/0,xe=o("eliteEvery")>0?o("eliteEvery")*.8:1/0,je=22,we=0,te=null,me=0,Y.maxHp=0,Y.hp=0,Pt(),Y.hp=Y.maxHp,e$1.vars.hp=Math.ceil(Y.hp),e$1.vars.hp_max=Y.maxHp,e$1.vars.time_left=oe,e$1.vars.xp_level=1,e$1.vars.kills=0,e$1.vars.bosses=0,e$1.vars.chapter=ce.chapter,e$1.vars.choosing=false,e$1.vars.reviving=false,e$1.vars.boss_hp=0,e$1.vars.survivors_offer="",tt(),ye(e$1);};e$1.on(j,a=>{let S=a,L=e$1.vars.choosing===true||e$1.vars.reviving===true;S.type==="press"&&Ze(e$1)&&!L?d={x:S.x,y:S.y}:S.type==="release"&&(d=null),S.type==="key"&&e$1.vars.choosing===true&&(S.key==="left"||S.key==="action"||S.key==="right")&&X(e$1,S.key==="left"?0:S.key==="action"?1:2);}),e$1.on(Hi,a=>X(e$1,Number(a.index??-1))),e$1.on(Vi,()=>{e$1.vars.choosing===true&&(e$1.vars.choosing=false,I(e$1,fe));}),e$1.on(Kt,()=>l(e$1)),e$1.on(Ft,()=>{e$1.vars.reviving===true&&(e$1.vars.reviving=false,u(e$1,"died"));}),e$1.on($t,k$1),e$1.on(Wt,k$1),e$1.on(zt,a=>{for(let S of e$1.query($e))et(e$1,S,"idle");c!==null&&e$1.isAlive(c)&&et(e$1,c,a.reason==="cleared"?"dance":"die"),it(),rt(e$1,Yn);}),e$1.on(k,()=>{Tt(e$1,"top",void 0,{pan:true}),tt(),Ze(e$1)&&ye(e$1);});let E=(a,S)=>{let L=d!==null&&r.pointer.down&&a.vars.choosing!==true,i=a.query(Yn);if(!L||d===null){for(let g of i)a.destroy(g);return}i.length===0&&(Et(a,d.x,d.y,{shape:"circle",r:S,color:"#ffffff",alpha:.16,depth:70},{type:Yn,data:{part:0}}),Et(a,d.x,d.y,{shape:"circle",r:S*.42,color:"#ffffff",alpha:.55,depth:71},{type:Yn,data:{part:1}}));let h=r.pointer.x-d.x,D=r.pointer.y-d.y,R=Math.hypot(h,D)||1,v=Math.min(1,S/R);for(let g of a.query(Yn)){let T=a.need(g,e);a.need(g,Yn).part===0?(T.x=d.x,T.y=d.y):(T.x=d.x+h*v,T.y=d.y+D*v);}};e$1.addSystem({id:"survivors",order:0,run(a,S){if(!Ze(a)||c===null||Re)return;let L=a.vars.choosing===true||a.vars.reviving===true;for(let Z of [c,...a.query($e)]){let F=a.get(Z,f);F?.shape==="actor"&&(F.paused=L);}if(L)return;Ee=Math.min(12,Ee+S*10);let i=Ie(a);if(ge+=S,!Ae){let Z=Math.max(0,oe-ge);a.vars.time_left=Z,Z<=0&&tn(a);}ie>0&&(ie=Math.max(0,ie-S)),Y.regen>0&&Y.hp<Y.maxHp&&(Y.hp=Math.min(Y.maxHp,Y.hp+Y.regen*S),a.vars.hp=Math.ceil(Y.hp)),a.vars.hp_max=Y.maxHp;let h=_e(),D=Le()*.11,R=r.axis(),v=R.x,g=R.y,T=v!==0||g!==0?1:0;if(T===0&&d&&r.pointer.down){v=r.pointer.x-d.x,g=r.pointer.y-d.y;let Z=Math.hypot(v,g);T=Z<D*.18?0:Math.min(1,Z/D);}E(a,D);let C=Math.hypot(v,g),P=C>0&&T>0;if(P){let Z=v/C*Y.speed*T*S,F=g/C*Y.speed*T*S;for(let de of [...a.query($e),...a.query(fr),...a.query(Nn),...a.query(Xt),...a.query(Er),...a.query(Do),...a.query(Ao)]){let le=a.need(de,e);le.x-=Z,le.y-=F;}ql(a,Z,F),qe(a,"field_x",Z),qe(a,"field_y",F),x+=S,x>.6&&vt(a,"survivors-move");}!ht(a,"survivors-move")&&!un(a)&&ft(a,"circle",{x:i.w/2,y:i.h*.8},{x:D*.6,y:0});let z=a.need(c,f);z.alpha=ie>0&&Math.floor(a.time*12)%2===0?.4:1,z.shape==="actor"&&(z.pose=P?"run":"idle",z.speed=Y.speed*Math.max(.3,T),P&&Math.abs(v)>C*.15&&(z.facing=v>0?1:-1),z.depth=Vt(a,h.y)+5e-4),It(a,S),re(a,S),!(Re||Ws(a))&&(st(a,S,P),J(a,S),!(Re||Ws(a))&&(j$1(a,S),!Re&&(a.vars.score=ve*o("killScore")+Math.floor(ge)*5+se*o("bossScore"),Ke(a))));}}),e$1.vars.survivors_base=o("duration"),k$1();}};var Ks=[{id:"archer",base:{damage:6,type:"physical",range:2.6,rate:1.2,air:true,ground:true,shot:"td_arrow",shotSpeed:13},tiers:[{cost:70,stats:{},art:"td_archer1"},{cost:100,stats:{damage:9,range:2.8,rate:1.35},art:"td_archer2"},{cost:150,stats:{damage:14,range:3,rate:1.5},art:"td_archer3"}],branches:[{id:"ranger",cost:240,stats:{damage:17,rate:2.5,multishot:2,range:3.1},art:"td_archer_ranger"},{id:"sniper",cost:260,stats:{damage:72,rate:.5,range:4.6,pierce:1,crit:.2,shotSpeed:22},art:"td_archer_sniper"}],unlockLevel:1,metaVar:"meta:tower:archer"},{id:"cannon",base:{damage:12,type:"physical",range:2.3,rate:.5,air:false,ground:true,shot:"bomb",shotSpeed:6,lob:true,splash:.9},tiers:[{cost:110,stats:{},art:"td_cannon1"},{cost:150,stats:{damage:22,splash:1},art:"td_cannon2"},{cost:210,stats:{damage:36,splash:1.1,range:2.5},art:"td_cannon3"}],branches:[{id:"bombard",cost:300,stats:{damage:72,splash:1.5,rate:.42,range:2.8,stun:.25,stunTime:.6},art:"td_cannon_bombard"},{id:"flamer",cost:280,stats:{damage:20,splash:1,rate:.9,burn:12,burnTime:3},art:"td_cannon_flamer"}],unlockLevel:1,metaVar:"meta:tower:cannon"},{id:"mage",base:{damage:14,type:"magic",range:2.4,rate:.7,air:true,ground:true,shot:"orb",shotSpeed:9},tiers:[{cost:100,stats:{},art:"td_mage1"},{cost:140,stats:{damage:26},art:"td_mage2"},{cost:200,stats:{damage:42,range:2.6},art:"td_mage3"}],branches:[{id:"arcane",cost:300,stats:{damage:110,type:"true",rate:.55,range:2.9},art:"td_mage_arcane"},{id:"storm",cost:280,stats:{damage:32,rate:.9,chain:4,beam:true,shot:"zap"},art:"td_mage_storm"}],unlockLevel:3,metaVar:"meta:tower:mage"},{id:"frost",base:{damage:3,type:"magic",range:2.2,rate:.8,air:true,ground:true,shot:"crystal",shotSpeed:10,splash:.5,slow:.35,slowTime:1.6},tiers:[{cost:90,stats:{},art:"td_frost1"},{cost:120,stats:{damage:5,slow:.45,slowTime:1.9},art:"td_frost2"},{cost:170,stats:{damage:8,slow:.5,slowTime:2.2,splash:.7,range:2.4},art:"td_frost3"}],branches:[{id:"glacier",cost:260,stats:{damage:14,slow:.6,slowTime:2.6,stun:.15,stunTime:1},art:"td_frost_glacier"},{id:"blizzard",cost:260,stats:{damage:10,splash:1.4,slow:.5,slowTime:2.4,range:2.7},art:"td_frost_blizzard"}],unlockLevel:5,metaVar:"meta:tower:frost"}],Ui=6,Lo=.7,kn=e=>Ks.find(t=>t.id===e);function wo(e,t,n){let s=e.base;for(let o=1;o<Math.min(t,e.tiers.length);o++)s={...s,...e.tiers[o].stats};let r=n?e.branches.find(o=>o.id===n):void 0;return r?{...s,...r.stats}:s}function Po(e,t,n){let s=0;for(let o=0;o<Math.min(t,e.tiers.length);o++)s+=e.tiers[o].cost;let r=n?e.branches.find(o=>o.id===n):void 0;return s+(r?.cost??0)}var Fs=(e,t,n)=>(n?e.branches.find(s=>s.id===n)?.art:void 0)??e.tiers[Math.min(t,e.tiers.length)-1].art,hr=[{id:"grunt",cast:"foe",hp:1,speed:1,armor:0,resist:0,bounty:6,leak:1,size:.82,hit:.25,firstLevel:1,cost:1},{id:"runner",cast:"foe5",hp:.55,speed:1.8,armor:0,resist:0,bounty:4,leak:1,size:.72,hit:.15,firstLevel:2,cost:.7},{id:"brute",cast:"foe2",hp:2.6,speed:.7,armor:.6,resist:0,bounty:14,leak:2,size:1,hit:.5,firstLevel:3,cost:2.4,badge:"shield"},{id:"flyer",cast:"foe3",hp:.8,speed:1.2,armor:0,resist:0,flying:true,bounty:8,leak:1,size:.75,hit:0,firstLevel:4,cost:1.3,badge:"wing"},{id:"shaman",cast:"foe4",hp:1.6,speed:.9,armor:0,resist:.7,bounty:12,leak:1,size:.86,hit:.3,firstLevel:6,cost:2,badge:"orb"},{id:"healer",cast:"foe4",variant:7,hp:1.3,speed:.9,armor:.2,resist:.2,bounty:14,leak:1,size:.86,hit:.2,heals:{radius:1.6,share:.08,every:2},firstLevel:8,cost:2.2,badge:"potion"},{id:"splitter",cast:"foe2",variant:5,hp:2,speed:.85,armor:.2,resist:0,bounty:10,leak:2,size:.95,hit:.4,splits:{into:"spawnling",count:3},firstLevel:11,cost:2.6,badge:"skull"},{id:"spawnling",cast:"foe5",variant:3,hp:.35,speed:1.6,armor:0,resist:0,bounty:2,leak:1,size:.55,hit:.1,firstLevel:0,cost:.4},{id:"warlord",cast:"boss",hp:30,speed:.55,armor:.2,resist:0,bounty:120,leak:10,size:1.5,hit:2,summons:{id:"grunt",count:3,every:6},boss:1,firstLevel:0,cost:0},{id:"ironclad",cast:"boss",variant:4,hp:50,speed:.5,armor:.65,resist:0,bounty:160,leak:10,size:1.6,hit:2.5,enrage:{below:.5,speed:1.7},boss:2,firstLevel:0,cost:0,badge:"shield"},{id:"broodmother",cast:"boss",variant:9,hp:62,speed:.5,armor:.2,resist:.3,bounty:200,leak:10,size:1.6,hit:2.5,summons:{id:"spawnling",count:4,every:5},splits:{into:"spawnling",count:8},boss:3,firstLevel:0,cost:0,badge:"skull"},{id:"lich",cast:"boss",variant:13,hp:80,speed:.48,armor:.3,resist:.5,bounty:260,leak:15,size:1.7,hit:3,heals:{radius:2.2,share:.05,every:3},summons:{id:"shaman",count:2,every:7},boss:4,firstLevel:0,cost:0,badge:"orb"}],en=e=>hr.find(t=>t.id===e),qr=[{id:"meteor",icon:"td_meteor",kind:"strike",cooldown:35,unlockLevel:2,damage:2.2,count:3,radius:1.1,burn:.3},{id:"reinforce",icon:"shield",kind:"summon",cooldown:22,unlockLevel:4,count:2,cast:"helper",hp:4,dps:.6,time:14}],Sn=9,En=13,qi=[{id:"meadow-a",rows:["..S......",".o#o..t..","..#......","..#####o.",".o....#..","..t...#o.",".o#####..","..#..o..t","..#.*....","o.####o..","....o#...",".t...#.o.",".....X..."]},{id:"meadow-b",rows:["......S..",".t..o.#o.","......#..",".o#####..","..#..o...","..#.t..o.","..####...",".o..o#.t.","..*..#...","..####o..",".o#......","..#.o..t.","..X......"]},{id:"meadow-c",rows:[".S.......",".#.o..o..",".#.....#X",".#o.t.o#.",".#.....#.",".#o.o..#.",".#..r..#.",".#.o.o.#o",".#.....#.",".#o.*.o#.",".#######.","..o.o.o..","t.......t"]},{id:"meadow-boss",rows:["....S....","..o.#.o..","....#....",".####.o..",".#..o....",".#.o..t..",".#######.","..o.o..#.",".o.....#o","..######.","..#.o.o..",".o#......","..X......"]},{id:"river-a",rows:[".........","S####.o..",".o..#....","..o.#.~~.","....####.",".o.r...#.","...o...#o",".#######.",".#.o.o...",".#....r..",".####.o..","..o.#....","....X...."]},{id:"river-b",rows:[".S.....S.",".#.o.o.#.",".#..t..#.",".###.###.",".o.#o#.o.","...#.#...","..o###o..","....#....",".o..#.o..","...o#....","..r.#.o..",".o..#..t.","....X...."]},{id:"river-c",rows:["..~~.....","o...####S","..o.#..o.","....#.~~.",".####.~~.",".#..o....",".#.o..r..",".######o.","..o...#..",".~~.o.#..","X######o.","..o.o....","..~~...t."]},{id:"river-boss",rows:[".o.....o.","S##.o.##S","..#.r.#..",".o#####o.","....#....",".o..#.o..",".####..t.",".#..o..o.",".#.o.....",".#######.","..o.o..#.",".o.....#o",".......X."]},{id:"wood-a",rows:["..o...o..","S#######.",".o.....#.","...o.o.#o",".#####.#.",".#.o.#.#.",".#.X.#.#.",".#.###.#.",".#..o..#.",".#######.","..o.o.o..",".t..r..o.","........."]},{id:"wood-b",rows:["...S.....",".o.#..o..","...#.t...",".o.####o.","......#..",".o.o..#o.","......##X",".o.o..#o.","......#..",".o.####o.","...#.r...",".o.#..o..","...S....."]},{id:"wood-c",rows:[".o..o..o.",".#######S",".#.o..o..",".#######.","..o.o..#.",".#######.",".#..o..o.",".#######.","..o..o.#.",".#######.",".#.o..o..",".#..r..t.",".X......."]},{id:"wood-boss",rows:["....X....",".o..#..o.","..o.#....",".####.o..",".#..o..t.",".#.o..o..",".#######.","..o..o.#.",".o.....#.","..######.","..#.o..o.",".o#..r...","..S......"]},{id:"ash-a",rows:["....S....",".o..#..o.","S##.#.##S","..#.#.#..",".o#o#o#o.","..#####..",".o..#..o.","...o#o...",".t..#..t.",".o..#..o.","..r.#.r..",".o..#..o.","....X...."]},{id:"ash-b",rows:[".S.....S.",".#.o.o.#.",".#..o..#.",".###.###.","...#o#...",".o.#.#.o.","...#o#...",".###.###.",".#.o.o.#.",".#.....#.",".#######.","..o.#.o..","....X...."]},{id:"ash-c",rows:[".S.....X.",".#.###.#.",".#o#o#o#.",".#.#.#.#.",".#o#.#o#.",".#.#o#.#.","o#.#.#.#o",".#o#.#o#.",".#.#o#.#.",".#.#.#.#.",".#o#.#o#.",".###.###.","........."]},{id:"ash-boss",rows:[".o.....o.","S#.o.o.#S",".#.....#.",".#o.r.o#.",".#.....#.",".#o.X.o#.",".#..#..#.",".#o.#.o#.",".#..#..#.",".#.o#o.#.",".#######.","..o.o.o..",".t.....t."]}],Us=e=>qi.find(t=>t.id===e);function jr(e,t){return t==="x"?e.rows.map(n=>[...n].reverse().join("")):t==="y"?[...e.rows].reverse():e.rows}var $p=e=>e==="#"||e==="S"||e==="X";function Xr(e){let t=(O,M)=>e[M]?.[O],n=null,s=[],r=[];for(let O=0;O<e.length;O++)for(let M=0;M<e[O].length;M++){let $=t(M,O);$==="X"?n={col:M,row:O}:$==="S"?s.push({col:M,row:O}):$==="o"&&r.push({col:M,row:O});}if(!n)throw new Error("tower-defense map: no gate (X)");if(s.length===0)throw new Error("tower-defense map: no entry (S)");let o=new Map,c=(O,M)=>`${O},${M}`,d=[n];o.set(c(n.col,n.row),0);let x=[[0,1],[-1,0],[1,0],[0,-1]];for(;d.length>0;){let O=d.shift(),M=o.get(c(O.col,O.row));for(let[$,G]of x){let B=O.col+$,Q=O.row+G;!$p(t(B,Q))||o.has(c(B,Q))||(o.set(c(B,Q),M+1),d.push({col:B,row:Q}));}}let _=s.map(O=>{if(!o.has(c(O.col,O.row)))throw new Error(`tower-defense map: the entry ${O.col},${O.row} has no road to the gate`);let M=[O],$=O;for(;$.col!==n.col||$.row!==n.row;){let G=o.get(c($.col,$.row)),B=x.map(([Q,ae])=>({col:$.col+Q,row:$.row+ae})).find(Q=>o.get(c(Q.col,Q.row))===G-1);M.push(B),$=B;}return M});return {rows:e,paths:_,gate:n,spots:r}}var ji=4,xn=5,Co=ji*xn,Xi=[0,9,24,39],Yi=[{map:"meadow-a",mirror:"none"},{map:"meadow-b",mirror:"none"},{map:"meadow-c",mirror:"none"},{map:"meadow-a",mirror:"x"},{map:"meadow-boss",mirror:"none"},{map:"river-a",mirror:"none"},{map:"river-b",mirror:"none"},{map:"river-c",mirror:"none"},{map:"river-a",mirror:"x"},{map:"river-boss",mirror:"none"},{map:"wood-a",mirror:"none"},{map:"wood-b",mirror:"none"},{map:"wood-c",mirror:"none"},{map:"wood-b",mirror:"x"},{map:"wood-boss",mirror:"none"},{map:"ash-a",mirror:"none"},{map:"ash-b",mirror:"none"},{map:"ash-c",mirror:"none"},{map:"ash-a",mirror:"y"},{map:"ash-boss",mirror:"none"}];function Bp(e){let t=e>>>0;return ()=>{t=t+1831565813>>>0;let n=t;return n=Math.imul(n^n>>>15,n|1),n^=n+Math.imul(n^n>>>7,n|61),((n^n>>>14)>>>0)/4294967296}}var Uc=hr.filter(e=>e.firstLevel>0).map(e=>e.id);function qc(e,t){let n=hr.filter(r=>r.firstLevel>0&&r.firstLevel<=e);if(!t)return n;let s=n.filter(r=>t.includes(r.id));return s.length>0?s:n}function jc(e,t){let n=hr.find(s=>s.firstLevel===e);return n&&(!t||t.includes(n.id))?n:void 0}function Ji(e,t,n){let s=Math.max(1,Math.min(Co,Math.floor(e))),r=Bp(s*7919+13),o=qc(s,n),c=jc(s,n),d=Math.ceil(s/xn),x=s%xn===0?hr.find(M=>M.boss===d):void 0,_=6+Math.floor((s-1)/2),O=[];for(let M=1;M<=_;M++){let $=5+M*1.6+s*.35,G=[],B=0,Q=0,ae=[];if(M===1)ae.push(o[0]);else {c&&M===2&&ae.push(c);let ue=Math.min(4,1+Math.floor(M/3));for(;ae.length<ue;)ae.push(o[Math.floor(r()*o.length)]);}let q=$/ae.length;for(let ue of ae){let fe=Math.max(1,Math.round(q/ue.cost)),ie=ue.speed>=1.5?.55:ue.hp>=2?1.3:.85;G.push({enemy:ue.id,count:fe,gap:ie,delay:B,entry:Q%Math.max(1,t)}),B+=fe*ie*.55+1,Q++;}x&&M===_&&G.push({enemy:x.id,count:1,gap:1,delay:B+2,entry:0}),O.push({groups:G});}return O}function Yr(e,t=.5,n){let s=Math.max(1,Math.min(Co,Math.floor(e))),r=Math.ceil(s/xn),o=s-(r-1)*xn,c=Yi[s-1],d=Xr(jr(Us(c.map),c.mirror)).paths.length;return {level:s,world:r,index:o,boss:o===xn,map:c.map,mirror:c.mirror,hp:16*Math.pow(1.075,s-1)*(.8+t*.4),waves:Ji(s,d,n),gold:220+(s-1)*25,bounty:1+(s-1)*.03,towers:Ks.filter(x=>x.unlockLevel<=s).map(x=>x.id),spells:qr.filter(x=>x.unlockLevel<=s).map(x=>x.id),branches:s>=Ui,fresh:jc(s,n)?.id??null,enemies:qc(s,n).map(x=>x.id),firstClearGold:(o===xn?150:60)+(s-1)*20}}var Zi=e=>Xi[Math.ceil(Math.max(1,e)/xn)-1]??0,qs=(e,t)=>e>=t*.9?3:e>=t*.5?2:1,js=5,Xc=20,Jr=[{id:"hero",cast:"hero",gems:0,perk:"none"},{id:"hero2",cast:"hero2",gems:150,perk:"gold"},{id:"hero3",cast:"hero3",gems:300,perk:"spells"}],Qi="kit-td",el=[{id:"StartGold",var:"meta:start_gold",art:"td_gold",color:"coin",perLevel:20,unit:"",maxLevel:10,price:40,growth:.12},{id:"Lives",var:"meta:lives",art:"heart",color:"danger",perLevel:1,unit:"",maxLevel:5,price:120,growth:.2},{id:"Archer",var:"meta:tower:archer",art:"td_archer1",color:"primary",perLevel:6,unit:"%",maxLevel:10,price:40,growth:.12},{id:"Cannon",var:"meta:tower:cannon",art:"td_cannon1",color:"primary",perLevel:6,unit:"%",maxLevel:10,price:40,growth:.12},{id:"Mage",var:"meta:tower:mage",art:"td_mage1",color:"primary",perLevel:6,unit:"%",maxLevel:10,price:45,growth:.12},{id:"Frost",var:"meta:tower:frost",art:"td_frost1",color:"primary",perLevel:6,unit:"%",maxLevel:10,price:45,growth:.12},{id:"Spells",var:"meta:spells",art:"td_meteor",color:"danger",perLevel:8,unit:"%",maxLevel:10,price:50,growth:.12}],Yc={game:"tower-defense",character:Qi,stats:el,heroes:Jr,levels:Co,firstClearGold:e=>Yr(e).firstClearGold,stars:3,starsToEnter:Zi};var zp="boss-spawned",Wp="boss-defeated",nl="wave-started",Js=b("td.spot"),sn=b("td.tower"),Te=b("td.raider"),mr=b("td.missile"),hn=b("td.soldier"),Xs=b("td.meteor"),Jc=b("td.ground"),tl=b("td.part"),Zc=b("td.bar"),Ys=b("td.zap"),Io=(e,t)=>{let n=Number(e.vars[t]??0);return Number.isFinite(n)?n:0},Hp=.5,Vp=.55,Zs={id:"tower-defense",version:2,engines:["phaser"],requires:["round"],params:{difficulty:{type:"number",default:.5,min:0,max:1},lives:{type:"number",default:20,min:1,max:100,integer:true},gold:{type:"number",default:0,min:0,max:1e5,integer:true},wavePause:{type:"number",default:14,min:2,max:60},firstWait:{type:"number",default:25,min:1,max:600},earlyGold:{type:"number",default:2,min:0,max:100},coinRate:{type:"number",default:.15,min:0,max:1}},setup({world:e$1,params:t,mode:n}){let s=i=>nn(t,i),r=e$1.rng.stream("tower-defense"),o=pn(n,"foes",Uc),c=Yr(1,s("difficulty"),o),d=Xr(jr(Us(c.map),c.mirror)),x=[],_=we(),O=0,M=20,$=20,G=0,B=[],Q=0,ae=null,q=0,ue=0,fe=0,ie=false,ve=false,se=1,Me=null,De=[],ge=null,oe=new Map,ce=[],Ae=null,Se=new Map,ee=new Map,xe=()=>Jr.find(i=>i.id===e$1.vars["meta:hero"])??Jr[0],je=()=>e$1.vars.reviving===true;function we(){return Fn(Ie(e$1),Sn,En,{top:.15,bottom:.86,widthShare:.98})}let te=()=>_.cell,me=i=>_.left+i*_.cell,Ee=i=>_.top+i*_.cell,Re=i=>({x:me(i.col+.5),y:Ee(i.row+.5)}),Ce=(i,h)=>({x:(i-_.left)/_.cell,y:(h-_.top)/_.cell}),Y=i=>i.row===0?{x:i.col+.5,y:-0.5}:i.row===En-1?{x:i.col+.5,y:En+.5}:i.col===0?{x:-0.5,y:i.row+.5}:i.col===Sn-1?{x:Sn+.5,y:i.row+.5}:null,Le=()=>{x=d.paths.map(i=>{let h=i.map(R=>({x:R.col+.5,y:R.row+.5})),D=Y(i[0]);return D&&h.unshift(D),{pts:h,len:h.length-1}});},Ye=(i,h)=>{if(h<=0)return i.pts[0];if(h>=i.len)return i.pts[i.len];let D=Math.floor(h),R=i.pts[D],v=i.pts[D+1],g=h-D;return {x:R.x+(v.x-R.x)*g,y:R.y+(v.y-R.y)*g}},at=new Set,_e=(i,h,D,R,v=1)=>{at.add(i);let g=Se.get(i);(g===void 0||!e$1.isAlive(g))&&(g=e$1.create(),e$1.set(g,tl,{id:i}),Se.set(i,g)),e$1.set(g,e,{x:h,y:D,scale:v}),e$1.set(g,f,R);},Pt=i=>{for(let[h,D]of [...Se])at.has(h)||!i.some(R=>h.startsWith(R))||(e$1.destroy(D),Se.delete(h));},Ge=i=>{for(let[h,D]of [...Se])h.startsWith(i)&&(e$1.destroy(D),Se.delete(h));},Xe=(i,h,D,R)=>{let v=e$1.create();return e$1.set(v,Jc,{kind:i}),e$1.set(v,e,{x:h,y:D}),e$1.set(v,f,R),v},tt=()=>{rt(e$1,Jc),rt(e$1,Js);let i=te();Xe("grass",me(Sn/2),Ee(En/2),{shape:"tile",art:"tile_grass",w:i*Sn,h:i*En,unit:i,color:"ground",depth:-10}),d.rows.forEach((T,C)=>[...T].forEach((P,z)=>{let Z=Re({col:z,row:C}),F=Z.y+i*.45;P==="#"||P==="S"||P==="X"?Xe("road",Z.x,Z.y,{shape:"sprite",art:"tile_road",w:i+1,h:i+1,color:"lane",depth:-9}):P==="~"?Xe("water",Z.x,Z.y,{shape:"rect",w:i+1,h:i+1,color:"primary",alpha:.45,depth:-9}):P==="t"?Xe("tree",Z.x,F-i*.65,{shape:"sprite",art:"td_tree",w:i*1.05,h:i*1.3,depth:Vt(e$1,F,5)}):P==="r"?Xe("rock",Z.x,F-i*.3,{shape:"sprite",art:"rock",w:i*.8,h:i*.6,depth:Vt(e$1,F,5)}):P==="*"&&Xe("bush",Z.x,F-i*.3,{shape:"sprite",art:"td_bush",w:i*.85,h:i*.6,depth:Vt(e$1,F,5)});})),d.spots.forEach((T,C)=>{let P=Re(T),z=Xe("spot",P.x,P.y+i*.18,{shape:"sprite",art:"td_spot",w:i*.95,h:i*.62,depth:-8});e$1.set(z,Js,{index:C,col:T.col,row:T.row});});let h=Re(d.gate),D=Y(d.gate),R=D&&D.y>=0?D:null,v=R?me(d.gate.col+.5+(R.x-(d.gate.col+.5))*.35):h.x,g=R?Ee(d.gate.row+.5+(R.y-(d.gate.row+.5))*.35):h.y;Xe("gate",v,g-i*.2,{shape:"sprite",art:"td_gate",w:i*1.35,h:i*1.35,depth:Vt(e$1,g+i*.45,5)});for(let T of d.paths){if(Y(T[0]))continue;let C=Re(T[0]);Xe("portal",C.x,C.y-i*.1,{shape:"sprite",art:"td_portal",w:i*1.05,h:i*.95,depth:Vt(e$1,C.y,4)});}},ot=i=>e$1.query(sn).find(h=>e$1.need(h,sn).spot===i),ct=i=>{let h=e$1.need(i,sn),D=kn(h.kind),R=Re(d.spots[h.spot]),v=te(),g=v*1.45,T=R.y+v*.42;e$1.set(i,e,{x:R.x,y:T-g/2}),e$1.set(i,f,{shape:"sprite",art:Fs(D,h.tier,h.branch||null),w:v*1.1,h:g,depth:Vt(e$1,T,5)});},it=i=>{O=Math.max(0,Math.round(i)),e$1.vars.gold=O;},bt=(i,h)=>{let D=Re(d.spots[i]);V(e$1,{kind:"ring",x:D.x,y:D.y,color:h,size:te()*1.5}),V(e$1,{kind:"burst",x:D.x,y:D.y-te()*.4,color:h,n:10,size:te()});},Ke=(i,h)=>{let D=kn(h);if(!D||ot(i)!==void 0)return false;let R=D.tiers[0].cost;if(O<R)return false;it(O-R);let v=e$1.create();return e$1.set(v,sn,{spot:i,kind:h,tier:1,branch:"",cooldown:.2}),ct(v),bt(i,"text"),e$1.emit("tower-built",{kind:h}),ht(e$1,"td-build")||(vt(e$1,"td-build"),J()),true},ze=(i,h)=>{let D=ot(i);if(D===void 0)return false;let R=e$1.need(D,sn),v=kn(R.kind),g;if(h){let T=v.branches.find(C=>C.id===h);if(!T||R.branch||R.tier<v.tiers.length||!c.branches)return false;g=T.cost;}else {if(R.tier>=v.tiers.length)return false;g=v.tiers[R.tier].cost;}return O<g?false:(it(O-g),h?R.branch=h:R.tier++,ct(D),bt(i,"coin"),e$1.emit("tower-upgraded",{kind:R.kind,tier:R.tier,branch:R.branch}),true)},_t=i=>{let h=ot(i);if(h===void 0)return false;let D=e$1.need(h,sn),R=Math.floor(Po(kn(D.kind),D.tier,D.branch||null)*Lo);it(O+R);let v=Re(d.spots[i]);return V(e$1,{kind:"pop",x:v.x,y:v.y-te()*.8,text:`+${R}`,color:"coin",size:Math.round(te()*.3)}),V(e$1,{kind:"burst",x:v.x,y:v.y,color:"muted",n:12,size:te()}),e$1.destroy(h),e$1.emit("tower-sold",{kind:D.kind}),true},Fe=()=>{Me=null,De=[],Ge("m:"),e$1.vars.td_menu="";},Ct=i=>i.map(h=>`${h.action??h.id}@${Math.round(h.x)},${Math.round(h.y)}`).join(";"),Ht=i=>{Fe(),Me=i,It();},It=()=>{if(Me===null)return;let i=Me;De=[];let h=te(),D=Ie(e$1),R=Math.min(D.w,D.h),v=Math.max(h*.46,R*.062),g=Math.max(h*1.1,v*2.3),T=Re(d.spots[i]),C=Math.max(g+v,Math.min(D.w-g-v,T.x)),P=Math.max(D.h*.1+g+v,Math.min(D.h*.88-g-v,T.y-h*.2)),z=(pe,We,Je,dt,Dt,_n,yn)=>{let ln=C+We*g,Wn=P+Je*g;De.push({action:pe,x:ln,y:Wn,r:v,ok:yn}),e$1.vars.td_menu=Ct(De),_e(`m:${pe}:bg`,ln,Wn,{shape:"circle",r:v,color:"panel",alpha:.94,depth:60});let br=pe==="sell";_e(`m:${pe}:rim`,ln,Wn,{shape:"circle",r:v*1.08,color:br?"danger":yn?"coin":"muted",alpha:yn?.9:.5,depth:59.9}),_e(`m:${pe}:art`,ln,Wn-v*.12,{shape:"sprite",art:dt,w:br?v*1.25:v*1.15,h:br?v*1.25:v*1.3,alpha:yn?1:.45,depth:60.1}),_n&&_e(`m:${pe}:txt`,ln,Wn+v*.78,{shape:"text",text:_n,size:Math.round(v*.52),color:Dt!==null&&!yn?"danger":"coin",bold:true,depth:60.2});},Z=ot(i);if(Z===void 0){let pe=c.towers.map(Je=>kn(Je)).filter(Boolean),We=pe.length<=1?[[0,-1]]:pe.length===2?[[-0.8,-0.7],[.8,-0.7]]:pe.length===3?[[-0.85,-0.6],[.85,-0.6],[0,.9]]:[[-0.8,-0.75],[.8,-0.75],[-0.8,.75],[.8,.75]];pe.slice(0,4).forEach((Je,dt)=>{let Dt=Je.tiers[0].cost;z(`build:${Je.id}`,We[dt][0],We[dt][1],Je.tiers[0].art,Dt,String(Dt),O>=Dt);});return}let F=e$1.need(Z,sn),de=kn(F.kind),le=wo(de,F.tier,F.branch||null);if(_e("m:range",T.x,T.y,{shape:"sprite",art:"aura_field",w:le.range*h*2,h:le.range*h*2,color:"primary",alpha:.4,depth:1}),F.tier<de.tiers.length){let pe=de.tiers[F.tier];z("up",0,-1,pe.art,pe.cost,String(pe.cost),O>=pe.cost);}else !F.branch&&c.branches&&de.branches.slice(0,2).forEach((pe,We)=>z(`branch:${pe.id}`,We===0?-0.85:.85,-0.7,pe.art,pe.cost,String(pe.cost),O>=pe.cost));let he=Math.floor(Po(de,F.tier,F.branch||null)*Lo);z("sell",0,1,"td_sell",null,`+${he}`,true);},tn=i=>{if(Me===null)return;let h=Me,D=false;if(i.startsWith("build:")?D=Ke(h,i.slice(6)):i==="up"?D=ze(h):i.startsWith("branch:")?D=ze(h,i.slice(7)):i==="sell"&&(D=_t(h)),!D){V(e$1,{kind:"shake",power:.3});return}Fe();},pt=(i,h)=>{let D=te(),R=-1,v=1/0;return d.spots.forEach((g,T)=>{let C=Re(g),P=ot(T)!==void 0?C.y-D*1.1:C.y-D*.5;if(Math.abs(i-C.x)>D*.55||h<P||h>C.y+D*.55)return;let z=Math.abs(i-C.x)+Math.abs(h-C.y);z<v&&(v=z,R=T);}),R},w=i=>1+.07*(i-1),f$1=(i,h,D,R)=>{let v=en(i);if(!v||x.length===0)return null;let g=v.hp*c.hp*(v.boss?1:w(R)),T=e$1.create();return e$1.set(T,Te,{kind:i,hp:g,maxHp:g,route:h%x.length,progress:D,x:0,y:0,slow:0,slowLeft:0,stun:0,burn:0,burnLeft:0,healCd:v.heals?.every??0,summonCd:v.summons?.every??0,heldBy:-1,enraged:false,wave:R}),e$1.set(T,e,{x:0,y:0}),e$1.set(T,f,{shape:"actor",cast:v.cast,variant:v.variant??r.int(0,99),h:te()*v.size*1.15,pose:v.flying?"air":"walk",depth:6}),m(T),v.boss&&(e$1.emit(zp,{kind:i}),V(e$1,{kind:"shake",power:1})),T},m=i=>{let h=e$1.need(i,Te),D=en(h.kind),R=x[h.route],v=Ye(R,h.progress),g=Ye(R,h.progress+.05);h.x=v.x,h.y=v.y;let T=te(),C=e$1.need(i,e),P=e$1.need(i,f),z=Ee(v.y)+T*.2;if(C.x=me(v.x),C.y=z-(D.flying?T*.55:0)-(P.shape==="actor"?P.h/2:0),P.shape==="actor"){Math.abs(g.x-v.x)>1e-4&&(P.facing=g.x>v.x?1:-1),P.depth=Vt(e$1,z,5),P.h=T*D.size*1.15;let Z=h.heldBy<0&&h.stun<=0;P.pose=D.flying?"air":Z?"walk":"idle",P.speed=D.speed*(1-h.slow)*T*se;}},p=i=>x[i.route].len-i.progress,y=i=>{let h=e$1.need(i,e);return {x:h.x,y:h.y}},l=(i,h,D,R,v=1,g="tower")=>{let T=e$1.get(i,Te);if(!T)return;let C=en(T.kind),P=h.damage*D*v*(R?2:1);if(h.type==="physical"?P*=1-C.armor*(1-(h.pierce??0)):h.type==="magic"&&(P*=1-C.resist),h.slow&&(T.slow=Math.max(T.slow,h.slow*(C.boss?.5:1)),T.slowLeft=Math.max(T.slowLeft,(h.slowTime??1)*D)),h.burn&&(T.burn=Math.max(T.burn,h.burn*D),T.burnLeft=Math.max(T.burnLeft,h.burnTime??2)),h.stun&&!C.boss&&r.chance(h.stun)&&(T.stun=Math.max(T.stun,h.stunTime??.5)),R){let z=y(i);V(e$1,{kind:"pop",x:z.x,y:z.y-te()*.5,text:String(Math.round(P)),color:"danger",size:Math.round(te()*.3)});}u(i,P,g);},u=(i,h,D)=>{let R=e$1.get(i,Te);R&&(R.hp-=h,R.hp<=0&&b(i,D));},b=(i,h)=>{let D=e$1.need(i,Te),R=en(D.kind);e$1.remove(i,Te),et(e$1,i,"die"),rr(e$1,i,1),ue++;let v=Math.round(R.bounty*c.bounty);it(O+v);let g=y(i);if(V(e$1,{kind:"pop",x:g.x,y:g.y-te()*.6,text:`+${v}`,color:"coin",size:Math.round(te()*.28)}),e$1.emit("enemy-defeated",{kind:D.kind,by:h}),R.boss?(fe++,qe(e$1,"coins",10),e$1.emit(Wp,{kind:D.kind}),V(e$1,{kind:"shake",power:1.4}),V(e$1,{kind:"flash",color:"coin"})):r.chance(s("coinRate"))&&(qe(e$1,"coins",1),e$1.emit("coin-collected",{value:1})),R.splits)for(let T=0;T<R.splits.count;T++)f$1(R.splits.into,D.route,Math.max(0,D.progress-.18*T),D.wave);},A=i=>{let h=e$1.need(i,Te),D=en(h.kind),R=Re(d.gate);V(e$1,{kind:"burst",x:R.x,y:R.y,color:"danger",n:12,size:te()}),e$1.destroy(i),M=Math.max(0,M-D.leak),e$1.vars.lives=M,e$1.emit("player-hit",{lives:M}),V(e$1,{kind:"flash",color:"danger"}),V(e$1,{kind:"shake",power:D.boss?1.6:.8}),M<=0&&X();},I=()=>{if(!(G>=c.waves.length)){G++,e$1.vars.wave=G,B=[];for(let i of c.waves[G-1].groups)for(let h=0;h<i.count;h++)B.push({at:i.delay+h*i.gap,enemy:i.enemy,entry:i.entry});B.sort((i,h)=>i.at-h.at),Q=0,ae=null,e$1.emit(nl,{wave:G});}},N=()=>{if(!(ae===null||G>=c.waves.length)){if(G>0){let i=Math.ceil(ae*s("earlyGold")*c.bounty);if(i>0){it(O+i);let h=ce.find(D=>D.id.startsWith("call"));h&&V(e$1,{kind:"pop",x:h.x,y:h.y-te()*.6,text:`+${i}`,color:"coin",size:Math.round(te()*.32)});}}vt(e$1,"td-call"),I();}},U=i=>{if(ie||!Ze(e$1))return;ie=true;let h=i==="defended",D=h?Math.min(ve?1:3,qs(M,$)):0;e$1.vars.stars=D,h&&e$1.vars["meta:first_clear"]===true&&qe(e$1,"coins",c.firstClearGold),e$1.vars.score=ke()+(h?1e3+D*300:0),e$1.vars.reviving=false,Fe(),e$1.emit(Bt,{reason:i,stats:{chapter:c.level,seconds:Math.floor(q),cleared:h,stars:D,coins:Number(e$1.vars.coins??0),bosses:fe,kills:ue,lives:M}});},X=()=>{if(e$1.vars.revive_ready===true&&!ve){e$1.vars.reviving=true,Fe(),e$1.emit(Gt,{});return}U("overrun");},ye=()=>{if(je()){ve=true,e$1.vars.reviving=false,M=js,e$1.vars.lives=M;for(let i of e$1.query(Te))e$1.need(i,Te).stun=2;V(e$1,{kind:"flash",color:"coin"});}},ke=()=>ue*10+M*50+Math.max(0,G-1)*100,Ue=()=>1+Io(e$1,"meta:spells"),st=(i,h,D)=>{let R=qr.find(T=>T.id===i);if(!R||(oe.get(i)??0)>0)return;let v=Ce(h,D);if(v.x<-0.5||v.y<-0.5||v.x>Sn+.5||v.y>En+.5)return;if(R.kind==="strike")for(let T=0;T<(R.count??1);T++){let C=e$1.create(),P=(R.radius??1)*.9;e$1.set(C,Xs,{x:v.x+(T===0?0:(r.next()-.5)*P*2),y:v.y+(T===0?0:(r.next()-.5)*P*2),t:0,delay:T*.2,damage:(R.damage??1)*c.hp*Ue(),radius:R.radius??1,burn:(R.burn??0)*c.hp*Ue()}),e$1.set(C,e,{x:-999,y:-999}),e$1.set(C,f,{shape:"sprite",art:"td_meteor",w:te()*.9,h:te()*.9,alpha:0,depth:45});}else {let T={route:0,q:0,d:1/0};x.forEach((P,z)=>{for(let Z=.5;Z<=P.len-.5;Z+=.25){let F=Ye(P,Z),de=Math.hypot(F.x-v.x,F.y-v.y);de<T.d&&(T={route:z,q:Z,d:de});}});let C=R.count??1;for(let P=0;P<C;P++){let z=e$1.create(),Z=(R.hp??3)*c.hp*Ue();e$1.set(z,hn,{hp:Z,maxHp:Z,dps:(R.dps??.5)*c.hp*Ue(),left:R.time??12,route:T.route,progress:Math.max(.3,Math.min(x[T.route].len-.3,T.q+(P-(C-1)/2)*.45)),swing:0}),e$1.set(z,e,{x:0,y:0}),e$1.set(z,f,{shape:"actor",cast:R.cast??"helper",variant:r.int(0,99),h:te()*.85,pose:"idle",depth:6}),Pe(z);let F=e$1.need(z,e);V(e$1,{kind:"ring",x:F.x,y:F.y,color:"accent",size:te()*1.2});}}let g=R.cooldown*(xe().perk==="spells"?.7:1);oe.set(i,g),ge=null,Ae!==null&&e$1.isAlive(Ae)&&He(e$1,Ae,"attack"),e$1.emit("spell-cast",{id:i});},Pe=i=>{let h=e$1.need(i,hn),D=x[h.route],R=Ye(D,h.progress),v=Ye(D,h.progress-.2),g=te(),T=e$1.need(i,e),C=e$1.need(i,f),P=Ee(R.y)+g*.2;T.x=me(R.x),T.y=P-(C.shape==="actor"?C.h/2:0),C.shape==="actor"&&(Math.abs(v.x-R.x)>1e-4&&(C.facing=v.x>R.x?1:-1),C.depth=Vt(e$1,P,5),C.h=g*.85);},re=()=>{(Ae===null||!e$1.isAlive(Ae))&&(Ae=e$1.create());let i=te(),h=d.gate,D=[[1,0],[-1,0],[0,-1],[0,1]].map(([g,T])=>({col:h.col+g,row:h.row+T})).find(g=>g.col>=0&&g.row>=0&&g.col<Sn&&g.row<En&&".tr*".includes(d.rows[g.row][g.col]))??h,R=Re(D),v=R.y+i*.35;e$1.set(Ae,e,{x:R.x,y:v-i*.6}),e$1.set(Ae,f,{shape:"actor",cast:xe().cast,h:i*1.2,pose:"idle",facing:D.col>h.col?-1:1,depth:Vt(e$1,v,5)});},H=()=>{if(ht(e$1,"td-build")||d.spots.length===0)return;let i=x[0],h=Ye(i,i.len*.4),D=0,R=1/0;d.spots.forEach((v,g)=>{let T=Math.hypot(v.col+.5-h.x,v.row+.5-h.y);T<R&&(R=T,D=g);}),ft(e$1,"tap",Re(d.spots[D]),void 0,te()*1.2);},J=()=>{if(ht(e$1,"td-call")||G>0)return;let i=Re(d.paths[0][0]);ft(e$1,"tap",i,void 0,te()*1.2);},j$1=()=>{let i=Ie(e$1),h=Math.min(i.w,i.h),D=te(),R=i.h*.085,v=h*.05,g=(F,de,le,he,pe="text",We=h*.042)=>_e(F,de,le,{shape:"text",text:he,size:Math.round(We),color:pe,bold:true,depth:70});_e("h:lives:i",i.w*.07,R,{shape:"sprite",art:"heart",w:v,h:v,depth:70}),g("h:lives",i.w*.15,R,String(M),M<=5?"danger":"text"),_e("h:gold:i",i.w*.3,R,{shape:"sprite",art:"td_gold",w:v*1.15,h:v,depth:70}),g("h:gold",i.w*.4,R,String(O),"coin"),_e("h:wave:i",i.w*.56,R,{shape:"sprite",art:"td_call",w:v,h:v,depth:70}),g("h:wave",i.w*.66,R,`${G}/${c.waves.length}`),_e("h:coin:i",i.w*.8,R,{shape:"sprite",art:"coin",w:v*.9,h:v*.9,depth:70}),g("h:coin",i.w*.89,R,String(e$1.vars.coins??0));let T=i.h*.125,C=e$1.query(Te).find(F=>en(e$1.need(F,Te).kind)?.boss);if(C!==void 0){let F=e$1.need(C,Te),de=i.w*.55,le=Math.max(10,h*.022);_e("h:n:boss:bg",i.w/2,T,{shape:"rect",w:de,h:le,color:"#000000",alpha:.5,radius:le/2,depth:69});let he=Math.max(1,(de-4)*Math.max(0,F.hp/F.maxHp));_e("h:n:boss:fill",i.w/2-(de-4)/2+he/2,T,{shape:"rect",w:he,h:le-4,color:"danger",radius:(le-4)/2,depth:69.1}),_e("h:n:boss:i",i.w/2-de/2-v*.7,T,{shape:"sprite",art:"skull",w:v,h:v,depth:70});}else if(ae!==null&&G<c.waves.length){let F=new Map;for(let pe of c.waves[G].groups)F.set(pe.enemy,(F.get(pe.enemy)??0)+pe.count);let de=[...F].slice(0,5),le=h*.15,he=i.w/2-(de.length-1)*le/2;de.forEach(([pe,We],Je)=>{let dt=en(pe),Dt=he+Je*le;_e(`h:n:${pe}:a`,Dt-v*.4,T+v*.1,{shape:"actor",cast:dt.cast,variant:dt.variant??1,h:v*1.5*Math.min(1.3,dt.size+.25),pose:dt.flying?"air":"idle",depth:70}),g(`h:n:${pe}:t`,Dt+v*.55,T+v*.1,`\xD7${We}`,dt.boss?"danger":"text",h*.034);});}if(ce=[],ae!==null&&G<c.waves.length){let F=G===0?1+.08*Math.sin(e$1.time*6):1;d.paths.forEach((de,le)=>{let he=Re(de[0]),pe=D*.42;ce.push({id:`call:${le}`,x:he.x,y:he.y,r:pe*1.2}),_e(`b:call:${le}:bg`,he.x,he.y,{shape:"circle",r:pe,color:"danger",alpha:.92,depth:65},F),_e(`b:call:${le}:i`,he.x,he.y,{shape:"sprite",art:"td_call",w:pe*1.3,h:pe*1.3,depth:65.1},F),_e(`b:call:${le}:t`,he.x,he.y+pe*1.25,{shape:"text",text:String(Math.ceil(ae??0)),size:Math.round(D*.26),color:"text",bold:true,depth:65.2});});}let P=i.h*.925,z=h*.065;qr.filter(F=>c.spells.includes(F.id)).forEach((F,de)=>{let le=i.w*.12+de*z*2.6,he=oe.get(F.id)??0;ce.push({id:`spell:${F.id}`,x:le,y:P,r:z*1.15}),ge===F.id&&_e(`b:s:${F.id}:rim`,le,P,{shape:"circle",r:z*1.18,color:"coin",alpha:.6+.4*Math.sin(e$1.time*8),depth:64.9}),_e(`b:s:${F.id}:bg`,le,P,{shape:"circle",r:z,color:"panel",alpha:.92,depth:65}),_e(`b:s:${F.id}:i`,le,P,{shape:"sprite",art:F.icon,w:z*1.25,h:z*1.25,alpha:he>0?.4:1,depth:65.1}),he>0&&_e(`b:s:${F.id}:t`,le,P,{shape:"text",text:String(Math.ceil(he)),size:Math.round(z*.8),color:"text",bold:true,depth:65.2});});let Z=i.w*.88;ce.push({id:"speed",x:Z,y:P,r:z*1.15}),_e("b:speed:bg",Z,P,{shape:"circle",r:z,color:se>1?"coin":"panel",alpha:.92,depth:65}),e$1.vars.td_buttons=Ct(ce),_e("b:speed:t",Z,P,{shape:"text",text:`x${se}`,size:Math.round(z*.75),color:se>1?"panel":"text",bold:true,depth:65.1});},k$1=()=>{let i=te(),h=new Set,D=(R,v,g,T,C)=>{h.add(R);let P=ee.get(R);if(!P){P=[e$1.create(),e$1.create(),e$1.create(),e$1.create(),e$1.create()];for(let[Dt,_n]of P.entries())e$1.set(_n,Zc,{of:R,part:String(Dt)});ee.set(R,P);}let z=e$1.need(R,e),Z=e$1.need(R,f),F=Z.shape==="actor"?Z.h:i,de=z.y-F/2-i*.08,le=Math.min(Ie(e$1).w,Ie(e$1).h),he=Math.max(i*.62,le*.065),pe=Math.max(5,he*.13),We=v<.999;e$1.set(P[0],e,{x:z.x,y:de}),e$1.set(P[0],f,{shape:"rect",w:he,h:pe,color:"#000000",alpha:We?.55:0,radius:pe/2,depth:30});let Je=Math.max(1,(he-2)*Math.max(0,v));e$1.set(P[1],e,{x:z.x-(he-2)/2+Je/2,y:de}),e$1.set(P[1],f,{shape:"rect",w:Je,h:pe-2,color:g,alpha:We?1:0,radius:(pe-2)/2,depth:30.1}),e$1.set(P[2],e,{x:z.x-he/2-i*.12,y:de}),e$1.set(P[2],f,{shape:"sprite",art:T??"shield",w:i*.24,h:i*.24,alpha:T?1:0,depth:30.2});let dt=z.y+F/2;e$1.set(P[3],e,{x:z.x,y:dt}),e$1.set(P[3],f,{shape:"sprite",art:"aura_field",w:i*.75,h:i*.32,color:"primary",alpha:C?.slow?.75:0,depth:2}),e$1.set(P[4],e,{x:z.x,y:z.y}),e$1.set(P[4],f,{shape:"sprite",art:"burst",w:i*.45,h:i*.45,color:"danger",alpha:C?.burn?.5+.4*Math.sin(e$1.time*20):0,depth:29});};for(let R of e$1.query(Te)){let v=e$1.need(R,Te);D(R,v.hp/v.maxHp,"danger",en(v.kind)?.badge,{slow:v.slowLeft>0,burn:v.burnLeft>0});}for(let R of e$1.query(hn)){let v=e$1.need(R,hn);D(R,v.hp/v.maxHp,"accent",void 0,null);}for(let[R,v]of [...ee])if(!h.has(R)){for(let g of v)e$1.destroy(g);ee.delete(R);}},E=()=>{for(let i of [sn,Te,mr,hn,Xs,Ys,Zc,tl])rt(e$1,i);Se.clear(),ee.clear();for(let i of e$1.query(f))e$1.need(i,f).shape==="actor"&&i!==Ae&&!e$1.has(i,tl)&&e$1.destroy(i);},a=()=>{E(),c=Yr(Io(e$1,"meta:chapter")||1,s("difficulty"),o),d=Xr(jr(Us(c.map),c.mirror)),Le(),Tt(e$1,"top"),_=we(),tt(),O=0,it((c.gold+s("gold")+Io(e$1,"meta:start_gold"))*(xe().perk==="gold"?1.25:1)),$=s("lives")+Io(e$1,"meta:lives"),M=$,G=0,B=[],Q=0,ae=s("firstWait"),q=0,ue=0,fe=0,ie=false,ve=false,se=1,Me=null,De=[],ge=null,oe.clear(),ce=[],e$1.vars.lives=M,e$1.vars.wave=0,e$1.vars.waves=c.waves.length,e$1.vars.td_level=c.level,e$1.vars.td_world=c.world,e$1.vars.coins=0,e$1.vars.score=0,e$1.vars.stars=0,e$1.vars.reviving=false,e$1.vars.td_speed=1,e$1.vars.level_progress=0,re();},S=i=>{if(i.startsWith("call"))N();else if(i==="speed")se=se>1?1:2,e$1.vars.td_speed=se;else if(i.startsWith("spell:")){let h=i.slice(6);ge===h?ge=null:(oe.get(h)??0)<=0&&(ge=h,Fe());}};e$1.on(j,i=>{let h=i;if(h.type!=="tap"||!Ze(e$1)||Kn(e$1)||ie||je())return;if(Me!==null){let v=De.find(g=>Math.hypot(h.x-g.x,h.y-g.y)<=g.r);if(v){tn(v.action);return}Fe();}let D=ce.find(v=>Math.hypot(h.x-v.x,h.y-v.y)<=v.r);if(D){S(D.id);return}if(ge!==null){st(ge,h.x,h.y);return}let R=pt(h.x,h.y);R>=0&&(ht(e$1,"td-build")||Ot(e$1),Ht(R));}),e$1.on($t,()=>{a(),e$1.vars.level=c.level,H();}),e$1.on(Wt,a),e$1.on(Kt,ye),e$1.on(Ft,()=>{je()&&(e$1.vars.reviving=false,U("overrun"));}),e$1.on(zt,i=>{Fe(),Ge("b:"),ce=[],Ae!==null&&e$1.isAlive(Ae)&&et(e$1,Ae,i.reason==="defended"?"dance":"die");for(let h of e$1.query(Te))et(e$1,h,"idle");}),e$1.on(k,()=>{Tt(e$1,"top"),_=we(),tt();for(let i of e$1.query(sn))ct(i);rt(e$1,mr),Me!==null&&It(),re();}),e$1.addSystem({id:"tower-defense",order:0,run(i,h){if(!Ze(i)||ie||je())return;let D=h*se;q+=h;let R=te();for(let[v,g]of oe)g>0&&oe.set(v,Math.max(0,g-D));if(B.length>0){for(Q+=D;B.length>0&&B[0].at<=Q;){let v=B.shift();f$1(v.enemy,v.entry,0,G);}B.length===0&&G<c.waves.length&&(ae=s("wavePause"));}else ae!==null&&(ae-=D,ae<=0&&I());for(let v of i.query(hn)){let g=i.need(v,hn);if(g.left-=D,g.left<=0||g.hp<=0){i.remove(v,hn),et(i,v,"die"),rr(i,v,.8);for(let P of i.query(Te))i.need(P,Te).heldBy===v&&(i.need(P,Te).heldBy=-1);continue}let T=Ye(x[g.route],g.progress),C=i.query(Te).filter(P=>i.need(P,Te).heldBy===v);if(C.length<2){let P=i.query(Te).filter(z=>{let Z=i.need(z,Te),F=en(Z.kind);return Z.heldBy<0&&!F.flying&&!F.boss&&Math.hypot(Z.x-T.x,Z.y-T.y)<=Vp}).slice(0,2-C.length);for(let z of P)i.need(z,Te).heldBy=v,C.push(z);}C.length>0&&(u(C[0],g.dps*D,"soldier"),g.swing-=D,g.swing<=0&&(He(i,v,"attack"),g.swing=.6)),Pe(v);}for(let v of i.query(Te)){let g=i.get(v,Te);if(!g)continue;let T=en(g.kind);if(!(g.burnLeft>0&&(g.burnLeft-=D,u(v,g.burn*D,"burn"),!i.has(v,Te)))){if(g.slowLeft>0&&(g.slowLeft-=D,g.slowLeft<=0&&(g.slow=0)),g.stun>0&&(g.stun-=D),T.heals&&(g.healCd-=D,g.healCd<=0)){g.healCd=T.heals.every;for(let P of i.query(Te)){let z=i.need(P,Te);Math.hypot(z.x-g.x,z.y-g.y)>T.heals.radius||(z.hp=Math.min(z.maxHp,z.hp+z.maxHp*T.heals.share));}let C=y(v);V(i,{kind:"ring",x:C.x,y:C.y,color:"accent",size:T.heals.radius*R*2});}if(T.summons&&(g.summonCd-=D,g.summonCd<=0)){g.summonCd=T.summons.every;for(let C=0;C<T.summons.count;C++)f$1(T.summons.id,g.route,Math.max(0,g.progress-.45*(C+1)),g.wave);He(i,v,"cheer");}if(T.enrage&&!g.enraged&&g.hp<g.maxHp*T.enrage.below){g.enraged=true;let C=y(v);V(i,{kind:"ring",x:C.x,y:C.y,color:"danger",size:R*2});}if(g.heldBy>=0&&!i.has(g.heldBy,hn)&&(g.heldBy=-1),g.heldBy<0&&g.stun<=0&&(g.progress+=T.speed*(1-g.slow)*(g.enraged&&T.enrage?T.enrage.speed:1)*D),g.progress>=x[g.route].len){if(A(v),ie||je())return;continue}m(v);}}for(let v of i.query(sn)){let g=i.need(v,sn);if(g.cooldown-=D,g.cooldown>0)continue;let T=kn(g.kind),C=wo(T,g.tier,g.branch||null),P=1+Io(i,T.metaVar),z=d.spots[g.spot],Z=z.col+.5,F=z.row+.5,de=i.query(Te).filter(he=>{let pe=i.need(he,Te);return (en(pe.kind).flying?C.air:C.ground)&&pe.progress>0&&Math.hypot(pe.x-Z,pe.y-F)<=C.range}).sort((he,pe)=>p(i.need(he,Te))-p(i.need(pe,Te))).slice(0,C.multishot??1);if(de.length===0){g.cooldown=0;continue}g.cooldown=1/C.rate;let le={x:me(Z),y:Ee(F)-R*.75};for(let he of de){let pe=C.crit!==void 0&&r.chance(C.crit);if(C.beam){let _n=[],yn=le,ln=he,Wn=1;for(let br=0;br<=(C.chain??0)&&ln!==void 0;br++){let Pl=y(ln);L(yn,Pl,C.type==="magic"?"secondary":"primary"),_n.push(ln);let vr=i.need(ln,Te),zd=i.query(Te).filter(xr=>!_n.includes(xr)&&Math.hypot(i.need(xr,Te).x-vr.x,i.need(xr,Te).y-vr.y)<=1.6).sort((xr,Cl)=>Math.hypot(i.need(xr,Te).x-vr.x,i.need(xr,Te).y-vr.y)-Math.hypot(i.need(Cl,Te).x-vr.x,i.need(Cl,Te).y-vr.y))[0];l(ln,C,P,pe,Wn),yn=Pl,ln=zd,Wn*=.7;}continue}let We=y(he),Je=i.create(),dt=Math.max(1,Math.hypot(We.x-le.x,We.y-le.y));i.set(Je,mr,{target:he,x:le.x,y:le.y,ax:We.x,ay:We.y,dist0:dt,went:0,stats:C,power:P,crit:pe}),i.set(Je,e,{x:le.x,y:le.y});let Dt=C.shot==="td_arrow"?{w:R*.55,h:R*.18}:C.lob?{w:R*.34,h:R*.34}:{w:R*.3,h:R*.3};i.set(Je,f,{shape:"sprite",art:C.shot,...Dt,...C.burn?{color:"danger"}:C.slow?{color:"primary"}:C.type==="magic"?{color:"secondary"}:{},depth:40});}}for(let v of i.query(mr)){let g=i.need(v,mr);if(i.has(g.target,Te)){let F=y(g.target);g.ax=F.x,g.ay=F.y;}let T=g.ax-g.x,C=g.ay-g.y,P=Math.hypot(T,C),z=g.stats.shotSpeed*R*D,Z=i.need(v,e);if(P>z){g.x+=T/P*z,g.y+=C/P*z,g.went+=z;let F=Math.min(1,g.went/g.dist0);Z.x=g.x,Z.y=g.y-(g.stats.lob?Math.sin(Math.PI*F)*R*.9:0),Z.rotation=g.stats.lob?(Z.rotation??0)+D*8:Math.atan2(C,T);continue}if(i.destroy(v),g.stats.splash){let F=Ce(g.ax,g.ay);V(i,{kind:"burst",x:g.ax,y:g.ay,color:g.stats.burn?"danger":g.stats.slow?"primary":"coin",n:12,size:g.stats.splash*R*1.6}),g.stats.lob&&V(i,{kind:"shake",power:.25});for(let de of i.query(Te)){let le=i.need(de,Te),he=en(le.kind);(he.flying?g.stats.air:g.stats.ground)&&Math.hypot(le.x-F.x,le.y+(he.flying?-0.55:0)-F.y)<=g.stats.splash&&l(de,g.stats,g.power,g.crit);}}else i.has(g.target,Te)&&(V(i,{kind:"burst",x:g.ax,y:g.ay,color:g.stats.type==="magic"?"secondary":"coin",n:5,size:R*.5}),l(g.target,g.stats,g.power,g.crit));if(ie||je())return}for(let v of i.query(Xs)){let g=i.need(v,Xs);g.t+=D;let T=(g.t-g.delay)/Hp,C=i.need(v,e),P=i.need(v,f);if(T<0)continue;if(T<1){let Z=Ie(i).h;C.x=me(g.x)+(1-T)*R*2,C.y=Ee(g.y)-(1-T)*Z*.5,C.rotation=-0.9,P.shape==="sprite"&&(P.alpha=1);continue}i.destroy(v),V(i,{kind:"burst",x:me(g.x),y:Ee(g.y),color:"danger",n:20,size:g.radius*R*2}),V(i,{kind:"ring",x:me(g.x),y:Ee(g.y),color:"coin",size:g.radius*R*2.2}),V(i,{kind:"shake",power:.8});let z={damage:g.damage,type:"true",...g.burn>0?{burn:g.burn,burnTime:2}:{}};for(let Z of i.query(Te)){let F=i.need(Z,Te);Math.hypot(F.x-g.x,F.y-g.y)<=g.radius&&l(Z,z,1,false,1,"spell");}if(ie||je())return}for(let v of i.query(Ys)){let g=i.need(v,Ys);g.life-=h,g.life<=0&&i.destroy(v);}if(G>=c.waves.length&&B.length===0&&i.query(Te).length===0){U("defended");return}i.vars.level_progress=c.waves.length>0?Math.min(1,(G-(B.length>0||i.query(Te).length>0?.5:0))/c.waves.length):0,i.vars.score=ke(),at.clear(),Me!==null&&It(),k$1(),j$1(),Pt(["m:","h:","b:"]);}});let L=(i,h,D)=>{let R=Math.hypot(h.x-i.x,h.y-i.y),v=e$1.create();e$1.set(v,Ys,{life:.16}),e$1.set(v,e,{x:(i.x+h.x)/2,y:(i.y+h.y)/2,rotation:Math.atan2(h.y-i.y,h.x-i.x)}),e$1.set(v,f,{shape:"sprite",art:"zap",w:Math.max(8,R),h:te()*.22,color:D,depth:41});};Le(),a();}};var No=[{id:"lemon",art:"biz1",color:"coin",cost:4,income:1,cycle:1,growth:1.07,manager:60},{id:"bakery",art:"biz2",color:"accent",cost:50,income:17,cycle:2,growth:1.1,manager:600},{id:"cafe",art:"biz3",color:"secondary",cost:600,income:225,cycle:3,growth:1.11,manager:7e3},{id:"workshop",art:"biz4",color:"primary",cost:7e3,income:2800,cycle:4,growth:1.11,manager:8e4},{id:"cinema",art:"ty_cinema",color:"danger",cost:8e4,income:4e4,cycle:6,growth:1.11,manager:1e6},{id:"hotel",art:"biz6",color:"secondary",cost:9e5,income:51e4,cycle:8,growth:1.11,manager:11e6},{id:"bank",art:"biz5",color:"coin",cost:1e7,income:62e5,cycle:10,growth:1.11,manager:12e7},{id:"port",art:"ty_port",color:"primary",cost:12e7,income:8e7,cycle:12,growth:1.11,manager:15e8}],yr=e=>No.find(t=>t.id===e),$o=[{at:10,speed:2},{at:25,speed:2},{at:50,speed:2},{at:75,income:3},{at:100,speed:2},{at:150,income:3}],ea=.1,ta=[{id:"double",scope:"one",art:"ty_up",mult:2,price:60,after:5},{id:"triple",scope:"one",art:"ty_up3",mult:3,price:2500,after:25},{id:"all",scope:"all",art:"ty_upall",mult:2,price:40,after:15}],Qr=[{id:"rush",art:"ty_rush",effect:"rush",weight:3,ttl:7,mult:3,seconds:10},{id:"break",art:"ty_wrench",effect:"break",weight:2,ttl:99,taps:3},{id:"invest",art:"ty_investor",effect:"invest",weight:1,ttl:9,now:25,mult:2,seconds:30},{id:"courier",art:"chest",effect:"courier",weight:2,ttl:6,now:15,coins:2}],Qc=e=>Qr.find(t=>t.id===e),rl=[11,18],ol=[{id:"rush",art:"ty_sk_rush",charge:30,effect:"rush",mult:5,seconds:12},{id:"instant",art:"ty_sk_instant",charge:26,effect:"instant",cycles:8},{id:"sale",art:"ty_sk_sale",charge:28,effect:"sale",mult:.5,seconds:15}],na=e=>ol.find(t=>t.id===e),ed=.4,td=3,eo=[{id:"hero",cast:"hero",gems:0,skill:"rush"},{id:"hero2",cast:"hero2",gems:150,skill:"instant"},{id:"hero3",cast:"hero3",gems:300,skill:"sale"}];var nd={l:"lemon",b:"bakery",c:"cafe",w:"workshop",n:"cinema",h:"hotel",k:"bank",p:"port"},Gp={r:"rush",b:"break",i:"invest",c:"courier"},Be=(e,t,n="",s)=>({businesses:[...e].map(r=>nd[r]??"lemon"),goals:t,events:[...n].map(r=>Gp[r]??"rush"),...{}}),Qs=e=>({...e,vip:true}),Ve=e=>({kind:"cash",n:e}),St=(e,t)=>({kind:"level",biz:nd[e]??"lemon",n:t}),Yt=e=>({kind:"managers",n:e}),gr=[Be("lb",[Ve(5200)]),Be("lb",[St("l",25),Ve(62e3)]),Be("lbc",[Ve(17e3)],"r"),Be("lbc",[Yt(2),Ve(34e3)],"r"),Be("lbc",[St("b",25),Ve(51e3)],"rc"),Be("lbcw",[Ve(21e4)],"rc"),Be("lbcw",[St("c",25),Yt(2)],"rc"),Be("lbcw",[Yt(3),Ve(46e4)],"rc"),Be("lbcw",[St("w",10),Ve(1e6)],"rc"),Qs(Be("lbcw",[St("c",25),Yt(4),Ve(5e6)],"rc")),Be("bcw",[Ve(73e3)],"rb"),Be("bcw",[St("c",25),Ve(17e4)],"rcb"),Be("bcwn",[Ve(2e5)],"rcb"),Be("bcwn",[Yt(2),Ve(42e4)],"rcb"),Be("bcwn",[St("n",5),Ve(97e4)],"rcb"),Be("bcwn",[St("w",25),Ve(24e5)],"rcb"),Be("bcwn",[Yt(3),Ve(19e5)],"rcb"),Be("bcwn",[St("c",50),Ve(32e5)],"rcb"),Be("bcwn",[St("n",10),Yt(3)],"rcb"),Qs(Be("bcwn",[St("n",10),Yt(4),Ve(64e6)],"rcb")),Be("cwn",[Ve(12e5)],"rcbi"),Be("cwn",[St("w",25),Ve(2e6)],"rcbi"),Be("cwnh",[Ve(27e5)],"rcbi"),Be("cwnh",[Yt(2),Ve(32e5)],"rcbi"),Be("cwnh",[St("h",5),Ve(16e6)],"rcbi"),Be("cwnh",[St("n",25),Ve(26e6)],"rcbi"),Be("cwnh",[Yt(3),Ve(15e6)],"rcbi"),Be("cwnh",[St("w",50),Ve(42e6)],"rcbi"),Be("cwnh",[St("h",10),Yt(3)],"rcbi"),Qs(Be("cwnh",[St("h",10),Yt(4),Ve(26e7)],"rcbi")),Be("wnhk",[Ve(12e6)],"rcbi"),Be("wnhk",[St("h",10),Ve(36e6)],"rcbi"),Be("wnhk",[Yt(3),Ve(21e7)],"rcbi"),Be("nhkp",[Ve(21e7)],"rcbi"),Be("nhkp",[St("k",10),Ve(38e7)],"rcbi"),Be("nhkp",[Yt(2),Ve(42e7)],"rcbi"),Be("nhkp",[St("p",5),Ve(27e8)],"rcbi"),Be("nhkp",[St("k",25),Ve(32e8)],"rcbi"),Be("nhkp",[St("p",10),Yt(3)],"rcbi"),Qs(Be("nhkp",[St("p",10),Yt(4),Ve(11e9)],"rcbi"))],to=10,rd=4,Zr=gr.length,sl=[0,18,45,75],al=e=>sl[Math.ceil(Math.max(1,e)/to)-1]??0,ra=e=>e>=.3?3:e>=.12?2:1,oa=30,od=(e,t)=>Math.round((t?40:20)+(e-1)*2),il=(e,t)=>(t?120:50)+(e-1)*10,ll="kit-tycoon",cl=[{id:"StartCash",var:"meta:cash",art:"coin",color:"coin",perLevel:20,unit:"%",maxLevel:15,price:40,growth:.12},{id:"CycleSpeed",var:"meta:speed",art:"hourglass",color:"secondary",perLevel:3,unit:"%",maxLevel:15,price:45,growth:.12},{id:"Income",var:"meta:income",art:"ty_up",color:"accent",perLevel:5,unit:"%",maxLevel:20,price:40,growth:.12},{id:"Discount",var:"meta:discount",art:"ty_sk_sale",color:"primary",perLevel:2,unit:"%",maxLevel:15,price:50,growth:.12},{id:"SkillPower",var:"meta:skill",art:"ty_sk_rush",color:"secondary",perLevel:8,unit:"%",maxLevel:10,price:50,growth:.12}],sd={game:"tycoon",character:ll,stats:cl,heroes:eo,levels:Zr,firstClearGold:e=>il(e,gr[Math.max(1,Math.min(Zr,e))-1]?.vip===true),stars:3,starsToEnter:al};var Kp={income:0,speed:0,discount:0};function zo(e,t=Kp,n){return {biz:e.businesses.map((r,o)=>({def:yr(r)??No[0],level:o===0?1:0,progress:0,ready:false,manager:false,mult:1,rush:0,rushMult:1,broken:0})),cash:n??id(e),earned:0,allMult:1,bought:new Set,timed:[],mods:t}}var id=e=>e.cash??(yr(e.businesses[1]??e.businesses[0]??"lemon")?.cost??4)*2,Fp=e=>e.timed.reduce((t,n)=>t*n.income,1),Up=e=>e.timed.reduce((t,n)=>t*n.price,1);function Wo(e){let t=1,n=1,s=0;for(let r of $o)e>=r.at?(t*=r.speed??1,n*=r.income??1):s===0&&(s=r.at);return {speed:t,income:n,next:s}}function Jn(e,t){let n=Wo(t.level);return Math.max(ea,t.def.cycle/n.speed/(1+e.mods.speed))}function mn(e,t,n=t.level){if(n<=0)return 0;let s=Wo(n),r=t.def.cycle/s.speed/(1+e.mods.speed),o=r<ea?ea/r:1;return t.def.income*n*s.income*o*t.mult*e.allMult*(1+e.mods.income)*(t.rush>0?t.rushMult:1)*Fp(e)}var sa=(e,t)=>t.level<=0||t.broken>0?0:mn(e,t)/Jn(e,t),aa=e=>e.biz.reduce((t,n)=>t+sa(e,n),0),Bo=e=>Math.max(.1,1-Math.min(.9,e.mods.discount))*Up(e);function Zn(e,t,n=1){let s=t.def.growth,r=t.def.cost*Math.pow(s,t.level),o=n<=1?r:r*(Math.pow(s,n)-1)/(s-1);return Math.ceil(o*Bo(e))}function pl(e,t,n=1e3){let s=t.def.growth,r=t.def.cost*Math.pow(s,t.level)*Bo(e);if(e.cash<r)return 0;let o=Math.floor(Math.log(e.cash*(s-1)/r+1)/Math.log(s)),c=Math.max(1,Math.min(n,o));for(;c>1&&Zn(e,t,c)>e.cash;)c--;return Zn(e,t,c)<=e.cash?c:0}var no=(e,t)=>Math.ceil(t.def.manager*Bo(e));function ia(e,t,n=1){let s=e.biz[t];if(!s||n<1)return {ok:false,milestones:[]};let r=Zn(e,s,n);if(e.cash<r)return {ok:false,milestones:[]};e.cash-=r;let o=s.level;return s.level+=n,{ok:true,milestones:$o.filter(c=>o<c.at&&s.level>=c.at).map(c=>c.at)}}function la(e,t){let n=e.biz[t];if(!n||n.manager||n.level<=0)return false;let s=no(e,n);return e.cash<s?false:(e.cash-=s,n.manager=true,n.ready&&(n.ready=false,n.progress=0,Ho(e,mn(e,n))),true)}var Ho=(e,t)=>{e.cash+=t,e.earned+=t;};function ca(e,t){let n=e.biz[t];if(!n||!n.ready)return 0;n.ready=false,n.progress=0;let s=mn(e,n);return Ho(e,s),s}function da(e,t){let n=e.biz[t];return !n||n.broken<=0?false:(n.broken--,n.broken===0)}function ul(e,t){let n=0;for(let s of e.biz)s.level<=0||s.broken>0||(n+=mn(e,s)*t);return Ho(e,n),n}var fl=(e,t)=>Ho(e,t);function pa(e,t){let n=e.timed.findIndex(s=>s.id===t.id);n>=0&&e.timed.splice(n,1),e.timed.push(t);}function ua(e,t){let n=[],s=[];e.biz.forEach((r,o)=>{if(r.rush>0&&(r.rush=Math.max(0,r.rush-t)),!(r.level<=0||r.ready||r.broken>0)&&(r.progress+=t/Jn(e,r),!(r.progress<1)))if(r.manager){let c=Math.floor(r.progress);r.progress-=c;let d=mn(e,r)*c;Ho(e,d),s.push({index:o,amount:d});}else r.progress=1,r.ready=true,n.push(o);});for(let r=e.timed.length-1;r>=0;r--){let o=e.timed[r];o.left-=t,o.left<=0&&e.timed.splice(r,1);}return {ready:n,paid:s}}function hl(e){let t=[],n=e.biz.reduce((s,r)=>Math.max(s,r.def.cost),0);for(let s of ta)s.scope==="all"?t.push({key:s.id,def:s,index:-1,price:Math.ceil(n*s.price*Bo(e))}):e.biz.forEach((r,o)=>t.push({key:`${s.id}:${r.def.id}`,def:s,index:o,price:Math.ceil(r.def.cost*s.price*Bo(e))}));return t}function fa(e,t=3){return hl(e).filter(n=>!e.bought.has(n.key)&&(n.index<0?(e.biz[0]?.level??0)>=n.def.after:(e.biz[n.index]?.level??0)>=n.def.after)).sort((n,s)=>n.price-s.price).slice(0,t)}function ha(e,t){let n=hl(e).find(s=>s.key===t);return !n||e.bought.has(t)||e.cash<n.price?false:(e.cash-=n.price,e.bought.add(t),n.index<0?e.allMult*=n.def.mult:e.biz[n.index].mult*=n.def.mult,true)}var ma=e=>e.biz.filter(t=>t.manager).length;function $n(e,t){if(t.kind==="cash")return Math.min(1,e.earned/Math.max(1,t.n));if(t.kind==="managers")return Math.min(1,ma(e)/Math.max(1,t.n));let n=e.biz.find(s=>s.def.id===t.biz);return Math.min(1,(n?.level??0)/Math.max(1,t.n))}var Vo=(e,t)=>t.every(n=>$n(e,n)>=1),ya=(e,t)=>t.length?t.reduce((n,s)=>n+$n(e,s),0)/t.length:1,dl=(e,t)=>t.manager?1:Jn(e,t)/(Jn(e,t)+1.2);function ga(e,t){let n=e.biz.findIndex(M=>M.broken>0);if(n>=0)return {kind:"fix",index:n};let s=null,r=aa(e),o=(M,$,G)=>{if(G>e.cash+r*8)return;let B=$/Math.max(1,G);(!s||B>s.value)&&(s={move:M,value:B,price:G});},c=M=>t.some($=>$.kind==="level"&&$.biz===M&&$n(e,$)<1),d=t.some(M=>M.kind==="managers"&&$n(e,M)<1),x=t.some(M=>M.kind==="cash"&&$n(e,M)<1);e.biz.forEach((M,$)=>{let G=sa(e,M)*dl(e,M),B={...M,level:M.level+1},ae=(mn(e,B)/Jn(e,B)*dl(e,B)-G)*(M.level===0?3:1)*(c(M.def.id)?3:1);o({kind:"buy",index:$},ae+(c(M.def.id)&&!x?r*.05:0),Zn(e,M)),M.level>0&&!M.manager&&o({kind:"hire",index:$},sa(e,M)*(1-dl(e,M))*1.6*(d?3:1)+(d?r*.05:0),no(e,M));});for(let M of fa(e,6)){let $=M.index<0?r*(M.def.mult-1):sa(e,e.biz[M.index])*(M.def.mult-1);o({kind:"upgrade",key:M.key},$,M.price);}let _=e.biz.map((M,$)=>({b:M,i:$})).filter(M=>M.b.ready).sort((M,$)=>mn(e,$.b)-mn(e,M.b))[0],O=s;return O&&O.price<=e.cash?O.move:_?{kind:"collect",index:_.i}:null}function ld(e,t){return t?t.kind==="collect"?ca(e,t.index)>0:t.kind==="buy"?ia(e,t.index).ok:t.kind==="hire"?la(e,t.index):t.kind==="fix"?da(e,t.index)||true:ha(e,t.key):false}function cd(e,t={}){let n=zo(e,t.mods),s=.05,r=t.tapEvery??.4,o=t.max??900,c=0,d=0;for(;c<o;){if(Vo(n,e.goals))return c;if(ua(n,s),c+=s,c>=d){let x=ga(n,e.goals);x&&(ld(n,x),d=c+r);}}return 1/0}var ad=new Map;function ba(e){let t=ad.get(e);return t===void 0&&(t=cd(gr[e-1]),ad.set(e,t)),t}function ro(e,t=.5){let n=Math.max(1,Math.min(Zr,Math.floor(e))),s=gr[n-1],r=Math.ceil(n/to),o=n-(r-1)*to,c=ba(n),d=(1.6-(r-1)*.08-o*.01)*(1.1-t*.2)*(s.extra??1),x=Math.max(45,Math.min(600,Math.ceil((Number.isFinite(c)?c:400)*d/5)*5));return {level:n,world:r,index:o,def:s,boss:s.vip===true,day:x,cash:id(s),coins:od(n,s.vip===true),firstClearGold:il(n,s.vip===true)}}var qp=b("tycoon.part"),ml=b("tycoon.manager"),oo=(e,t)=>{let n=Number(e.vars[t]??0);return Number.isFinite(n)?n:0},an=e=>{let t=Math.abs(e);for(let[n,s]of [[1e12,"T"],[1e9,"B"],[1e6,"M"],[1e3,"K"]])if(t>=n)return `${(e/n).toFixed(t>=n*100?0:1).replace(/\.0$/,"")}${s}`;return String(Math.floor(e))},dd=new WeakMap,pd=e=>dd.get(e),Go=[1,10,0],va={id:"tycoon",version:2,engines:["phaser"],requires:["round"],params:{difficulty:{type:"number",default:.5,min:0,max:1},coinReward:{type:"number",default:1,min:0,max:10}},setup({world:e$1,params:t,mode:n}){let s=l=>nn(t,l),r=e$1.rng.stream("tycoon"),o=pn(n,"events",Qr.map(l=>l.id)),c=ro(1,s("difficulty")),d=zo(c.def),x=new Map,_=new Map,O=null,M=[],$=0,G=0,B=0,Q=0,ae=0,q=false,ue=false,fe=0,ie=null,ve=null,se=null,Me=()=>eo.find(l=>l.id===e$1.vars["meta:hero"])??eo[0],De=()=>na(Me().skill),ge=()=>e$1.vars.reviving===true,oe=()=>c.def.goals,ce=()=>{let l=Ie(e$1);return {...l,U:Math.min(l.w,l.h)}},Ae=l=>{let u=ce(),b=Math.max(1,d.biz.length),A=u.h*.25,I=u.h*.81,N=Math.max(6,u.h*.012),U=Math.min((I-A-N*(b-1))/b,150,u.w*.26),X=Math.min(u.w*.96,660),ye=A+(I-A-(b*U+(b-1)*N))/2;return {x:u.w/2,y:ye+l*(U+N)+U/2,w:X,h:U}},Se=l=>{let u=Ae(l);return {x:u.x-u.w/2+u.h*.56,y:u.y,size:u.h*.9}},ee=()=>ce().h*.9,xe=()=>{let l=ce();return Math.min(l.U*.075,l.h*.055)},je=()=>{let l=ce(),u=ve?1-ve.left/ve.def.ttl:0;return {x:-l.w*.05+u*l.w*1.1,y:l.h*.21,r:l.U*.06}},we=new Set,te=(l,u,b,A,I=1)=>{we.add(l);let N=x.get(l);(N===void 0||!e$1.isAlive(N))&&(N=e$1.create(),e$1.set(N,qp,{id:l}),x.set(l,N)),e$1.set(N,e,{x:u,y:b,scale:I}),e$1.set(N,f,A);},me=()=>{for(let[l,u]of [...x])we.has(l)||(e$1.destroy(u),x.delete(l));},Ee=(l,u,b,A,I,N,U=70)=>te(l,u,b,{shape:"text",text:A,size:Math.max(9,Math.round(N)),color:I,bold:true,depth:U}),Re=(l,u,b,A,I,N,U,X=2)=>{te(`${l}:bg`,u,b,{shape:"rect",w:A+4,h:I+4,color:"#000000",alpha:.4,radius:(I+4)/2,depth:X});let ye=Math.max(1,A*Math.max(0,Math.min(1,N)));te(`${l}:fill`,u-A/2+ye/2,b,{shape:"rect",w:ye,h:I,color:U,radius:I/2,depth:X+.1});},Ce=l=>M.push(l),Y=l=>{let u=d.biz[l],b=Go[ae]??1;return b===0?Math.max(1,pl(d,u)):b},Le=()=>{d.biz.forEach((l,u)=>{let b=Ae(u),A=Se(u),I=l.level>0,N=l.def.color;te(`r${u}`,b.x,b.y,{shape:"sprite",art:"panel",w:b.w,h:b.h,color:"panel",depth:0}),l.rush>0&&te(`r${u}:rush`,A.x,A.y,{shape:"circle",r:A.size*.55,color:"coin",alpha:.35+.2*Math.sin(e$1.time*8),depth:.5});let U=l.ready?1+.06*Math.abs(Math.sin(e$1.time*6)):1;te(`r${u}:b`,A.x,A.y,{shape:"sprite",art:l.def.art,w:A.size,h:A.size,color:N,alpha:I?l.broken>0?.55:1:.35,depth:1},U),Ce({id:`biz${u}`,x:A.x,y:A.y,w:A.size,h:A.size});let X=b.x-b.w*.12,ye=b.h*.2,ke=Wo(l.level);if(Ee(`r${u}:lv`,X,b.y-b.h*.26,I?`Lv ${l.level}${ke.next?`/${ke.next}`:""}`:"Lv 0","text",ye,2),I){Ee(`r${u}:inc`,X,b.y+b.h*0,`+${an(mn(d,l))}`,"coin",ye*.95,2);let a=l.ready||Jn(d,l)<=.15&&l.manager?1:l.progress;Re(`r${u}:bar`,X,b.y+b.h*.28,b.w*.3,Math.max(6,b.h*.12),a,l.broken>0?"danger":N),l.ready&&!l.manager&&Ee(`r${u}:ok`,A.x+A.size*.36,A.y+A.size*.34,"$","coin",A.size*.3,3);}if(ie?.index===u){let a=1+.12*Math.sin(e$1.time*9);te(`r${u}:ev`,A.x+A.size*.32,A.y-A.size*.3,{shape:"sprite",art:ie.def.art,w:A.size*.5,h:A.size*.5,depth:4},a);}else l.broken>0&&(te(`r${u}:ev`,A.x+A.size*.3,A.y-A.size*.28,{shape:"sprite",art:"ty_wrench",w:A.size*.48,h:A.size*.48,depth:4},1+.08*Math.sin(e$1.time*10)),Ee(`r${u}:evn`,A.x+A.size*.3,A.y+A.size*.05,String(l.broken),"danger",A.size*.26,4.1));let Ue=b.x+b.w*.13,st=b.h*.27;if(I&&!l.manager){let a=no(d,l),S=d.cash>=a;te(`r${u}:m:bg`,Ue,b.y-b.h*.08,{shape:"circle",r:st,color:S?"secondary":"panel",alpha:S?.95:.7,depth:1}),te(`r${u}:m`,Ue,b.y-b.h*.08,{shape:"sprite",art:"ty_manager",w:st*1.7,h:st*1.7,alpha:S?1:.5,depth:1.2}),Ee(`r${u}:m:p`,Ue,b.y+b.h*.32,an(a),S?"text":"muted",ye*.8,2),Ce({id:`mgr${u}`,x:Ue,y:b.y,w:st*2.2,h:b.h*.9});}let Pe=b.x+b.w/2-b.w*.14,re=b.w*.25,H=b.h*.72,J=Y(u),j=Zn(d,l,J),k=d.cash>=j;te(`r${u}:buy`,Pe,b.y,{shape:"sprite",art:"button",w:re,h:H,color:k?"accent":"panel",alpha:k?1:.6,depth:1}),Ee(`r${u}:buy:n`,Pe,b.y-H*.2,I?`+${J}`:"OPEN","text",ye*.9,2),te(`r${u}:buy:c`,Pe-re*.3,b.y+H*.2,{shape:"sprite",art:"coin",w:ye*.8,h:ye*.8,depth:2}),Ee(`r${u}:buy:p`,Pe+re*.08,b.y+H*.2,an(j),k?"coin":"muted",ye*.85,2),Ce({id:`buy${u}`,x:Pe,y:b.y,w:re,h:H});let E=_.get(u);if(l.manager&&(E===void 0||!e$1.isAlive(E))&&(E=e$1.create(),e$1.set(E,ml,{index:u}),e$1.set(E,f,{shape:"actor",cast:"helper",variant:u*13+5,h:b.h*.78,pose:"idle",facing:1,depth:2}),_.set(u,E)),E!==void 0&&e$1.isAlive(E)){e$1.set(E,e,{x:Ue,y:b.y+b.h*.02});let a=e$1.need(E,f);a.shape==="actor"&&(a.h=b.h*.78);}});},Ye=l=>l.kind==="cash"?"coin":l.kind==="managers"?"ty_manager":yr(l.biz??"")?.art??"biz1",at=l=>l.kind==="cash"?d.earned:l.kind==="managers"?ma(d):d.biz.find(u=>u.def.id===l.biz)?.level??0,_e=()=>{let l=ce(),u=l.U,b=l.h*.09;te("h:t:i",l.w*.09,b,{shape:"sprite",art:"hourglass",w:u*.06,h:u*.06,depth:70}),Ee("h:t",l.w*.09+u*.09,b,Zo($),$<=15?"danger":"text",u*.05),te("h:c:i",l.w*.42,b,{shape:"sprite",art:"coin",w:u*.07,h:u*.07,depth:70}),Ee("h:c",l.w*.42+u*.13,b,an(d.cash),"coin",u*.065);let A=u*.17;te("h:mode",l.w*.88,b,{shape:"sprite",art:"button",w:A,h:u*.08,color:"secondary",depth:70}),Ee("h:mode:t",l.w*.88,b,Go[ae]===0?"MAX":`\xD7${Go[ae]}`,"text",u*.042,70.1),Ce({id:"mode",x:l.w*.88,y:b,w:A,h:u*.09});let I=oe(),N=Math.min(l.w*.3,230),U=Math.max(30,l.h*.05),X=l.h*.15;if(I.forEach((re,H)=>{let J=l.w/2+(H-(I.length-1)/2)*(N+u*.02),j=$n(d,re)>=1;te(`h:g${H}`,J,X,{shape:"sprite",art:"panel",w:N,h:U,color:j?"accent":"panel",depth:70}),te(`h:g${H}:i`,J-N*.36,X-U*.06,{shape:"sprite",art:Ye(re),w:U*.75,h:U*.75,depth:70.1});let k=at(re),E=j?"\u2713":re.kind==="cash"?`${an(k)}/${an(re.n)}`:re.kind==="level"?`Lv ${k}/${re.n}`:`${k}/${re.n}`;Ee(`h:g${H}:t`,J+N*.1,X-U*.08,E,"text",U*.36,70.1),Re(`h:g${H}:bar`,J+N*.1,X+U*.3,N*.62,Math.max(4,U*.1),$n(d,re),j?"accent":"coin",70.1);}),d.timed.forEach((re,H)=>{let J=l.w*.9-H*u*.16,j=re.id==="sale"?"ty_sk_sale":re.id==="invest"?"ty_investor":De().art;te(`h:tm${H}`,J-u*.04,l.h*.205,{shape:"sprite",art:j,w:u*.06,h:u*.06,depth:70}),Ee(`h:tm${H}:t`,J+u*.035,l.h*.205,`${Math.ceil(re.left)}`,"secondary",u*.04);}),ve){let re=je();te("h:courier",re.x,re.y+Math.sin(e$1.time*10)*re.r*.08,{shape:"sprite",art:ve.def.art,w:re.r*2,h:re.r*2,depth:72}),Ce({id:"courier",x:re.x,y:re.y,w:re.r*2.6,h:re.r*2.6});}let ye=ee(),ke=xe(),Ue=l.w*.25,st=Q>=De().charge;st&&te("h:sk:glow",Ue,ye,{shape:"circle",r:ke*1.28,color:"secondary",alpha:.5+.3*Math.sin(e$1.time*7),depth:68.9}),te("h:sk:bg",Ue,ye,{shape:"circle",r:ke,color:"panel",alpha:.95,depth:69}),te("h:sk",Ue,ye,{shape:"sprite",art:De().art,w:ke*1.4,h:ke*1.4,alpha:st?1:.45,depth:69.2}),Re("h:charge",Ue,ye+ke*1.3,ke*2,Math.max(5,ke*.2),Q/De().charge,"secondary",69),Ce({id:"skill",x:Ue,y:ye,w:ke*2.4,h:ke*2.4}),fa(d,3).forEach((re,H)=>{let J=l.w*(.47+H*.18),j=d.cash>=re.price;te(`h:u${H}:bg`,J,ye,{shape:"circle",r:ke,color:j?"accent":"panel",alpha:j?.95:.7,depth:69}),te(`h:u${H}`,J,ye-ke*.08,{shape:"sprite",art:re.def.art,w:ke*1.5,h:ke*1.5,alpha:j?1:.55,depth:69.2});let k=re.index>=0?d.biz[re.index]:void 0;k&&te(`h:u${H}:b`,J+ke*.7,ye-ke*.6,{shape:"sprite",art:k.def.art,w:ke*.9,h:ke*.9,color:k.def.color,depth:69.3}),Ee(`h:u${H}:p`,J,ye+ke*1.3,an(re.price),j?"coin":"muted",ke*.42,69.3),Ce({id:`up:${re.key}`,x:J,y:ye,w:ke*2.3,h:ke*2.6});}),(O===null||!e$1.isAlive(O))&&(O=e$1.create(),e$1.set(O,f,{shape:"actor",cast:Me().cast,h:ke*2.6,pose:"idle",facing:1,depth:20})),e$1.set(O,e,{x:l.w*.09,y:ye-ke*.1});let Pe=e$1.need(O,f);if(Pe.shape==="actor"&&(Pe.h=ke*2.6),se){let re=Math.min(l.w*.86,500),H=re*.42,J=l.w/2,j=l.h*.5;te("h:inv:dim",J,j,{shape:"rect",w:l.w,h:l.h,color:"#000000",alpha:.35,depth:79}),te("h:inv",J,j,{shape:"sprite",art:"panel",w:re,h:H,color:"panel",depth:80}),te("h:inv:i",J-re*.34,j,{shape:"sprite",art:se.def.art,w:H*.62,h:H*.62,depth:80.1});let k=re*.3,E=H*.5,a=Ke();te("h:inv:a",J+re*.02,j-H*.04,{shape:"sprite",art:"button",w:k,h:E,color:"accent",depth:80.1}),te("h:inv:a:c",J+re*.02-k*.28,j-H*.04,{shape:"sprite",art:"coin",w:E*.4,h:E*.4,depth:80.2}),Ee("h:inv:a:t",J+re*.02+k*.1,j-H*.04,an(a),"coin",E*.3,80.2),te("h:inv:b",J+re*.33,j-H*.04,{shape:"sprite",art:"button",w:k,h:E,color:"secondary",depth:80.1}),Ee("h:inv:b:t",J+re*.33,j-H*.04,`\xD7${se.def.mult??2} ${se.def.seconds??30}s`,"text",E*.28,80.2),Re("h:inv:bar",J+re*.17,j+H*.32,re*.6,Math.max(4,H*.05),se.left/se.def.ttl,"coin",80.1),Ce({id:"inv_now",x:J+re*.02,y:j-H*.04,w:k,h:E}),Ce({id:"inv_share",x:J+re*.33,y:j-H*.04,w:k,h:E});}},Pt=()=>{M=[],we.clear(),Le(),_e(),me(),e$1.vars.ty_buttons=M.map(l=>`${l.id}@${Math.round(l.x)},${Math.round(l.y)}`).join(";");},Ge=()=>{e$1.vars.cash=Math.floor(d.cash),e$1.vars.earned=Math.floor(d.earned),e$1.vars.time_left=$,e$1.vars.ty_charge=Math.floor(Q),e$1.vars.ty_mode=Go[ae]??1,e$1.vars.level_progress=ya(d,oe()),e$1.vars.ty_goals=oe().map(l=>`${l.kind}:${Math.floor(at(l))}/${l.n}`).join("|");},Xe=()=>{for(let u of [...x.values(),..._.values()])e$1.isAlive(u)&&e$1.destroy(u);x.clear(),_.clear(),O!==null&&e$1.isAlive(O)&&e$1.destroy(O),O=null,c=ro(oo(e$1,"meta:chapter")||1,s("difficulty"));let l={income:oo(e$1,"meta:income"),speed:oo(e$1,"meta:speed"),discount:oo(e$1,"meta:discount")};d=zo(c.def,l,Math.round(c.cash*(1+oo(e$1,"meta:cash")))),dd.set(e$1,{s:d,level:c}),Tt(e$1,"board",Ie(e$1).h*.24),$=c.day,G=0,B=0,Q=0,q=false,ue=false,fe=8+r.range(0,4),ie=null,ve=null,se=null,e$1.vars.ty_level=c.level,e$1.vars.ty_world=c.world,e$1.vars.coins=0,e$1.vars.score=0,e$1.vars.stars=0,e$1.vars.reviving=false,Ge();},tt=l=>{if(ue)return;ue=true;let u=l==="cleared",b=ya(d,oe()),A=u?Math.min(q?1:3,ra($/Math.max(1,c.day))):0,I=Math.round(c.coins*s("coinReward")*(u?[1,1,1.25,1.5][A]:b*.5));I>0&&(qe(e$1,"coins",I),e$1.emit("coin-collected",{value:I})),u&&e$1.vars["meta:first_clear"]===true&&qe(e$1,"coins",c.firstClearGold),e$1.vars.stars=A,e$1.vars.score=Math.round(b*1e3)+(u?A*500+Math.floor($)*10:0),e$1.vars.reviving=false,ie=null,ve=null,se=null,Ge(),e$1.emit(Bt,{reason:l,stats:{chapter:c.level,seconds:Math.floor(G),cleared:u,stars:A,coins:Number(e$1.vars.coins??0),earned:Math.floor(d.earned),managers:ma(d)}});},ot=()=>{ue||(V(e$1,{kind:"flash",color:"coin"}),tt("cleared"));},ct=()=>{if(e$1.vars.revive_ready===true&&!q){e$1.vars.reviving=true,e$1.emit(Gt,{});return}tt("out-of-time");},it=()=>{ge()&&(q=true,e$1.vars.reviving=false,$+=oa,V(e$1,{kind:"flash",color:"coin"}),Ge());},bt=()=>Math.max(aa(d),c.cash*.05),Ke=()=>Math.round(bt()*(se?.def.now??25)),ze=l=>{Q=Math.min(De().charge,Q+td),e$1.emit("event-handled",{id:l});},_t=()=>{let l=d.biz.map((U,X)=>({b:U,i:X})).filter(U=>U.b.level>0&&U.b.broken===0),u=U=>U.effect==="rush"?!ie&&l.some(X=>X.b.rush<=0):U.effect==="break"?!d.biz.some(X=>X.broken>0)&&l.some(X=>X.b.level>=3):U.effect==="invest"?!se:!ve,b=c.def.events.filter(U=>o.includes(U)).map(U=>Qr.find(X=>X.id===U)).filter(U=>!!U&&u(U));if(!b.length)return;let A=b.reduce((U,X)=>U+X.weight,0),I=r.range(0,A),N=b.find(U=>(I-=U.weight)<0)??b[0];if(N.effect==="rush"){let U=l.filter(X=>X.b.rush<=0);ie={index:U[r.int(0,U.length-1)].i,left:N.ttl,def:N};}else if(N.effect==="break"){let U=l.filter(ye=>ye.b.level>=3),X=U[r.int(0,U.length-1)];X.b.broken=N.taps??3,V(e$1,{kind:"shake",power:.3});}else N.effect==="invest"?se={left:N.ttl,def:N}:ve={left:N.ttl,def:N};e$1.emit("event-started",{id:N.id});},Fe=l=>{ie&&(ie.left-=l)<=0&&(ie=null),ve&&(ve.left-=l)<=0&&(ve=null),se&&(se.left-=l)<=0&&(se=null),c.def.events.length&&(fe-=l,fe<=0&&(_t(),fe=r.range(rl[0],rl[1])));},Ct=l=>{let u=d.biz[l];if(!u||u.level<=0)return;let b=Se(l);if(u.broken>0){V(e$1,{kind:"burst",x:b.x,y:b.y,color:"ground",n:6,size:b.size*.6}),da(d,l)&&(V(e$1,{kind:"ring",x:b.x,y:b.y,color:"accent",size:b.size*1.2}),ze("break"));return}ie?.index===l&&(u.rush=ie.def.seconds??10,u.rushMult=ie.def.mult??3,V(e$1,{kind:"ring",x:b.x,y:b.y,color:"coin",size:b.size*1.4}),V(e$1,{kind:"pop",x:b.x,y:b.y-b.size*.45,text:`\xD7${u.rushMult}`,color:"coin",size:Math.round(b.size*.3)}),ie=null,ze("rush"));let A=ca(d,l);A<=0||(Q=Math.min(De().charge,Q+ed),vt(e$1,"tycoon-collect"),V(e$1,{kind:"burst",x:b.x,y:b.y,color:"coin",n:8,size:b.size*.7}),V(e$1,{kind:"pop",x:b.x,y:b.y-b.size*.35,text:`+${an(A)}`,color:"coin",size:Math.round(b.size*.24)}),e$1.emit("cycle-collected",{index:l,amount:A}));},Ht=l=>{let u=d.biz[l];if(!u)return;let b=ia(d,l,Y(l)),A=Ae(l),I=A.x+A.w/2-A.w*.14;if(!b.ok){V(e$1,{kind:"shake",power:.1});return}vt(e$1,"tycoon-buy");let N=Se(l);V(e$1,{kind:"ring",x:N.x,y:N.y,color:"coin",size:N.size*1.1}),V(e$1,{kind:"burst",x:I,y:A.y,color:"accent",n:5,size:A.h*.5}),e$1.emit("business-bought",{id:u.def.id,level:u.level});for(let U of b.milestones)V(e$1,{kind:"flash",color:"coin"}),V(e$1,{kind:"pop",x:N.x,y:N.y-N.size*.5,text:`\u2605 ${U}`,color:"coin",size:Math.round(N.size*.3)}),e$1.emit("milestone",{id:u.def.id,at:U});},It=l=>{let u=d.biz[l];if(!u||!la(d,l))return;vt(e$1,"tycoon-manager");let b=Se(l);V(e$1,{kind:"ring",x:b.x,y:b.y,color:"secondary",size:b.size*1.3}),V(e$1,{kind:"pop",x:b.x,y:b.y-b.size*.5,text:"\u2605",color:"secondary",size:Math.round(b.size*.35)}),e$1.emit("manager-hired",{id:u.def.id});},tn=(l,u,b)=>{ha(d,l)&&(vt(e$1,"tycoon-upgrade"),V(e$1,{kind:"ring",x:u,y:b,color:"accent",size:xe()*2.6}),V(e$1,{kind:"flash",color:"accent"}),e$1.emit("upgrade-bought",{key:l}));},pt=()=>{let l=De();if(Q<l.charge)return false;let u=1+oo(e$1,"meta:skill");if(Q=0,O!==null&&He(e$1,O,"cheer"),V(e$1,{kind:"flash",color:"secondary"}),l.effect==="rush")pa(d,{id:"skill",left:(l.seconds??12)*u,income:l.mult??5,price:1});else if(l.effect==="sale")pa(d,{id:"sale",left:(l.seconds??15)*u,income:1,price:l.mult??.5});else {let b=ul(d,Math.max(1,Math.round((l.cycles??8)*u))),A=ce();V(e$1,{kind:"pop",x:A.w/2,y:A.h*.16,text:`+${an(b)}`,color:"coin",size:Math.round(A.U*.07)}),d.biz.forEach((I,N)=>{if(I.level<=0)return;let U=Se(N);V(e$1,{kind:"burst",x:U.x,y:U.y,color:"coin",n:10,size:U.size*.8});});}return e$1.emit("skill-cast",{id:l.id}),vt(e$1,"tycoon-skill"),true},w=()=>{if(!ve)return;let l=je(),u=Math.round(bt()*(ve.def.now??15));fl(d,u);let b=Math.round((ve.def.coins??0)*s("coinReward"));b>0&&(qe(e$1,"coins",b),e$1.emit("coin-collected",{value:b})),V(e$1,{kind:"burst",x:l.x,y:l.y,color:"coin",n:14,size:l.r*2}),V(e$1,{kind:"pop",x:l.x,y:l.y+l.r*1.4,text:`+${an(u)}`,color:"coin",size:Math.round(l.r*.7)}),ve=null,ze("courier");},f$1=l=>{if(!se)return;let u=se.def;l?pa(d,{id:"invest",left:u.seconds??30,income:u.mult??2,price:1}):fl(d,Ke()),se=null,V(e$1,{kind:"flash",color:"coin"}),ze("invest");},m=(l,u,b)=>M.find(A=>(!b||A.id.startsWith(b))&&Math.abs(l-A.x)<=A.w/2&&Math.abs(u-A.y)<=A.h/2);e$1.on(j,l=>{let u=l;if(u.type!=="tap"||!Ze(e$1)||Kn(e$1)||ue||ge())return;Ot(e$1),B=0;let b=se?m(u.x,u.y,"inv_")??m(u.x,u.y):m(u.x,u.y,"courier")??m(u.x,u.y);b&&(b.id==="inv_now"?f$1(false):b.id==="inv_share"?f$1(true):b.id==="courier"?w():b.id==="mode"?ae=(ae+1)%Go.length:b.id==="skill"?pt():b.id.startsWith("up:")?tn(b.id.slice(3),b.x,b.y):b.id.startsWith("biz")?Ct(Number(b.id.slice(3))):b.id.startsWith("buy")?Ht(Number(b.id.slice(3))):b.id.startsWith("mgr")&&It(Number(b.id.slice(3))),Ge(),Vo(d,oe())&&ot());}),e$1.on($t,()=>{Xe(),e$1.vars.level=c.level;}),e$1.on(Wt,Xe),e$1.on(Kt,it),e$1.on(Ft,()=>{ge()&&(e$1.vars.reviving=false,tt("out-of-time"));}),e$1.on(zt,l=>{we.clear(),me(),M=[],e$1.vars.ty_buttons="",O!==null&&e$1.isAlive(O)&&et(e$1,O,l.reason==="cleared"?"dance":"idle");}),e$1.on(k,()=>Tt(e$1,"board",Ie(e$1).h*.24));let p=l=>{if(!l)return;let u=l.kind==="collect"||l.kind==="fix"?`biz${l.index}`:l.kind==="buy"?`buy${l.index}`:l.kind==="hire"?`mgr${l.index}`:`up:${l.key}`;return M.find(b=>b.id===u)},y=l=>{let u=ce().U,b=d.biz.findIndex(A=>A.ready);if(!ht(l,"tycoon-collect")&&b>=0){let A=Se(b);return ft(l,"tap",A,void 0,A.size*.8)}if(!ht(l,"tycoon-buy")){let A=d.biz.findIndex(N=>d.cash>=Zn(d,N,Y(d.biz.indexOf(N)))),I=M.find(N=>N.id===`buy${A}`);if(A>=0&&I)return ft(l,"tap",I,void 0,I.h)}if(!ht(l,"tycoon-manager")){let A=d.biz.findIndex(N=>N.level>0&&!N.manager&&d.cash>=no(d,N)),I=M.find(N=>N.id===`mgr${A}`);if(A>=0&&I)return ft(l,"tap",I,void 0,I.w)}if(Q>=De().charge&&!ht(l,"tycoon-skill")){let A=M.find(I=>I.id==="skill");if(A)return ft(l,"tap",A,void 0,A.w)}if(B>6){let A=p(ga(d,oe()));A&&ft(l,"tap",A,void 0,Math.min(A.w,u*.18));}};e$1.addSystem({id:"tycoon",order:0,run(l,u){if(!(!Ze(l)||ue)){if(!ge()){G+=u,B+=u,$=Math.max(0,$-u);for(let b of ua(d,u).paid)b.amount<=0||l.emit("cycle-collected",{index:b.index,amount:b.amount});Q=Math.min(De().charge,Q+u),Fe(u);}if(Pt(),Ge(),!ge()){if(Vo(d,oe()))return ot();un(l)||y(l),$<=0&&ct();}}}}),Xe();}};var Bn=(e,t,n,s,r,o,c,d,x)=>({en:e,ru:t,kz:n,zh:s,ko:r,ja:o,hi:c,pt:d,de:x}),xa=Bn("Score","\u041E\u0447\u043A\u0438","\u04B0\u043F\u0430\u0439","\u5206\u6570","\uC810\uC218","\u30B9\u30B3\u30A2","\u0938\u094D\u0915\u094B\u0930","Pontos","Punkte"),gl={id:"fantasy",version:1,setting:"fantasy",names:Bn("Fantasy","\u0424\u044D\u043D\u0442\u0435\u0437\u0438","\u0424\u044D\u043D\u0442\u0435\u0437\u0438","\u5947\u5E7B","\uD310\uD0C0\uC9C0","\u30D5\u30A1\u30F3\u30BF\u30B8\u30FC","\u092B\u093C\u0948\u0902\u091F\u0947\u0938\u0940","Fantasia","Fantasy"),palette:{background:"#1f2a1d",ground:"#3b4a2e",lane:"#56683f",primary:"#4fa3e0",secondary:"#8e5bd1",danger:"#d0483b",coin:"#f2c14e",accent:"#6fbf4a",text:"#fff6e0",muted:"#b9b08f",piece1:"#e0443e",piece2:"#3f7fe0",piece3:"#43b05c",piece4:"#f2c14e",piece5:"#9b59d0",piece6:"#ef8a2f",panel:"#3a2f25"},texts:{"res.coins":Bn("Gold","\u0417\u043E\u043B\u043E\u0442\u043E","\u0410\u043B\u0442\u044B\u043D","\u91D1\u5E01","\uACE8\uB4DC","\u30B4\u30FC\u30EB\u30C9","\u0938\u094B\u0928\u093E","Ouro","Gold"),"res.score":xa},races:["human","elf","dwarf","orc","undead"],cast:{hero:{preset:"knight",races:["human"]},foe:{preset:"berserker",parts:{Hat:null,Offhand:null,Weapon:"weapon/battle_axe"},races:["orc"]},foe2:{preset:"viking",parts:{Weapon:"weapon/double_axe"},races:["orc"]},boss:{preset:"dark_knight",races:["orc"]},helper:{preset:"hunter",parts:{Weapon:null,Hat:null},races:["elf","dwarf","human"]},foe3:{preset:"crossbowman",parts:{Weapon:"weapon/crossbow"},races:["undead"]},foe4:{preset:"lumberjack",parts:{Weapon:"weapon/spear",Back:null},races:["undead"]},foe5:{preset:"hunter",parts:{Hat:null,Back:null,Weapon:"weapon/dagger"},races:["undead"]},hero2:{preset:"crusader",races:["human","dwarf"]},hero3:{preset:"archmage",races:["elf"]}}},bl={id:"sci-fi",version:1,setting:"sci-fi",names:Bn("Sci-fi","\u041D\u0430\u0443\u0447\u043D\u0430\u044F \u0444\u0430\u043D\u0442\u0430\u0441\u0442\u0438\u043A\u0430","\u0492\u044B\u043B\u044B\u043C\u0438 \u0444\u0430\u043D\u0442\u0430\u0441\u0442\u0438\u043A\u0430","\u79D1\u5E7B","SF","SF","\u0935\u093F\u091C\u094D\u091E\u093E\u0928 \u0915\u0925\u093E","Fic\xE7\xE3o cient\xEDfica","Science-Fiction"),palette:{background:"#0b1020",ground:"#151d33",lane:"#22305a",primary:"#36e3ff",secondary:"#b45cff",danger:"#ff3d6e",coin:"#ffe14d",accent:"#3dff9a",text:"#e8f6ff",muted:"#7d8fb3",piece1:"#ff3d6e",piece2:"#36a3ff",piece3:"#3dff9a",piece4:"#ffe14d",piece5:"#b45cff",piece6:"#ff8f3d",panel:"#18213d"},texts:{"res.coins":Bn("Chips","\u0427\u0438\u043F\u044B","\u0427\u0438\u043F\u0442\u0435\u0440","\u82AF\u7247","\uCE69","\u30C1\u30C3\u30D7","\u091A\u093F\u092A\u094D\u0938","Chips","Chips"),"res.score":xa},races:["human"],cast:{hero:{preset:"soldier",races:["human"]},foe:{preset:"soldier",parts:{Hat:"hat/great_helm",Weapon:"weapon/pistol"},races:["undead"]},foe2:{preset:"gunslinger",parts:{Weapon:"weapon/rifle",Back:null},races:["orc"]},boss:{preset:"dark_knight",parts:{Weapon:"weapon/flame_sword"},races:["orc"]},helper:{preset:"gunslinger",parts:{Weapon:null,Back:null},races:["elf","human"]},foe3:{preset:"gunslinger",parts:{Weapon:"weapon/pistol",Back:null},races:["undead"]},foe4:{preset:"soldier",parts:{Hat:"hat/great_helm",Weapon:"weapon/spear"},races:["orc"]},foe5:{preset:"soldier",parts:{Hat:null,Back:null,Weapon:"weapon/dagger"},races:["undead"]},hero2:{preset:"musketeer",parts:{Weapon:"weapon/rifle"},races:["human"]},hero3:{preset:"archmage",parts:{Weapon:"weapon/wizard_staff"},races:["elf","human"]}}},vl={id:"cozy",version:1,setting:"cozy",names:Bn("Cozy cartoon","\u0423\u044E\u0442\u043D\u044B\u0439 \u043C\u0443\u043B\u044C\u0442\u044F\u0448\u043D\u044B\u0439","\u0416\u0430\u0439\u043B\u044B \u043C\u0443\u043B\u044C\u0442\u0444\u0438\u043B\u044C\u043C","\u6E29\u99A8\u5361\u901A","\uC544\uB291\uD55C \uCE74\uD230","\u307B\u306E\u307C\u306E\u30AB\u30FC\u30C8\u30A5\u30FC\u30F3","\u0906\u0930\u093E\u092E\u0926\u093E\u092F\u0915 \u0915\u093E\u0930\u094D\u091F\u0942\u0928","Cartoon aconchegante","Gem\xFCtlicher Cartoon"),palette:{background:"#fdf1e4",ground:"#f3d9bf",lane:"#e9c6a3",primary:"#ff8fab",secondary:"#8fb8ff",danger:"#ff6b6b",coin:"#ffb627",accent:"#7ccf8a",text:"#3d2b25",muted:"#9c8478",piece1:"#ff8fab",piece2:"#7fb8ff",piece3:"#8cd98f",piece4:"#ffd166",piece5:"#c39bff",piece6:"#ffa96b",panel:"#fff8f0"},texts:{"res.coins":Bn("Coins","\u041C\u043E\u043D\u0435\u0442\u043A\u0438","\u0422\u0438\u044B\u043D\u0434\u0430\u0440","\u786C\u5E01","\uCF54\uC778","\u30B3\u30A4\u30F3","\u0938\u093F\u0915\u094D\u0915\u0947","Moedas","M\xFCnzen"),"res.score":xa},races:["human","elf","dwarf"],cast:{hero:{preset:"camper",parts:{Glasses:null},races:["human"]},foe:{preset:"lumberjack",parts:{Weapon:"weapon/3",Back:null},races:["orc"]},foe2:{preset:"lumberjack",parts:{Weapon:null,Back:null},races:["dwarf"]},boss:{preset:"viking",races:["orc"]},helper:{preset:"camper",parts:{Weapon:null,Back:null,Glasses:null},races:["human","elf","dwarf"]},foe3:{preset:"hunter",parts:{Weapon:"weapon/hunting_bow"},races:["orc"]},foe4:{preset:"quarterback",races:["orc"]},foe5:{preset:"camper",parts:{Weapon:null,Back:null,Glasses:null},races:["orc"]},hero2:{preset:"quarterback",races:["human"]},hero3:{preset:"wizard",races:["elf"]}}},xl={id:"post-apocalypse",version:1,setting:"post-apocalypse",names:Bn("Post-apocalypse","\u041F\u043E\u0441\u0442\u0430\u043F\u043E\u043A\u0430\u043B\u0438\u043F\u0441\u0438\u0441","\u041F\u043E\u0441\u0442\u0430\u043F\u043E\u043A\u0430\u043B\u0438\u043F\u0441\u0438\u0441","\u672B\u65E5\u5E9F\u571F","\uD3EC\uC2A4\uD2B8 \uC544\uD3EC\uCE7C\uB9BD\uC2A4","\u30DD\u30B9\u30C8\u30A2\u30DD\u30AB\u30EA\u30D7\u30B9","\u092A\u094D\u0930\u0932\u092F \u0915\u0947 \u092C\u093E\u0926","P\xF3s-apocalipse","Postapokalypse"),palette:{background:"#1d1a16",ground:"#3a3328",lane:"#4d4436",primary:"#d9a441",secondary:"#7a8f5b",danger:"#b8402d",coin:"#e0c060",accent:"#8fa35a",text:"#f0e6d2",muted:"#a39a86",piece1:"#b8402d",piece2:"#5a7f9a",piece3:"#7a8f5b",piece4:"#e0c060",piece5:"#8a6a4a",piece6:"#d9762f",panel:"#2c2620"},texts:{"res.coins":Bn("Caps","\u041A\u0440\u044B\u0448\u043A\u0438","\u049A\u0430\u049B\u043F\u0430\u049B\u0442\u0430\u0440","\u74F6\u76D6","\uBCD1\uB69C\uAED1","\u30AD\u30E3\u30C3\u30D7","\u0922\u0915\u094D\u0915\u0928","Tampinhas","Kronkorken"),"res.score":xa},races:["human","undead","orc"],cast:{hero:{preset:"soldier",parts:{Hat:null,Gloves:"gloves/bracers"},races:["human"]},foe:{preset:"lumberjack",parts:{Weapon:null,Back:null,Gloves:null},races:["undead"]},foe2:{preset:"berserker",parts:{Hat:null,Offhand:null,Weapon:"weapon/mace"},races:["orc"]},boss:{preset:"berserker",parts:{Hat:"hat/great_helm",Weapon:"weapon/double_axe"},races:["orc"]},helper:{preset:"soldier",parts:{Hat:null,Weapon:null},races:["human"]},foe3:{preset:"musketeer",parts:{Weapon:"weapon/musket",Hat:null},races:["undead"]},foe4:{preset:"viking",parts:{Weapon:"weapon/mace"},races:["undead"]},foe5:{preset:"lumberjack",parts:{Weapon:"weapon/dagger",Back:null},races:["undead"]},hero2:{preset:"viking",parts:{Hat:null},races:["human"]},hero3:{preset:"ranger",races:["human"]}}},so=[gl,bl,vl,xl],yl=(e,t)=>(e.flows??[]).some(n=>n.resource===t.resource&&n.by===t.by&&n.kind===t.kind)?e:{...e,flows:[...e.flows??[],t]},ud=e=>e.resources?.find(t=>t.kind==="currency")?.id??"coins",kl=e=>t=>yl(t,{resource:ud(t),by:`system:${e}`,kind:"sink"}),Sl={id:"hero-upgrade",version:1,name:"link.hero-upgrade",core:["runner","platformer","survivors","tower-defense"],systems:["character"],apply:kl("character")},El={id:"puzzle-city",version:1,name:"link.puzzle-city",core:["match3","merge"],systems:[],apply(e){if(e.modes.some(s=>s.id==="city"))return e;let t=ud(e),n={...e,modes:[...e.modes,{id:"city",preset:"tycoon",role:"meta"}]};return yl(yl(n,{resource:t,by:"city",kind:"source",amount:"vars.coins"}),{resource:t,by:"system:store",kind:"sink"})}},Ml={id:"runner-collection",version:1,name:"link.runner-collection",core:["runner","platformer"],systems:["lootboxes","collections"],apply:kl("lootboxes")},_l={id:"defense-boosts",version:1,name:"link.defense-boosts",core:["tower-defense","survivors"],systems:["boosts"],apply:kl("boosts")},ka=[Sl,El,Ml,_l];var fd=(e,t)=>`${e.character}-${t}`;var hd={id:"runner",version:1,engine:"phaser",genre:"runner",name:"preset.runner",blocks:["round","lane-runner"],params:{difficulty:{type:"number",default:.5,min:0,max:1},generosity:{type:"number",default:.6,min:0,max:1},lanes:{type:"number",default:3,min:2,max:5,integer:true},lives:{type:"number",default:3,min:1,max:9,integer:true},length:{type:"number",default:1,min:.05,max:5}},blockParams:{"lane-runner":{lanes:"params.lanes",lives:"params.lives",difficulty:"params.difficulty",coinRate:"0.5 + params.generosity * 0.4",powerRate:"0.12 + params.generosity * 0.2",lengthScale:"params.length"}},produces:["soft","score"],placements:[{id:"reward_window",kind:"reward-window"},{id:"revive",kind:"revive",dailyLimit:5}]},ao={difficulty:{type:"number",default:.5,min:0,max:1},generosity:{type:"number",default:.6,min:0,max:1}},io=[{id:"reward_window",kind:"reward-window"}],md={id:"platformer",version:1,engine:"phaser",genre:"platformer",name:"preset.platformer",blocks:["round","platformer"],params:{...ao,lives:{type:"number",default:3,min:1,max:9,integer:true},doubleJump:{type:"boolean",default:false}},blockParams:{platformer:{difficulty:"params.difficulty",lives:"params.lives",doubleJump:"params.doubleJump"}},produces:["soft","score"],placements:[...io,{id:"revive",kind:"revive",dailyLimit:5}]},yd={id:"survivors",version:1,engine:"phaser",genre:"survivors",name:"preset.survivors",blocks:["round","survivors"],params:{...ao,minutes:{type:"number",default:5,min:.5,max:15}},blockParams:{survivors:{duration:"params.minutes * 60",spawnRate:"0.9 + params.difficulty * 0.6",spawnGrowth:"0.6 + params.difficulty * 0.6",foeHpGrowth:"0.3 + params.difficulty * 0.3",foeDamage:"0.8 + params.difficulty * 0.4",coinRate:"0.15 + params.generosity * 0.3",hp:"120 - params.difficulty * 40"}},produces:["soft","score"],placements:[...io,{id:"revive",kind:"revive",dailyLimit:5},{id:"reroll",kind:"retry",dailyLimit:10}]},gd={id:"tower-defense",version:2,engine:"phaser",genre:"tower-defense",name:"preset.tower-defense",blocks:["round","tower-defense"],params:{...ao,lives:{type:"number",default:20,min:1,max:100,integer:true}},blockParams:{"tower-defense":{difficulty:"params.difficulty",lives:"params.lives",coinRate:"0.08 + params.generosity * 0.25",earlyGold:"1 + params.generosity * 2"}},produces:["soft","score"],placements:[...io,{id:"revive",kind:"revive",dailyLimit:5}]},bd={id:"match3",version:2,engine:"phaser",genre:"match3",name:"preset.match3",blocks:["round","match3"],params:{...ao},blockParams:{match3:{difficulty:"params.difficulty",coinEvery:"12 - params.generosity * 7"}},produces:["soft","score","stars"],placements:[...io,{id:"revive",kind:"revive",dailyLimit:5}]},vd={id:"merge",version:2,engine:"phaser",genre:"merge",name:"preset.merge",blocks:["round","merge"],params:{...ao},blockParams:{merge:{difficulty:"params.difficulty",orderReward:"0.6 + params.generosity * 0.8"}},produces:["soft","score","stars"],placements:[...io,{id:"revive",kind:"revive",dailyLimit:5}]},xd={id:"tycoon",version:2,engine:"phaser",genre:"idle-tycoon",name:"preset.tycoon",blocks:["round","tycoon"],params:{...ao},blockParams:{tycoon:{difficulty:"params.difficulty",coinReward:"0.6 + params.generosity * 0.8"}},produces:["soft","score","stars"],placements:[...io,{id:"revive",kind:"revive",dailyLimit:5}]},kd=[hd,md,yd,gd,bd,vd,xd],jp=[Qo,ns,Is,Gs,Zs,vs,As,va];function Xp(e){po(e);for(let t of jp)e.has(Vn,t.id)||e.define(Vn,t);for(let t of so)e.has(kr,t.id)||e.define(kr,t);for(let t of ka)e.has(uo,t.id)||e.define(uo,t);for(let t of kd)e.has(Gn,t.id)||e.define(Gn,t);}var Yp={v:1,engine:"phaser",seed:"demo-runner",modes:[{id:"run",preset:"runner",role:"core"}],resources:[{id:"coins",kind:"currency",ref:"CO",name:"res.coins"},{id:"score",kind:"score",name:"res.score"}],flows:[{resource:"coins",by:"run",kind:"source",amount:"vars.coins"},{resource:"coins",by:"system:store",kind:"sink"},{resource:"score",by:"run",kind:"source",amount:"vars.score"}],texts:{title:{en:"Lane Dash",ru:"\u0420\u044B\u0432\u043E\u043A \u043F\u043E \u043F\u043E\u043B\u043E\u0441\u0430\u043C"},hint:{en:"Swipe or tap a side to change lanes",ru:"\u0421\u0432\u0430\u0439\u043F \u0438\u043B\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0435 \u0441\u0431\u043E\u043A\u0443 \u043C\u0435\u043D\u044F\u0435\u0442 \u043F\u043E\u043B\u043E\u0441\u0443"}}};function Jp(e,t={}){let n=e==="runner"?"run":"main";return {v:1,engine:"phaser",seed:t.seed??e,modes:[{id:n,preset:e,role:"core",...t.params?{params:t.params}:{}}],resources:[{id:"coins",kind:"currency",ref:t.coinRef??"CO",name:"res.coins"},{id:"score",kind:"score",name:"res.score"}],flows:[{resource:"coins",by:n,kind:"source",amount:"vars.coins"},{resource:"coins",by:"system:store",kind:"sink"},{resource:"score",by:n,kind:"source",amount:"vars.score"}],...t.texts?{texts:t.texts}:{},...t.palette?{palette:t.palette}:{},...t.assets?{assets:t.assets}:{}}}var Sd=255,Ed=10;var zn=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Ea=e=>e===void 0?e:JSON.parse(JSON.stringify(e)),Md=(e,t)=>JSON.stringify(e)===JSON.stringify(t),Zp=/^([A-Za-z0-9_-]+)(?:\[([A-Za-z0-9_-]+)=([^\]]*)\])?$/,Qp=/^'([^']+)'$/;function eu(e){let t=[],n="",s=false;for(let r of e)r==="'"&&(s=!s),r==="."&&!s?(t.push(n),n=""):n+=r;return t.push(n),t}function Ma(e){if(!e)return [];let t=[];for(let n of eu(e)){let s=Qp.exec(n);if(s){t.push({key:s[1]});continue}let r=Zp.exec(n);if(!r)return null;t.push(r[2]!==void 0?{key:r[1],match:{field:r[2],value:r[3]??""}}:{key:r[1]});}return t}function _d(e,t){let n=e.range;if(!n||t===void 0)return e.value;let s=Math.min(Math.max(Number.isFinite(t)?t:.5,0),1),r=n.min+s*(n.max-n.min);if(n.integer)return Math.round(r);let o=10**(n.digits??2);return Math.round(r*o)/o}function Sa(e,t){if(!zn(e)||!zn(t))return Ea(t);let n={...e};for(let[s,r]of Object.entries(t))n[s]=s in n?Sa(n[s],r):Ea(r);return n}function tu(e,t,n){let s=zn(e)?Ea(e):{},r=[];return t.forEach((o,c)=>{let d=Ma(o.path);if(!d){r.push(c);return}let x=Ea(_d(o,n));if(d.length===0){o.op==="set"&&zn(x)?s=x:o.op==="merge"&&zn(x)?s=Sa(s,x):r.push(c);return}let _=s;for(let M=0;M<d.length-1;M++){let $=nu(_,d[M],o.ifExists!==true);if($===void 0){r.push(c);return}_=$;}let O=d[d.length-1];if(!zn(_)){r.push(c);return}if(O.match){let M=_[O.key];if(!Array.isArray(M)){r.push(c);return}let $=M.findIndex(G=>zn(G)&&String(G[O.match.field])===O.match.value);if($<0){r.push(c);return}o.op==="set"?M[$]=x:o.op==="merge"?M[$]=Sa(M[$],x):o.op==="unset"?M.splice($,1):r.push(c);return}if(o.ifExists===true&&_[O.key]===void 0){r.push(c);return}switch(o.op){case "set":_[O.key]=x;break;case "merge":_[O.key]=_[O.key]===void 0?x:Sa(_[O.key],x);break;case "unset":delete _[O.key];break;case "add":case "remove":{let M=Array.isArray(x)?x:[x],$=_[O.key];if($!==void 0&&!Array.isArray($)){r.push(c);return}let G=$?[...$]:[];if(o.op==="add")for(let B of M)G.some(Q=>Md(Q,B))||G.push(B);else for(let B of M){let Q=G.findIndex(ae=>Md(ae,B));Q>=0&&G.splice(Q,1);}_[O.key]=G;break}}}),{value:s,skipped:r}}function nu(e,t,n){if(zn(e)){if(t.match){let s=e[t.key];return Array.isArray(s)?s.find(r=>zn(r)&&String(r[t.match.field])===t.match.value):void 0}if(e[t.key]===void 0||e[t.key]===null){if(!n)return;e[t.key]={};}return e[t.key]}}function ru(e){return [...new Set(e.map(t=>`${t.section}:${t.path??""}`))]}var ou=/^#([0-9a-f]{6})$/i;function Rd(e){let t=ou.exec(e);if(!t)return [0,0,.5];let n=parseInt(t[1],16),s=(n>>16&255)/255,r=(n>>8&255)/255,o=(n&255)/255,c=Math.max(s,r,o),d=Math.min(s,r,o),x=(c+d)/2;if(c===d)return [0,0,x];let _=c-d,O=x>.5?_/(2-c-d):_/(c+d),M=c===s?(r-o)/_+(r<o?6:0):c===r?(o-s)/_+2:(s-r)/_+4;return M*=60,[M,O,x]}function Td(e,t,n){let s=(e%360+360)%360/360,r=Math.min(Math.max(t,0),1),o=Math.min(Math.max(n,0),1),c=x=>{let _=x;_<0&&(_+=1),_>1&&(_-=1);let O=o<.5?o*(1+r):o+r-o*r,M=2*o-O;return _<1/6?M+(O-M)*6*_:_<1/2?O:_<2/3?M+(O-M)*(2/3-_)*6:M},d=x=>Math.round(x*255).toString(16).padStart(2,"0");return r===0?`#${d(o)}${d(o)}${d(o)}`:`#${d(c(s+1/3))}${d(c(s))}${d(c(s-1/3))}`}function _a(e,t,n=1,s=0){let[r,o,c]=Rd(e);return Td(r+t,o*n,c+s)}function Ra(e,t){let[n,s,r]=Rd(e);return Td(n,s,r*(1-t))}var Oe=(e,t)=>({en:e,ru:t}),Tl=(e,t)=>({section:"Look",op:"set",path:e,value:t}),Rl=(e,t)=>({section:"GameSpec",op:"set",path:e,value:t}),su=[{id:"casual-violet",title:Oe("Violet casual","\u0424\u0438\u043E\u043B\u0435\u0442\u043E\u0432\u044B\u0439 \u043A\u0430\u0437\u0443\u0430\u043B"),what:"Bright blue-violet screens, chunky glossy buttons: the classic mobile casual look.",examples:["any casual game","puzzle","arcade"],bgTop:"#5865f2",bgBottom:"#5a3fd6",panel:"#3d8ff5",nav:"#2c3794",ink:"#17193a"},{id:"candy-pink",title:Oe("Candy pink","\u0420\u043E\u0437\u043E\u0432\u0430\u044F \u043A\u043E\u043D\u0444\u0435\u0442\u0430"),what:"Sweet pink and raspberry, playful and girly, candy shop mood.",examples:["sweets","fashion","pets","kids"],bgTop:"#ff7ac6",bgBottom:"#d94a9c",panel:"#ff9ad5",nav:"#a8306f",ink:"#4a1235"},{id:"sunny-orange",title:Oe("Sunny orange","\u0421\u043E\u043B\u043D\u0435\u0447\u043D\u044B\u0439 \u043E\u0440\u0430\u043D\u0436\u0435\u0432\u044B\u0439"),what:"Warm orange and yellow, cheerful summer energy.",examples:["beach","fruit","summer","food"],bgTop:"#ffb347",bgBottom:"#ff7a2f",panel:"#ffc75f",nav:"#c4521b",ink:"#4a2410"},{id:"forest-green",title:Oe("Forest green","\u041B\u0435\u0441\u043D\u043E\u0439 \u0437\u0435\u043B\u0451\u043D\u044B\u0439"),what:"Deep greens of a forest, calm nature mood.",examples:["farm","nature","elves","camping"],bgTop:"#4caf50",bgBottom:"#2e7d32",panel:"#66bb6a",nav:"#1b5e20",ink:"#0f2e12"},{id:"ocean-blue",title:Oe("Ocean blue","\u041E\u043A\u0435\u0430\u043D\u0441\u043A\u0438\u0439 \u0441\u0438\u043D\u0438\u0439"),what:"Sea blue and aqua, fresh water mood.",examples:["ocean","fishing","pirates","islands"],bgTop:"#29b6f6",bgBottom:"#0277bd",panel:"#4fc3f7",nav:"#01579b",ink:"#062c47"},{id:"midnight-navy",title:Oe("Midnight navy","\u041F\u043E\u043B\u043D\u043E\u0447\u043D\u044B\u0439 \u0441\u0438\u043D\u0438\u0439"),what:"Dark navy night, calm and serious, stars at night.",examples:["space","night","strategy","sleep"],bgTop:"#283593",bgBottom:"#0d1442",panel:"#3949ab",nav:"#141a52",ink:"#070a22"},{id:"neon-cyber",title:Oe("Neon cyber","\u041D\u0435\u043E\u043D\u043E\u0432\u044B\u0439 \u043A\u0438\u0431\u0435\u0440"),what:"Black with neon cyan and magenta, cyberpunk and synthwave.",examples:["cyberpunk","hackers","racing at night","sci-fi"],bgTop:"#1a1033",bgBottom:"#07040f",panel:"#2b1a55",nav:"#120a26",ink:"#00e5ff",gold:"#ff3df5",green:"#00ffa3"},{id:"space-purple",title:Oe("Space purple","\u041A\u043E\u0441\u043C\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u043F\u0443\u0440\u043F\u0443\u0440"),what:"Deep purple space with nebula tones.",examples:["space","aliens","galaxy","magic"],bgTop:"#6a1b9a",bgBottom:"#2a0845",panel:"#8e24aa",nav:"#38006b",ink:"#16001f"},{id:"lava-red",title:Oe("Lava red","\u041B\u0430\u0432\u043E\u0432\u044B\u0439 \u043A\u0440\u0430\u0441\u043D\u044B\u0439"),what:"Hot red and black, danger, fire and action.",examples:["fire","volcano","action","boss fights"],bgTop:"#e53935",bgBottom:"#7f0000",panel:"#ef5350",nav:"#5c0000",ink:"#2a0000"},{id:"royal-gold",title:Oe("Royal gold","\u041A\u043E\u0440\u043E\u043B\u0435\u0432\u0441\u043A\u043E\u0435 \u0437\u043E\u043B\u043E\u0442\u043E"),what:"Gold and deep burgundy, rich, royal and luxurious.",examples:["kings","casino","treasure","empire"],bgTop:"#8e2b3a",bgBottom:"#4a0f1c",panel:"#b3424f",nav:"#3a0a15",ink:"#1f0509",gold:"#ffcf40"},{id:"ice-frost",title:Oe("Ice frost","\u041B\u0435\u0434\u044F\u043D\u043E\u0439"),what:"Pale icy blue and white, winter and snow.",examples:["winter","snow","christmas","north"],bgTop:"#e3f6ff",bgBottom:"#9fd7f5",panel:"#ffffff",nav:"#5aa6d6",ink:"#1d4a6b",light:true},{id:"paper-light",title:Oe("Paper light","\u0421\u0432\u0435\u0442\u043B\u0430\u044F \u0431\u0443\u043C\u0430\u0433\u0430"),what:"Clean light paper, minimal and calm, for word and brain games.",examples:["words","quiz","sudoku","education"],bgTop:"#fbf7ef",bgBottom:"#efe6d5",panel:"#ffffff",nav:"#cdbfa6",ink:"#3d3428",light:true},{id:"mint-fresh",title:Oe("Mint fresh","\u0421\u0432\u0435\u0436\u0430\u044F \u043C\u044F\u0442\u0430"),what:"Light mint and teal, fresh and soft.",examples:["cafe","health","relax","spa"],bgTop:"#b9f6e3",bgBottom:"#5fd4b0",panel:"#e6fff7",nav:"#2f9b80",ink:"#0e3d33",light:true},{id:"lemon-pop",title:Oe("Lemon pop","\u041B\u0438\u043C\u043E\u043D\u043D\u044B\u0439 \u043F\u043E\u043F"),what:"Bright lemon yellow, loud and happy pop art.",examples:["comics","party","kids","music"],bgTop:"#fff176",bgBottom:"#fbc02d",panel:"#fff9c4",nav:"#c49000",ink:"#3d2c00",light:true},{id:"peach-soft",title:Oe("Soft peach","\u041D\u0435\u0436\u043D\u044B\u0439 \u043F\u0435\u0440\u0441\u0438\u043A"),what:"Soft peach and coral pastel, cosy and gentle.",examples:["cooking","home decor","romance","pets"],bgTop:"#ffd3b6",bgBottom:"#ffaa85",panel:"#fff0e6",nav:"#d9775a",ink:"#4a2418",light:true},{id:"lavender-dream",title:Oe("Lavender dream","\u041B\u0430\u0432\u0430\u043D\u0434\u043E\u0432\u044B\u0439 \u0441\u043E\u043D"),what:"Pastel lavender, dreamy and magical.",examples:["fairies","unicorns","dreams","princess"],bgTop:"#e1d5ff",bgBottom:"#b39ddb",panel:"#f5f0ff",nav:"#7e57c2",ink:"#2e1a4d",light:true},{id:"toxic-lime",title:Oe("Toxic lime","\u042F\u0434\u043E\u0432\u0438\u0442\u044B\u0439 \u043B\u0430\u0439\u043C"),what:"Acid lime on dark, toxic, zombies and slime.",examples:["zombies","slime","chemistry","monsters"],bgTop:"#33402a",bgBottom:"#141a10",panel:"#4b5e35",nav:"#1c2414",ink:"#a6ff00",gold:"#d4ff3d",green:"#7dff2a"},{id:"desert-sand",title:Oe("Desert sand","\u041F\u0443\u0441\u0442\u044B\u043D\u043D\u044B\u0439 \u043F\u0435\u0441\u043E\u043A"),what:"Sand, ochre and terracotta, desert and ancient ruins.",examples:["egypt","western","desert","archaeology"],bgTop:"#e0b075",bgBottom:"#b5763f",panel:"#f0c995",nav:"#8a5126",ink:"#3b2210"},{id:"rust-wasteland",title:Oe("Rust wasteland","\u0420\u0436\u0430\u0432\u0430\u044F \u043F\u0443\u0441\u0442\u043E\u0448\u044C"),what:"Rusty brown and dusty orange, post-apocalypse scrap.",examples:["post-apocalypse","scrap","survival","mad roads"],bgTop:"#6d4c41",bgBottom:"#2e1f1a",panel:"#8d6e63",nav:"#3e2723",ink:"#140c09",gold:"#ff9e40"},{id:"steel-gray",title:Oe("Steel gray","\u0421\u0442\u0430\u043B\u044C\u043D\u043E\u0439 \u0441\u0435\u0440\u044B\u0439"),what:"Cool steel and graphite, military and industrial.",examples:["army","tanks","factory","robots"],bgTop:"#607d8b",bgBottom:"#263238",panel:"#78909c",nav:"#1c262b",ink:"#0b1013"},{id:"jungle-teal",title:Oe("Jungle teal","\u0422\u0440\u043E\u043F\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u0431\u0438\u0440\u044E\u0437\u043E\u0432\u044B\u0439"),what:"Teal and jungle green, tropical adventure.",examples:["jungle","tropics","dinosaurs","explorers"],bgTop:"#26a69a",bgBottom:"#00695c",panel:"#4db6ac",nav:"#004d40",ink:"#00211c"},{id:"berry-plum",title:Oe("Berry plum","\u042F\u0433\u043E\u0434\u043D\u0430\u044F \u0441\u043B\u0438\u0432\u0430"),what:"Plum and berry purple, juicy and rich.",examples:["berries","potions","fashion","music"],bgTop:"#ad1457",bgBottom:"#4a0072",panel:"#c2185b",nav:"#38004d",ink:"#1a0024"},{id:"sky-day",title:Oe("Clear sky","\u042F\u0441\u043D\u043E\u0435 \u043D\u0435\u0431\u043E"),what:"Light sky blue with white clouds, open and friendly.",examples:["flying","birds","kids","travel"],bgTop:"#bfe9ff",bgBottom:"#6ec6ff",panel:"#ffffff",nav:"#3a9ad9",ink:"#123a5a",light:true},{id:"chocolate",title:Oe("Chocolate","\u0428\u043E\u043A\u043E\u043B\u0430\u0434"),what:"Brown chocolate and caramel, sweet and warm.",examples:["bakery","coffee","sweets","autumn"],bgTop:"#8d5a3b",bgBottom:"#4e2c1a",panel:"#a6704b",nav:"#3b2012",ink:"#1a0d06",gold:"#ffc56b"},{id:"autumn-maple",title:Oe("Autumn maple","\u041E\u0441\u0435\u043D\u043D\u0438\u0439 \u043A\u043B\u0451\u043D"),what:"Orange and red autumn leaves, harvest mood.",examples:["autumn","halloween","harvest","forest"],bgTop:"#ef6c00",bgBottom:"#8c2f00",panel:"#f57c00",nav:"#6b2300",ink:"#2b0e00"},{id:"spooky-night",title:Oe("Spooky night","\u0416\u0443\u0442\u043A\u0430\u044F \u043D\u043E\u0447\u044C"),what:"Dark purple and pumpkin orange, ghosts and halloween.",examples:["halloween","ghosts","horror lite","witches"],bgTop:"#311b92",bgBottom:"#120838",panel:"#4527a0",nav:"#0d0629",ink:"#05020f",gold:"#ff8f00"},{id:"sakura",title:Oe("Sakura","\u0421\u0430\u043A\u0443\u0440\u0430"),what:"Cherry blossom pink with soft white, japanese spring.",examples:["japan","anime","spring","ninja lite"],bgTop:"#ffd6e7",bgBottom:"#f48fb1",panel:"#fff3f8",nav:"#c2185b",ink:"#4d0f2a",light:true},{id:"matrix-green",title:Oe("Terminal green","\u0422\u0435\u0440\u043C\u0438\u043D\u0430\u043B\u044C\u043D\u044B\u0439 \u0437\u0435\u043B\u0451\u043D\u044B\u0439"),what:"Black with bright terminal green, hacker console.",examples:["hacking","code","retro computers","spy"],bgTop:"#0b1f0f",bgBottom:"#000000",panel:"#123317",nav:"#06120a",ink:"#39ff6a",gold:"#c6ff00",green:"#39ff6a"},{id:"retro-arcade",title:Oe("Retro arcade","\u0420\u0435\u0442\u0440\u043E-\u0430\u0440\u043A\u0430\u0434\u0430"),what:"Eighties arcade: deep blue with hot pink and yellow.",examples:["retro","pixel","80s","arcade"],bgTop:"#1e2a78",bgBottom:"#0a0f3d",panel:"#ff2e88",nav:"#0a0f3d",ink:"#05071f",gold:"#ffe600"},{id:"stone-dungeon",title:Oe("Stone dungeon","\u041A\u0430\u043C\u0435\u043D\u043D\u043E\u0435 \u043F\u043E\u0434\u0437\u0435\u043C\u0435\u043B\u044C\u0435"),what:"Dark stone and torchlight, dungeons and castles.",examples:["dungeon","castle","knights","rpg"],bgTop:"#4e4a46",bgBottom:"#1f1c1a",panel:"#6b655e",nav:"#171513",ink:"#0a0908",gold:"#ffb300"},{id:"emerald-luxe",title:Oe("Emerald luxe","\u0418\u0437\u0443\u043C\u0440\u0443\u0434\u043D\u044B\u0439 \u043B\u044E\u043A\u0441"),what:"Emerald green with gold, wealth and luck.",examples:["casino","luck","money","irish"],bgTop:"#00695c",bgBottom:"#00251a",panel:"#00897b",nav:"#001a12",ink:"#000c08",gold:"#ffd54f"},{id:"bubblegum",title:Oe("Bubblegum","\u0416\u0432\u0430\u0447\u043A\u0430"),what:"Pastel cyan and pink together, fun and bouncy.",examples:["kids","toys","party","bubbles"],bgTop:"#a0f0ff",bgBottom:"#ff9fe0",panel:"#ffffff",nav:"#d66bb4",ink:"#3a1f4d",light:true},{id:"military-olive",title:Oe("Military olive","\u0410\u0440\u043C\u0435\u0439\u0441\u043A\u0430\u044F \u043E\u043B\u0438\u0432\u0430"),what:"Olive drab and khaki, army and survival.",examples:["army","war","survival","hunting"],bgTop:"#6b7a3a",bgBottom:"#33391b",panel:"#808f4a",nav:"#262b14",ink:"#101207",gold:"#e6c34d"},{id:"deep-sea",title:Oe("Deep sea","\u041C\u043E\u0440\u0441\u043A\u0430\u044F \u0431\u0435\u0437\u0434\u043D\u0430"),what:"Very dark teal-blue of the deep ocean with glowing tones.",examples:["submarine","deep sea","mermaids","monsters"],bgTop:"#004e64",bgBottom:"#001219",panel:"#00677f",nav:"#000c11",ink:"#000508",gold:"#94fbab",green:"#4dfff3"},{id:"sunset",title:Oe("Sunset","\u0417\u0430\u043A\u0430\u0442"),what:"Orange to purple sunset gradient, warm evening.",examples:["travel","music","romance","racing"],bgTop:"#ff8a65",bgBottom:"#6a1b9a",panel:"#ff7043",nav:"#4a148c",ink:"#1f0738"},{id:"arctic-night",title:Oe("Polar night","\u041F\u043E\u043B\u044F\u0440\u043D\u0430\u044F \u043D\u043E\u0447\u044C"),what:"Dark blue with aurora green and cyan.",examples:["aurora","north","winter night","magic"],bgTop:"#0d3b66",bgBottom:"#021526",panel:"#145374",nav:"#01101e",ink:"#000810",gold:"#7cf5c8",green:"#3ff2a0"},{id:"honey",title:Oe("Honey","\u041C\u0451\u0434"),what:"Golden honey amber, warm and sweet, bees and farms.",examples:["bees","farm","bakery","sunny"],bgTop:"#ffca28",bgBottom:"#ff8f00",panel:"#ffe082",nav:"#b26a00",ink:"#3d2400"},{id:"monochrome",title:Oe("Monochrome","\u041C\u043E\u043D\u043E\u0445\u0440\u043E\u043C"),what:"Black, white and gray only, strict and stylish.",examples:["noir","minimal","chess","detective"],bgTop:"#3a3a3a",bgBottom:"#111111",panel:"#555555",nav:"#0c0c0c",ink:"#000000",gold:"#ffffff",green:"#d9d9d9"},{id:"tropical-punch",title:Oe("Tropical punch","\u0422\u0440\u043E\u043F\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u043F\u0443\u043D\u0448"),what:"Hot coral, turquoise and yellow, tropical party.",examples:["tropics","summer party","cocktails","carnival"],bgTop:"#ff5e62",bgBottom:"#ff9966",panel:"#1de9b6",nav:"#c2364a",ink:"#3d0f16"},{id:"cloud-gray",title:Oe("Soft gray","\u041C\u044F\u0433\u043A\u0438\u0439 \u0441\u0435\u0440\u044B\u0439"),what:"Light neutral gray, calm and modern, apps and tools.",examples:["tools","productivity","calm puzzle","office"],bgTop:"#f2f4f7",bgBottom:"#d5dae1",panel:"#ffffff",nav:"#8a94a6",ink:"#2b313b",light:true}];function au(e){let t={bgTop:e.bgTop,bgBottom:e.bgBottom,panel:e.panel,panelDeep:Ra(e.panel,.18),panelEdge:e.ink,ink:e.ink,nav:e.nav,text:e.light?e.ink:"#ffffff",textDim:e.light?_a(e.ink,0,.6,.25):_a(e.panel,0,.5,.35)};return e.gold&&(t.gold=e.gold,t.goldDeep=Ra(e.gold,.2)),e.green&&(t.green=e.green,t.greenDeep=Ra(e.green,.25)),{id:e.id,title:e.title,what:e.what,examples:e.examples,swatch:[e.bgTop,e.bgBottom,e.panel,e.gold??"#ffd43b"],patches:[Tl("Theme",t)]}}var Od=su.map(au),iu=[{id:"classic",title:Oe("Classic","\u041A\u043B\u0430\u0441\u0441\u0438\u043A\u0430"),what:"The pack's own colours.",dh:0,sat:1,dl:0},{id:"dawn",title:Oe("Dawn","\u0420\u0430\u0441\u0441\u0432\u0435\u0442"),what:"Lighter and warmer, a morning mood.",dh:20,sat:1.05,dl:.08},{id:"night",title:Oe("Night","\u041D\u043E\u0447\u044C"),what:"Darker and bluer, a night mood.",dh:-35,sat:.9,dl:-0.07},{id:"ember",title:Oe("Ember","\u0423\u0433\u043B\u0438"),what:"Shifted to red and orange, hot and dangerous.",dh:-60,sat:1.15,dl:0},{id:"frost",title:Oe("Frost","\u0418\u043D\u0435\u0439"),what:"Shifted to cyan and pale blue, cold and icy.",dh:140,sat:.8,dl:.05},{id:"toxic",title:Oe("Toxic","\u042F\u0434"),what:"Shifted to acid green and yellow, toxic.",dh:70,sat:1.25,dl:0},{id:"royal",title:Oe("Royal","\u041A\u043E\u0440\u043E\u043B\u0435\u0432\u0441\u043A\u0438\u0439"),what:"Shifted to purple and violet, magical and noble.",dh:200,sat:1.1,dl:0},{id:"faded",title:Oe("Faded","\u0412\u044B\u0446\u0432\u0435\u0442\u0448\u0438\u0439"),what:"Muted, low saturation, old photo and dusty.",dh:0,sat:.45,dl:.03}],lu=["background","ground","lane","primary","secondary","accent","muted","panel"],Dd=so.flatMap(e=>iu.map(t=>{let n={...e.palette};for(let s of lu){let r=e.palette[s];r&&(n[s]=_a(r,t.dh,t.sat,t.dl));}return {id:`${e.id}-${t.id}`,title:{en:`${e.names.en??e.id}: ${t.title.en}`,ru:`${e.names.ru??e.id}: ${t.title.ru}`},what:`${e.names.en??e.id} world. ${t.what}`,swatch:[n.background,n.ground,n.primary,n.accent],patches:[Rl("assets",e.id),Rl("palette",n)]}})),cu=[["knight","Knight","\u0420\u044B\u0446\u0430\u0440\u044C","An armoured knight with a sword and shield, brave and classic."],["dark_knight","Dark knight","\u0422\u0451\u043C\u043D\u044B\u0439 \u0440\u044B\u0446\u0430\u0440\u044C","A knight in black armour, grim and mighty."],["archmage","Archmage","\u0410\u0440\u0445\u0438\u043C\u0430\u0433","An old wizard in robes with a staff, magic and wisdom."],["berserker","Berserker","\u0411\u0435\u0440\u0441\u0435\u0440\u043A","A wild warrior with a big axe, rage and strength."],["hunter","Hunter","\u041E\u0445\u043E\u0442\u043D\u0438\u043A","A hunter with a bow and a hood, forests and tracking."],["crossbowman","Crossbowman","\u0410\u0440\u0431\u0430\u043B\u0435\u0442\u0447\u0438\u043A","A soldier with a crossbow, a careful shooter."],["gunslinger","Gunslinger","\u0421\u0442\u0440\u0435\u043B\u043E\u043A","A cowboy gunslinger, the wild west and duels."],["musketeer","Musketeer","\u041C\u0443\u0448\u043A\u0435\u0442\u0451\u0440","A musketeer with a hat and a musket, honour and adventure."],["soldier","Soldier","\u0421\u043E\u043B\u0434\u0430\u0442","A modern soldier with a rifle, war and missions."],["quarterback","Quarterback","\u041A\u0432\u043E\u0442\u0435\u0440\u0431\u0435\u043A","An american football player, sport and teams."],["lumberjack","Lumberjack","\u041B\u0435\u0441\u043E\u0440\u0443\u0431","A bearded lumberjack in a checked shirt with an axe, woods and work."],["viking","Viking","\u0412\u0438\u043A\u0438\u043D\u0433","A horned viking with a hammer, the north and raids."],["wizard","Wizard","\u0412\u043E\u043B\u0448\u0435\u0431\u043D\u0438\u043A","A young wizard with a pointy hat, spells and school of magic."],["ranger","Ranger","\u0421\u043B\u0435\u0434\u043E\u043F\u044B\u0442","A ranger of the wild, light armour and a long bow."],["king","King","\u041A\u043E\u0440\u043E\u043B\u044C","A king with a crown and a cape, kingdoms and rule."],["camper","Camper","\u0422\u0443\u0440\u0438\u0441\u0442","A casual hiker with a backpack, everyday modern life."],["crusader","Crusader","\u041A\u0440\u0435\u0441\u0442\u043E\u043D\u043E\u0441\u0435\u0446","A holy warrior in white and gold, light against darkness."]],Ad=cu.map(([e,t,n,s])=>({id:e,title:Oe(t,n),what:s,patches:[Rl("cast.hero.preset",e)]})),Ld=[["gear","Game gear","\u0418\u0433\u0440\u043E\u0432\u044B\u0435 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u044B","Faint swords, shields, potions, gems and crowns: the classic casual game look."],["plain","Plain gradient","\u0427\u0438\u0441\u0442\u044B\u0439 \u0433\u0440\u0430\u0434\u0438\u0435\u043D\u0442","No pattern, only the theme's gradient."],["dots","Polka dots","\u0413\u043E\u0440\u043E\u0448\u0435\u043A","Soft polka dots, playful."],["stripes","Diagonal stripes","\u0414\u0438\u0430\u0433\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u0435 \u043F\u043E\u043B\u043E\u0441\u044B","Diagonal stripes, energetic and sporty."],["grid","Grid","\u0421\u0435\u0442\u043A\u0430","A thin grid like graph paper, tech or puzzle."],["hex","Honeycomb","\u0421\u043E\u0442\u044B","A honeycomb pattern, bees, sci-fi or strategy."],["stars","Stars","\u0417\u0432\u0451\u0437\u0434\u044B","Small scattered stars, night, space or magic."],["waves","Waves","\u0412\u043E\u043B\u043D\u044B","Soft waves, water and the sea."],["checker","Checkerboard","\u0428\u0430\u0445\u043C\u0430\u0442\u043A\u0430","A checkerboard, board games, racing flags."],["confetti","Confetti","\u041A\u043E\u043D\u0444\u0435\u0442\u0442\u0438","Colourful confetti bits, party and celebration."],["bubbles","Bubbles","\u041F\u0443\u0437\u044B\u0440\u0438","Round bubbles of different sizes, underwater or soda."],["zigzag","Zigzag","\u0417\u0438\u0433\u0437\u0430\u0433","A bold zigzag, retro and pop."],["diamonds","Diamonds","\u0420\u043E\u043C\u0431\u044B","A diamond pattern, cards, casino, royal."],["clouds","Clouds","\u041E\u0431\u043B\u0430\u043A\u0430","Puffy clouds, sky and dreams."],["leaves","Leaves","\u041B\u0438\u0441\u0442\u044C\u044F","Scattered leaves, nature, forest and autumn."],["circuit","Circuit","\u041C\u0438\u043A\u0440\u043E\u0441\u0445\u0435\u043C\u0430","Circuit board lines, robots, hackers and tech."],["sparkles","Sparkles","\u0418\u0441\u043A\u0440\u044B","Twinkling sparkles, magic, fairies and treasure."],["rays","Sun rays","\u041B\u0443\u0447\u0438","Rays from the centre, victory and big wins."],["bricks","Bricks","\u041A\u0438\u0440\u043F\u0438\u0447\u0438","A brick wall, city, castle or dungeon."],["paws","Paw prints","\u0421\u043B\u0435\u0434\u044B \u043B\u0430\u043F","Little paw prints, pets and animals."],["snow","Snowflakes","\u0421\u043D\u0435\u0436\u0438\u043D\u043A\u0438","Falling snowflakes, winter and holidays."]],wd=Ld.map(([e,t,n,s])=>({id:e,title:Oe(t,n),what:s,patches:[Tl("Background",e)]})),Pd=[["classic","Classic","\u041A\u043B\u0430\u0441\u0441\u0438\u043A\u0430","The kit's default bright casual clicks and coins."],["soft","Soft","\u041C\u044F\u0433\u043A\u0438\u0435","Quiet, rounded, calm sounds for relaxing games."],["retro","Retro 8-bit","\u0420\u0435\u0442\u0440\u043E 8-\u0431\u0438\u0442","Square-wave chiptune bleeps of old consoles."],["magic","Magic","\u041C\u0430\u0433\u0438\u044F","Shimmering chimes and sparkles, fairy-tale."],["sci-fi","Sci-fi","\u0424\u0430\u043D\u0442\u0430\u0441\u0442\u0438\u043A\u0430","Electronic blips and sweeps, space and robots."],["wood","Wooden","\u0414\u0435\u0440\u0435\u0432\u044F\u043D\u043D\u044B\u0435","Short wooden knocks and marimba, cosy and natural."]],Cd=Pd.map(([e,t,n,s])=>({id:e,title:Oe(t,n),what:s,patches:[Tl("SoundSet",e)]})),du={backgrounds:Ld.map(e=>e[0]),soundSets:Pd.map(e=>e[0])},Ol={"ui-themes":Od,"kit-palettes":Dd,"hero-looks":Ad,backgrounds:wd,"sound-sets":Cd};var Id=1,W=(e,t)=>({en:e,ru:t}),yt=(e,t)=>({section:"Look",op:"set",path:e,value:t}),Qn=(e,t,n,s=false)=>({section:"GameSpec",op:"set",path:`modes[role=core].params.${e}`,range:{min:t,max:n,...s?{integer:true}:{}}}),wt=(e,t)=>({section:"GameSpec",op:"add",path:`modes[role=core].content.${e}.without`,value:t}),gt=(e,t)=>({section:"GameSpec",op:"remove",path:`modes[role=core].content.${e}.without`,value:t}),Fo={modules:["kit-game"]},pu=[{id:"look.theme",group:"look",title:W("Interface colours","\u0426\u0432\u0435\u0442\u0430 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430"),hint:W("Screens, panels and buttons of the whole app.","\u042D\u043A\u0440\u0430\u043D\u044B, \u043F\u0430\u043D\u0435\u043B\u0438 \u0438 \u043A\u043D\u043E\u043F\u043A\u0438 \u0432\u0441\u0435\u0433\u043E \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F."),question:"Pick the colour theme of the app's interface (menus, panels, buttons) that fits this product best.",kind:"choice",list:"ui-themes"},{id:"look.background",group:"look",title:W("Screen pattern","\u0423\u0437\u043E\u0440 \u0444\u043E\u043D\u0430"),hint:W("A pattern over the screens' gradient.","\u0423\u0437\u043E\u0440 \u043F\u043E\u0432\u0435\u0440\u0445 \u0433\u0440\u0430\u0434\u0438\u0435\u043D\u0442\u0430 \u044D\u043A\u0440\u0430\u043D\u043E\u0432."),question:"Pick the background pattern of the app's screens that fits this product best.",kind:"choice",list:"backgrounds"},{id:"look.shape",group:"look",title:W("Shape of buttons","\u0424\u043E\u0440\u043C\u0430 \u043A\u043D\u043E\u043F\u043E\u043A"),question:"What shape should the buttons and panels of the interface have?",kind:"choice",options:[{id:"chunky",title:W("Chunky round","\u041F\u0443\u0445\u043B\u044B\u0435 \u043A\u0440\u0443\u0433\u043B\u044B\u0435"),what:"Big rounded corners and a thick outline: toy-like, casual, for kids.",patches:[yt("Radius",18),yt("ButtonRadius",16),yt("Outline",3)]},{id:"classic",title:W("Classic","\u041A\u043B\u0430\u0441\u0441\u0438\u043A\u0430"),what:"Medium rounded corners and a normal outline: the default mobile casual look.",patches:[yt("Radius",14),yt("ButtonRadius",12),yt("Outline",3)]},{id:"sharp",title:W("Sharp","\u0421\u0442\u0440\u043E\u0433\u0438\u0435"),what:"Small corners and a thin outline: serious, tactical, strategy or sci-fi.",patches:[yt("Radius",4),yt("ButtonRadius",4),yt("Outline",2)]},{id:"pill",title:W("Pills","\u0422\u0430\u0431\u043B\u0435\u0442\u043A\u0438"),what:"Fully round pill buttons, no outline: soft, modern, minimal.",patches:[yt("Radius",24),yt("ButtonRadius",32),yt("Outline",0)]}]},{id:"look.motion",group:"look",title:W("Animations","\u0410\u043D\u0438\u043C\u0430\u0446\u0438\u0438"),question:"How lively should the interface animations be?",kind:"choice",options:[{id:"calm",title:W("Calm","\u0421\u043F\u043E\u043A\u043E\u0439\u043D\u044B\u0435"),what:"Slow, soft, no bounce: relaxing, meditative, for brain games.",patches:[yt("MotionSpeed",.7),yt("MotionIntensity",.3),yt("Particles",false)]},{id:"normal",title:W("Normal","\u041E\u0431\u044B\u0447\u043D\u044B\u0435"),what:"The default lively casual animations.",patches:[yt("MotionSpeed",1),yt("MotionIntensity",1),yt("Particles",true)]},{id:"bouncy",title:W("Bouncy","\u041F\u0440\u0443\u0436\u0438\u043D\u0438\u0441\u0442\u044B\u0435"),what:"Strong bounces and overshoots: cartoonish, playful, for kids.",patches:[yt("MotionSpeed",1.1),yt("MotionIntensity",2),yt("Particles",true)]},{id:"snappy",title:W("Snappy","\u0420\u0435\u0437\u043A\u0438\u0435"),what:"Very fast and short, little bounce: action, arcade, competitive.",patches:[yt("MotionSpeed",1.8),yt("MotionIntensity",.6),yt("Particles",true)]}]},{id:"look.sound",group:"look",title:W("Interface sounds","\u0417\u0432\u0443\u043A\u0438 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430"),question:"Pick the sound style of the interface (clicks, rewards, coins) that fits this product best.",kind:"choice",list:"sound-sets"}],uu=[{id:"look.kit.palette",group:"look",title:W("World and colours of the game","\u041C\u0438\u0440 \u0438 \u0446\u0432\u0435\u0442\u0430 \u0438\u0433\u0440\u044B"),hint:W("The game's world (fantasy, sci-fi, cozy, post-apocalypse) and its colour mood.","\u041C\u0438\u0440 \u0438\u0433\u0440\u044B (\u0444\u044D\u043D\u0442\u0435\u0437\u0438, \u0444\u0430\u043D\u0442\u0430\u0441\u0442\u0438\u043A\u0430, \u0443\u044E\u0442, \u043F\u043E\u0441\u0442\u0430\u043F\u043E\u043A\u0430\u043B\u0438\u043F\u0441\u0438\u0441) \u0438 \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043D\u0438\u0435 \u0446\u0432\u0435\u0442\u0430."),for:Fo,question:"Pick the world and colour mood of the game scene that fits this idea best.",kind:"choice",list:"kit-palettes"},{id:"look.kit.hero",group:"look",title:W("The hero","\u0413\u0435\u0440\u043E\u0439"),for:Fo,question:"Pick the look of the game's main hero that fits this idea best.",kind:"choice",list:"hero-looks"},{id:"look.kit.race",group:"look",title:W("Hero's race","\u0420\u0430\u0441\u0430 \u0433\u0435\u0440\u043E\u044F"),for:Fo,question:"Which race should the main hero be?",kind:"choice",options:[["human","Human","\u0427\u0435\u043B\u043E\u0432\u0435\u043A","An ordinary human."],["elf","Elf","\u042D\u043B\u044C\u0444","A graceful elf with pointed ears: forests, magic, archery."],["dwarf","Dwarf","\u0413\u043D\u043E\u043C","A stout bearded dwarf: mines, forges, hammers."],["orc","Orc","\u041E\u0440\u043A","A green orc with tusks: brute strength, war, savage lands."],["undead","Undead","\u041D\u0435\u0436\u0438\u0442\u044C","A pale undead: skeletons, graveyards, dark magic, halloween."]].map(([e,t,n,s])=>({id:e,title:W(t,n),what:s,patches:[{section:"GameSpec",op:"set",path:"cast.hero.races",value:[e]}]}))}],fu=[{id:"feel.difficulty",group:"feel",title:W("Difficulty","\u0421\u043B\u043E\u0436\u043D\u043E\u0441\u0442\u044C"),for:Fo,question:"How hard should this game be for its players?",kind:"score",levelTitles:[W("Very easy","\u041E\u0447\u0435\u043D\u044C \u043B\u0435\u0433\u043A\u043E"),W("Easy","\u041B\u0435\u0433\u043A\u043E"),W("Balanced","\u0421\u0431\u0430\u043B\u0430\u043D\u0441\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u043E"),W("Hard","\u0421\u043B\u043E\u0436\u043D\u043E"),W("Very hard","\u041E\u0447\u0435\u043D\u044C \u0441\u043B\u043E\u0436\u043D\u043E")],levels:["Very easy and relaxing, for kids or a calm break.","Easy, casual.","Balanced: easy to start, harder later.","Hard, for players who like a challenge.","Very hard and punishing."],patches:[Qn("difficulty",0,1)]},{id:"feel.generosity",group:"feel",title:W("Rewards in the game","\u041D\u0430\u0433\u0440\u0430\u0434\u044B \u0432 \u0438\u0433\u0440\u0435"),for:Fo,question:"How generous should the game's rewards be?",kind:"score",levelTitles:[W("Stingy","\u0421\u043A\u0443\u043F\u043E"),W("Modest","\u0421\u043A\u0440\u043E\u043C\u043D\u043E"),W("Normal","\u041E\u0431\u044B\u0447\u043D\u043E"),W("Generous","\u0429\u0435\u0434\u0440\u043E"),W("Very generous","\u041E\u0447\u0435\u043D\u044C \u0449\u0435\u0434\u0440\u043E")],levels:["Stingy: rewards are rare and earned slowly.","Modest rewards.","Normal rewards.","Generous rewards.","Very generous: rewards rain down."],patches:[Qn("generosity",0,1)]},{id:"feel.runner.lanes",group:"feel",title:W("Lanes","\u041F\u043E\u043B\u043E\u0441\u044B"),for:{modules:["kit-game"],presets:["runner"]},question:"How wide should the running track be?",kind:"score",levelTitles:[W("2 lanes","2 \u043F\u043E\u043B\u043E\u0441\u044B"),W("3 lanes","3 \u043F\u043E\u043B\u043E\u0441\u044B"),W("4 lanes","4 \u043F\u043E\u043B\u043E\u0441\u044B"),W("5 lanes","5 \u043F\u043E\u043B\u043E\u0441")],levels:["Narrow: two lanes, simple and quick.","Normal: three lanes.","Wide: four lanes.","Very wide: five lanes, lots of dodging."],patches:[Qn("lanes",2,5,true)]},{id:"feel.runner.lives",group:"feel",title:W("Lives in a run","\u0416\u0438\u0437\u043D\u0438 \u0432 \u0437\u0430\u0431\u0435\u0433\u0435"),for:{modules:["kit-game"],presets:["runner"]},question:"How many hits should the runner survive?",kind:"score",levelTitles:[W("One hit","\u041E\u0434\u0438\u043D \u0443\u0434\u0430\u0440"),W("A few","\u041D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E"),W("Many","\u041C\u043D\u043E\u0433\u043E")],levels:["One hit ends the run.","A few lives.","Many lives, forgiving."],patches:[Qn("lives",1,6,true)]},{id:"feel.runner.length",group:"feel",title:W("Length of levels","\u0414\u043B\u0438\u043D\u0430 \u0443\u0440\u043E\u0432\u043D\u0435\u0439"),for:{modules:["kit-game"],presets:["runner"]},question:"How long should one level of the run be?",kind:"score",levelTitles:[W("Very short","\u041E\u0447\u0435\u043D\u044C \u043A\u043E\u0440\u043E\u0442\u043A\u0438\u0435"),W("Short","\u041A\u043E\u0440\u043E\u0442\u043A\u0438\u0435"),W("Normal","\u041E\u0431\u044B\u0447\u043D\u044B\u0435"),W("Long","\u0414\u043B\u0438\u043D\u043D\u044B\u0435")],levels:["Very short bursts for a quick break.","Short.","Normal.","Long runs."],patches:[Qn("length",.5,2)]},{id:"feel.runner.powers",group:"feel",title:W("Power-ups","\u0423\u0441\u0438\u043B\u0435\u043D\u0438\u044F"),for:{modules:["kit-game"],presets:["runner"]},question:"Which power-ups fit this runner best?",kind:"choice",options:[{id:"all",title:W("All of them","\u0412\u0441\u0435"),what:"Magnet, shield, double coins, dash and flight: the full set.",patches:[gt("powers",["magnet","shield","double","dash","flight"])]},{id:"grounded",title:W("On the ground","\u0411\u0435\u0437 \u043F\u043E\u043B\u0451\u0442\u0430"),what:"No flight: magnet, shield, double coins and dash. Realistic, sports, city.",patches:[gt("powers",["magnet","shield","double","dash"]),wt("powers",["flight"])]},{id:"coins",title:W("Coin hunter","\u041E\u0445\u043E\u0442\u0430 \u0437\u0430 \u043C\u043E\u043D\u0435\u0442\u0430\u043C\u0438"),what:"Only the coin ones: magnet and double coins. Collecting, greed, treasure.",patches:[gt("powers",["magnet","double"]),wt("powers",["shield","dash","flight"])]},{id:"hardcore",title:W("Hardcore","\u0425\u0430\u0440\u0434\u043A\u043E\u0440"),what:"No shield and no flight: dodging is everything. Skill, challenge.",patches:[gt("powers",["magnet","double","dash"]),wt("powers",["shield","flight"])]}]},{id:"feel.runner.obstacles",group:"feel",title:W("Obstacles","\u041F\u0440\u0435\u043F\u044F\u0442\u0441\u0442\u0432\u0438\u044F"),for:{modules:["kit-game"],presets:["runner"]},question:"Which obstacles fit this runner best?",kind:"choice",options:[{id:"all",title:W("Everything","\u0412\u0441\u0451 \u043F\u043E\u0434\u0440\u044F\u0434"),what:"Walls, barriers, pits, moving blocks, trains and rocks.",patches:[gt("obstacles",["wall","barrier","pit","mover","train","rock"])]},{id:"city",title:W("City streets","\u0413\u043E\u0440\u043E\u0434\u0441\u043A\u0438\u0435 \u0443\u043B\u0438\u0446\u044B"),what:"Walls, barriers, moving blocks and trains: a city, a subway, traffic.",patches:[gt("obstacles",["wall","barrier","mover","train"]),wt("obstacles",["pit","rock"])]},{id:"wild",title:W("Wild lands","\u0414\u0438\u043A\u0438\u0435 \u0437\u0435\u043C\u043B\u0438"),what:"Walls, pits, rocks and barriers: forests, mountains, ruins, no trains.",patches:[gt("obstacles",["wall","barrier","pit","rock"]),wt("obstacles",["mover","train"])]},{id:"simple",title:W("Simple","\u041F\u0440\u043E\u0441\u0442\u044B\u0435"),what:"Only walls, barriers and pits: easy to read, for kids.",patches:[gt("obstacles",["wall","barrier","pit"]),wt("obstacles",["mover","train","rock"])]}]},{id:"feel.platformer.lives",group:"feel",title:W("Lives on a level","\u0416\u0438\u0437\u043D\u0438 \u043D\u0430 \u0443\u0440\u043E\u0432\u043D\u0435"),for:{modules:["kit-game"],presets:["platformer"]},question:"How many hits should the hero survive on a level?",kind:"score",levelTitles:[W("One hit","\u041E\u0434\u0438\u043D \u0443\u0434\u0430\u0440"),W("A few hearts","\u041D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0441\u0435\u0440\u0434\u0435\u0446"),W("Many hearts","\u041C\u043D\u043E\u0433\u043E \u0441\u0435\u0440\u0434\u0435\u0446")],levels:["One hit and the level restarts.","A few hearts.","Many hearts, forgiving."],patches:[Qn("lives",1,6,true)]},{id:"feel.platformer.double-jump",group:"feel",title:W("Double jump from the start","\u0414\u0432\u043E\u0439\u043D\u043E\u0439 \u043F\u0440\u044B\u0436\u043E\u043A \u0441\u0440\u0430\u0437\u0443"),for:{modules:["kit-game"],presets:["platformer"]},question:"Should the hero have a double jump from the very first level?",kind:"noul",yes:"Yes: the game is light and acrobatic, the hero flies around from the start.",no:"No: the double jump is earned later, the start is grounded and careful.",onYes:[{section:"GameSpec",op:"set",path:"modes[role=core].params.doubleJump",value:true}],onNo:[{section:"GameSpec",op:"set",path:"modes[role=core].params.doubleJump",value:false}]},{id:"feel.survivors.minutes",group:"feel",title:W("Length of a chapter","\u0414\u043B\u0438\u043D\u0430 \u0433\u043B\u0430\u0432\u044B"),for:{modules:["kit-game"],presets:["survivors"]},question:"How long should one chapter of survival last?",kind:"score",levelTitles:[W("2 minutes","2 \u043C\u0438\u043D\u0443\u0442\u044B"),W("5 minutes","5 \u043C\u0438\u043D\u0443\u0442"),W("10 minutes","10 \u043C\u0438\u043D\u0443\u0442"),W("15 minutes","15 \u043C\u0438\u043D\u0443\u0442")],levels:["Two minutes: quick bursts.","Five minutes.","Ten minutes.","Fifteen minutes: long sessions."],patches:[Qn("minutes",2,15)]},{id:"feel.survivors.foes",group:"feel",title:W("Monsters","\u041C\u043E\u043D\u0441\u0442\u0440\u044B"),for:{modules:["kit-game"],presets:["survivors"]},question:"Which kinds of monsters fit this game best?",kind:"choice",options:[{id:"all",title:W("The whole horde","\u0412\u0441\u044F \u043E\u0440\u0434\u0430"),what:"Swarms, grunts, archers, brutes, chargers and bombers.",patches:[gt("foes",["swarm","grunt","archer","brute","charger","bomber"])]},{id:"melee",title:W("Close combat","\u0411\u043B\u0438\u0436\u043D\u0438\u0439 \u0431\u043E\u0439"),what:"No shooters: swarms, grunts, brutes and chargers. Zombies, beasts.",patches:[gt("foes",["swarm","grunt","brute","charger"]),wt("foes",["archer","bomber"])]},{id:"army",title:W("An army","\u0410\u0440\u043C\u0438\u044F"),what:"Grunts, archers, brutes and chargers, no swarms: soldiers, knights, war.",patches:[gt("foes",["grunt","archer","brute","charger"]),wt("foes",["swarm","bomber"])]},{id:"chaos",title:W("Chaos","\u0425\u0430\u043E\u0441"),what:"Swarms, bombers and chargers: fast, explosive, crazy.",patches:[gt("foes",["swarm","charger","bomber","grunt"]),wt("foes",["archer","brute"])]}]},{id:"feel.td.lives",group:"feel",title:W("Lives of the base","\u0416\u0438\u0437\u043D\u0438 \u0431\u0430\u0437\u044B"),for:{modules:["kit-game"],presets:["tower-defense"]},question:"How many enemies may slip through before the level is lost?",kind:"score",levelTitles:[W("Very few","\u041E\u0447\u0435\u043D\u044C \u043C\u0430\u043B\u043E"),W("Some","\u0421\u0440\u0435\u0434\u043D\u0435"),W("Many","\u041C\u043D\u043E\u0433\u043E")],levels:["Very few: every leak hurts.","Some.","Many: forgiving."],patches:[Qn("lives",5,40,true)]},{id:"feel.td.foes",group:"feel",title:W("Enemies in the waves","\u0412\u0440\u0430\u0433\u0438 \u0432 \u0432\u043E\u043B\u043D\u0430\u0445"),for:{modules:["kit-game"],presets:["tower-defense"]},question:"Which enemies should march in the waves of this tower defense?",kind:"choice",options:[{id:"all",title:W("The whole army","\u0412\u0441\u044F \u0430\u0440\u043C\u0438\u044F"),what:"Grunts, runners, brutes, flyers, shamans, healers and splitters: the full mix.",patches:[gt("foes",["grunt","runner","brute","flyer","shaman","healer","splitter"])]},{id:"ground",title:W("Only on foot","\u0422\u043E\u043B\u044C\u043A\u043E \u043F\u0435\u0448\u0438\u0435"),what:"No flyers: every enemy walks the road. Medieval, zombies, ground war.",patches:[gt("foes",["grunt","runner","brute","shaman","healer","splitter"]),wt("foes",["flyer"])]},{id:"simple",title:W("Plain and clear","\u041F\u0440\u043E\u0441\u0442\u044B\u0435"),what:"No shamans, healers or splitters: easy to read, for kids and casual players.",patches:[gt("foes",["grunt","runner","brute","flyer"]),wt("foes",["shaman","healer","splitter"])]},{id:"swarm",title:W("Fast hordes","\u0411\u044B\u0441\u0442\u0440\u044B\u0435 \u043E\u0440\u0434\u044B"),what:"No brutes or shamans: many fast weak foes, a frantic pace. Insects, rats, robots.",patches:[gt("foes",["grunt","runner","flyer","healer","splitter"]),wt("foes",["brute","shaman"])]}]},{id:"feel.survivors.weapons",group:"feel",title:W("Weapons to find","\u041E\u0440\u0443\u0436\u0438\u0435 \u0432 \u0437\u0430\u0431\u0435\u0433\u0435"),hint:W("Which new weapons a level-up may offer.","\u041A\u0430\u043A\u043E\u0435 \u043D\u043E\u0432\u043E\u0435 \u043E\u0440\u0443\u0436\u0438\u0435 \u043F\u0440\u0435\u0434\u043B\u0430\u0433\u0430\u0435\u0442 \u043F\u043E\u0432\u044B\u0448\u0435\u043D\u0438\u0435 \u0443\u0440\u043E\u0432\u043D\u044F."),for:{modules:["kit-game"],presets:["survivors"]},question:"Which weapons fit the hero of this survival game best?",kind:"choice",options:[{id:"all",title:W("Everything","\u0412\u0441\u0451"),what:"Blaster, blades, aura, boomerang, lightning and drone: the full arsenal.",patches:[gt("weapons",["blaster","blades","aura","boomerang","lightning","drone"])]},{id:"tech",title:W("Technology","\u0422\u0435\u0445\u043D\u0438\u043A\u0430"),what:"Blaster, drone and lightning: guns and gadgets. Sci-fi, robots, the future.",patches:[gt("weapons",["blaster","drone","lightning"]),wt("weapons",["blades","aura","boomerang"])]},{id:"magic",title:W("Magic and steel","\u041C\u0430\u0433\u0438\u044F \u0438 \u0441\u0442\u0430\u043B\u044C"),what:"Blades, aura, boomerang and lightning, no guns: fantasy, wizards, knights.",patches:[gt("weapons",["blades","aura","boomerang","lightning"]),wt("weapons",["blaster","drone"])]},{id:"classic",title:W("Classic","\u041A\u043B\u0430\u0441\u0441\u0438\u043A\u0430"),what:"Blaster, blades and boomerang: simple weapons that are easy to read.",patches:[gt("weapons",["blaster","blades","boomerang"]),wt("weapons",["aura","lightning","drone"])]}]},{id:"feel.tycoon.events",group:"feel",title:W("Events in the city","\u0421\u043E\u0431\u044B\u0442\u0438\u044F \u0432 \u0433\u043E\u0440\u043E\u0434\u0435"),for:{modules:["kit-game"],presets:["tycoon"]},question:"Which events should pop up while this tycoon city earns money?",kind:"choice",options:[{id:"all",title:W("Busy life","\u0411\u0443\u0440\u043D\u0430\u044F \u0436\u0438\u0437\u043D\u044C"),what:"Rushes, breakdowns, investors and couriers: always something to tap.",patches:[gt("events",["rush","break","invest","courier"])]},{id:"calm",title:W("No breakdowns","\u0411\u0435\u0437 \u043F\u043E\u043B\u043E\u043C\u043E\u043A"),what:"Rushes, investors and couriers, nothing ever breaks: a calm, cozy business.",patches:[gt("events",["rush","invest","courier"]),wt("events",["break"])]},{id:"hands-on",title:W("Hands on","\u0421\u0432\u043E\u0438\u043C\u0438 \u0440\u0443\u043A\u0430\u043C\u0438"),what:"Rushes, breakdowns and couriers, no investors: the city grows by your own work.",patches:[gt("events",["rush","break","courier"]),wt("events",["invest"])]},{id:"minimal",title:W("Only rushes","\u0422\u043E\u043B\u044C\u043A\u043E \u0430\u0436\u0438\u043E\u0442\u0430\u0436"),what:"Only rush hours: a quiet idle game with few interruptions.",patches:[gt("events",["rush"]),wt("events",["break","invest","courier"])]}]}],hu=(e,t)=>({Type:"VirtualCurrency",CurrencyID:e,Amount:t}),Ta=(e,t,n,s,r)=>({id:e,title:W(t,n),what:s,patches:r.map((o,c)=>({section:"Reward",op:"set",path:`DailyCalendars.daily_login.Days[DayNumber=${c+1}].Rewards.Standard.Entries`,value:o.map(([d,x])=>hu(d,x))}))}),Dl=(e,t)=>`StoreOffers.${e}.${t}`,mu=[{id:"economy.shop-ad-gems",group:"economy",title:W("Gems for an ad in the shop","\u041A\u0440\u0438\u0441\u0442\u0430\u043B\u043B\u044B \u0437\u0430 \u0440\u0435\u043A\u043B\u0430\u043C\u0443 \u0432 \u043C\u0430\u0433\u0430\u0437\u0438\u043D\u0435"),for:{sections:["Store"]},question:"How many gems should one rewarded ad in the shop give?",kind:"score",levelTitles:[W("A few","\u041C\u0430\u043B\u043E"),W("Some","\u0421\u0440\u0435\u0434\u043D\u0435"),W("A handful","\u041F\u0440\u0438\u043B\u0438\u0447\u043D\u043E"),W("Many","\u041C\u043D\u043E\u0433\u043E")],levels:["A few: gems are rare.","Some.","A good handful.","Many: gems flow freely."],patches:[{section:"Store",op:"set",path:Dl("kit_gems_ad","Reward.Grant.Standard.Entries[Type=VirtualCurrency].Amount"),range:{min:2,max:15,integer:true}}]},{id:"economy.shop-ad-cap",group:"economy",title:W("Ads in the shop a day","\u0420\u0435\u043A\u043B\u0430\u043C\u0430 \u0432 \u043C\u0430\u0433\u0430\u0437\u0438\u043D\u0435 \u0437\u0430 \u0434\u0435\u043D\u044C"),for:{sections:["Store"]},question:"How many times a day may a player watch an ad for gems in the shop?",kind:"score",levelTitles:[W("A few times","\u041D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0440\u0430\u0437"),W("About ten","\u041E\u043A\u043E\u043B\u043E \u0434\u0435\u0441\u044F\u0442\u0438"),W("Many times","\u041C\u043D\u043E\u0433\u043E \u0440\u0430\u0437")],levels:["A few times.","About ten.","Many times."],patches:[{section:"Store",op:"set",path:Dl("kit_gems_ad","Availability.Limits.DailyCap"),range:{min:3,max:20,integer:true}}]},{id:"economy.shop-pack",group:"economy",title:W("Size of the gem pack","\u0420\u0430\u0437\u043C\u0435\u0440 \u043D\u0430\u0431\u043E\u0440\u0430 \u043A\u0440\u0438\u0441\u0442\u0430\u043B\u043B\u043E\u0432"),for:{sections:["Store"]},question:"How many gems should the paid gem pack hold?",kind:"score",levelTitles:[W("Small","\u041C\u0430\u043B\u0435\u043D\u044C\u043A\u0438\u0439"),W("Normal","\u041E\u0431\u044B\u0447\u043D\u044B\u0439"),W("Big","\u0411\u043E\u043B\u044C\u0448\u043E\u0439"),W("Huge","\u041E\u0433\u0440\u043E\u043C\u043D\u044B\u0439")],levels:["A small pack.","A normal pack.","A big pack.","A huge pack: the best deal."],patches:[{section:"Store",op:"set",path:Dl("kit_gems_pack","Reward.Grant.Standard.Entries[Type=VirtualCurrency].Amount"),range:{min:60,max:200,integer:true}}]},{id:"economy.start-coins",group:"economy",title:W("Coins at the start","\u041C\u043E\u043D\u0435\u0442\u044B \u043D\u0430 \u0441\u0442\u0430\u0440\u0442\u0435"),for:{sections:["Currency"]},question:"How many coins should a new player start with?",kind:"score",levelTitles:[W("A few","\u041C\u0430\u043B\u043E"),W("Some","\u0421\u0440\u0435\u0434\u043D\u0435"),W("Comfortable","\u041A\u043E\u043C\u0444\u043E\u0440\u0442\u043D\u043E"),W("Rich","\u0411\u043E\u0433\u0430\u0442\u043E")],levels:["A few: everything is earned.","Some.","A comfortable start.","A rich start: buy upgrades right away."],patches:[{section:"Currency",op:"set",path:"VirtualCurrencies.CO.Economy.InitialDeposit",range:{min:100,max:3e3,integer:true}}]},{id:"economy.ad-multiplier",group:"economy",title:W("Round reward for an ad","\u041D\u0430\u0433\u0440\u0430\u0434\u0430 \u0440\u0430\u0443\u043D\u0434\u0430 \u0437\u0430 \u0440\u0435\u043A\u043B\u0430\u043C\u0443"),hint:W("How many times the round's coins grow for a rewarded ad (in the app).","\u0412\u043E \u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0440\u0430\u0437 \u0440\u0430\u0441\u0442\u0443\u0442 \u043C\u043E\u043D\u0435\u0442\u044B \u0440\u0430\u0443\u043D\u0434\u0430 \u0437\u0430 \u0440\u0435\u043A\u043B\u0430\u043C\u0443 (\u0432 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438)."),for:{modules:["kit-game"],sections:["Reward"]},question:"How big should the bonus for watching an ad after a round be?",kind:"score",levelTitles:[W("x2","x2"),W("x3","x3"),W("x4","x4"),W("x5","x5")],levels:["Double.","Triple.","Four times.","Five times."],patches:[{section:"Reward",op:"set",path:"Windows.round.AdMultiplier",range:{min:2,max:5,integer:true}}]},{id:"economy.vip-multiplier",group:"economy",title:W("Round reward for VIP","\u041D\u0430\u0433\u0440\u0430\u0434\u0430 \u0440\u0430\u0443\u043D\u0434\u0430 \u0434\u043B\u044F VIP"),for:{modules:["kit-game"],sections:["Reward"]},question:"How big should the round reward bonus of VIP players be?",kind:"score",levelTitles:[W("x3","x3"),W("x5","x5"),W("x8","x8")],levels:["Triple.","Five times.","Eight times."],patches:[{section:"Reward",op:"set",path:"Windows.round.VipMultiplier",range:{min:3,max:8,integer:true}}]},{id:"economy.vip-price",group:"economy",title:W("Price of VIP","\u0426\u0435\u043D\u0430 VIP"),for:{sections:["Premium"]},question:"How expensive should the VIP pass be, in gems?",kind:"score",levelTitles:[W("Cheap","\u0414\u0451\u0448\u0435\u0432\u043E"),W("Normal","\u041E\u0431\u044B\u0447\u043D\u043E"),W("Expensive","\u0414\u043E\u0440\u043E\u0433\u043E")],levels:["Cheap, an easy first purchase.","Normal.","Expensive, for the most devoted."],patches:[{section:"Premium",op:"set",path:"Definitions.vip.PriceOptions.default.Cost.Standard.Entries[Type=VirtualCurrency].Amount",range:{min:20,max:120,integer:true}}]},{id:"economy.daily-calendar",group:"economy",title:W("Daily login rewards","\u041D\u0430\u0433\u0440\u0430\u0434\u044B \u0437\u0430 \u0432\u0445\u043E\u0434"),for:{sections:["Reward"]},question:"Which daily login reward plan fits this game best?",kind:"choice",options:[Ta("gentle","Gentle","\u0421\u043A\u0440\u043E\u043C\u043D\u044B\u0435","Small steady rewards every day: a calm game with a slow economy.",[[["CO",50]],[["CO",60]],[["CO",80]],[["GE",2]],[["CO",100]],[["CO",120]],[["GE",8],["CO",150]]]),Ta("standard","Standard","\u041E\u0431\u044B\u0447\u043D\u044B\u0435","Growing coins with gems on day 4 and a big day 7.",[[["CO",100]],[["CO",150]],[["CO",200]],[["GE",5]],[["CO",300]],[["CO",400]],[["GE",20],["CO",500]]]),Ta("generous","Generous","\u0429\u0435\u0434\u0440\u044B\u0435","Big rewards every day, gems often: a fast, rewarding economy.",[[["CO",300]],[["GE",5]],[["CO",500]],[["GE",10]],[["CO",800]],[["GE",15]],[["GE",40],["CO",1500]]]),Ta("jackpot","Jackpot day 7","\u0414\u0436\u0435\u043A\u043F\u043E\u0442 \u043D\u0430 7-\u0439 \u0434\u0435\u043D\u044C","Small days and a huge jackpot on day 7: come back every day.",[[["CO",50]],[["CO",50]],[["CO",80]],[["CO",80]],[["CO",100]],[["CO",150]],[["GE",60],["CO",3e3]]])]}],lo=(e,t,n)=>({section:"Quest",op:"set",path:`Quests.${e}.Reward.Grant.Standard.Entries[Type=VirtualCurrency].Amount`,range:{min:t,max:n,integer:true}}),Ko=(e,t,n,s)=>({section:"Quest",op:"set",path:`Quests.${e}.Objectives.${t}.TargetValue`,range:{min:n,max:s,integer:true}}),Nd="Definitions.star_festival",er=e=>{let[t,n]=e.name,[s,r]=e.token,o=`Collect ${s.toLowerCase()} by playing rounds, shopping and finishing quests. VIP gets a second prize on every milestone.`,c=`\u0421\u043E\u0431\u0438\u0440\u0430\u0439\u0442\u0435 ${r.toLowerCase()} \u0432 \u0440\u0430\u0443\u043D\u0434\u0430\u0445, \u043F\u043E\u043A\u0443\u043F\u043A\u0430\u0445 \u0438 \u0437\u0430\u0434\u0430\u043D\u0438\u044F\u0445. VIP \u043F\u043E\u043B\u0443\u0447\u0430\u0435\u0442 \u0432\u0442\u043E\u0440\u043E\u0439 \u043F\u0440\u0438\u0437 \u043D\u0430 \u043A\u0430\u0436\u0434\u043E\u0439 \u0432\u0435\u0445\u0435.`,d=[["stars_10",10],["stars_50",50],["stars_120",120],["stars_250",250]],x=(_,O)=>({section:"TimedEvent",op:"set",path:`${Nd}.${_}`,value:O});return {id:e.id,title:W(t,n),what:e.what,patches:[x("DisplayName",t),x("Description",o),x("Content.DisplayName",t),x("Content.Description",o),x("Content.Token.DisplayName",s),...d.map(([_,O])=>x(`Content.Milestones.${_}.DisplayName`,`${O} ${e.unit[0]}`)),x("Content.Milestones.stars_400.DisplayName",e.crown[0])],translations:{ru:{[t]:n,[o]:c,[s]:r,[e.crown[0]]:e.crown[1],...Object.fromEntries(d.map(([,_])=>[`${_} ${e.unit[0]}`,`${_} ${e.unit[1]}`]))}}}},Al=(e,t,n,s,r,o,c)=>({id:e,title:W(t,n),what:c,patches:[{section:"TimedBoost",op:"set",path:"Definitions.double_rewards.Effect.Value",value:s},{section:"TimedBoost",op:"set",path:"Definitions.double_rewards.DisplayName",value:t},{section:"TimedBoost",op:"set",path:"Definitions.double_rewards.Description",value:r}],translations:{ru:{[t]:n,[r]:o}}}),yu=[{id:"liveops.event-theme",group:"liveops",title:W("Theme of the weekly event","\u0422\u0435\u043C\u0430 \u043D\u0435\u0434\u0435\u043B\u044C\u043D\u043E\u0433\u043E \u0438\u0432\u0435\u043D\u0442\u0430"),hint:W("Name of the event, its tokens and prizes.","\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0438\u0432\u0435\u043D\u0442\u0430, \u0435\u0433\u043E \u0436\u0435\u0442\u043E\u043D\u043E\u0432 \u0438 \u043F\u0440\u0438\u0437\u043E\u0432."),for:{sections:["TimedEvent"]},question:"Which weekly event theme fits this product best?",kind:"choice",options:[er({id:"star-festival",name:["Star festival","\u0417\u0432\u0451\u0437\u0434\u043D\u044B\u0439 \u0444\u0435\u0441\u0442\u0438\u0432\u0430\u043B\u044C"],token:["Festival stars","\u0417\u0432\u0451\u0437\u0434\u044B \u0444\u0435\u0441\u0442\u0438\u0432\u0430\u043B\u044F"],unit:["stars","\u0437\u0432\u0451\u0437\u0434"],crown:["Festival crown","\u041A\u043E\u0440\u043E\u043D\u0430 \u0444\u0435\u0441\u0442\u0438\u0432\u0430\u043B\u044F"],what:"A cheerful festival of stars: fits anything."}),er({id:"harvest",name:["Harvest fair","\u042F\u0440\u043C\u0430\u0440\u043A\u0430 \u0443\u0440\u043E\u0436\u0430\u044F"],token:["Golden apples","\u0417\u043E\u043B\u043E\u0442\u044B\u0435 \u044F\u0431\u043B\u043E\u043A\u0438"],unit:["apples","\u044F\u0431\u043B\u043E\u043A"],crown:["Golden basket","\u0417\u043E\u043B\u043E\u0442\u0430\u044F \u043A\u043E\u0440\u0437\u0438\u043D\u0430"],what:"Farm, nature, cozy village, autumn."}),er({id:"monster-hunt",name:["Monster hunt","\u041E\u0445\u043E\u0442\u0430 \u043D\u0430 \u043C\u043E\u043D\u0441\u0442\u0440\u043E\u0432"],token:["Trophies","\u0422\u0440\u043E\u0444\u0435\u0438"],unit:["trophies","\u0442\u0440\u043E\u0444\u0435\u0435\u0432"],crown:["Hunter's crown","\u041A\u043E\u0440\u043E\u043D\u0430 \u043E\u0445\u043E\u0442\u043D\u0438\u043A\u0430"],what:"Action, fantasy, battles, monsters."}),er({id:"space-week",name:["Space week","\u041A\u043E\u0441\u043C\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u043D\u0435\u0434\u0435\u043B\u044F"],token:["Star shards","\u0417\u0432\u0451\u0437\u0434\u043D\u044B\u0435 \u043E\u0441\u043A\u043E\u043B\u043A\u0438"],unit:["shards","\u043E\u0441\u043A\u043E\u043B\u043A\u043E\u0432"],crown:["Galaxy medal","\u041C\u0435\u0434\u0430\u043B\u044C \u0433\u0430\u043B\u0430\u043A\u0442\u0438\u043A\u0438"],what:"Sci-fi, space, robots, the future."}),er({id:"winter",name:["Winter holidays","\u0417\u0438\u043C\u043D\u0438\u0435 \u043F\u0440\u0430\u0437\u0434\u043D\u0438\u043A\u0438"],token:["Snowflakes","\u0421\u043D\u0435\u0436\u0438\u043D\u043A\u0438"],unit:["snowflakes","\u0441\u043D\u0435\u0436\u0438\u043D\u043E\u043A"],crown:["Ice crown","\u041B\u0435\u0434\u044F\u043D\u0430\u044F \u043A\u043E\u0440\u043E\u043D\u0430"],what:"Winter, new year, cozy and festive."}),er({id:"beach",name:["Beach party","\u041F\u043B\u044F\u0436\u043D\u0430\u044F \u0432\u0435\u0447\u0435\u0440\u0438\u043D\u043A\u0430"],token:["Seashells","\u0420\u0430\u043A\u0443\u0448\u043A\u0438"],unit:["seashells","\u0440\u0430\u043A\u0443\u0448\u0435\u043A"],crown:["Golden surfboard","\u0417\u043E\u043B\u043E\u0442\u0430\u044F \u0434\u043E\u0441\u043A\u0430"],what:"Summer, the sea, islands, holidays."}),er({id:"treasure",name:["Treasure hunt","\u041E\u0445\u043E\u0442\u0430 \u0437\u0430 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430\u043C\u0438"],token:["Map pieces","\u041A\u0443\u0441\u043E\u0447\u043A\u0438 \u043A\u0430\u0440\u0442\u044B"],unit:["pieces","\u043A\u0443\u0441\u043E\u0447\u043A\u043E\u0432"],crown:["Pirate chest","\u041F\u0438\u0440\u0430\u0442\u0441\u043A\u0438\u0439 \u0441\u0443\u043D\u0434\u0443\u043A"],what:"Pirates, adventure, exploring, mysteries."}),er({id:"carnival",name:["Carnival","\u041A\u0430\u0440\u043D\u0430\u0432\u0430\u043B"],token:["Masks","\u041C\u0430\u0441\u043A\u0438"],unit:["masks","\u043C\u0430\u0441\u043E\u043A"],crown:["Carnival crown","\u041A\u043E\u0440\u043E\u043D\u0430 \u043A\u0430\u0440\u043D\u0430\u0432\u0430\u043B\u0430"],what:"Music, dance, a bright party, cartoon fun."})]},{id:"liveops.event-pace",group:"liveops",title:W("Pace of the weekly event","\u0422\u0435\u043C\u043F \u043D\u0435\u0434\u0435\u043B\u044C\u043D\u043E\u0433\u043E \u0438\u0432\u0435\u043D\u0442\u0430"),for:{sections:["TimedEvent"]},question:"How fast should players collect the weekly event tokens by playing rounds?",kind:"score",levelTitles:[W("Slow","\u041C\u0435\u0434\u043B\u0435\u043D\u043D\u043E"),W("Normal","\u041E\u0431\u044B\u0447\u043D\u043E"),W("Fast","\u0411\u044B\u0441\u0442\u0440\u043E"),W("Very fast","\u041E\u0447\u0435\u043D\u044C \u0431\u044B\u0441\u0442\u0440\u043E")],levels:["Slow: the top prize is for the most devoted.","Normal.","Fast.","Very fast: most players reach the top."],patches:[{section:"TimedEvent",op:"set",path:`${Nd}.Content.TokenSources[SourceType=CustomAction].BaseWeight`,range:{min:2,max:10,integer:true}}]},{id:"liveops.boost-power",group:"liveops",title:W("Power of the reward boost","\u0421\u0438\u043B\u0430 \u0431\u0443\u0441\u0442\u0430 \u043D\u0430\u0433\u0440\u0430\u0434"),for:{sections:["TimedBoost"]},question:"How strong should the paid reward boost be?",kind:"choice",options:[Al("x1-5","Rewards x1.5","\u041D\u0430\u0433\u0440\u0430\u0434\u044B x1.5",1.5,"Every reward is 1.5 times bigger for an hour.","\u041A\u0430\u0436\u0434\u0430\u044F \u043D\u0430\u0433\u0440\u0430\u0434\u0430 \u0432 1.5 \u0440\u0430\u0437\u0430 \u0431\u043E\u043B\u044C\u0448\u0435 \u0432 \u0442\u0435\u0447\u0435\u043D\u0438\u0435 \u0447\u0430\u0441\u0430.","A gentle boost: a slow, balanced economy."),Al("x2","Double rewards","\u0414\u0432\u043E\u0439\u043D\u044B\u0435 \u043D\u0430\u0433\u0440\u0430\u0434\u044B",2,"Every reward is doubled for an hour.","\u041A\u0430\u0436\u0434\u0430\u044F \u043D\u0430\u0433\u0440\u0430\u0434\u0430 \u0443\u0434\u0432\u043E\u0435\u043D\u0430 \u043D\u0430 \u0447\u0430\u0441.","The classic double: fits most games."),Al("x3","Triple rewards","\u0422\u0440\u043E\u0439\u043D\u044B\u0435 \u043D\u0430\u0433\u0440\u0430\u0434\u044B",3,"Every reward is tripled for an hour.","\u041A\u0430\u0436\u0434\u0430\u044F \u043D\u0430\u0433\u0440\u0430\u0434\u0430 \u0443\u0442\u0440\u043E\u0435\u043D\u0430 \u043D\u0430 \u0447\u0430\u0441.","A big boost: a fast, generous economy.")]},{id:"liveops.quest-effort",group:"liveops",title:W("Effort of daily quests","\u0421\u043B\u043E\u0436\u043D\u043E\u0441\u0442\u044C \u0435\u0436\u0435\u0434\u043D\u0435\u0432\u043D\u044B\u0445 \u0437\u0430\u0434\u0430\u043D\u0438\u0439"),for:{sections:["Quest"]},question:"How much play should the daily quests ask for?",kind:"score",levelTitles:[W("A few minutes","\u041F\u0430\u0440\u0430 \u043C\u0438\u043D\u0443\u0442"),W("Short","\u041A\u043E\u0440\u043E\u0442\u043A\u043E"),W("Normal","\u041E\u0431\u044B\u0447\u043D\u043E"),W("Long","\u0414\u043E\u043B\u0433\u043E")],levels:["Very little: done in a few minutes.","A short session.","A normal session.","A long session: for devoted players."],patches:[Ko("daily_play","play",1,8),Ko("daily_earn","earn",50,500),Ko("kit_daily_coins","coins",100,1500),Ko("kit_daily_time","seconds",180,1800),Ko("kit_daily_levels","levels",1,6)]},{id:"liveops.quest-rewards",group:"liveops",title:W("Rewards of daily quests","\u041D\u0430\u0433\u0440\u0430\u0434\u044B \u0437\u0430 \u0437\u0430\u0434\u0430\u043D\u0438\u044F"),for:{sections:["Quest"]},question:"How generous should the rewards of the daily quests be?",kind:"score",levelTitles:[W("Small","\u041C\u0430\u043B\u0435\u043D\u044C\u043A\u0438\u0435"),W("Normal","\u041E\u0431\u044B\u0447\u043D\u044B\u0435"),W("Big","\u0411\u043E\u043B\u044C\u0448\u0438\u0435"),W("Very big","\u041E\u0447\u0435\u043D\u044C \u0431\u043E\u043B\u044C\u0448\u0438\u0435")],levels:["Small.","Normal.","Big.","Very big."],patches:[lo("daily_visit",10,100),lo("daily_earn",30,300),lo("daily_play",80,600),lo("kit_daily_coins",50,500),lo("kit_daily_time",50,500),lo("kit_daily_levels",5,40)]},{id:"liveops.leaderboard",group:"liveops",title:W("Weekly leaderboard","\u041D\u0435\u0434\u0435\u043B\u044C\u043D\u044B\u0439 \u0440\u0435\u0439\u0442\u0438\u043D\u0433"),for:{sections:["Leaderboard"]},question:"Is competing on a weekly leaderboard a good fit for this product?",kind:"noul",yes:"Yes: players like to compete and compare their scores.",no:"No: it is a calm, personal or creative product without competition.",onYes:[{section:"Leaderboard",op:"set",path:"Definitions.weekly_score.IsEnabled",value:true}],onNo:[{section:"Leaderboard",op:"set",path:"Definitions.weekly_score.IsEnabled",value:false}]}],Mn=(e,t,n,s)=>({id:e,title:W(t,n),what:s,patches:[{section:"Currency",op:"set",path:"VirtualCurrencies.CO.DisplayName",value:t},{section:"GameSpec",op:"set",path:"texts.'res.coins'",value:{en:t,ru:n}}],translations:{ru:{[t]:n}}}),tr=(e,t,n,s)=>({id:e,title:W(t,n),what:s,patches:[{section:"Currency",op:"set",path:"VirtualCurrencies.GE.DisplayName",value:t}],translations:{ru:{[t]:n}}}),gu=[{id:"texts.coin-name",group:"texts",title:W("Name of the coins","\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u043C\u043E\u043D\u0435\u0442"),for:{sections:["Currency"]},question:"What should the game's soft currency (earned in rounds) be called?",kind:"choice",options:[Mn("coins","Coins","\u041C\u043E\u043D\u0435\u0442\u044B","Plain coins: fits anything."),Mn("gold","Gold","\u0417\u043E\u043B\u043E\u0442\u043E","Gold: fantasy, medieval, pirates, treasure."),Mn("credits","Credits","\u041A\u0440\u0435\u0434\u0438\u0442\u044B","Credits: sci-fi, space, future, robots."),Mn("cash","Cash","\u041D\u0430\u043B\u0438\u0447\u043D\u044B\u0435","Cash: business, city, modern life, tycoon."),Mn("scrap","Scrap","\u0425\u043B\u0430\u043C","Scrap: post-apocalypse, survival, junk."),Mn("candies","Candies","\u041A\u043E\u043D\u0444\u0435\u0442\u044B","Candies: sweets, kids, cozy cartoon."),Mn("stars","Stars","\u0417\u0432\u0451\u0437\u0434\u044B","Stars: kids, space, dreams, music."),Mn("bones","Bones","\u041A\u043E\u0441\u0442\u0438","Bones: pets, dogs, dinosaurs, halloween."),Mn("shells","Shells","\u0420\u0430\u043A\u0443\u0448\u043A\u0438","Shells: the sea, islands, mermaids."),Mn("leaves","Leaves","\u041B\u0438\u0441\u0442\u044C\u044F","Leaves: nature, forest, farm, elves.")]},{id:"texts.gem-name",group:"texts",title:W("Name of the gems","\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u043A\u0440\u0438\u0441\u0442\u0430\u043B\u043B\u043E\u0432"),for:{sections:["Currency"]},question:"What should the game's premium currency be called?",kind:"choice",options:[tr("gems","Gems","\u041A\u0440\u0438\u0441\u0442\u0430\u043B\u043B\u044B","Gems: fits anything."),tr("diamonds","Diamonds","\u0410\u043B\u043C\u0430\u0437\u044B","Diamonds: luxury, mining, treasure."),tr("rubies","Rubies","\u0420\u0443\u0431\u0438\u043D\u044B","Rubies: fantasy, royal, magic."),tr("crystals","Energy cells","\u042D\u043D\u0435\u0440\u0433\u043E\u044F\u0447\u0435\u0439\u043A\u0438","Energy cells: sci-fi, robots, space."),tr("pearls","Pearls","\u0416\u0435\u043C\u0447\u0443\u0433","Pearls: the sea, mermaids, elegance."),tr("orbs","Orbs","\u0421\u0444\u0435\u0440\u044B","Magic orbs: wizards, spells, mystery."),tr("tokens","Tokens","\u0416\u0435\u0442\u043E\u043D\u044B","Tokens: arcade, casino, retro."),tr("hearts","Hearts","\u0421\u0435\u0440\u0434\u0435\u0447\u043A\u0438","Hearts: cute, love, pets, kids.")]}],bu=new Set(["Look","GameSpec"]),Oa=e=>e?.map(t=>bu.has(t.section)?t:{...t,ifExists:true}),vu=e=>{switch(e.kind){case "choice":return e.options?{...e,options:e.options.map(t=>({...t,patches:Oa(t.patches)}))}:e;case "score":return {...e,patches:Oa(e.patches)};case "noul":return {...e,onYes:Oa(e.onYes),...e.onNo?{onNo:Oa(e.onNo)}:{}}}},$d=[...pu,...uu,...fu,...mu,...yu,...gu].map(vu),xu={version:Id,knobs:$d,lists:Ol};var Ll=/^[a-z0-9][a-z0-9_.-]{0,63}$/,ku=new Set(["set","merge","unset","add","remove"]),Su=/[\u2013\u2014]/;function Da(e,t,n,s=false){(!e||e.length===0)&&n.push(`${t}: no patches`);for(let[r,o]of (e??[]).entries())(!o.section||!/^[A-Z][A-Za-z0-9]*$/.test(o.section))&&n.push(`${t}.patches[${r}]: section "${o.section}"`),ku.has(o.op)||n.push(`${t}.patches[${r}]: op "${o.op}"`),Ma(o.path)===null&&n.push(`${t}.patches[${r}]: path "${o.path}"`),s&&o.op==="set"&&!o.range&&o.value===void 0&&n.push(`${t}.patches[${r}]: a score patch needs a range`),o.range&&!(Number.isFinite(o.range.min)&&Number.isFinite(o.range.max))&&n.push(`${t}.patches[${r}]: range`);}function Bd(e,t,n){e.length===0&&n.push(`${t}: no options`),e.length>255&&n.push(`${t}: ${e.length} options, the decision model takes ${255}`);let s=new Set;for(let r of e)Ll.test(r.id)||n.push(`${t}: option id "${r.id}"`),s.has(r.id)&&n.push(`${t}: option "${r.id}" twice`),s.add(r.id),r.title?.en||n.push(`${t}.${r.id}: no English title`),r.what||n.push(`${t}.${r.id}: no description for the decision model`),Da(r.patches,`${t}.${r.id}`,n);}function wl(e,t){if(typeof e=="string")t.push(e);else if(Array.isArray(e))for(let n of e)wl(n,t);else if(e&&typeof e=="object")for(let n of Object.values(e))wl(n,t);}function Eu(e){let t=[];for(let[r,o]of Object.entries(e.lists))Ll.test(r)||t.push(`list "${r}": id`),Bd(o,`list ${r}`,t);let n=new Set;for(let r of e.knobs){let o=`knob ${r.id}`;Ll.test(r.id)||t.push(`${o}: id`),n.has(r.id)&&t.push(`${o}: twice`),n.add(r.id),r.title?.en||t.push(`${o}: no English title`),r.question||t.push(`${o}: no question`),r.kind==="choice"?(r.list&&r.options&&t.push(`${o}: options OR a list, not both`),r.list&&!e.lists[r.list]&&t.push(`${o}: no list "${r.list}"`),r.list||Bd(r.options??[],o,t)):r.kind==="score"?((r.levels.length<2||r.levels.length>10)&&t.push(`${o}: ${r.levels.length} levels, 2..${10}`),r.levelTitles?.length!==r.levels.length?t.push(`${o}: levelTitles must name every level`):r.levelTitles.forEach((c,d)=>{(!c.en||!c.ru)&&t.push(`${o}: level ${d} needs en and ru titles`);}),Da(r.patches,o,t,true)):r.kind==="noul"?((!r.yes||!r.no)&&t.push(`${o}: yes and no`),Da(r.onYes,o,t),r.onNo&&Da(r.onNo,`${o}.no`,t)):t.push(`${o}: kind`);}let s=[];wl(e,s);for(let r of s)Su.test(r)&&t.push(`a long dash in "${r.slice(0,60)}"`);return t}export{Pi as ABILITIES,kr as ASSET_PACKS,wd as BACKGROUND_OPTIONS,Vn as BLOCKS,Gi as BOSS_DEFEATED,Vs as BOSS_SPAWNED,Ui as BRANCH_LEVEL,jt as Body,Nn as Bullet,zs as CHAPTERS,zl as CORE_EFFECTS,Ed as DECISION_MAX_LEVELS,Sd as DECISION_MAX_OPTIONS,Vl as DEFAULT_REWARDS,Yp as DEMO_SPEC,Xt as Drop,co as EFFECTS,hr as ENEMIES,Yo as ENGINES,Il as ENTRY_ID_RE,Zt as ExprError,Cn as FOES,Na as FUNCTIONS,$e as Foe,Ft as GIVE_UP,qn as Gem,Fr as HEROES,Ad as HERO_LOOK_OPTIONS,cn as Jumper,Dd as KIT_PALETTES,$d as KNOBS,xu as KNOB_CATALOG,Id as KNOB_CATALOG_VERSION,Ol as KNOB_LISTS,Wl as KNOWN_SYSTEMS,lr as LEVELS_PER_WORLD,Ni as LEVEL_CLEARED,Yi as LEVEL_MAPS,zi as LEVEL_UP,uo as LINKS,du as LOOK_RUNTIME_IDS,Qa as M3_CHARACTER,ko as M3_ELEMENTS,ja as M3_ENEMIES,Lr as M3_HEROES,is as M3_LEVELS,xo as M3_LEVELS_PER_WORLD,as as M3_LEVEL_DEFS,sc as M3_META,ei as M3_META_STATS,Dn as M3_OBSTACLES,qa as M3_PIECES,Xa as M3_SKILLS,or as M3_SPECIALS,nc as M3_WORLDS,Ya as M3_WORLD_STARS,qi as MAPS,Sn as MAP_COLS,En as MAP_ROWS,Qt as MAX_LEVEL,$s as MAX_PASSIVES,Ns as MAX_WEAPONS,Bi as META_CHARACTER,$i as META_STATS,sr as MG_BOARDS,_o as MG_CHAINS,Si as MG_CHARACTER,mc as MG_COLS,Nr as MG_HEROES,Ms as MG_LEVELS,Ir as MG_LEVELS_PER_WORLD,Es as MG_LEVEL_DEFS,bc as MG_META,Ei as MG_META_STATS,rn as MG_OBSTACLES,Rs as MG_REVIVE_ENERGY,yc as MG_ROWS,vi as MG_SKILLS,yi as MG_SPECIAL_ITEMS,gc as MG_WORLDS,xi as MG_WORLD_STARS,To as MergeItem,mr as Missile,es as OBSTACLE_KINDS,Lc as Order,Gr as PASSIVES,Bs as PASSIVE_IDS,Ul as PIECE_COLORS,Ci as PLATFORMER_CHARACTER,Vr as PLATFORMER_HEROES,Ps as PLATFORMER_LEVELS,Nc as PLATFORMER_META,Ii as PLATFORMER_META_STATS,ka as PLATFORM_LINKS,so as PLATFORM_PACKS,kd as PLATFORM_PRESETS,fn as POWERS,go as POWER_IDS,Gn as PRESETS,Hc as REROLL_GEMS,Kt as REVIVE,Wc as REVIVE_GEMS,Gt as REVIVE_OFFER,ws as ROOMS,Lt as ROOM_ROWS,zt as ROUND_ENDED,Bt as ROUND_OVER,$t as ROUND_STARTED,Ka as RUNNER_CHARACTER,Dr as RUNNER_HEROES,yo as RUNNER_LEVELS,Xl as RUNNER_META,Fa as RUNNER_META_STATS,Te as Raider,xt as RoadItem,On as Runner,Lo as SELL_SHARE,Wt as SHOW_START,Cd as SOUND_SET_OPTIONS,ho as SPEC_VERSION,qr as SPELLS,Ga as START_ROUND,Vc as SURVIVORS_META,fr as Shot,hn as Soldier,Js as Spot,Hs as Survivor,Qi as TD_CHARACTER,Jr as TD_HEROES,Co as TD_LEVELS,xn as TD_LEVELS_PER_WORLD,Xc as TD_LIVES,Yc as TD_META,el as TD_META_STATS,js as TD_REVIVE_LIVES,ji as TD_WORLDS,Xi as TD_WORLD_STARS,Ks as TOWERS,No as TY_BUSINESSES,ll as TY_CHARACTER,Qr as TY_EVENTS,eo as TY_HEROES,Zr as TY_LEVELS,to as TY_LEVELS_PER_WORLD,gr as TY_LEVEL_DEFS,sd as TY_META,cl as TY_META_STATS,$o as TY_MILESTONES,oa as TY_REVIVE_SECONDS,ol as TY_SKILLS,ta as TY_UPGRADES,rd as TY_WORLDS,sl as TY_WORLD_STARS,lt as Thing,sn as Tower,ml as TyManager,Od as UI_THEMES,Hi as UPGRADE_PICK,Wi as UPGRADE_PICKED,Vi as UPGRADE_REROLL,nl as WAVE_STARTED,vn as WEAPONS,dr as WEAPON_IDS,Ai as WORLDS,Li as WORLD_STARS,Cs as abilitiesFor,He as act,rp as applyLink,tu as applyPatches,za as attachRules,Fn as boardOf,Kc as buildFromVar,Ki as buildToVar,Tn as cellAt,Qe as cellCenter,Kr as chapterOf,Ha as checkEconomy,$a as checkExpr,jo as checkRules,dn as compileExpr,pn as contentOf,vl as cozyPack,pp as createKitRegistry,Uo as createRegistry,_l as defenseBoostsLink,Rn as defineKind,en as enemyOf,Ba as evalNumber,gl as fantasyPack,Pr as findMatches,V as fx,Wa as hasErrors,ai as hasMove,fd as heroCharacterOf,Sl as heroUpgradeLink,ns as laneRunnerBlock,Tr as levelOf,Eo as m3EnemyOf,wr as m3LevelOf,os as m3SkillOf,Ja as m3StarsToEnter,vs as match3Block,bd as match3Preset,As as mergeBlock,vd as mergePreset,Or as metersOf,gn as mgChainOf,$r as mgLevelOf,Ss as mgSkillOf,wn as mgSpecialOf,_s as mgStarsFor,ki as mgStarsToEnter,Gl as migrateSpec,jr as mirrored,Fc as offerFromVar,Fi as offerToVar,np as packName,Ma as parseKnobPath,ru as patchTargets,_d as patchValue,Tt as placeBackdrop,Is as platformerBlock,Hr as platformerLevelOf,md as platformerPreset,xl as postApocalypsePack,El as puzzleCityLink,po as registerCoreEffects,Xp as registerPlatformKit,Xo as resolveParams,Qo as roundBlock,Ml as runnerCollectionLink,hd as runnerPreset,bl as sciFiPack,mo as scrollBackdrop,et as setPose,an as shortCash,Jp as specForPreset,wi as starsToEnter,up as startMode,Gs as survivorsBlock,yd as survivorsPreset,Yr as tdLevelOf,qs as tdStarsFor,Zi as tdStarsToEnter,Ji as tdWavesOf,Fs as towerArt,Zs as towerDefenseBlock,gd as towerDefensePreset,kn as towerOf,Po as towerSpent,wo as towerStats,Xr as traceMap,_r as trackControls,ba as tyBotTimeOf,yr as tyBusinessOf,Qc as tyEventOf,ro as tyLevelOf,na as tySkillOf,ra as tyStarsFor,al as tyStarsToEnter,va as tycoonBlock,xd as tycoonPreset,pd as tycoonStateOf,Eu as validateKnobCatalog,lp as validateSpec,Ie as viewOf};
1
+ import {b,m,l,i,c,j,n,f,k,e}from'./chunk-NBIYNARI.js';export{o as ART,l as DEFAULT_CAST,m as DEFAULT_LOOK,g as DEFAULT_PALETTE,n as FX_TOPIC,j as INPUT_TOPIC,e as Transform,k as VIEW_RESIZED_TOPIC,f as Visual,c as World,q as artAspect,r as artDocument,d as createFixedStepper,a as createRng,b as defineComponent,p as hasArt,i as mergePalette,h as resolveColor}from'./chunk-NBIYNARI.js';function Rn(e){if(!jd.test(e))throw new Error(`registry: bad kind name "${e}"`);return Object.freeze({name:e})}var Il=/^[a-z0-9][a-z0-9-]*(?:\.[a-z0-9][a-z0-9-]*)*$/,jd=/^[a-z][a-z0-9-]*$/;function Uo(e){let t=new Map,n=r=>{let o=t.get(r);return o||(o=new Map,t.set(r,o)),o},s={define(r,o,d){if(!o||typeof o!="object")throw new Error(`registry: ${r.name} entry must be an object`);if(typeof o.id!="string"||!Il.test(o.id))throw new Error(`registry: ${r.name} has a bad id "${String(o.id)}"`);if(!Number.isInteger(o.version)||o.version<1)throw new Error(`registry: ${r.name} "${o.id}" needs an integer version \u2265 1`);let p=n(r.name);if((p.has(o.id)||(e?.has(r,o.id)??false))&&!d?.override)throw new Error(`registry: ${r.name} "${o.id}" is already defined (pass { override: true } to replace it)`);let M=Object.freeze({...o});return p.set(o.id,M),M},get(r,o){let d=t.get(r.name)?.get(o);return d||e?.get(r,o)},require(r,o){let d=s.get(r,o);if(!d)throw new Error(`registry: no ${r.name} "${o}"`);return d},has(r,o){return s.get(r,o)!==void 0},list(r){let o=new Map;for(let d of e?.list(r)??[])o.set(d.id,d);for(let[d,p]of t.get(r.name)??[])o.set(d,p);return [...o.values()].sort((d,p)=>d.id<p.id?-1:d.id>p.id?1:0)},extend(){return Uo(s)}};return s}var Jt=class extends Error{constructor(n,s,r){super(`${n} at ${r} in "${s}"`);this.source=s;this.at=r;this.name="ExprError";}source;at},Nl=2e3,Ia=64,tt=e=>{let t=typeof e=="number"?e:typeof e=="boolean"?e?1:0:Number(e);return Number.isFinite(t)?t:0},nr=e=>typeof e=="string"?e.length>0:!!e,Na={min:(...e)=>e.length?Math.min(...e):0,max:(...e)=>e.length?Math.max(...e):0,abs:(e=0)=>Math.abs(e),floor:(e=0)=>Math.floor(e),ceil:(e=0)=>Math.ceil(e),round:(e=0)=>Math.round(e),sqrt:(e=0)=>Math.sqrt(Math.max(0,e)),pow:(e=0,t=1)=>Math.pow(e,t),log:(e=1)=>e>0?Math.log(e):0,clamp:(e=0,t=0,n=1)=>Math.min(Math.max(e,t),n),lerp:(e=0,t=0,n=0)=>e+(t-e)*n,sign:(e=0)=>Math.sign(e),step:(e=0,t=0)=>t<e?0:1},Xd=["&&","||","==","!=","<=",">=","+","-","*","/","%","^","<",">","!","?",":","(",")",","];function Yd(e){let t=[],n=0;for(;n<e.length;){let s=e[n];if(s===" "||s===" "||s===`
2
+ `||s==="\r"){n++;continue}if(s>="0"&&s<="9"||s==="."&&/[0-9]/.test(e[n+1]??"")){let o=/^(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?/.exec(e.slice(n));if(!o)throw new Jt("bad number",e,n);t.push({t:"num",v:Number(o[0]),at:n}),n+=o[0].length;continue}if(s==="'"||s==='"'){let o=e.indexOf(s,n+1);if(o<0)throw new Jt("unclosed string",e,n);t.push({t:"str",v:e.slice(n+1,o),at:n}),n=o+1;continue}if(/[A-Za-z_$]/.test(s)){let o=/^[A-Za-z_$][A-Za-z0-9_$]*(?:\.[A-Za-z_$][A-Za-z0-9_$]*)*/.exec(e.slice(n));if(!o)throw new Jt("bad name",e,n);t.push({t:"id",v:o[0],at:n}),n+=o[0].length;continue}let r=Xd.find(o=>e.startsWith(o,n));if(!r)throw new Jt(`unexpected "${s}"`,e,n);t.push({t:"op",v:r,at:n}),n+=r.length;}return t.push({t:"end",at:e.length}),t}var $l={"||":1,"&&":2,"==":3,"!=":3,"<":4,"<=":4,">":4,">=":4,"+":5,"-":5,"*":6,"/":6,"%":6,"^":8};function Jd(e){let t=Yd(e),n=0,s=()=>t[n],r=()=>t[n++],o=K=>{let z=s();return z.t==="op"&&z.v===K},d=K=>{let z=r();if(z.t!=="op"||z.v!==K)throw new Jt(`expected "${K}"`,e,z.at)},p=K=>{if(K>Ia)throw new Jt("formula is nested too deep",e,s().at);let z=v(0,K+1);if(!o("?"))return z;r();let ne=p(K+1);d(":");let ae=p(K+1);return {k:"cond",c:z,a:ne,b:ae}},v=(K,z)=>{if(z>Ia)throw new Jt("formula is nested too deep",e,s().at);let ne=M(z+1);for(;;){let ae=s();if(ae.t!=="op")break;let j=$l[ae.v];if(j===void 0||j<K)break;r();let ue=ae.v==="^"?v(j,z+1):v(j+1,z+1);ne={k:"bin",op:ae.v,a:ne,b:ue};}return ne},M=K=>{if(K>Ia)throw new Jt("formula is nested too deep",e,s().at);return o("-")||o("!")?{k:"un",op:r().v,a:v($l["^"],K+1)}:O(K+1)},O=K=>{let z=r();if(z.t==="num")return {k:"num",v:z.v};if(z.t==="str")return {k:"str",v:z.v};if(z.t==="op"&&z.v==="("){let ne=p(K+1);return d(")"),ne}if(z.t==="id"){if(z.v==="true")return {k:"bool",v:true};if(z.v==="false")return {k:"bool",v:false};if(o("(")){if(!Object.prototype.hasOwnProperty.call(Na,z.v))throw new Jt(`unknown function "${z.v}"`,e,z.at);r();let ne=[];if(!o(")"))for(;;){if(ne.push(p(K+1)),o(",")){r();continue}break}return d(")"),{k:"call",fn:z.v,args:ne}}return {k:"var",path:z.v.split(".")}}throw new Jt(z.t==="end"?"unexpected end":"unexpected token",e,z.at)},E=p(0),I=s();if(I.t!=="end")throw new Jt("unexpected token",e,I.at);return E}function Zd(e,t){let n=e;for(let s of t){if(n===null||typeof n!="object"||!Object.prototype.hasOwnProperty.call(n,s))return 0;n=n[s];}return typeof n=="number"||typeof n=="string"||typeof n=="boolean"?n:0}function Yt(e,t){switch(e.k){case "num":case "str":case "bool":return e.v;case "var":return Zd(t,e.path);case "un":return e.op==="-"?-tt(Yt(e.a,t)):!nr(Yt(e.a,t));case "cond":return nr(Yt(e.c,t))?Yt(e.a,t):Yt(e.b,t);case "call":return tt(Na[e.fn](...e.args.map(n=>tt(Yt(n,t)))));case "bin":{if(e.op==="&&")return nr(Yt(e.a,t))&&nr(Yt(e.b,t));if(e.op==="||")return nr(Yt(e.a,t))||nr(Yt(e.b,t));let n=Yt(e.a,t),s=Yt(e.b,t);switch(e.op){case "==":return typeof n=="string"||typeof s=="string"?String(n)===String(s):tt(n)===tt(s);case "!=":return typeof n=="string"||typeof s=="string"?String(n)!==String(s):tt(n)!==tt(s);case "<":return tt(n)<tt(s);case "<=":return tt(n)<=tt(s);case ">":return tt(n)>tt(s);case ">=":return tt(n)>=tt(s);case "+":return typeof n=="string"||typeof s=="string"?`${n}${s}`:tt(n)+tt(s);case "-":return tt(n)-tt(s);case "*":return tt(n)*tt(s);case "/":{let r=tt(s);return r===0?0:tt(n)/r}case "%":{let r=tt(s);return r===0?0:tt(n)%r}case "^":return tt(Math.pow(tt(n),tt(s)))}return 0}}}function Hn(e,t){switch(e.k){case "var":t.add(e.path.join("."));return;case "un":Hn(e.a,t);return;case "bin":Hn(e.a,t),Hn(e.b,t);return;case "cond":Hn(e.c,t),Hn(e.a,t),Hn(e.b,t);return;case "call":for(let n of e.args)Hn(n,t);return;default:return}}var qo=new Map;function dn(e){let t=qo.get(e);if(t)return t;if(e.length>Nl)throw new Jt("formula is too long",e,Nl);let n=Jd(e),s=new Set;Hn(n,s);let r={source:e,reads:[...s],eval:o=>Yt(n,o),num:o=>tt(Yt(n,o)),bool:o=>nr(Yt(n,o))};return qo.size>5e3&&qo.clear(),qo.set(e,r),r}function $a(e){try{return dn(e),null}catch(t){return t instanceof Error?t.message:String(t)}}function Ba(e,t,n=0){return e===void 0?n:typeof e=="number"?Number.isFinite(e)?e:n:dn(e).num(t)}var co=Rn("effect"),Qd=/^[a-z][a-z0-9_]*$/,Bl=e=>{let t=e.name;if(typeof t!="string"||!Qd.test(t))throw new Error(`effect ${e.type}: bad var name`);return t},zl=[{id:"set-var",version:1,required:["name","value"],formulas:["value"],run(e,t){let n=t.value,s=typeof n=="string"?dn(n).eval(e.scope):typeof n=="number"||typeof n=="boolean"?n:0;e.world.vars[Bl(t)]=s;}},{id:"add-var",version:1,required:["name","amount"],formulas:["amount","min","max"],run(e,t){let n=Bl(t),s=e.world.vars[n],r=(typeof s=="number"?s:0)+e.num(t.amount);t.min!==void 0&&(r=Math.max(r,e.num(t.min))),t.max!==void 0&&(r=Math.min(r,e.num(t.max))),e.world.vars[n]=r;}},{id:"emit",version:1,required:["topic"],run(e,t){let n=t.topic;if(typeof n!="string"||n.length===0)throw new Error("effect emit: topic required");let s=t.payload,r={};if(s&&typeof s=="object")for(let[o,d]of Object.entries(s))r[o]=typeof d=="string"?dn(d).eval(e.scope):d;e.world.emit(n,r);}}];function po(e){for(let t of zl)e.has(co,t.id)||e.define(co,t);}function jo(e,t,n,s){let r=new Set;e.forEach((o,d)=>{let p=`${n}.${d}`;if(!o||typeof o!="object"){s.push({level:"error",path:p,code:"RULE_SHAPE",message:"a rule must be an object"});return}if(typeof o.id!="string"||o.id.length===0?s.push({level:"error",path:`${p}.id`,code:"RULE_ID",message:"a rule needs an id"}):r.has(o.id)?s.push({level:"error",path:`${p}.id`,code:"RULE_DUPLICATE",message:`rule "${o.id}" is defined twice`}):r.add(o.id),(typeof o.on!="string"||o.on.length===0)&&s.push({level:"error",path:`${p}.on`,code:"RULE_TRIGGER",message:"a rule needs an event topic in `on`"}),o.when!==void 0)try{dn(String(o.when));}catch(v){s.push({level:"error",path:`${p}.when`,code:"RULE_FORMULA",message:v.message});}if(!Array.isArray(o.do)||o.do.length===0){s.push({level:"error",path:`${p}.do`,code:"RULE_EFFECTS",message:"a rule needs at least one effect"});return}o.do.forEach((v,M)=>{let O=`${p}.do.${M}`,E=typeof v?.type=="string"?t.get(co,v.type):void 0;if(!E){s.push({level:"error",path:`${O}.type`,code:"EFFECT_UNKNOWN",message:`unknown effect "${String(v?.type)}"`});return}for(let I of E.required??[])v[I]===void 0&&s.push({level:"error",path:`${O}.${I}`,code:"EFFECT_PARAM",message:`effect "${E.id}" needs "${I}"`});for(let I of E.formulas??[]){let K=v[I];if(typeof K=="string")try{dn(K);}catch(z){s.push({level:"error",path:`${O}.${I}`,code:"RULE_FORMULA",message:z.message});}}});});}function za(e,t,n,s={}){let r=t.map(p=>({def:p,...p.when!==void 0?{when:dn(p.when)}:{},effects:p.do.map(v=>({spec:v,def:n.require(co,v.type)})),hits:0,runs:0,lastRunAt:Number.NEGATIVE_INFINITY})),o=new Map;for(let p of r){let v=o.get(p.def.on)??[];v.push(p),o.set(p.def.on,v);}let d=[...o.entries()].map(([p,v])=>e.on(p,M=>{for(let O of v){if(O.def.once&&O.runs>0)continue;let E={event:M,vars:e.vars,tick:e.tick,time:e.time};if(O.when&&!O.when.bool(E)||(O.hits++,O.def.every!==void 0&&O.def.every>1&&O.hits%O.def.every!==0)||O.def.cooldown!==void 0&&e.time-O.lastRunAt<O.def.cooldown)continue;O.runs++,O.lastRunAt=e.time;let I={world:e,rule:O.def,event:M,scope:E,num:(K,z=0)=>typeof K=="number"||typeof K=="string"?Ba(K,E,z):z};for(let K of O.effects)try{K.def.run(I,K.spec);}catch(z){s.onError?.(O.def,z);}}}));return ()=>d.forEach(p=>p())}var Wa=e=>e.some(t=>t.level==="error");function Xo(e,t,n,s){let r={};for(let[o,d]of Object.entries(e))r[o]=d.default;if(!t)return r;for(let[o,d]of Object.entries(t)){let p=e[o],v=`${n}.${o}`;if(!p){s.push({level:"warning",path:v,code:"PARAM_UNKNOWN",message:`unknown parameter "${o}"`});continue}switch(p.type){case "number":{if(typeof d!="number"||!Number.isFinite(d)){s.push({level:"warning",path:v,code:"PARAM_TYPE",message:"expected a number, default used"});break}let M=p.integer?Math.round(d):d;p.min!==void 0&&M<p.min&&(M=p.min),p.max!==void 0&&M>p.max&&(M=p.max),M!==d&&s.push({level:"warning",path:v,code:"PARAM_CLAMPED",message:`${d} \u2192 ${M}`}),r[o]=M;break}case "enum":typeof d=="string"&&p.values.includes(d)?r[o]=d:s.push({level:"warning",path:v,code:"PARAM_ENUM",message:`not one of ${p.values.join(", ")}, default used`});break;case "boolean":typeof d=="boolean"?r[o]=d:s.push({level:"warning",path:v,code:"PARAM_TYPE",message:"expected true/false, default used"});break;case "string":if(typeof d=="string"){let M=p.maxLength??500;r[o]=d.length>M?d.slice(0,M):d,d.length>M&&s.push({level:"warning",path:v,code:"PARAM_CLAMPED",message:`cut to ${M} characters`});}else s.push({level:"warning",path:v,code:"PARAM_TYPE",message:"expected text, default used"});break}}return r}var Yo=["phaser","three","dom"],Vn=Rn("block"),Gn=Rn("preset");var Wl=["store","premium","character","inventory","lootboxes","boosts","leaderboard","rewards","quests","collections","craft","marketplace","deals","events","coop-events","season","pvp","mailbox","reward-window","idle"],ep=/^system:([a-z][a-z0-9-]*)$/,tp=new Set(["currency","item"]);function Ha(e,t,n,s){let r=new Set(e.map(v=>v.id)),o=new Set(t.map(v=>v.id)),d=new Map,p=new Map;n.forEach((v,M)=>{let O=`flows.${M}`;o.has(v.resource)||s.push({level:"error",path:`${O}.resource`,code:"FLOW_RESOURCE_UNKNOWN",message:`no resource "${v.resource}"`});let E=ep.exec(v.by);E?Wl.includes(E[1])||s.push({level:"warning",path:`${O}.by`,code:"FLOW_SYSTEM_UNKNOWN",message:`"${v.by}" is not a platform system`}):r.has(v.by)||s.push({level:"error",path:`${O}.by`,code:"FLOW_BY_UNKNOWN",message:`"${v.by}" is neither a mode of the spec nor "system:<id>"`}),v.kind!=="source"&&v.kind!=="sink"&&s.push({level:"error",path:`${O}.kind`,code:"FLOW_KIND",message:'kind is "source" or "sink"'});let I=v.kind==="source"?d:p;I.set(v.resource,(I.get(v.resource)??0)+1);}),t.forEach((v,M)=>{let O=`resources.${M}`,E=d.get(v.id)??0,I=p.get(v.id)??0;E===0&&s.push({level:"error",path:O,code:"RESOURCE_NO_SOURCE",message:`nothing produces "${v.id}"`}),tp.has(v.kind)&&I===0&&s.push({level:"error",path:O,code:"RESOURCE_NO_SINK",message:`nothing spends "${v.id}"`});});}var kr=Rn("asset-pack"),uo=Rn("link"),np=(e,t="en")=>e.names[t]??e.names.en??e.id;function rp(e,t,n){let s=[],r=n.get(uo,t);if(!r)return s.push({level:"error",path:"link",code:"LINK_UNKNOWN",message:`no link "${t}"`}),{spec:e,systems:[],issues:s};let o=e.modes.find(p=>p.role==="core")??e.modes[0],d=o?n.get(Gn,o.preset)?.genre:void 0;return !d||!r.core.includes(d)?(s.push({level:"error",path:"link",code:"LINK_GENRE",message:`link "${t}" fits ${r.core.join(", ")}, not "${d??"?"}"`}),{spec:e,systems:[],issues:s}):{spec:r.apply(e),systems:r.systems,issues:s}}var ho=1;function pn(e,t,n){let s=e?.content[t];if(!s||s.length===0)return n;let r=n.filter(o=>!s.includes(o));return r.length>0?r:n}var Vl=Object.freeze({window:"round",adMultiplier:3,vipMultiplier:5}),op={};function Gl(e,t){let n={...e},s=n.v===void 0?1:n.v;if(typeof s!="number"||!Number.isInteger(s)||s<1)return t.push({level:"error",path:"v",code:"SPEC_VERSION",message:"v must be an integer \u2265 1"}),null;if(s>ho)return t.push({level:"error",path:"v",code:"SPEC_TOO_NEW",message:`spec v${s} is newer than this kit (v${ho})`}),null;for(;s<ho;){let r=op[s];if(!r)return t.push({level:"error",path:"v",code:"SPEC_NO_MIGRATION",message:`no migration from v${s}`}),null;n=r(n),s++;}return n.v=ho,n}var Va=/^[a-z][a-z0-9_]*$/,sp=/^#[0-9a-fA-F]{6}(?:[0-9a-fA-F]{2})?$/,ap=/^[a-z]{2}(?:-[A-Z]{2})?$/,ip=/^[a-z][a-z0-9_.-]*$/,Hl=["none","async","coop","pvp"],ut=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),fo=e=>Array.isArray(e)?e:[];function lp(e,t){let n=[];if(!ut(e))return n.push({level:"error",path:"",code:"SPEC_SHAPE",message:"a spec must be an object"}),{ok:false,issues:n};let s=Gl(e,n);if(!s)return {ok:false,issues:n};let r=s;Yo.includes(r.engine)||n.push({level:"error",path:"engine",code:"SPEC_ENGINE",message:`engine is one of ${Yo.join(", ")}`});let o=fo(r.modes);o.length===0&&n.push({level:"error",path:"modes",code:"SPEC_NO_MODES",message:"a game needs at least one mode"});let d=new Set,p=[];o.forEach((j,ue)=>{let fe=`modes.${ue}`;if(!ut(j)){n.push({level:"error",path:fe,code:"MODE_SHAPE",message:"a mode must be an object"});return}typeof j.id!="string"||!Va.test(j.id)?n.push({level:"error",path:`${fe}.id`,code:"MODE_ID",message:"mode id: snake_case, starts with a letter"}):d.has(j.id)?n.push({level:"error",path:`${fe}.id`,code:"MODE_DUPLICATE",message:`mode "${j.id}" is defined twice`}):d.add(j.id);let ie=typeof j.preset=="string"?t.get(Gn,j.preset):void 0;if(!ie){n.push({level:"error",path:`${fe}.preset`,code:"MODE_PRESET_UNKNOWN",message:`no preset "${String(j.preset)}"`});return}ie.engine!==r.engine&&n.push({level:"error",path:`${fe}.preset`,code:"MODE_ENGINE",message:`preset "${ie.id}" runs on ${ie.engine}, the spec on ${String(r.engine)}`}),j.role!==void 0&&!["core","meta","embedded"].includes(j.role)&&n.push({level:"error",path:`${fe}.role`,code:"MODE_ROLE",message:"role is core, meta or embedded"});let xe=Xo(ie.params??{},ut(j.params)?j.params:void 0,`${fe}.params`,n),se={},_e=new Set(ie.blocks);for(let oe of ie.blocks){let me=t.get(Vn,oe);if(!me){n.push({level:"error",path:`${fe}.preset`,code:"PRESET_BLOCK_UNKNOWN",message:`preset "${ie.id}" uses unknown block "${oe}"`});continue}me.engines&&!me.engines.includes(ie.engine)&&n.push({level:"error",path:`${fe}.preset`,code:"BLOCK_ENGINE",message:`block "${oe}" is not drawn by ${ie.engine}`});for(let Q of me.requires??[])_e.has(Q)||n.push({level:"error",path:`${fe}.preset`,code:"BLOCK_REQUIRES",message:`block "${oe}" needs "${Q}" in the same preset`});let Se={};for(let[Q,Re]of Object.entries(ie.blockParams?.[oe]??{})){let We=me.params?.[Q];if(typeof Re=="string"&&(We?.type==="number"||We?.type==="boolean"))try{let we=dn(Re).eval({params:xe});Se[Q]=We.type==="number"?Number(we):!!we;}catch(we){n.push({level:"error",path:`${fe}.preset`,code:"PRESET_FORMULA",message:`preset "${ie.id}", ${oe}.${Q}: ${we.message}`});}else Se[Q]=Re;}let Ee={...Se,...ut(j.blockParams)&&ut(j.blockParams[oe])?j.blockParams[oe]:{}};se[oe]=Xo(me.params??{},Ee,`${fe}.blockParams.${oe}`,n);}if(ut(j.blockParams))for(let oe of Object.keys(j.blockParams))_e.has(oe)||n.push({level:"warning",path:`${fe}.blockParams.${oe}`,code:"BLOCK_NOT_IN_PRESET",message:`preset "${ie.id}" has no block "${oe}"`});let Ae=[...ie.rules??[],...fo(j.rules)];jo(Ae,t,`${fe}.rules`,n);let be={};if(j.content!==void 0)if(!ut(j.content))n.push({level:"warning",path:`${fe}.content`,code:"CONTENT_SHAPE",message:"content is { kind: { without: [ids] } }; ignored"});else for(let[oe,me]of Object.entries(j.content)){let Se=ut(me)?me.without:void 0;Array.isArray(Se)&&Se.every(Ee=>typeof Ee=="string")?be[oe]=[...Se]:n.push({level:"warning",path:`${fe}.content.${oe}`,code:"CONTENT_SHAPE",message:"expected { without: [ids] }; ignored"});}p.push({id:j.id,role:j.role??(ue===0?"core":"meta"),preset:ie,params:xe,blockParams:se,rules:Ae,content:be});}),o.length>0&&!o.some((j,ue)=>ut(j)?(j.role??(ue===0?"core":"meta"))==="core":false)&&n.push({level:"error",path:"modes",code:"SPEC_NO_CORE",message:"one mode must be the core (what the player plays)"});let v=fo(r.resources),M=new Set;v.forEach((j,ue)=>{let fe=`resources.${ue}`;if(!ut(j)||typeof j.id!="string"||!Va.test(j.id)){n.push({level:"error",path:fe,code:"RESOURCE_ID",message:"resource id: snake_case, starts with a letter"});return}M.has(j.id)&&n.push({level:"error",path:`${fe}.id`,code:"RESOURCE_DUPLICATE",message:`resource "${j.id}" is defined twice`}),M.add(j.id),["currency","item","score","local"].includes(j.kind)||n.push({level:"error",path:`${fe}.kind`,code:"RESOURCE_KIND",message:"kind is currency, item, score or local"}),(j.kind==="currency"||j.kind==="item")&&j.ref!==void 0&&(typeof j.ref!="string"||j.ref.length===0)&&n.push({level:"error",path:`${fe}.ref`,code:"RESOURCE_REF",message:"ref is the engine currency or item id"});});let O=fo(r.flows);O.forEach((j,ue)=>{if(typeof j?.amount=="string"){let fe=$a(j.amount);fe&&n.push({level:"error",path:`flows.${ue}.amount`,code:"FLOW_FORMULA",message:fe});}}),Ha(o.filter(ut),v.filter(j=>ut(j)&&typeof j.id=="string"),O.filter(ut),n);let E=fo(r.rules);jo(E,t,"rules",n);let I={};if(r.vars!==void 0)if(!ut(r.vars))n.push({level:"error",path:"vars",code:"VARS_SHAPE",message:"vars must be an object"});else for(let[j,ue]of Object.entries(r.vars))Va.test(j)?typeof ue=="number"||typeof ue=="string"||typeof ue=="boolean"?I[j]=ue:n.push({level:"error",path:`vars.${j}`,code:"VAR_TYPE",message:"a var is a number, text or true/false"}):n.push({level:"error",path:`vars.${j}`,code:"VAR_NAME",message:"var name: snake_case"});let K=typeof r.assets=="string"&&r.assets?t.get(kr,r.assets):void 0;if(r.assets!==void 0&&!K&&n.push({level:"warning",path:"assets",code:"ASSETS_UNKNOWN",message:`no asset pack "${String(r.assets)}"; the default look is used`}),r.palette!==void 0)if(!ut(r.palette))n.push({level:"error",path:"palette",code:"PALETTE_SHAPE",message:"palette must be an object"});else for(let[j,ue]of Object.entries(r.palette))(typeof ue!="string"||!sp.test(ue))&&n.push({level:"warning",path:`palette.${j}`,code:"PALETTE_COLOR",message:"a colour is #rrggbb or #rrggbbaa; ignored"});if(r.texts!==void 0)if(!ut(r.texts))n.push({level:"error",path:"texts",code:"TEXTS_SHAPE",message:"texts must be an object"});else for(let[j,ue]of Object.entries(r.texts)){if(ip.test(j)||n.push({level:"error",path:`texts.${j}`,code:"TEXT_KEY",message:"text key: lower case, digits, _ . -"}),!ut(ue)){n.push({level:"error",path:`texts.${j}`,code:"TEXT_SHAPE",message:"a text is { lang: text }"});continue}for(let[fe,ie]of Object.entries(ue))(!ap.test(fe)||typeof ie!="string")&&n.push({level:"error",path:`texts.${j}.${fe}`,code:"TEXT_LANG",message:"language code like en or pt-BR, value text"});ue.en===void 0&&n.push({level:"warning",path:`texts.${j}`,code:"TEXT_NO_EN",message:"no English text: other languages fall back to it"});}let z={...Vl};if(r.rewards!==void 0)if(!ut(r.rewards))n.push({level:"error",path:"rewards",code:"REWARDS_SHAPE",message:"rewards must be an object"});else {let j=(fe,ie,xe)=>{let se=r.rewards[fe];if(se===void 0)return;if(typeof se!="number"||!Number.isFinite(se)){n.push({level:"warning",path:`rewards.${fe}`,code:"PARAM_TYPE",message:"expected a number, default used"});return}let _e=Math.min(Math.max(se,ie),xe);_e!==se&&n.push({level:"warning",path:`rewards.${fe}`,code:"PARAM_CLAMPED",message:`${se} \u2192 ${_e}`}),z[fe]=_e;};j("adMultiplier",1,10),j("vipMultiplier",1,20);let ue=r.rewards.window;ue!==void 0&&(typeof ue=="string"&&/^[A-Za-z0-9_-]{1,64}$/.test(ue)?z.window=ue:n.push({level:"warning",path:"rewards.window",code:"PARAM_TYPE",message:"expected a window id, default used"}));}let ne=r.multiplayer??"none";Hl.includes(ne)||n.push({level:"error",path:"multiplayer",code:"SPEC_MULTIPLAYER",message:`multiplayer is one of ${Hl.join(", ")}`});let ae=!Wa(n);return {ok:ae,issues:n,spec:r,...ae?{resolved:{spec:r,engine:r.engine,seed:typeof r.seed=="string"&&r.seed.length>0?r.seed:"game",modes:p,resources:v,flows:O,rules:E,vars:I,rewards:z,multiplayer:ne,palette:i({...K?.palette,...ut(r.palette)?r.palette:{}}),texts:dp(K?.texts,ut(r.texts)?r.texts:void 0),look:{style:K?K.style??K.id:m.style,cast:cp({...l,...K?.cast},r.cast)}}}:{}}}function cp(e,t){let n={...e};if(!ut(t))return n;for(let[s,r]of Object.entries(t)){if(!ut(r))continue;let o={...n[s]};typeof r.preset=="string"&&(o.preset=r.preset),Array.isArray(r.races)&&r.races.every(d=>typeof d=="string")&&r.races.length>0&&(o.races=r.races),ut(r.parts)&&(o.parts={...o.parts,...r.parts}),ut(r.colors)&&(o.colors={...o.colors,...r.colors}),n[s]=o;}return n}function dp(e,t){let n={};for(let s of [e,t])for(let[r,o]of Object.entries(s??{}))if(o&&typeof o=="object")for(let[d,p]of Object.entries(o))typeof p=="string"&&((n[r]??={})[d]=p);return n}function pp(){let e=Uo();return po(e),e}function up(e,t,n,s={}){let r=e.modes.find(p=>p.id===t);if(!r)throw new Error(`game: no mode "${t}"`);let o=new c({seed:`${e.seed}/${r.id}${s.salt!==void 0?`/${s.salt}`:""}`,vars:e.vars});for(let p of r.preset.blocks)n.require(Vn,p).setup?.({world:o,spec:e,mode:r,params:r.blockParams[p]??{},registry:n});let d=za(o,[...r.rules,...e.rules],n,{...s.onRuleError?{onError:s.onRuleError}:{}});return o.emit("mode-started",{mode:r.id}),o.flushEvents(),{world:o,mode:r,stop:d}}var Ce=e=>({w:Number(e.vars.view_w??720),h:Number(e.vars.view_h??1280)}),Je=e=>e.vars.state==="playing",Kn=e=>e.vars.started_tick===e.tick,Fe=(e,t,n)=>{let s=Number(e.vars[t]??0)+n;return e.vars[t]=s,s},nn=(e,t)=>Number(e[t]);function Mt(e$1,t,n,s,r){let o=e$1.create();return e$1.set(o,e,{x:t,y:n}),e$1.set(o,f,s),r&&e$1.set(o,r.type,r.data),o}var nt=(e,t)=>{for(let n of e.query(t))e.destroy(n);};function _r(e){let t=new Set,n={down:false,x:0,y:0};return e.on(j,s=>{let r=s;r.type==="key"?t.add(r.key):r.type==="key-up"?t.delete(r.key):r.type==="press"||r.type==="move"?(n.down=true,n.x=r.x,n.y=r.y):r.type==="release"&&(n.down=false);}),{keys:t,pointer:n,axis(){return {x:(t.has("right")?1:0)-(t.has("left")?1:0),y:(t.has("down")?1:0)-(t.has("up")?1:0)}}}}function Fn(e,t,n,s){let r=e.h*(s.bottom-s.top),o=Math.floor(Math.min(e.w*(s.widthShare??.94)/t,r/n)),d=(e.w-o*t)/2,p=e.h*s.top+(r-o*n)/2;return {cols:t,rows:n,cell:o,left:d,top:p}}var Ze=(e,t,n)=>({x:e.left+e.cell*(t+.5),y:e.top+e.cell*(n+.5)});function Tn(e,t,n){let s=Math.floor((t-e.left)/e.cell),r=Math.floor((n-e.top)/e.cell);return s>=0&&s<e.cols&&r>=0&&r<e.rows?{col:s,row:r}:null}var Ul=["piece1","piece2","piece3","piece4","piece5","piece6"];b("kit.status");var Zo=e=>{let t=Math.max(0,Math.ceil(e));return `${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`},G=(e,t)=>e.emit(n,t),Mr=b("kit.backdrop");function Ot(e,t,n,s={}){for(let O of e.query(Mr))e.destroy(O);let r=Ce(e),o=(O,E,I,K)=>Mt(e,E,I,K,{type:Mr,data:{speed:O}});if(t==="top"){let O=s.pan?1:0;o(O,r.w/2,r.h/2,{shape:"tile",art:"floor",w:r.w,h:r.h,unit:Math.min(r.w,r.h)*.24,depth:-100});let E=e.rng.stream("backdrop"),I=Math.round(r.w*r.h/52e3),K=Math.min(r.w,r.h);for(let z=0;z<I;z++){let ne=K*E.range(.06,.1);o(O,E.range(0,r.w),E.range(0,r.h),{shape:"sprite",art:`decor${E.int(1,4)}`,w:ne,h:ne,depth:-95});}return}let d=n??r.h*.62;o(0,r.w/2,r.h/2,{shape:"sprite",art:"sky",w:r.w,h:r.h,depth:-100});let p=Math.min(r.w,r.h)*.34;o(.02,r.w*.74,d*.3,{shape:"sprite",art:"sun",w:p,h:p,depth:-99});let v=Math.min(r.h*.32,r.w*.55);o(.12,r.w/2,d-v/2,{shape:"tile",art:"far",w:r.w,h:v,depth:-90});let M=v*.62;o(.4,r.w/2,d-M/2+2,{shape:"tile",art:"near",w:r.w,h:M,depth:-80}),t==="board"?o(0,r.w/2,(r.h+d)/2,{shape:"tile",art:"ground",w:r.w,h:r.h-d+4,unit:v*.7,depth:-79}):o(0,r.w/2,(r.h+d)/2,{shape:"rect",w:r.w,h:r.h-d,color:"#140f0c",alpha:.92,depth:-79});}function mo(e,t){for(let n of e.query(Mr)){let s=e.need(n,Mr).speed;if(s<=0)continue;let r=e.need(n,f);r.shape==="tile"&&(r.scrollX=(r.scrollX??0)+t*s);}}function ql(e$1,t,n){let s=Ce(e$1),r=Math.min(s.w,s.h)*.1;for(let o of e$1.query(Mr)){if(e$1.need(o,Mr).speed<=0)continue;let d=e$1.need(o,f);if(d.shape==="tile"){d.scrollX=(d.scrollX??0)+t,d.scrollY=(d.scrollY??0)+n;continue}let p=e$1.need(o,e);p.x-=t,p.y-=n,p.x<-r?p.x+=s.w+2*r:p.x>s.w+r&&(p.x-=s.w+2*r),p.y<-r?p.y+=s.h+2*r:p.y>s.h+r&&(p.y-=s.h+2*r);}}function Qe(e,t,n){let s=e.get(t,f);s?.shape==="actor"&&(s.pose=n);}function ze(e,t,n){let s=e.get(t,f);s?.shape==="actor"&&(s.act=n,s.actN=(s.actN??0)+1);}var Er=b("kit.fading"),Kl=new WeakSet;function rr(e,t,n){e.set(t,Er,{left:n,total:n}),!Kl.has(e)&&(Kl.add(e),e.addSystem({id:"kit.fading",order:90,run(s,r){for(let o of s.query(Er)){let d=s.need(o,Er);d.left-=r;let p=s.get(o,f);p&&(p.alpha=Math.max(0,Math.min(1,d.left/d.total*2))),d.left<=0&&s.destroy(o);}}}));}var Ht=(e,t,n=5)=>n+t/Math.max(1,Ce(e).h),Sr=b("kit.hint"),Fl=new WeakSet,Jo=(e,t,n)=>({x:e+n*.11,y:t+n*.42});function ft(e$1,t,n,s=n,r){Dt(e$1);let o=r??Math.min(Ce(e$1).w,Ce(e$1).h)*.13,d={kind:t,ax:n.x,ay:n.y,bx:s.x,by:s.y,size:o,t:0},p=Jo(n.x,n.y,o);Mt(e$1,n.x,n.y,{shape:"circle",r:o*.22,color:"#ffffff",alpha:0,depth:89},{type:Sr,data:{...d,part:"ring"}}),Mt(e$1,p.x,p.y,{shape:"sprite",art:"hand",w:o,h:o,alpha:0,depth:90},{type:Sr,data:{...d,part:"hand"}}),!Fl.has(e$1)&&(Fl.add(e$1),e$1.addSystem({id:"kit.hints",order:95,run(v,M){for(let O of v.query(Sr)){let E=v.need(O,Sr);E.t+=M;let I=v.need(O,e),K=v.need(O,f);if(E.kind==="tap"){let z=E.t%1.2/1.2,ne=z>.35&&z<.55;if(E.part==="hand"){let ae=Jo(E.ax,E.ay+(ne?E.size*.06:0),E.size);I.x=ae.x,I.y=ae.y,I.scale=ne?.9:1,K.alpha=Math.min(1,E.t*4);}else {let ae=z<.4?0:(z-.4)/.6;I.scale=1+ae*2.2,K.alpha=z<.4?0:.55*(1-ae);}}else if(E.kind==="swipe"){let z=E.t%1.6/1.6,ne=z<.15?0:z>.75?1:(z-.15)/.6,ae=ne*ne*(3-2*ne),j=E.ax+(E.bx-E.ax)*ae,ue=E.ay+(E.by-E.ay)*ae;if(E.part==="hand"){let fe=Jo(j,ue,E.size);I.x=fe.x,I.y=fe.y,K.alpha=z<.1?z*10:z>.85?Math.max(0,(1-z)/.15):1;}else I.x=j,I.y=ue,K.alpha=z>.15&&z<.8?.35:0;}else {let z=E.t*3,ne=E.ax+Math.cos(z)*E.bx,ae=E.ay+Math.sin(z)*E.bx;if(E.part==="hand"){let j=Jo(ne,ae,E.size);I.x=j.x,I.y=j.y,K.alpha=Math.min(1,E.t*3);}else I.x=ne,I.y=ae,K.alpha=.3;}}}}));}function Dt(e){for(let t of e.query(Sr))e.destroy(t);}var un=e=>e.query(Sr).length>0,ht=(e,t)=>e.vars[`learned:${t}`]===true;function vt(e,t){ht(e,t)||(e.vars[`learned:${t}`]=true,Dt(e));}var Rr=b("round.start"),Nt="round-started",$t="round-over",Bt="round-ended",Ga="start-round",zt="show-start",Vt="revive-offer",Gt="revive",Kt="give-up",Qo={id:"round",version:1,setup({world:e$1}){e$1.vars.state="ready",e$1.vars.score=0,e$1.vars.coins=0,e$1.vars.best=typeof e$1.vars.best=="number"?e$1.vars.best:0,e$1.vars.round=0;let t=s=>{for(let p of s.query(Rr))s.destroy(p);if(s.vars.state!=="ready")return;let r=Ce(s),o=Math.min(r.w,r.h)*.26,d={x:r.w/2,y:r.h*.55};Mt(s,r.w/2,r.h/2,{shape:"rect",w:r.w,h:r.h,color:"#05040a",alpha:.4,depth:84},{type:Rr,data:{t:-1}}),Mt(s,d.x,d.y,{shape:"sprite",art:"play",w:o,h:o,color:"accent",depth:85},{type:Rr,data:{t:0}}),ft(s,"tap",{x:d.x+o*.12,y:d.y+o*.1});},n=()=>{for(let s of e$1.query(Rr))e$1.destroy(s);Dt(e$1),e$1.vars.state="playing",e$1.vars.score=0,e$1.vars.coins=0,e$1.vars.round=Number(e$1.vars.round??0)+1,e$1.vars.started_tick=e$1.tick,e$1.emit(Nt,{round:e$1.vars.round});};e$1.on(j,s=>{let r=s;e$1.vars.state==="ready"&&(r.type==="tap"||r.type==="key"&&r.key==="action")&&n();}),e$1.on(Ga,()=>{e$1.vars.state!=="playing"&&n();}),e$1.on(zt,()=>{e$1.vars.state==="ended"&&(e$1.vars.state="ready",t(e$1));}),e$1.on(k,()=>t(e$1)),e$1.addSystem({id:"round.start",order:96,run(s,r){for(let o of s.query(Rr)){let d=s.need(o,Rr);d.t<0||(d.t+=r,s.need(o,e).scale=1+.06*Math.sin(d.t*5));}}}),t(e$1),e$1.on($t,s=>{if(e$1.vars.state!=="playing")return;e$1.vars.state="ended",Dt(e$1);let r=Number(e$1.vars.score??0),o=Math.max(Number(e$1.vars.best??0),r);e$1.vars.best=o,e$1.emit(Bt,{score:r,coins:Number(e$1.vars.coins??0),best:o,reason:typeof s.reason=="string"?s.reason:"over",...s.stats&&typeof s.stats=="object"?{stats:s.stats}:{}});});}};var es=["wall","barrier","pit","mover","train","rock"];var go=["magnet","shield","double","dash","flight"],fn={magnet:{art:"magnet",color:"danger",seconds:6,var:"meta:magnet_t",weight:3},shield:{art:"shield",color:"muted",seconds:8,var:"meta:shield_t",weight:2.5},double:{art:"coin2x",color:"coin",seconds:8,var:"meta:double_t",weight:2.5},dash:{art:"boot",color:"accent",seconds:2.5,var:"meta:dash_t",weight:1.5},flight:{art:"wing",color:"secondary",seconds:4,var:"meta:flight_t",weight:1}},yo=20,jl={wall:1,barrier:2,pit:3,mover:4,train:5,rock:6};function Tr(e,t=.5){let n=Math.max(1,Math.min(yo,Math.floor(e))),s=(n-1)/(yo-1),r=es.filter(p=>jl[p]<=n),o=es.find(p=>jl[p]===n)??null,d=330+t*120+s*220;return {level:n,length:Math.round(16e3+(n-1)*3e3),speed:d,topSpeed:d*(1.25+s*.1),density:Math.min(.72,.3+t*.12+s*.3),kinds:r,fresh:o,coinStar:.6,firstClearGold:60+(n-1)*25}}var Or=e=>Math.floor(e/30),Dr=[{id:"hero",cast:"hero",gems:0,perk:"none"},{id:"hero2",cast:"hero2",gems:150,perk:"heart"},{id:"hero3",cast:"hero3",gems:300,perk:"power"}],Ka="kit-runner",Fa=[{id:"MagnetTime",var:"meta:magnet_t",art:"magnet",color:"danger",perLevel:.6,unit:"s",maxLevel:15,price:20,growth:.12},{id:"ShieldTime",var:"meta:shield_t",art:"shield",color:"muted",perLevel:.8,unit:"s",maxLevel:15,price:25,growth:.12},{id:"DoubleTime",var:"meta:double_t",art:"coin2x",color:"coin",perLevel:.8,unit:"s",maxLevel:15,price:25,growth:.12},{id:"DashTime",var:"meta:dash_t",art:"boot",color:"accent",perLevel:.3,unit:"s",maxLevel:15,price:30,growth:.12},{id:"FlightTime",var:"meta:flight_t",art:"wing",color:"secondary",perLevel:.4,unit:"s",maxLevel:15,price:35,growth:.12},{id:"Luck",var:"meta:luck",art:"clover",color:"accent",perLevel:5,unit:"%",maxLevel:20,price:30,growth:.1},{id:"HeadStart",var:"meta:head_start",art:"lightning",color:"primary",perLevel:.4,unit:"s",maxLevel:10,price:50,growth:.15},{id:"Greed",var:"meta:greed",art:"coin",color:"coin",perLevel:2,unit:"%",maxLevel:25,price:40,growth:.1}],Xl={game:"runner",character:Ka,stats:Fa,heroes:Dr,levels:yo,firstClearGold:e=>Tr(e).firstClearGold,stars:3};var xt=b("runner.item"),On=b("runner.player"),ts=b("runner.stripe"),Yl=b("runner.hud"),wt=(e,t)=>{let n=Number(e.vars.view_w??720),s=Number(e.vars.view_h??1280),r=Math.min(s*.11,n*.2,s*.5/t),o=s*.6-r*t/2;return {viewW:n,viewH:s,top:o,laneH:r,playerX:Math.min(n*.24,s*.3)}},Ar=(e,t)=>e.top+e.laneH*(t+.72),bo=(e,t)=>{let n=Number(e.vars[t]??0);return Number.isFinite(n)?n:0},_t={wall:1.3,barrier:.5,mover:1,train:.95,rock:1.05,jump:1.25,flight:1.9},ns={id:"lane-runner",version:2,engines:["phaser"],requires:["round"],params:{lanes:{type:"number",default:3,min:2,max:5,integer:true},difficulty:{type:"number",default:.5,min:0,max:1},coinRate:{type:"number",default:.7,min:0,max:1},powerRate:{type:"number",default:.22,min:0,max:1},lives:{type:"number",default:3,min:1,max:9,integer:true},coinScore:{type:"number",default:10,min:0,max:1e3,integer:true},graceTime:{type:"number",default:1.2,min:0,max:5},jumpTime:{type:"number",default:.62,min:.3,max:1.5},lengthScale:{type:"number",default:1,min:.05,max:5}},setup({world:e$1,params:t,mode:n}){let s=f=>nn(t,f),r=s("lanes"),o=e$1.rng.stream("lane-runner"),d=null,p=f=>({...f,kinds:[...pn(n,"obstacles",f.kinds)]}),v=pn(n,"powers",go),M=p(Tr(1,s("difficulty"))),O=M.length,E=0,I=0,K=0,z=false,ne=false,ae=false,j$1=0,ue=0,fe=0,ie=0,xe=0,se=0,_e=0,Ae=3,be=0,oe=false,me=null,Se=new Map,Ee=new Map,Q=()=>Dr.find(f=>f.id===e$1.vars["meta:hero"])??Dr[0],Re=f=>(fn[f].seconds+bo(e$1,fn[f].var))*(Q().perk==="power"?1.25:1),We=()=>e$1.vars.reviving===true,we=()=>{for(let i of e$1.query(ts))e$1.destroy(i);let f$1=wt(e$1,r);Ot(e$1,"side",f$1.top+2);for(let i=0;i<r;i++){let u=e$1.create();e$1.set(u,ts,{index:i}),e$1.set(u,e,{x:f$1.viewW/2,y:f$1.top+f$1.laneH*(i+.5)}),e$1.set(u,f,{shape:"tile",art:"road",w:f$1.viewW,h:f$1.laneH,unit:f$1.laneH*1.28,depth:-20+i*.1});}let c=f$1.viewH-(f$1.top+f$1.laneH*r),y=e$1.create();e$1.set(y,ts,{index:-1}),e$1.set(y,e,{x:f$1.viewW/2,y:f$1.viewH-c/2+1}),e$1.set(y,f,{shape:"tile",art:"ground",w:f$1.viewW,h:c+2,unit:f$1.laneH*1.2,depth:-21});},ee=(f,c,y)=>Ar(f,c.lane)-c.alt-y/2,Le=(f,c,y,i,u)=>{let g=f.laneH,T=9+y;switch(c){case "wall":return {v:{shape:"sprite",art:"obstacle",w:i,h:g*_t.wall,depth:T},h:g*_t.wall};case "barrier":return {v:{shape:"sprite",art:"hurdle",w:i,h:g*_t.barrier,depth:T},h:g*_t.barrier};case "pit":return {v:{shape:"sprite",art:"pit",w:i,h:g*.42,depth:-19+y*.1+.05},h:-g*.42};case "mover":return {v:{shape:"actor",cast:"foe",h:g*1.5,pose:"run",facing:-1,depth:T},h:g*1.5};case "train":return {v:{shape:"sprite",art:"wagon",w:i,h:g*_t.train,depth:T},h:g*_t.train};case "ramp":return {v:{shape:"sprite",art:"ramp",w:i,h:g*_t.train,depth:T},h:g*_t.train};case "rock":return {v:{shape:"sprite",art:"shadow",w:i,h:g*.3,alpha:.5,depth:-19+y*.1+.06},h:-g*.3};case "coin":return {v:{shape:"sprite",art:"coin",w:i,h:i,depth:T+.2},h:i};case "power":return {v:{shape:"sprite",art:fn[u??"magnet"].art,color:fn[u??"magnet"].color,w:i,h:i,depth:T+.2},h:i};case "finish":return {v:{shape:"sprite",art:"finish",w:g*.7,h:g*r+g*.9,depth:8},h:0}}},ye=(f$1,c,y,i={})=>{let u=wt(e$1,r),g=i.size??(f$1==="coin"?u.laneH*.42:f$1==="power"?u.laneH*.62:u.laneH*.85),T=i.alt??(f$1==="coin"?u.laneH*.5:f$1==="power"?u.laneH*.6:0),w=e$1.create();e$1.set(w,xt,{lane:c,kind:f$1,size:g,alt:T,...i.power!==void 0?{power:i.power}:{}});let{v:N,h:$}=Le(u,f$1,c,g,i.power),te=u.viewW+u.laneH+g/2+y,le=f$1==="finish"?u.top+u.laneH*r/2:$<0?Ar(u,c)+$/2+u.laneH*.08:ee(u,{lane:c,alt:T},$);return e$1.set(w,e,{x:te,y:le}),e$1.set(w,f,N),f$1==="coin"&&ie++,w},ke=(f,c,y,i)=>{let u=wt(e$1,r);for(let g=0;g<y;g++)ye("coin",f,c+g*u.laneH*.75,i!==void 0?{alt:i}:{});},Ue=(f,c)=>{let y=1+bo(e$1,"meta:luck");o.chance(Math.min(.9,s("powerRate")*y))&&ye("power",f,c,{power:o.weighted(v,i=>fn[i].weight)});},Y=f=>M.kinds.includes(f),Me=()=>[...Array(r).keys()],Xe=f=>{let c=["wall",...Y("barrier")?["barrier"]:[],...Y("pit")?["pit"]:[]],y=new Map;for(let g of Me())o.chance(M.density)&&y.set(g,o.pick(c));y.size>=r&&y.delete(o.int(0,r-1));let i=wt(e$1,r);for(let[g,T]of y)ye(T,g,f,T==="pit"?{size:i.laneH*1.25}:{});let u=Me().filter(g=>!y.has(g));u.length>0&&o.chance(s("coinRate"))&&ke(o.pick(u),f-i.laneH,3);for(let[g,T]of y)(T==="barrier"||T==="pit")&&o.chance(.5)&&ke(g,f-i.laneH*.75,3,i.laneH*1.3);},at=()=>{let c=wt(e$1,r).laneH,y=u=>u+Math.round(M.density*3),i=[{id:"scatter",weight:3,make:u=>{let g=y(2);for(let T=0;T<g;T++)Xe(T*u);return Ue(o.int(0,r-1),g*u-u/2),g*u}},{id:"rest",weight:1,make:u=>{let g=o.int(0,r-1);for(let T=0;T<4;T++)ke(g,T*u*.8,3),g=Math.max(0,Math.min(r-1,g+(o.chance(.5)?1:-1)));return Ue(g,4*u*.8),4*u*.8}}];return M.level>=3&&i.push({id:"corridor",weight:2,make:u=>{let g=y(3),T=o.int(0,r-1);for(let w=0;w<g;w++){for(let N of Me())N!==T&&ye("wall",N,w*u);ke(T,w*u-c*.4,2),w%2===1&&(T=Math.max(0,Math.min(r-1,T+(o.chance(.5)?1:-1))));}return g*u}}),(Y("barrier")||Y("pit"))&&i.push({id:"hurdles",weight:2,make:()=>{let u=Math.max(c*3.6,M.speed*s("jumpTime")*1.45),g=2+Math.round(M.density*2),T=[...Y("barrier")?["barrier"]:[],...Y("pit")?["pit"]:[]],w=o.int(0,r-1);for(let N=0;N<g;N++){for(let $ of Me()){let te=o.pick(T);ye(te,$,N*u,te==="pit"?{size:c*1.25}:{});}ke(w,N*u-c*.75,3,c*1.3);}return g*u}}),Y("train")&&i.push({id:"train",weight:2,make:u=>{let g=o.int(0,r-1),T=c*o.int(5,8),w=o.chance(.75),N=c*1.4;w&&ye("ramp",g,0,{size:N}),ye("train",g,(w?N:0)+T/2-c*.42,{size:T}),w&&ke(g,N+c*.4,Math.floor(T/(c*.75))-1,c*(_t.train+.5));let $=Me().filter(le=>le!==g),te=o.pick($);if(o.chance(.5))ye("train",te,u*.5+T/2,{size:T*.8});else for(let le=0;le<2;le++)ye("wall",te,u*(.5+le*1.4));return (w?N:0)+T+u*.5}}),Y("mover")&&i.push({id:"movers",weight:1.5,make:u=>{let g=1+(o.chance(M.density)?1:0),T=new Set;for(let N=0;N<g;N++){let $=o.int(0,r-1);T.has($)&&($=($+1)%r),T.add($),ye("mover",$,N*u*1.6,{size:c*.6});}let w=Me().filter(N=>!T.has(N));return w.length>0&&ke(o.pick(w),0,4),g*u*1.6}}),Y("rock")&&i.push({id:"rocks",weight:1.5,make:u=>{let g=2+(o.chance(M.density)?1:0);for(let T=0;T<g;T++){let w=o.int(0,r-1);ye("rock",w,T*u*1.2,{size:c*.9});let N=Me().filter($=>$!==w);ke(o.pick(N),T*u*1.2,2);}return g*u*1.2}}),i},Te=f=>{let c=wt(e$1,r),y=Math.floor(r/2),i=M.fresh;if(i===null||i==="wall")return 0;if(i==="barrier"||i==="pit"){for(let u=0;u<3;u++)ye(i,y,u*f*1.6,i==="pit"?{size:c.laneH*1.25}:{}),ke(y,u*f*1.6-c.laneH*.75,3,c.laneH*1.3);return 3*f*1.6}return i==="train"?(ye("ramp",y,0,{size:c.laneH*1.4}),ye("train",y,c.laneH*1.4+c.laneH*3-c.laneH*.42,{size:c.laneH*6}),ke(y,c.laneH*1.8,7,c.laneH*(_t.train+.5)),c.laneH*8+f):(ye(i,y,0,{size:i==="mover"?c.laneH*.6:c.laneH*.9}),f*1.5)},Wt=()=>{let f=Math.max(wt(e$1,r).laneH*2.1,300-M.density*110),c;if(!oe&&M.fresh!==null&&M.fresh!=="wall")oe=true,c=Te(f);else {let y=at();c=(K>0&&K%4===3?y.find(u=>u.id==="rest"):o.weighted(y,u=>u.weight)).make(f);}K++,I=Number(e$1.vars.distance??0)+c+f*1.2;},Ge=(f,c,y)=>{let i=f.laneH*1.05;return {x:f.playerX,y:Ar(f,c)-y-i/2,h:i}},qe=()=>{let f$1=wt(e$1,r);(d===null||!e$1.isAlive(d))&&(d=e$1.create(),e$1.set(d,On,{lane:Math.floor(r/2),size:f$1.laneH*.5,alt:0,vy:0}),e$1.set(d,f,{shape:"actor",cast:Q().cast,h:0,pose:"idle",depth:10}));let c=e$1.need(d,On);c.size=f$1.laneH*.5;let y=Ge(f$1,c.lane,c.alt);e$1.set(d,e,{x:y.x,y:y.y});let i=e$1.need(d,f);i.shape==="actor"&&(i.cast=Q().cast,i.h=y.h,i.depth=10+c.lane);},et=()=>{for(let c of e$1.query(xt))e$1.destroy(c);Ke(),M=p(Tr(bo(e$1,"meta:chapter")||1,s("difficulty"))),O=Math.round(M.length*s("lengthScale")),Ae=s("lives")+(Q().perk==="heart"?1:0),e$1.vars.distance=0,e$1.vars.meters=0,e$1.vars.level_length=O,e$1.vars.runner_length_scale=s("lengthScale"),e$1.vars.runner_level=M.level,e$1.vars.speed=M.speed,e$1.vars.lives=Ae,e$1.vars.coins=0,e$1.vars.score=0,e$1.vars.mult=1,e$1.vars.stars=0,e$1.vars.reviving=false,E=0,I=wt(e$1,r).laneH*2,K=0,z=false,ne=false,ae=false,j$1=0,ue=0,fe=0,ie=0,xe=0,se=0,_e=0,be=0,oe=false,me=null,Se.clear();let f=bo(e$1,"meta:head_start");if(f>0&&Se.set("dash",f),d!==null&&e$1.isAlive(d)){let c=e$1.need(d,On);c.lane=Math.floor(r/2),c.alt=0,c.vy=0;}qe();},rt=f=>{if(!Je(e$1)||We()||d===null)return;let c=e$1.need(d,On),y=Math.min(r-1,Math.max(0,c.lane+f));y!==c.lane&&(vt(e$1,"runner-lanes"),me=c.lane),c.lane=y;},lt=()=>{let f=wt(e$1,r),c=s("jumpTime");return 8*f.laneH*_t.jump/(c*c)},ct=(f,c,y)=>{let i=wt(f,r),u=i.playerX,g=i.laneH*.22,T=0;for(let w of f.query(xt)){let N=f.need(w,xt);if(N.lane!==c||N.kind!=="train"&&N.kind!=="ramp")continue;let $=f.need(w,e),te=$.x-N.size/2,le=$.x+N.size/2;if(u+g<te||u-g>le)continue;let ge=i.laneH*_t.train;if(N.kind==="ramp")T=Math.max(T,ge*Math.max(0,Math.min(1,(u-te)/N.size)));else if(y>=ge-i.laneH*.12)T=Math.max(T,ge);else return null}return T},dt=()=>{if(!Je(e$1)||We()||d===null||Se.has("flight"))return;let f=e$1.need(d,On),c=ct(e$1,f.lane,f.alt)??0;f.alt-c>2||(f.vy=lt()*s("jumpTime")/2,_e++,vt(e$1,"runner-jump"),Dt(e$1),e$1.emit("jumped",{}),ze(e$1,d,"jump"));},ot=()=>{if(ht(e$1,"runner-lanes")||d===null)return;let f=wt(e$1,r),c=f.playerX+f.laneH*1.6,y=Ar(f,Math.floor(r/2))-f.laneH*.4;ft(e$1,"swipe",{x:c,y:y+f.laneH*.5},{x:c,y:y-f.laneH*.9},f.laneH);},Pe=(f$1,c,y,i)=>{let u=Ee.get(f$1);(u===void 0||!e$1.isAlive(u))&&(u=e$1.create(),e$1.set(u,Yl,{id:f$1}),Ee.set(f$1,u)),e$1.set(u,e,{x:c,y}),e$1.set(u,f,i);},bt=f=>{let c=Ee.get(f);c!==void 0&&e$1.destroy(c),Ee.delete(f);};function Ke(){for(let f of Ee.values())e$1.destroy(f);Ee.clear(),nt(e$1,Yl);}let At=(f,c,y,i,u,g,T,w=41)=>{let N=Math.max(0,Math.min(1,Math.round(g*100)/100));Pe(`${f}:bg`,c,y,{shape:"rect",w:i,h:u,color:"#000000",alpha:.45,radius:u/2,depth:w});let $=Math.max(0,(i-4)*N);$<1?bt(`${f}:fill`):Pe(`${f}:fill`,c-(i-4)/2+$/2,y,{shape:"rect",w:$,h:u-4,color:T,radius:(u-4)/2,depth:w+.01});},en=f=>{let c=wt(f,r),y=Math.min(c.viewW,c.viewH),i=c.viewH*.085,u=c.viewW*.66,g=Math.max(10,y*.026),T=Number(f.vars.distance??0)/Math.max(1,O);At("way",c.viewW/2,i,u,g,T,"accent");let w=y*.055;Pe("flag",c.viewW/2+u/2+w*.45,i-w*.25,{shape:"sprite",art:"flag",w,h:w,depth:42}),Pe("lvl",c.viewW/2-u/2-y*.05,i,{shape:"text",text:`${M.level}`,size:Math.round(y*.04),color:"text",bold:true,depth:42});let N=i+y*.07,$=y*.05,te=Number(f.vars.lives??0);for(let Z=0;Z<Ae;Z++)Pe(`h${Z}`,c.viewW*.07+Z*$*1.1,N,{shape:"sprite",art:"heart",w:$,h:$,alpha:Z<te?1:.25,depth:42});for(let Z=Ae;Z<10;Z++)bt(`h${Z}`);let le=y*.045,ge=String(f.vars.coins??0);Pe("coin:i",c.viewW*.93-ge.length*le*.6-le*.7,N,{shape:"sprite",art:"coin",w:le,h:le,depth:42}),Pe("coin",c.viewW*.93-ge.length*le*.6/2,N,{shape:"text",text:ge,size:Math.round(le),color:"text",bold:true,depth:42});let He=Number(f.vars.mult??1);He>1?Pe("mult",c.viewW*.9,N+le*1.2,{shape:"text",text:`x${He}`,size:Math.round(le*1.05),color:"coin",bold:true,depth:42}):bt("mult");let je=y*.055,st=0;for(let Z of go){let H=Se.get(Z);if(H===void 0){bt(`p:${Z}`),bt(`pb:${Z}:bg`),bt(`pb:${Z}:fill`);continue}let X=c.viewW*.07+st*je*1.25,q=N+$*1.25;Pe(`p:${Z}`,X,q,{shape:"sprite",art:fn[Z].art,color:fn[Z].color,w:je,h:je,depth:42}),At(`pb:${Z}`,X,q+je*.7,je,Math.max(6,y*.011),H/Math.max(.1,Re(Z)),"coin",42),st++;}},Rt=(f,c)=>{if(!Je(f)||ne)return;ne=true;let y=c==="cleared",i=y?1+(ie>0&&xe>=ie*M.coinStar?1:0)+(se===0?1:0):0;f.vars.stars=i,y&&f.vars["meta:first_clear"]===true&&Fe(f,"coins",M.firstClearGold);let u=Or(Number(f.vars.distance??0));f.vars.score=be+u*2+(y?500*i:0),f.vars.reviving=false,f.emit($t,{reason:c,stats:{chapter:M.level,seconds:Math.floor(j$1),cleared:y,stars:i,coins:xe,meters:u,jumps:_e,hits:se}});},tn=f=>{if(f.vars.revive_ready===true&&!ae){f.vars.reviving=true,Dt(f),f.emit(Vt,{});return}Rt(f,"crashed");},Et=f=>{if(!We())return;ae=true,f.vars.reviving=false,f.vars.lives=Math.max(1,Math.ceil(Ae/2)),E=2.5,Se.set("shield",Math.max(Se.get("shield")??0,3));let c=wt(f,r);for(let y of f.query(xt)){let i=f.need(y,xt);if(i.kind==="coin"||i.kind==="power"||i.kind==="finish")continue;let u=f.need(y,e);u.x-i.size/2<c.playerX+c.laneH*6&&(G(f,{kind:"burst",x:u.x,y:u.y,color:"coin",n:8,size:c.laneH*.6}),f.destroy(y));}if(d!==null){let y=f.need(d,On);y.alt=0,y.vy=0,Qe(f,d,"run");let i=f.need(d,e);G(f,{kind:"ring",x:i.x,y:i.y,color:"coin",size:c.laneH*4});}G(f,{kind:"flash",color:"coin"});},L=(f,c)=>{if(d===null)return;let y=f.need(c,e),i=wt(f,r);if(Se.has("dash")){G(f,{kind:"burst",x:y.x,y:y.y,color:"accent",n:14,size:i.laneH*.8}),G(f,{kind:"shake",power:.6}),f.need(c,xt).kind!=="pit"&&f.destroy(c);return}if(E>0)return;if(Se.has("shield")){Se.delete("shield"),E=.8,G(f,{kind:"ring",x:i.playerX,y:f.need(d,e).y,color:"muted",size:i.laneH*2}),f.need(c,xt).kind!=="pit"&&f.destroy(c);return}se++,ue=0,f.vars.mult=1;let u=Number(f.vars.lives??1)-1;f.vars.lives=u,f.emit("player-hit",{lives:u}),G(f,{kind:"burst",x:y.x,y:y.y,color:"danger",n:14,size:i.laneH*.9}),G(f,{kind:"shake",power:1.5}),ze(f,d,"hit"),f.need(c,xt).kind!=="pit"&&f.destroy(c),E=s("graceTime"),u<=0&&tn(f);},B=(f,c)=>{let y=f.need(c,xt),i=f.need(c,e),u=wt(f,r);if(y.kind==="power"&&y.power!==void 0){Se.set(y.power,Re(y.power)),f.emit("power-up",{id:y.power}),G(f,{kind:"ring",x:i.x,y:i.y,color:fn[y.power].color,size:u.laneH*1.6}),f.destroy(c);return}ue++;let g=Math.min(5,1+Math.floor(ue/12));g>Number(f.vars.mult??1)&&G(f,{kind:"pop",x:u.playerX,y:i.y-u.laneH,text:`x${g}`,color:"coin",size:Math.round(u.laneH*.42)}),f.vars.mult=g;let T=(Se.has("double")?2:1)*(1+bo(f,"meta:greed"));fe+=T;let w=Math.floor(fe);fe-=w,w>0&&Fe(f,"coins",w),xe++,be+=Math.round(T*s("coinScore")*g),f.emit("coin-collected",{value:T}),G(f,{kind:"burst",x:i.x,y:i.y,color:"coin",n:6,size:y.size*1.3}),f.destroy(c);};e$1.on(j,f=>{let c=f;e$1.vars.started_tick!==e$1.tick&&(c.type==="swipe"&&(c.dir==="up"||c.dir==="down")?rt(c.dir==="up"?-1:1):c.type==="swipe"&&c.dir==="right"?dt():c.type==="key"&&(c.key==="left"||c.key==="up")?rt(-1):c.type==="key"&&(c.key==="right"||c.key==="down")?rt(1):(c.type==="key"&&c.key==="action"||c.type==="tap")&&dt());}),e$1.on(Nt,()=>{et(),d!==null&&Qe(e$1,d,"run"),ot();}),e$1.on(zt,et),e$1.on(Gt,()=>Et(e$1)),e$1.on(Kt,()=>{We()&&(e$1.vars.reviving=false,Rt(e$1,"crashed"));}),e$1.on(Bt,f=>{d!==null&&e$1.isAlive(d)&&Qe(e$1,d,f.reason==="cleared"?"dance":"die");for(let c of e$1.query(xt))e$1.need(c,xt).kind==="mover"&&Qe(e$1,c,"idle");Ke();}),e$1.on(k,()=>{we(),d!==null&&qe();let f$1=wt(e$1,r);for(let c of e$1.query(xt)){let y=e$1.need(c,xt),{v:i,h:u}=Le(f$1,y.kind,y.lane,y.size,y.power);e$1.set(c,f,i),e$1.need(c,e).y=y.kind==="finish"?f$1.top+f$1.laneH*r/2:u<0?Ar(f$1,y.lane)+u/2+f$1.laneH*.08:ee(f$1,y,u);}}),e$1.addSystem({id:"lane-runner",order:0,run(f$1,c){if(!Je(f$1)||d===null||ne||We())return;let y=wt(f$1,r),i=y.laneH;j$1+=c;let u=Number(f$1.vars.distance??0),T=(M.speed+(M.topSpeed-M.speed)*Math.min(1,u/Math.max(1,O)))*(Se.has("dash")?1.6:1);f$1.vars.speed=Math.round(T);let w=T*c;f$1.vars.distance=u+w,f$1.vars.meters=Or(u+w),E>0&&(E=Math.max(0,E-c));for(let[Z,H]of [...Se])H-c<=0?(Se.delete(Z),Z==="flight"&&(E=Math.max(E,.8))):Se.set(Z,H-c);mo(f$1,w);for(let Z of f$1.query(ts)){let H=f$1.need(Z,f);H.shape==="tile"&&(H.scrollX=(H.scrollX??0)+w);}let N=O-(u+w);if(!z&&N<=y.viewW-y.playerX+i){z=true;let Z=ye("finish",0,0);f$1.need(Z,e).x=y.playerX+N;}else !z&&u>=I&&N>y.viewW&&Wt();let $=f$1.need(d,On),te=Se.has("flight");if(te)$.alt+=(i*_t.flight-$.alt)*Math.min(1,c*6),$.vy=0,Math.floor((u+w)/(i*.9))!==Math.floor(u/(i*.9))&&ye("coin",$.lane,0,{alt:i*(_t.flight+.4)});else {$.vy-=lt()*c,$.alt+=$.vy*c;let Z=ct(f$1,$.lane,$.alt);if(Z===null){let H=f$1.query(xt).find(X=>{let q=f$1.need(X,xt);return q.lane===$.lane&&q.kind==="train"&&Math.abs(f$1.need(X,e).x-y.playerX)<q.size/2+i*.22});if(H!==void 0&&L(f$1,H),ne||We())return;$.alt=Math.max(0,$.alt);}else $.alt<=Z&&($.alt=Z,$.vy=0);}let le=f$1.need(d,e),ge=Ge(y,$.lane,$.alt);le.y+=(ge.y-le.y)*Math.min(1,c*14),le.x=ge.x,me!==null&&Math.abs(ge.y-le.y)<i*.15&&(me=null);let He=f$1.need(d,f);He.shape==="actor"&&(He.alpha=E>0&&Math.floor(f$1.time*12)%2===0?.35:1,He.depth=10+$.lane+.5,He.speed=T,He.pose=$.alt>2&&$.vy!==0?"air":"run");let je=i*.24,st=Se.has("magnet");for(let Z of f$1.query(xt)){if(!f$1.isAlive(Z)||!f$1.has(Z,xt))continue;let H=f$1.need(Z,xt),X=f$1.need(Z,e);if(X.x-=w,H.kind==="mover"){if(X.x-=T*.35*c,H.to===void 0&&X.x-y.playerX<i*6&&X.x-y.playerX>i*3){let S=[H.lane-1,H.lane+1].filter(a=>a>=0&&a<r);H.to=$.lane!==H.lane&&S.includes($.lane)?$.lane:o.pick(S),H.warn=.45;}if(H.warn!==void 0&&H.warn>0){H.warn-=c;let S=f$1.need(Z,f);S.alpha=Math.floor(f$1.time*14)%2===0?.4:1,H.warn<=0&&H.to!==void 0&&(H.lane=H.to,S.alpha=1,S.depth=9+H.lane);}X.y+=(ee(y,H,i*1.5)-X.y)*Math.min(1,c*10);}if(H.kind==="rock"&&!H.landed&&X.x-y.playerX<i*2.6&&(H.landed=true,f$1.set(Z,f,{shape:"sprite",art:"rock",w:H.size,h:i*_t.rock,depth:9+H.lane}),X.y=Ar(y,H.lane)-i*_t.rock/2,G(f$1,{kind:"burst",x:X.x,y:X.y+i*.4,color:"muted",n:10,size:i*.7}),G(f$1,{kind:"shake",power:.5})),H.kind==="rock"&&!H.landed){let S=f$1.need(Z,f);S.shape==="sprite"&&(S.alpha=.35+.3*Math.abs(Math.sin(f$1.time*6)));}if(H.kind==="power"&&(X.y=ee(y,H,H.size)+Math.sin(f$1.time*4+X.x*.01)*i*.06),X.x+H.size/2<-i*2){f$1.destroy(Z);continue}if(H.kind==="finish"){if(X.x<=y.playerX){G(f$1,{kind:"flash",color:"coin"}),Rt(f$1,"cleared");return}continue}if(H.kind==="coin"&&st&&X.x>y.playerX-i*.5&&X.x<y.playerX+i*4&&(H.pulled=true),H.kind==="coin"&&H.pulled){X.x+=(y.playerX-X.x)*Math.min(1,c*10),X.y+=(le.y-X.y)*Math.min(1,c*10),Math.hypot(X.x-y.playerX,X.y-le.y)<i*.4&&B(f$1,Z);continue}if(H.kind==="coin"||H.kind==="power"){if(H.lane!==$.lane&&H.lane!==me)continue;let S=je+H.size/2+i*.06;if(X.x-S>y.playerX||X.x+w+S<y.playerX)continue;let a=H.size/2+i*.08;(te||X.y+a>le.y-ge.h/2&&X.y-a<le.y+ge.h/2)&&B(f$1,Z);continue}let q=H.kind==="barrier"?H.size*.3:H.size/2;if(Math.abs(X.x-y.playerX)>je+q||H.lane!==$.lane||te||H.kind==="ramp"||H.kind==="train"||H.kind==="rock"&&!H.landed)continue;let x=H.kind==="wall"?_t.wall:H.kind==="barrier"?_t.barrier*.85:H.kind==="mover"?_t.mover:H.kind==="rock"?_t.rock:0;if(H.kind==="pit"?$.alt<2&&Math.abs(X.x-y.playerX)<H.size*.32&&L(f$1,Z):$.alt<i*x&&L(f$1,Z),ne||We())return}ht(f$1,"runner-jump")||f$1.query(xt).find(H=>{let X=f$1.need(H,xt),q=f$1.need(H,e).x-y.playerX;return (X.kind==="barrier"||X.kind==="pit")&&X.lane===$.lane&&q>i*1.5&&q<i*3.2})!==void 0&&!un(f$1)&&ft(f$1,"tap",{x:y.playerX+i*1.2,y:le.y}),f$1.vars.score=be+Or(u+w)*2,en(f$1);}}),we(),et();}};var or=[{id:"rainbow",shape:"color",art:"m3_rainbow",make:e=>e>=5},{id:"bomb",shape:"area:1",art:"m3_bomb",make:(e,t)=>t},{id:"col",shape:"col",art:"m3_col",make:(e,t,n)=>e===4&&n==="h"},{id:"row",shape:"row",art:"m3_row",make:(e,t,n)=>e===4&&n==="v"}],Jl=[{a:"row",b:"row",effect:"cross"},{a:"col",b:"col",effect:"cross"},{a:"row",b:"col",effect:"cross"},{a:"bomb",b:"row",effect:"cross:1"},{a:"bomb",b:"col",effect:"cross:1"},{a:"bomb",b:"bomb",effect:"area:2"},{a:"rainbow",b:"plain",effect:"color"},{a:"rainbow",b:"row",effect:"turn"},{a:"rainbow",b:"col",effect:"turn"},{a:"rainbow",b:"bomb",effect:"turn"},{a:"rainbow",b:"rainbow",effect:"all"}],Dn={ice:{id:"ice",layer:"under",hp:1,art:"m3_ice",max:20},slime:{id:"slime",layer:"under",hp:1,art:"m3_slime",spreads:true,max:16},chain:{id:"chain",layer:"over",hp:1,art:"m3_chain",max:10},stone:{id:"stone",layer:"block",hp:1,art:"m3_stone",hitByNear:true,max:10},cage:{id:"cage",layer:"block",hp:1,art:"m3_cage",hitByNear:true}},Ua={"-":{},".":{hole:true},i:{under:{id:"ice",hp:1}},I:{under:{id:"ice",hp:2}},m:{under:{id:"slime",hp:1}},c:{over:{id:"chain",hp:1}},s:{block:{id:"stone",hp:1}},S:{block:{id:"stone",hp:2}},g:{block:{id:"cage",hp:1}}},ko={fire:{beats:["nature"],color:"piece1"},water:{beats:["fire"],color:"piece2"},nature:{beats:["water"],color:"piece3"},light:{beats:["dark"],color:"piece4"},dark:{beats:["light"],color:"piece5"}},qa=[{index:0,art:"gem1",color:"piece1",role:"attack",element:"fire"},{index:1,art:"gem2",color:"piece2",role:"attack",element:"water"},{index:2,art:"gem3",color:"piece3",role:"attack",element:"nature"},{index:3,art:"gem4",color:"piece4",role:"attack",element:"light"},{index:4,art:"gem5",color:"piece5",role:"attack",element:"dark"},{index:5,art:"m3_heart",color:"danger",role:"heal"},{index:6,art:"m3_shield",color:"primary",role:"shield"},{index:7,art:"gem6",color:"piece6",role:"attack"}],So=e=>qa.find(t=>t.index===e),ja=[{id:"goblin",cast:"foe5",element:"nature",hp:1,attack:1,every:3,size:.8},{id:"wolf",cast:"foe",element:"nature",hp:.8,attack:.7,every:2,size:.85},{id:"orc",cast:"foe",variant:5,element:"fire",hp:1.4,attack:1.3,every:3,skill:{kind:"sow",obstacle:"stone",count:2},size:.95},{id:"frost-imp",cast:"foe3",element:"water",hp:1,attack:.9,every:3,skill:{kind:"sow",obstacle:"ice",count:3},size:.85},{id:"spider",cast:"foe4",element:"dark",hp:1.1,attack:1,every:3,skill:{kind:"sow",obstacle:"chain",count:3},size:.85},{id:"golem",cast:"foe2",element:"light",hp:2,attack:1.5,every:4,skill:{kind:"sow",obstacle:"stone",count:3},size:1.05},{id:"slime-beast",cast:"foe2",variant:9,element:"water",hp:1.3,attack:1.1,every:3,skill:{kind:"sow",obstacle:"slime",count:2},size:.95},{id:"shaman",cast:"foe4",variant:7,element:"dark",hp:1,attack:.9,every:3,skill:{kind:"heal",share:.15},size:.9},{id:"troll",cast:"boss",element:"nature",hp:3,attack:1.6,every:3,skill:{kind:"sow",obstacle:"stone",count:3},boss:true,enrage:.5,size:1.2},{id:"frost-queen",cast:"boss",variant:4,element:"water",hp:3.5,attack:1.5,every:3,skill:{kind:"sow",obstacle:"ice",count:5},boss:true,enrage:.5,size:1.2},{id:"spider-queen",cast:"boss",variant:9,element:"dark",hp:4,attack:1.7,every:3,skill:{kind:"sow",obstacle:"chain",count:4},boss:true,enrage:.5,size:1.2},{id:"lich",cast:"boss",variant:13,element:"dark",hp:4.5,attack:1.8,every:3,skill:{kind:"sow",obstacle:"slime",count:3},boss:true,enrage:.5,size:1.25}],Eo=e=>ja.find(t=>t.id===e),rs=100,Zl=4,Ql=1.5,ec=2,tc=1,Xa=[{id:"blast",art:"m3_skill_blast",mana:30,kind:"shape",shape:"area:1",bigShape:"area:2",bigAt:1.5,damage:6},{id:"cross",art:"m3_skill_cross",mana:28,kind:"shape",shape:"cross",bigShape:"cross:1",bigAt:1.5,damage:5},{id:"storm",art:"m3_skill_storm",mana:34,kind:"storm",count:4,damage:4}],os=e=>Xa.find(t=>t.id===e),Lr=[{id:"hero",cast:"hero",gems:0,element:"fire",skill:"blast"},{id:"hero2",cast:"hero2",gems:150,element:"light",skill:"cross"},{id:"hero3",cast:"hero3",gems:300,element:"water",skill:"storm"}],ss={plain:["--------","--------","--------","--------","--------","--------","--------","--------"],diamond:["..----..",".------.","--------","--------","--------","--------",".------.","..----.."],"ice-mid":["--------","--------","--iiii--","--iiii--","--iiii--","--iiii--","--------","--------"],"ice-low":["--------","--------","--------","--------","iiiiiiii","iiiiiiii","IIIIIIII","IIIIIIII"],stones:["--------","--------","--------","ss-ss-ss","--------","--------","--------","--------"],chains:["--------","-c----c-","--c--c--","---cc---","---cc---","--c--c--","-c----c-","--------"],cages:["--------","-g----g-","--------","---gg---","--------","--------","-g----g-","--------"],slime:["--------","--------","--------","--------","--------","--------","mm----mm","mmm--mmm"],hourglass:["--------","--------",".------.","..----..","..----..",".------.","--------","--------"],ring:["--------","--------","--------","---..---","---..---","--------","--------","--------"],"ice-stone":["--------","-S----S-","--IIII--","--IIII--","--IIII--","--IIII--","-S----S-","--------"],fortress:["s------s","-iiiiii-","-i-cc-i-","-ic--ci-","-ic--ci-","-i-cc-i-","-iiiiii-","s------s"],"slime-cages":["-g----g-","--------","--------","---mm---","---mm---","--------","--------","-g----g-"],"cross-holes":["---..---","--------","--------",".------.",".------.","--------","--------","---..---"]},mt=(e,t,n,s,r)=>({kind:"goal",board:e,moves:t,colors:n,goals:s,...r?{drops:r}:{}}),Ft=(e,t,...n)=>({kind:"battle",board:e,elements:t,enemies:n}),on=(e,t)=>({kind:"color",color:e,count:t}),kt=e=>({kind:"clear",obstacle:e}),vo=e=>({kind:"drops",count:e}),as=[mt("plain",20,5,[on(0,12),on(1,12)]),mt("diamond",20,5,[on(2,15),on(3,15)]),Ft("plain",3,"goblin"),mt("ice-mid",22,5,[kt("ice")]),mt("ring",20,5,[on(0,20),on(4,20)]),Ft("plain",3,"goblin","wolf"),mt("stones",22,5,[kt("stone"),on(1,15)]),mt("ice-low",25,5,[kt("ice")]),Ft("diamond",3,"wolf","orc"),Ft("plain",3,"troll"),mt("chains",24,5,[kt("chain")]),mt("plain",25,5,[vo(3)],3),Ft("plain",4,"frost-imp","goblin"),mt("cages",22,5,[kt("cage")]),mt("slime",25,5,[kt("slime")]),Ft("ice-mid",4,"orc","frost-imp"),mt("hourglass",24,5,[vo(3),on(2,20)],3),mt("ice-low",26,5,[kt("ice")]),Ft("plain",4,"spider","frost-imp","wolf"),Ft("plain",4,"frost-queen"),mt("ice-stone",26,5,[kt("ice"),kt("stone")]),mt("cross-holes",26,6,[on(0,20),on(3,20)]),Ft("chains",4,"spider","golem"),mt("fortress",28,5,[kt("ice"),kt("chain")]),mt("slime-cages",26,5,[kt("cage"),kt("slime")]),Ft("plain",4,"slime-beast","golem"),mt("diamond",28,5,[vo(3)],3),mt("ice-low",28,5,[kt("ice"),on(4,20)]),Ft("ring",5,"shaman","golem","spider"),Ft("plain",5,"spider-queen"),mt("fortress",28,6,[kt("ice"),kt("chain")]),mt("slime",28,5,[kt("slime"),vo(3)],3),Ft("ice-stone",5,"golem","shaman"),mt("ice-stone",28,6,[kt("ice"),kt("stone")]),mt("slime-cages",28,6,[kt("cage"),kt("slime")]),Ft("plain",5,"slime-beast","shaman","orc"),mt("cross-holes",30,5,[vo(3),on(1,18)],3),mt("fortress",32,5,[kt("ice"),kt("chain"),on(2,15)]),Ft("diamond",5,"golem","shaman","spider"),Ft("plain",5,"lich")],xo=10,nc=4,is=as.length,Ya=[0,18,45,75];function fp(e){return e.kind==="goal"?[0,1,2,3,4,7].slice(0,Math.max(3,Math.min(6,e.colors))):[...[0,1,2,3,4].slice(0,Math.max(2,Math.min(5,e.elements))),5,6]}function wr(e,t=.5){let n=Math.max(1,Math.min(is,Math.floor(e))),s=as[n-1],r=Math.ceil(n/xo),o=s.kind==="battle"&&s.enemies.some(d=>Eo(d)?.boss);return {level:n,world:r,index:n-(r-1)*xo,def:s,boss:o,colors:fp(s),enemyHp:180*Math.pow(1.07,n-1)*(.8+t*.4),enemyAttack:14*Math.pow(1.06,n-1)*(.8+t*.4),firstClearGold:(o?120:50)+(n-1)*10}}var Ja=e=>Ya[Math.ceil(Math.max(1,e)/xo)-1]??0,Za=(e,t)=>t?e>=.7?3:e>=.35?2:1:e>=.3?3:e>=.1?2:1,rc=5,oc=.5,Qa="kit-match3",ei=[{id:"Attack",var:"meta:attack",art:"m3_skill_blast",color:"danger",perLevel:5,unit:"%",maxLevel:20,price:40,growth:.12},{id:"Health",var:"meta:health",art:"m3_heart",color:"danger",perLevel:6,unit:"%",maxLevel:20,price:40,growth:.12},{id:"Defense",var:"meta:defense",art:"m3_shield",color:"primary",perLevel:5,unit:"%",maxLevel:15,price:45,growth:.12},{id:"SkillPower",var:"meta:skill",art:"m3_skill_cross",color:"secondary",perLevel:8,unit:"%",maxLevel:10,price:50,growth:.12},{id:"ManaGain",var:"meta:mana",art:"m3_skill_storm",color:"secondary",perLevel:5,unit:"%",maxLevel:10,price:50,growth:.12},{id:"Moves",var:"meta:moves",art:"m3_bomb",color:"coin",perLevel:1,unit:"",maxLevel:5,price:120,growth:.2}],sc={game:"match3",character:Qa,stats:ei,heroes:Lr,levels:is,firstClearGold:e=>wr(e).firstClearGold,stars:3,starsToEnter:Ja};var ri=()=>({cleared:[],created:[],fired:[],hits:[],spawned:[],dropsCollected:0,slimeCleared:false}),oi=-1,An=-2,ds=(e,t,n)=>t>=0&&n>=0&&t<e.cols&&n<e.rows,Un=(e,t,n)=>ds(e,t,n)?e.cells[n][t]:null,ps=(e,t)=>t[Math.floor(e.rnd()*t.length)%t.length],ac=[[1,0],[-1,0],[0,1],[0,-1]],ti=e=>e.hole||e.block!==null||e.over!==null,hp=e=>e!==null&&e.color>=0;function us(e,t,n,s,r=0){let o={cols:e[0].length,rows:e.length,cells:e.map(d=>[...d].map(p=>{let v=s[p]??{};return {hole:v.hole===true,piece:null,under:v.under?{...v.under}:null,over:v.over?{...v.over}:null,block:v.block?{...v.block}:null}})),colors:t,nextId:1,dropsToSpawn:r,rnd:n};return ni(o),o}var cs=(e,t,n=null)=>({id:e.nextId++,color:t,special:n});function ni(e){for(let t=0;t<50;t++){for(let n=0;n<e.rows;n++)for(let s=0;s<e.cols;s++){let r=e.cells[n][s];if(r.hole||r.block||r.piece&&r.piece.color<0||r.piece?.special)continue;let o=new Set,d=Un(e,s-1,n)?.piece,p=Un(e,s-2,n)?.piece;d&&p&&d.color>=0&&d.color===p.color&&o.add(d.color);let v=Un(e,s,n-1)?.piece,M=Un(e,s,n-2)?.piece;v&&M&&v.color>=0&&v.color===M.color&&o.add(v.color);let O=e.colors.filter(I=>!o.has(I)),E=ps(e,O.length>0?O:e.colors);r.piece?r.piece.color=E:r.piece=cs(e,E);}if(Pr(fs(e)).size===0&&Cr(e)!==null)return}}function si(e){for(let t=0;t<e.rows;t++)for(let n=0;n<e.cols;n++){let s=e.cells[t][n].piece;s&&s.color>=0&&!s.special&&!e.cells[t][n].over&&(s.color=-100);}for(let t=0;t<e.rows;t++)for(let n=0;n<e.cols;n++)e.cells[t][n].piece?.color===-100&&(e.cells[t][n].piece.color=ps(e,e.colors));if(ni(e),Cr(e)===null){for(let t of e.cells)for(let n of t)n.over=null;ni(e);}}var fs=e=>e.cells.map(t=>t.map(n=>n.piece&&n.piece.color>=0&&!n.block?n.piece.color:null));function Pr(e){let t=new Set;for(let n of ic(e))for(let[s,r]of n.cells)t.add(`${s},${r}`);return t}function ic(e){let t=[],n=e.length,s=e[0]?.length??0;for(let r=0;r<n;r++)for(let o=0;o<s;){let d=e[r][o],p=1;for(;d!=null&&o+p<s&&e[r][o+p]===d;)p++;d!=null&&p>=3&&t.push({cells:Array.from({length:p},(v,M)=>[o+M,r]),dir:"h"}),o+=p;}for(let r=0;r<s;r++)for(let o=0;o<n;){let d=e[o][r],p=1;for(;d!=null&&o+p<n&&e[o+p][r]===d;)p++;d!=null&&p>=3&&t.push({cells:Array.from({length:p},(v,M)=>[r,o+M]),dir:"v"}),o+=p;}return t}function ai(e){return mp(e)!==null}function mp(e){let t=e.length,n=e[0]?.length??0,s=(r,o)=>{let d=e[r[1]][r[0]];e[r[1]][r[0]]=e[o[1]][o[0]],e[o[1]][o[0]]=d;};for(let r=0;r<t;r++)for(let o=0;o<n;o++)for(let[d,p]of [[1,0],[0,1]]){if(o+d>=n||r+p>=t||e[r][o]===null||e[r+p][o+d]===null)continue;s([o,r],[o+d,r+p]);let v=Pr(e).size>0;if(s([o,r],[o+d,r+p]),v)return [[o,r],[o+d,r+p]]}return null}function Mo(e,t,n){if(Math.abs(t.col-n.col)+Math.abs(t.row-n.row)!==1)return false;let s=Un(e,t.col,t.row),r=Un(e,n.col,n.row);if(!s||!r)return false;for(let o of [s,r])if(o.hole||o.block||o.over||!o.piece)return false;return true}function Cr(e){let t=fs(e);for(let n=0;n<e.rows;n++)for(let s=0;s<e.cols;s++)for(let[r,o]of [[1,0],[0,1]]){let d={col:s,row:n},p={col:s+r,row:n+o};if(!Mo(e,d,p))continue;let v=e.cells[n][s].piece,M=e.cells[p.row][p.col].piece;if(v.color===An&&M.color===An)continue;if(v.special==="rainbow"||M.special==="rainbow")return [d,p];if(v.special&&M.special)return [d,p];let O=t[n][s];t[n][s]=t[p.row][p.col],t[p.row][p.col]=O;let E=Pr(t).size>0;if(t[p.row][p.col]=t[n][s],t[n][s]=O,E)return [d,p]}return null}function ii(e){let t=new Map;for(let n=0;n<e.rows;n++)for(let s=0;s<e.cols;s++){let r=e.cells[n][s].piece;r&&t.set(r.id,{col:s,row:n,piece:r});}return t}function hs(e,t){let n=0;for(let s of e.cells)for(let r of s)for(let o of [r.under,r.over,r.block])o?.id===t&&n++;return n}function li(e,t,n){if(!Mo(e,t,n))return null;let s=e.cells[t.row][t.col],r=e.cells[n.row][n.col],o=s.piece,d=r.piece;if(o.special==="rainbow"||d.special==="rainbow"||o.special&&d.special){s.piece=d,r.piece=o;let v=ri();return vp(e,v,n,o,t,d),fi(e,v),v}s.piece=d,r.piece=o;let p=lc(e,[t,n]);return p||(s.piece=o,r.piece=d,null)}function ms(e){return lc(e,[])}function ys(e,t,n="skill"){let s=ri(),r=t.filter(o=>ds(e,o.col,o.row)).map(o=>({...o,match:false}));return t[0]&&s.fired.push({...t[0],kind:n}),pi(e,s,r),fi(e,s),s}function ci(e,t){let n=[];if(t)return n;let s=Object.values(Dn).filter(r=>r.spreads);for(let r of s){let o=[];for(let v=0;v<e.rows;v++)for(let M=0;M<e.cols;M++)e.cells[v][M].under?.id===r.id&&o.push({col:M,row:v});if(o.length===0)continue;let d=[];for(let v of o)for(let[M,O]of ac){let E=Un(e,v.col+M,v.row+O);E&&!E.hole&&!E.block&&!E.under&&d.push({col:v.col+M,row:v.row+O});}if(d.length===0)continue;let p=ps(e,d);e.cells[p.row][p.col].under={id:r.id,hp:1},n.push(p);}return n}function di(e,t,n){let s=Dn[t];if(!s)return [];let r=[];for(let p=0;p<e.rows;p++)for(let v=0;v<e.cols;v++){let M=e.cells[p][v];M.hole||M.block||!M.piece||M.piece.color<0||M.piece.special||s.layer==="under"&&M.under||s.layer==="over"&&M.over||r.push({col:v,row:p});}let o=[],d=s.max===void 0?n:Math.max(0,s.max-hs(e,t));for(let p=0;p<Math.min(n,d)&&r.length>0;p++){let v=Math.floor(e.rnd()*r.length)%r.length,M=r.splice(v,1)[0],O=e.cells[M.row][M.col],E={id:t,hp:s.hp};s.layer==="under"?O.under=E:s.layer==="over"?O.over=E:(O.block=E,O.piece=null),o.push(M);}return o}function gs(e,t,n){let s=[];for(let o=0;o<e.rows;o++)for(let d=0;d<e.cols;d++){let p=e.cells[o][d].piece;p&&p.color>=0&&!p.special&&!e.cells[o][d].over&&s.push({col:d,row:o});}let r=[];for(let o=0;o<n&&s.length>0;o++){let d=s.splice(Math.floor(e.rnd()*s.length)%s.length,1)[0];e.cells[d.row][d.col].piece.special=e.rnd()<.5?"row":"col",r.push(d);}return r}function lc(e,t){let n=ic(fs(e));if(n.length===0)return null;let s=ri(),r=[];for(let p of n){let v=new Set(p.cells.map(([E,I])=>`${E},${I}`)),M=r.filter(E=>E.some(I=>I.cells.some(([K,z])=>v.has(`${K},${z}`)))),O=[p,...M.flat()];for(let E of M)r.splice(r.indexOf(E),1);r.push(O);}let o=[],d=[];for(let p of r){let v=new Map;for(let I of p)for(let[K,z]of I.cells)v.set(`${K},${z}`,{col:K,row:z});let M=p.reduce((I,K)=>Math.max(I,K.cells.length),0),O=p.some(I=>I.dir==="h")&&p.some(I=>I.dir==="v"),E=or.filter(I=>I.make!==null).find(I=>I.make(M,O,p.find(K=>K.cells.length===M).dir));if(E){let I=t.find(z=>v.has(`${z.col},${z.row}`))??(O?yp(p):null)??gp(p.find(z=>z.cells.length===M)),K=e.cells[I.row][I.col].piece?.color??0;d.push({at:I,special:E.id,color:K});}for(let I of v.values())o.push({...I,match:true});}pi(e,s,o);for(let p of d){let v=e.cells[p.at.row][p.at.col];v.piece||v.block||v.hole||(v.piece=cs(e,p.special==="rainbow"?oi:p.color,p.special),s.created.push({...p.at,piece:v.piece}));}return fi(e,s),s}function yp(e){let t=new Set;for(let n of e)for(let[s,r]of n.cells){let o=`${s},${r}`;if(t.has(o))return {col:s,row:r};t.add(o);}return null}var gp=e=>{let[t,n]=e.cells[Math.floor(e.cells.length/2)];return {col:t,row:n}};function pi(e,t,n){let s=new Set,r=new Set;for(;n.length>0;){let o=n.shift(),d=`${o.col},${o.row}`;if(!ds(e,o.col,o.row))continue;let p=e.cells[o.row][o.col];if(p.hole)continue;if(p.block){!o.match&&!r.has(d)&&(r.add(d),ls(t,p,"block",o));continue}if(s.has(d))continue;s.add(d);let v=p.piece;if(v){if(p.over){ls(t,p,"over",o);continue}if(v.color!==An){if(p.piece=null,t.cleared.push({...o,piece:v}),p.under&&(p.under.id==="slime"&&(t.slimeCleared=true),ls(t,p,"under",o)),o.match)for(let[M,O]of ac){let E=Un(e,o.col+M,o.row+O),I=`${o.col+M},${o.row+O}`;E?.block&&!r.has(I)&&Dn[E.block.id]?.hitByNear&&(r.add(I),ls(t,E,"block",{col:o.col+M,row:o.row+O}));}v.special&&bp(e,t,v.special,o,v.color,n);}}}}function ls(e,t,n,s){let r=t[n];r.hp-=1,e.hits.push({...s,id:r.id,hp:Math.max(0,r.hp)}),r.hp<=0&&(t[n]=null);}function bp(e,t,n,s,r,o){t.fired.push({...s,kind:n});let p=or.find(v=>v.id===n)?.shape??n;for(let v of ui(e,p,s,r))o.push({...v,match:false});}var bs=(e,t,n)=>ui(e,t,n,-1);function ui(e,t,n,s){let r=[],o=p=>{for(let v=0;v<e.cols;v++)r.push({col:v,row:p});},d=p=>{for(let v=0;v<e.rows;v++)r.push({col:p,row:v});};if(t==="row")o(n.row);else if(t==="col")d(n.col);else if(t==="cross")o(n.row),d(n.col);else if(t.startsWith("cross:")){let p=Number(t.slice(6));for(let v=-p;v<=p;v++)o(n.row+v),d(n.col+v);}else if(t.startsWith("area:")){let p=Number(t.slice(5));for(let v=-p;v<=p;v++)for(let M=-p;M<=p;M++)r.push({col:n.col+M,row:n.row+v});}else if(t==="color"){let p=s>=0?s:cc(e);for(let v=0;v<e.rows;v++)for(let M=0;M<e.cols;M++)e.cells[v][M].piece?.color===p&&r.push({col:M,row:v});}else if(t==="all")for(let p=0;p<e.rows;p++)o(p);return r.filter(p=>ds(e,p.col,p.row))}function cc(e){let t=new Map;for(let r of e.cells)for(let o of r)hp(o.piece)&&!o.block&&t.set(o.piece.color,(t.get(o.piece.color)??0)+1);let n=e.colors[0]??0,s=-1;for(let[r,o]of t)o>s&&(s=o,n=r);return n}function vp(e,t,n,s,r,o){let d=[],p=s.special??"plain",v=o.special??"plain",M=Jl.find(E=>E.a===p&&E.b===v||E.a===v&&E.b===p);e.cells[n.row][n.col].piece=null,e.cells[r.row][r.col].piece=null,t.cleared.push({...n,piece:s},{...r,piece:o}),t.fired.push({...r,kind:M?.effect??"combo"});let O=p==="rainbow"?o:s;if(M?.effect==="color"||M?.effect==="turn"){let E=O.color>=0?O.color:cc(e);for(let I=0;I<e.rows;I++)for(let K=0;K<e.cols;K++){let z=e.cells[I][K].piece;z?.color===E&&(M.effect==="turn"&&O.special&&O.special!=="rainbow"&&(z.special=O.special==="row"||O.special==="col"?e.rnd()<.5?"row":"col":O.special),d.push({col:K,row:I,match:false}));}}else for(let E of ui(e,M?.effect??"cross",r,O.color))d.push({...E,match:false});pi(e,t,d);}function fi(e,t){for(let n=0;n<4;n++){for(let r=0;r<e.cols;r++){let o=e.rows-1;for(;o>=0;){if(ti(e.cells[o][r])){o--;continue}let d=o;for(;d-1>=0&&!ti(e.cells[d-1][r]);)d--;let p=[];for(let O=o;O>=d;O--){let E=e.cells[O][r].piece;E&&p.push(E);}let v=o;for(let O of p)e.cells[v--][r].piece=O;let M=-1;for(;v>=d;v--){let O=d===xp(e,r)&&e.dropsToSpawn>0&&Sp(e)<2&&e.rnd()<.35,E=O?cs(e,An):cs(e,ps(e,e.colors));O&&e.dropsToSpawn--,e.cells[v][r].piece=E,t.spawned.push({col:r,row:v,piece:E,from:d+M--});}o=d-1;}}let s=false;for(let r=0;r<e.cols;r++){let o=kp(e,r);if(o<0)continue;let d=e.cells[o][r];d.piece?.color===An&&(d.piece=null,t.dropsCollected++,s=true);}if(!s)break}}var xp=(e,t)=>{for(let n=0;n<e.rows;n++)if(!ti(e.cells[n][t]))return n;return -1},kp=(e,t)=>{for(let n=e.rows-1;n>=0;n--)if(!e.cells[n][t].hole)return e.cells[n][t].block?-1:n;return -1},Sp=e=>{let t=0;for(let n of e.cells)for(let s of n)s.piece?.color===An&&t++;return t};var Ep="boss-spawned",Mp="boss-defeated",qn=b("match3.gem"),dc=b("match3.overlay"),hi=b("match3.layer"),pc=b("match3.backdrop"),uc=b("match3.part"),Ln=(e,t)=>{let n=Number(e.vars[t]??0);return Number.isFinite(n)?n:0},vs={id:"match3",version:2,engines:["phaser"],requires:["round"],params:{difficulty:{type:"number",default:.5,min:0,max:1},pieceScore:{type:"number",default:10,min:1,max:1e3,integer:true},coinEvery:{type:"number",default:8,min:1,max:100,integer:true},moveBonus:{type:"number",default:100,min:0,max:1e4,integer:true}},setup({world:e$1,params:t}){let n=x=>nn(t,x),s=e$1.rng.stream("match3"),r=wr(1,n("difficulty")),o=us(ss.plain,[0,1,2,3,4],()=>s.next(),Ua),d=Wt(),p="idle",v=new Map,M=new Map,O=null,E=null,I=null,K=null,z=0,ne=false,ae=0,j$1=0,ue=0,fe=0,ie=0,xe=false,se=false,_e={colors:new Map,drops:0},Ae=rs,be=rs,oe=0,me=0,Se=false,Ee=[],Q=null,Re=0,We=0,we=0,ee=null,Le=[],ye=new Map,ke=()=>Lr.find(x=>x.id===e$1.vars["meta:hero"])??Lr[0],Ue=()=>os(ke().skill),Y=()=>r.def.kind==="battle",Me=()=>e$1.vars.reviving===true,Xe=()=>Zl*Math.pow(1.06,r.level-1)*(1+Ln(e$1,"meta:attack")),at=()=>1+Ln(e$1,"meta:skill"),Te=()=>Ue().mana;function Wt(){return Fn(Ce(e$1),o.cols,o.rows,{top:.33,bottom:.96,widthShare:.94})}let Ge=()=>d.cell,qe=new Set,et=(x,S,a,k,A=1)=>{qe.add(x);let l=ye.get(x);(l===void 0||!e$1.isAlive(l))&&(l=e$1.create(),e$1.set(l,uc,{id:x}),ye.set(x,l)),e$1.set(l,e,{x:S,y:a,scale:A}),e$1.set(l,f,k);},rt=x=>{for(let[S,a]of [...ye])S.startsWith(x)&&(e$1.destroy(a),ye.delete(S));},lt=x=>{let S=Ge();if(x===oi)return {shape:"sprite",art:"m3_rainbow",w:S*.9,h:S*.9,depth:3};if(x===An)return {shape:"sprite",art:"m3_crate",w:S*.86,h:S*.86,depth:3};let a=So(x);return {shape:"sprite",art:a?.art??"gem1",w:S*.88,h:S*.88,color:a?.color??"piece1",depth:3}},ct=(x,S,a,k,A)=>{let l=Ze(d,S,A),h=e$1.create();return e$1.set(h,qn,{id:x,col:S,row:a,kind:k}),e$1.set(h,e,{x:l.x,y:l.y}),e$1.set(h,f,lt(k)),v.set(x,h),h},dt=()=>{let x=ii(o);for(let[S,a]of [...v])x.has(S)||(e$1.destroy(a),v.delete(S));for(let[S,a]of x){let k=v.get(S);k===void 0&&(k=ct(S,a.col,a.row,a.piece.color,a.row-o.rows));let A=e$1.need(k,qn);A.col=a.col,A.row=a.row,A.kind!==a.piece.color&&(A.kind=a.piece.color,e$1.set(k,f,lt(a.piece.color)));let l=a.piece.special&&a.piece.special!=="rainbow"?or.find(D=>D.id===a.piece.special):void 0,h=M.get(S);l&&h===void 0&&(h=e$1.create(),e$1.set(h,dc,{of:S}),e$1.set(h,e,{x:0,y:0}),M.set(S,h)),l&&h!==void 0&&e$1.set(h,f,{shape:"sprite",art:l.art,w:Ge()*.95,h:Ge()*.95,depth:4}),!l&&h!==void 0&&(e$1.destroy(h),M.delete(S));}for(let[S,a]of [...M])x.has(S)||(e$1.destroy(a),M.delete(S));ot();},ot=()=>{nt(e$1,hi);let x=Ge();for(let S=0;S<o.rows;S++)for(let a=0;a<o.cols;a++){let k=o.cells[S][a],A=Ze(d,a,S),l=(h,D,_,b=1)=>{if(!D)return;let m=Dn[D.id],R=e$1.create();e$1.set(R,hi,{key:h}),e$1.set(R,e,{x:A.x,y:A.y}),e$1.set(R,f,{shape:"sprite",art:D.hp>=2&&m?.id==="ice"?"m3_ice2":D.hp>=2&&m?.id==="stone"?"m3_stone2":m?.art??"m3_stone",w:x*b,h:x*b,depth:_});};l(`u${a},${S}`,k.under,1.5,.98),l(`o${a},${S}`,k.over,5,.98),l(`b${a},${S}`,k.block,3,.95);}},Pe=()=>{nt(e$1,pc),Ot(e$1,"board",d.top+d.cell*o.rows*.35);let x=Ge(),S=Ze(d,(o.cols-1)/2,(o.rows-1)/2),a=x*.25,k=(A,l,h)=>{let D=e$1.create();e$1.set(D,pc,{i:0}),e$1.set(D,e,{x:A,y:l}),e$1.set(D,f,h);};k(S.x,S.y,{shape:"sprite",art:"panel",w:x*o.cols+a*2,h:x*o.rows+a*2,color:"panel",alpha:.9,depth:-10});for(let A=0;A<o.rows;A++)for(let l=0;l<o.cols;l++){if(o.cells[A][l].hole)continue;let h=Ze(d,l,A);k(h.x,h.y,{shape:"sprite",art:"cell",w:x-2,h:x-2,color:(A+l)%2?"panel":"ground",alpha:.85,depth:-9});}},bt=()=>{let x=Ce(e$1),S=x.h*.12,a=d.top-Ge()*.4,k=Math.max(40,(a-S)*.92);if((ee===null||!e$1.isAlive(ee))&&(ee=e$1.create()),e$1.set(ee,e,{x:x.w*.15,y:a-k/2}),e$1.set(ee,f,{shape:"actor",cast:ke().cast,h:k,pose:"idle",facing:1,depth:20}),Q&&e$1.isAlive(Q.entity)){let A=k*Q.def.size;e$1.set(Q.entity,e,{x:x.w*.82,y:a-A/2});let l=e$1.need(Q.entity,f);l.shape==="actor"&&(l.h=A);}},Ke=()=>r.def.kind!=="goal"?[]:r.def.goals.map(x=>({goal:x,left:x.kind==="color"?Math.max(0,x.count-(_e.colors.get(x.color)??0)):x.kind==="clear"?hs(o,x.obstacle):x.kind==="drops"?Math.max(0,x.count-_e.drops):Math.max(0,x.value-Number(e$1.vars.score??0))})),At=()=>Ke().every(x=>x.left===0),en=x=>{let S=Ce(e$1).w*.07;if(x.kind==="color"){let a=So(x.color);return {shape:"sprite",art:a?.art??"gem1",w:S,h:S,color:a?.color??"piece1",depth:70}}return x.kind==="clear"?{shape:"sprite",art:Dn[x.obstacle]?.art??"m3_stone",w:S,h:S,depth:70}:x.kind==="drops"?{shape:"sprite",art:"m3_crate",w:S,h:S,depth:70}:{shape:"sprite",art:"coin",w:S,h:S,depth:70}},Rt=(x,S,a,k,A,l)=>{let h=Math.max(8,k*.09);et(`${x}:bg`,S,a,{shape:"rect",w:k,h,color:"#000000",alpha:.5,radius:h/2,depth:69});let D=Math.max(1,(k-4)*Math.max(0,Math.min(1,A)));et(`${x}:fill`,S-(k-4)/2+D/2,a,{shape:"rect",w:D,h:h-4,color:l,radius:(h-4)/2,depth:69.1});},tn=()=>{let x=Ce(e$1),S=Math.min(x.w,x.h),a=(b,m,R,C,P="text",W=S*.045)=>et(b,m,R,{shape:"text",text:C,size:Math.round(W),color:P,bold:true,depth:70}),k=d.top-Ge()*.4,A=x.h*.085;Le=[],qe.clear();let l=x.w*.36,h=(A+k)/2+S*.02,D=S*.07,_=me>=Te();if(Le.push({id:"skill",x:l,y:h,r:D*1.15}),_&&et("h:skill:glow",l,h,{shape:"circle",r:D*1.25,color:Se?"coin":"secondary",alpha:.5+.3*Math.sin(e$1.time*7),depth:68.9}),et("h:skill:bg",l,h,{shape:"circle",r:D,color:"panel",alpha:.95,depth:69}),et("h:skill:i",l,h,{shape:"sprite",art:Ue().art,w:D*1.4,h:D*1.4,alpha:_?1:.45,depth:69.2}),Rt("h:mana",l,h+D*1.45,D*2.2,me/Te(),"secondary"),Y()){let b=x.w*.15;if(Rt("h:hp",b,A,x.w*.24,Ae/be,"accent"),a("h:hp:t",b+x.w*.12+S*.05,A,`${Math.ceil(Ae)}`,"text",S*.034),oe>0&&(et("h:sh:i",b+x.w*.12+S*.05,A+S*.055,{shape:"sprite",art:"m3_shield",w:S*.045,h:S*.045,color:"primary",depth:70}),a("h:sh:t",b+x.w*.12+S*.11,A+S*.055,`${Math.ceil(oe)}`,"primary",S*.03)),Q){let m=x.w*.78;Rt("h:foe",m,A,x.w*.26,Q.hp/Q.max,"danger"),a("h:foe:t",m-x.w*.13-S*.05,A,`${Math.ceil(Q.hp)}`,"text",S*.034);let R=ko[Q.def.element];et("h:foe:el",m+x.w*.13+S*.03,A,{shape:"circle",r:S*.018,color:R.color,depth:70});let C=(A+k)/2;et("h:foe:in:bg",x.w*.62,C,{shape:"circle",r:S*.045,color:Q.in<=1?"danger":"panel",alpha:.95,depth:69}),a("h:foe:in",x.w*.62,C,String(Q.in),"text",S*.045);let P=r.def.kind==="battle"?r.def.enemies.length:0;for(let W=0;W<P;W++)et(`h:q:${W}`,x.w*.8+(W-(P-1)/2)*S*.04,k+S*.005,{shape:"circle",r:S*.012,color:W<Re?"muted":W===Re?"danger":"text",alpha:.9,depth:70});}}else {a("h:moves",x.w*.5,A+S*.01,String(j$1),j$1<=3?"danger":"text",S*.075);let b=Ke(),m=x.w*.64,R=x.w*.11,C=(A+k)/2+S*.02;b.forEach((P,W)=>{let J=m+W*R;et(`h:g:${W}`,J,C,en(P.goal)),a(`h:g:${W}:t`,J,C+S*.06,P.left===0?"\u2713":String(P.left),P.left===0?"accent":"text",S*.038);});}e$1.vars.m3_phase=p,e$1.vars.m3_buttons=Le.map(b=>`${b.id}@${Math.round(b.x)},${Math.round(b.y)}`).join(";");for(let[b,m]of [...ye])!b.startsWith("h:")||qe.has(b)||(e$1.destroy(m),ye.delete(b));},Et=()=>{Q&&e$1.isAlive(Q.entity)&&Qe(e$1,Q.entity,"die");let x=Ee.shift();if(x===void 0){Q=null;return}let S=Eo(x),a=e$1.create();e$1.set(a,e,{x:0,y:0}),e$1.set(a,f,{shape:"actor",cast:S.cast,variant:S.variant??s.int(0,99),h:50,pose:"idle",facing:-1,depth:20});let k=S.hp*r.enemyHp;Q={def:S,hp:k,max:k,in:S.every,rage:1,entity:a},bt(),S.boss&&(e$1.emit(Ep,{kind:x}),G(e$1,{kind:"shake",power:1})),L();},L=()=>{if(e$1.vars.moves=j$1,e$1.vars.hero_hp=Math.ceil(Ae),e$1.vars.mana=Math.floor(me),e$1.vars.m3_goals=Ke().map(x=>`${x.goal.kind==="color"?`color${x.goal.color}`:x.goal.kind==="clear"?x.goal.obstacle:x.goal.kind}:${x.left}`).join(","),e$1.vars.m3_enemy=Q?`${Q.def.id}:${Math.ceil(Q.hp)}/${Math.ceil(Q.max)}:${Q.in}`:"",Y()){let x=r.def.kind==="battle"?r.def.enemies.length:1;e$1.vars.level_progress=Math.min(1,(Re+(Q?1-Q.hp/Q.max:0))/x);}else {let x=r.def;if(x.kind==="goal"){let S=x.goals.map(k=>k.kind==="color"||k.kind==="drops"?k.count:k.kind==="score"?k.value:1),a=Ke();e$1.vars.level_progress=a.reduce((k,A,l)=>k+(A.goal.kind==="clear"?A.left===0?1:0:1-A.left/S[l]),0)/Math.max(1,a.length);}}},B=()=>{nt(e$1,qn),nt(e$1,dc),nt(e$1,hi),nt(e$1,uc),v.clear(),M.clear(),ye.clear(),Q&&e$1.isAlive(Q.entity)&&e$1.destroy(Q.entity),Q=null,r=wr(Ln(e$1,"meta:chapter")||1,n("difficulty"));let x=r.def;o=us(ss[x.board]??ss.plain,r.colors,()=>s.next(),Ua,x.kind==="goal"?x.drops??0:0),d=Wt(),Pe(),p="idle",O=null,E=null,I=null,K=null,z=0,ne=false,ae=0,_e.colors.clear(),_e.drops=0,j$1=x.kind==="goal"?x.moves+Ln(e$1,"meta:moves"):0,ue=j$1,fe=0,ie=0,xe=false,se=false,be=rs*Math.pow(1.06,r.level-1)*(1+Ln(e$1,"meta:health")),Ae=be,oe=0,me=0,Se=false,Re=0,We=0,we=0,Ee=x.kind==="battle"?[...x.enemies]:[],e$1.vars.m3_level=r.level,e$1.vars.m3_world=r.world,e$1.vars.m3_kind=x.kind,e$1.vars.coins=0,e$1.vars.score=0,e$1.vars.stars=0,e$1.vars.reviving=false,dt(),bt(),x.kind==="battle"&&Et(),L();},f$1=x=>{if(!x||!Q)return 1;let S=ko[x].beats.includes(Q.def.element),a=x===Q.def.element;return (S?1.5:a?.5:1)*(x===ke().element?1.25:1)},c=(x,S=0)=>{z++,ne||=x.slimeCleared,_e.drops+=x.dropsCollected;let a=S,k=0,A=0,l=Ge();for(let b of x.cleared){let m=b.piece;m.color>=0&&_e.colors.set(m.color,(_e.colors.get(m.color)??0)+1);let R=So(m.color),C=Ze(d,b.col,b.row);G(e$1,{kind:"burst",x:C.x,y:C.y,color:R?.color??"coin",n:6,size:l*.8}),me=Math.min(Te(),me+tc*(1+Ln(e$1,"meta:mana"))),!(!Y()||!R)&&(R.role==="attack"?a+=Xe()*f$1(R.element)*(1+.25*(z-1)):R.role==="heal"?k+=Ql*Math.pow(1.06,r.level-1)*(1+Ln(e$1,"meta:health")):R.role==="shield"&&(A+=ec*Math.pow(1.06,r.level-1)*(1+Ln(e$1,"meta:defense"))));}for(let b of x.fired){let m=Ze(d,b.col,b.row);G(e$1,{kind:"ring",x:m.x,y:m.y,color:"coin",size:l*2.4});}x.fired.length>0&&G(e$1,{kind:"shake",power:.4+Math.min(1,x.fired.length*.2)});for(let b of x.created)e$1.emit("special-made",{kind:b.piece.special});let h=x.cleared.length*n("pieceScore")*z+x.fired.length*30;Fe(e$1,"score",h),ae+=x.cleared.length;let _=Math.floor(ae/n("coinEvery"))-Math.floor((ae-x.cleared.length)/n("coinEvery"));_>0&&(Fe(e$1,"coins",_),e$1.emit("coin-collected",{value:_})),e$1.emit("pieces-cleared",{count:x.cleared.length,cascade:z}),Y()&&(k>0&&(Ae=Math.min(be,Ae+k),ee!==null&&G(e$1,{kind:"pop",x:e$1.need(ee,e).x,y:e$1.need(ee,e).y-l,text:`+${Math.round(k)}`,color:"accent",size:Math.round(l*.45)})),A>0&&(oe+=A),a>0&&Q&&y(a)),dt(),L();},y=x=>{if(!Q)return;Q.hp-=x,ee!==null&&ze(e$1,ee,"attack"),ze(e$1,Q.entity,"hit");let S=e$1.need(Q.entity,e);G(e$1,{kind:"pop",x:S.x,y:S.y-Ge(),text:`-${Math.round(x)}`,color:"danger",size:Math.round(Ge()*.5)}),!(Q.hp>0)&&(Re++,e$1.emit("enemy-defeated",{kind:Q.def.id}),i(),Q.def.boss&&(We++,Fe(e$1,"coins",10),e$1.emit(Mp,{kind:Q.def.id}),G(e$1,{kind:"flash",color:"coin"})),Et());},i=()=>{if(!Q)return;Qe(e$1,Q.entity,"die");let x=Q.entity;e$1.need(x,f).alpha=.6,g(()=>{e$1.isAlive(x)&&e$1.destroy(x);});},u=[],g=x=>u.push({t:.9,f:x}),T=()=>{if(ci(o,ne),ne=false,z=0,dt(),r.def.kind==="goal"){if(At())return $();if(j$1<=0)return le("out-of-moves")}else {if(!Q)return $();if(Q.in--,Q.in<=0){p="enemy",ie=.45;return}}w();},w=()=>{p="idle",Cr(o)===null&&(si(o),dt(),e$1.emit("board-shuffled",{})),L();},N=()=>{if(!Q)return w();let x=Q.def,S=r.enemyAttack*x.attack*Q.rage;Q.rage=1,ze(e$1,Q.entity,"attack");let a=Math.min(oe,S);if(oe-=a,S=(S-a)*(1-Math.min(.6,Ln(e$1,"meta:defense"))),S>0){if(Ae-=S,ee!==null){ze(e$1,ee,"hit");let A=e$1.need(ee,e);G(e$1,{kind:"pop",x:A.x,y:A.y-Ge(),text:`-${Math.round(S)}`,color:"danger",size:Math.round(Ge()*.5)});}G(e$1,{kind:"shake",power:.8}),e$1.emit("player-hit",{hp:Math.ceil(Ae)});}let k=x.skill;if(k?.kind==="sow"?di(o,k.obstacle,k.count):k?.kind==="heal"?Q.hp=Math.min(Q.max,Q.hp+Q.max*k.share):k?.kind==="rage"&&(Q.rage=k.mult),Q.in=x.enrage&&Q.hp<Q.max*x.enrage?Math.max(1,x.every-1):x.every,dt(),Ae<=0)return Ae=0,le("fell");w();},$=()=>{if(r.def.kind==="goal"){we=Math.min(j$1,12),e$1.vars.stars=Math.min(xe?1:3,Za(j$1/Math.max(1,ue),false)),Fe(e$1,"score",j$1*n("moveBonus")),p="finale",ie=.3;return}e$1.vars.stars=Math.min(xe?1:3,Za(Ae/be,true)),te("cleared");},te=x=>{if(se)return;se=true,p="over";let S=x==="cleared";S&&e$1.vars["meta:first_clear"]===true&&Fe(e$1,"coins",r.firstClearGold),S||(e$1.vars.stars=0),e$1.vars.reviving=false,L(),e$1.emit($t,{reason:x,stats:{chapter:r.level,seconds:Math.floor(fe),cleared:S,stars:Number(e$1.vars.stars??0),coins:Number(e$1.vars.coins??0),bosses:We,kills:Re,battle:Y()}});},le=x=>{if(e$1.vars.revive_ready===true&&!xe){e$1.vars.reviving=true,e$1.vars.m3_revive_reason=x,p="idle",e$1.emit(Vt,{});return}te(x);},ge=()=>{Me()&&(xe=true,e$1.vars.reviving=false,Y()?(Ae=be*oc,Q&&(Q.in=Q.def.every)):j$1+=rc,G(e$1,{kind:"flash",color:"coin"}),w());},He=x=>{let S=o.cells[x.row]?.[x.col];if(!S||S.hole)return 0;let a=r.def.kind==="goal"?r.def.goals:[],k=0;for(let l of [S.under,S.over,S.block])l&&(k+=a.some(h=>h.kind==="clear"&&h.obstacle===l.id)?6:3);let A=S.piece;if(A&&!S.block){k+=1,A.special&&(k+=3),a.some(h=>h.kind==="color"&&h.color===A.color)&&(k+=2);let l=So(A.color);Y()&&l?.role==="attack"&&(k+=f$1(l.element));}if(a.some(l=>l.kind==="drops"))for(let l=0;l<x.row;l++)o.cells[l][x.col].piece?.color===An&&(k+=2);return k},je=x=>{let S={col:Math.floor(o.cols/2),row:Math.floor(o.rows/2)},a=-1;for(let k=0;k<o.rows;k++)for(let A=0;A<o.cols;A++){if(o.cells[k][A].hole)continue;let l=bs(o,x,{col:A,row:k}).reduce((h,D)=>h+He(D),0);l>a&&(a=l,S={col:A,row:k});}return S},st=()=>{let x=Ue();if(me<x.mana||p!=="idle")return false;let S=at(),a=[];if(x.kind==="shape"){let l=S>=(x.bigAt??99)&&x.bigShape?x.bigShape:x.shape??"area:1",h=je(l);a=bs(o,l,h);let D=Ze(d,h.col,h.row);G(e$1,{kind:"ring",x:D.x,y:D.y,color:"coin",size:Ge()*4}),G(e$1,{kind:"flash",color:"coin"});}else a=gs(o,"line",Math.round((x.count??3)*S));me=0,Se=false,z=0,ee!==null&&ze(e$1,ee,"attack"),e$1.emit("skill-cast",{id:x.id}),vt(e$1,"m3-skill");let k=Y()&&Q?x.damage*Xe()*S*f$1(ke().element):0,A=ys(o,a,x.id);return c(A,k),p="falling",true},Z=x=>{if(I){let S=o.cells[I.row]?.[I.col]?.piece?.id,a=S!==void 0?v.get(S):void 0;a!==void 0&&(e$1.need(a,e).scale=1);}if(I=x,x){let S=o.cells[x.row]?.[x.col]?.piece?.id,a=S!==void 0?v.get(S):void 0;a!==void 0&&(e$1.need(a,e).scale=1.15);}},H=0,X=(x,S)=>{if(H=0,Dt(e$1),p!=="idle"||Me()||!Mo(o,x,S))return;Z(null);let a=o.cells[x.row][x.col].piece.id,k=o.cells[S.row][S.col].piece.id;O=new Map([[a,S],[k,x]]),E=[x,S],p="swapping",vt(e$1,"match3-swap");};e$1.on(j,x=>{let S=x;if(!(!Je(e$1)||Kn(e$1)||se||Me()))if(S.type==="tap"){if(Le.find(A=>Math.hypot(S.x-A.x,S.y-A.y)<=A.r)?.id==="skill"){if(me<Te())return;st()||(Se=true);return}let k=Tn(d,S.x,S.y);if(!k||p!=="idle")return;I&&Math.abs(I.col-k.col)+Math.abs(I.row-k.row)===1?X(I,k):Z(I&&I.col===k.col&&I.row===k.row?null:k);}else if(S.type==="press"){let a=Tn(d,S.x,S.y);K=a?{x:S.x,y:S.y,...a}:null;}else if(S.type==="move"&&K){let a=S.x-K.x,k=S.y-K.y;if(Math.max(Math.abs(a),Math.abs(k))<d.cell*.45)return;let A={col:K.col,row:K.row},l=Math.abs(a)>Math.abs(k)?{col:A.col+Math.sign(a),row:A.row}:{col:A.col,row:A.row+Math.sign(k)};K=null,X(A,l);}else S.type==="release"&&(K=null);}),e$1.on(Nt,()=>{B(),e$1.vars.level=r.level;}),e$1.on(zt,B),e$1.on(Gt,ge),e$1.on(Kt,()=>{Me()&&(e$1.vars.reviving=false,te(Y()?"fell":"out-of-moves"));}),e$1.on(Bt,x=>{rt("h:"),Le=[],ee!==null&&e$1.isAlive(ee)&&Qe(e$1,ee,x.reason==="cleared"?"dance":"die");}),e$1.on(k,()=>{d=Wt(),Pe();for(let[x,S]of v){let a=e$1.need(S,qn);e$1.set(S,f,lt(a.kind));}dt(),bt();});let q=x=>{let S=true,a=Math.min(1,x*14),k=Ge();for(let A of e$1.query(qn)){let l=e$1.need(A,qn),h=O?.get(l.id)??l,D=e$1.need(A,e),_=Ze(d,h.col,h.row),b=_.x-D.x,m=_.y-D.y,R=e$1.need(A,f);Math.abs(b)<.5&&Math.abs(m)<.5?(D.x=_.x,D.y=_.y,R.alpha=1):(S=false,R.alpha=D.y<d.top-k*.3?0:1,D.x+=b*a,D.y+=Math.abs(m)>k*.3?Math.sign(m)*Math.min(Math.abs(m),k*12*x):m*a);}for(let[A,l]of M){let h=v.get(A);if(h===void 0)continue;let D=e$1.need(h,e);e$1.set(l,e,{x:D.x,y:D.y,scale:1+.06*Math.sin(e$1.time*6)}),e$1.need(l,f).alpha=e$1.need(h,f).alpha??1;}return S};e$1.addSystem({id:"match3",order:0,run(x,S){for(let a of [...u])a.t-=S,a.t<=0&&(u.splice(u.indexOf(a),1),a.f());if(!Je(x)||se){q(S);return}if(fe+=S,tn(),!Me()&&q(S)){if(ie>0){ie-=S;return}if(p==="swapping"&&E){let[a,k]=E;E=null,O=null,z=0;let A=li(o,a,k);if(!A){let l=o.cells[a.row][a.col].piece.id,h=o.cells[k.row][k.col].piece.id;O=new Map([[l,k],[h,a]]),p="returning";return}r.def.kind==="goal"&&j$1--,c(A),p="falling";return}if(p==="returning"){if(O){O=null;return}p="idle";return}if(p==="falling"){let a=ms(o);if(a){c(a);return}T();return}if(p==="enemy"){N();return}if(p==="finale"){if(we>0){we--,j$1=Math.max(0,j$1-1);let k=gs(o,"line",1);k.length>0&&c(ys(o,k,"finale")),dt(),ie=.12;return}let a=ms(o);if(a){c(a);return}te("cleared");return}if(p==="idle"&&Se){st();return}if(p==="idle"){if(H+=S,(!ht(x,"match3-swap")||H>7)&&!un(x)){let a=Cr(o);a&&ft(x,"swipe",Ze(d,a[0].col,a[0].row),Ze(d,a[1].col,a[1].row),d.cell*1.1);}if(me>=Te()&&!ht(x,"m3-skill")&&!un(x)){let a=Le.find(k=>k.id==="skill");a&&ft(x,"tap",a,void 0,d.cell*1.2);}}}}}),B();}};var _o=[{id:"garden",prefix:"item",levels:8,color:"accent",gen:"mg_gen_garden"},{id:"bake",prefix:"mg_bake",levels:7,color:"coin",gen:"mg_gen_bake"},{id:"jewel",prefix:"mg_jewel",levels:7,color:"primary",gen:"mg_gen_jewel"},{id:"potion",prefix:"mg_potion",levels:7,color:"secondary",gen:"mg_gen_potion"}],gn=e=>_o.find(t=>t.id===e),mi=3,fc=[0,.2,.35],hc=.06,rn={box:{id:"box",layer:"block",art:["mg_box","mg_box2"],neighbour:true,coins:1},fog:{id:"fog",layer:"cover",art:["mg_fog"],neighbour:true,hides:true},web:{id:"web",layer:"cover",art:["mg_web"],neighbour:true,mergeInto:true},bubble:{id:"bubble",layer:"cover",art:["mg_bubble"],neighbour:false,mergeInto:true,ttl:14}},yi=[{id:"joker",art:"mg_joker",effect:"joker"},{id:"scissors",art:"mg_scissors",effect:"split"},{id:"chest",art:"chest",effect:"chest",amount:3},{id:"battery",art:"mg_energy",effect:"energy",amount:6}],wn=e=>yi.find(t=>t.id===e),gi=[[1,.5],[2,.35],[3,.15]],bi={"-":{kind:"free"},".":{kind:"hole"},A:{kind:"gen",chain:0},B:{kind:"gen",chain:1},C:{kind:"gen",chain:2},D:{kind:"gen",chain:3},a:{kind:"item",chain:0,level:1},b:{kind:"item",chain:1,level:1},c:{kind:"item",chain:2,level:1},d:{kind:"item",chain:3,level:1},x:{kind:"block",obstacle:"box",hp:1},X:{kind:"block",obstacle:"box",hp:2},f:{kind:"cover",obstacle:"fog",levels:[1,2,2,3]},w:{kind:"cover",obstacle:"web",levels:[2,2,3]},u:{kind:"cover",obstacle:"bubble",levels:[3,3,4]},J:{kind:"special",special:"joker"},S:{kind:"special",special:"scissors"},K:{kind:"special",special:"chest"},E:{kind:"special",special:"battery"}},mc=7,yc=8,sr={start:["-------","-------","--a-a--","---A---","--a----","-------","-------","-------"],two:["-------","-------","-a---b-","--A-B--","-------","-------","-------","-------"],boxes:["-------","-------","--A-B--","-------","xxxxxxx","x--K--x","x-----x","xxxxxxx"],fog:["fffffff","fffffff","-------","--A-B--","-------","-------","xx-E-xx","xx---xx"],yard:["X-----X","-------","-A-J-B-","-------","xx---xx","fx---xf","ffx-xff","fffffff"],cellar:["XxxxxxX","x-----x","x-A-B-x","x-----x","x--K--x","xfffffx","xfffffx","XxxxxxX"],webs:["-------","-w---w-","--A-B--","---C---","-w---w-","-------","--www--","-------"],mine:["XX---XX","X--S--X","--A-C--","---B---","-------","ffXXXff","fff-fff","fffffff"],workshop:["w--E--w","-------","-A-B-C-","-------","xwxwxwx","-------","x--K--x","XXXXXXX"],vault:["XfffffX","fx---xf","f-A-B-f","f--J--f","f-C---f","fx---xf","XfffffX","XXXXXXX"],bubbles:["-------","-u---u-","--A-B--","---C---","-------","-u---u-","--uuu--","-------"],holes:["..---..",".-----.","--A-B--","---C---","---D---","--fff--",".-fff-.","..---.."],lab:["u-----u","-x-E-x-","--A-D--","-------","--B-C--","-w---w-","xxwuwxx","XXXXXXX"],terrace:["...-...","..---..",".-A-B-.","---J---","-C---D-","-u-x-u-","xxfffxx","XXfffXX"],four:["-------","-A---B-","-------","---J---","-------","-C---D-","xxxxxxx","XXXXXXX"],fortress:["ffXXXff","fx---xf","X-A-B-X","X--S--X","X-C-D-X","fx-K-xf","ffXXXff","fffffff"],maze:["-x-u-x-","-x---x-","-xA-Bx-","--w-w--","-xC-Dx-","-x---x-","-xfffx-","XXfffXX"],palace:["uXXXXXu","X--E--X","X-A-B-X","X--J--X","X-C-D-X","Xw---wX","XffKffX","XXXXXXX"]},vi=[{id:"upgrade",art:"mg_sk_merge",charge:10,effect:"upgrade",count:3},{id:"free",art:"mg_sk_free",charge:9,effect:"free",count:6},{id:"joker",art:"mg_sk_joker",charge:12,effect:"joker",count:2}],Ss=e=>vi.find(t=>t.id===e),Nr=[{id:"hero",cast:"hero",gems:0,skill:"upgrade"},{id:"hero2",cast:"hero2",gems:150,skill:"free"},{id:"hero3",cast:"hero3",gems:300,skill:"joker"}],Ie=(e,t,n,s,r=0,o=3,d)=>({board:e,chains:[...t].map(p=>({g:"garden",b:"bake",j:"jewel",p:"potion"})[p]??"garden"),orders:n,top:s,double:r,visible:o,...d?{slack:d}:{}}),xs=e=>({...e,vip:true}),Ut=(e,t)=>({...e,extra:t}),Es=[Ie("start","g",3,3,0,1,1.6),Ie("start","g",4,3,0,2,1.5),Ie("two","gb",4,3,0,2,1.45),Ie("two","gb",5,4,0,2),Ie("boxes","gb",5,4,0,3),Ie("boxes","gb",6,4,.2,3),Ie("fog","gb",6,4,.2,3),Ie("yard","gb",6,5,.2,3),Ie("fog","gb",7,5,.3,3),Ut(xs(Ie("cellar","gb",6,5,.3,3)),.92),Ut(Ie("webs","gbj",5,4,.2,3),.92),Ut(Ie("webs","gbj",6,4,.3,3),.92),Ut(Ie("mine","gbj",6,5,.2,3),1.15),Ut(Ie("workshop","gbj",6,5,.3,3),.9),Ut(Ie("mine","gbj",7,5,.3,3),1.08),Ut(Ie("yard","gj",6,5,.3,3),1.15),Ut(Ie("workshop","gbj",7,5,.4,3),.92),Ie("vault","gbj",7,5,.3,3),Ut(Ie("webs","jbg",7,6,.3,3),.92),xs(Ie("vault","gbj",7,6,.4,3)),Ut(Ie("bubbles","gbp",6,5,.2,3),1.15),Ut(Ie("bubbles","gbp",6,5,.3,3),1.12),Ut(Ie("holes","gbpj",6,5,.3,3),.92),Ut(Ie("lab","gbjp",7,5,.3,3),.92),Ie("holes","gbpj",7,5,.4,3),Ie("bubbles","pjg",7,6,.3,3),Ie("lab","gbjp",7,6,.4,3),Ie("terrace","gbjp",8,5,.4,3),Ie("holes","gbpj",8,6,.4,3),xs(Ie("terrace","gbjp",7,6,.4,3)),Ie("four","gbjp",7,5,.3,3),Ut(Ie("fortress","gbjp",7,5,.4,3),1.06),Ie("maze","gbjp",7,6,.4,3),Ie("four","gbjp",8,6,.4,3),Ut(Ie("fortress","gbjp",8,6,.5,3),1.06),Ie("palace","gbjp",8,6,.4,3),Ie("maze","gbjp",8,6,.5,3),Ie("lab","gbjp",9,6,.5,3),Ie("palace","gbjp",9,6,.5,3),Ut(xs(Ie("fortress","gbjp",8,6,.5,3)),1.06)],Ir=10,gc=4,Ms=Es.length,xi=[0,18,45,75];function _p(e){let t=e>>>0;return ()=>{t=t+1831565813>>>0;let n=t;return n=Math.imul(n^n>>>15,n|1),n^=n+Math.imul(n^n>>>7,n|61),((n^n>>>14)>>>0)/4294967296}}var ks=e=>Math.pow(2,Math.max(0,e-1));function Rp(e,t){let n=_p(t*7919+13),s=[],r=e.chains;for(let o=0;o<e.orders;o++){let d=e.orders<=1?1:o/(e.orders-1),p=e.vip===true&&o===e.orders-1,v=2+Math.round(d*(e.top-2)),M=Math.max(2,Math.min(e.top,v-(n()<.3?1:0))),O=r[(o+Math.floor(n()*r.length))%r.length],E=[{chain:O,level:p?Math.min(e.top+1,(gn(O)?.levels??7)-1):M}];if(p||o>0&&r.length>1&&n()<e.double){let I=r[(r.indexOf(O)+1+Math.floor(n()*(r.length-1)))%r.length];E.push({chain:I,level:p?e.top:Math.max(2,M-1)});}s.push({wants:E,vip:p});}return s}function Tp(e){let t=r=>r.reduce((o,d)=>o+ks(d),0)/Math.max(1,r.length),n=gi.reduce((r,[o,d])=>r+ks(o)*d,0),s=0;for(let r of e.join("")){let o=bi[r];if(o){if(o.kind==="item")s+=ks(o.level);else if(o.kind==="cover")s+=t(o.levels)*(rn[o.obstacle]?.mergeInto&&!rn[o.obstacle]?.ttl?.5:.2);else if(o.kind==="special"){let d=wn(o.special);s+=d?.effect==="energy"?d.amount??0:d?.effect==="chest"?n*(d.amount??0):d?.effect==="joker"?3:2;}}}return s}function $r(e,t=.5){let n=Math.max(1,Math.min(Ms,Math.floor(e))),s=Es[n-1],r=Math.ceil(n/Ir),o=Rp(s,n),d=o.reduce((M,O)=>M+O.wants.reduce((E,I)=>E+ks(I.level),0),0),p=Math.max(d*.4,d-Tp(sr[s.board]??[])*.7),v=(s.slack??1.32-(r-1)*.08-(n-(r-1)*Ir)*.006)*(1.1-t*.2)*(s.extra??1);return {level:n,world:r,index:n-(r-1)*Ir,def:s,boss:s.vip===true,orders:o,energy:Math.ceil(p*v),firstClearGold:(s.vip?120:50)+(n-1)*10}}var ki=e=>xi[Math.ceil(Math.max(1,e)/Ir)-1]??0,_s=e=>e>=.2?3:e>=.08?2:1,Rs=15,Si="kit-merge",Ei=[{id:"Energy",var:"meta:energy",art:"mg_energy",color:"coin",perLevel:2,unit:"",maxLevel:15,price:40,growth:.12},{id:"GenLuck",var:"meta:luck",art:"mg_joker",color:"secondary",perLevel:2,unit:"%",maxLevel:15,price:45,growth:.12},{id:"Reward",var:"meta:reward",art:"coin",color:"coin",perLevel:5,unit:"%",maxLevel:20,price:40,growth:.12},{id:"SkillPower",var:"meta:skill",art:"mg_sk_merge",color:"secondary",perLevel:8,unit:"%",maxLevel:10,price:50,growth:.12},{id:"Charge",var:"meta:charge",art:"mg_sk_free",color:"primary",perLevel:5,unit:"%",maxLevel:10,price:50,growth:.12}],bc={game:"merge",character:Si,stats:Ei,heroes:Nr,levels:Ms,firstClearGold:e=>$r(e).firstClearGold,stars:3,starsToEnter:ki};var Ts=e=>({kind:"none",at:e,hits:[],coins:0}),Pn=e=>gn(e)?.levels??8,Mi=(e,t,n,s,r="")=>({id:e.nextId++,kind:t,chain:n,level:s,special:r}),Ro=(e,t,n)=>Mi(e,"item",t,n),xc=(e,t)=>Mi(e,"special","",0,t);function _i(e,t,n){let s=Math.max(...e.map(d=>d.length)),r={cols:s,rows:e.length,cells:[],chains:t,nextId:1,rand:n},o=d=>t[d]??null;for(let d=0;d<e.length;d++){let p=[];for(let v=0;v<s;v++){let M=bi[e[d][v]??"-"]??{kind:"free"},O={hole:M.kind==="hole",thing:null,cover:null,block:null};if(M.kind==="gen"){let E=o(M.chain);E&&(O.thing=Mi(r,"gen",E,1));}else if(M.kind==="item"){let E=o(M.chain);E&&(O.thing=Ro(r,E,M.level));}else if(M.kind==="block")O.block={id:M.obstacle,hp:M.hp};else if(M.kind==="cover"){let E=t[Math.floor(n()*t.length)]??"garden",I=Math.min(Pn(E)-1,M.levels[Math.floor(n()*M.levels.length)]??1);O.thing=Ro(r,E,I);let K=rn[M.obstacle];O.cover={id:M.obstacle,hp:1,...K?.ttl?{ttl:K.ttl}:{}};}else M.kind==="special"&&(O.thing=xc(r,M.special));p.push(O);}r.cells.push(p);}return r}var ar=(e,t)=>e.cells[t.row]?.[t.col],kc=(e,t)=>t.col>=0&&t.row>=0&&t.col<e.cols&&t.row<e.rows,Sc=e=>!!e&&!e.hole&&!e.thing&&!e.block,Br=(e,t)=>{let n=ar(e,t);return !!n&&!!n.thing&&!n.cover&&!n.block};function bn(e){let t=[];for(let n=0;n<e.rows;n++)for(let s=0;s<e.cols;s++){let r=e.cells[n][s];r.thing&&t.push({at:{col:s,row:n},thing:r.thing,cell:r});}return t}var Op=e=>e.cells.reduce((t,n)=>t+n.filter(Sc).length,0);function Os(e,t){let n=null,s=1/0;for(let r=0;r<e.rows;r++)for(let o=0;o<e.cols;o++){if(!Sc(e.cells[r][o]))continue;let d=Math.hypot(o-t.col,(r-t.row)*1.05);d<s-1e-9&&(s=d,n={col:o,row:r});}return n}function Ds(e,t){let n=t?.thing;return !t||!n||t.block||n===e||e.kind!==n.kind||e.kind==="special"||t.cover&&!rn[t.cover.id]?.mergeInto||e.chain!==n.chain||e.level!==n.level?false:e.kind==="gen"?e.level<mi:e.level<Pn(e.chain)}function vc(e,t){let n=[],s=0;for(let[r,o]of [[1,0],[-1,0],[0,1],[0,-1]]){let d={col:t.col+r,row:t.row+o};if(!kc(e,d))continue;let p=e.cells[d.row][d.col];for(let v of ["block","cover"]){let M=p[v];if(!M)continue;let O=rn[M.id];if(!O?.neighbour)continue;M.hp--;let E=M.hp<=0;E&&(p[v]=null,s+=O.coins??0),n.push({at:d,id:M.id,gone:E,revealed:E&&!!O.hides});}}return {hits:n,coins:s}}function Ec(e,t,n){if(!Br(e,t)||!kc(e,n)||t.col===n.col&&t.row===n.row)return Ts(t);let s=ar(e,t),r=ar(e,n),o=s.thing;if(r.hole||r.block)return Ts(t);if(Ds(o,r)){let M=r.thing;s.thing=null,M.level++;let O=r.cover?.id;r.cover=null;let E=vc(e,n);return {kind:"merge",at:n,level:M.level,...O?{freed:O}:{},hits:E.hits,coins:E.coins}}let d=o.kind==="special"?wn(o.special):void 0,p=r.thing,v=!r.cover||!!rn[r.cover.id]?.mergeInto;if(d?.effect==="joker"&&p?.kind==="item"&&v&&p.level<Pn(p.chain)){s.thing=null,p.level++;let M=r.cover?.id;r.cover=null;let O=vc(e,n);return {kind:"joker",at:n,level:p.level,...M?{freed:M}:{},hits:O.hits,coins:O.coins}}if(d?.effect==="split"&&p?.kind==="item"&&!r.cover&&p.level>=2){s.thing=null;let M=Os(e,n);return M?(p.level--,e.cells[M.row][M.col].thing=Ro(e,p.chain,p.level),{kind:"split",at:n,level:p.level,second:M,hits:[],coins:0}):(s.thing=o,Ts(t))}return p?r.cover?Ts(t):(s.thing=p,r.thing=o,{kind:"swap",at:n,hits:[],coins:0}):(s.thing=null,r.thing=o,{kind:"move",at:n,hits:[],coins:0})}function Mc(e,t,n=0){let s=ar(e,t)?.thing;if(!s||s.kind!=="gen"||ar(e,t).cover)return null;let r=Os(e,t);if(!r)return null;let o=e.rand(),d=Math.max(1,Math.min(mi,s.level)),p=d>=3&&o<hc?3:o<(fc[d-1]??0)+n?2:1,v=Ro(e,s.chain,Math.min(p,Pn(s.chain)));return e.cells[r.row][r.col].thing=v,{at:r,thing:v,burst:Dp(e)}}function Dp(e){let t=[];for(let n=0;n<e.rows;n++)for(let s=0;s<e.cols;s++){let r=e.cells[n][s];r.cover?.ttl!==void 0&&(r.cover.ttl--,!(r.cover.ttl>0)&&(r.cover=null,r.thing=null,t.push({col:s,row:n})));}return t}var Ap=e=>{let t=0;for(let[n,s]of gi)if(t+=s,e<t)return n;return 1};function _c(e,t){let n=ar(e,t),s=n?.thing;if(!n||!s||s.kind!=="special"||n.cover)return null;let r=wn(s.special);if(r?.effect==="energy")return n.thing=null,{energy:r.amount??5,spawned:[]};if(r?.effect!=="chest")return null;n.thing=null;let o=[];for(let d=0;d<(r.amount??3);d++){let p=Os(e,t);if(!p)break;let v=e.chains[Math.floor(e.rand()*e.chains.length)]??_o[0].id,M=Ro(e,v,Math.min(Pn(v),Ap(e.rand())));e.cells[p.row][p.col].thing=M,o.push({at:p,thing:M});}return o.length===0?(n.thing=s,null):{energy:0,spawned:o}}function Rc(e,t={}){let n=bn(e).filter(o=>Br(e,o.at)&&(o.thing.kind==="item"||t.gens!==false&&o.thing.kind==="gen")),s=null,r=1/0;for(let o of n)for(let d=0;d<e.rows;d++)for(let p=0;p<e.cols;p++){let v=e.cells[d][p];if(!Ds(o.thing,v))continue;let M=(o.thing.kind==="gen"?100:0)+o.thing.level-(v.cover?.5:0);M<r&&(r=M,s=[o.at,{col:p,row:d}]);}return s}function ir(e,t){let n=new Set,s=[],r=bn(e);for(let o of t){let d=r.find(p=>p.thing.kind==="item"&&!p.cell.cover&&!n.has(p.thing.id)&&p.thing.chain===o.chain&&p.thing.level===o.level);if(!d)return null;n.add(d.thing.id),s.push(d.at);}return s}function Ri(e,t){let n=ar(e,t);if(!n?.thing)return null;let s=n.thing;return n.thing=null,s}function Ti(e,t,n){let s=Os(e,n),r=xc(e,t);if(s)return e.cells[s.row][s.col].thing=r,{at:s,thing:r};let o=bn(e).filter(d=>d.thing.kind==="item"&&!d.cell.cover).sort((d,p)=>d.thing.level-p.thing.level)[0];return o?(o.cell.thing=r,{at:o.at,thing:r}):null}function Tc(e){let t=bn(e),n=Op(e)>0;for(let s of t){if(s.thing.kind!=="special"||s.cell.cover)continue;let r=wn(s.thing.special);if(r?.effect==="energy"||r?.effect==="chest"&&n||r?.effect==="joker"&&t.some(o=>o.thing.kind==="item"&&(!o.cell.cover||rn[o.cell.cover.id]?.mergeInto)&&o.thing.level<Pn(o.thing.chain))||r?.effect==="split"&&n&&t.some(o=>o.thing.kind==="item"&&!o.cell.cover&&o.thing.level>=2))return true}return false}function Oc(e,t,n){let s=[];for(let r=0;r<t;r++){let o=bn(e).filter(v=>v.thing.kind==="item"&&!v.cell.cover&&v.thing.level<Pn(v.thing.chain)&&!s.some(M=>M.col===v.at.col&&M.row===v.at.row));if(o.length===0)break;let d=v=>n.some(M=>M.chain===v.thing.chain&&M.level===v.thing.level+1);o.sort((v,M)=>Number(d(M))-Number(d(v))||v.thing.level-M.thing.level);let p=o[0];p.thing.level++,s.push(p.at);}return s}var Oi=90,To=b("merge.item"),Lc=b("merge.order"),Di=b("merge.layer"),Dc=b("merge.backdrop"),Ac=b("merge.part"),zr=b("merge.customer"),Wr=(e,t)=>{let n=Number(e.vars[t]??0);return Number.isFinite(n)?n:0},As={id:"merge",version:2,engines:["phaser"],requires:["round"],params:{difficulty:{type:"number",default:.5,min:0,max:1},orderReward:{type:"number",default:1,min:0,max:100},mergeScore:{type:"number",default:10,min:1,max:1e3,integer:true},energyBonus:{type:"number",default:20,min:0,max:1e4,integer:true}},setup({world:e$1,params:t}){let n=c=>nn(t,c),s=e$1.rng.stream("merge"),r=$r(1,n("difficulty")),o=_i(sr.start,["garden"],()=>s.next()),d=Q(),p=new Map,v=new Map,M=null,O=[],E=[],I=0,K=0,z=0,ne=0,ae=0,j$1=0,ue=0,fe=0,ie=false,xe=false,se=null,_e=[],Ae=()=>Nr.find(c=>c.id===e$1.vars["meta:hero"])??Nr[0],be=()=>Ss(Ae().skill),oe=()=>e$1.vars.reviving===true,me=()=>be().charge,Se=()=>Wr(e$1,"meta:luck"),Ee=()=>O.flatMap(c=>c.order.wants);function Q(){return Fn(Ce(e$1),o.cols,o.rows,{top:.3,bottom:.86,widthShare:.94})}let Re=()=>d.cell,We=new Set,we=(c,y,i,u,g=1)=>{We.add(c);let T=v.get(c);(T===void 0||!e$1.isAlive(T))&&(T=e$1.create(),e$1.set(T,Ac,{id:c}),v.set(c,T)),e$1.set(T,e,{x:y,y:i,scale:g}),e$1.set(T,f,u);},ee=()=>{for(let[c,y]of [...v])We.has(c)||(e$1.destroy(y),v.delete(c));},Le=c=>{if(c.kind==="special")return wn(c.special)?.art??"chest";let y=gn(c.chain);return c.kind==="gen"?y?.gen??"chest":`${y?.prefix??"item"}${Math.min(c.level,y?.levels??8)}`},ye=c=>{let y=Re(),i=c.kind==="gen"?.94:.92;return {shape:"sprite",art:Le(c),w:y*i,h:y*i,depth:3}},ke=()=>{let c=new Map(bn(o).map(y=>[y.thing.id,y]));for(let[y,i]of [...p])c.has(y)||(e$1.destroy(i),p.delete(y));for(let[y,i]of c){let u=p.get(y);if(u===void 0){u=e$1.create();let w=Ze(d,i.at.col,i.at.row);e$1.set(u,e,{x:w.x,y:w.y,scale:.3}),p.set(y,u);}e$1.set(u,To,{id:y,col:i.at.col,row:i.at.row});let g=ye(i.thing),T=i.cell.cover&&rn[i.cell.cover.id]?.hides;e$1.set(u,f,{...g,alpha:T?0:1,depth:M?.id===y?30:3});}Ue(),lt();},Ue=()=>{nt(e$1,Di);let c=Re();for(let y=0;y<o.rows;y++)for(let i=0;i<o.cols;i++){let u=o.cells[y][i],g=Ze(d,i,y);for(let[T,w,N]of [["b",u.block,3],["c",u.cover,5]]){if(!w)continue;let $=rn[w.id],te=$?.art[Math.min($.art.length,Math.max(1,w.hp))-1]??"mg_box",le=e$1.create();e$1.set(le,Di,{key:`${T}${i},${y}`}),e$1.set(le,e,{x:g.x,y:g.y}),e$1.set(le,f,{shape:"sprite",art:te,w:c*.98,h:c*.98,depth:N,alpha:w.id==="bubble"&&(w.ttl??99)<=3?.55+.4*Math.abs(Math.sin(e$1.time*6)):1});}}},Y=()=>{nt(e$1,Dc),Ot(e$1,"board",d.top+d.cell*o.rows*.3);let c=Re(),y=Ze(d,(o.cols-1)/2,(o.rows-1)/2),i=c*.22,u=(g,T,w)=>{let N=e$1.create();e$1.set(N,Dc,{i:0}),e$1.set(N,e,{x:g,y:T}),e$1.set(N,f,w);};u(y.x,y.y,{shape:"sprite",art:"panel",w:c*o.cols+i*2,h:c*o.rows+i*2,color:"panel",alpha:.9,depth:-10});for(let g=0;g<o.rows;g++)for(let T=0;T<o.cols;T++){if(o.cells[g][T].hole)continue;let w=Ze(d,T,g);u(w.x,w.y,{shape:"sprite",art:"cell",w:c-3,h:c-3,color:(g+T)%2?"panel":"ground",alpha:.85,depth:-9});}},Me=()=>Math.max(1,r.def.visible),Xe=c=>{let y=Ce(e$1),i=Me(),u=Math.min(y.w*.3,Re()*2.6),g=y.w/2+(c-(i-1)/2)*(u+Re()*.2),T=u*(i>2?.62:.72),w=y.h*.118+T/2,N=d.top-Re()*.18;return {x:g,y:w,w:u,h:T,feet:N}},at=(c,y,i)=>{let u=Xe(c),g=Math.max(24,(u.feet-(u.y+u.h/2))*1.05),T=i?-g:u.x,w=e$1.create();return e$1.set(w,e,{x:T,y:u.feet-g/2}),e$1.set(w,f,{shape:"actor",cast:y.vip?"boss":"helper",variant:y.vip?7:s.int(0,99),h:g,pose:i?"walk":"idle",facing:1,speed:Oi,depth:6}),e$1.set(w,zr,{slot:c,to:u.x,leaving:-1}),w},Te=c=>{for(let y=0;y<Me();y++){if(O.some(u=>u.slot===y))continue;let i=E.shift();i&&O.push({order:i,slot:y,customer:at(y,i,c)});}},Wt=(c,y)=>{for(let i of c.query(zr)){let u=c.need(i,zr),g=c.need(i,e),T=c.need(i,f);if(T.shape!=="actor")continue;if(u.leaving>=0){u.leaving+=y,u.leaving>.7&&(T.pose="walk",T.facing=1,g.x+=Oi*1.4*y);continue}let w=u.to-g.x;Math.abs(w)>1?(g.x+=Math.sign(w)*Math.min(Math.abs(w),Oi*2*y),T.pose="walk",T.facing=w>0?1:-1):T.pose==="walk"&&(g.x=u.to,T.pose="idle");}},Ge=c=>Math.max(1,Math.round(c.wants.reduce((y,i)=>y+i.level,0)*n("orderReward")*(c.vip?3:1)*(1+Wr(e$1,"meta:reward")))),qe=c=>{let y=ir(o,c.order.wants);if(!y)return false;let i=Xe(c.slot);for(let T of y){let w=Ze(d,T.col,T.row);G(e$1,{kind:"burst",x:w.x,y:w.y,color:"coin",n:8,size:Re()*.8}),Ri(o,T);}let u=Ge(c.order);Fe(e$1,"coins",u),Fe(e$1,"score",u*25),G(e$1,{kind:"burst",x:i.x,y:i.y,color:"coin",n:14,size:i.w*.8}),G(e$1,{kind:"pop",x:i.x,y:i.y-i.h*.5,text:`+${u}`,color:"coin",size:Math.round(i.h*.42)}),e$1.emit("coin-collected",{value:u}),e$1.emit("order-filled",{reward:u,vip:c.order.vip}),vt(e$1,"merge-order"),ae++;let g=e$1.get(c.customer,zr);return g&&(g.leaving=0,ze(e$1,c.customer,"cheer"),rr(e$1,c.customer,2.4)),O=O.filter(T=>T!==c),Te(true),ke(),O.length===0&&E.length===0&&dt(),true},et=(c,y,i,u,g,T)=>{let w=Math.max(8,u*.11);we(`${c}:bg`,y,i,{shape:"rect",w:u,h:w,color:"#000000",alpha:.5,radius:w/2,depth:69});let N=Math.max(1,(u-4)*Math.max(0,Math.min(1,g)));we(`${c}:fill`,y-(u-4)/2+N/2,i,{shape:"rect",w:N,h:w-4,color:T,radius:(w-4)/2,depth:69.1});},rt=()=>{let c=Ce(e$1),y=Math.min(c.w,c.h),i=Re(),u=(H,X,q,x,S="text",a=y*.045,k=70)=>we(H,X,q,{shape:"text",text:x,size:Math.round(a),color:S,bold:true,depth:k});_e=[],We.clear();let g=c.h*.085;we("h:en:i",c.w*.1,g,{shape:"sprite",art:"mg_energy",w:y*.07,h:y*.07,depth:70}),u("h:en",c.w*.1+y*.075,g,String(I),I<=3&&z===0?"danger":"text",y*.06),z>0&&u("h:free",c.w*.1+y*.17,g,`+${z}`,"secondary",y*.04);let T=O.length+E.length;we("h:ord:i",c.w*.8,g,{shape:"sprite",art:"ticket",w:y*.075,h:y*.05,color:"panel",depth:70}),u("h:ord",c.w*.8+y*.08,g,String(T),"text",y*.05);for(let H of O){let X=Xe(H.slot);ir(o,H.order.wants)!==null&&we(`h:t${H.slot}:glow`,X.x,X.y,{shape:"rect",w:X.w*1.08,h:X.h*1.14,color:"accent",alpha:.45+.3*Math.sin(e$1.time*6),radius:X.h*.2,depth:7.9}),we(`h:t${H.slot}`,X.x,X.y,{shape:"sprite",art:"ticket",w:X.w,h:X.h,color:H.order.vip?"coin":"panel",depth:8});let x=H.order.wants.length,S=Math.min(X.h*.58,X.w*.86/x);H.order.wants.forEach((a,k)=>{let A=X.x+(k-(x-1)/2)*S*1.05,l=X.y-X.h*.12,h=gn(a.chain);we(`h:t${H.slot}:${k}`,A,l,{shape:"sprite",art:`${h?.prefix??"item"}${Math.min(a.level,h?.levels??8)}`,w:S,h:S,depth:8.1}),ir(o,[a])?u(`h:t${H.slot}:${k}:ok`,A+S*.32,l+S*.32,"\u2713","accent",S*.42,8.2):u(`h:t${H.slot}:${k}:lv`,A+S*.34,l+S*.34,String(a.level),"coin",S*.3,8.2);}),we(`h:t${H.slot}:c`,X.x-X.w*.1,X.y+X.h*.3,{shape:"sprite",art:"coin",w:X.h*.19,h:X.h*.19,depth:8.1}),u(`h:t${H.slot}:cv`,X.x+X.w*.07,X.y+X.h*.3,String(Ge(H.order)),"coin",X.h*.2,8.1),_e.push({id:`order${H.slot}`,x:X.x,y:X.y,r:X.w*.5});}let w=Ee();for(let H of bn(o)){if(H.cell.cover&&rn[H.cell.cover.id]?.hides)continue;let X=p.get(H.thing.id);if(X===void 0)continue;let q=e$1.need(X,e),x=M?.id===H.thing.id?31:6;if(H.thing.kind==="gen")for(let S=0;S<H.thing.level;S++)we(`h:i${H.thing.id}:s${S}`,q.x+(S-(H.thing.level-1)/2)*i*.2,q.y+i*.38,{shape:"circle",r:i*.075,color:"coin",depth:x});else H.thing.kind==="item"&&(w.some(S=>S.chain===H.thing.chain&&S.level===H.thing.level)&&(we(`h:i${H.thing.id}:ok`,q.x+i*.3,q.y-i*.3,{shape:"circle",r:i*.12,color:"accent",depth:x}),u(`h:i${H.thing.id}:okt`,q.x+i*.3,q.y-i*.3,"\u2713","#ffffff",i*.18,x+.1)),u(`h:i${H.thing.id}:lv`,q.x+i*.3,q.y+i*.3,String(H.thing.level),"coin",i*.22,x));}let N=d.top+i*o.rows+(c.h-(d.top+i*o.rows))*.5,$=Math.min(y*.075,(c.h-(d.top+i*o.rows))*.38),te=c.w*.3,le=ne>=me();_e.push({id:"skill",x:te,y:N,r:$*1.2}),le&&we("h:skill:glow",te,N,{shape:"circle",r:$*1.28,color:"secondary",alpha:.5+.3*Math.sin(e$1.time*7),depth:68.9}),we("h:skill:bg",te,N,{shape:"circle",r:$,color:"panel",alpha:.95,depth:69}),we("h:skill:i",te,N,{shape:"sprite",art:be().art,w:$*1.4,h:$*1.4,alpha:le?1:.45,depth:69.2}),et("h:charge",te+$*2.6,N,$*2.4,ne/me(),"secondary");let ge=c.w*.88;_e.push({id:"bin",x:ge,y:N,r:$*1.1});let He=M?p.get(M.id):void 0,je=He!==void 0?e$1.need(He,e):null,st=je!==null&&Math.hypot(je.x-ge,je.y-N)<$*1.3;we("h:bin:bg",ge,N,{shape:"circle",r:$,color:st?"danger":"panel",alpha:.95,depth:69}),we("h:bin",ge,N,{shape:"sprite",art:"mg_bin",w:$*1.3,h:$*1.3,alpha:M?1:.7,depth:69.2}),(se===null||!e$1.isAlive(se))&&(se=e$1.create(),e$1.set(se,f,{shape:"actor",cast:Ae().cast,h:$*2.6,pose:"idle",facing:1,depth:20})),e$1.set(se,e,{x:c.w*.11,y:N-$*.1});let Z=e$1.need(se,f);Z.shape==="actor"&&(Z.h=$*2.6),e$1.vars.mg_buttons=_e.map(H=>`${H.id}@${Math.round(H.x)},${Math.round(H.y)}`).join(";"),ee();},lt=()=>{e$1.vars.energy=I,e$1.vars.mg_free=z,e$1.vars.mg_charge=Math.floor(ne),e$1.vars.orders_left=O.length+E.length,e$1.vars.mg_orders=O.slice().sort((c,y)=>c.slot-y.slot).map(c=>c.order.wants.map(y=>`${y.chain}:${y.level}`).join("+")).join("|"),e$1.vars.level_progress=r.orders.length?ae/r.orders.length:0;},ct=()=>{nt(e$1,To),nt(e$1,Di),nt(e$1,Ac),nt(e$1,zr),p.clear(),v.clear(),se!==null&&e$1.isAlive(se)&&e$1.destroy(se),se=null,r=$r(Wr(e$1,"meta:chapter")||1,n("difficulty")),o=_i(sr[r.def.board]??sr.start,r.def.chains,()=>s.next()),d=Q(),Y(),M=null,O=[],E=[...r.orders],I=Math.max(0,r.energy+Math.round(Wr(e$1,"meta:energy"))),K=I,z=0,ne=0,ae=0,j$1=0,ue=0,fe=0,ie=false,xe=false,e$1.vars.mg_level=r.level,e$1.vars.mg_world=r.world,e$1.vars.coins=0,e$1.vars.score=0,e$1.vars.stars=0,e$1.vars.reviving=false,Te(false),ke();},dt=()=>{xe||(e$1.vars.stars=Math.min(ie?1:3,_s(I/Math.max(1,K))),Fe(e$1,"score",I*n("energyBonus")),G(e$1,{kind:"flash",color:"coin"}),ot("cleared"));},ot=c=>{if(xe)return;xe=true;let y=c==="cleared";y&&e$1.vars["meta:first_clear"]===true&&Fe(e$1,"coins",r.firstClearGold),y||(e$1.vars.stars=0),e$1.vars.reviving=false,lt(),e$1.emit($t,{reason:c,stats:{chapter:r.level,seconds:Math.floor(ue),cleared:y,stars:Number(e$1.vars.stars??0),coins:Number(e$1.vars.coins??0),orders:ae,merges:j$1}});},Pe=()=>{if(e$1.vars.revive_ready===true&&!ie){e$1.vars.reviving=true,e$1.emit(Vt,{});return}ot("out-of-energy");},bt=()=>{oe()&&(ie=true,e$1.vars.reviving=false,I+=Rs,Ti(o,"joker",{col:Math.floor(o.cols/2),row:Math.floor(o.rows/2)}),G(e$1,{kind:"flash",color:"coin"}),ke());},Ke=()=>{if(I>0||z>0||ne>=me()||O.some(i=>ir(o,i.order.wants))||Tc(o))return true;let c=[...Ee(),...E.flatMap(i=>i.wants)],y=bn(o);for(let i of y)if(!(!Br(o,i.at)||i.thing.kind!=="item")&&c.some(u=>u.chain===i.thing.chain&&u.level>i.thing.level)&&y.some(u=>Ds(i.thing,u.cell)))return true;return false},At=c=>{let y=Re(),i=Ze(d,c.at.col,c.at.row);if(c.kind==="merge"||c.kind==="joker"){let u=o.cells[c.at.row][c.at.col].thing,g=gn(u.chain)?.color??"coin";G(e$1,{kind:"ring",x:i.x,y:i.y,color:g,size:y*1.4}),G(e$1,{kind:"burst",x:i.x,y:i.y,color:"coin",n:8,size:y*.8});let T=p.get(u.id);T!==void 0&&(e$1.need(T,e).scale=1.35),j$1++,ne=Math.min(me(),ne+1+Wr(e$1,"meta:charge")),Fe(e$1,"score",Math.pow(2,u.level)*n("mergeScore")),e$1.emit("items-merged",{level:u.level,chain:u.chain}),vt(e$1,"merge-merge"),u.kind==="item"&&u.level===Pn(u.chain)&&G(e$1,{kind:"flash",color:"coin"});for(let w of O)w.order.wants.some(N=>N.chain===u.chain&&N.level===u.level)&&ze(e$1,w.customer,"wave");}c.kind==="split"&&G(e$1,{kind:"ring",x:i.x,y:i.y,color:"secondary",size:y*1.2}),c.freed&&e$1.emit("obstacle-cleared",{kind:c.freed});for(let u of c.hits){let g=Ze(d,u.at.col,u.at.row);G(e$1,{kind:"burst",x:g.x,y:g.y,color:u.id==="fog"?"#ffffff":"ground",n:u.gone?10:4,size:y*.9}),u.gone&&e$1.emit("obstacle-cleared",{kind:u.id});}c.coins>0&&(Fe(e$1,"coins",c.coins),e$1.emit("coin-collected",{value:c.coins}),G(e$1,{kind:"pop",x:i.x,y:i.y-y*.5,text:`+${c.coins}`,color:"coin",size:Math.round(y*.4)})),c.hits.length&&G(e$1,{kind:"shake",power:.25});},en=c=>{if(I<=0&&z<=0){let T=Ze(d,c.col,c.row);G(e$1,{kind:"pop",x:T.x,y:T.y-Re()*.5,text:"0",color:"danger",size:Math.round(Re()*.4)});return}let y=Mc(o,c,Se()),i=Ze(d,c.col,c.row);if(!y){G(e$1,{kind:"shake",power:.2}),G(e$1,{kind:"pop",x:i.x,y:i.y-Re()*.5,text:"\u2715",color:"danger",size:Math.round(Re()*.45)});return}z>0?z--:I--,vt(e$1,"merge-generate");let u=p.get(o.cells[c.row][c.col].thing.id);u!==void 0&&(e$1.need(u,e).scale=1.2),G(e$1,{kind:"burst",x:i.x,y:i.y,color:gn(y.thing.chain)?.color??"accent",n:6,size:Re()*.7}),e$1.emit("item-spawned",{level:y.thing.level,chain:y.thing.chain}),ke();let g=p.get(y.thing.id);g!==void 0&&e$1.set(g,e,{x:i.x,y:i.y,scale:.4});for(let T of y.burst){let w=Ze(d,T.col,T.row);G(e$1,{kind:"burst",x:w.x,y:w.y,color:"#ffffff",n:10,size:Re()});}},Rt=c=>{let y=_c(o,c);if(!y)return;let i=Ze(d,c.col,c.row);G(e$1,{kind:"ring",x:i.x,y:i.y,color:"coin",size:Re()*1.6}),y.energy>0&&(I+=y.energy,G(e$1,{kind:"pop",x:i.x,y:i.y-Re()*.5,text:`+${y.energy}`,color:"coin",size:Math.round(Re()*.45)})),ke();for(let u of y.spawned){let g=p.get(u.thing.id);g!==void 0&&e$1.set(g,e,{x:i.x,y:i.y,scale:.4});}},tn=()=>{let c=be();if(ne<c.charge)return false;let y=1+Wr(e$1,"meta:skill"),i=Math.max(1,Math.round(c.count*y));if(ne=0,se!==null&&ze(e$1,se,"cheer"),G(e$1,{kind:"flash",color:"secondary"}),c.effect==="upgrade")for(let u of Oc(o,i,[...Ee(),...E.slice(0,2).flatMap(g=>g.wants)])){let g=Ze(d,u.col,u.row);G(e$1,{kind:"ring",x:g.x,y:g.y,color:"secondary",size:Re()*1.4});}else if(c.effect==="free")z+=i;else for(let u=0;u<i;u++)Ti(o,"joker",{col:Math.floor(o.cols/2),row:Math.floor(o.rows/2)});return e$1.emit("skill-cast",{id:c.id}),vt(e$1,"merge-skill"),ke(),true},Et=(c,y)=>_e.find(i=>Math.hypot(c-i.x,y-i.y)<=i.r);e$1.on(j,c=>{let y=c;if(!(!Je(e$1)||Kn(e$1)||xe||oe())){if(y.type==="press"){Dt(e$1),fe=0;let i=Tn(d,y.x,y.y);if(!i||!Br(o,i))return;let u=o.cells[i.row][i.col].thing.id,g=p.get(u);if(g===void 0)return;let T=e$1.need(g,e);M={id:u,from:i,dx:T.x-y.x,dy:T.y-y.y,x0:y.x,y0:y.y},e$1.need(g,f).depth=30;}else if(y.type==="move"&&M){let i=p.get(M.id);if(i===void 0)return;let u=e$1.need(i,e);u.x=y.x+M.dx,u.y=y.y+M.dy,u.scale=1.12;}else if(y.type==="release"&&M){let i=M;M=null;let u=p.get(i.id);if(u!==void 0&&(e$1.need(u,f).depth=3),Math.hypot(y.x-i.x0,y.y-i.y0)<Re()*.3)return;let g=Et(y.x,y.y),T=o.cells[i.from.row][i.from.col].thing;if(g?.id==="bin"&&T&&T.kind!=="gen"){Ri(o,i.from),vt(e$1,"merge-bin"),ke();return}let w=g?.id.startsWith("order")?O.find(te=>`order${te.slot}`===g.id):void 0;if(w&&T?.kind==="item"&&w.order.wants.some(te=>te.chain===T.chain&&te.level===T.level)&&qe(w))return;let N=Tn(d,y.x,y.y);if(!N)return;let $=Ec(o,i.from,N);$.kind!=="none"&&At($),ke();}else if(y.type==="tap"){fe=0;let i=Et(y.x,y.y);if(i?.id==="skill"){tn();return}if(i?.id.startsWith("order")){let T=O.find(w=>`order${w.slot}`===i.id);T&&qe(T);return}let u=Tn(d,y.x,y.y),g=u?o.cells[u.row][u.col].thing:null;if(!u||!g||!Br(o,u))return;if(g.kind==="gen")en(u);else if(g.kind==="special")Rt(u);else {let T=O.find(w=>w.order.wants.some(N=>N.chain===g.chain&&N.level===g.level)&&ir(o,w.order.wants));T&&qe(T);}}}}),e$1.on(Nt,()=>{ct(),e$1.vars.level=r.level;}),e$1.on(zt,ct),e$1.on(Gt,bt),e$1.on(Kt,()=>{oe()&&(e$1.vars.reviving=false,ot("out-of-energy"));}),e$1.on(Bt,c=>{We.clear(),ee(),_e=[],se!==null&&e$1.isAlive(se)&&Qe(e$1,se,c.reason==="cleared"?"dance":"idle");}),e$1.on(k,()=>{d=Q(),Y();for(let c of O){let y=Xe(c.slot),i=e$1.get(c.customer,zr);i&&(i.to=y.x);let u=e$1.get(c.customer,e),g=Math.max(24,(y.feet-(y.y+y.h/2))*1.05);u&&e$1.set(c.customer,e,{x:y.x,y:y.feet-g/2});let T=e$1.get(c.customer,f);T?.shape==="actor"&&(T.h=g);}ke();});let L=c=>{let y=Math.min(1,c*16);for(let[i,u]of p){if(M?.id===i)continue;let g=e$1.get(u,To);if(!g)continue;let T=e$1.need(u,e),w=Ze(d,g.col,g.row);T.x+=(w.x-T.x)*y,T.y+=(w.y-T.y)*y;let N=T.scale??1;T.scale=N+(1-N)*Math.min(1,c*10);}},B=c=>{let y=O.find(u=>ir(o,u.order.wants));if(y&&(!ht(c,"merge-order")||fe>6)){let u=Xe(y.slot);return ft(c,"tap",{x:u.x,y:u.y},void 0,Re()*1.1)}let i=Rc(o,{gens:false});if(i&&(!ht(c,"merge-merge")||fe>6))return ft(c,"swipe",Ze(d,i[0].col,i[0].row),Ze(d,i[1].col,i[1].row),Re()*1.1);if(ne>=me()&&!ht(c,"merge-skill")){let u=_e.find(g=>g.id==="skill");if(u)return ft(c,"tap",u,void 0,Re()*1.1)}if(!ht(c,"merge-generate")||fe>6){let u=bn(o).find(g=>g.thing.kind==="gen"&&!g.cell.cover);u&&(I>0||z>0)&&ft(c,"tap",Ze(d,u.at.col,u.at.row),void 0,Re()*1.1);}},f$1=0;e$1.addSystem({id:"merge",order:0,run(c,y){Wt(c,y),L(y),!(!Je(c)||xe)&&(ue+=y,fe+=y,rt(),++f$1%20===0&&o.cells.some(i=>i.some(u=>u.cover?.ttl!==void 0&&u.cover.ttl<=3))&&Ue(),!(oe()||M)&&(un(c)||B(c),Ke()||Pe()));}}),ct();}};var Pt=10,wc={id:"start",needs:[],rows:["..............","..............","..............","..............","..............","..............",".......o.o.o..",".P............","##############","##############"]},Pc={id:"checkpoint",needs:[],rows:["..........","..........","..........","..........","..........","..........","...o..o...","....C.....","##########","##########"]},Cc={id:"end",needs:[],rows:["..............","..............","..............","..............","..............","..............",".....o.o......","..........E...","##############","##############"]},Ic={id:"boss",needs:[],rows:["..................","..................","..................","..................","...===......===...","..................","..................","..................","##################","##################"]},ws=[{id:"walk",needs:["walker"],rows:["..............","..............","..............","..............",".....ooo......","....o...o.....","..............",".........W....","##############","##############"]},{id:"two-walkers",needs:["walker"],rows:["..............","..............","..............","......*.......",".....===......","..............","..o........o..","...W......W...","##############","##############"]},{id:"gaps",needs:["gaps"],rows:["..............","..............","..............","..............","..............","....o.....o...","...o.o...o.o..","..............","###...###...##","###...###...##"]},{id:"stairs",needs:["stairs"],rows:["..............","...........*..","..........===.","..............",".......###....",".......###.o..","....##########","....##########","##############","##############"]},{id:"spikes",needs:["spikes"],rows:["..............","..............","..............","..............","..............",".....ooo......","....=====.....","..............","###^^^^^^^####","##############"]},{id:"pits",needs:["pits"],rows:["..............","..............","..............","..............","......o.......",".....===...o..","..o.......===.",".===..........","##..........##","##..........##"]},{id:"spring",needs:["spring"],rows:["..............",".........*....","........####..","..............","..............","..............","..............","...T..........","##############","##############"]},{id:"hopper",needs:["hopper"],rows:["..............","..............","..............","..............",".....o...o....","..............","..............",".......J......","##############","##############"]},{id:"crumble",needs:["crumble"],rows:["..............","..............","..............","..............","..............","...o.o.o.o....","...______.....","..............","##........####","##........####"]},{id:"spiky",needs:["spiky"],rows:["..............","..............","..............","..............","..............","......ooo.....","..............",".......S......","##############","##############"]},{id:"moving",needs:["moving"],rows:["..............","..............","..............","..............",".....o..o.....","..............",".....M........","..............","##..........##","##..........##"]},{id:"flyer",needs:["flyer"],rows:["..............","..............","..............","......F.......","..............","..............","...o......o...","..............","##############","##############"]},{id:"key",needs:["key"],rows:["..............","..............","..K...........",".===..........","..............",".......===....","..............","...........B..","##############","##############"]},{id:"gunner",needs:["gunner"],rows:["..............","..............","..............","..............","..............",".....o.o......","....=====.....","...........G..","##############","##############"]},{id:"heart",needs:["walker","stairs"],rows:["..............","..............","..*...........","..............","......H.......",".....===......","..............","...W......W...","##############","##############"]},{id:"secret-high",needs:["spring","gaps"],rows:["..............","..*...........",".===..........","..............","..............","..............","........T.....","..............","#####...######","#####...######"]}],Ai=4,lr=5,Ps=Ai*lr,Ls={walker:1,gaps:1,spikes:2,stairs:2,pits:3,spring:3,hopper:4,crumble:4,spiky:6,moving:6,flyer:7,key:8,gunner:9},Li=[0,9,24,39];function Hr(e,t=.5){let n=Math.max(1,Math.min(Ps,Math.floor(e))),s=Math.ceil(n/lr),r=n-(s-1)*lr,o=r===lr,d=Object.keys(Ls).filter(v=>Ls[v]<=n),p=Object.keys(Ls).find(v=>Ls[v]===n)??null;return {level:n,world:s,index:r,boss:o,features:d,fresh:p,rooms:o?2:3+Math.min(5,Math.floor((n-1)/2)),pace:.85+t*.3+(n-1)*.02,bossHp:3+s,firstClearGold:(o?150:60)+(n-1)*20}}var wi=e=>Li[Math.ceil(Math.max(1,e)/lr)-1]??0,Pi=[{id:"double",stars:6},{id:"dash",stars:15},{id:"wall",stars:27}],Cs=e=>Pi.filter(t=>e>=t.stars).map(t=>t.id),Vr=[{id:"hero",cast:"hero",gems:0,perk:"none"},{id:"hero2",cast:"hero2",gems:150,perk:"heart"},{id:"hero3",cast:"hero3",gems:300,perk:"jump"}],Ci="kit-platformer",Ii=[{id:"Hearts",var:"meta:hearts",art:"heart",color:"danger",perLevel:1,unit:"",maxLevel:3,price:150,growth:1.2},{id:"JumpPower",var:"meta:jump",art:"boot",color:"accent",perLevel:2,unit:"%",maxLevel:10,price:40,growth:.15},{id:"Magnet",var:"meta:magnet",art:"magnet",color:"danger",perLevel:10,unit:"%",maxLevel:10,price:30,growth:.12},{id:"Grace",var:"meta:grace",art:"shield",color:"muted",perLevel:.2,unit:"s",maxLevel:10,price:35,growth:.12},{id:"Greed",var:"meta:greed",art:"coin",color:"coin",perLevel:2,unit:"%",maxLevel:25,price:40,growth:.1}],Nc={game:"platformer",character:Ci,stats:Ii,heroes:Vr,levels:Ps,firstClearGold:e=>Hr(e).firstClearGold,stars:3,starsToEnter:wi};var Lp="boss-spawned",wp="boss-defeated",Ni="level-cleared",qt=b("platformer.body"),it=b("platformer.thing"),Oo=b("platformer.strip"),cn=b("platformer.hero"),$c=b("platformer.hud"),jn=(e,t)=>{let n=Number(e.vars[t]??0);return Number.isFinite(n)?n:0},Pp=6,cr=40,Cp=3.3,Ip=6.8,Np=.7,Bc=1.3,Is={id:"platformer",version:2,engines:["phaser"],requires:["round"],params:{difficulty:{type:"number",default:.5,min:0,max:1},lives:{type:"number",default:3,min:1,max:9,integer:true},coinScore:{type:"number",default:10,min:0,max:1e3,integer:true},starScore:{type:"number",default:300,min:0,max:1e4,integer:true},clearBonus:{type:"number",default:500,min:0,max:1e5,integer:true},graceTime:{type:"number",default:1.2,min:0,max:5},doubleJump:{type:"boolean",default:false}},setup({world:e$1,params:t}){let n=L=>nn(t,L),s=_r(e$1),r=Hr(1,n("difficulty")),o=[],d=0,p=null,v=0,M={x:2,y:8},O=3,E=3,I=0,K=false,z=false,ne=0,ae=0,j$1=0,ue=false,fe=false,ie=[],xe=[false,false,false],se=new Map,_e=new Map,Ae=()=>Vr.find(L=>L.id===e$1.vars["meta:hero"])??Vr[0],be=()=>e$1.vars.reviving===true,oe=()=>{let L=Number(e$1.vars.view_w??720),B=Number(e$1.vars.view_h??1280);return Math.min(L/8,B*.66/10)},me=()=>Number(e$1.vars.view_h??1280)*.86-10*oe(),Se=()=>Number(e$1.vars.view_w??720)/oe(),Ee=(L,B)=>{if(B<0)return ".";if(L<0||L>=d)return "#";if(B>=10)return ".";let f=o[B]?.[L]??".";return f==="_"&&(se.get(`${L},${B}`)??0)>.5?".":f},Q=L=>L==="#",Re=L=>L==="="||L==="_"||L==="^",We=()=>{for(let w of e$1.query(it))e$1.destroy(w);for(let w of e$1.query(Oo))e$1.destroy(w);se.clear(),r=Hr(jn(e$1,"meta:chapter")||1,n("difficulty"));let L=e$1.rng.stream(`platformer-level-${r.level}`),B=ws.filter(w=>w.needs.every(N=>r.features.includes(N))),f=[],c=r.fresh!==null?B.find(w=>w.needs.includes(r.fresh)):void 0;for(c&&f.push(c);f.length<r.rooms;)f.push(L.pick(B));let y=Math.ceil(f.length/2),i=[wc,...f.slice(0,y),Pc,...f.slice(y),r.boss?Ic:Cc];o=Array.from({length:10},(w,N)=>i.map($=>$.rows[N]??"").join("")),d=o[0].length;let u=[];for(let w=0;w<10;w++)for(let N=0;N<d;N++)o[w][N]==="*"&&u.push({c:N,r:w});let g=u.length<=3?u:[u[0],u[Math.floor(u.length/2)],u[u.length-1]];for(let w=g.length;w<3;w++)g.push({c:Math.floor(d*(w+1)/4),r:5});let T=0;for(let w=0;w<10;w++)for(let N=0;N<d;N++){let $=o[w][N],te={x:N+.5,y:w+1};$==="P"?M={...te}:$==="o"?Le("coin",te.x,w+.85,.5,.5):$==="H"&&T++<1?Le("heart",te.x,w+.9,.6,.6):$==="K"?Le("key",te.x,w+.9,.6,.6):$==="B"?Le("chest",te.x,te.y,1,.8):$==="T"?Le("spring",te.x,te.y,1,.5):$==="M"?Le("mover",te.x+.5,w+.4,2,.4).baseX=te.x+.5:$==="C"?Le("checkpoint",te.x,te.y,.6,1.6):$==="E"?Le("flag",te.x,te.y,.8,2.6):$==="W"?Le("walker",te.x,te.y,.8,1):$==="S"?Le("spiky",te.x,te.y,.8,1):$==="J"?Le("hopper",te.x,te.y,.8,1):$==="F"?Le("flyer",te.x,te.y,.9,.8):$==="G"&&Le("gunner",te.x,te.y,.8,1.1),/[PoHKBTMCEWSJFG*]/.test($)&&(o[w]=we(o[w],N,"."));}if(g.forEach((w,N)=>Le("star",w.c+.5,w.r+.95,.85,.85).tag=String(N)),r.boss){let w=Le("boss",d-5,8,2.2,2.4);w.hp=r.bossHp,w.tag="walk",w.t=2;}ye();},we=(L,B,f)=>L.slice(0,B)+f+L.slice(B+1),ee=(L,B,f,c)=>{switch(L){case "walker":return {shape:"actor",cast:"foe",h:f*c*1.35,pose:"walk",depth:8};case "spiky":return {shape:"actor",cast:"foe2",h:f*c*1.4,pose:"walk",depth:8};case "hopper":return {shape:"actor",cast:"foe3",h:f*c*1.35,pose:"idle",depth:8};case "flyer":return {shape:"actor",cast:"foe5",h:f*c*1.4,pose:"air",depth:8};case "gunner":return {shape:"actor",cast:"foe4",h:f*c*1.3,pose:"idle",depth:8};case "boss":return {shape:"actor",cast:"boss",h:f*c*1.2,pose:"walk",depth:8};case "bullet":return {shape:"sprite",art:"shot",color:"danger",w:B*c,h:f*c,depth:9};case "wave":return {shape:"sprite",art:"burst",color:"danger",w:B*c,h:f*c,depth:9};case "coin":return {shape:"sprite",art:"coin",w:B*c,h:f*c,depth:7};case "star":return {shape:"sprite",art:"bigstar",w:B*c,h:f*c,depth:7};case "heart":return {shape:"sprite",art:"heart",w:B*c,h:f*c,depth:7};case "key":return {shape:"sprite",art:"key",w:B*c,h:f*c,depth:7};case "chest":return {shape:"sprite",art:"chest",w:B*c,h:f*c*1.1,depth:6};case "spring":return {shape:"sprite",art:"spring",w:B*c,h:f*c*1.4,depth:6};case "mover":return {shape:"tile",art:"platform",w:B*c,h:f*c,unit:c,depth:5};case "checkpoint":return {shape:"sprite",art:"flag",color:"muted",w:B*c*1.6,h:f*c,depth:5};case "flag":return {shape:"sprite",art:"flag",w:B*c*1.4,h:f*c,depth:5}}};function Le(L,B,f$1,c,y){let i=e$1.create(),u={kind:L,vx:0,vy:0,dir:-1,t:0,baseX:B,baseY:f$1,hp:1,tag:"",safe:0};return e$1.set(i,it,u),e$1.set(i,qt,{x:B,y:f$1,w:c,h:y}),e$1.set(i,e,{x:0,y:0}),e$1.set(i,f,ee(L,c,y,oe())),e$1.need(i,it)}function ye(){for(let B of e$1.query(Oo))e$1.destroy(B);let L=(Number(e$1.vars.view_h??1280)-(me()+10*oe()))/oe()+.5;for(let B=0;B<10;B++){let f=0;for(;f<d;){let c=o[B][f];if(c==="."||c==="_"){c==="_"&&ke("_",f,B,1,.45),f++;continue}let y=c==="#"&&Ee(f,B-1)!=="#",i=f;for(;i<d&&o[B][i]===c&&(c!=="#"||Ee(i,B-1)!=="#"===y);)i++;if(c==="#"&&y){let u=0;for(;B+u<10&&o[B+u][f]==="#";)u++;ke("#",f,B,i-f,u+(B+u>=10?L:0));}else c!=="#"&&ke(c,f,B,i-f,c==="="?.45:.7);f=i;}}}function ke(L,B,f$1,c,y){let i=oe(),u=e$1.create();e$1.set(u,Oo,{char:L}),e$1.set(u,qt,{x:B+c/2,y:L==="^"?f$1+1:f$1+y,w:c,h:y}),e$1.set(u,e,{x:0,y:0});let g=L==="^"?{shape:"tile",art:"spike",w:c*i,h:y*i,unit:i,depth:4}:L==="#"?{shape:"tile",art:"ground",w:c*i,h:y*i,unit:i*1.2,depth:3}:{shape:"tile",art:"platform",w:c*i,h:y*i,unit:i,depth:3,...L==="_"?{color:"muted",alpha:.85}:{}};e$1.set(u,f,g),L==="_"&&e$1.set(u,it,{kind:"mover",vx:0,vy:0,dir:0,t:0,baseX:B,baseY:f$1,hp:0,tag:"crumble",safe:0});}let Ue=()=>{(p===null||!e$1.isAlive(p))&&(p=e$1.create(),e$1.set(p,cn,{vx:0,vy:0,grounded:true,facing:1,jumps:0,coyote:0,buffer:0,dash:0,dashCd:0,wall:0,swing:0,swingCd:0}),e$1.set(p,qt,{x:M.x,y:M.y,w:Np,h:Bc}),e$1.set(p,e,{x:0,y:0})),e$1.set(p,f,{shape:"actor",cast:Ae().cast,h:Bc*oe()*1.25,pose:"idle",depth:10});},Y=()=>Math.sqrt(2*cr*Cp*(1+jn(e$1,"meta:jump"))*(Ae().perk==="jump"?1.15:1)),Me=()=>{if(p===null)return;let L=e$1.need(p,qt),B=e$1.need(p,cn);L.x=M.x,L.y=M.y,B.vx=0,B.vy=0;for(let f of e$1.query(it))(e$1.need(f,it).kind==="bullet"||e$1.need(f,it).kind==="wave")&&e$1.destroy(f);},Xe=()=>{en(),We(),E=n("lives")+jn(e$1,"meta:hearts")+(Ae().perk==="heart"?1:0),O=E,I=0,K=false,z=false,ne=0,ae=0,j$1=0,ue=false,fe=!r.boss,xe.fill(false),ie=Cs(jn(e$1,"meta:stars_total")),n("doubleJump")&&!ie.includes("double")&&ie.push("double"),e$1.vars.abilities=ie.join(","),e$1.vars.platformer_level=r.level,e$1.vars.platformer_world=r.world,e$1.vars.lives=O,e$1.vars.coins=0,e$1.vars.score=0,e$1.vars.stars=0,e$1.vars.reviving=false,v=0,Ue(),Me(),p!==null&&(e$1.need(p,cn).facing=1,Qe(e$1,p,"idle")),r.boss&&e$1.emit(Lp,{}),bt(e$1);},at=()=>{!Je(e$1)||be()||p===null||(e$1.need(p,cn).buffer=.13);},Te=()=>{if(p===null)return;let L=e$1.need(p,cn);L.vy<0&&(L.vy*=.5);},Wt=()=>{if(!Je(e$1)||be()||p===null||!ie.includes("dash"))return;let L=e$1.need(p,cn);L.dashCd>0||(L.dash=.2,L.dashCd=.8,L.vy=0,ze(e$1,p,"attack"));},Ge=()=>{if(!Je(e$1)||be()||p===null)return;let L=e$1.need(p,cn);L.swingCd>0||(L.swing=.16,L.swingCd=.32,ze(e$1,p,"attack"));};e$1.on(j,L=>{let B=L;e$1.vars.started_tick!==e$1.tick&&(B.type==="key"&&(B.key==="up"||B.key==="action")?at():B.type==="key-up"&&(B.key==="up"||B.key==="action")?Te():B.type==="key"&&B.key==="down"?Wt():B.type==="tap"?Ge():B.type==="swipe"&&B.dir==="up"&&at());});let qe=(L,B)=>{if(!Je(L)||K)return;K=true;let f=B==="cleared",c=xe.filter(Boolean).length;L.vars.stars=c,f&&L.vars["meta:first_clear"]===true&&Fe(L,"coins",r.firstClearGold),L.vars.score=j$1*n("coinScore")+c*n("starScore")+(f?n("clearBonus"):0),L.vars.reviving=false,f&&L.emit(Ni,{level:r.level}),L.emit($t,{reason:B,stats:{chapter:r.level,seconds:Math.floor(ne),cleared:f,stars:f?c:0,coins:j$1,bosses:r.boss&&fe?1:0}});},et=L=>{if(L.vars.revive_ready===true&&!z){L.vars.reviving=true,L.emit(Vt,{});return}qe(L,"fell");},rt=L=>{be()&&(z=true,L.vars.reviving=false,O=Math.max(2,Math.ceil(E/2)),L.vars.lives=O,I=2.5,Me(),p!==null&&Qe(L,p,"idle"),G(L,{kind:"flash",color:"coin"}));},lt=(L,B)=>{if(p===null||I>0||K)return;let f=L.need(p,cn);f.dash>0||(O--,L.vars.lives=O,L.emit("player-hit",{lives:O}),I=n("graceTime")+jn(L,"meta:grace"),f.vy=-Y()*.55,f.vx=(B===null?-f.facing:Math.sign(L.need(p,qt).x-B)||-f.facing)*5,ze(L,p,"hit"),G(L,{kind:"shake",power:1.2}),G(L,{kind:"flash",color:"danger"}),O<=0&&et(L));},ct=(L,B,f)=>{let c=L.need(B,it),y=L.need(B,qt),i=oe();G(L,{kind:"burst",x:ot(y.x),y:Pe(y.y-y.h/2),color:"danger",n:12,size:i*.9}),L.emit("enemy-defeated",{kind:c.kind,by:f}),Fe(L,"score",50),L.destroy(B);},dt=(L,B)=>{let f=L.need(B,qt);ae+=1+jn(L,"meta:greed");let c=Math.floor(ae);ae-=c,c>0&&Fe(L,"coins",c),j$1++,L.emit("coin-collected",{value:1}),G(L,{kind:"burst",x:ot(f.x),y:Pe(f.y-f.h/2),color:"coin",n:6,size:oe()*.6}),L.destroy(B);},ot=L=>L*oe()-v*oe(),Pe=L=>me()+L*oe();function bt(L){oe();for(let f$1 of L.query(qt)){let c=L.need(f$1,qt),y=L.get(f$1,e);if(!y)continue;y.x=ot(c.x),y.y=Pe(c.y-c.h/2);let i=L.get(f$1,f);if(i&&i.shape==="actor"&&L.has(f$1,it)){let u=L.need(f$1,it);i.facing=u.dir>=0?1:-1,i.alpha=u.safe>0&&Math.floor(L.time*12)%2===0?.35:1,y.y=Pe(c.y)-i.h/2;}if(i&&i.shape==="actor"&&L.has(f$1,cn)&&(y.y=Pe(c.y)-i.h/2),i&&L.has(f$1,Oo)&&L.need(f$1,Oo).char==="_"){let u=se.get(`${Math.floor(c.x)},${Math.round(c.y-c.h)}`)??0;i.alpha=u>.5?0:u>0?.5+.5*Math.abs(Math.sin(L.time*30)):.85;}}}let Ke=(L,B,f$1,c)=>{let y=_e.get(L);(y===void 0||!e$1.isAlive(y))&&(y=e$1.create(),e$1.set(y,$c,{id:L}),_e.set(L,y)),e$1.set(y,e,{x:B,y:f$1}),e$1.set(y,f,c);},At=L=>{let B=_e.get(L);B!==void 0&&e$1.destroy(B),_e.delete(L);};function en(){for(let L of _e.values())e$1.destroy(L);_e.clear(),nt(e$1,$c);}let Rt=L=>{let B=Number(L.vars.view_w??720),f=Number(L.vars.view_h??1280),c=Math.min(B,f),y=f*.085;Ke("lvl",B*.08,y,{shape:"text",text:`${r.world}-${r.index}`,size:Math.round(c*.042),color:"text",bold:true,depth:42});let i=c*.05;for(let w=0;w<E;w++)Ke(`h${w}`,B*.07+w*i*1.1,y+c*.065,{shape:"sprite",art:"heart",w:i,h:i,alpha:w<O?1:.25,depth:42});for(let w=E;w<12;w++)At(`h${w}`);let u=c*.06;for(let w=0;w<3;w++)Ke(`s${w}`,B/2+(w-1)*u*1.15,y,{shape:"sprite",art:"bigstar",w:u,h:u,alpha:xe[w]?1:.25,depth:42});let g=c*.045,T=String(L.vars.coins??0);if(Ke("coin:i",B*.92-T.length*g*.6-g*.7,y,{shape:"sprite",art:"coin",w:g,h:g,depth:42}),Ke("coin",B*.92-T.length*g*.6/2,y,{shape:"text",text:T,size:Math.round(g),color:"text",bold:true,depth:42}),ue?Ke("key",B*.92-g*.3,y+c*.065,{shape:"sprite",art:"key",w:g,h:g,depth:42}):At("key"),r.boss){let w=L.query(it).find(ge=>L.need(ge,it).kind==="boss"),N=w!==void 0?L.need(w,it).hp/r.bossHp:0,$=B*.5,te=Math.max(10,c*.022);Ke("boss:bg",B/2,y+c*.075,{shape:"rect",w:$,h:te,color:"#000000",alpha:.45,radius:te/2,depth:41});let le=Math.max(0,($-4)*Math.round(N*100)/100);le<1?At("boss:fill"):Ke("boss:fill",B/2-($-4)/2+le/2,y+c*.075,{shape:"rect",w:le,h:te-4,color:"danger",radius:(te-4)/2,depth:41.1});}};e$1.on(Nt,()=>{Xe(),e$1.vars.level=r.level;}),e$1.on(zt,Xe),e$1.on(Gt,()=>rt(e$1)),e$1.on(Kt,()=>{be()&&(e$1.vars.reviving=false,qe(e$1,"fell"));}),e$1.on(Bt,L=>{p!==null&&e$1.isAlive(p)&&Qe(e$1,p,L.reason==="cleared"?"dance":"die"),en();}),e$1.on(k,()=>{Ot(e$1,"side",me()+8*oe()+2);let L=oe();for(let B of e$1.query(it)){let f$1=e$1.need(B,it);if(f$1.tag==="crumble")continue;let c=e$1.need(B,qt);e$1.set(B,f,ee(f$1.kind,c.w,c.h,L));}ye(),Ue(),bt(e$1);}),e$1.addSystem({id:"platformer",order:0,run(L,B){if(!Je(L)||p===null||K||be())return;ne+=B,I>0&&(I=Math.max(0,I-B));let f$1=L.need(p,qt),c=L.need(p,cn),y=r.pace;for(let[q,x]of [...se]){let S=x+B;S>3.5?se.delete(q):se.set(q,S);}let i=s.axis().x;if(i!==0&&(c.facing=i),c.dash>0)c.dash-=B,c.vx=c.facing*15,c.vy=0;else {let q=i*Pp,x=c.grounded?60:32;c.vx+=Math.max(-x*B,Math.min(x*B,q-c.vx)),c.vy+=cr*B,c.vy>22&&(c.vy=22);}if(c.dashCd>0&&(c.dashCd-=B),c.swingCd>0&&(c.swingCd-=B),c.swing>0){c.swing-=B;let q={l:c.facing>0?f$1.x:f$1.x-1.4,r:c.facing>0?f$1.x+1.4:f$1.x,t:f$1.y-f$1.h-.2,b:f$1.y};for(let x of L.query(it)){if(!L.isAlive(x)||!L.has(x,it))continue;let S=L.need(x,it);if(!["walker","spiky","hopper","flyer","gunner","boss","bullet"].includes(S.kind))continue;let a=L.need(x,qt);a.x+a.w/2<q.l||a.x-a.w/2>q.r||a.y-a.h>q.b||a.y<q.t||(S.kind==="bullet"?(G(L,{kind:"burst",x:ot(a.x),y:Pe(a.y-a.h/2),color:"text",n:6,size:oe()*.5}),L.destroy(x)):S.kind==="boss"?tn(L,x,"sword"):ct(L,x,"sword"));}}if(c.coyote=c.grounded?.1:Math.max(0,c.coyote-B),c.buffer>0){c.buffer-=B;let q=ie.includes("double")&&c.jumps<2;c.coyote>0||c.grounded?(c.vy=-Y(),c.jumps=1,c.buffer=0,c.grounded=false,c.coyote=0):c.wall!==0&&ie.includes("wall")?(c.vy=-Y()*.95,c.vx=-c.wall*7,c.facing=-c.wall,c.jumps=1,c.buffer=0):q&&c.jumps>=1&&(c.vy=-Y()*.9,c.jumps=2,c.buffer=0,G(L,{kind:"ring",x:ot(f$1.x),y:Pe(f$1.y),color:"text",size:oe()*1.2})),c.buffer===0&&ze(L,p,"jump");}let u=f$1.w/2,g=f$1.x+c.vx*B;c.wall=0;let T=q=>{let x=[];for(let S=Math.floor(q-f$1.h+.05);S<=Math.floor(q-.05);S++)x.push(S);return x};if(c.vx>0){let q=Math.floor(g+u);T(f$1.y).some(x=>Q(Ee(q,x)))&&(g=q-u-.001,c.grounded||(c.wall=1),c.vx=0);}else if(c.vx<0){let q=Math.floor(g-u);T(f$1.y).some(x=>Q(Ee(q,x)))&&(g=q+1+u+.001,c.grounded||(c.wall=-1),c.vx=0);}c.wall===0&&!c.grounded&&i!==0&&T(f$1.y).some(q=>Q(Ee(Math.floor(g+i*(u+.05)),q)))&&(c.wall=i),f$1.x=Math.max(u,Math.min(d-u,g));let w=f$1.y,N=f$1.y+c.vy*B,$=c.grounded;c.grounded=false;let te=[Math.floor(f$1.x-u+.05),Math.floor(f$1.x+u-.05)];if(c.vy>=0){let q=Math.floor(N);for(let x of te){let S=Ee(x,q),a=q;if((Q(S)||Re(S)&&w<=a+.05)&&N>=a){N=a,c.vy=0,c.grounded=true,c.jumps=0,S==="_"&&!se.has(`${x},${q}`)&&se.set(`${x},${q}`,.001),S==="^"&&(lt(L,null),c.vy=-Y()*.7,c.grounded=false);break}}}else {let q=Math.floor(N-f$1.h);te.some(x=>Q(Ee(x,q)))&&(N=q+1+f$1.h,c.vy=0);}f$1.y=N,!$&&c.grounded&&ze(L,p,"jump");for(let q of L.query(it)){let x=L.need(q,it);if(x.kind!=="mover"||x.tag==="crumble")continue;let S=L.need(q,qt),a=S.x;x.t+=B,S.x=x.baseX+Math.sin(x.t*.9)*2.2;let k=S.y-S.h;c.vy>=0&&Math.abs(f$1.x-S.x)<S.w/2+u*.6&&w<=k+.1&&f$1.y>=k-.05&&(f$1.y=k,c.vy=0,c.grounded=true,c.jumps=0,f$1.x+=S.x-a);}if(f$1.y>12&&(lt(L,null),I=Math.max(I,1),!be()&&!K&&Me(),K||be()))return;let le={l:f$1.x-u,r:f$1.x+u,t:f$1.y-f$1.h,b:f$1.y},ge=q=>le.r>q.x-q.w/2&&le.l<q.x+q.w/2&&le.b>q.y-q.h&&le.t<q.y,He=1.2*(1+jn(L,"meta:magnet")),je=f$1.x;for(let q of L.query(it)){if(!L.isAlive(q)||!L.has(q,it))continue;let x=L.need(q,it),S=L.need(q,qt);switch(x.safe>0&&(x.safe-=B),x.kind){case "walker":case "spiky":{x.vx=x.dir*1.6*y;let a=S.x+x.dir*(S.w/2+.05)+x.vx*B,k=Q(Ee(Math.floor(a),Math.floor(S.y-.5))),A=Ee(Math.floor(a),Math.floor(S.y));k||!(Q(A)||Re(A))?x.dir=-x.dir:S.x+=x.vx*B;break}case "hopper":{x.t+=B,x.vy+=cr*.6*B,S.y+=x.vy*B,S.y>=x.baseY&&(S.y=x.baseY,x.vy=0,x.t>1.5/y&&(x.t=0,x.vy=-Math.sqrt(2*cr*.6*2.4))),x.dir=je<S.x?-1:1;break}case "flyer":x.t+=B*y,S.x=x.baseX+Math.sin(x.t*.9)*3,S.y=x.baseY+Math.sin(x.t*1.8)*.9,x.dir=Math.cos(x.t*.9)>=0?1:-1;break;case "gunner":{if(x.dir=je<S.x?-1:1,x.t+=B,x.t>2.2/y&&Math.abs(je-S.x)<9){x.t=0;let a=Le("bullet",S.x+x.dir*.6,S.y-.45,.45,.3);a.vx=x.dir*6*y,a.dir=x.dir,ze(L,q,"attack");}break}case "bullet":case "wave":if(S.x+=x.vx*B,x.t+=B,x.t>(x.kind==="wave"?2.2:3.5)||Q(Ee(Math.floor(S.x),Math.floor(S.y-.1)))){L.destroy(q);continue}break;case "boss":Et(L,q,x,S,je,B);break;case "coin":Math.hypot(S.x-f$1.x,S.y-(f$1.y-f$1.h/2))<He&&He>1.21&&(S.x+=(f$1.x-S.x)*Math.min(1,B*10),S.y+=(f$1.y-f$1.h/2-S.y)*Math.min(1,B*10));break;}if(!(!L.isAlive(q)||!ge(S))){switch(x.kind){case "coin":dt(L,q);break;case "star":{let a=Number(x.tag);xe[a]=true,L.vars.stars=xe.filter(Boolean).length,L.emit("star-collected",{index:a}),G(L,{kind:"ring",x:ot(S.x),y:Pe(S.y-S.h/2),color:"coin",size:oe()*2.4}),G(L,{kind:"flash",color:"coin"}),L.destroy(q);break}case "heart":O=Math.min(E,O+1),L.vars.lives=O,G(L,{kind:"ring",x:ot(S.x),y:Pe(S.y-S.h/2),color:"danger",size:oe()*1.6}),L.destroy(q);break;case "key":ue=true,G(L,{kind:"ring",x:ot(S.x),y:Pe(S.y-S.h/2),color:"coin",size:oe()*1.6}),L.destroy(q);break;case "chest":if(ue&&x.tag!=="open"){x.tag="open",ue=false;for(let k=0;k<15;k++)ae+=1+jn(L,"meta:greed"),j$1++;let a=Math.floor(ae);ae-=a,Fe(L,"coins",a),G(L,{kind:"burst",x:ot(S.x),y:Pe(S.y-S.h/2),color:"coin",n:24,size:oe()*1.4}),G(L,{kind:"pop",x:ot(S.x),y:Pe(S.y-S.h*1.4),text:"+15",color:"coin",size:Math.round(oe()*.5)});}break;case "spring":c.vy>0&&f$1.y-(S.y-S.h)<.5&&(c.vy=-Math.sqrt(2*cr*Ip),c.jumps=1,G(L,{kind:"ring",x:ot(S.x),y:Pe(S.y-S.h),color:"accent",size:oe()*1.4}));break;case "checkpoint":if(x.tag!=="on"){x.tag="on",M={x:S.x,y:S.y};let a=L.need(q,f);a.shape==="sprite"&&(a.color="accent"),L.emit("checkpoint",{}),G(L,{kind:"ring",x:ot(S.x),y:Pe(S.y-S.h/2),color:"accent",size:oe()*2});}break;case "flag":if(fe){qe(L,"cleared");return}break;case "walker":case "hopper":case "flyer":case "gunner":case "spiky":case "boss":{let a=c.vy>0&&f$1.y-(S.y-S.h)<.55&&x.kind!=="spiky";c.dash>0&&x.kind!=="boss"?ct(L,q,"dash"):a?(c.vy=-Y()*.65,c.jumps=1,x.kind==="boss"?tn(L,q,"stomp"):ct(L,q,"stomp")):lt(L,S.x);break}case "bullet":case "wave":lt(L,S.x),L.destroy(q);break;}if(K||be())return}}let st=Se(),Z=Math.max(0,Math.min(Math.max(0,d-st),f$1.x-st*.4+c.facing*st*.08)),H=v;v+=(Z-v)*Math.min(1,B*6),mo(L,(v-H)*oe()),L.vars.level_progress=Math.min(1,f$1.x/Math.max(1,d));let X=L.need(p,f);X.shape==="actor"&&(X.facing=c.facing>=0?1:-1,X.pose=c.grounded?Math.abs(c.vx)>.5?"run":"idle":"air",X.speed=Math.abs(c.vx)*oe(),X.alpha=I>0&&Math.floor(L.time*12)%2===0?.35:1),bt(L),Rt(L);}});function tn(L,B,f){let c=L.need(B,it);c.safe>0||(c.hp--,c.safe=1,ze(L,B,"hit"),G(L,{kind:"shake",power:1}),c.hp<=0&&(fe=true,L.emit(wp,{}),ct(L,B,f),Le("flag",d-2,8,.8,2.6)));}function Et(L,B,f,c,y,i){if(f.t-=i,f.vy+=cr*i,c.y=Math.min(f.baseY,c.y+f.vy*i),c.y>=f.baseY){if(f.tag==="slam-air"){f.tag="walk",f.t=1.6,G(L,{kind:"shake",power:1.4});for(let u of [-1,1]){let g=Le("wave",c.x+u*1.2,f.baseY,.9,.6);g.vx=u*8*r.pace;}}f.vy=0;}if(f.tag==="walk"){if(f.dir=y<c.x?-1:1,c.x+=f.dir*1.4*r.pace*i,f.t<=0){let u=Math.floor(L.rng.next()*3);if(u===0)f.tag="charge",f.t=1.1,f.vx=f.dir*9*r.pace,Qe(L,B,"run");else if(u===1)f.tag="slam-air",f.vy=-Math.sqrt(2*cr*4),ze(L,B,"jump");else {f.tag="walk",f.t=2.4;for(let g of [d-15,d-3])Le("walker",g,f.baseY,.8,1).dir=g<c.x?1:-1;ze(L,B,"cheer");}}}else f.tag==="charge"&&(c.x+=f.vx*i,(f.t<=0||Q(Ee(Math.floor(c.x+Math.sign(f.vx)*1.2),Math.floor(f.baseY-1))))&&(f.tag="walk",f.t=1.8,Qe(L,B,"walk")));c.x=Math.max(d-17.5,Math.min(d-1.2,c.x));}Ot(e$1,"side",me()+8*oe()+2),Xe();}};var Zt=5,Ns=6,$s=6,vn={blaster:{id:"blaster",art:"shot",color:"coin",damage:[10,13,15,18,24],cooldown:[.8,.7,.62,.55,.42],count:[1,1,2,2,3],pierce:[1,1,1,2,3]},blades:{id:"blades",art:"blade",color:"primary",damage:[8,10,12,14,19],cooldown:[.45,.42,.4,.38,.32],count:[2,2,3,3,5],reach:[.15,.16,.17,.18,.21]},aura:{id:"aura",art:"aura",color:"secondary",damage:[5,7,9,11,16],cooldown:[.5,.5,.45,.45,.4],count:[1,1,1,1,1],reach:[.11,.125,.14,.155,.19]},boomerang:{id:"boomerang",art:"boomerang",color:"accent",damage:[16,20,24,28,38],cooldown:[1.8,1.6,1.4,1.25,1],count:[1,1,2,2,3],reach:[.34,.36,.38,.4,.46]},lightning:{id:"lightning",art:"lightning",color:"primary",damage:[18,22,26,30,42],cooldown:[2,1.8,1.6,1.4,1.1],count:[2,3,4,5,7],reach:[.22,.23,.24,.25,.3]},drone:{id:"drone",art:"drone",color:"piece6",damage:[9,11,13,15,21],cooldown:[1,.9,.8,.7,.55],count:[1,1,2,2,3],reach:[.11,.11,.12,.12,.13]}},dr=Object.keys(vn),Gr={might:{id:"might",art:"fist",color:"danger",step:.12},haste:{id:"haste",art:"hourglass",color:"primary",step:.07},area:{id:"area",art:"aura",color:"secondary",step:.1},swift:{id:"swift",art:"boot",color:"accent",step:.08},vigor:{id:"vigor",art:"heart",color:"danger",step:20},armor:{id:"armor",art:"shield",color:"muted",step:1.5},magnet:{id:"magnet",art:"magnet",color:"danger",step:.3},luck:{id:"luck",art:"clover",color:"accent",step:.2},growth:{id:"growth",art:"crystal",color:"accent",step:.1}},Bs=Object.keys(Gr),Cn={swarm:{kind:"swarm",cast:"foe5",hp:.6,speed:118,size:.045,damage:5,xp:1,from:0,weight:3},grunt:{kind:"grunt",cast:"foe",hp:1,speed:95,size:.055,damage:8,xp:1,from:0,weight:4},archer:{kind:"archer",cast:"foe3",hp:1.2,speed:88,size:.055,damage:7,xp:2,from:.8,weight:2},brute:{kind:"brute",cast:"foe2",hp:5,speed:62,size:.085,damage:14,xp:5,from:1.6,weight:1.2},charger:{kind:"charger",cast:"foe4",hp:2.5,speed:80,size:.065,damage:12,xp:3,from:2.4,weight:1.4},bomber:{kind:"bomber",cast:"foe5",hp:1.5,speed:120,size:.055,damage:16,xp:2,from:3.2,weight:1.4},miniboss:{kind:"miniboss",cast:"boss",hp:45,speed:75,size:.12,damage:18,xp:25,from:99,weight:0},boss:{kind:"boss",cast:"boss",hp:160,speed:70,size:.16,damage:24,xp:0,from:99,weight:0}},zc=["swarm","grunt","archer","brute","charger","bomber"],zs=10;function Kr(e,t){let n=Math.max(1,Math.min(zs,Math.floor(e)));return {chapter:n,duration:Math.min(600,t+(n-1)*30),hp:1+(n-1)*.45,damage:1+(n-1)*.12,headStart:(n-1)*.4,firstClearGold:100+(n-1)*60}}var Fr=[{id:"hero",cast:"hero",weapon:"blaster",passive:null,gems:0},{id:"hero2",cast:"hero2",weapon:"blades",passive:"vigor",gems:150},{id:"hero3",cast:"hero3",weapon:"lightning",passive:"area",gems:300}],$i=[{id:"Might",var:"meta:might",art:"fist",color:"danger",perLevel:4,unit:"%",maxLevel:50,price:30,growth:.09},{id:"Vitality",var:"meta:hp",art:"heart",color:"danger",perLevel:8,unit:"",maxLevel:50,price:25,growth:.09},{id:"Armor",var:"meta:armor",art:"shield",color:"muted",perLevel:.5,unit:"",maxLevel:30,price:40,growth:.1},{id:"Swiftness",var:"meta:speed",art:"boot",color:"accent",perLevel:2,unit:"%",maxLevel:25,price:35,growth:.1},{id:"Magnet",var:"meta:magnet",art:"magnet",color:"danger",perLevel:6,unit:"%",maxLevel:25,price:20,growth:.1},{id:"Luck",var:"meta:luck",art:"clover",color:"accent",perLevel:5,unit:"%",maxLevel:25,price:30,growth:.1},{id:"Growth",var:"meta:growth",art:"crystal",color:"accent",perLevel:3,unit:"%",maxLevel:30,price:30,growth:.1},{id:"Recovery",var:"meta:regen",art:"potion",color:"accent",perLevel:.1,unit:"",maxLevel:30,price:45,growth:.1}],Bi="kit-survivors",Wc=30,Hc=10,Vc={game:"survivors",character:Bi,stats:$i,heroes:Fr,levels:zs,firstClearGold:e=>Kr(e,300).firstClearGold,stars:0};var Hs=b("survivors.hero"),Ne=b("survivors.foe"),fr=b("survivors.shot"),Nn=b("survivors.bullet"),jt=b("survivors.drop"),Xn=b("survivors.blade"),pr=b("survivors.aura"),ur=b("survivors.drone"),Do=b("survivors.boomerang"),Ao=b("survivors.zap"),Ur=b("survivors.halo"),Gc=b("survivors.hud"),Yn=b("survivors.joystick"),zi="level-up",Wi="upgrade-picked",Hi="upgrade-pick",Vi="upgrade-reroll";var Vs="boss-spawned",Gi="boss-defeated",Ki=e=>[...Object.entries(e.weapons).map(([t,n])=>`w:${t}:${n}`),...Object.entries(e.passives).map(([t,n])=>`p:${t}:${n}`)].join(","),Kc=e=>{let t={},n={};for(let s of String(e??"").split(",")){let[r,o,d]=s.split(":");r==="w"&&o&&o in vn?t[o]=Number(d):r==="p"&&o&&o in Gr&&(n[o]=Number(d));}return {weapons:t,passives:n}},Fi=e=>e.map(t=>`${t.kind}:${t.id}:${t.level}`).join(","),Fc=e=>String(e??"").split(",").filter(Boolean).map(t=>{let[n,s,r]=t.split(":");return {kind:n,id:s??"",level:Number(r??1)}}),Ws=e=>e.vars.reviving===true,In=(e,t)=>{let n=Number(e.vars[t]??0);return Number.isFinite(n)?n:0},Gs={id:"survivors",version:2,engines:["phaser"],requires:["round"],params:{duration:{type:"number",default:300,min:20,max:900},heroSpeed:{type:"number",default:260,min:80,max:800},hp:{type:"number",default:100,min:10,max:2e3},spawnRate:{type:"number",default:1.2,min:.1,max:10},spawnGrowth:{type:"number",default:.9,min:0,max:10},foeHp:{type:"number",default:10,min:1,max:1e3},foeHpGrowth:{type:"number",default:.45,min:0,max:5},foeDamage:{type:"number",default:1,min:.1,max:10},foeSpeed:{type:"number",default:1,min:.3,max:3},damage:{type:"number",default:1,min:.1,max:100},shotSpeed:{type:"number",default:640,min:100,max:2e3},xpFirst:{type:"number",default:4,min:1,max:100,integer:true},xpGrowth:{type:"number",default:1.25,min:1,max:2},coinRate:{type:"number",default:.25,min:0,max:1},killScore:{type:"number",default:10,min:0,max:1e3,integer:true},bossScore:{type:"number",default:500,min:0,max:1e5,integer:true},clearBonus:{type:"number",default:1e3,min:0,max:1e5,integer:true},graceTime:{type:"number",default:.6,min:0,max:5},maxFoes:{type:"number",default:46,min:5,max:160,integer:true},minibossEvery:{type:"number",default:120,min:0,max:900},eliteEvery:{type:"number",default:50,min:0,max:900}},setup({world:e$1,params:t,mode:n}){let s=e$1.rng.stream("survivors"),r=_r(e$1),o=a=>nn(t,a),d=null,p=null,v=0,M={},O={},E={},I=0,K=0,z=0,ne=1,ae=0,j$1=0,ue=[],fe="level",ie=0,xe=0,se=0,_e=false,Ae=0,be=0,oe=300,me=Kr(1,300),Se=false,Ee=null,Q=0,Re=0,We=0,we=0,ee=null,Le=0,ye=0,ke=false,Ue=new Map,Y={maxHp:100,hp:100,regen:0,armor:0,speed:260,magnet:80,might:1,haste:1,area:1,luck:1,growth:1},Me=()=>Math.min(Ce(e$1).w,Ce(e$1).h),Xe=()=>Me()/720,at=()=>Me()*.07,Te=()=>{let a=Ce(e$1);return {x:a.w/2,y:a.h/2}},Wt=()=>{let a=A=>O[A]??0,k=Y.maxHp;Y.might=(1+In(e$1,"meta:might")+.12*a("might"))*o("damage"),Y.haste=Math.max(.4,1-.07*a("haste")),Y.area=1+.1*a("area"),Y.speed=o("heroSpeed")*Xe()*(1+In(e$1,"meta:speed")+.08*a("swift")),Y.maxHp=o("hp")+In(e$1,"meta:hp")+20*a("vigor"),Y.regen=In(e$1,"meta:regen")+.3*a("vigor"),Y.armor=In(e$1,"meta:armor")+1.5*a("armor"),Y.magnet=Me()*.12*(1+In(e$1,"meta:magnet")+.3*a("magnet")),Y.luck=1+In(e$1,"meta:luck")+.2*a("luck"),Y.growth=1+In(e$1,"meta:growth")+.1*a("growth"),Y.maxHp>k&&(Y.hp+=Y.maxHp-k),Y.hp=Math.min(Y.hp,Y.maxHp),e$1.vars.survivors_build=Ki({weapons:M,passives:O});},Ge=a=>Math.ceil(o("xpFirst")*Math.pow(a,o("xpGrowth"))),qe=()=>Fr.find(a=>a.id===e$1.vars["meta:hero"])??Fr[0],et=()=>{let a=Te(),k=at();(d===null||!e$1.isAlive(d))&&(d=e$1.create(),e$1.set(d,Hs,{size:k})),e$1.need(d,Hs).size=k,e$1.set(d,e,{x:a.x,y:a.y}),e$1.set(d,f,{shape:"actor",cast:qe().cast,h:k*2.3,feet:k*.6,pose:"idle",depth:Ht(e$1,a.y)});},rt=(a,k,A,l)=>{let h=Ue.get(a);(h===void 0||!e$1.isAlive(h))&&(h=e$1.create(),e$1.set(h,Gc,{id:a}),Ue.set(a,h)),e$1.set(h,e,{x:k,y:A}),e$1.set(h,f,l);},lt=a=>{let k=Ue.get(a);k!==void 0&&e$1.destroy(k),Ue.delete(a);},ct=()=>{for(let a of Ue.values())e$1.destroy(a);Ue.clear(),nt(e$1,Gc);},dt=(a,k,A,l,h,D,_,b=41)=>{let m=Math.max(0,Math.min(1,Math.round(D*100)/100));rt(`${a}:bg`,k,A,{shape:"rect",w:l,h,color:"#000000",alpha:.45,radius:h/2,depth:b});let R=Math.max(0,(l-4)*m);R<1?lt(`${a}:fill`):rt(`${a}:fill`,k-(l-4)/2+R/2,A,{shape:"rect",w:R,h:h-4,color:_,radius:(h-4)/2,depth:b+.01});},ot=a=>{let k=Ce(a),A=Me(),l=k.h*.085,h=k.w*.9,D=Math.max(10,A*.026);dt("xp",k.w/2,l,h,D,z/Ge(ne),"accent"),rt("lv",k.w/2+h/2-A*.04,l+D*1.6,{shape:"text",text:`Lv ${ne}`,size:Math.round(A*.032),color:"text",bold:true,depth:42});let _=l+A*.075;if(Ee!==null&&a.isAlive(Ee)&&a.has(Ee,Ne)){let U=a.need(Ee,Ne);dt("boss",k.w/2,_,k.w*.62,Math.max(14,A*.034),U.hp/U.maxHp,"danger"),rt("time",k.w/2,_-A*.05,{shape:"text",text:U.kind==="boss"?"BOSS":"MINI BOSS",size:Math.round(A*.036),color:"danger",bold:true,depth:42}),a.vars.boss_hp=U.hp/U.maxHp;}else lt("boss:bg"),lt("boss:fill"),rt("time",k.w/2,_,{shape:"text",text:Zo(Number(a.vars.time_left??0)),size:Math.round(A*.05),color:"text",bold:true,depth:42}),a.vars.boss_hp=0;let b=Math.round(A*.036);rt("kills:i",k.w*.06,_,{shape:"sprite",art:"skull",w:b*1.1,h:b*1.1,color:"text",depth:42}),rt("kills",k.w*.06+b*.75+String(xe).length*b*.28,_,{shape:"text",text:String(xe),size:b,color:"text",bold:true,depth:42});let m=A*.05,R=0,C=new Set,P=(U,de,ce,he,pe,Be)=>{C.add(U),rt(`b:${U}`,pe,Be,{shape:"sprite",art:de,w:m,h:m,color:ce,alpha:.95,depth:41}),rt(`b:${U}:l`,pe+m*.38,Be+m*.36,{shape:"text",text:he>=5?"\u2605":String(he),size:Math.round(m*.42),color:he>=5?"coin":"text",bold:true,depth:42});};for(let[U,de]of Object.entries(M)){let ce=vn[U];P(U,ce.art,ce.color,de??1,k.w*.06+R*m*1.12,_+A*.075),R++;}R=0;for(let[U,de]of Object.entries(O)){let ce=Gr[U];P(U,ce.art,ce.color,de??1,k.w*.06+R*m*.95,_+A*.075+m*1.1),R++;}for(let U of [...Ue.keys()])if(U.startsWith("b:")){let de=U.slice(2).replace(/:l$/,"");C.has(de)||lt(U);}let W=at(),J=Te();dt("hp",J.x,J.y+W*1.05,W*1.7,Math.max(7,A*.013),Y.hp/Y.maxHp,Y.hp/Y.maxHp>.35?"accent":"danger",40);},Pe=(a=-1)=>{let k=Ce(e$1),A=Me()*.08,l=a>=0?a:s.int(0,3);return {x:l===0?-A:l===1?k.w+A:s.range(-A,k.w+A),y:l===2?-A:l===3?k.h+A:s.range(-A,k.h+A)}},bt=()=>o("foeHp")*me.hp*(1+o("foeHpGrowth")*(be/60)),Ke=(a,k,A=false)=>{let l=Cn[a],h=a==="boss"||a==="miniboss",D=Me()*l.size*(A?1.3:1),_=bt()*l.hp*(A?8:1),b=Mt(e$1,k.x,k.y,{shape:"actor",cast:l.cast,variant:s.int(0,99),h:D*(h?1.9:a==="brute"?1.75:2.2),feet:D*.6,pose:a==="brute"||h?"walk":"run",depth:Ht(e$1,k.y)},{type:Ne,data:{kind:a,hp:_,maxHp:_,speed:l.speed*Xe()*o("foeSpeed")*(1+Math.min(.5,be/600)),size:D,damage:l.damage*me.damage*o("foeDamage")*(A?1.4:1),xp:l.xp*(A?5:1),elite:A,t:s.range(0,1.5),phase:"walk",vx:0,vy:0,hurtAt:{},next:0}});return (A||h)&&Mt(e$1,k.x,k.y+D*.5,{shape:"sprite",art:"aura_field",w:D*2.2,h:D*1.1,color:h?"danger":"coin",alpha:.85,depth:2},{type:Ur,data:{of:b}}),b},At=()=>{let a=be/60+me.headStart,k=pn(n,"foes",zc),A=k.filter(_=>Cn[_].from<=a),l=A.length>0?A:[k.reduce((_,b)=>Cn[_].from<=Cn[b].from?_:b)],h=0;for(let _ of l)h+=Cn[_].weight;let D=s.range(0,h);for(let _ of l)if(D-=Cn[_].weight,D<=0)return _;return l[0]??"grunt"},en=()=>e$1.query(Ne).length,Rt=(a,k)=>{let A=be/60+me.headStart,l=o("spawnRate")*(1+o("spawnGrowth")*A);for(Le>0&&(Le-=k,l*=.25),Se&&(l*=.45),ee&&(ee.left-=k,l*=2.6),Ae+=k*l;Ae>=1;)Ae-=1,!(en()>=o("maxFoes"))&&Ke(At(),Pe(ee?ee.side:-1));if(ee&&ee.left<=0&&(ee=null),!Se){if(be>=We){We=be+s.range(26,36);let h=we++%3;if(h===0){let D=Te(),_=12+Math.min(12,Math.floor(A*2)),b=Me()*.62;for(let m=0;m<_;m++){let R=m/_*Math.PI*2;Ke(A>3?"grunt":"swarm",{x:D.x+Math.cos(R)*b,y:D.y+Math.sin(R)*b*1.25});}G(a,{kind:"flash",color:"danger"});}else h===1?ee={left:4,side:s.int(0,3)}:Le=5;}if(o("eliteEvery")>0&&be>=Re){Re=be+o("eliteEvery");let h=At();Ke(h==="swarm"?"grunt":h,Pe(),true);}o("minibossEvery")>0&&be>=Q&&oe-be>30&&(Q=be+o("minibossEvery"),(Ee===null||!a.isAlive(Ee))&&(Ee=Ke("miniboss",Pe()),a.emit(Vs,{kind:"miniboss"}),G(a,{kind:"shake",power:1.2})));}},tn=a=>{Se=true,a.vars.time_left=0;let k=Te();for(let A of a.query(Ne)){let l=a.get(A,Ne);if(!l||l.kind==="miniboss")continue;let h=a.need(A,e);Math.hypot(h.x-k.x,h.y-k.y)<Me()*.3&&L(a,A,null,false);}Ee=Ke("boss",{x:k.x,y:k.y-Ce(a).h*.42}),G(a,{kind:"shake",power:2}),G(a,{kind:"flash",color:"danger"}),a.emit(Vs,{kind:"boss"});},Et=(a,k,A,l=1)=>{let h=at(),D=a==="xp"?{shape:"sprite",art:"crystal",w:h*(l>=25?.62:l>=5?.5:.38),h:h*(l>=25?.62:l>=5?.5:.38),color:l>=25?"secondary":l>=5?"primary":"accent",depth:3}:a==="coin"?{shape:"sprite",art:"coin",w:h*.4,h:h*.4,depth:3}:a==="food"?{shape:"sprite",art:"heart",w:h*.5,h:h*.5,depth:3}:a==="magnet"?{shape:"sprite",art:"magnet",w:h*.6,h:h*.6,depth:3}:a==="bomb"?{shape:"sprite",art:"bomb",w:h*.6,h:h*.6,depth:3}:{shape:"sprite",art:"chest",w:h*.9,h:h*.9,color:"coin",depth:3};Mt(e$1,k,A,D,{type:jt,data:{kind:a,value:l,pulled:false}});},L=(a,k,A,l=true)=>{let h=a.get(k,Ne);if(!h)return;let D=a.need(k,e),_=D.x,b=D.y;a.remove(k,Ne);for(let C of a.query(Ur))a.need(C,Ur).of===k&&a.destroy(C);Qe(a,k,"die");let m=a.need(k,f);if(m.shape==="actor"&&(m.depth=Ht(a,b)-.2),rr(a,k,1.4),G(a,{kind:"burst",x:_,y:b,color:"danger",n:h.elite||h.kind==="boss"?22:8,size:h.size*1.4}),!l)return;xe+=1,a.vars.kills=xe,a.emit("enemy-defeated",{kind:h.kind,elite:h.elite,by:A});let R=at();if(h.xp>0&&Et("xp",_,b+h.size*.4,h.xp),s.chance(Math.min(.95,o("coinRate")*Y.luck))&&Et("coin",_+R*.3,b+h.size*.4),s.chance(.012*Y.luck)&&Et("food",_-R*.3,b),s.chance(.004)&&!a.query(jt).some(C=>a.need(C,jt).kind==="magnet")&&Et("magnet",_,b-R*.3),s.chance(.004)&&Et("bomb",_,b-R*.3),h.elite||h.kind==="miniboss"){Et("chest",_,b);for(let C=0;C<3;C++)Et("coin",_+s.range(-R,R),b+s.range(-R,R));}if(h.kind==="bomber"){let C=Me()*.11*Y.area;G(a,{kind:"ring",x:_,y:b,color:"piece6",size:C*2});for(let P of a.query(Ne)){let W=a.need(P,e);Math.hypot(W.x-_,W.y-b)<C&&B(a,P,bt()*2.5,"blast");}}if((h.kind==="miniboss"||h.kind==="boss")&&(se+=1,a.vars.bosses=se,k===Ee&&(Ee=null),a.emit(Gi,{kind:h.kind}),G(a,{kind:"shake",power:2}),h.kind==="boss")){for(let C of a.query(Ne))L(a,C,null,false);u(a,"cleared");}},B=(a,k,A,l)=>{if(!a.has(k,Ne))return;let h=a.need(k,Ne);if(h.hp-=A,(h.elite||h.kind==="boss"||h.kind==="miniboss")&&ye>0){ye-=1;let D=a.need(k,e);G(a,{kind:"pop",x:D.x+s.range(-10,10),y:D.y-h.size,text:String(Math.round(A)),color:"text",size:Math.round(Me()*.03)});}h.hp<=0?L(a,k,l):h.kind!=="boss"&&h.kind!=="miniboss"&&ze(a,k,"hit");},f$1=(a,k,A,l,h)=>{let D=a.get(k,Ne);if(!D||D.kind==="boss"||D.kind==="miniboss"||D.phase==="dash")return;let _=a.need(k,e),b=_.x-A,m=_.y-l,R=Math.hypot(b,m)||1;_.x+=b/R*h,_.y+=m/R*h;},c=(a,k)=>{if(ie>0||d===null)return;let A=Math.max(1,k-Y.armor);Y.hp-=A,ie=o("graceTime"),a.vars.hp=Math.max(0,Math.ceil(Y.hp)),a.emit("player-hit",{hp:a.vars.hp}),ze(a,d,"hit"),G(a,{kind:"flash",color:"danger"}),G(a,{kind:"shake",power:.8});let l=Te();G(a,{kind:"pop",x:l.x,y:l.y-at()*1.4,text:`-${Math.round(A)}`,color:"danger",size:Math.round(Me()*.034)}),Y.hp<=0&&y(a);},y=a=>{if(a.vars.revive_ready===true&&!_e){a.vars.reviving=true,Dt(a),p=null,a.emit(Vt,{});return}u(a,"died");},i=a=>{if(a.vars.reviving!==true)return;_e=true,a.vars.reviving=false,Y.hp=Y.maxHp,a.vars.hp=Math.ceil(Y.hp),ie=2.5;let k=Te();for(let A of a.query(Ne)){let l=a.need(A,e);if(Math.hypot(l.x-k.x,l.y-k.y)<Me()*.4){let h=a.get(A,Ne);if(!h)continue;h.kind==="boss"||h.kind==="miniboss"?f$1(a,A,k.x,k.y,Me()*.2):L(a,A,"revive");}}for(let A of a.query(Nn))a.destroy(A);G(a,{kind:"ring",x:k.x,y:k.y,color:"coin",size:Me()*.8}),G(a,{kind:"flash",color:"coin"}),d!==null&&Qe(a,d,"idle");},u=(a,k)=>{if(!Je(a)||ke)return;ke=true;let A=Math.floor(be);k==="cleared"&&a.vars["meta:first_clear"]===true&&Fe(a,"coins",me.firstClearGold),a.vars.score=xe*o("killScore")+A*5+se*o("bossScore")+(k==="cleared"?o("clearBonus")*me.chapter:0),a.vars.choosing=false,a.vars.reviving=false,a.emit($t,{reason:k,stats:{kills:xe,seconds:A,bosses:se,chapter:me.chapter,level:ne,cleared:k==="cleared"}});},g=pn(n,"weapons",dr),T=()=>{let a=[],k=Object.keys(M).length,A=Object.keys(O).length;for(let h of dr){let D=M[h];D!==void 0&&D<5?a.push({o:{kind:"weapon",id:h,level:D+1},weight:3}):D===void 0&&k<6&&g.includes(h)&&a.push({o:{kind:"weapon",id:h,level:1},weight:1.6});}for(let h of Bs){let D=O[h];D!==void 0&&D<5?a.push({o:{kind:"passive",id:h,level:D+1},weight:2}):D===void 0&&A<6&&a.push({o:{kind:"passive",id:h,level:1},weight:1.2});}let l=[];for(;l.length<3&&a.length>0;){let h=0;for(let b of a)h+=b.weight;let D=s.range(0,h),_=0;for(;_<a.length-1&&(D-=a[_].weight,!(D<=0));_++);l.push(a[_].o),a.splice(_,1);}return l.length<3&&l.push({kind:"heal",id:"heal",level:1}),l.length<3&&l.push({kind:"gold",id:"gold",level:1}),l},w=(a,k)=>{ue=T(),fe=k,a.vars.choosing=true,a.vars.survivors_offer=Fi(ue),Dt(a),p=null,nt(a,Yn);let A=Te();G(a,{kind:"ring",x:A.x,y:A.y,color:k==="chest"?"coin":"accent",size:Me()*.5}),a.emit(zi,{level:ne,source:k,options:ue,build:{weapons:{...M},passives:{...O}}});},N=a=>{a.vars.choosing===true||!Je(a)||(ae>0?(ae-=1,w(a,"level")):j$1>0&&(j$1-=1,w(a,"chest")));},$=(a,k)=>{k.kind==="weapon"?(M[k.id]=k.level,E[k.id]=0):k.kind==="passive"?O[k.id]=k.level:k.kind==="heal"?Y.hp=Math.min(Y.maxHp,Y.hp+Y.maxHp*.3):k.kind==="gold"&&Fe(a,"coins",10),Wt(),a.vars.hp=Math.ceil(Y.hp),le(a);},te=(a,k)=>{if(a.vars.choosing!==true)return;let A=ue[k];A&&($(a,A),ue=[],a.vars.choosing=false,a.vars.survivors_offer="",a.emit(Wi,{kind:A.kind,id:A.id,level:A.level,source:fe}),N(a));},le=a=>{let k=Te(),A=Me(),l=M.blades,h=l?vn.blades.count[l-1]:0,D=a.query(Xn);for(let P of D)a.need(P,Xn).index>=h&&a.destroy(P);for(let P=0;P<h;P++)D.some(W=>a.isAlive(W)&&a.need(W,Xn).index===P)||Mt(a,k.x,k.y,{shape:"sprite",art:"blade",w:A*.075,h:A*.075,color:"primary",depth:31},{type:Xn,data:{index:P}});for(let P of a.query(Xn)){let W=a.need(P,f);W.shape==="sprite"&&(W.w=W.h=A*(l===5?.095:.075)*Math.sqrt(Y.area));}let _=M.aura,b=a.query(pr);if(_){let P=A*vn.aura.reach[_-1]*Y.area;b.length===0&&Mt(a,k.x,k.y,{shape:"sprite",art:"aura_field",w:P*2,h:P*2,color:_===5?"coin":"secondary",alpha:.9,depth:1.5},{type:pr,data:{r:P}});for(let W of a.query(pr)){a.need(W,pr).r=P;let J=a.need(W,f);J.shape==="sprite"&&(J.w=J.h=P*2,J.color=_===5?"coin":"secondary");}}else for(let P of b)a.destroy(P);let m=M.drone,R=m?vn.drone.count[m-1]:0,C=a.query(ur);for(let P of C)a.need(P,ur).index>=R&&a.destroy(P);for(let P=0;P<R;P++)C.some(W=>a.isAlive(W)&&a.need(W,ur).index===P)||Mt(a,k.x,k.y,{shape:"sprite",art:"drone",w:A*.06,h:A*.06,color:"piece6",depth:33},{type:ur,data:{index:P,cd:.3*P}});},ge=(a,k,A,l,h)=>{let D=null,_=l;for(let b of a.query(Ne)){if(h&&h.includes(b))continue;let m=a.need(b,e),R=Math.hypot(m.x-k,m.y-A);R<_&&(_=R,D=b);}return D},He=(a,k,A,l,h,D,_,b,m=1)=>{let R=at()*m,C=o("shotSpeed")*Xe(),P=Mt(a,k,A,{shape:"sprite",art:"shot",w:R*.95,h:R*.48,color:b,depth:30},{type:fr,data:{vx:Math.cos(l)*C,vy:Math.sin(l)*C,life:1.4,damage:h,pierce:D,hit:[],by:_}});a.need(P,e).rotation=l;},je=(a,k,A)=>{if(d===null)return;let l=Te(),h=Me(),D=at();for(let _ of dr){let b=M[_];if(b===void 0)continue;let m=vn[_],R=b-1,C=m.damage[R]*Y.might;if(E[_]=(E[_]??0)-k,_==="blaster"&&E[_]<=0){let P=ge(a,l.x,l.y,h*.75);if(P===null){E[_]=0;continue}E[_]=m.cooldown[R]*Y.haste;let W=a.need(P,e),J=Math.atan2(W.y-(l.y-D*.3),W.x-l.x),U=m.count[R];for(let ce=0;ce<U;ce++)He(a,l.x,l.y-D*.3,J+(ce-(U-1)/2)*.16,C,m.pierce[R],"blaster",b===5?"piece6":"coin",b===5?1.25:1);ze(a,d,"attack");let de=a.need(d,f);de.shape==="actor"&&(de.actRate=1/Math.max(.2,m.cooldown[R]*Y.haste),A||(de.facing=W.x>=l.x?1:-1));}else if(_==="blades"){let P=h*m.reach[R]*Y.area,W=3+.35*b;I+=W*k;let J=a.query(Xn),U=J.length||1;for(let de of J){let ce=a.need(de,Xn),he=I+ce.index/U*Math.PI*2,pe=a.need(de,e);pe.x=l.x+Math.cos(he)*P,pe.y=l.y-D*.2+Math.sin(he)*P,pe.rotation=I*2.2;let Be=h*.04*Math.sqrt(Y.area);for(let Ye of a.query(Ne)){let pt=a.get(Ye,Ne);if(!pt)continue;let Lt=a.need(Ye,e);Math.hypot(Lt.x-pe.x,Lt.y-pe.y)>Be+pt.size*.55||a.time-(pt.hurtAt.blades??-9)<m.cooldown[R]||(pt.hurtAt.blades=a.time,B(a,Ye,C,"blades"),f$1(a,Ye,l.x,l.y,h*.012));}}}else if(_==="aura"){let P=a.query(pr)[0];if(P===void 0)continue;let W=a.need(P,e);if(W.x=l.x,W.y=l.y+D*.3,a.need(P,e).rotation=a.time*.6,E[_]>0)continue;E[_]=m.cooldown[R];let J=a.need(P,pr).r;for(let U of a.query(Ne)){let de=a.need(U,e),ce=a.get(U,Ne);!ce||Math.hypot(de.x-l.x,de.y-l.y)>J+ce.size*.3||(B(a,U,C,"aura"),f$1(a,U,l.x,l.y,h*.008));}}else if(_==="boomerang"&&E[_]<=0){let P=ge(a,l.x,l.y,h*.8);if(P===null){E[_]=0;continue}E[_]=m.cooldown[R]*Y.haste;let W=a.need(P,e),J=Math.atan2(W.y-l.y,W.x-l.x),U=m.count[R];for(let de=0;de<U;de++){let ce=J+de*Math.PI*2/U,he=h*(b===5?.085:.065);Mt(a,l.x,l.y,{shape:"sprite",art:"boomerang",w:he,h:he,color:"accent",depth:32},{type:Do,data:{dx:Math.cos(ce),dy:Math.sin(ce),dist:0,range:h*m.reach[R]*Y.area,back:false,damage:C,hit:[]}});}}else if(_==="lightning"&&E[_]<=0){let P=ge(a,l.x,l.y,h*.55);if(P===null){E[_]=0;continue}E[_]=m.cooldown[R]*Y.haste;let W=[],J={x:l.x,y:l.y-D},U=P;for(let de=0;de<m.count[R]&&U!==null;de++){let ce=a.get(U,Ne);if(!ce)break;let he=a.need(U,e),pe={x:he.x,y:he.y-ce.size*.4};st(a,J,pe,b===5?"coin":"primary"),W.push(U);let Be=ge(a,he.x,he.y,h*m.reach[R]*Y.area,W);B(a,U,C,"lightning"),J=pe,U=Be;}}else if(_==="drone"){K+=1.8*k;let P=a.query(ur),W=P.length||1,J=h*m.reach[R];for(let U of P){let de=a.need(U,ur),ce=K+de.index/W*Math.PI*2,he=a.need(U,e);if(he.x=l.x+Math.cos(ce)*J,he.y=l.y-D*1.1+Math.sin(ce)*J*.5,de.cd-=k,de.cd>0)continue;let pe=ge(a,he.x,he.y,h*.6);if(pe===null){de.cd=0;continue}de.cd=m.cooldown[R]*Y.haste;let Be=a.need(pe,e);He(a,he.x,he.y,Math.atan2(Be.y-he.y,Be.x-he.x),C,b===5?2:1,"drone","piece6",.7);}}}},st=(a,k,A,l)=>{let h=Math.hypot(A.x-k.x,A.y-k.y),D=Mt(a,(k.x+A.x)/2,(k.y+A.y)/2,{shape:"sprite",art:"zap",w:Math.max(8,h),h:Me()*.035,color:l,depth:34},{type:Ao,data:{life:.16}});a.need(D,e).rotation=Math.atan2(A.y-k.y,A.x-k.x);},Z=(a,k)=>{let A=Te(),l=at(),h=Me(),D=Ce(a),_=Math.hypot(D.w,D.h)*.75,b=a.query(Ne);for(let R of b){let C=a.get(R,Ne);if(!C)continue;let P=a.need(R,e),W=A.x-P.x,J=A.y-P.y,U=Math.hypot(W,J)||1;W/=U,J/=U;let de=C.kind==="boss"||C.kind==="miniboss";if(U>(de?_*1.3:_)){let Ye=Pe();P.x=Ye.x,P.y=Ye.y;continue}C.t-=k;let ce=C.speed,he=W,pe=J;if(C.kind==="archer"){let Ye=h*.3;if(U<Ye?ce*=-0.6:U<Ye*1.4&&(ce=0),C.t<=0&&U<h*.6){C.t=2.4,ze(a,R,"attack");let pt=260*Xe();Mt(a,P.x,P.y-C.size*.6,{shape:"sprite",art:"orb",w:h*.03,h:h*.03,color:"danger",depth:29},{type:Nn,data:{vx:W*pt,vy:J*pt,life:3,damage:C.damage}});}}else (C.kind==="charger"||C.kind==="miniboss"||C.kind==="boss")&&(C.phase==="walk"&&C.t<=0&&U<h*(de?.6:.38)?C.kind!=="boss"||C.next%3===0?(C.phase="wind",C.t=de?.7:.55,ze(a,R,"surprised"),G(a,{kind:"ring",x:P.x,y:P.y,color:"danger",size:C.size*2.2})):H(a,R,C):C.phase==="wind"?(ce=0,C.t<=0&&(C.phase="dash",C.t=de?.6:.45,C.vx=W,C.vy=J)):C.phase==="dash"&&(ce=C.speed*(de?4:3.6),he=C.vx,pe=C.vy,C.t<=0&&(C.phase="walk",C.t=de?C.hp<C.maxHp/2?1.6:2.4:2.8,C.kind==="boss"&&(C.next+=1))));P.x+=he*ce*k,P.y+=pe*ce*k;let Be=a.need(R,f);if(Be.shape==="actor"&&(Math.abs(A.x-P.x)>C.size*.4&&(Be.facing=A.x>=P.x?1:-1),Be.depth=Ht(a,P.y),Be.speed=Math.abs(ce),Be.pose=ce===0?"idle":C.kind==="brute"||de?"walk":"run"),U<(C.size+l)/2){if(C.kind==="bomber"){G(a,{kind:"ring",x:P.x,y:P.y,color:"piece6",size:h*.22}),c(a,C.damage),L(a,R,null,false);continue}if(ie<=0&&(ze(a,R,"attack"),c(a,C.damage),ke||Ws(a)))return}}let m=a.query(Ne);for(let R=0;R<m.length;R++){let C=a.need(m[R],Ne),P=a.need(m[R],e);for(let W=R+1;W<m.length;W++){let J=a.need(m[W],Ne),U=a.need(m[W],e),de=(C.size+J.size)*.42,ce=U.x-P.x,he=U.y-P.y,pe=ce*ce+he*he;if(pe>=de*de||pe===0)continue;let Be=Math.sqrt(pe),Ye=(de-Be)*.5,pt=ce/Be*Ye,Lt=he/Be*Ye,_n=C.kind==="boss"||C.kind==="miniboss",yn=J.kind==="boss"||J.kind==="miniboss";_n||(P.x-=pt,P.y-=Lt),yn||(U.x+=pt,U.y+=Lt);}}for(let R of a.query(Ur)){let C=a.need(R,Ur).of;if(!a.isAlive(C)||!a.has(C,Ne)){a.destroy(R);continue}let P=a.need(C,e),W=a.need(R,e);W.x=P.x,W.y=P.y+a.need(C,Ne).size*.55;let J=a.need(R,f);J.shape==="sprite"&&(J.alpha=.6+.3*Math.sin(a.time*6));}},H=(a,k,A)=>{let l=a.need(k,e),h=Me(),D=A.next%3;if(A.next+=1,A.t=A.hp<A.maxHp/2?1.4:2.2,D===1){let _=A.hp<A.maxHp/2?18:12,b=220*Xe();for(let m=0;m<_;m++){let R=m/_*Math.PI*2+a.time;Mt(a,l.x,l.y-A.size*.4,{shape:"sprite",art:"orb",w:h*.035,h:h*.035,color:"danger",depth:29},{type:Nn,data:{vx:Math.cos(R)*b,vy:Math.sin(R)*b,life:3.5,damage:A.damage*.6}});}ze(a,k,"attack"),G(a,{kind:"ring",x:l.x,y:l.y,color:"danger",size:A.size*3});}else {for(let _=0;_<6;_++){let b=_/6*Math.PI*2;Ke("swarm",{x:l.x+Math.cos(b)*A.size*1.6,y:l.y+Math.sin(b)*A.size*1.6});}ze(a,k,"cheer");}},X=(a,k)=>{let A=Ce(a),l=Te(),h=at(),D=Me()*.2;for(let b of a.query(fr)){let m=a.need(b,fr),R=a.need(b,e);if(R.x+=m.vx*k,R.y+=m.vy*k,m.life-=k,m.life<=0||R.x<-D||R.y<-D||R.x>A.w+D||R.y>A.h+D){a.destroy(b);continue}for(let C of a.query(Ne)){if(m.hit.includes(C))continue;let P=a.get(C,Ne);if(!P)continue;let W=a.need(C,e);if(!(Math.abs(W.x-R.x)>P.size/2+4||Math.abs(W.y-(R.y+P.size*.2))>P.size*.9+4)&&(m.hit.push(C),G(a,{kind:"burst",x:R.x,y:R.y,color:"coin",n:4,size:h*.5}),f$1(a,C,l.x,l.y,Me()*.01),B(a,C,m.damage,m.by),m.hit.length>=m.pierce)){a.destroy(b);break}}}for(let b of a.query(Nn)){let m=a.need(b,Nn),R=a.need(b,e);if(R.x+=m.vx*k,R.y+=m.vy*k,m.life-=k,m.life<=0){a.destroy(b);continue}if(Math.hypot(R.x-l.x,R.y-(l.y-h*.3))<h*.55&&(a.destroy(b),c(a,m.damage),ke||Ws(a)))return}let _=Me()*1.5;for(let b of a.query(Do)){let m=a.need(b,Do),R=a.need(b,e);if(R.rotation=(R.rotation??0)+k*14,m.back){let P=l.x-R.x,W=l.y-R.y,J=Math.hypot(P,W)||1;if(J<h*.5){a.destroy(b);continue}R.x+=P/J*_*k,R.y+=W/J*_*k;}else {let P=_*k*Math.max(.35,1-m.dist/m.range);R.x+=m.dx*P,R.y+=m.dy*P,m.dist+=P,m.dist>=m.range*.98&&(m.back=true,m.hit=[]);}let C=a.need(b,f).w*.5;for(let P of a.query(Ne)){if(m.hit.includes(P))continue;let W=a.get(P,Ne);if(!W)continue;let J=a.need(P,e);Math.hypot(J.x-R.x,J.y-R.y)>C+W.size*.5||(m.hit.push(P),f$1(a,P,R.x,R.y,Me()*.015),B(a,P,m.damage,"boomerang"));}}for(let b of a.query(Ao)){let m=a.need(b,Ao);m.life-=k;let R=a.need(b,f);R.shape==="sprite"&&(R.alpha=Math.max(0,m.life/.16)),m.life<=0&&a.destroy(b);}},q=(a,k)=>{let A=Te(),l=at(),D=a.query(jt).filter(_=>a.need(_,jt).kind==="xp");if(D.length>90){let _=D.map(P=>({e:P,d:Math.hypot(a.need(P,e).x-A.x,a.need(P,e).y-A.y)})).sort((P,W)=>W.d-P.d).slice(0,30),b=0,m=a.need(_[0].e,e),R=m.x,C=m.y;for(let P of _)b+=a.need(P.e,jt).value,a.destroy(P.e);Et("xp",R,C,Math.max(25,b));}for(let _ of a.query(jt)){let b=a.need(_,jt),m=a.need(_,e),R=Math.hypot(A.x-m.x,A.y-m.y);if(R<Y.magnet||b.pulled){b.pulled=true;let C=Me()*(b.kind==="xp"&&R>Y.magnet?2.4:1.4),P=Math.min(1,k*C/Math.max(1,R));m.x+=(A.x-m.x)*P,m.y+=(A.y-m.y)*P;}if(!(R>l*.6))if(a.destroy(_),b.kind==="coin")Fe(a,"coins",b.value),a.emit("coin-collected",{value:b.value}),G(a,{kind:"pop",x:A.x,y:A.y-l*1.6,text:`+${b.value}`,size:Math.round(l*.45)});else if(b.kind==="xp"){for(z+=b.value*Y.growth;z>=Ge(ne);)z-=Ge(ne),ne+=1,ae+=1;a.vars.xp_level=ne;}else if(b.kind==="food")Y.hp=Math.min(Y.maxHp,Y.hp+Y.maxHp*.25),a.vars.hp=Math.ceil(Y.hp),G(a,{kind:"ring",x:A.x,y:A.y,color:"accent",size:l*3});else if(b.kind==="magnet"){for(let C of a.query(jt))(a.need(C,jt).kind==="xp"||a.need(C,jt).kind==="coin")&&(a.need(C,jt).pulled=true);G(a,{kind:"ring",x:A.x,y:A.y,color:"coin",size:Me()*1.2});}else if(b.kind==="bomb"){let C=Ce(a);G(a,{kind:"flash",color:"#ffffff"}),G(a,{kind:"shake",power:2});for(let P of a.query(Ne)){let W=a.need(P,e);if(W.x<0||W.y<0||W.x>C.w||W.y>C.h)continue;let J=a.get(P,Ne);J&&B(a,P,J.kind==="boss"||J.kind==="miniboss"?J.maxHp*.1:J.hp+1,"bomb");}}else b.kind==="chest"&&(j$1+=1,G(a,{kind:"burst",x:A.x,y:A.y,color:"coin",n:20,size:l*2}));}N(a);},x=()=>{for(let k of [Ne,fr,Nn,jt,Xn,pr,ur,Do,Ao,Ur,Yn])nt(e$1,k);nt(e$1,Er),ct(),Ot(e$1,"top",void 0,{pan:true}),e$1.vars.field_x=0,e$1.vars.field_y=0,p=null,v=0,me=Kr(In(e$1,"meta:chapter")||1,o("duration")),oe=me.duration;let a=qe();M={[a.weapon]:1},O=a.passive?{[a.passive]:1}:{};for(let k of dr)E[k]=.4;z=0,ne=1,ae=0,j$1=0,ue=[],ie=0,xe=0,se=0,_e=false,ke=false,Ae=0,be=0,Se=false,Ee=null,Q=o("minibossEvery")>0?o("minibossEvery"):1/0,Re=o("eliteEvery")>0?o("eliteEvery")*.8:1/0,We=22,we=0,ee=null,Le=0,Y.maxHp=0,Y.hp=0,Wt(),Y.hp=Y.maxHp,e$1.vars.hp=Math.ceil(Y.hp),e$1.vars.hp_max=Y.maxHp,e$1.vars.time_left=oe,e$1.vars.xp_level=1,e$1.vars.kills=0,e$1.vars.bosses=0,e$1.vars.chapter=me.chapter,e$1.vars.choosing=false,e$1.vars.reviving=false,e$1.vars.boss_hp=0,e$1.vars.survivors_offer="",et(),le(e$1);};e$1.on(j,a=>{let k=a,A=e$1.vars.choosing===true||e$1.vars.reviving===true;k.type==="press"&&Je(e$1)&&!A?p={x:k.x,y:k.y}:k.type==="release"&&(p=null),k.type==="key"&&e$1.vars.choosing===true&&(k.key==="left"||k.key==="action"||k.key==="right")&&te(e$1,k.key==="left"?0:k.key==="action"?1:2);}),e$1.on(Hi,a=>te(e$1,Number(a.index??-1))),e$1.on(Vi,()=>{e$1.vars.choosing===true&&(e$1.vars.choosing=false,w(e$1,fe));}),e$1.on(Gt,()=>i(e$1)),e$1.on(Kt,()=>{e$1.vars.reviving===true&&(e$1.vars.reviving=false,u(e$1,"died"));}),e$1.on(Nt,x),e$1.on(zt,x),e$1.on(Bt,a=>{for(let k of e$1.query(Ne))Qe(e$1,k,"idle");d!==null&&e$1.isAlive(d)&&Qe(e$1,d,a.reason==="cleared"?"dance":"die"),ct(),nt(e$1,Yn);}),e$1.on(k,()=>{Ot(e$1,"top",void 0,{pan:true}),et(),Je(e$1)&&le(e$1);});let S=(a,k)=>{let A=p!==null&&r.pointer.down&&a.vars.choosing!==true,l=a.query(Yn);if(!A||p===null){for(let m of l)a.destroy(m);return}l.length===0&&(Mt(a,p.x,p.y,{shape:"circle",r:k,color:"#ffffff",alpha:.16,depth:70},{type:Yn,data:{part:0}}),Mt(a,p.x,p.y,{shape:"circle",r:k*.42,color:"#ffffff",alpha:.55,depth:71},{type:Yn,data:{part:1}}));let h=r.pointer.x-p.x,D=r.pointer.y-p.y,_=Math.hypot(h,D)||1,b=Math.min(1,k/_);for(let m of a.query(Yn)){let R=a.need(m,e);a.need(m,Yn).part===0?(R.x=p.x,R.y=p.y):(R.x=p.x+h*b,R.y=p.y+D*b);}};e$1.addSystem({id:"survivors",order:0,run(a,k){if(!Je(a)||d===null||ke)return;let A=a.vars.choosing===true||a.vars.reviving===true;for(let J of [d,...a.query(Ne)]){let U=a.get(J,f);U?.shape==="actor"&&(U.paused=A);}if(A)return;ye=Math.min(12,ye+k*10);let l=Ce(a);if(be+=k,!Se){let J=Math.max(0,oe-be);a.vars.time_left=J,J<=0&&tn(a);}ie>0&&(ie=Math.max(0,ie-k)),Y.regen>0&&Y.hp<Y.maxHp&&(Y.hp=Math.min(Y.maxHp,Y.hp+Y.regen*k),a.vars.hp=Math.ceil(Y.hp)),a.vars.hp_max=Y.maxHp;let h=Te(),D=Me()*.11,_=r.axis(),b=_.x,m=_.y,R=b!==0||m!==0?1:0;if(R===0&&p&&r.pointer.down){b=r.pointer.x-p.x,m=r.pointer.y-p.y;let J=Math.hypot(b,m);R=J<D*.18?0:Math.min(1,J/D);}S(a,D);let C=Math.hypot(b,m),P=C>0&&R>0;if(P){let J=b/C*Y.speed*R*k,U=m/C*Y.speed*R*k;for(let de of [...a.query(Ne),...a.query(fr),...a.query(Nn),...a.query(jt),...a.query(Er),...a.query(Do),...a.query(Ao)]){let ce=a.need(de,e);ce.x-=J,ce.y-=U;}ql(a,J,U),Fe(a,"field_x",J),Fe(a,"field_y",U),v+=k,v>.6&&vt(a,"survivors-move");}!ht(a,"survivors-move")&&!un(a)&&ft(a,"circle",{x:l.w/2,y:l.h*.8},{x:D*.6,y:0});let W=a.need(d,f);W.alpha=ie>0&&Math.floor(a.time*12)%2===0?.4:1,W.shape==="actor"&&(W.pose=P?"run":"idle",W.speed=Y.speed*Math.max(.3,R),P&&Math.abs(b)>C*.15&&(W.facing=b>0?1:-1),W.depth=Ht(a,h.y)+5e-4),Rt(a,k),Z(a,k),!(ke||Ws(a))&&(je(a,k,P),X(a,k),!(ke||Ws(a))&&(q(a,k),!ke&&(a.vars.score=xe*o("killScore")+Math.floor(be)*5+se*o("bossScore"),ot(a))));}}),e$1.vars.survivors_base=o("duration"),x();}};var Ks=[{id:"archer",base:{damage:6,type:"physical",range:2.6,rate:1.2,air:true,ground:true,shot:"td_arrow",shotSpeed:13},tiers:[{cost:70,stats:{},art:"td_archer1"},{cost:100,stats:{damage:9,range:2.8,rate:1.35},art:"td_archer2"},{cost:150,stats:{damage:14,range:3,rate:1.5},art:"td_archer3"}],branches:[{id:"ranger",cost:240,stats:{damage:17,rate:2.5,multishot:2,range:3.1},art:"td_archer_ranger"},{id:"sniper",cost:260,stats:{damage:72,rate:.5,range:4.6,pierce:1,crit:.2,shotSpeed:22},art:"td_archer_sniper"}],unlockLevel:1,metaVar:"meta:tower:archer"},{id:"cannon",base:{damage:12,type:"physical",range:2.3,rate:.5,air:false,ground:true,shot:"bomb",shotSpeed:6,lob:true,splash:.9},tiers:[{cost:110,stats:{},art:"td_cannon1"},{cost:150,stats:{damage:22,splash:1},art:"td_cannon2"},{cost:210,stats:{damage:36,splash:1.1,range:2.5},art:"td_cannon3"}],branches:[{id:"bombard",cost:300,stats:{damage:72,splash:1.5,rate:.42,range:2.8,stun:.25,stunTime:.6},art:"td_cannon_bombard"},{id:"flamer",cost:280,stats:{damage:20,splash:1,rate:.9,burn:12,burnTime:3},art:"td_cannon_flamer"}],unlockLevel:1,metaVar:"meta:tower:cannon"},{id:"mage",base:{damage:14,type:"magic",range:2.4,rate:.7,air:true,ground:true,shot:"orb",shotSpeed:9},tiers:[{cost:100,stats:{},art:"td_mage1"},{cost:140,stats:{damage:26},art:"td_mage2"},{cost:200,stats:{damage:42,range:2.6},art:"td_mage3"}],branches:[{id:"arcane",cost:300,stats:{damage:110,type:"true",rate:.55,range:2.9},art:"td_mage_arcane"},{id:"storm",cost:280,stats:{damage:32,rate:.9,chain:4,beam:true,shot:"zap"},art:"td_mage_storm"}],unlockLevel:3,metaVar:"meta:tower:mage"},{id:"frost",base:{damage:3,type:"magic",range:2.2,rate:.8,air:true,ground:true,shot:"crystal",shotSpeed:10,splash:.5,slow:.35,slowTime:1.6},tiers:[{cost:90,stats:{},art:"td_frost1"},{cost:120,stats:{damage:5,slow:.45,slowTime:1.9},art:"td_frost2"},{cost:170,stats:{damage:8,slow:.5,slowTime:2.2,splash:.7,range:2.4},art:"td_frost3"}],branches:[{id:"glacier",cost:260,stats:{damage:14,slow:.6,slowTime:2.6,stun:.15,stunTime:1},art:"td_frost_glacier"},{id:"blizzard",cost:260,stats:{damage:10,splash:1.4,slow:.5,slowTime:2.4,range:2.7},art:"td_frost_blizzard"}],unlockLevel:5,metaVar:"meta:tower:frost"}],Ui=6,Lo=.7,kn=e=>Ks.find(t=>t.id===e);function wo(e,t,n){let s=e.base;for(let o=1;o<Math.min(t,e.tiers.length);o++)s={...s,...e.tiers[o].stats};let r=n?e.branches.find(o=>o.id===n):void 0;return r?{...s,...r.stats}:s}function Po(e,t,n){let s=0;for(let o=0;o<Math.min(t,e.tiers.length);o++)s+=e.tiers[o].cost;let r=n?e.branches.find(o=>o.id===n):void 0;return s+(r?.cost??0)}var Fs=(e,t,n)=>(n?e.branches.find(s=>s.id===n)?.art:void 0)??e.tiers[Math.min(t,e.tiers.length)-1].art,hr=[{id:"grunt",cast:"foe",hp:1,speed:1,armor:0,resist:0,bounty:6,leak:1,size:.82,hit:.25,firstLevel:1,cost:1},{id:"runner",cast:"foe5",hp:.55,speed:1.8,armor:0,resist:0,bounty:4,leak:1,size:.72,hit:.15,firstLevel:2,cost:.7},{id:"brute",cast:"foe2",hp:2.6,speed:.7,armor:.6,resist:0,bounty:14,leak:2,size:1,hit:.5,firstLevel:3,cost:2.4,badge:"shield"},{id:"flyer",cast:"foe3",hp:.8,speed:1.2,armor:0,resist:0,flying:true,bounty:8,leak:1,size:.75,hit:0,firstLevel:4,cost:1.3,badge:"wing"},{id:"shaman",cast:"foe4",hp:1.6,speed:.9,armor:0,resist:.7,bounty:12,leak:1,size:.86,hit:.3,firstLevel:6,cost:2,badge:"orb"},{id:"healer",cast:"foe4",variant:7,hp:1.3,speed:.9,armor:.2,resist:.2,bounty:14,leak:1,size:.86,hit:.2,heals:{radius:1.6,share:.08,every:2},firstLevel:8,cost:2.2,badge:"potion"},{id:"splitter",cast:"foe2",variant:5,hp:2,speed:.85,armor:.2,resist:0,bounty:10,leak:2,size:.95,hit:.4,splits:{into:"spawnling",count:3},firstLevel:11,cost:2.6,badge:"skull"},{id:"spawnling",cast:"foe5",variant:3,hp:.35,speed:1.6,armor:0,resist:0,bounty:2,leak:1,size:.55,hit:.1,firstLevel:0,cost:.4},{id:"warlord",cast:"boss",hp:30,speed:.55,armor:.2,resist:0,bounty:120,leak:10,size:1.5,hit:2,summons:{id:"grunt",count:3,every:6},boss:1,firstLevel:0,cost:0},{id:"ironclad",cast:"boss",variant:4,hp:50,speed:.5,armor:.65,resist:0,bounty:160,leak:10,size:1.6,hit:2.5,enrage:{below:.5,speed:1.7},boss:2,firstLevel:0,cost:0,badge:"shield"},{id:"broodmother",cast:"boss",variant:9,hp:62,speed:.5,armor:.2,resist:.3,bounty:200,leak:10,size:1.6,hit:2.5,summons:{id:"spawnling",count:4,every:5},splits:{into:"spawnling",count:8},boss:3,firstLevel:0,cost:0,badge:"skull"},{id:"lich",cast:"boss",variant:13,hp:80,speed:.48,armor:.3,resist:.5,bounty:260,leak:15,size:1.7,hit:3,heals:{radius:2.2,share:.05,every:3},summons:{id:"shaman",count:2,every:7},boss:4,firstLevel:0,cost:0,badge:"orb"}],Qt=e=>hr.find(t=>t.id===e),qr=[{id:"meteor",icon:"td_meteor",kind:"strike",cooldown:35,unlockLevel:2,damage:2.2,count:3,radius:1.1,burn:.3},{id:"reinforce",icon:"shield",kind:"summon",cooldown:22,unlockLevel:4,count:2,cast:"helper",hp:4,dps:.6,time:14}],Sn=9,En=13,qi=[{id:"meadow-a",rows:["..S......",".o#o..t..","..#......","..#####o.",".o....#..","..t...#o.",".o#####..","..#..o..t","..#.*....","o.####o..","....o#...",".t...#.o.",".....X..."]},{id:"meadow-b",rows:["......S..",".t..o.#o.","......#..",".o#####..","..#..o...","..#.t..o.","..####...",".o..o#.t.","..*..#...","..####o..",".o#......","..#.o..t.","..X......"]},{id:"meadow-c",rows:[".S.......",".#.o..o..",".#.....#X",".#o.t.o#.",".#.....#.",".#o.o..#.",".#..r..#.",".#.o.o.#o",".#.....#.",".#o.*.o#.",".#######.","..o.o.o..","t.......t"]},{id:"meadow-boss",rows:["....S....","..o.#.o..","....#....",".####.o..",".#..o....",".#.o..t..",".#######.","..o.o..#.",".o.....#o","..######.","..#.o.o..",".o#......","..X......"]},{id:"river-a",rows:[".........","S####.o..",".o..#....","..o.#.~~.","....####.",".o.r...#.","...o...#o",".#######.",".#.o.o...",".#....r..",".####.o..","..o.#....","....X...."]},{id:"river-b",rows:[".S.....S.",".#.o.o.#.",".#..t..#.",".###.###.",".o.#o#.o.","...#.#...","..o###o..","....#....",".o..#.o..","...o#....","..r.#.o..",".o..#..t.","....X...."]},{id:"river-c",rows:["..~~.....","o...####S","..o.#..o.","....#.~~.",".####.~~.",".#..o....",".#.o..r..",".######o.","..o...#..",".~~.o.#..","X######o.","..o.o....","..~~...t."]},{id:"river-boss",rows:[".o.....o.","S##.o.##S","..#.r.#..",".o#####o.","....#....",".o..#.o..",".####..t.",".#..o..o.",".#.o.....",".#######.","..o.o..#.",".o.....#o",".......X."]},{id:"wood-a",rows:["..o...o..","S#######.",".o.....#.","...o.o.#o",".#####.#.",".#.o.#.#.",".#.X.#.#.",".#.###.#.",".#..o..#.",".#######.","..o.o.o..",".t..r..o.","........."]},{id:"wood-b",rows:["...S.....",".o.#..o..","...#.t...",".o.####o.","......#..",".o.o..#o.","......##X",".o.o..#o.","......#..",".o.####o.","...#.r...",".o.#..o..","...S....."]},{id:"wood-c",rows:[".o..o..o.",".#######S",".#.o..o..",".#######.","..o.o..#.",".#######.",".#..o..o.",".#######.","..o..o.#.",".#######.",".#.o..o..",".#..r..t.",".X......."]},{id:"wood-boss",rows:["....X....",".o..#..o.","..o.#....",".####.o..",".#..o..t.",".#.o..o..",".#######.","..o..o.#.",".o.....#.","..######.","..#.o..o.",".o#..r...","..S......"]},{id:"ash-a",rows:["....S....",".o..#..o.","S##.#.##S","..#.#.#..",".o#o#o#o.","..#####..",".o..#..o.","...o#o...",".t..#..t.",".o..#..o.","..r.#.r..",".o..#..o.","....X...."]},{id:"ash-b",rows:[".S.....S.",".#.o.o.#.",".#..o..#.",".###.###.","...#o#...",".o.#.#.o.","...#o#...",".###.###.",".#.o.o.#.",".#.....#.",".#######.","..o.#.o..","....X...."]},{id:"ash-c",rows:[".S.....X.",".#.###.#.",".#o#o#o#.",".#.#.#.#.",".#o#.#o#.",".#.#o#.#.","o#.#.#.#o",".#o#.#o#.",".#.#o#.#.",".#.#.#.#.",".#o#.#o#.",".###.###.","........."]},{id:"ash-boss",rows:[".o.....o.","S#.o.o.#S",".#.....#.",".#o.r.o#.",".#.....#.",".#o.X.o#.",".#..#..#.",".#o.#.o#.",".#..#..#.",".#.o#o.#.",".#######.","..o.o.o..",".t.....t."]}],Us=e=>qi.find(t=>t.id===e);function jr(e,t){return t==="x"?e.rows.map(n=>[...n].reverse().join("")):t==="y"?[...e.rows].reverse():e.rows}var $p=e=>e==="#"||e==="S"||e==="X";function Xr(e){let t=(O,E)=>e[E]?.[O],n=null,s=[],r=[];for(let O=0;O<e.length;O++)for(let E=0;E<e[O].length;E++){let I=t(E,O);I==="X"?n={col:E,row:O}:I==="S"?s.push({col:E,row:O}):I==="o"&&r.push({col:E,row:O});}if(!n)throw new Error("tower-defense map: no gate (X)");if(s.length===0)throw new Error("tower-defense map: no entry (S)");let o=new Map,d=(O,E)=>`${O},${E}`,p=[n];o.set(d(n.col,n.row),0);let v=[[0,1],[-1,0],[1,0],[0,-1]];for(;p.length>0;){let O=p.shift(),E=o.get(d(O.col,O.row));for(let[I,K]of v){let z=O.col+I,ne=O.row+K;!$p(t(z,ne))||o.has(d(z,ne))||(o.set(d(z,ne),E+1),p.push({col:z,row:ne}));}}let M=s.map(O=>{if(!o.has(d(O.col,O.row)))throw new Error(`tower-defense map: the entry ${O.col},${O.row} has no road to the gate`);let E=[O],I=O;for(;I.col!==n.col||I.row!==n.row;){let K=o.get(d(I.col,I.row)),z=v.map(([ne,ae])=>({col:I.col+ne,row:I.row+ae})).find(ne=>o.get(d(ne.col,ne.row))===K-1);E.push(z),I=z;}return E});return {rows:e,paths:M,gate:n,spots:r}}var ji=4,xn=5,Co=ji*xn,Xi=[0,9,24,39],Yi=[{map:"meadow-a",mirror:"none"},{map:"meadow-b",mirror:"none"},{map:"meadow-c",mirror:"none"},{map:"meadow-a",mirror:"x"},{map:"meadow-boss",mirror:"none"},{map:"river-a",mirror:"none"},{map:"river-b",mirror:"none"},{map:"river-c",mirror:"none"},{map:"river-a",mirror:"x"},{map:"river-boss",mirror:"none"},{map:"wood-a",mirror:"none"},{map:"wood-b",mirror:"none"},{map:"wood-c",mirror:"none"},{map:"wood-b",mirror:"x"},{map:"wood-boss",mirror:"none"},{map:"ash-a",mirror:"none"},{map:"ash-b",mirror:"none"},{map:"ash-c",mirror:"none"},{map:"ash-a",mirror:"y"},{map:"ash-boss",mirror:"none"}];function Bp(e){let t=e>>>0;return ()=>{t=t+1831565813>>>0;let n=t;return n=Math.imul(n^n>>>15,n|1),n^=n+Math.imul(n^n>>>7,n|61),((n^n>>>14)>>>0)/4294967296}}var Uc=hr.filter(e=>e.firstLevel>0).map(e=>e.id);function qc(e,t){let n=hr.filter(r=>r.firstLevel>0&&r.firstLevel<=e);if(!t)return n;let s=n.filter(r=>t.includes(r.id));return s.length>0?s:n}function jc(e,t){let n=hr.find(s=>s.firstLevel===e);return n&&(!t||t.includes(n.id))?n:void 0}function Ji(e,t,n){let s=Math.max(1,Math.min(Co,Math.floor(e))),r=Bp(s*7919+13),o=qc(s,n),d=jc(s,n),p=Math.ceil(s/xn),v=s%xn===0?hr.find(E=>E.boss===p):void 0,M=6+Math.floor((s-1)/2),O=[];for(let E=1;E<=M;E++){let I=5+E*1.6+s*.35,K=[],z=0,ne=0,ae=[];if(E===1)ae.push(o[0]);else {d&&E===2&&ae.push(d);let ue=Math.min(4,1+Math.floor(E/3));for(;ae.length<ue;)ae.push(o[Math.floor(r()*o.length)]);}let j=I/ae.length;for(let ue of ae){let fe=Math.max(1,Math.round(j/ue.cost)),ie=ue.speed>=1.5?.55:ue.hp>=2?1.3:.85;K.push({enemy:ue.id,count:fe,gap:ie,delay:z,entry:ne%Math.max(1,t)}),z+=fe*ie*.55+1,ne++;}v&&E===M&&K.push({enemy:v.id,count:1,gap:1,delay:z+2,entry:0}),O.push({groups:K});}return O}function Yr(e,t=.5,n){let s=Math.max(1,Math.min(Co,Math.floor(e))),r=Math.ceil(s/xn),o=s-(r-1)*xn,d=Yi[s-1],p=Xr(jr(Us(d.map),d.mirror)).paths.length;return {level:s,world:r,index:o,boss:o===xn,map:d.map,mirror:d.mirror,hp:16*Math.pow(1.075,s-1)*(.8+t*.4),waves:Ji(s,p,n),gold:220+(s-1)*25,bounty:1+(s-1)*.03,towers:Ks.filter(v=>v.unlockLevel<=s).map(v=>v.id),spells:qr.filter(v=>v.unlockLevel<=s).map(v=>v.id),branches:s>=Ui,fresh:jc(s,n)?.id??null,enemies:qc(s,n).map(v=>v.id),firstClearGold:(o===xn?150:60)+(s-1)*20}}var Zi=e=>Xi[Math.ceil(Math.max(1,e)/xn)-1]??0,qs=(e,t)=>e>=t*.9?3:e>=t*.5?2:1,js=5,Xc=20,Jr=[{id:"hero",cast:"hero",gems:0,perk:"none"},{id:"hero2",cast:"hero2",gems:150,perk:"gold"},{id:"hero3",cast:"hero3",gems:300,perk:"spells"}],Qi="kit-td",el=[{id:"StartGold",var:"meta:start_gold",art:"td_gold",color:"coin",perLevel:20,unit:"",maxLevel:10,price:40,growth:.12},{id:"Lives",var:"meta:lives",art:"heart",color:"danger",perLevel:1,unit:"",maxLevel:5,price:120,growth:.2},{id:"Archer",var:"meta:tower:archer",art:"td_archer1",color:"primary",perLevel:6,unit:"%",maxLevel:10,price:40,growth:.12},{id:"Cannon",var:"meta:tower:cannon",art:"td_cannon1",color:"primary",perLevel:6,unit:"%",maxLevel:10,price:40,growth:.12},{id:"Mage",var:"meta:tower:mage",art:"td_mage1",color:"primary",perLevel:6,unit:"%",maxLevel:10,price:45,growth:.12},{id:"Frost",var:"meta:tower:frost",art:"td_frost1",color:"primary",perLevel:6,unit:"%",maxLevel:10,price:45,growth:.12},{id:"Spells",var:"meta:spells",art:"td_meteor",color:"danger",perLevel:8,unit:"%",maxLevel:10,price:50,growth:.12}],Yc={game:"tower-defense",character:Qi,stats:el,heroes:Jr,levels:Co,firstClearGold:e=>Yr(e).firstClearGold,stars:3,starsToEnter:Zi};var zp="boss-spawned",Wp="boss-defeated",nl="wave-started",Js=b("td.spot"),sn=b("td.tower"),Oe=b("td.raider"),mr=b("td.missile"),hn=b("td.soldier"),Xs=b("td.meteor"),Jc=b("td.ground"),tl=b("td.part"),Zc=b("td.bar"),Ys=b("td.zap"),Io=(e,t)=>{let n=Number(e.vars[t]??0);return Number.isFinite(n)?n:0},Hp=.5,Vp=.55,Zs={id:"tower-defense",version:2,engines:["phaser"],requires:["round"],params:{difficulty:{type:"number",default:.5,min:0,max:1},lives:{type:"number",default:20,min:1,max:100,integer:true},gold:{type:"number",default:0,min:0,max:1e5,integer:true},wavePause:{type:"number",default:14,min:2,max:60},firstWait:{type:"number",default:25,min:1,max:600},earlyGold:{type:"number",default:2,min:0,max:100},coinRate:{type:"number",default:.15,min:0,max:1}},setup({world:e$1,params:t,mode:n}){let s=l=>nn(t,l),r=e$1.rng.stream("tower-defense"),o=pn(n,"foes",Uc),d=Yr(1,s("difficulty"),o),p=Xr(jr(Us(d.map),d.mirror)),v=[],M=we(),O=0,E=20,I=20,K=0,z=[],ne=0,ae=null,j$1=0,ue=0,fe=0,ie=false,xe=false,se=1,_e=null,Ae=[],be=null,oe=new Map,me=[],Se=null,Ee=new Map,Q=new Map,Re=()=>Jr.find(l=>l.id===e$1.vars["meta:hero"])??Jr[0],We=()=>e$1.vars.reviving===true;function we(){return Fn(Ce(e$1),Sn,En,{top:.15,bottom:.86,widthShare:.98})}let ee=()=>M.cell,Le=l=>M.left+l*M.cell,ye=l=>M.top+l*M.cell,ke=l=>({x:Le(l.col+.5),y:ye(l.row+.5)}),Ue=(l,h)=>({x:(l-M.left)/M.cell,y:(h-M.top)/M.cell}),Y=l=>l.row===0?{x:l.col+.5,y:-0.5}:l.row===En-1?{x:l.col+.5,y:En+.5}:l.col===0?{x:-0.5,y:l.row+.5}:l.col===Sn-1?{x:Sn+.5,y:l.row+.5}:null,Me=()=>{v=p.paths.map(l=>{let h=l.map(_=>({x:_.col+.5,y:_.row+.5})),D=Y(l[0]);return D&&h.unshift(D),{pts:h,len:h.length-1}});},Xe=(l,h)=>{if(h<=0)return l.pts[0];if(h>=l.len)return l.pts[l.len];let D=Math.floor(h),_=l.pts[D],b=l.pts[D+1],m=h-D;return {x:_.x+(b.x-_.x)*m,y:_.y+(b.y-_.y)*m}},at=new Set,Te=(l,h,D,_,b=1)=>{at.add(l);let m=Ee.get(l);(m===void 0||!e$1.isAlive(m))&&(m=e$1.create(),e$1.set(m,tl,{id:l}),Ee.set(l,m)),e$1.set(m,e,{x:h,y:D,scale:b}),e$1.set(m,f,_);},Wt=l=>{for(let[h,D]of [...Ee])at.has(h)||!l.some(_=>h.startsWith(_))||(e$1.destroy(D),Ee.delete(h));},Ge=l=>{for(let[h,D]of [...Ee])h.startsWith(l)&&(e$1.destroy(D),Ee.delete(h));},qe=(l,h,D,_)=>{let b=e$1.create();return e$1.set(b,Jc,{kind:l}),e$1.set(b,e,{x:h,y:D}),e$1.set(b,f,_),b},et=()=>{nt(e$1,Jc),nt(e$1,Js);let l=ee();qe("grass",Le(Sn/2),ye(En/2),{shape:"tile",art:"tile_grass",w:l*Sn,h:l*En,unit:l,color:"ground",depth:-10}),p.rows.forEach((R,C)=>[...R].forEach((P,W)=>{let J=ke({col:W,row:C}),U=J.y+l*.45;P==="#"||P==="S"||P==="X"?qe("road",J.x,J.y,{shape:"sprite",art:"tile_road",w:l+1,h:l+1,color:"lane",depth:-9}):P==="~"?qe("water",J.x,J.y,{shape:"rect",w:l+1,h:l+1,color:"primary",alpha:.45,depth:-9}):P==="t"?qe("tree",J.x,U-l*.65,{shape:"sprite",art:"td_tree",w:l*1.05,h:l*1.3,depth:Ht(e$1,U,5)}):P==="r"?qe("rock",J.x,U-l*.3,{shape:"sprite",art:"rock",w:l*.8,h:l*.6,depth:Ht(e$1,U,5)}):P==="*"&&qe("bush",J.x,U-l*.3,{shape:"sprite",art:"td_bush",w:l*.85,h:l*.6,depth:Ht(e$1,U,5)});})),p.spots.forEach((R,C)=>{let P=ke(R),W=qe("spot",P.x,P.y+l*.18,{shape:"sprite",art:"td_spot",w:l*.95,h:l*.62,depth:-8});e$1.set(W,Js,{index:C,col:R.col,row:R.row});});let h=ke(p.gate),D=Y(p.gate),_=D&&D.y>=0?D:null,b=_?Le(p.gate.col+.5+(_.x-(p.gate.col+.5))*.35):h.x,m=_?ye(p.gate.row+.5+(_.y-(p.gate.row+.5))*.35):h.y;qe("gate",b,m-l*.2,{shape:"sprite",art:"td_gate",w:l*1.35,h:l*1.35,depth:Ht(e$1,m+l*.45,5)});for(let R of p.paths){if(Y(R[0]))continue;let C=ke(R[0]);qe("portal",C.x,C.y-l*.1,{shape:"sprite",art:"td_portal",w:l*1.05,h:l*.95,depth:Ht(e$1,C.y,4)});}},rt=l=>e$1.query(sn).find(h=>e$1.need(h,sn).spot===l),lt=l=>{let h=e$1.need(l,sn),D=kn(h.kind),_=ke(p.spots[h.spot]),b=ee(),m=b*1.45,R=_.y+b*.42;e$1.set(l,e,{x:_.x,y:R-m/2}),e$1.set(l,f,{shape:"sprite",art:Fs(D,h.tier,h.branch||null),w:b*1.1,h:m,depth:Ht(e$1,R,5)});},ct=l=>{O=Math.max(0,Math.round(l)),e$1.vars.gold=O;},dt=(l,h)=>{let D=ke(p.spots[l]);G(e$1,{kind:"ring",x:D.x,y:D.y,color:h,size:ee()*1.5}),G(e$1,{kind:"burst",x:D.x,y:D.y-ee()*.4,color:h,n:10,size:ee()});},ot=(l,h)=>{let D=kn(h);if(!D||rt(l)!==void 0)return false;let _=D.tiers[0].cost;if(O<_)return false;ct(O-_);let b=e$1.create();return e$1.set(b,sn,{spot:l,kind:h,tier:1,branch:"",cooldown:.2}),lt(b),dt(l,"text"),e$1.emit("tower-built",{kind:h}),ht(e$1,"td-build")||(vt(e$1,"td-build"),X()),true},Pe=(l,h)=>{let D=rt(l);if(D===void 0)return false;let _=e$1.need(D,sn),b=kn(_.kind),m;if(h){let R=b.branches.find(C=>C.id===h);if(!R||_.branch||_.tier<b.tiers.length||!d.branches)return false;m=R.cost;}else {if(_.tier>=b.tiers.length)return false;m=b.tiers[_.tier].cost;}return O<m?false:(ct(O-m),h?_.branch=h:_.tier++,lt(D),dt(l,"coin"),e$1.emit("tower-upgraded",{kind:_.kind,tier:_.tier,branch:_.branch}),true)},bt=l=>{let h=rt(l);if(h===void 0)return false;let D=e$1.need(h,sn),_=Math.floor(Po(kn(D.kind),D.tier,D.branch||null)*Lo);ct(O+_);let b=ke(p.spots[l]);return G(e$1,{kind:"pop",x:b.x,y:b.y-ee()*.8,text:`+${_}`,color:"coin",size:Math.round(ee()*.3)}),G(e$1,{kind:"burst",x:b.x,y:b.y,color:"muted",n:12,size:ee()}),e$1.destroy(h),e$1.emit("tower-sold",{kind:D.kind}),true},Ke=()=>{_e=null,Ae=[],Ge("m:"),e$1.vars.td_menu="";},At=l=>l.map(h=>`${h.action??h.id}@${Math.round(h.x)},${Math.round(h.y)}`).join(";"),en=l=>{Ke(),_e=l,Rt();},Rt=()=>{if(_e===null)return;let l=_e;Ae=[];let h=ee(),D=Ce(e$1),_=Math.min(D.w,D.h),b=Math.max(h*.46,_*.062),m=Math.max(h*1.1,b*2.3),R=ke(p.spots[l]),C=Math.max(m+b,Math.min(D.w-m-b,R.x)),P=Math.max(D.h*.1+m+b,Math.min(D.h*.88-m-b,R.y-h*.2)),W=(pe,Be,Ye,pt,Lt,_n,yn)=>{let ln=C+Be*m,Wn=P+Ye*m;Ae.push({action:pe,x:ln,y:Wn,r:b,ok:yn}),e$1.vars.td_menu=At(Ae),Te(`m:${pe}:bg`,ln,Wn,{shape:"circle",r:b,color:"panel",alpha:.94,depth:60});let br=pe==="sell";Te(`m:${pe}:rim`,ln,Wn,{shape:"circle",r:b*1.08,color:br?"danger":yn?"coin":"muted",alpha:yn?.9:.5,depth:59.9}),Te(`m:${pe}:art`,ln,Wn-b*.12,{shape:"sprite",art:pt,w:br?b*1.25:b*1.15,h:br?b*1.25:b*1.3,alpha:yn?1:.45,depth:60.1}),_n&&Te(`m:${pe}:txt`,ln,Wn+b*.78,{shape:"text",text:_n,size:Math.round(b*.52),color:Lt!==null&&!yn?"danger":"coin",bold:true,depth:60.2});},J=rt(l);if(J===void 0){let pe=d.towers.map(Ye=>kn(Ye)).filter(Boolean),Be=pe.length<=1?[[0,-1]]:pe.length===2?[[-0.8,-0.7],[.8,-0.7]]:pe.length===3?[[-0.85,-0.6],[.85,-0.6],[0,.9]]:[[-0.8,-0.75],[.8,-0.75],[-0.8,.75],[.8,.75]];pe.slice(0,4).forEach((Ye,pt)=>{let Lt=Ye.tiers[0].cost;W(`build:${Ye.id}`,Be[pt][0],Be[pt][1],Ye.tiers[0].art,Lt,String(Lt),O>=Lt);});return}let U=e$1.need(J,sn),de=kn(U.kind),ce=wo(de,U.tier,U.branch||null);if(Te("m:range",R.x,R.y,{shape:"sprite",art:"aura_field",w:ce.range*h*2,h:ce.range*h*2,color:"primary",alpha:.4,depth:1}),U.tier<de.tiers.length){let pe=de.tiers[U.tier];W("up",0,-1,pe.art,pe.cost,String(pe.cost),O>=pe.cost);}else !U.branch&&d.branches&&de.branches.slice(0,2).forEach((pe,Be)=>W(`branch:${pe.id}`,Be===0?-0.85:.85,-0.7,pe.art,pe.cost,String(pe.cost),O>=pe.cost));let he=Math.floor(Po(de,U.tier,U.branch||null)*Lo);W("sell",0,1,"td_sell",null,`+${he}`,true);},tn=l=>{if(_e===null)return;let h=_e,D=false;if(l.startsWith("build:")?D=ot(h,l.slice(6)):l==="up"?D=Pe(h):l.startsWith("branch:")?D=Pe(h,l.slice(7)):l==="sell"&&(D=bt(h)),!D){G(e$1,{kind:"shake",power:.3});return}Ke();},Et=(l,h)=>{let D=ee(),_=-1,b=1/0;return p.spots.forEach((m,R)=>{let C=ke(m),P=rt(R)!==void 0?C.y-D*1.1:C.y-D*.5;if(Math.abs(l-C.x)>D*.55||h<P||h>C.y+D*.55)return;let W=Math.abs(l-C.x)+Math.abs(h-C.y);W<b&&(b=W,_=R);}),_},L=l=>1+.07*(l-1),B=(l,h,D,_)=>{let b=Qt(l);if(!b||v.length===0)return null;let m=b.hp*d.hp*(b.boss?1:L(_)),R=e$1.create();return e$1.set(R,Oe,{kind:l,hp:m,maxHp:m,route:h%v.length,progress:D,x:0,y:0,slow:0,slowLeft:0,stun:0,burn:0,burnLeft:0,healCd:b.heals?.every??0,summonCd:b.summons?.every??0,heldBy:-1,enraged:false,wave:_}),e$1.set(R,e,{x:0,y:0}),e$1.set(R,f,{shape:"actor",cast:b.cast,variant:b.variant??r.int(0,99),h:ee()*b.size*1.15,pose:b.flying?"air":"walk",depth:6}),f$1(R),b.boss&&(e$1.emit(zp,{kind:l}),G(e$1,{kind:"shake",power:1})),R},f$1=l=>{let h=e$1.need(l,Oe),D=Qt(h.kind),_=v[h.route],b=Xe(_,h.progress),m=Xe(_,h.progress+.05);h.x=b.x,h.y=b.y;let R=ee(),C=e$1.need(l,e),P=e$1.need(l,f),W=ye(b.y)+R*.2;if(C.x=Le(b.x),C.y=W-(D.flying?R*.55:0)-(P.shape==="actor"?P.h/2:0),P.shape==="actor"){Math.abs(m.x-b.x)>1e-4&&(P.facing=m.x>b.x?1:-1),P.depth=Ht(e$1,W,5),P.h=R*D.size*1.15;let J=h.heldBy<0&&h.stun<=0;P.pose=D.flying?"air":J?"walk":"idle",P.speed=D.speed*(1-h.slow)*R*se;}},c=l=>v[l.route].len-l.progress,y=l=>{let h=e$1.need(l,e);return {x:h.x,y:h.y}},i=(l,h,D,_,b=1,m="tower")=>{let R=e$1.get(l,Oe);if(!R)return;let C=Qt(R.kind),P=h.damage*D*b*(_?2:1);if(h.type==="physical"?P*=1-C.armor*(1-(h.pierce??0)):h.type==="magic"&&(P*=1-C.resist),h.slow&&(R.slow=Math.max(R.slow,h.slow*(C.boss?.5:1)),R.slowLeft=Math.max(R.slowLeft,(h.slowTime??1)*D)),h.burn&&(R.burn=Math.max(R.burn,h.burn*D),R.burnLeft=Math.max(R.burnLeft,h.burnTime??2)),h.stun&&!C.boss&&r.chance(h.stun)&&(R.stun=Math.max(R.stun,h.stunTime??.5)),_){let W=y(l);G(e$1,{kind:"pop",x:W.x,y:W.y-ee()*.5,text:String(Math.round(P)),color:"danger",size:Math.round(ee()*.3)});}u(l,P,m);},u=(l,h,D)=>{let _=e$1.get(l,Oe);_&&(_.hp-=h,_.hp<=0&&g(l,D));},g=(l,h)=>{let D=e$1.need(l,Oe),_=Qt(D.kind);e$1.remove(l,Oe),Qe(e$1,l,"die"),rr(e$1,l,1),ue++;let b=Math.round(_.bounty*d.bounty);ct(O+b);let m=y(l);if(G(e$1,{kind:"pop",x:m.x,y:m.y-ee()*.6,text:`+${b}`,color:"coin",size:Math.round(ee()*.28)}),e$1.emit("enemy-defeated",{kind:D.kind,by:h}),_.boss?(fe++,Fe(e$1,"coins",10),e$1.emit(Wp,{kind:D.kind}),G(e$1,{kind:"shake",power:1.4}),G(e$1,{kind:"flash",color:"coin"})):r.chance(s("coinRate"))&&(Fe(e$1,"coins",1),e$1.emit("coin-collected",{value:1})),_.splits)for(let R=0;R<_.splits.count;R++)B(_.splits.into,D.route,Math.max(0,D.progress-.18*R),D.wave);},T=l=>{let h=e$1.need(l,Oe),D=Qt(h.kind),_=ke(p.gate);G(e$1,{kind:"burst",x:_.x,y:_.y,color:"danger",n:12,size:ee()}),e$1.destroy(l),E=Math.max(0,E-D.leak),e$1.vars.lives=E,e$1.emit("player-hit",{lives:E}),G(e$1,{kind:"flash",color:"danger"}),G(e$1,{kind:"shake",power:D.boss?1.6:.8}),E<=0&&te();},w=()=>{if(!(K>=d.waves.length)){K++,e$1.vars.wave=K,z=[];for(let l of d.waves[K-1].groups)for(let h=0;h<l.count;h++)z.push({at:l.delay+h*l.gap,enemy:l.enemy,entry:l.entry});z.sort((l,h)=>l.at-h.at),ne=0,ae=null,e$1.emit(nl,{wave:K});}},N=()=>{if(!(ae===null||K>=d.waves.length)){if(K>0){let l=Math.ceil(ae*s("earlyGold")*d.bounty);if(l>0){ct(O+l);let h=me.find(D=>D.id.startsWith("call"));h&&G(e$1,{kind:"pop",x:h.x,y:h.y-ee()*.6,text:`+${l}`,color:"coin",size:Math.round(ee()*.32)});}}vt(e$1,"td-call"),w();}},$=l=>{if(ie||!Je(e$1))return;ie=true;let h=l==="defended",D=h?Math.min(xe?1:3,qs(E,I)):0;e$1.vars.stars=D,h&&e$1.vars["meta:first_clear"]===true&&Fe(e$1,"coins",d.firstClearGold),e$1.vars.score=ge()+(h?1e3+D*300:0),e$1.vars.reviving=false,Ke(),e$1.emit($t,{reason:l,stats:{chapter:d.level,seconds:Math.floor(j$1),cleared:h,stars:D,coins:Number(e$1.vars.coins??0),bosses:fe,kills:ue,lives:E}});},te=()=>{if(e$1.vars.revive_ready===true&&!xe){e$1.vars.reviving=true,Ke(),e$1.emit(Vt,{});return}$("overrun");},le=()=>{if(We()){xe=true,e$1.vars.reviving=false,E=js,e$1.vars.lives=E;for(let l of e$1.query(Oe))e$1.need(l,Oe).stun=2;G(e$1,{kind:"flash",color:"coin"});}},ge=()=>ue*10+E*50+Math.max(0,K-1)*100,He=()=>1+Io(e$1,"meta:spells"),je=(l,h,D)=>{let _=qr.find(R=>R.id===l);if(!_||(oe.get(l)??0)>0)return;let b=Ue(h,D);if(b.x<-0.5||b.y<-0.5||b.x>Sn+.5||b.y>En+.5)return;if(_.kind==="strike")for(let R=0;R<(_.count??1);R++){let C=e$1.create(),P=(_.radius??1)*.9;e$1.set(C,Xs,{x:b.x+(R===0?0:(r.next()-.5)*P*2),y:b.y+(R===0?0:(r.next()-.5)*P*2),t:0,delay:R*.2,damage:(_.damage??1)*d.hp*He(),radius:_.radius??1,burn:(_.burn??0)*d.hp*He()}),e$1.set(C,e,{x:-999,y:-999}),e$1.set(C,f,{shape:"sprite",art:"td_meteor",w:ee()*.9,h:ee()*.9,alpha:0,depth:45});}else {let R={route:0,q:0,d:1/0};v.forEach((P,W)=>{for(let J=.5;J<=P.len-.5;J+=.25){let U=Xe(P,J),de=Math.hypot(U.x-b.x,U.y-b.y);de<R.d&&(R={route:W,q:J,d:de});}});let C=_.count??1;for(let P=0;P<C;P++){let W=e$1.create(),J=(_.hp??3)*d.hp*He();e$1.set(W,hn,{hp:J,maxHp:J,dps:(_.dps??.5)*d.hp*He(),left:_.time??12,route:R.route,progress:Math.max(.3,Math.min(v[R.route].len-.3,R.q+(P-(C-1)/2)*.45)),swing:0}),e$1.set(W,e,{x:0,y:0}),e$1.set(W,f,{shape:"actor",cast:_.cast??"helper",variant:r.int(0,99),h:ee()*.85,pose:"idle",depth:6}),st(W);let U=e$1.need(W,e);G(e$1,{kind:"ring",x:U.x,y:U.y,color:"accent",size:ee()*1.2});}}let m=_.cooldown*(Re().perk==="spells"?.7:1);oe.set(l,m),be=null,Se!==null&&e$1.isAlive(Se)&&ze(e$1,Se,"attack"),e$1.emit("spell-cast",{id:l});},st=l=>{let h=e$1.need(l,hn),D=v[h.route],_=Xe(D,h.progress),b=Xe(D,h.progress-.2),m=ee(),R=e$1.need(l,e),C=e$1.need(l,f),P=ye(_.y)+m*.2;R.x=Le(_.x),R.y=P-(C.shape==="actor"?C.h/2:0),C.shape==="actor"&&(Math.abs(b.x-_.x)>1e-4&&(C.facing=b.x>_.x?1:-1),C.depth=Ht(e$1,P,5),C.h=m*.85);},Z=()=>{(Se===null||!e$1.isAlive(Se))&&(Se=e$1.create());let l=ee(),h=p.gate,D=[[1,0],[-1,0],[0,-1],[0,1]].map(([m,R])=>({col:h.col+m,row:h.row+R})).find(m=>m.col>=0&&m.row>=0&&m.col<Sn&&m.row<En&&".tr*".includes(p.rows[m.row][m.col]))??h,_=ke(D),b=_.y+l*.35;e$1.set(Se,e,{x:_.x,y:b-l*.6}),e$1.set(Se,f,{shape:"actor",cast:Re().cast,h:l*1.2,pose:"idle",facing:D.col>h.col?-1:1,depth:Ht(e$1,b,5)});},H=()=>{if(ht(e$1,"td-build")||p.spots.length===0)return;let l=v[0],h=Xe(l,l.len*.4),D=0,_=1/0;p.spots.forEach((b,m)=>{let R=Math.hypot(b.col+.5-h.x,b.row+.5-h.y);R<_&&(_=R,D=m);}),ft(e$1,"tap",ke(p.spots[D]),void 0,ee()*1.2);},X=()=>{if(ht(e$1,"td-call")||K>0)return;let l=ke(p.paths[0][0]);ft(e$1,"tap",l,void 0,ee()*1.2);},q=()=>{let l=Ce(e$1),h=Math.min(l.w,l.h),D=ee(),_=l.h*.085,b=h*.05,m=(U,de,ce,he,pe="text",Be=h*.042)=>Te(U,de,ce,{shape:"text",text:he,size:Math.round(Be),color:pe,bold:true,depth:70});Te("h:lives:i",l.w*.07,_,{shape:"sprite",art:"heart",w:b,h:b,depth:70}),m("h:lives",l.w*.15,_,String(E),E<=5?"danger":"text"),Te("h:gold:i",l.w*.3,_,{shape:"sprite",art:"td_gold",w:b*1.15,h:b,depth:70}),m("h:gold",l.w*.4,_,String(O),"coin"),Te("h:wave:i",l.w*.56,_,{shape:"sprite",art:"td_call",w:b,h:b,depth:70}),m("h:wave",l.w*.66,_,`${K}/${d.waves.length}`),Te("h:coin:i",l.w*.8,_,{shape:"sprite",art:"coin",w:b*.9,h:b*.9,depth:70}),m("h:coin",l.w*.89,_,String(e$1.vars.coins??0));let R=l.h*.125,C=e$1.query(Oe).find(U=>Qt(e$1.need(U,Oe).kind)?.boss);if(C!==void 0){let U=e$1.need(C,Oe),de=l.w*.55,ce=Math.max(10,h*.022);Te("h:n:boss:bg",l.w/2,R,{shape:"rect",w:de,h:ce,color:"#000000",alpha:.5,radius:ce/2,depth:69});let he=Math.max(1,(de-4)*Math.max(0,U.hp/U.maxHp));Te("h:n:boss:fill",l.w/2-(de-4)/2+he/2,R,{shape:"rect",w:he,h:ce-4,color:"danger",radius:(ce-4)/2,depth:69.1}),Te("h:n:boss:i",l.w/2-de/2-b*.7,R,{shape:"sprite",art:"skull",w:b,h:b,depth:70});}else if(ae!==null&&K<d.waves.length){let U=new Map;for(let pe of d.waves[K].groups)U.set(pe.enemy,(U.get(pe.enemy)??0)+pe.count);let de=[...U].slice(0,5),ce=h*.15,he=l.w/2-(de.length-1)*ce/2;de.forEach(([pe,Be],Ye)=>{let pt=Qt(pe),Lt=he+Ye*ce;Te(`h:n:${pe}:a`,Lt-b*.4,R+b*.1,{shape:"actor",cast:pt.cast,variant:pt.variant??1,h:b*1.5*Math.min(1.3,pt.size+.25),pose:pt.flying?"air":"idle",depth:70}),m(`h:n:${pe}:t`,Lt+b*.55,R+b*.1,`\xD7${Be}`,pt.boss?"danger":"text",h*.034);});}if(me=[],ae!==null&&K<d.waves.length){let U=K===0?1+.08*Math.sin(e$1.time*6):1;p.paths.forEach((de,ce)=>{let he=ke(de[0]),pe=D*.42;me.push({id:`call:${ce}`,x:he.x,y:he.y,r:pe*1.2}),Te(`b:call:${ce}:bg`,he.x,he.y,{shape:"circle",r:pe,color:"danger",alpha:.92,depth:65},U),Te(`b:call:${ce}:i`,he.x,he.y,{shape:"sprite",art:"td_call",w:pe*1.3,h:pe*1.3,depth:65.1},U),Te(`b:call:${ce}:t`,he.x,he.y+pe*1.25,{shape:"text",text:String(Math.ceil(ae??0)),size:Math.round(D*.26),color:"text",bold:true,depth:65.2});});}let P=l.h*.925,W=h*.065;qr.filter(U=>d.spells.includes(U.id)).forEach((U,de)=>{let ce=l.w*.12+de*W*2.6,he=oe.get(U.id)??0;me.push({id:`spell:${U.id}`,x:ce,y:P,r:W*1.15}),be===U.id&&Te(`b:s:${U.id}:rim`,ce,P,{shape:"circle",r:W*1.18,color:"coin",alpha:.6+.4*Math.sin(e$1.time*8),depth:64.9}),Te(`b:s:${U.id}:bg`,ce,P,{shape:"circle",r:W,color:"panel",alpha:.92,depth:65}),Te(`b:s:${U.id}:i`,ce,P,{shape:"sprite",art:U.icon,w:W*1.25,h:W*1.25,alpha:he>0?.4:1,depth:65.1}),he>0&&Te(`b:s:${U.id}:t`,ce,P,{shape:"text",text:String(Math.ceil(he)),size:Math.round(W*.8),color:"text",bold:true,depth:65.2});});let J=l.w*.88;me.push({id:"speed",x:J,y:P,r:W*1.15}),Te("b:speed:bg",J,P,{shape:"circle",r:W,color:se>1?"coin":"panel",alpha:.92,depth:65}),e$1.vars.td_buttons=At(me),Te("b:speed:t",J,P,{shape:"text",text:`x${se}`,size:Math.round(W*.75),color:se>1?"panel":"text",bold:true,depth:65.1});},x=()=>{let l=ee(),h=new Set,D=(_,b,m,R,C)=>{h.add(_);let P=Q.get(_);if(!P){P=[e$1.create(),e$1.create(),e$1.create(),e$1.create(),e$1.create()];for(let[Lt,_n]of P.entries())e$1.set(_n,Zc,{of:_,part:String(Lt)});Q.set(_,P);}let W=e$1.need(_,e),J=e$1.need(_,f),U=J.shape==="actor"?J.h:l,de=W.y-U/2-l*.08,ce=Math.min(Ce(e$1).w,Ce(e$1).h),he=Math.max(l*.62,ce*.065),pe=Math.max(5,he*.13),Be=b<.999;e$1.set(P[0],e,{x:W.x,y:de}),e$1.set(P[0],f,{shape:"rect",w:he,h:pe,color:"#000000",alpha:Be?.55:0,radius:pe/2,depth:30});let Ye=Math.max(1,(he-2)*Math.max(0,b));e$1.set(P[1],e,{x:W.x-(he-2)/2+Ye/2,y:de}),e$1.set(P[1],f,{shape:"rect",w:Ye,h:pe-2,color:m,alpha:Be?1:0,radius:(pe-2)/2,depth:30.1}),e$1.set(P[2],e,{x:W.x-he/2-l*.12,y:de}),e$1.set(P[2],f,{shape:"sprite",art:R??"shield",w:l*.24,h:l*.24,alpha:R?1:0,depth:30.2});let pt=W.y+U/2;e$1.set(P[3],e,{x:W.x,y:pt}),e$1.set(P[3],f,{shape:"sprite",art:"aura_field",w:l*.75,h:l*.32,color:"primary",alpha:C?.slow?.75:0,depth:2}),e$1.set(P[4],e,{x:W.x,y:W.y}),e$1.set(P[4],f,{shape:"sprite",art:"burst",w:l*.45,h:l*.45,color:"danger",alpha:C?.burn?.5+.4*Math.sin(e$1.time*20):0,depth:29});};for(let _ of e$1.query(Oe)){let b=e$1.need(_,Oe);D(_,b.hp/b.maxHp,"danger",Qt(b.kind)?.badge,{slow:b.slowLeft>0,burn:b.burnLeft>0});}for(let _ of e$1.query(hn)){let b=e$1.need(_,hn);D(_,b.hp/b.maxHp,"accent",void 0,null);}for(let[_,b]of [...Q])if(!h.has(_)){for(let m of b)e$1.destroy(m);Q.delete(_);}},S=()=>{for(let l of [sn,Oe,mr,hn,Xs,Ys,Zc,tl])nt(e$1,l);Ee.clear(),Q.clear();for(let l of e$1.query(f))e$1.need(l,f).shape==="actor"&&l!==Se&&!e$1.has(l,tl)&&e$1.destroy(l);},a=()=>{S(),d=Yr(Io(e$1,"meta:chapter")||1,s("difficulty"),o),p=Xr(jr(Us(d.map),d.mirror)),Me(),Ot(e$1,"top"),M=we(),et(),O=0,ct((d.gold+s("gold")+Io(e$1,"meta:start_gold"))*(Re().perk==="gold"?1.25:1)),I=s("lives")+Io(e$1,"meta:lives"),E=I,K=0,z=[],ne=0,ae=s("firstWait"),j$1=0,ue=0,fe=0,ie=false,xe=false,se=1,_e=null,Ae=[],be=null,oe.clear(),me=[],e$1.vars.lives=E,e$1.vars.wave=0,e$1.vars.waves=d.waves.length,e$1.vars.td_level=d.level,e$1.vars.td_world=d.world,e$1.vars.coins=0,e$1.vars.score=0,e$1.vars.stars=0,e$1.vars.reviving=false,e$1.vars.td_speed=1,e$1.vars.level_progress=0,Z();},k$1=l=>{if(l.startsWith("call"))N();else if(l==="speed")se=se>1?1:2,e$1.vars.td_speed=se;else if(l.startsWith("spell:")){let h=l.slice(6);be===h?be=null:(oe.get(h)??0)<=0&&(be=h,Ke());}};e$1.on(j,l=>{let h=l;if(h.type!=="tap"||!Je(e$1)||Kn(e$1)||ie||We())return;if(_e!==null){let b=Ae.find(m=>Math.hypot(h.x-m.x,h.y-m.y)<=m.r);if(b){tn(b.action);return}Ke();}let D=me.find(b=>Math.hypot(h.x-b.x,h.y-b.y)<=b.r);if(D){k$1(D.id);return}if(be!==null){je(be,h.x,h.y);return}let _=Et(h.x,h.y);_>=0&&(ht(e$1,"td-build")||Dt(e$1),en(_));}),e$1.on(Nt,()=>{a(),e$1.vars.level=d.level,H();}),e$1.on(zt,a),e$1.on(Gt,le),e$1.on(Kt,()=>{We()&&(e$1.vars.reviving=false,$("overrun"));}),e$1.on(Bt,l=>{Ke(),Ge("b:"),me=[],Se!==null&&e$1.isAlive(Se)&&Qe(e$1,Se,l.reason==="defended"?"dance":"die");for(let h of e$1.query(Oe))Qe(e$1,h,"idle");}),e$1.on(k,()=>{Ot(e$1,"top"),M=we(),et();for(let l of e$1.query(sn))lt(l);nt(e$1,mr),_e!==null&&Rt(),Z();}),e$1.addSystem({id:"tower-defense",order:0,run(l,h){if(!Je(l)||ie||We())return;let D=h*se;j$1+=h;let _=ee();for(let[b,m]of oe)m>0&&oe.set(b,Math.max(0,m-D));if(z.length>0){for(ne+=D;z.length>0&&z[0].at<=ne;){let b=z.shift();B(b.enemy,b.entry,0,K);}z.length===0&&K<d.waves.length&&(ae=s("wavePause"));}else ae!==null&&(ae-=D,ae<=0&&w());for(let b of l.query(hn)){let m=l.need(b,hn);if(m.left-=D,m.left<=0||m.hp<=0){l.remove(b,hn),Qe(l,b,"die"),rr(l,b,.8);for(let P of l.query(Oe))l.need(P,Oe).heldBy===b&&(l.need(P,Oe).heldBy=-1);continue}let R=Xe(v[m.route],m.progress),C=l.query(Oe).filter(P=>l.need(P,Oe).heldBy===b);if(C.length<2){let P=l.query(Oe).filter(W=>{let J=l.need(W,Oe),U=Qt(J.kind);return J.heldBy<0&&!U.flying&&!U.boss&&Math.hypot(J.x-R.x,J.y-R.y)<=Vp}).slice(0,2-C.length);for(let W of P)l.need(W,Oe).heldBy=b,C.push(W);}C.length>0&&(u(C[0],m.dps*D,"soldier"),m.swing-=D,m.swing<=0&&(ze(l,b,"attack"),m.swing=.6)),st(b);}for(let b of l.query(Oe)){let m=l.get(b,Oe);if(!m)continue;let R=Qt(m.kind);if(!(m.burnLeft>0&&(m.burnLeft-=D,u(b,m.burn*D,"burn"),!l.has(b,Oe)))){if(m.slowLeft>0&&(m.slowLeft-=D,m.slowLeft<=0&&(m.slow=0)),m.stun>0&&(m.stun-=D),R.heals&&(m.healCd-=D,m.healCd<=0)){m.healCd=R.heals.every;for(let P of l.query(Oe)){let W=l.need(P,Oe);Math.hypot(W.x-m.x,W.y-m.y)>R.heals.radius||(W.hp=Math.min(W.maxHp,W.hp+W.maxHp*R.heals.share));}let C=y(b);G(l,{kind:"ring",x:C.x,y:C.y,color:"accent",size:R.heals.radius*_*2});}if(R.summons&&(m.summonCd-=D,m.summonCd<=0)){m.summonCd=R.summons.every;for(let C=0;C<R.summons.count;C++)B(R.summons.id,m.route,Math.max(0,m.progress-.45*(C+1)),m.wave);ze(l,b,"cheer");}if(R.enrage&&!m.enraged&&m.hp<m.maxHp*R.enrage.below){m.enraged=true;let C=y(b);G(l,{kind:"ring",x:C.x,y:C.y,color:"danger",size:_*2});}if(m.heldBy>=0&&!l.has(m.heldBy,hn)&&(m.heldBy=-1),m.heldBy<0&&m.stun<=0&&(m.progress+=R.speed*(1-m.slow)*(m.enraged&&R.enrage?R.enrage.speed:1)*D),m.progress>=v[m.route].len){if(T(b),ie||We())return;continue}f$1(b);}}for(let b of l.query(sn)){let m=l.need(b,sn);if(m.cooldown-=D,m.cooldown>0)continue;let R=kn(m.kind),C=wo(R,m.tier,m.branch||null),P=1+Io(l,R.metaVar),W=p.spots[m.spot],J=W.col+.5,U=W.row+.5,de=l.query(Oe).filter(he=>{let pe=l.need(he,Oe);return (Qt(pe.kind).flying?C.air:C.ground)&&pe.progress>0&&Math.hypot(pe.x-J,pe.y-U)<=C.range}).sort((he,pe)=>c(l.need(he,Oe))-c(l.need(pe,Oe))).slice(0,C.multishot??1);if(de.length===0){m.cooldown=0;continue}m.cooldown=1/C.rate;let ce={x:Le(J),y:ye(U)-_*.75};for(let he of de){let pe=C.crit!==void 0&&r.chance(C.crit);if(C.beam){let _n=[],yn=ce,ln=he,Wn=1;for(let br=0;br<=(C.chain??0)&&ln!==void 0;br++){let Pl=y(ln);A(yn,Pl,C.type==="magic"?"secondary":"primary"),_n.push(ln);let vr=l.need(ln,Oe),zd=l.query(Oe).filter(xr=>!_n.includes(xr)&&Math.hypot(l.need(xr,Oe).x-vr.x,l.need(xr,Oe).y-vr.y)<=1.6).sort((xr,Cl)=>Math.hypot(l.need(xr,Oe).x-vr.x,l.need(xr,Oe).y-vr.y)-Math.hypot(l.need(Cl,Oe).x-vr.x,l.need(Cl,Oe).y-vr.y))[0];i(ln,C,P,pe,Wn),yn=Pl,ln=zd,Wn*=.7;}continue}let Be=y(he),Ye=l.create(),pt=Math.max(1,Math.hypot(Be.x-ce.x,Be.y-ce.y));l.set(Ye,mr,{target:he,x:ce.x,y:ce.y,ax:Be.x,ay:Be.y,dist0:pt,went:0,stats:C,power:P,crit:pe}),l.set(Ye,e,{x:ce.x,y:ce.y});let Lt=C.shot==="td_arrow"?{w:_*.55,h:_*.18}:C.lob?{w:_*.34,h:_*.34}:{w:_*.3,h:_*.3};l.set(Ye,f,{shape:"sprite",art:C.shot,...Lt,...C.burn?{color:"danger"}:C.slow?{color:"primary"}:C.type==="magic"?{color:"secondary"}:{},depth:40});}}for(let b of l.query(mr)){let m=l.need(b,mr);if(l.has(m.target,Oe)){let U=y(m.target);m.ax=U.x,m.ay=U.y;}let R=m.ax-m.x,C=m.ay-m.y,P=Math.hypot(R,C),W=m.stats.shotSpeed*_*D,J=l.need(b,e);if(P>W){m.x+=R/P*W,m.y+=C/P*W,m.went+=W;let U=Math.min(1,m.went/m.dist0);J.x=m.x,J.y=m.y-(m.stats.lob?Math.sin(Math.PI*U)*_*.9:0),J.rotation=m.stats.lob?(J.rotation??0)+D*8:Math.atan2(C,R);continue}if(l.destroy(b),m.stats.splash){let U=Ue(m.ax,m.ay);G(l,{kind:"burst",x:m.ax,y:m.ay,color:m.stats.burn?"danger":m.stats.slow?"primary":"coin",n:12,size:m.stats.splash*_*1.6}),m.stats.lob&&G(l,{kind:"shake",power:.25});for(let de of l.query(Oe)){let ce=l.need(de,Oe),he=Qt(ce.kind);(he.flying?m.stats.air:m.stats.ground)&&Math.hypot(ce.x-U.x,ce.y+(he.flying?-0.55:0)-U.y)<=m.stats.splash&&i(de,m.stats,m.power,m.crit);}}else l.has(m.target,Oe)&&(G(l,{kind:"burst",x:m.ax,y:m.ay,color:m.stats.type==="magic"?"secondary":"coin",n:5,size:_*.5}),i(m.target,m.stats,m.power,m.crit));if(ie||We())return}for(let b of l.query(Xs)){let m=l.need(b,Xs);m.t+=D;let R=(m.t-m.delay)/Hp,C=l.need(b,e),P=l.need(b,f);if(R<0)continue;if(R<1){let J=Ce(l).h;C.x=Le(m.x)+(1-R)*_*2,C.y=ye(m.y)-(1-R)*J*.5,C.rotation=-0.9,P.shape==="sprite"&&(P.alpha=1);continue}l.destroy(b),G(l,{kind:"burst",x:Le(m.x),y:ye(m.y),color:"danger",n:20,size:m.radius*_*2}),G(l,{kind:"ring",x:Le(m.x),y:ye(m.y),color:"coin",size:m.radius*_*2.2}),G(l,{kind:"shake",power:.8});let W={damage:m.damage,type:"true",...m.burn>0?{burn:m.burn,burnTime:2}:{}};for(let J of l.query(Oe)){let U=l.need(J,Oe);Math.hypot(U.x-m.x,U.y-m.y)<=m.radius&&i(J,W,1,false,1,"spell");}if(ie||We())return}for(let b of l.query(Ys)){let m=l.need(b,Ys);m.life-=h,m.life<=0&&l.destroy(b);}if(K>=d.waves.length&&z.length===0&&l.query(Oe).length===0){$("defended");return}l.vars.level_progress=d.waves.length>0?Math.min(1,(K-(z.length>0||l.query(Oe).length>0?.5:0))/d.waves.length):0,l.vars.score=ge(),at.clear(),_e!==null&&Rt(),x(),q(),Wt(["m:","h:","b:"]);}});let A=(l,h,D)=>{let _=Math.hypot(h.x-l.x,h.y-l.y),b=e$1.create();e$1.set(b,Ys,{life:.16}),e$1.set(b,e,{x:(l.x+h.x)/2,y:(l.y+h.y)/2,rotation:Math.atan2(h.y-l.y,h.x-l.x)}),e$1.set(b,f,{shape:"sprite",art:"zap",w:Math.max(8,_),h:ee()*.22,color:D,depth:41});};Me(),a();}};var No=[{id:"lemon",art:"biz1",color:"coin",cost:4,income:1,cycle:1,growth:1.07,manager:60},{id:"bakery",art:"biz2",color:"accent",cost:50,income:17,cycle:2,growth:1.1,manager:600},{id:"cafe",art:"biz3",color:"secondary",cost:600,income:225,cycle:3,growth:1.11,manager:7e3},{id:"workshop",art:"biz4",color:"primary",cost:7e3,income:2800,cycle:4,growth:1.11,manager:8e4},{id:"cinema",art:"ty_cinema",color:"danger",cost:8e4,income:4e4,cycle:6,growth:1.11,manager:1e6},{id:"hotel",art:"biz6",color:"secondary",cost:9e5,income:51e4,cycle:8,growth:1.11,manager:11e6},{id:"bank",art:"biz5",color:"coin",cost:1e7,income:62e5,cycle:10,growth:1.11,manager:12e7},{id:"port",art:"ty_port",color:"primary",cost:12e7,income:8e7,cycle:12,growth:1.11,manager:15e8}],yr=e=>No.find(t=>t.id===e),$o=[{at:10,speed:2},{at:25,speed:2},{at:50,speed:2},{at:75,income:3},{at:100,speed:2},{at:150,income:3}],ea=.1,ta=[{id:"double",scope:"one",art:"ty_up",mult:2,price:60,after:5},{id:"triple",scope:"one",art:"ty_up3",mult:3,price:2500,after:25},{id:"all",scope:"all",art:"ty_upall",mult:2,price:40,after:15}],Qr=[{id:"rush",art:"ty_rush",effect:"rush",weight:3,ttl:7,mult:3,seconds:10},{id:"break",art:"ty_wrench",effect:"break",weight:2,ttl:99,taps:3},{id:"invest",art:"ty_investor",effect:"invest",weight:1,ttl:9,now:25,mult:2,seconds:30},{id:"courier",art:"chest",effect:"courier",weight:2,ttl:6,now:15,coins:2}],Qc=e=>Qr.find(t=>t.id===e),rl=[11,18],ol=[{id:"rush",art:"ty_sk_rush",charge:30,effect:"rush",mult:5,seconds:12},{id:"instant",art:"ty_sk_instant",charge:26,effect:"instant",cycles:8},{id:"sale",art:"ty_sk_sale",charge:28,effect:"sale",mult:.5,seconds:15}],na=e=>ol.find(t=>t.id===e),ed=.4,td=3,eo=[{id:"hero",cast:"hero",gems:0,skill:"rush"},{id:"hero2",cast:"hero2",gems:150,skill:"instant"},{id:"hero3",cast:"hero3",gems:300,skill:"sale"}];var nd={l:"lemon",b:"bakery",c:"cafe",w:"workshop",n:"cinema",h:"hotel",k:"bank",p:"port"},Gp={r:"rush",b:"break",i:"invest",c:"courier"},$e=(e,t,n="",s)=>({businesses:[...e].map(r=>nd[r]??"lemon"),goals:t,events:[...n].map(r=>Gp[r]??"rush"),...{}}),Qs=e=>({...e,vip:true}),Ve=e=>({kind:"cash",n:e}),St=(e,t)=>({kind:"level",biz:nd[e]??"lemon",n:t}),Xt=e=>({kind:"managers",n:e}),gr=[$e("lb",[Ve(5200)]),$e("lb",[St("l",25),Ve(62e3)]),$e("lbc",[Ve(17e3)],"r"),$e("lbc",[Xt(2),Ve(34e3)],"r"),$e("lbc",[St("b",25),Ve(51e3)],"rc"),$e("lbcw",[Ve(21e4)],"rc"),$e("lbcw",[St("c",25),Xt(2)],"rc"),$e("lbcw",[Xt(3),Ve(46e4)],"rc"),$e("lbcw",[St("w",10),Ve(1e6)],"rc"),Qs($e("lbcw",[St("c",25),Xt(4),Ve(5e6)],"rc")),$e("bcw",[Ve(73e3)],"rb"),$e("bcw",[St("c",25),Ve(17e4)],"rcb"),$e("bcwn",[Ve(2e5)],"rcb"),$e("bcwn",[Xt(2),Ve(42e4)],"rcb"),$e("bcwn",[St("n",5),Ve(97e4)],"rcb"),$e("bcwn",[St("w",25),Ve(24e5)],"rcb"),$e("bcwn",[Xt(3),Ve(19e5)],"rcb"),$e("bcwn",[St("c",50),Ve(32e5)],"rcb"),$e("bcwn",[St("n",10),Xt(3)],"rcb"),Qs($e("bcwn",[St("n",10),Xt(4),Ve(64e6)],"rcb")),$e("cwn",[Ve(12e5)],"rcbi"),$e("cwn",[St("w",25),Ve(2e6)],"rcbi"),$e("cwnh",[Ve(27e5)],"rcbi"),$e("cwnh",[Xt(2),Ve(32e5)],"rcbi"),$e("cwnh",[St("h",5),Ve(16e6)],"rcbi"),$e("cwnh",[St("n",25),Ve(26e6)],"rcbi"),$e("cwnh",[Xt(3),Ve(15e6)],"rcbi"),$e("cwnh",[St("w",50),Ve(42e6)],"rcbi"),$e("cwnh",[St("h",10),Xt(3)],"rcbi"),Qs($e("cwnh",[St("h",10),Xt(4),Ve(26e7)],"rcbi")),$e("wnhk",[Ve(12e6)],"rcbi"),$e("wnhk",[St("h",10),Ve(36e6)],"rcbi"),$e("wnhk",[Xt(3),Ve(21e7)],"rcbi"),$e("nhkp",[Ve(21e7)],"rcbi"),$e("nhkp",[St("k",10),Ve(38e7)],"rcbi"),$e("nhkp",[Xt(2),Ve(42e7)],"rcbi"),$e("nhkp",[St("p",5),Ve(27e8)],"rcbi"),$e("nhkp",[St("k",25),Ve(32e8)],"rcbi"),$e("nhkp",[St("p",10),Xt(3)],"rcbi"),Qs($e("nhkp",[St("p",10),Xt(4),Ve(11e9)],"rcbi"))],to=10,rd=4,Zr=gr.length,sl=[0,18,45,75],al=e=>sl[Math.ceil(Math.max(1,e)/to)-1]??0,ra=e=>e>=.3?3:e>=.12?2:1,oa=30,od=(e,t)=>Math.round((t?40:20)+(e-1)*2),il=(e,t)=>(t?120:50)+(e-1)*10,ll="kit-tycoon",cl=[{id:"StartCash",var:"meta:cash",art:"coin",color:"coin",perLevel:20,unit:"%",maxLevel:15,price:40,growth:.12},{id:"CycleSpeed",var:"meta:speed",art:"hourglass",color:"secondary",perLevel:3,unit:"%",maxLevel:15,price:45,growth:.12},{id:"Income",var:"meta:income",art:"ty_up",color:"accent",perLevel:5,unit:"%",maxLevel:20,price:40,growth:.12},{id:"Discount",var:"meta:discount",art:"ty_sk_sale",color:"primary",perLevel:2,unit:"%",maxLevel:15,price:50,growth:.12},{id:"SkillPower",var:"meta:skill",art:"ty_sk_rush",color:"secondary",perLevel:8,unit:"%",maxLevel:10,price:50,growth:.12}],sd={game:"tycoon",character:ll,stats:cl,heroes:eo,levels:Zr,firstClearGold:e=>il(e,gr[Math.max(1,Math.min(Zr,e))-1]?.vip===true),stars:3,starsToEnter:al};var Kp={income:0,speed:0,discount:0};function zo(e,t=Kp,n){return {biz:e.businesses.map((r,o)=>({def:yr(r)??No[0],level:o===0?1:0,progress:0,ready:false,manager:false,mult:1,rush:0,rushMult:1,broken:0})),cash:n??id(e),earned:0,allMult:1,bought:new Set,timed:[],mods:t}}var id=e=>e.cash??(yr(e.businesses[1]??e.businesses[0]??"lemon")?.cost??4)*2,Fp=e=>e.timed.reduce((t,n)=>t*n.income,1),Up=e=>e.timed.reduce((t,n)=>t*n.price,1);function Wo(e){let t=1,n=1,s=0;for(let r of $o)e>=r.at?(t*=r.speed??1,n*=r.income??1):s===0&&(s=r.at);return {speed:t,income:n,next:s}}function Jn(e,t){let n=Wo(t.level);return Math.max(ea,t.def.cycle/n.speed/(1+e.mods.speed))}function mn(e,t,n=t.level){if(n<=0)return 0;let s=Wo(n),r=t.def.cycle/s.speed/(1+e.mods.speed),o=r<ea?ea/r:1;return t.def.income*n*s.income*o*t.mult*e.allMult*(1+e.mods.income)*(t.rush>0?t.rushMult:1)*Fp(e)}var sa=(e,t)=>t.level<=0||t.broken>0?0:mn(e,t)/Jn(e,t),aa=e=>e.biz.reduce((t,n)=>t+sa(e,n),0),Bo=e=>Math.max(.1,1-Math.min(.9,e.mods.discount))*Up(e);function Zn(e,t,n=1){let s=t.def.growth,r=t.def.cost*Math.pow(s,t.level),o=n<=1?r:r*(Math.pow(s,n)-1)/(s-1);return Math.ceil(o*Bo(e))}function pl(e,t,n=1e3){let s=t.def.growth,r=t.def.cost*Math.pow(s,t.level)*Bo(e);if(e.cash<r)return 0;let o=Math.floor(Math.log(e.cash*(s-1)/r+1)/Math.log(s)),d=Math.max(1,Math.min(n,o));for(;d>1&&Zn(e,t,d)>e.cash;)d--;return Zn(e,t,d)<=e.cash?d:0}var no=(e,t)=>Math.ceil(t.def.manager*Bo(e));function ia(e,t,n=1){let s=e.biz[t];if(!s||n<1)return {ok:false,milestones:[]};let r=Zn(e,s,n);if(e.cash<r)return {ok:false,milestones:[]};e.cash-=r;let o=s.level;return s.level+=n,{ok:true,milestones:$o.filter(d=>o<d.at&&s.level>=d.at).map(d=>d.at)}}function la(e,t){let n=e.biz[t];if(!n||n.manager||n.level<=0)return false;let s=no(e,n);return e.cash<s?false:(e.cash-=s,n.manager=true,n.ready&&(n.ready=false,n.progress=0,Ho(e,mn(e,n))),true)}var Ho=(e,t)=>{e.cash+=t,e.earned+=t;};function ca(e,t){let n=e.biz[t];if(!n||!n.ready)return 0;n.ready=false,n.progress=0;let s=mn(e,n);return Ho(e,s),s}function da(e,t){let n=e.biz[t];return !n||n.broken<=0?false:(n.broken--,n.broken===0)}function ul(e,t){let n=0;for(let s of e.biz)s.level<=0||s.broken>0||(n+=mn(e,s)*t);return Ho(e,n),n}var fl=(e,t)=>Ho(e,t);function pa(e,t){let n=e.timed.findIndex(s=>s.id===t.id);n>=0&&e.timed.splice(n,1),e.timed.push(t);}function ua(e,t){let n=[],s=[];e.biz.forEach((r,o)=>{if(r.rush>0&&(r.rush=Math.max(0,r.rush-t)),!(r.level<=0||r.ready||r.broken>0)&&(r.progress+=t/Jn(e,r),!(r.progress<1)))if(r.manager){let d=Math.floor(r.progress);r.progress-=d;let p=mn(e,r)*d;Ho(e,p),s.push({index:o,amount:p});}else r.progress=1,r.ready=true,n.push(o);});for(let r=e.timed.length-1;r>=0;r--){let o=e.timed[r];o.left-=t,o.left<=0&&e.timed.splice(r,1);}return {ready:n,paid:s}}function hl(e){let t=[],n=e.biz.reduce((s,r)=>Math.max(s,r.def.cost),0);for(let s of ta)s.scope==="all"?t.push({key:s.id,def:s,index:-1,price:Math.ceil(n*s.price*Bo(e))}):e.biz.forEach((r,o)=>t.push({key:`${s.id}:${r.def.id}`,def:s,index:o,price:Math.ceil(r.def.cost*s.price*Bo(e))}));return t}function fa(e,t=3){return hl(e).filter(n=>!e.bought.has(n.key)&&(n.index<0?(e.biz[0]?.level??0)>=n.def.after:(e.biz[n.index]?.level??0)>=n.def.after)).sort((n,s)=>n.price-s.price).slice(0,t)}function ha(e,t){let n=hl(e).find(s=>s.key===t);return !n||e.bought.has(t)||e.cash<n.price?false:(e.cash-=n.price,e.bought.add(t),n.index<0?e.allMult*=n.def.mult:e.biz[n.index].mult*=n.def.mult,true)}var ma=e=>e.biz.filter(t=>t.manager).length;function $n(e,t){if(t.kind==="cash")return Math.min(1,e.earned/Math.max(1,t.n));if(t.kind==="managers")return Math.min(1,ma(e)/Math.max(1,t.n));let n=e.biz.find(s=>s.def.id===t.biz);return Math.min(1,(n?.level??0)/Math.max(1,t.n))}var Vo=(e,t)=>t.every(n=>$n(e,n)>=1),ya=(e,t)=>t.length?t.reduce((n,s)=>n+$n(e,s),0)/t.length:1,dl=(e,t)=>t.manager?1:Jn(e,t)/(Jn(e,t)+1.2);function ga(e,t){let n=e.biz.findIndex(E=>E.broken>0);if(n>=0)return {kind:"fix",index:n};let s=null,r=aa(e),o=(E,I,K)=>{if(K>e.cash+r*8)return;let z=I/Math.max(1,K);(!s||z>s.value)&&(s={move:E,value:z,price:K});},d=E=>t.some(I=>I.kind==="level"&&I.biz===E&&$n(e,I)<1),p=t.some(E=>E.kind==="managers"&&$n(e,E)<1),v=t.some(E=>E.kind==="cash"&&$n(e,E)<1);e.biz.forEach((E,I)=>{let K=sa(e,E)*dl(e,E),z={...E,level:E.level+1},ae=(mn(e,z)/Jn(e,z)*dl(e,z)-K)*(E.level===0?3:1)*(d(E.def.id)?3:1);o({kind:"buy",index:I},ae+(d(E.def.id)&&!v?r*.05:0),Zn(e,E)),E.level>0&&!E.manager&&o({kind:"hire",index:I},sa(e,E)*(1-dl(e,E))*1.6*(p?3:1)+(p?r*.05:0),no(e,E));});for(let E of fa(e,6)){let I=E.index<0?r*(E.def.mult-1):sa(e,e.biz[E.index])*(E.def.mult-1);o({kind:"upgrade",key:E.key},I,E.price);}let M=e.biz.map((E,I)=>({b:E,i:I})).filter(E=>E.b.ready).sort((E,I)=>mn(e,I.b)-mn(e,E.b))[0],O=s;return O&&O.price<=e.cash?O.move:M?{kind:"collect",index:M.i}:null}function ld(e,t){return t?t.kind==="collect"?ca(e,t.index)>0:t.kind==="buy"?ia(e,t.index).ok:t.kind==="hire"?la(e,t.index):t.kind==="fix"?da(e,t.index)||true:ha(e,t.key):false}function cd(e,t={}){let n=zo(e,t.mods),s=.05,r=t.tapEvery??.4,o=t.max??900,d=0,p=0;for(;d<o;){if(Vo(n,e.goals))return d;if(ua(n,s),d+=s,d>=p){let v=ga(n,e.goals);v&&(ld(n,v),p=d+r);}}return 1/0}var ad=new Map;function ba(e){let t=ad.get(e);return t===void 0&&(t=cd(gr[e-1]),ad.set(e,t)),t}function ro(e,t=.5){let n=Math.max(1,Math.min(Zr,Math.floor(e))),s=gr[n-1],r=Math.ceil(n/to),o=n-(r-1)*to,d=ba(n),p=(1.6-(r-1)*.08-o*.01)*(1.1-t*.2)*(s.extra??1),v=Math.max(45,Math.min(600,Math.ceil((Number.isFinite(d)?d:400)*p/5)*5));return {level:n,world:r,index:o,def:s,boss:s.vip===true,day:v,cash:id(s),coins:od(n,s.vip===true),firstClearGold:il(n,s.vip===true)}}var qp=b("tycoon.part"),ml=b("tycoon.manager"),oo=(e,t)=>{let n=Number(e.vars[t]??0);return Number.isFinite(n)?n:0},an=e=>{let t=Math.abs(e);for(let[n,s]of [[1e12,"T"],[1e9,"B"],[1e6,"M"],[1e3,"K"]])if(t>=n)return `${(e/n).toFixed(t>=n*100?0:1).replace(/\.0$/,"")}${s}`;return String(Math.floor(e))},dd=new WeakMap,pd=e=>dd.get(e),Go=[1,10,0],va={id:"tycoon",version:2,engines:["phaser"],requires:["round"],params:{difficulty:{type:"number",default:.5,min:0,max:1},coinReward:{type:"number",default:1,min:0,max:10}},setup({world:e$1,params:t,mode:n}){let s=i=>nn(t,i),r=e$1.rng.stream("tycoon"),o=pn(n,"events",Qr.map(i=>i.id)),d=ro(1,s("difficulty")),p=zo(d.def),v=new Map,M=new Map,O=null,E=[],I=0,K=0,z=0,ne=0,ae=0,j$1=false,ue=false,fe=0,ie=null,xe=null,se=null,_e=()=>eo.find(i=>i.id===e$1.vars["meta:hero"])??eo[0],Ae=()=>na(_e().skill),be=()=>e$1.vars.reviving===true,oe=()=>d.def.goals,me=()=>{let i=Ce(e$1);return {...i,U:Math.min(i.w,i.h)}},Se=i=>{let u=me(),g=Math.max(1,p.biz.length),T=u.h*.25,w=u.h*.81,N=Math.max(6,u.h*.012),$=Math.min((w-T-N*(g-1))/g,150,u.w*.26),te=Math.min(u.w*.96,660),le=T+(w-T-(g*$+(g-1)*N))/2;return {x:u.w/2,y:le+i*($+N)+$/2,w:te,h:$}},Ee=i=>{let u=Se(i);return {x:u.x-u.w/2+u.h*.56,y:u.y,size:u.h*.9}},Q=()=>me().h*.9,Re=()=>{let i=me();return Math.min(i.U*.075,i.h*.055)},We=()=>{let i=me(),u=xe?1-xe.left/xe.def.ttl:0;return {x:-i.w*.05+u*i.w*1.1,y:i.h*.21,r:i.U*.06}},we=new Set,ee=(i,u,g,T,w=1)=>{we.add(i);let N=v.get(i);(N===void 0||!e$1.isAlive(N))&&(N=e$1.create(),e$1.set(N,qp,{id:i}),v.set(i,N)),e$1.set(N,e,{x:u,y:g,scale:w}),e$1.set(N,f,T);},Le=()=>{for(let[i,u]of [...v])we.has(i)||(e$1.destroy(u),v.delete(i));},ye=(i,u,g,T,w,N,$=70)=>ee(i,u,g,{shape:"text",text:T,size:Math.max(9,Math.round(N)),color:w,bold:true,depth:$}),ke=(i,u,g,T,w,N,$,te=2)=>{ee(`${i}:bg`,u,g,{shape:"rect",w:T+4,h:w+4,color:"#000000",alpha:.4,radius:(w+4)/2,depth:te});let le=Math.max(1,T*Math.max(0,Math.min(1,N)));ee(`${i}:fill`,u-T/2+le/2,g,{shape:"rect",w:le,h:w,color:$,radius:w/2,depth:te+.1});},Ue=i=>E.push(i),Y=i=>{let u=p.biz[i],g=Go[ae]??1;return g===0?Math.max(1,pl(p,u)):g},Me=()=>{p.biz.forEach((i,u)=>{let g=Se(u),T=Ee(u),w=i.level>0,N=i.def.color;ee(`r${u}`,g.x,g.y,{shape:"sprite",art:"panel",w:g.w,h:g.h,color:"panel",depth:0}),i.rush>0&&ee(`r${u}:rush`,T.x,T.y,{shape:"circle",r:T.size*.55,color:"coin",alpha:.35+.2*Math.sin(e$1.time*8),depth:.5});let $=i.ready?1+.06*Math.abs(Math.sin(e$1.time*6)):1;ee(`r${u}:b`,T.x,T.y,{shape:"sprite",art:i.def.art,w:T.size,h:T.size,color:N,alpha:w?i.broken>0?.55:1:.35,depth:1},$),Ue({id:`biz${u}`,x:T.x,y:T.y,w:T.size,h:T.size});let te=g.x-g.w*.12,le=g.h*.2,ge=Wo(i.level);if(ye(`r${u}:lv`,te,g.y-g.h*.26,w?`Lv ${i.level}${ge.next?`/${ge.next}`:""}`:"Lv 0","text",le,2),w){ye(`r${u}:inc`,te,g.y+g.h*0,`+${an(mn(p,i))}`,"coin",le*.95,2);let a=i.ready||Jn(p,i)<=.15&&i.manager?1:i.progress;ke(`r${u}:bar`,te,g.y+g.h*.28,g.w*.3,Math.max(6,g.h*.12),a,i.broken>0?"danger":N),i.ready&&!i.manager&&ye(`r${u}:ok`,T.x+T.size*.36,T.y+T.size*.34,"$","coin",T.size*.3,3);}if(ie?.index===u){let a=1+.12*Math.sin(e$1.time*9);ee(`r${u}:ev`,T.x+T.size*.32,T.y-T.size*.3,{shape:"sprite",art:ie.def.art,w:T.size*.5,h:T.size*.5,depth:4},a);}else i.broken>0&&(ee(`r${u}:ev`,T.x+T.size*.3,T.y-T.size*.28,{shape:"sprite",art:"ty_wrench",w:T.size*.48,h:T.size*.48,depth:4},1+.08*Math.sin(e$1.time*10)),ye(`r${u}:evn`,T.x+T.size*.3,T.y+T.size*.05,String(i.broken),"danger",T.size*.26,4.1));let He=g.x+g.w*.13,je=g.h*.27;if(w&&!i.manager){let a=no(p,i),k=p.cash>=a;ee(`r${u}:m:bg`,He,g.y-g.h*.08,{shape:"circle",r:je,color:k?"secondary":"panel",alpha:k?.95:.7,depth:1}),ee(`r${u}:m`,He,g.y-g.h*.08,{shape:"sprite",art:"ty_manager",w:je*1.7,h:je*1.7,alpha:k?1:.5,depth:1.2}),ye(`r${u}:m:p`,He,g.y+g.h*.32,an(a),k?"text":"muted",le*.8,2),Ue({id:`mgr${u}`,x:He,y:g.y,w:je*2.2,h:g.h*.9});}let st=g.x+g.w/2-g.w*.14,Z=g.w*.25,H=g.h*.72,X=Y(u),q=Zn(p,i,X),x=p.cash>=q;ee(`r${u}:buy`,st,g.y,{shape:"sprite",art:"button",w:Z,h:H,color:x?"accent":"panel",alpha:x?1:.6,depth:1}),ye(`r${u}:buy:n`,st,g.y-H*.2,w?`+${X}`:"OPEN","text",le*.9,2),ee(`r${u}:buy:c`,st-Z*.3,g.y+H*.2,{shape:"sprite",art:"coin",w:le*.8,h:le*.8,depth:2}),ye(`r${u}:buy:p`,st+Z*.08,g.y+H*.2,an(q),x?"coin":"muted",le*.85,2),Ue({id:`buy${u}`,x:st,y:g.y,w:Z,h:H});let S=M.get(u);if(i.manager&&(S===void 0||!e$1.isAlive(S))&&(S=e$1.create(),e$1.set(S,ml,{index:u}),e$1.set(S,f,{shape:"actor",cast:"helper",variant:u*13+5,h:g.h*.78,pose:"idle",facing:1,depth:2}),M.set(u,S)),S!==void 0&&e$1.isAlive(S)){e$1.set(S,e,{x:He,y:g.y+g.h*.02});let a=e$1.need(S,f);a.shape==="actor"&&(a.h=g.h*.78);}});},Xe=i=>i.kind==="cash"?"coin":i.kind==="managers"?"ty_manager":yr(i.biz??"")?.art??"biz1",at=i=>i.kind==="cash"?p.earned:i.kind==="managers"?ma(p):p.biz.find(u=>u.def.id===i.biz)?.level??0,Te=()=>{let i=me(),u=i.U,g=i.h*.09;ee("h:t:i",i.w*.09,g,{shape:"sprite",art:"hourglass",w:u*.06,h:u*.06,depth:70}),ye("h:t",i.w*.09+u*.09,g,Zo(I),I<=15?"danger":"text",u*.05),ee("h:c:i",i.w*.42,g,{shape:"sprite",art:"coin",w:u*.07,h:u*.07,depth:70}),ye("h:c",i.w*.42+u*.13,g,an(p.cash),"coin",u*.065);let T=u*.17;ee("h:mode",i.w*.88,g,{shape:"sprite",art:"button",w:T,h:u*.08,color:"secondary",depth:70}),ye("h:mode:t",i.w*.88,g,Go[ae]===0?"MAX":`\xD7${Go[ae]}`,"text",u*.042,70.1),Ue({id:"mode",x:i.w*.88,y:g,w:T,h:u*.09});let w=oe(),N=Math.min(i.w*.3,230),$=Math.max(30,i.h*.05),te=i.h*.15;if(w.forEach((Z,H)=>{let X=i.w/2+(H-(w.length-1)/2)*(N+u*.02),q=$n(p,Z)>=1;ee(`h:g${H}`,X,te,{shape:"sprite",art:"panel",w:N,h:$,color:q?"accent":"panel",depth:70}),ee(`h:g${H}:i`,X-N*.36,te-$*.06,{shape:"sprite",art:Xe(Z),w:$*.75,h:$*.75,depth:70.1});let x=at(Z),S=q?"\u2713":Z.kind==="cash"?`${an(x)}/${an(Z.n)}`:Z.kind==="level"?`Lv ${x}/${Z.n}`:`${x}/${Z.n}`;ye(`h:g${H}:t`,X+N*.1,te-$*.08,S,"text",$*.36,70.1),ke(`h:g${H}:bar`,X+N*.1,te+$*.3,N*.62,Math.max(4,$*.1),$n(p,Z),q?"accent":"coin",70.1);}),p.timed.forEach((Z,H)=>{let X=i.w*.9-H*u*.16,q=Z.id==="sale"?"ty_sk_sale":Z.id==="invest"?"ty_investor":Ae().art;ee(`h:tm${H}`,X-u*.04,i.h*.205,{shape:"sprite",art:q,w:u*.06,h:u*.06,depth:70}),ye(`h:tm${H}:t`,X+u*.035,i.h*.205,`${Math.ceil(Z.left)}`,"secondary",u*.04);}),xe){let Z=We();ee("h:courier",Z.x,Z.y+Math.sin(e$1.time*10)*Z.r*.08,{shape:"sprite",art:xe.def.art,w:Z.r*2,h:Z.r*2,depth:72}),Ue({id:"courier",x:Z.x,y:Z.y,w:Z.r*2.6,h:Z.r*2.6});}let le=Q(),ge=Re(),He=i.w*.25,je=ne>=Ae().charge;je&&ee("h:sk:glow",He,le,{shape:"circle",r:ge*1.28,color:"secondary",alpha:.5+.3*Math.sin(e$1.time*7),depth:68.9}),ee("h:sk:bg",He,le,{shape:"circle",r:ge,color:"panel",alpha:.95,depth:69}),ee("h:sk",He,le,{shape:"sprite",art:Ae().art,w:ge*1.4,h:ge*1.4,alpha:je?1:.45,depth:69.2}),ke("h:charge",He,le+ge*1.3,ge*2,Math.max(5,ge*.2),ne/Ae().charge,"secondary",69),Ue({id:"skill",x:He,y:le,w:ge*2.4,h:ge*2.4}),fa(p,3).forEach((Z,H)=>{let X=i.w*(.47+H*.18),q=p.cash>=Z.price;ee(`h:u${H}:bg`,X,le,{shape:"circle",r:ge,color:q?"accent":"panel",alpha:q?.95:.7,depth:69}),ee(`h:u${H}`,X,le-ge*.08,{shape:"sprite",art:Z.def.art,w:ge*1.5,h:ge*1.5,alpha:q?1:.55,depth:69.2});let x=Z.index>=0?p.biz[Z.index]:void 0;x&&ee(`h:u${H}:b`,X+ge*.7,le-ge*.6,{shape:"sprite",art:x.def.art,w:ge*.9,h:ge*.9,color:x.def.color,depth:69.3}),ye(`h:u${H}:p`,X,le+ge*1.3,an(Z.price),q?"coin":"muted",ge*.42,69.3),Ue({id:`up:${Z.key}`,x:X,y:le,w:ge*2.3,h:ge*2.6});}),(O===null||!e$1.isAlive(O))&&(O=e$1.create(),e$1.set(O,f,{shape:"actor",cast:_e().cast,h:ge*2.6,pose:"idle",facing:1,depth:20})),e$1.set(O,e,{x:i.w*.09,y:le-ge*.1});let st=e$1.need(O,f);if(st.shape==="actor"&&(st.h=ge*2.6),se){let Z=Math.min(i.w*.86,500),H=Z*.42,X=i.w/2,q=i.h*.5;ee("h:inv:dim",X,q,{shape:"rect",w:i.w,h:i.h,color:"#000000",alpha:.35,depth:79}),ee("h:inv",X,q,{shape:"sprite",art:"panel",w:Z,h:H,color:"panel",depth:80}),ee("h:inv:i",X-Z*.34,q,{shape:"sprite",art:se.def.art,w:H*.62,h:H*.62,depth:80.1});let x=Z*.3,S=H*.5,a=ot();ee("h:inv:a",X+Z*.02,q-H*.04,{shape:"sprite",art:"button",w:x,h:S,color:"accent",depth:80.1}),ee("h:inv:a:c",X+Z*.02-x*.28,q-H*.04,{shape:"sprite",art:"coin",w:S*.4,h:S*.4,depth:80.2}),ye("h:inv:a:t",X+Z*.02+x*.1,q-H*.04,an(a),"coin",S*.3,80.2),ee("h:inv:b",X+Z*.33,q-H*.04,{shape:"sprite",art:"button",w:x,h:S,color:"secondary",depth:80.1}),ye("h:inv:b:t",X+Z*.33,q-H*.04,`\xD7${se.def.mult??2} ${se.def.seconds??30}s`,"text",S*.28,80.2),ke("h:inv:bar",X+Z*.17,q+H*.32,Z*.6,Math.max(4,H*.05),se.left/se.def.ttl,"coin",80.1),Ue({id:"inv_now",x:X+Z*.02,y:q-H*.04,w:x,h:S}),Ue({id:"inv_share",x:X+Z*.33,y:q-H*.04,w:x,h:S});}},Wt=()=>{E=[],we.clear(),Me(),Te(),Le(),e$1.vars.ty_buttons=E.map(i=>`${i.id}@${Math.round(i.x)},${Math.round(i.y)}`).join(";");},Ge=()=>{e$1.vars.cash=Math.floor(p.cash),e$1.vars.earned=Math.floor(p.earned),e$1.vars.time_left=I,e$1.vars.ty_charge=Math.floor(ne),e$1.vars.ty_mode=Go[ae]??1,e$1.vars.level_progress=ya(p,oe()),e$1.vars.ty_goals=oe().map(i=>`${i.kind}:${Math.floor(at(i))}/${i.n}`).join("|");},qe=()=>{for(let u of [...v.values(),...M.values()])e$1.isAlive(u)&&e$1.destroy(u);v.clear(),M.clear(),O!==null&&e$1.isAlive(O)&&e$1.destroy(O),O=null,d=ro(oo(e$1,"meta:chapter")||1,s("difficulty"));let i={income:oo(e$1,"meta:income"),speed:oo(e$1,"meta:speed"),discount:oo(e$1,"meta:discount")};p=zo(d.def,i,Math.round(d.cash*(1+oo(e$1,"meta:cash")))),dd.set(e$1,{s:p,level:d}),Ot(e$1,"board",Ce(e$1).h*.24),I=d.day,K=0,z=0,ne=0,j$1=false,ue=false,fe=8+r.range(0,4),ie=null,xe=null,se=null,e$1.vars.ty_level=d.level,e$1.vars.ty_world=d.world,e$1.vars.coins=0,e$1.vars.score=0,e$1.vars.stars=0,e$1.vars.reviving=false,Ge();},et=i=>{if(ue)return;ue=true;let u=i==="cleared",g=ya(p,oe()),T=u?Math.min(j$1?1:3,ra(I/Math.max(1,d.day))):0,w=Math.round(d.coins*s("coinReward")*(u?[1,1,1.25,1.5][T]:g*.5));w>0&&(Fe(e$1,"coins",w),e$1.emit("coin-collected",{value:w})),u&&e$1.vars["meta:first_clear"]===true&&Fe(e$1,"coins",d.firstClearGold),e$1.vars.stars=T,e$1.vars.score=Math.round(g*1e3)+(u?T*500+Math.floor(I)*10:0),e$1.vars.reviving=false,ie=null,xe=null,se=null,Ge(),e$1.emit($t,{reason:i,stats:{chapter:d.level,seconds:Math.floor(K),cleared:u,stars:T,coins:Number(e$1.vars.coins??0),earned:Math.floor(p.earned),managers:ma(p)}});},rt=()=>{ue||(G(e$1,{kind:"flash",color:"coin"}),et("cleared"));},lt=()=>{if(e$1.vars.revive_ready===true&&!j$1){e$1.vars.reviving=true,e$1.emit(Vt,{});return}et("out-of-time");},ct=()=>{be()&&(j$1=true,e$1.vars.reviving=false,I+=oa,G(e$1,{kind:"flash",color:"coin"}),Ge());},dt=()=>Math.max(aa(p),d.cash*.05),ot=()=>Math.round(dt()*(se?.def.now??25)),Pe=i=>{ne=Math.min(Ae().charge,ne+td),e$1.emit("event-handled",{id:i});},bt=()=>{let i=p.biz.map(($,te)=>({b:$,i:te})).filter($=>$.b.level>0&&$.b.broken===0),u=$=>$.effect==="rush"?!ie&&i.some(te=>te.b.rush<=0):$.effect==="break"?!p.biz.some(te=>te.broken>0)&&i.some(te=>te.b.level>=3):$.effect==="invest"?!se:!xe,g=d.def.events.filter($=>o.includes($)).map($=>Qr.find(te=>te.id===$)).filter($=>!!$&&u($));if(!g.length)return;let T=g.reduce(($,te)=>$+te.weight,0),w=r.range(0,T),N=g.find($=>(w-=$.weight)<0)??g[0];if(N.effect==="rush"){let $=i.filter(te=>te.b.rush<=0);ie={index:$[r.int(0,$.length-1)].i,left:N.ttl,def:N};}else if(N.effect==="break"){let $=i.filter(le=>le.b.level>=3),te=$[r.int(0,$.length-1)];te.b.broken=N.taps??3,G(e$1,{kind:"shake",power:.3});}else N.effect==="invest"?se={left:N.ttl,def:N}:xe={left:N.ttl,def:N};e$1.emit("event-started",{id:N.id});},Ke=i=>{ie&&(ie.left-=i)<=0&&(ie=null),xe&&(xe.left-=i)<=0&&(xe=null),se&&(se.left-=i)<=0&&(se=null),d.def.events.length&&(fe-=i,fe<=0&&(bt(),fe=r.range(rl[0],rl[1])));},At=i=>{let u=p.biz[i];if(!u||u.level<=0)return;let g=Ee(i);if(u.broken>0){G(e$1,{kind:"burst",x:g.x,y:g.y,color:"ground",n:6,size:g.size*.6}),da(p,i)&&(G(e$1,{kind:"ring",x:g.x,y:g.y,color:"accent",size:g.size*1.2}),Pe("break"));return}ie?.index===i&&(u.rush=ie.def.seconds??10,u.rushMult=ie.def.mult??3,G(e$1,{kind:"ring",x:g.x,y:g.y,color:"coin",size:g.size*1.4}),G(e$1,{kind:"pop",x:g.x,y:g.y-g.size*.45,text:`\xD7${u.rushMult}`,color:"coin",size:Math.round(g.size*.3)}),ie=null,Pe("rush"));let T=ca(p,i);T<=0||(ne=Math.min(Ae().charge,ne+ed),vt(e$1,"tycoon-collect"),G(e$1,{kind:"burst",x:g.x,y:g.y,color:"coin",n:8,size:g.size*.7}),G(e$1,{kind:"pop",x:g.x,y:g.y-g.size*.35,text:`+${an(T)}`,color:"coin",size:Math.round(g.size*.24)}),e$1.emit("cycle-collected",{index:i,amount:T}));},en=i=>{let u=p.biz[i];if(!u)return;let g=ia(p,i,Y(i)),T=Se(i),w=T.x+T.w/2-T.w*.14;if(!g.ok){G(e$1,{kind:"shake",power:.1});return}vt(e$1,"tycoon-buy");let N=Ee(i);G(e$1,{kind:"ring",x:N.x,y:N.y,color:"coin",size:N.size*1.1}),G(e$1,{kind:"burst",x:w,y:T.y,color:"accent",n:5,size:T.h*.5}),e$1.emit("business-bought",{id:u.def.id,level:u.level});for(let $ of g.milestones)G(e$1,{kind:"flash",color:"coin"}),G(e$1,{kind:"pop",x:N.x,y:N.y-N.size*.5,text:`\u2605 ${$}`,color:"coin",size:Math.round(N.size*.3)}),e$1.emit("milestone",{id:u.def.id,at:$});},Rt=i=>{let u=p.biz[i];if(!u||!la(p,i))return;vt(e$1,"tycoon-manager");let g=Ee(i);G(e$1,{kind:"ring",x:g.x,y:g.y,color:"secondary",size:g.size*1.3}),G(e$1,{kind:"pop",x:g.x,y:g.y-g.size*.5,text:"\u2605",color:"secondary",size:Math.round(g.size*.35)}),e$1.emit("manager-hired",{id:u.def.id});},tn=(i,u,g)=>{ha(p,i)&&(vt(e$1,"tycoon-upgrade"),G(e$1,{kind:"ring",x:u,y:g,color:"accent",size:Re()*2.6}),G(e$1,{kind:"flash",color:"accent"}),e$1.emit("upgrade-bought",{key:i}));},Et=()=>{let i=Ae();if(ne<i.charge)return false;let u=1+oo(e$1,"meta:skill");if(ne=0,O!==null&&ze(e$1,O,"cheer"),G(e$1,{kind:"flash",color:"secondary"}),i.effect==="rush")pa(p,{id:"skill",left:(i.seconds??12)*u,income:i.mult??5,price:1});else if(i.effect==="sale")pa(p,{id:"sale",left:(i.seconds??15)*u,income:1,price:i.mult??.5});else {let g=ul(p,Math.max(1,Math.round((i.cycles??8)*u))),T=me();G(e$1,{kind:"pop",x:T.w/2,y:T.h*.16,text:`+${an(g)}`,color:"coin",size:Math.round(T.U*.07)}),p.biz.forEach((w,N)=>{if(w.level<=0)return;let $=Ee(N);G(e$1,{kind:"burst",x:$.x,y:$.y,color:"coin",n:10,size:$.size*.8});});}return e$1.emit("skill-cast",{id:i.id}),vt(e$1,"tycoon-skill"),true},L=()=>{if(!xe)return;let i=We(),u=Math.round(dt()*(xe.def.now??15));fl(p,u);let g=Math.round((xe.def.coins??0)*s("coinReward"));g>0&&(Fe(e$1,"coins",g),e$1.emit("coin-collected",{value:g})),G(e$1,{kind:"burst",x:i.x,y:i.y,color:"coin",n:14,size:i.r*2}),G(e$1,{kind:"pop",x:i.x,y:i.y+i.r*1.4,text:`+${an(u)}`,color:"coin",size:Math.round(i.r*.7)}),xe=null,Pe("courier");},B=i=>{if(!se)return;let u=se.def;i?pa(p,{id:"invest",left:u.seconds??30,income:u.mult??2,price:1}):fl(p,ot()),se=null,G(e$1,{kind:"flash",color:"coin"}),Pe("invest");},f$1=(i,u,g)=>E.find(T=>(!g||T.id.startsWith(g))&&Math.abs(i-T.x)<=T.w/2&&Math.abs(u-T.y)<=T.h/2);e$1.on(j,i=>{let u=i;if(u.type!=="tap"||!Je(e$1)||Kn(e$1)||ue||be())return;Dt(e$1),z=0;let g=se?f$1(u.x,u.y,"inv_")??f$1(u.x,u.y):f$1(u.x,u.y,"courier")??f$1(u.x,u.y);g&&(g.id==="inv_now"?B(false):g.id==="inv_share"?B(true):g.id==="courier"?L():g.id==="mode"?ae=(ae+1)%Go.length:g.id==="skill"?Et():g.id.startsWith("up:")?tn(g.id.slice(3),g.x,g.y):g.id.startsWith("biz")?At(Number(g.id.slice(3))):g.id.startsWith("buy")?en(Number(g.id.slice(3))):g.id.startsWith("mgr")&&Rt(Number(g.id.slice(3))),Ge(),Vo(p,oe())&&rt());}),e$1.on(Nt,()=>{qe(),e$1.vars.level=d.level;}),e$1.on(zt,qe),e$1.on(Gt,ct),e$1.on(Kt,()=>{be()&&(e$1.vars.reviving=false,et("out-of-time"));}),e$1.on(Bt,i=>{we.clear(),Le(),E=[],e$1.vars.ty_buttons="",O!==null&&e$1.isAlive(O)&&Qe(e$1,O,i.reason==="cleared"?"dance":"idle");}),e$1.on(k,()=>Ot(e$1,"board",Ce(e$1).h*.24));let c=i=>{if(!i)return;let u=i.kind==="collect"||i.kind==="fix"?`biz${i.index}`:i.kind==="buy"?`buy${i.index}`:i.kind==="hire"?`mgr${i.index}`:`up:${i.key}`;return E.find(g=>g.id===u)},y=i=>{let u=me().U,g=p.biz.findIndex(T=>T.ready);if(!ht(i,"tycoon-collect")&&g>=0){let T=Ee(g);return ft(i,"tap",T,void 0,T.size*.8)}if(!ht(i,"tycoon-buy")){let T=p.biz.findIndex(N=>p.cash>=Zn(p,N,Y(p.biz.indexOf(N)))),w=E.find(N=>N.id===`buy${T}`);if(T>=0&&w)return ft(i,"tap",w,void 0,w.h)}if(!ht(i,"tycoon-manager")){let T=p.biz.findIndex(N=>N.level>0&&!N.manager&&p.cash>=no(p,N)),w=E.find(N=>N.id===`mgr${T}`);if(T>=0&&w)return ft(i,"tap",w,void 0,w.w)}if(ne>=Ae().charge&&!ht(i,"tycoon-skill")){let T=E.find(w=>w.id==="skill");if(T)return ft(i,"tap",T,void 0,T.w)}if(z>6){let T=c(ga(p,oe()));T&&ft(i,"tap",T,void 0,Math.min(T.w,u*.18));}};e$1.addSystem({id:"tycoon",order:0,run(i,u){if(!(!Je(i)||ue)){if(!be()){K+=u,z+=u,I=Math.max(0,I-u);for(let g of ua(p,u).paid)g.amount<=0||i.emit("cycle-collected",{index:g.index,amount:g.amount});ne=Math.min(Ae().charge,ne+u),Ke(u);}if(Wt(),Ge(),!be()){if(Vo(p,oe()))return rt();un(i)||y(i),I<=0&&lt();}}}}),qe();}};var Bn=(e,t,n,s,r,o,d,p,v)=>({en:e,ru:t,kz:n,zh:s,ko:r,ja:o,hi:d,pt:p,de:v}),xa=Bn("Score","\u041E\u0447\u043A\u0438","\u04B0\u043F\u0430\u0439","\u5206\u6570","\uC810\uC218","\u30B9\u30B3\u30A2","\u0938\u094D\u0915\u094B\u0930","Pontos","Punkte"),gl={id:"fantasy",version:1,setting:"fantasy",names:Bn("Fantasy","\u0424\u044D\u043D\u0442\u0435\u0437\u0438","\u0424\u044D\u043D\u0442\u0435\u0437\u0438","\u5947\u5E7B","\uD310\uD0C0\uC9C0","\u30D5\u30A1\u30F3\u30BF\u30B8\u30FC","\u092B\u093C\u0948\u0902\u091F\u0947\u0938\u0940","Fantasia","Fantasy"),palette:{background:"#1f2a1d",ground:"#3b4a2e",lane:"#56683f",primary:"#4fa3e0",secondary:"#8e5bd1",danger:"#d0483b",coin:"#f2c14e",accent:"#6fbf4a",text:"#fff6e0",muted:"#b9b08f",piece1:"#e0443e",piece2:"#3f7fe0",piece3:"#43b05c",piece4:"#f2c14e",piece5:"#9b59d0",piece6:"#ef8a2f",panel:"#3a2f25"},texts:{"res.coins":Bn("Gold","\u0417\u043E\u043B\u043E\u0442\u043E","\u0410\u043B\u0442\u044B\u043D","\u91D1\u5E01","\uACE8\uB4DC","\u30B4\u30FC\u30EB\u30C9","\u0938\u094B\u0928\u093E","Ouro","Gold"),"res.score":xa},races:["human","elf","dwarf","orc","undead"],cast:{hero:{preset:"knight",races:["human"]},foe:{preset:"berserker",parts:{Hat:null,Offhand:null,Weapon:"weapon/battle_axe"},races:["orc"]},foe2:{preset:"viking",parts:{Weapon:"weapon/double_axe"},races:["orc"]},boss:{preset:"dark_knight",races:["orc"]},helper:{preset:"hunter",parts:{Weapon:null,Hat:null},races:["elf","dwarf","human"]},foe3:{preset:"crossbowman",parts:{Weapon:"weapon/crossbow"},races:["undead"]},foe4:{preset:"lumberjack",parts:{Weapon:"weapon/spear",Back:null},races:["undead"]},foe5:{preset:"hunter",parts:{Hat:null,Back:null,Weapon:"weapon/dagger"},races:["undead"]},hero2:{preset:"crusader",races:["human","dwarf"]},hero3:{preset:"archmage",races:["elf"]}}},bl={id:"sci-fi",version:1,setting:"sci-fi",names:Bn("Sci-fi","\u041D\u0430\u0443\u0447\u043D\u0430\u044F \u0444\u0430\u043D\u0442\u0430\u0441\u0442\u0438\u043A\u0430","\u0492\u044B\u043B\u044B\u043C\u0438 \u0444\u0430\u043D\u0442\u0430\u0441\u0442\u0438\u043A\u0430","\u79D1\u5E7B","SF","SF","\u0935\u093F\u091C\u094D\u091E\u093E\u0928 \u0915\u0925\u093E","Fic\xE7\xE3o cient\xEDfica","Science-Fiction"),palette:{background:"#0b1020",ground:"#151d33",lane:"#22305a",primary:"#36e3ff",secondary:"#b45cff",danger:"#ff3d6e",coin:"#ffe14d",accent:"#3dff9a",text:"#e8f6ff",muted:"#7d8fb3",piece1:"#ff3d6e",piece2:"#36a3ff",piece3:"#3dff9a",piece4:"#ffe14d",piece5:"#b45cff",piece6:"#ff8f3d",panel:"#18213d"},texts:{"res.coins":Bn("Chips","\u0427\u0438\u043F\u044B","\u0427\u0438\u043F\u0442\u0435\u0440","\u82AF\u7247","\uCE69","\u30C1\u30C3\u30D7","\u091A\u093F\u092A\u094D\u0938","Chips","Chips"),"res.score":xa},races:["human"],cast:{hero:{preset:"soldier",races:["human"]},foe:{preset:"soldier",parts:{Hat:"hat/great_helm",Weapon:"weapon/pistol"},races:["undead"]},foe2:{preset:"gunslinger",parts:{Weapon:"weapon/rifle",Back:null},races:["orc"]},boss:{preset:"dark_knight",parts:{Weapon:"weapon/flame_sword"},races:["orc"]},helper:{preset:"gunslinger",parts:{Weapon:null,Back:null},races:["elf","human"]},foe3:{preset:"gunslinger",parts:{Weapon:"weapon/pistol",Back:null},races:["undead"]},foe4:{preset:"soldier",parts:{Hat:"hat/great_helm",Weapon:"weapon/spear"},races:["orc"]},foe5:{preset:"soldier",parts:{Hat:null,Back:null,Weapon:"weapon/dagger"},races:["undead"]},hero2:{preset:"musketeer",parts:{Weapon:"weapon/rifle"},races:["human"]},hero3:{preset:"archmage",parts:{Weapon:"weapon/wizard_staff"},races:["elf","human"]}}},vl={id:"cozy",version:1,setting:"cozy",names:Bn("Cozy cartoon","\u0423\u044E\u0442\u043D\u044B\u0439 \u043C\u0443\u043B\u044C\u0442\u044F\u0448\u043D\u044B\u0439","\u0416\u0430\u0439\u043B\u044B \u043C\u0443\u043B\u044C\u0442\u0444\u0438\u043B\u044C\u043C","\u6E29\u99A8\u5361\u901A","\uC544\uB291\uD55C \uCE74\uD230","\u307B\u306E\u307C\u306E\u30AB\u30FC\u30C8\u30A5\u30FC\u30F3","\u0906\u0930\u093E\u092E\u0926\u093E\u092F\u0915 \u0915\u093E\u0930\u094D\u091F\u0942\u0928","Cartoon aconchegante","Gem\xFCtlicher Cartoon"),palette:{background:"#fdf1e4",ground:"#f3d9bf",lane:"#e9c6a3",primary:"#ff8fab",secondary:"#8fb8ff",danger:"#ff6b6b",coin:"#ffb627",accent:"#7ccf8a",text:"#3d2b25",muted:"#9c8478",piece1:"#ff8fab",piece2:"#7fb8ff",piece3:"#8cd98f",piece4:"#ffd166",piece5:"#c39bff",piece6:"#ffa96b",panel:"#fff8f0"},texts:{"res.coins":Bn("Coins","\u041C\u043E\u043D\u0435\u0442\u043A\u0438","\u0422\u0438\u044B\u043D\u0434\u0430\u0440","\u786C\u5E01","\uCF54\uC778","\u30B3\u30A4\u30F3","\u0938\u093F\u0915\u094D\u0915\u0947","Moedas","M\xFCnzen"),"res.score":xa},races:["human","elf","dwarf"],cast:{hero:{preset:"camper",parts:{Glasses:null},races:["human"]},foe:{preset:"lumberjack",parts:{Weapon:"weapon/3",Back:null},races:["orc"]},foe2:{preset:"lumberjack",parts:{Weapon:null,Back:null},races:["dwarf"]},boss:{preset:"viking",races:["orc"]},helper:{preset:"camper",parts:{Weapon:null,Back:null,Glasses:null},races:["human","elf","dwarf"]},foe3:{preset:"hunter",parts:{Weapon:"weapon/hunting_bow"},races:["orc"]},foe4:{preset:"quarterback",races:["orc"]},foe5:{preset:"camper",parts:{Weapon:null,Back:null,Glasses:null},races:["orc"]},hero2:{preset:"quarterback",races:["human"]},hero3:{preset:"wizard",races:["elf"]}}},xl={id:"post-apocalypse",version:1,setting:"post-apocalypse",names:Bn("Post-apocalypse","\u041F\u043E\u0441\u0442\u0430\u043F\u043E\u043A\u0430\u043B\u0438\u043F\u0441\u0438\u0441","\u041F\u043E\u0441\u0442\u0430\u043F\u043E\u043A\u0430\u043B\u0438\u043F\u0441\u0438\u0441","\u672B\u65E5\u5E9F\u571F","\uD3EC\uC2A4\uD2B8 \uC544\uD3EC\uCE7C\uB9BD\uC2A4","\u30DD\u30B9\u30C8\u30A2\u30DD\u30AB\u30EA\u30D7\u30B9","\u092A\u094D\u0930\u0932\u092F \u0915\u0947 \u092C\u093E\u0926","P\xF3s-apocalipse","Postapokalypse"),palette:{background:"#1d1a16",ground:"#3a3328",lane:"#4d4436",primary:"#d9a441",secondary:"#7a8f5b",danger:"#b8402d",coin:"#e0c060",accent:"#8fa35a",text:"#f0e6d2",muted:"#a39a86",piece1:"#b8402d",piece2:"#5a7f9a",piece3:"#7a8f5b",piece4:"#e0c060",piece5:"#8a6a4a",piece6:"#d9762f",panel:"#2c2620"},texts:{"res.coins":Bn("Caps","\u041A\u0440\u044B\u0448\u043A\u0438","\u049A\u0430\u049B\u043F\u0430\u049B\u0442\u0430\u0440","\u74F6\u76D6","\uBCD1\uB69C\uAED1","\u30AD\u30E3\u30C3\u30D7","\u0922\u0915\u094D\u0915\u0928","Tampinhas","Kronkorken"),"res.score":xa},races:["human","undead","orc"],cast:{hero:{preset:"soldier",parts:{Hat:null,Gloves:"gloves/bracers"},races:["human"]},foe:{preset:"lumberjack",parts:{Weapon:null,Back:null,Gloves:null},races:["undead"]},foe2:{preset:"berserker",parts:{Hat:null,Offhand:null,Weapon:"weapon/mace"},races:["orc"]},boss:{preset:"berserker",parts:{Hat:"hat/great_helm",Weapon:"weapon/double_axe"},races:["orc"]},helper:{preset:"soldier",parts:{Hat:null,Weapon:null},races:["human"]},foe3:{preset:"musketeer",parts:{Weapon:"weapon/musket",Hat:null},races:["undead"]},foe4:{preset:"viking",parts:{Weapon:"weapon/mace"},races:["undead"]},foe5:{preset:"lumberjack",parts:{Weapon:"weapon/dagger",Back:null},races:["undead"]},hero2:{preset:"viking",parts:{Hat:null},races:["human"]},hero3:{preset:"ranger",races:["human"]}}},so=[gl,bl,vl,xl],yl=(e,t)=>(e.flows??[]).some(n=>n.resource===t.resource&&n.by===t.by&&n.kind===t.kind)?e:{...e,flows:[...e.flows??[],t]},ud=e=>e.resources?.find(t=>t.kind==="currency")?.id??"coins",kl=e=>t=>yl(t,{resource:ud(t),by:`system:${e}`,kind:"sink"}),Sl={id:"hero-upgrade",version:1,name:"link.hero-upgrade",core:["runner","platformer","survivors","tower-defense"],systems:["character"],apply:kl("character")},El={id:"puzzle-city",version:1,name:"link.puzzle-city",core:["match3","merge"],systems:[],apply(e){if(e.modes.some(s=>s.id==="city"))return e;let t=ud(e),n={...e,modes:[...e.modes,{id:"city",preset:"tycoon",role:"meta"}]};return yl(yl(n,{resource:t,by:"city",kind:"source",amount:"vars.coins"}),{resource:t,by:"system:store",kind:"sink"})}},Ml={id:"runner-collection",version:1,name:"link.runner-collection",core:["runner","platformer"],systems:["lootboxes","collections"],apply:kl("lootboxes")},_l={id:"defense-boosts",version:1,name:"link.defense-boosts",core:["tower-defense","survivors"],systems:["boosts"],apply:kl("boosts")},ka=[Sl,El,Ml,_l];var fd=(e,t)=>`${e.character}-${t}`;var hd={id:"runner",version:1,engine:"phaser",genre:"runner",name:"preset.runner",blocks:["round","lane-runner"],params:{difficulty:{type:"number",default:.5,min:0,max:1},generosity:{type:"number",default:.6,min:0,max:1},lanes:{type:"number",default:3,min:2,max:5,integer:true},lives:{type:"number",default:3,min:1,max:9,integer:true},length:{type:"number",default:1,min:.05,max:5}},blockParams:{"lane-runner":{lanes:"params.lanes",lives:"params.lives",difficulty:"params.difficulty",coinRate:"0.5 + params.generosity * 0.4",powerRate:"0.12 + params.generosity * 0.2",lengthScale:"params.length"}},produces:["soft","score"],placements:[{id:"reward_window",kind:"reward-window"},{id:"revive",kind:"revive",dailyLimit:5}]},ao={difficulty:{type:"number",default:.5,min:0,max:1},generosity:{type:"number",default:.6,min:0,max:1}},io=[{id:"reward_window",kind:"reward-window"}],md={id:"platformer",version:1,engine:"phaser",genre:"platformer",name:"preset.platformer",blocks:["round","platformer"],params:{...ao,lives:{type:"number",default:3,min:1,max:9,integer:true},doubleJump:{type:"boolean",default:false}},blockParams:{platformer:{difficulty:"params.difficulty",lives:"params.lives",doubleJump:"params.doubleJump"}},produces:["soft","score"],placements:[...io,{id:"revive",kind:"revive",dailyLimit:5}]},yd={id:"survivors",version:1,engine:"phaser",genre:"survivors",name:"preset.survivors",blocks:["round","survivors"],params:{...ao,minutes:{type:"number",default:5,min:.5,max:15}},blockParams:{survivors:{duration:"params.minutes * 60",spawnRate:"0.9 + params.difficulty * 0.6",spawnGrowth:"0.6 + params.difficulty * 0.6",foeHpGrowth:"0.3 + params.difficulty * 0.3",foeDamage:"0.8 + params.difficulty * 0.4",coinRate:"0.15 + params.generosity * 0.3",hp:"120 - params.difficulty * 40"}},produces:["soft","score"],placements:[...io,{id:"revive",kind:"revive",dailyLimit:5},{id:"reroll",kind:"retry",dailyLimit:10}]},gd={id:"tower-defense",version:2,engine:"phaser",genre:"tower-defense",name:"preset.tower-defense",blocks:["round","tower-defense"],params:{...ao,lives:{type:"number",default:20,min:1,max:100,integer:true}},blockParams:{"tower-defense":{difficulty:"params.difficulty",lives:"params.lives",coinRate:"0.08 + params.generosity * 0.25",earlyGold:"1 + params.generosity * 2"}},produces:["soft","score"],placements:[...io,{id:"revive",kind:"revive",dailyLimit:5}]},bd={id:"match3",version:2,engine:"phaser",genre:"match3",name:"preset.match3",blocks:["round","match3"],params:{...ao},blockParams:{match3:{difficulty:"params.difficulty",coinEvery:"12 - params.generosity * 7"}},produces:["soft","score","stars"],placements:[...io,{id:"revive",kind:"revive",dailyLimit:5}]},vd={id:"merge",version:2,engine:"phaser",genre:"merge",name:"preset.merge",blocks:["round","merge"],params:{...ao},blockParams:{merge:{difficulty:"params.difficulty",orderReward:"0.6 + params.generosity * 0.8"}},produces:["soft","score","stars"],placements:[...io,{id:"revive",kind:"revive",dailyLimit:5}]},xd={id:"tycoon",version:2,engine:"phaser",genre:"idle-tycoon",name:"preset.tycoon",blocks:["round","tycoon"],params:{...ao},blockParams:{tycoon:{difficulty:"params.difficulty",coinReward:"0.6 + params.generosity * 0.8"}},produces:["soft","score","stars"],placements:[...io,{id:"revive",kind:"revive",dailyLimit:5}]},kd=[hd,md,yd,gd,bd,vd,xd],jp=[Qo,ns,Is,Gs,Zs,vs,As,va];function Xp(e){po(e);for(let t of jp)e.has(Vn,t.id)||e.define(Vn,t);for(let t of so)e.has(kr,t.id)||e.define(kr,t);for(let t of ka)e.has(uo,t.id)||e.define(uo,t);for(let t of kd)e.has(Gn,t.id)||e.define(Gn,t);}var Yp={v:1,engine:"phaser",seed:"demo-runner",modes:[{id:"run",preset:"runner",role:"core"}],resources:[{id:"coins",kind:"currency",ref:"CO",name:"res.coins"},{id:"score",kind:"score",name:"res.score"}],flows:[{resource:"coins",by:"run",kind:"source",amount:"vars.coins"},{resource:"coins",by:"system:store",kind:"sink"},{resource:"score",by:"run",kind:"source",amount:"vars.score"}],texts:{title:{en:"Lane Dash",ru:"\u0420\u044B\u0432\u043E\u043A \u043F\u043E \u043F\u043E\u043B\u043E\u0441\u0430\u043C"},hint:{en:"Swipe or tap a side to change lanes",ru:"\u0421\u0432\u0430\u0439\u043F \u0438\u043B\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0435 \u0441\u0431\u043E\u043A\u0443 \u043C\u0435\u043D\u044F\u0435\u0442 \u043F\u043E\u043B\u043E\u0441\u0443"}}};function Jp(e,t={}){let n=e==="runner"?"run":"main";return {v:1,engine:"phaser",seed:t.seed??e,modes:[{id:n,preset:e,role:"core",...t.params?{params:t.params}:{}}],resources:[{id:"coins",kind:"currency",ref:t.coinRef??"CO",name:"res.coins"},{id:"score",kind:"score",name:"res.score"}],flows:[{resource:"coins",by:n,kind:"source",amount:"vars.coins"},{resource:"coins",by:"system:store",kind:"sink"},{resource:"score",by:n,kind:"source",amount:"vars.score"}],...t.texts?{texts:t.texts}:{},...t.palette?{palette:t.palette}:{},...t.assets?{assets:t.assets}:{}}}var Sd=255,Ed=10;var zn=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Ea=e=>e===void 0?e:JSON.parse(JSON.stringify(e)),Md=(e,t)=>JSON.stringify(e)===JSON.stringify(t),Zp=/^([A-Za-z0-9_-]+)(?:\[([A-Za-z0-9_-]+)=([^\]]*)\])?$/,Qp=/^'([^']+)'$/;function eu(e){let t=[],n="",s=false;for(let r of e)r==="'"&&(s=!s),r==="."&&!s?(t.push(n),n=""):n+=r;return t.push(n),t}function Ma(e){if(!e)return [];let t=[];for(let n of eu(e)){let s=Qp.exec(n);if(s){t.push({key:s[1]});continue}let r=Zp.exec(n);if(!r)return null;t.push(r[2]!==void 0?{key:r[1],match:{field:r[2],value:r[3]??""}}:{key:r[1]});}return t}function _d(e,t){let n=e.range;if(!n||t===void 0)return e.value;let s=Math.min(Math.max(Number.isFinite(t)?t:.5,0),1),r=n.min+s*(n.max-n.min);if(n.integer)return Math.round(r);let o=10**(n.digits??2);return Math.round(r*o)/o}function Sa(e,t){if(!zn(e)||!zn(t))return Ea(t);let n={...e};for(let[s,r]of Object.entries(t))n[s]=s in n?Sa(n[s],r):Ea(r);return n}function tu(e,t,n){let s=zn(e)?Ea(e):{},r=[];return t.forEach((o,d)=>{let p=Ma(o.path);if(!p){r.push(d);return}let v=Ea(_d(o,n));if(p.length===0){o.op==="set"&&zn(v)?s=v:o.op==="merge"&&zn(v)?s=Sa(s,v):r.push(d);return}let M=s;for(let E=0;E<p.length-1;E++){let I=nu(M,p[E],o.ifExists!==true);if(I===void 0){r.push(d);return}M=I;}let O=p[p.length-1];if(!zn(M)){r.push(d);return}if(O.match){let E=M[O.key];if(!Array.isArray(E)){r.push(d);return}let I=E.findIndex(K=>zn(K)&&String(K[O.match.field])===O.match.value);if(I<0){r.push(d);return}o.op==="set"?E[I]=v:o.op==="merge"?E[I]=Sa(E[I],v):o.op==="unset"?E.splice(I,1):r.push(d);return}if(o.ifExists===true&&M[O.key]===void 0){r.push(d);return}switch(o.op){case "set":M[O.key]=v;break;case "merge":M[O.key]=M[O.key]===void 0?v:Sa(M[O.key],v);break;case "unset":delete M[O.key];break;case "add":case "remove":{let E=Array.isArray(v)?v:[v],I=M[O.key];if(I!==void 0&&!Array.isArray(I)){r.push(d);return}let K=I?[...I]:[];if(o.op==="add")for(let z of E)K.some(ne=>Md(ne,z))||K.push(z);else for(let z of E){let ne=K.findIndex(ae=>Md(ae,z));ne>=0&&K.splice(ne,1);}M[O.key]=K;break}}}),{value:s,skipped:r}}function nu(e,t,n){if(zn(e)){if(t.match){let s=e[t.key];return Array.isArray(s)?s.find(r=>zn(r)&&String(r[t.match.field])===t.match.value):void 0}if(e[t.key]===void 0||e[t.key]===null){if(!n)return;e[t.key]={};}return e[t.key]}}function ru(e){return [...new Set(e.map(t=>`${t.section}:${t.path??""}`))]}var ou=/^#([0-9a-f]{6})$/i;function Rd(e){let t=ou.exec(e);if(!t)return [0,0,.5];let n=parseInt(t[1],16),s=(n>>16&255)/255,r=(n>>8&255)/255,o=(n&255)/255,d=Math.max(s,r,o),p=Math.min(s,r,o),v=(d+p)/2;if(d===p)return [0,0,v];let M=d-p,O=v>.5?M/(2-d-p):M/(d+p),E=d===s?(r-o)/M+(r<o?6:0):d===r?(o-s)/M+2:(s-r)/M+4;return E*=60,[E,O,v]}function Td(e,t,n){let s=(e%360+360)%360/360,r=Math.min(Math.max(t,0),1),o=Math.min(Math.max(n,0),1),d=v=>{let M=v;M<0&&(M+=1),M>1&&(M-=1);let O=o<.5?o*(1+r):o+r-o*r,E=2*o-O;return M<1/6?E+(O-E)*6*M:M<1/2?O:M<2/3?E+(O-E)*(2/3-M)*6:E},p=v=>Math.round(v*255).toString(16).padStart(2,"0");return r===0?`#${p(o)}${p(o)}${p(o)}`:`#${p(d(s+1/3))}${p(d(s))}${p(d(s-1/3))}`}function _a(e,t,n=1,s=0){let[r,o,d]=Rd(e);return Td(r+t,o*n,d+s)}function Ra(e,t){let[n,s,r]=Rd(e);return Td(n,s,r*(1-t))}var De=(e,t)=>({en:e,ru:t}),Tl=(e,t)=>({section:"Look",op:"set",path:e,value:t}),Rl=(e,t)=>({section:"GameSpec",op:"set",path:e,value:t}),su=[{id:"casual-violet",title:De("Violet casual","\u0424\u0438\u043E\u043B\u0435\u0442\u043E\u0432\u044B\u0439 \u043A\u0430\u0437\u0443\u0430\u043B"),what:"Bright blue-violet screens, chunky glossy buttons: the classic mobile casual look.",examples:["any casual game","puzzle","arcade"],bgTop:"#5865f2",bgBottom:"#5a3fd6",panel:"#3d8ff5",nav:"#2c3794",ink:"#17193a"},{id:"candy-pink",title:De("Candy pink","\u0420\u043E\u0437\u043E\u0432\u0430\u044F \u043A\u043E\u043D\u0444\u0435\u0442\u0430"),what:"Sweet pink and raspberry, playful and girly, candy shop mood.",examples:["sweets","fashion","pets","kids"],bgTop:"#ff7ac6",bgBottom:"#d94a9c",panel:"#ff9ad5",nav:"#a8306f",ink:"#4a1235"},{id:"sunny-orange",title:De("Sunny orange","\u0421\u043E\u043B\u043D\u0435\u0447\u043D\u044B\u0439 \u043E\u0440\u0430\u043D\u0436\u0435\u0432\u044B\u0439"),what:"Warm orange and yellow, cheerful summer energy.",examples:["beach","fruit","summer","food"],bgTop:"#ffb347",bgBottom:"#ff7a2f",panel:"#ffc75f",nav:"#c4521b",ink:"#4a2410"},{id:"forest-green",title:De("Forest green","\u041B\u0435\u0441\u043D\u043E\u0439 \u0437\u0435\u043B\u0451\u043D\u044B\u0439"),what:"Deep greens of a forest, calm nature mood.",examples:["farm","nature","elves","camping"],bgTop:"#4caf50",bgBottom:"#2e7d32",panel:"#66bb6a",nav:"#1b5e20",ink:"#0f2e12"},{id:"ocean-blue",title:De("Ocean blue","\u041E\u043A\u0435\u0430\u043D\u0441\u043A\u0438\u0439 \u0441\u0438\u043D\u0438\u0439"),what:"Sea blue and aqua, fresh water mood.",examples:["ocean","fishing","pirates","islands"],bgTop:"#29b6f6",bgBottom:"#0277bd",panel:"#4fc3f7",nav:"#01579b",ink:"#062c47"},{id:"midnight-navy",title:De("Midnight navy","\u041F\u043E\u043B\u043D\u043E\u0447\u043D\u044B\u0439 \u0441\u0438\u043D\u0438\u0439"),what:"Dark navy night, calm and serious, stars at night.",examples:["space","night","strategy","sleep"],bgTop:"#283593",bgBottom:"#0d1442",panel:"#3949ab",nav:"#141a52",ink:"#070a22"},{id:"neon-cyber",title:De("Neon cyber","\u041D\u0435\u043E\u043D\u043E\u0432\u044B\u0439 \u043A\u0438\u0431\u0435\u0440"),what:"Black with neon cyan and magenta, cyberpunk and synthwave.",examples:["cyberpunk","hackers","racing at night","sci-fi"],bgTop:"#1a1033",bgBottom:"#07040f",panel:"#2b1a55",nav:"#120a26",ink:"#00e5ff",gold:"#ff3df5",green:"#00ffa3"},{id:"space-purple",title:De("Space purple","\u041A\u043E\u0441\u043C\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u043F\u0443\u0440\u043F\u0443\u0440"),what:"Deep purple space with nebula tones.",examples:["space","aliens","galaxy","magic"],bgTop:"#6a1b9a",bgBottom:"#2a0845",panel:"#8e24aa",nav:"#38006b",ink:"#16001f"},{id:"lava-red",title:De("Lava red","\u041B\u0430\u0432\u043E\u0432\u044B\u0439 \u043A\u0440\u0430\u0441\u043D\u044B\u0439"),what:"Hot red and black, danger, fire and action.",examples:["fire","volcano","action","boss fights"],bgTop:"#e53935",bgBottom:"#7f0000",panel:"#ef5350",nav:"#5c0000",ink:"#2a0000"},{id:"royal-gold",title:De("Royal gold","\u041A\u043E\u0440\u043E\u043B\u0435\u0432\u0441\u043A\u043E\u0435 \u0437\u043E\u043B\u043E\u0442\u043E"),what:"Gold and deep burgundy, rich, royal and luxurious.",examples:["kings","casino","treasure","empire"],bgTop:"#8e2b3a",bgBottom:"#4a0f1c",panel:"#b3424f",nav:"#3a0a15",ink:"#1f0509",gold:"#ffcf40"},{id:"ice-frost",title:De("Ice frost","\u041B\u0435\u0434\u044F\u043D\u043E\u0439"),what:"Pale icy blue and white, winter and snow.",examples:["winter","snow","christmas","north"],bgTop:"#e3f6ff",bgBottom:"#9fd7f5",panel:"#ffffff",nav:"#5aa6d6",ink:"#1d4a6b",light:true},{id:"paper-light",title:De("Paper light","\u0421\u0432\u0435\u0442\u043B\u0430\u044F \u0431\u0443\u043C\u0430\u0433\u0430"),what:"Clean light paper, minimal and calm, for word and brain games.",examples:["words","quiz","sudoku","education"],bgTop:"#fbf7ef",bgBottom:"#efe6d5",panel:"#ffffff",nav:"#cdbfa6",ink:"#3d3428",light:true},{id:"mint-fresh",title:De("Mint fresh","\u0421\u0432\u0435\u0436\u0430\u044F \u043C\u044F\u0442\u0430"),what:"Light mint and teal, fresh and soft.",examples:["cafe","health","relax","spa"],bgTop:"#b9f6e3",bgBottom:"#5fd4b0",panel:"#e6fff7",nav:"#2f9b80",ink:"#0e3d33",light:true},{id:"lemon-pop",title:De("Lemon pop","\u041B\u0438\u043C\u043E\u043D\u043D\u044B\u0439 \u043F\u043E\u043F"),what:"Bright lemon yellow, loud and happy pop art.",examples:["comics","party","kids","music"],bgTop:"#fff176",bgBottom:"#fbc02d",panel:"#fff9c4",nav:"#c49000",ink:"#3d2c00",light:true},{id:"peach-soft",title:De("Soft peach","\u041D\u0435\u0436\u043D\u044B\u0439 \u043F\u0435\u0440\u0441\u0438\u043A"),what:"Soft peach and coral pastel, cosy and gentle.",examples:["cooking","home decor","romance","pets"],bgTop:"#ffd3b6",bgBottom:"#ffaa85",panel:"#fff0e6",nav:"#d9775a",ink:"#4a2418",light:true},{id:"lavender-dream",title:De("Lavender dream","\u041B\u0430\u0432\u0430\u043D\u0434\u043E\u0432\u044B\u0439 \u0441\u043E\u043D"),what:"Pastel lavender, dreamy and magical.",examples:["fairies","unicorns","dreams","princess"],bgTop:"#e1d5ff",bgBottom:"#b39ddb",panel:"#f5f0ff",nav:"#7e57c2",ink:"#2e1a4d",light:true},{id:"toxic-lime",title:De("Toxic lime","\u042F\u0434\u043E\u0432\u0438\u0442\u044B\u0439 \u043B\u0430\u0439\u043C"),what:"Acid lime on dark, toxic, zombies and slime.",examples:["zombies","slime","chemistry","monsters"],bgTop:"#33402a",bgBottom:"#141a10",panel:"#4b5e35",nav:"#1c2414",ink:"#a6ff00",gold:"#d4ff3d",green:"#7dff2a"},{id:"desert-sand",title:De("Desert sand","\u041F\u0443\u0441\u0442\u044B\u043D\u043D\u044B\u0439 \u043F\u0435\u0441\u043E\u043A"),what:"Sand, ochre and terracotta, desert and ancient ruins.",examples:["egypt","western","desert","archaeology"],bgTop:"#e0b075",bgBottom:"#b5763f",panel:"#f0c995",nav:"#8a5126",ink:"#3b2210"},{id:"rust-wasteland",title:De("Rust wasteland","\u0420\u0436\u0430\u0432\u0430\u044F \u043F\u0443\u0441\u0442\u043E\u0448\u044C"),what:"Rusty brown and dusty orange, post-apocalypse scrap.",examples:["post-apocalypse","scrap","survival","mad roads"],bgTop:"#6d4c41",bgBottom:"#2e1f1a",panel:"#8d6e63",nav:"#3e2723",ink:"#140c09",gold:"#ff9e40"},{id:"steel-gray",title:De("Steel gray","\u0421\u0442\u0430\u043B\u044C\u043D\u043E\u0439 \u0441\u0435\u0440\u044B\u0439"),what:"Cool steel and graphite, military and industrial.",examples:["army","tanks","factory","robots"],bgTop:"#607d8b",bgBottom:"#263238",panel:"#78909c",nav:"#1c262b",ink:"#0b1013"},{id:"jungle-teal",title:De("Jungle teal","\u0422\u0440\u043E\u043F\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u0431\u0438\u0440\u044E\u0437\u043E\u0432\u044B\u0439"),what:"Teal and jungle green, tropical adventure.",examples:["jungle","tropics","dinosaurs","explorers"],bgTop:"#26a69a",bgBottom:"#00695c",panel:"#4db6ac",nav:"#004d40",ink:"#00211c"},{id:"berry-plum",title:De("Berry plum","\u042F\u0433\u043E\u0434\u043D\u0430\u044F \u0441\u043B\u0438\u0432\u0430"),what:"Plum and berry purple, juicy and rich.",examples:["berries","potions","fashion","music"],bgTop:"#ad1457",bgBottom:"#4a0072",panel:"#c2185b",nav:"#38004d",ink:"#1a0024"},{id:"sky-day",title:De("Clear sky","\u042F\u0441\u043D\u043E\u0435 \u043D\u0435\u0431\u043E"),what:"Light sky blue with white clouds, open and friendly.",examples:["flying","birds","kids","travel"],bgTop:"#bfe9ff",bgBottom:"#6ec6ff",panel:"#ffffff",nav:"#3a9ad9",ink:"#123a5a",light:true},{id:"chocolate",title:De("Chocolate","\u0428\u043E\u043A\u043E\u043B\u0430\u0434"),what:"Brown chocolate and caramel, sweet and warm.",examples:["bakery","coffee","sweets","autumn"],bgTop:"#8d5a3b",bgBottom:"#4e2c1a",panel:"#a6704b",nav:"#3b2012",ink:"#1a0d06",gold:"#ffc56b"},{id:"autumn-maple",title:De("Autumn maple","\u041E\u0441\u0435\u043D\u043D\u0438\u0439 \u043A\u043B\u0451\u043D"),what:"Orange and red autumn leaves, harvest mood.",examples:["autumn","halloween","harvest","forest"],bgTop:"#ef6c00",bgBottom:"#8c2f00",panel:"#f57c00",nav:"#6b2300",ink:"#2b0e00"},{id:"spooky-night",title:De("Spooky night","\u0416\u0443\u0442\u043A\u0430\u044F \u043D\u043E\u0447\u044C"),what:"Dark purple and pumpkin orange, ghosts and halloween.",examples:["halloween","ghosts","horror lite","witches"],bgTop:"#311b92",bgBottom:"#120838",panel:"#4527a0",nav:"#0d0629",ink:"#05020f",gold:"#ff8f00"},{id:"sakura",title:De("Sakura","\u0421\u0430\u043A\u0443\u0440\u0430"),what:"Cherry blossom pink with soft white, japanese spring.",examples:["japan","anime","spring","ninja lite"],bgTop:"#ffd6e7",bgBottom:"#f48fb1",panel:"#fff3f8",nav:"#c2185b",ink:"#4d0f2a",light:true},{id:"matrix-green",title:De("Terminal green","\u0422\u0435\u0440\u043C\u0438\u043D\u0430\u043B\u044C\u043D\u044B\u0439 \u0437\u0435\u043B\u0451\u043D\u044B\u0439"),what:"Black with bright terminal green, hacker console.",examples:["hacking","code","retro computers","spy"],bgTop:"#0b1f0f",bgBottom:"#000000",panel:"#123317",nav:"#06120a",ink:"#39ff6a",gold:"#c6ff00",green:"#39ff6a"},{id:"retro-arcade",title:De("Retro arcade","\u0420\u0435\u0442\u0440\u043E-\u0430\u0440\u043A\u0430\u0434\u0430"),what:"Eighties arcade: deep blue with hot pink and yellow.",examples:["retro","pixel","80s","arcade"],bgTop:"#1e2a78",bgBottom:"#0a0f3d",panel:"#ff2e88",nav:"#0a0f3d",ink:"#05071f",gold:"#ffe600"},{id:"stone-dungeon",title:De("Stone dungeon","\u041A\u0430\u043C\u0435\u043D\u043D\u043E\u0435 \u043F\u043E\u0434\u0437\u0435\u043C\u0435\u043B\u044C\u0435"),what:"Dark stone and torchlight, dungeons and castles.",examples:["dungeon","castle","knights","rpg"],bgTop:"#4e4a46",bgBottom:"#1f1c1a",panel:"#6b655e",nav:"#171513",ink:"#0a0908",gold:"#ffb300"},{id:"emerald-luxe",title:De("Emerald luxe","\u0418\u0437\u0443\u043C\u0440\u0443\u0434\u043D\u044B\u0439 \u043B\u044E\u043A\u0441"),what:"Emerald green with gold, wealth and luck.",examples:["casino","luck","money","irish"],bgTop:"#00695c",bgBottom:"#00251a",panel:"#00897b",nav:"#001a12",ink:"#000c08",gold:"#ffd54f"},{id:"bubblegum",title:De("Bubblegum","\u0416\u0432\u0430\u0447\u043A\u0430"),what:"Pastel cyan and pink together, fun and bouncy.",examples:["kids","toys","party","bubbles"],bgTop:"#a0f0ff",bgBottom:"#ff9fe0",panel:"#ffffff",nav:"#d66bb4",ink:"#3a1f4d",light:true},{id:"military-olive",title:De("Military olive","\u0410\u0440\u043C\u0435\u0439\u0441\u043A\u0430\u044F \u043E\u043B\u0438\u0432\u0430"),what:"Olive drab and khaki, army and survival.",examples:["army","war","survival","hunting"],bgTop:"#6b7a3a",bgBottom:"#33391b",panel:"#808f4a",nav:"#262b14",ink:"#101207",gold:"#e6c34d"},{id:"deep-sea",title:De("Deep sea","\u041C\u043E\u0440\u0441\u043A\u0430\u044F \u0431\u0435\u0437\u0434\u043D\u0430"),what:"Very dark teal-blue of the deep ocean with glowing tones.",examples:["submarine","deep sea","mermaids","monsters"],bgTop:"#004e64",bgBottom:"#001219",panel:"#00677f",nav:"#000c11",ink:"#000508",gold:"#94fbab",green:"#4dfff3"},{id:"sunset",title:De("Sunset","\u0417\u0430\u043A\u0430\u0442"),what:"Orange to purple sunset gradient, warm evening.",examples:["travel","music","romance","racing"],bgTop:"#ff8a65",bgBottom:"#6a1b9a",panel:"#ff7043",nav:"#4a148c",ink:"#1f0738"},{id:"arctic-night",title:De("Polar night","\u041F\u043E\u043B\u044F\u0440\u043D\u0430\u044F \u043D\u043E\u0447\u044C"),what:"Dark blue with aurora green and cyan.",examples:["aurora","north","winter night","magic"],bgTop:"#0d3b66",bgBottom:"#021526",panel:"#145374",nav:"#01101e",ink:"#000810",gold:"#7cf5c8",green:"#3ff2a0"},{id:"honey",title:De("Honey","\u041C\u0451\u0434"),what:"Golden honey amber, warm and sweet, bees and farms.",examples:["bees","farm","bakery","sunny"],bgTop:"#ffca28",bgBottom:"#ff8f00",panel:"#ffe082",nav:"#b26a00",ink:"#3d2400"},{id:"monochrome",title:De("Monochrome","\u041C\u043E\u043D\u043E\u0445\u0440\u043E\u043C"),what:"Black, white and gray only, strict and stylish.",examples:["noir","minimal","chess","detective"],bgTop:"#3a3a3a",bgBottom:"#111111",panel:"#555555",nav:"#0c0c0c",ink:"#000000",gold:"#ffffff",green:"#d9d9d9"},{id:"tropical-punch",title:De("Tropical punch","\u0422\u0440\u043E\u043F\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u043F\u0443\u043D\u0448"),what:"Hot coral, turquoise and yellow, tropical party.",examples:["tropics","summer party","cocktails","carnival"],bgTop:"#ff5e62",bgBottom:"#ff9966",panel:"#1de9b6",nav:"#c2364a",ink:"#3d0f16"},{id:"cloud-gray",title:De("Soft gray","\u041C\u044F\u0433\u043A\u0438\u0439 \u0441\u0435\u0440\u044B\u0439"),what:"Light neutral gray, calm and modern, apps and tools.",examples:["tools","productivity","calm puzzle","office"],bgTop:"#f2f4f7",bgBottom:"#d5dae1",panel:"#ffffff",nav:"#8a94a6",ink:"#2b313b",light:true}];function au(e){let t={bgTop:e.bgTop,bgBottom:e.bgBottom,panel:e.panel,panelDeep:Ra(e.panel,.18),panelEdge:e.ink,ink:e.ink,nav:e.nav,text:e.light?e.ink:"#ffffff",textDim:e.light?_a(e.ink,0,.6,.25):_a(e.panel,0,.5,.35)};return e.gold&&(t.gold=e.gold,t.goldDeep=Ra(e.gold,.2)),e.green&&(t.green=e.green,t.greenDeep=Ra(e.green,.25)),{id:e.id,title:e.title,what:e.what,examples:e.examples,swatch:[e.bgTop,e.bgBottom,e.panel,e.gold??"#ffd43b"],patches:[Tl("Theme",t)]}}var Od=su.map(au),iu=[{id:"classic",title:De("Classic","\u041A\u043B\u0430\u0441\u0441\u0438\u043A\u0430"),what:"The pack's own colours.",dh:0,sat:1,dl:0},{id:"dawn",title:De("Dawn","\u0420\u0430\u0441\u0441\u0432\u0435\u0442"),what:"Lighter and warmer, a morning mood.",dh:20,sat:1.05,dl:.08},{id:"night",title:De("Night","\u041D\u043E\u0447\u044C"),what:"Darker and bluer, a night mood.",dh:-35,sat:.9,dl:-0.07},{id:"ember",title:De("Ember","\u0423\u0433\u043B\u0438"),what:"Shifted to red and orange, hot and dangerous.",dh:-60,sat:1.15,dl:0},{id:"frost",title:De("Frost","\u0418\u043D\u0435\u0439"),what:"Shifted to cyan and pale blue, cold and icy.",dh:140,sat:.8,dl:.05},{id:"toxic",title:De("Toxic","\u042F\u0434"),what:"Shifted to acid green and yellow, toxic.",dh:70,sat:1.25,dl:0},{id:"royal",title:De("Royal","\u041A\u043E\u0440\u043E\u043B\u0435\u0432\u0441\u043A\u0438\u0439"),what:"Shifted to purple and violet, magical and noble.",dh:200,sat:1.1,dl:0},{id:"faded",title:De("Faded","\u0412\u044B\u0446\u0432\u0435\u0442\u0448\u0438\u0439"),what:"Muted, low saturation, old photo and dusty.",dh:0,sat:.45,dl:.03}],lu=["background","ground","lane","primary","secondary","accent","muted","panel"],Dd=so.flatMap(e=>iu.map(t=>{let n={...e.palette};for(let s of lu){let r=e.palette[s];r&&(n[s]=_a(r,t.dh,t.sat,t.dl));}return {id:`${e.id}-${t.id}`,title:{en:`${e.names.en??e.id}: ${t.title.en}`,ru:`${e.names.ru??e.id}: ${t.title.ru}`},what:`${e.names.en??e.id} world. ${t.what}`,swatch:[n.background,n.ground,n.primary,n.accent],patches:[Rl("assets",e.id),Rl("palette",n)]}})),cu=[["knight","Knight","\u0420\u044B\u0446\u0430\u0440\u044C","An armoured knight with a sword and shield, brave and classic."],["dark_knight","Dark knight","\u0422\u0451\u043C\u043D\u044B\u0439 \u0440\u044B\u0446\u0430\u0440\u044C","A knight in black armour, grim and mighty."],["archmage","Archmage","\u0410\u0440\u0445\u0438\u043C\u0430\u0433","An old wizard in robes with a staff, magic and wisdom."],["berserker","Berserker","\u0411\u0435\u0440\u0441\u0435\u0440\u043A","A wild warrior with a big axe, rage and strength."],["hunter","Hunter","\u041E\u0445\u043E\u0442\u043D\u0438\u043A","A hunter with a bow and a hood, forests and tracking."],["crossbowman","Crossbowman","\u0410\u0440\u0431\u0430\u043B\u0435\u0442\u0447\u0438\u043A","A soldier with a crossbow, a careful shooter."],["gunslinger","Gunslinger","\u0421\u0442\u0440\u0435\u043B\u043E\u043A","A cowboy gunslinger, the wild west and duels."],["musketeer","Musketeer","\u041C\u0443\u0448\u043A\u0435\u0442\u0451\u0440","A musketeer with a hat and a musket, honour and adventure."],["soldier","Soldier","\u0421\u043E\u043B\u0434\u0430\u0442","A modern soldier with a rifle, war and missions."],["quarterback","Quarterback","\u041A\u0432\u043E\u0442\u0435\u0440\u0431\u0435\u043A","An american football player, sport and teams."],["lumberjack","Lumberjack","\u041B\u0435\u0441\u043E\u0440\u0443\u0431","A bearded lumberjack in a checked shirt with an axe, woods and work."],["viking","Viking","\u0412\u0438\u043A\u0438\u043D\u0433","A horned viking with a hammer, the north and raids."],["wizard","Wizard","\u0412\u043E\u043B\u0448\u0435\u0431\u043D\u0438\u043A","A young wizard with a pointy hat, spells and school of magic."],["ranger","Ranger","\u0421\u043B\u0435\u0434\u043E\u043F\u044B\u0442","A ranger of the wild, light armour and a long bow."],["king","King","\u041A\u043E\u0440\u043E\u043B\u044C","A king with a crown and a cape, kingdoms and rule."],["camper","Camper","\u0422\u0443\u0440\u0438\u0441\u0442","A casual hiker with a backpack, everyday modern life."],["crusader","Crusader","\u041A\u0440\u0435\u0441\u0442\u043E\u043D\u043E\u0441\u0435\u0446","A holy warrior in white and gold, light against darkness."]],Ad=cu.map(([e,t,n,s])=>({id:e,title:De(t,n),what:s,patches:[Rl("cast.hero.preset",e)]})),Ld=[["gear","Game gear","\u0418\u0433\u0440\u043E\u0432\u044B\u0435 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u044B","Faint swords, shields, potions, gems and crowns: the classic casual game look."],["plain","Plain gradient","\u0427\u0438\u0441\u0442\u044B\u0439 \u0433\u0440\u0430\u0434\u0438\u0435\u043D\u0442","No pattern, only the theme's gradient."],["dots","Polka dots","\u0413\u043E\u0440\u043E\u0448\u0435\u043A","Soft polka dots, playful."],["stripes","Diagonal stripes","\u0414\u0438\u0430\u0433\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u0435 \u043F\u043E\u043B\u043E\u0441\u044B","Diagonal stripes, energetic and sporty."],["grid","Grid","\u0421\u0435\u0442\u043A\u0430","A thin grid like graph paper, tech or puzzle."],["hex","Honeycomb","\u0421\u043E\u0442\u044B","A honeycomb pattern, bees, sci-fi or strategy."],["stars","Stars","\u0417\u0432\u0451\u0437\u0434\u044B","Small scattered stars, night, space or magic."],["waves","Waves","\u0412\u043E\u043B\u043D\u044B","Soft waves, water and the sea."],["checker","Checkerboard","\u0428\u0430\u0445\u043C\u0430\u0442\u043A\u0430","A checkerboard, board games, racing flags."],["confetti","Confetti","\u041A\u043E\u043D\u0444\u0435\u0442\u0442\u0438","Colourful confetti bits, party and celebration."],["bubbles","Bubbles","\u041F\u0443\u0437\u044B\u0440\u0438","Round bubbles of different sizes, underwater or soda."],["zigzag","Zigzag","\u0417\u0438\u0433\u0437\u0430\u0433","A bold zigzag, retro and pop."],["diamonds","Diamonds","\u0420\u043E\u043C\u0431\u044B","A diamond pattern, cards, casino, royal."],["clouds","Clouds","\u041E\u0431\u043B\u0430\u043A\u0430","Puffy clouds, sky and dreams."],["leaves","Leaves","\u041B\u0438\u0441\u0442\u044C\u044F","Scattered leaves, nature, forest and autumn."],["circuit","Circuit","\u041C\u0438\u043A\u0440\u043E\u0441\u0445\u0435\u043C\u0430","Circuit board lines, robots, hackers and tech."],["sparkles","Sparkles","\u0418\u0441\u043A\u0440\u044B","Twinkling sparkles, magic, fairies and treasure."],["rays","Sun rays","\u041B\u0443\u0447\u0438","Rays from the centre, victory and big wins."],["bricks","Bricks","\u041A\u0438\u0440\u043F\u0438\u0447\u0438","A brick wall, city, castle or dungeon."],["paws","Paw prints","\u0421\u043B\u0435\u0434\u044B \u043B\u0430\u043F","Little paw prints, pets and animals."],["snow","Snowflakes","\u0421\u043D\u0435\u0436\u0438\u043D\u043A\u0438","Falling snowflakes, winter and holidays."]],wd=Ld.map(([e,t,n,s])=>({id:e,title:De(t,n),what:s,patches:[Tl("Background",e)]})),Pd=[["classic","Classic","\u041A\u043B\u0430\u0441\u0441\u0438\u043A\u0430","The kit's default bright casual clicks and coins."],["soft","Soft","\u041C\u044F\u0433\u043A\u0438\u0435","Quiet, rounded, calm sounds for relaxing games."],["retro","Retro 8-bit","\u0420\u0435\u0442\u0440\u043E 8-\u0431\u0438\u0442","Square-wave chiptune bleeps of old consoles."],["magic","Magic","\u041C\u0430\u0433\u0438\u044F","Shimmering chimes and sparkles, fairy-tale."],["sci-fi","Sci-fi","\u0424\u0430\u043D\u0442\u0430\u0441\u0442\u0438\u043A\u0430","Electronic blips and sweeps, space and robots."],["wood","Wooden","\u0414\u0435\u0440\u0435\u0432\u044F\u043D\u043D\u044B\u0435","Short wooden knocks and marimba, cosy and natural."]],Cd=Pd.map(([e,t,n,s])=>({id:e,title:De(t,n),what:s,patches:[Tl("SoundSet",e)]})),du={backgrounds:Ld.map(e=>e[0]),soundSets:Pd.map(e=>e[0])},Ol={"ui-themes":Od,"kit-palettes":Dd,"hero-looks":Ad,backgrounds:wd,"sound-sets":Cd};var Id=1,V=(e,t)=>({en:e,ru:t}),yt=(e,t)=>({section:"Look",op:"set",path:e,value:t}),Qn=(e,t,n,s=false)=>({section:"GameSpec",op:"set",path:`modes[role=core].params.${e}`,range:{min:t,max:n,...s?{integer:true}:{}}}),Ct=(e,t)=>({section:"GameSpec",op:"add",path:`modes[role=core].content.${e}.without`,value:t}),gt=(e,t)=>({section:"GameSpec",op:"remove",path:`modes[role=core].content.${e}.without`,value:t}),Fo={modules:["kit-game"]},pu=[{id:"look.theme",group:"look",title:V("Interface colours","\u0426\u0432\u0435\u0442\u0430 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430"),hint:V("Screens, panels and buttons of the whole app.","\u042D\u043A\u0440\u0430\u043D\u044B, \u043F\u0430\u043D\u0435\u043B\u0438 \u0438 \u043A\u043D\u043E\u043F\u043A\u0438 \u0432\u0441\u0435\u0433\u043E \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F."),question:"Pick the colour theme of the app's interface (menus, panels, buttons) that fits this product best.",kind:"choice",list:"ui-themes"},{id:"look.background",group:"look",title:V("Screen pattern","\u0423\u0437\u043E\u0440 \u0444\u043E\u043D\u0430"),hint:V("A pattern over the screens' gradient.","\u0423\u0437\u043E\u0440 \u043F\u043E\u0432\u0435\u0440\u0445 \u0433\u0440\u0430\u0434\u0438\u0435\u043D\u0442\u0430 \u044D\u043A\u0440\u0430\u043D\u043E\u0432."),question:"Pick the background pattern of the app's screens that fits this product best.",kind:"choice",list:"backgrounds"},{id:"look.shape",group:"look",title:V("Shape of buttons","\u0424\u043E\u0440\u043C\u0430 \u043A\u043D\u043E\u043F\u043E\u043A"),question:"What shape should the buttons and panels of the interface have?",kind:"choice",options:[{id:"chunky",title:V("Chunky round","\u041F\u0443\u0445\u043B\u044B\u0435 \u043A\u0440\u0443\u0433\u043B\u044B\u0435"),what:"Big rounded corners and a thick outline: toy-like, casual, for kids.",patches:[yt("Radius",18),yt("ButtonRadius",16),yt("Outline",3)]},{id:"classic",title:V("Classic","\u041A\u043B\u0430\u0441\u0441\u0438\u043A\u0430"),what:"Medium rounded corners and a normal outline: the default mobile casual look.",patches:[yt("Radius",14),yt("ButtonRadius",12),yt("Outline",3)]},{id:"sharp",title:V("Sharp","\u0421\u0442\u0440\u043E\u0433\u0438\u0435"),what:"Small corners and a thin outline: serious, tactical, strategy or sci-fi.",patches:[yt("Radius",4),yt("ButtonRadius",4),yt("Outline",2)]},{id:"pill",title:V("Pills","\u0422\u0430\u0431\u043B\u0435\u0442\u043A\u0438"),what:"Fully round pill buttons, no outline: soft, modern, minimal.",patches:[yt("Radius",24),yt("ButtonRadius",32),yt("Outline",0)]}]},{id:"look.motion",group:"look",title:V("Animations","\u0410\u043D\u0438\u043C\u0430\u0446\u0438\u0438"),question:"How lively should the interface animations be?",kind:"choice",options:[{id:"calm",title:V("Calm","\u0421\u043F\u043E\u043A\u043E\u0439\u043D\u044B\u0435"),what:"Slow, soft, no bounce: relaxing, meditative, for brain games.",patches:[yt("MotionSpeed",.7),yt("MotionIntensity",.3),yt("Particles",false)]},{id:"normal",title:V("Normal","\u041E\u0431\u044B\u0447\u043D\u044B\u0435"),what:"The default lively casual animations.",patches:[yt("MotionSpeed",1),yt("MotionIntensity",1),yt("Particles",true)]},{id:"bouncy",title:V("Bouncy","\u041F\u0440\u0443\u0436\u0438\u043D\u0438\u0441\u0442\u044B\u0435"),what:"Strong bounces and overshoots: cartoonish, playful, for kids.",patches:[yt("MotionSpeed",1.1),yt("MotionIntensity",2),yt("Particles",true)]},{id:"snappy",title:V("Snappy","\u0420\u0435\u0437\u043A\u0438\u0435"),what:"Very fast and short, little bounce: action, arcade, competitive.",patches:[yt("MotionSpeed",1.8),yt("MotionIntensity",.6),yt("Particles",true)]}]},{id:"look.sound",group:"look",title:V("Interface sounds","\u0417\u0432\u0443\u043A\u0438 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430"),question:"Pick the sound style of the interface (clicks, rewards, coins) that fits this product best.",kind:"choice",list:"sound-sets"}],uu=[{id:"look.kit.palette",group:"look",title:V("World and colours of the game","\u041C\u0438\u0440 \u0438 \u0446\u0432\u0435\u0442\u0430 \u0438\u0433\u0440\u044B"),hint:V("The game's world (fantasy, sci-fi, cozy, post-apocalypse) and its colour mood.","\u041C\u0438\u0440 \u0438\u0433\u0440\u044B (\u0444\u044D\u043D\u0442\u0435\u0437\u0438, \u0444\u0430\u043D\u0442\u0430\u0441\u0442\u0438\u043A\u0430, \u0443\u044E\u0442, \u043F\u043E\u0441\u0442\u0430\u043F\u043E\u043A\u0430\u043B\u0438\u043F\u0441\u0438\u0441) \u0438 \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043D\u0438\u0435 \u0446\u0432\u0435\u0442\u0430."),for:Fo,question:"Pick the world and colour mood of the game scene that fits this idea best.",kind:"choice",list:"kit-palettes"},{id:"look.kit.hero",group:"look",title:V("The hero","\u0413\u0435\u0440\u043E\u0439"),for:Fo,question:"Pick the look of the game's main hero that fits this idea best.",kind:"choice",list:"hero-looks"},{id:"look.kit.race",group:"look",title:V("Hero's race","\u0420\u0430\u0441\u0430 \u0433\u0435\u0440\u043E\u044F"),for:Fo,question:"Which race should the main hero be?",kind:"choice",options:[["human","Human","\u0427\u0435\u043B\u043E\u0432\u0435\u043A","An ordinary human."],["elf","Elf","\u042D\u043B\u044C\u0444","A graceful elf with pointed ears: forests, magic, archery."],["dwarf","Dwarf","\u0413\u043D\u043E\u043C","A stout bearded dwarf: mines, forges, hammers."],["orc","Orc","\u041E\u0440\u043A","A green orc with tusks: brute strength, war, savage lands."],["undead","Undead","\u041D\u0435\u0436\u0438\u0442\u044C","A pale undead: skeletons, graveyards, dark magic, halloween."]].map(([e,t,n,s])=>({id:e,title:V(t,n),what:s,patches:[{section:"GameSpec",op:"set",path:"cast.hero.races",value:[e]}]}))}],fu=[{id:"feel.difficulty",group:"feel",title:V("Difficulty","\u0421\u043B\u043E\u0436\u043D\u043E\u0441\u0442\u044C"),for:Fo,question:"How hard should this game be for its players?",kind:"score",levelTitles:[V("Very easy","\u041E\u0447\u0435\u043D\u044C \u043B\u0435\u0433\u043A\u043E"),V("Easy","\u041B\u0435\u0433\u043A\u043E"),V("Balanced","\u0421\u0431\u0430\u043B\u0430\u043D\u0441\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u043E"),V("Hard","\u0421\u043B\u043E\u0436\u043D\u043E"),V("Very hard","\u041E\u0447\u0435\u043D\u044C \u0441\u043B\u043E\u0436\u043D\u043E")],levels:["Very easy and relaxing, for kids or a calm break.","Easy, casual.","Balanced: easy to start, harder later.","Hard, for players who like a challenge.","Very hard and punishing."],patches:[Qn("difficulty",0,1)]},{id:"feel.generosity",group:"feel",title:V("Rewards in the game","\u041D\u0430\u0433\u0440\u0430\u0434\u044B \u0432 \u0438\u0433\u0440\u0435"),for:Fo,question:"How generous should the game's rewards be?",kind:"score",levelTitles:[V("Stingy","\u0421\u043A\u0443\u043F\u043E"),V("Modest","\u0421\u043A\u0440\u043E\u043C\u043D\u043E"),V("Normal","\u041E\u0431\u044B\u0447\u043D\u043E"),V("Generous","\u0429\u0435\u0434\u0440\u043E"),V("Very generous","\u041E\u0447\u0435\u043D\u044C \u0449\u0435\u0434\u0440\u043E")],levels:["Stingy: rewards are rare and earned slowly.","Modest rewards.","Normal rewards.","Generous rewards.","Very generous: rewards rain down."],patches:[Qn("generosity",0,1)]},{id:"feel.runner.lanes",group:"feel",title:V("Lanes","\u041F\u043E\u043B\u043E\u0441\u044B"),for:{modules:["kit-game"],presets:["runner"]},question:"How wide should the running track be?",kind:"score",levelTitles:[V("2 lanes","2 \u043F\u043E\u043B\u043E\u0441\u044B"),V("3 lanes","3 \u043F\u043E\u043B\u043E\u0441\u044B"),V("4 lanes","4 \u043F\u043E\u043B\u043E\u0441\u044B"),V("5 lanes","5 \u043F\u043E\u043B\u043E\u0441")],levels:["Narrow: two lanes, simple and quick.","Normal: three lanes.","Wide: four lanes.","Very wide: five lanes, lots of dodging."],patches:[Qn("lanes",2,5,true)]},{id:"feel.runner.lives",group:"feel",title:V("Lives in a run","\u0416\u0438\u0437\u043D\u0438 \u0432 \u0437\u0430\u0431\u0435\u0433\u0435"),for:{modules:["kit-game"],presets:["runner"]},question:"How many hits should the runner survive?",kind:"score",levelTitles:[V("One hit","\u041E\u0434\u0438\u043D \u0443\u0434\u0430\u0440"),V("A few","\u041D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E"),V("Many","\u041C\u043D\u043E\u0433\u043E")],levels:["One hit ends the run.","A few lives.","Many lives, forgiving."],patches:[Qn("lives",1,6,true)]},{id:"feel.runner.length",group:"feel",title:V("Length of levels","\u0414\u043B\u0438\u043D\u0430 \u0443\u0440\u043E\u0432\u043D\u0435\u0439"),for:{modules:["kit-game"],presets:["runner"]},question:"How long should one level of the run be?",kind:"score",levelTitles:[V("Very short","\u041E\u0447\u0435\u043D\u044C \u043A\u043E\u0440\u043E\u0442\u043A\u0438\u0435"),V("Short","\u041A\u043E\u0440\u043E\u0442\u043A\u0438\u0435"),V("Normal","\u041E\u0431\u044B\u0447\u043D\u044B\u0435"),V("Long","\u0414\u043B\u0438\u043D\u043D\u044B\u0435")],levels:["Very short bursts for a quick break.","Short.","Normal.","Long runs."],patches:[Qn("length",.5,2)]},{id:"feel.runner.powers",group:"feel",title:V("Power-ups","\u0423\u0441\u0438\u043B\u0435\u043D\u0438\u044F"),for:{modules:["kit-game"],presets:["runner"]},question:"Which power-ups fit this runner best?",kind:"choice",options:[{id:"all",title:V("All of them","\u0412\u0441\u0435"),what:"Magnet, shield, double coins, dash and flight: the full set.",patches:[gt("powers",["magnet","shield","double","dash","flight"])]},{id:"grounded",title:V("On the ground","\u0411\u0435\u0437 \u043F\u043E\u043B\u0451\u0442\u0430"),what:"No flight: magnet, shield, double coins and dash. Realistic, sports, city.",patches:[gt("powers",["magnet","shield","double","dash"]),Ct("powers",["flight"])]},{id:"coins",title:V("Coin hunter","\u041E\u0445\u043E\u0442\u0430 \u0437\u0430 \u043C\u043E\u043D\u0435\u0442\u0430\u043C\u0438"),what:"Only the coin ones: magnet and double coins. Collecting, greed, treasure.",patches:[gt("powers",["magnet","double"]),Ct("powers",["shield","dash","flight"])]},{id:"hardcore",title:V("Hardcore","\u0425\u0430\u0440\u0434\u043A\u043E\u0440"),what:"No shield and no flight: dodging is everything. Skill, challenge.",patches:[gt("powers",["magnet","double","dash"]),Ct("powers",["shield","flight"])]}]},{id:"feel.runner.obstacles",group:"feel",title:V("Obstacles","\u041F\u0440\u0435\u043F\u044F\u0442\u0441\u0442\u0432\u0438\u044F"),for:{modules:["kit-game"],presets:["runner"]},question:"Which obstacles fit this runner best?",kind:"choice",options:[{id:"all",title:V("Everything","\u0412\u0441\u0451 \u043F\u043E\u0434\u0440\u044F\u0434"),what:"Walls, barriers, pits, moving blocks, trains and rocks.",patches:[gt("obstacles",["wall","barrier","pit","mover","train","rock"])]},{id:"city",title:V("City streets","\u0413\u043E\u0440\u043E\u0434\u0441\u043A\u0438\u0435 \u0443\u043B\u0438\u0446\u044B"),what:"Walls, barriers, moving blocks and trains: a city, a subway, traffic.",patches:[gt("obstacles",["wall","barrier","mover","train"]),Ct("obstacles",["pit","rock"])]},{id:"wild",title:V("Wild lands","\u0414\u0438\u043A\u0438\u0435 \u0437\u0435\u043C\u043B\u0438"),what:"Walls, pits, rocks and barriers: forests, mountains, ruins, no trains.",patches:[gt("obstacles",["wall","barrier","pit","rock"]),Ct("obstacles",["mover","train"])]},{id:"simple",title:V("Simple","\u041F\u0440\u043E\u0441\u0442\u044B\u0435"),what:"Only walls, barriers and pits: easy to read, for kids.",patches:[gt("obstacles",["wall","barrier","pit"]),Ct("obstacles",["mover","train","rock"])]}]},{id:"feel.platformer.lives",group:"feel",title:V("Lives on a level","\u0416\u0438\u0437\u043D\u0438 \u043D\u0430 \u0443\u0440\u043E\u0432\u043D\u0435"),for:{modules:["kit-game"],presets:["platformer"]},question:"How many hits should the hero survive on a level?",kind:"score",levelTitles:[V("One hit","\u041E\u0434\u0438\u043D \u0443\u0434\u0430\u0440"),V("A few hearts","\u041D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0441\u0435\u0440\u0434\u0435\u0446"),V("Many hearts","\u041C\u043D\u043E\u0433\u043E \u0441\u0435\u0440\u0434\u0435\u0446")],levels:["One hit and the level restarts.","A few hearts.","Many hearts, forgiving."],patches:[Qn("lives",1,6,true)]},{id:"feel.platformer.double-jump",group:"feel",title:V("Double jump from the start","\u0414\u0432\u043E\u0439\u043D\u043E\u0439 \u043F\u0440\u044B\u0436\u043E\u043A \u0441\u0440\u0430\u0437\u0443"),for:{modules:["kit-game"],presets:["platformer"]},question:"Should the hero have a double jump from the very first level?",kind:"noul",yes:"Yes: the game is light and acrobatic, the hero flies around from the start.",no:"No: the double jump is earned later, the start is grounded and careful.",onYes:[{section:"GameSpec",op:"set",path:"modes[role=core].params.doubleJump",value:true}],onNo:[{section:"GameSpec",op:"set",path:"modes[role=core].params.doubleJump",value:false}]},{id:"feel.survivors.minutes",group:"feel",title:V("Length of a chapter","\u0414\u043B\u0438\u043D\u0430 \u0433\u043B\u0430\u0432\u044B"),for:{modules:["kit-game"],presets:["survivors"]},question:"How long should one chapter of survival last?",kind:"score",levelTitles:[V("2 minutes","2 \u043C\u0438\u043D\u0443\u0442\u044B"),V("5 minutes","5 \u043C\u0438\u043D\u0443\u0442"),V("10 minutes","10 \u043C\u0438\u043D\u0443\u0442"),V("15 minutes","15 \u043C\u0438\u043D\u0443\u0442")],levels:["Two minutes: quick bursts.","Five minutes.","Ten minutes.","Fifteen minutes: long sessions."],patches:[Qn("minutes",2,15)]},{id:"feel.survivors.foes",group:"feel",title:V("Monsters","\u041C\u043E\u043D\u0441\u0442\u0440\u044B"),for:{modules:["kit-game"],presets:["survivors"]},question:"Which kinds of monsters fit this game best?",kind:"choice",options:[{id:"all",title:V("The whole horde","\u0412\u0441\u044F \u043E\u0440\u0434\u0430"),what:"Swarms, grunts, archers, brutes, chargers and bombers.",patches:[gt("foes",["swarm","grunt","archer","brute","charger","bomber"])]},{id:"melee",title:V("Close combat","\u0411\u043B\u0438\u0436\u043D\u0438\u0439 \u0431\u043E\u0439"),what:"No shooters: swarms, grunts, brutes and chargers. Zombies, beasts.",patches:[gt("foes",["swarm","grunt","brute","charger"]),Ct("foes",["archer","bomber"])]},{id:"army",title:V("An army","\u0410\u0440\u043C\u0438\u044F"),what:"Grunts, archers, brutes and chargers, no swarms: soldiers, knights, war.",patches:[gt("foes",["grunt","archer","brute","charger"]),Ct("foes",["swarm","bomber"])]},{id:"chaos",title:V("Chaos","\u0425\u0430\u043E\u0441"),what:"Swarms, bombers and chargers: fast, explosive, crazy.",patches:[gt("foes",["swarm","charger","bomber","grunt"]),Ct("foes",["archer","brute"])]}]},{id:"feel.td.lives",group:"feel",title:V("Lives of the base","\u0416\u0438\u0437\u043D\u0438 \u0431\u0430\u0437\u044B"),for:{modules:["kit-game"],presets:["tower-defense"]},question:"How many enemies may slip through before the level is lost?",kind:"score",levelTitles:[V("Very few","\u041E\u0447\u0435\u043D\u044C \u043C\u0430\u043B\u043E"),V("Some","\u0421\u0440\u0435\u0434\u043D\u0435"),V("Many","\u041C\u043D\u043E\u0433\u043E")],levels:["Very few: every leak hurts.","Some.","Many: forgiving."],patches:[Qn("lives",5,40,true)]},{id:"feel.td.foes",group:"feel",title:V("Enemies in the waves","\u0412\u0440\u0430\u0433\u0438 \u0432 \u0432\u043E\u043B\u043D\u0430\u0445"),for:{modules:["kit-game"],presets:["tower-defense"]},question:"Which enemies should march in the waves of this tower defense?",kind:"choice",options:[{id:"all",title:V("The whole army","\u0412\u0441\u044F \u0430\u0440\u043C\u0438\u044F"),what:"Grunts, runners, brutes, flyers, shamans, healers and splitters: the full mix.",patches:[gt("foes",["grunt","runner","brute","flyer","shaman","healer","splitter"])]},{id:"ground",title:V("Only on foot","\u0422\u043E\u043B\u044C\u043A\u043E \u043F\u0435\u0448\u0438\u0435"),what:"No flyers: every enemy walks the road. Medieval, zombies, ground war.",patches:[gt("foes",["grunt","runner","brute","shaman","healer","splitter"]),Ct("foes",["flyer"])]},{id:"simple",title:V("Plain and clear","\u041F\u0440\u043E\u0441\u0442\u044B\u0435"),what:"No shamans, healers or splitters: easy to read, for kids and casual players.",patches:[gt("foes",["grunt","runner","brute","flyer"]),Ct("foes",["shaman","healer","splitter"])]},{id:"swarm",title:V("Fast hordes","\u0411\u044B\u0441\u0442\u0440\u044B\u0435 \u043E\u0440\u0434\u044B"),what:"No brutes or shamans: many fast weak foes, a frantic pace. Insects, rats, robots.",patches:[gt("foes",["grunt","runner","flyer","healer","splitter"]),Ct("foes",["brute","shaman"])]}]},{id:"feel.survivors.weapons",group:"feel",title:V("Weapons to find","\u041E\u0440\u0443\u0436\u0438\u0435 \u0432 \u0437\u0430\u0431\u0435\u0433\u0435"),hint:V("Which new weapons a level-up may offer.","\u041A\u0430\u043A\u043E\u0435 \u043D\u043E\u0432\u043E\u0435 \u043E\u0440\u0443\u0436\u0438\u0435 \u043F\u0440\u0435\u0434\u043B\u0430\u0433\u0430\u0435\u0442 \u043F\u043E\u0432\u044B\u0448\u0435\u043D\u0438\u0435 \u0443\u0440\u043E\u0432\u043D\u044F."),for:{modules:["kit-game"],presets:["survivors"]},question:"Which weapons fit the hero of this survival game best?",kind:"choice",options:[{id:"all",title:V("Everything","\u0412\u0441\u0451"),what:"Blaster, blades, aura, boomerang, lightning and drone: the full arsenal.",patches:[gt("weapons",["blaster","blades","aura","boomerang","lightning","drone"])]},{id:"tech",title:V("Technology","\u0422\u0435\u0445\u043D\u0438\u043A\u0430"),what:"Blaster, drone and lightning: guns and gadgets. Sci-fi, robots, the future.",patches:[gt("weapons",["blaster","drone","lightning"]),Ct("weapons",["blades","aura","boomerang"])]},{id:"magic",title:V("Magic and steel","\u041C\u0430\u0433\u0438\u044F \u0438 \u0441\u0442\u0430\u043B\u044C"),what:"Blades, aura, boomerang and lightning, no guns: fantasy, wizards, knights.",patches:[gt("weapons",["blades","aura","boomerang","lightning"]),Ct("weapons",["blaster","drone"])]},{id:"classic",title:V("Classic","\u041A\u043B\u0430\u0441\u0441\u0438\u043A\u0430"),what:"Blaster, blades and boomerang: simple weapons that are easy to read.",patches:[gt("weapons",["blaster","blades","boomerang"]),Ct("weapons",["aura","lightning","drone"])]}]},{id:"feel.tycoon.events",group:"feel",title:V("Events in the city","\u0421\u043E\u0431\u044B\u0442\u0438\u044F \u0432 \u0433\u043E\u0440\u043E\u0434\u0435"),for:{modules:["kit-game"],presets:["tycoon"]},question:"Which events should pop up while this tycoon city earns money?",kind:"choice",options:[{id:"all",title:V("Busy life","\u0411\u0443\u0440\u043D\u0430\u044F \u0436\u0438\u0437\u043D\u044C"),what:"Rushes, breakdowns, investors and couriers: always something to tap.",patches:[gt("events",["rush","break","invest","courier"])]},{id:"calm",title:V("No breakdowns","\u0411\u0435\u0437 \u043F\u043E\u043B\u043E\u043C\u043E\u043A"),what:"Rushes, investors and couriers, nothing ever breaks: a calm, cozy business.",patches:[gt("events",["rush","invest","courier"]),Ct("events",["break"])]},{id:"hands-on",title:V("Hands on","\u0421\u0432\u043E\u0438\u043C\u0438 \u0440\u0443\u043A\u0430\u043C\u0438"),what:"Rushes, breakdowns and couriers, no investors: the city grows by your own work.",patches:[gt("events",["rush","break","courier"]),Ct("events",["invest"])]},{id:"minimal",title:V("Only rushes","\u0422\u043E\u043B\u044C\u043A\u043E \u0430\u0436\u0438\u043E\u0442\u0430\u0436"),what:"Only rush hours: a quiet idle game with few interruptions.",patches:[gt("events",["rush"]),Ct("events",["break","invest","courier"])]}]}],hu=(e,t)=>({Type:"VirtualCurrency",CurrencyID:e,Amount:t}),Ta=(e,t,n,s,r)=>({id:e,title:V(t,n),what:s,patches:r.map((o,d)=>({section:"Reward",op:"set",path:`DailyCalendars.daily_login.Days[DayNumber=${d+1}].Rewards.Standard.Entries`,value:o.map(([p,v])=>hu(p,v))}))}),Dl=(e,t)=>`StoreOffers.${e}.${t}`,mu=[{id:"economy.shop-ad-gems",group:"economy",title:V("Gems for an ad in the shop","\u041A\u0440\u0438\u0441\u0442\u0430\u043B\u043B\u044B \u0437\u0430 \u0440\u0435\u043A\u043B\u0430\u043C\u0443 \u0432 \u043C\u0430\u0433\u0430\u0437\u0438\u043D\u0435"),for:{sections:["Store"]},question:"How many gems should one rewarded ad in the shop give?",kind:"score",levelTitles:[V("A few","\u041C\u0430\u043B\u043E"),V("Some","\u0421\u0440\u0435\u0434\u043D\u0435"),V("A handful","\u041F\u0440\u0438\u043B\u0438\u0447\u043D\u043E"),V("Many","\u041C\u043D\u043E\u0433\u043E")],levels:["A few: gems are rare.","Some.","A good handful.","Many: gems flow freely."],patches:[{section:"Store",op:"set",path:Dl("kit_gems_ad","Reward.Grant.Standard.Entries[Type=VirtualCurrency].Amount"),range:{min:2,max:15,integer:true}}]},{id:"economy.shop-ad-cap",group:"economy",title:V("Ads in the shop a day","\u0420\u0435\u043A\u043B\u0430\u043C\u0430 \u0432 \u043C\u0430\u0433\u0430\u0437\u0438\u043D\u0435 \u0437\u0430 \u0434\u0435\u043D\u044C"),for:{sections:["Store"]},question:"How many times a day may a player watch an ad for gems in the shop?",kind:"score",levelTitles:[V("A few times","\u041D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0440\u0430\u0437"),V("About ten","\u041E\u043A\u043E\u043B\u043E \u0434\u0435\u0441\u044F\u0442\u0438"),V("Many times","\u041C\u043D\u043E\u0433\u043E \u0440\u0430\u0437")],levels:["A few times.","About ten.","Many times."],patches:[{section:"Store",op:"set",path:Dl("kit_gems_ad","Availability.Limits.DailyCap"),range:{min:3,max:20,integer:true}}]},{id:"economy.shop-pack",group:"economy",title:V("Size of the gem pack","\u0420\u0430\u0437\u043C\u0435\u0440 \u043D\u0430\u0431\u043E\u0440\u0430 \u043A\u0440\u0438\u0441\u0442\u0430\u043B\u043B\u043E\u0432"),for:{sections:["Store"]},question:"How many gems should the paid gem pack hold?",kind:"score",levelTitles:[V("Small","\u041C\u0430\u043B\u0435\u043D\u044C\u043A\u0438\u0439"),V("Normal","\u041E\u0431\u044B\u0447\u043D\u044B\u0439"),V("Big","\u0411\u043E\u043B\u044C\u0448\u043E\u0439"),V("Huge","\u041E\u0433\u0440\u043E\u043C\u043D\u044B\u0439")],levels:["A small pack.","A normal pack.","A big pack.","A huge pack: the best deal."],patches:[{section:"Store",op:"set",path:Dl("kit_gems_pack","Reward.Grant.Standard.Entries[Type=VirtualCurrency].Amount"),range:{min:60,max:200,integer:true}}]},{id:"economy.start-coins",group:"economy",title:V("Coins at the start","\u041C\u043E\u043D\u0435\u0442\u044B \u043D\u0430 \u0441\u0442\u0430\u0440\u0442\u0435"),for:{sections:["Currency"]},question:"How many coins should a new player start with?",kind:"score",levelTitles:[V("A few","\u041C\u0430\u043B\u043E"),V("Some","\u0421\u0440\u0435\u0434\u043D\u0435"),V("Comfortable","\u041A\u043E\u043C\u0444\u043E\u0440\u0442\u043D\u043E"),V("Rich","\u0411\u043E\u0433\u0430\u0442\u043E")],levels:["A few: everything is earned.","Some.","A comfortable start.","A rich start: buy upgrades right away."],patches:[{section:"Currency",op:"set",path:"VirtualCurrencies.CO.Economy.InitialDeposit",range:{min:100,max:3e3,integer:true}}]},{id:"economy.ad-multiplier",group:"economy",title:V("Round reward for an ad","\u041D\u0430\u0433\u0440\u0430\u0434\u0430 \u0440\u0430\u0443\u043D\u0434\u0430 \u0437\u0430 \u0440\u0435\u043A\u043B\u0430\u043C\u0443"),hint:V("How many times the round's coins grow for a rewarded ad (in the app).","\u0412\u043E \u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0440\u0430\u0437 \u0440\u0430\u0441\u0442\u0443\u0442 \u043C\u043E\u043D\u0435\u0442\u044B \u0440\u0430\u0443\u043D\u0434\u0430 \u0437\u0430 \u0440\u0435\u043A\u043B\u0430\u043C\u0443 (\u0432 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438)."),for:{modules:["kit-game"],sections:["Reward"]},question:"How big should the bonus for watching an ad after a round be?",kind:"score",levelTitles:[V("x2","x2"),V("x3","x3"),V("x4","x4"),V("x5","x5")],levels:["Double.","Triple.","Four times.","Five times."],patches:[{section:"Reward",op:"set",path:"Windows.round.AdMultiplier",range:{min:2,max:5,integer:true}}]},{id:"economy.vip-multiplier",group:"economy",title:V("Round reward for VIP","\u041D\u0430\u0433\u0440\u0430\u0434\u0430 \u0440\u0430\u0443\u043D\u0434\u0430 \u0434\u043B\u044F VIP"),for:{modules:["kit-game"],sections:["Reward"]},question:"How big should the round reward bonus of VIP players be?",kind:"score",levelTitles:[V("x3","x3"),V("x5","x5"),V("x8","x8")],levels:["Triple.","Five times.","Eight times."],patches:[{section:"Reward",op:"set",path:"Windows.round.VipMultiplier",range:{min:3,max:8,integer:true}}]},{id:"economy.vip-price",group:"economy",title:V("Price of VIP","\u0426\u0435\u043D\u0430 VIP"),for:{sections:["Premium"]},question:"How expensive should the VIP pass be, in gems?",kind:"score",levelTitles:[V("Cheap","\u0414\u0451\u0448\u0435\u0432\u043E"),V("Normal","\u041E\u0431\u044B\u0447\u043D\u043E"),V("Expensive","\u0414\u043E\u0440\u043E\u0433\u043E")],levels:["Cheap, an easy first purchase.","Normal.","Expensive, for the most devoted."],patches:[{section:"Premium",op:"set",path:"Definitions.vip.PriceOptions.default.Cost.Standard.Entries[Type=VirtualCurrency].Amount",range:{min:20,max:120,integer:true}}]},{id:"economy.daily-calendar",group:"economy",title:V("Daily login rewards","\u041D\u0430\u0433\u0440\u0430\u0434\u044B \u0437\u0430 \u0432\u0445\u043E\u0434"),for:{sections:["Reward"]},question:"Which daily login reward plan fits this game best?",kind:"choice",options:[Ta("gentle","Gentle","\u0421\u043A\u0440\u043E\u043C\u043D\u044B\u0435","Small steady rewards every day: a calm game with a slow economy.",[[["CO",50]],[["CO",60]],[["CO",80]],[["GE",2]],[["CO",100]],[["CO",120]],[["GE",8],["CO",150]]]),Ta("standard","Standard","\u041E\u0431\u044B\u0447\u043D\u044B\u0435","Growing coins with gems on day 4 and a big day 7.",[[["CO",100]],[["CO",150]],[["CO",200]],[["GE",5]],[["CO",300]],[["CO",400]],[["GE",20],["CO",500]]]),Ta("generous","Generous","\u0429\u0435\u0434\u0440\u044B\u0435","Big rewards every day, gems often: a fast, rewarding economy.",[[["CO",300]],[["GE",5]],[["CO",500]],[["GE",10]],[["CO",800]],[["GE",15]],[["GE",40],["CO",1500]]]),Ta("jackpot","Jackpot day 7","\u0414\u0436\u0435\u043A\u043F\u043E\u0442 \u043D\u0430 7-\u0439 \u0434\u0435\u043D\u044C","Small days and a huge jackpot on day 7: come back every day.",[[["CO",50]],[["CO",50]],[["CO",80]],[["CO",80]],[["CO",100]],[["CO",150]],[["GE",60],["CO",3e3]]])]}],lo=(e,t,n)=>({section:"Quest",op:"set",path:`Quests.${e}.Reward.Grant.Standard.Entries[Type=VirtualCurrency].Amount`,range:{min:t,max:n,integer:true}}),Ko=(e,t,n,s)=>({section:"Quest",op:"set",path:`Quests.${e}.Objectives.${t}.TargetValue`,range:{min:n,max:s,integer:true}}),Nd="Definitions.star_festival",er=e=>{let[t,n]=e.name,[s,r]=e.token,o=`Collect ${s.toLowerCase()} by playing rounds, shopping and finishing quests. VIP gets a second prize on every milestone.`,d=`\u0421\u043E\u0431\u0438\u0440\u0430\u0439\u0442\u0435 ${r.toLowerCase()} \u0432 \u0440\u0430\u0443\u043D\u0434\u0430\u0445, \u043F\u043E\u043A\u0443\u043F\u043A\u0430\u0445 \u0438 \u0437\u0430\u0434\u0430\u043D\u0438\u044F\u0445. VIP \u043F\u043E\u043B\u0443\u0447\u0430\u0435\u0442 \u0432\u0442\u043E\u0440\u043E\u0439 \u043F\u0440\u0438\u0437 \u043D\u0430 \u043A\u0430\u0436\u0434\u043E\u0439 \u0432\u0435\u0445\u0435.`,p=[["stars_10",10],["stars_50",50],["stars_120",120],["stars_250",250]],v=(M,O)=>({section:"TimedEvent",op:"set",path:`${Nd}.${M}`,value:O});return {id:e.id,title:V(t,n),what:e.what,patches:[v("DisplayName",t),v("Description",o),v("Content.DisplayName",t),v("Content.Description",o),v("Content.Token.DisplayName",s),...p.map(([M,O])=>v(`Content.Milestones.${M}.DisplayName`,`${O} ${e.unit[0]}`)),v("Content.Milestones.stars_400.DisplayName",e.crown[0])],translations:{ru:{[t]:n,[o]:d,[s]:r,[e.crown[0]]:e.crown[1],...Object.fromEntries(p.map(([,M])=>[`${M} ${e.unit[0]}`,`${M} ${e.unit[1]}`]))}}}},Al=(e,t,n,s,r,o,d)=>({id:e,title:V(t,n),what:d,patches:[{section:"TimedBoost",op:"set",path:"Definitions.double_rewards.Effect.Value",value:s},{section:"TimedBoost",op:"set",path:"Definitions.double_rewards.DisplayName",value:t},{section:"TimedBoost",op:"set",path:"Definitions.double_rewards.Description",value:r}],translations:{ru:{[t]:n,[r]:o}}}),yu=[{id:"liveops.event-theme",group:"liveops",title:V("Theme of the weekly event","\u0422\u0435\u043C\u0430 \u043D\u0435\u0434\u0435\u043B\u044C\u043D\u043E\u0433\u043E \u0438\u0432\u0435\u043D\u0442\u0430"),hint:V("Name of the event, its tokens and prizes.","\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0438\u0432\u0435\u043D\u0442\u0430, \u0435\u0433\u043E \u0436\u0435\u0442\u043E\u043D\u043E\u0432 \u0438 \u043F\u0440\u0438\u0437\u043E\u0432."),for:{sections:["TimedEvent"]},question:"Which weekly event theme fits this product best?",kind:"choice",options:[er({id:"star-festival",name:["Star festival","\u0417\u0432\u0451\u0437\u0434\u043D\u044B\u0439 \u0444\u0435\u0441\u0442\u0438\u0432\u0430\u043B\u044C"],token:["Festival stars","\u0417\u0432\u0451\u0437\u0434\u044B \u0444\u0435\u0441\u0442\u0438\u0432\u0430\u043B\u044F"],unit:["stars","\u0437\u0432\u0451\u0437\u0434"],crown:["Festival crown","\u041A\u043E\u0440\u043E\u043D\u0430 \u0444\u0435\u0441\u0442\u0438\u0432\u0430\u043B\u044F"],what:"A cheerful festival of stars: fits anything."}),er({id:"harvest",name:["Harvest fair","\u042F\u0440\u043C\u0430\u0440\u043A\u0430 \u0443\u0440\u043E\u0436\u0430\u044F"],token:["Golden apples","\u0417\u043E\u043B\u043E\u0442\u044B\u0435 \u044F\u0431\u043B\u043E\u043A\u0438"],unit:["apples","\u044F\u0431\u043B\u043E\u043A"],crown:["Golden basket","\u0417\u043E\u043B\u043E\u0442\u0430\u044F \u043A\u043E\u0440\u0437\u0438\u043D\u0430"],what:"Farm, nature, cozy village, autumn."}),er({id:"monster-hunt",name:["Monster hunt","\u041E\u0445\u043E\u0442\u0430 \u043D\u0430 \u043C\u043E\u043D\u0441\u0442\u0440\u043E\u0432"],token:["Trophies","\u0422\u0440\u043E\u0444\u0435\u0438"],unit:["trophies","\u0442\u0440\u043E\u0444\u0435\u0435\u0432"],crown:["Hunter's crown","\u041A\u043E\u0440\u043E\u043D\u0430 \u043E\u0445\u043E\u0442\u043D\u0438\u043A\u0430"],what:"Action, fantasy, battles, monsters."}),er({id:"space-week",name:["Space week","\u041A\u043E\u0441\u043C\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u043D\u0435\u0434\u0435\u043B\u044F"],token:["Star shards","\u0417\u0432\u0451\u0437\u0434\u043D\u044B\u0435 \u043E\u0441\u043A\u043E\u043B\u043A\u0438"],unit:["shards","\u043E\u0441\u043A\u043E\u043B\u043A\u043E\u0432"],crown:["Galaxy medal","\u041C\u0435\u0434\u0430\u043B\u044C \u0433\u0430\u043B\u0430\u043A\u0442\u0438\u043A\u0438"],what:"Sci-fi, space, robots, the future."}),er({id:"winter",name:["Winter holidays","\u0417\u0438\u043C\u043D\u0438\u0435 \u043F\u0440\u0430\u0437\u0434\u043D\u0438\u043A\u0438"],token:["Snowflakes","\u0421\u043D\u0435\u0436\u0438\u043D\u043A\u0438"],unit:["snowflakes","\u0441\u043D\u0435\u0436\u0438\u043D\u043E\u043A"],crown:["Ice crown","\u041B\u0435\u0434\u044F\u043D\u0430\u044F \u043A\u043E\u0440\u043E\u043D\u0430"],what:"Winter, new year, cozy and festive."}),er({id:"beach",name:["Beach party","\u041F\u043B\u044F\u0436\u043D\u0430\u044F \u0432\u0435\u0447\u0435\u0440\u0438\u043D\u043A\u0430"],token:["Seashells","\u0420\u0430\u043A\u0443\u0448\u043A\u0438"],unit:["seashells","\u0440\u0430\u043A\u0443\u0448\u0435\u043A"],crown:["Golden surfboard","\u0417\u043E\u043B\u043E\u0442\u0430\u044F \u0434\u043E\u0441\u043A\u0430"],what:"Summer, the sea, islands, holidays."}),er({id:"treasure",name:["Treasure hunt","\u041E\u0445\u043E\u0442\u0430 \u0437\u0430 \u0441\u043E\u043A\u0440\u043E\u0432\u0438\u0449\u0430\u043C\u0438"],token:["Map pieces","\u041A\u0443\u0441\u043E\u0447\u043A\u0438 \u043A\u0430\u0440\u0442\u044B"],unit:["pieces","\u043A\u0443\u0441\u043E\u0447\u043A\u043E\u0432"],crown:["Pirate chest","\u041F\u0438\u0440\u0430\u0442\u0441\u043A\u0438\u0439 \u0441\u0443\u043D\u0434\u0443\u043A"],what:"Pirates, adventure, exploring, mysteries."}),er({id:"carnival",name:["Carnival","\u041A\u0430\u0440\u043D\u0430\u0432\u0430\u043B"],token:["Masks","\u041C\u0430\u0441\u043A\u0438"],unit:["masks","\u043C\u0430\u0441\u043E\u043A"],crown:["Carnival crown","\u041A\u043E\u0440\u043E\u043D\u0430 \u043A\u0430\u0440\u043D\u0430\u0432\u0430\u043B\u0430"],what:"Music, dance, a bright party, cartoon fun."})]},{id:"liveops.event-pace",group:"liveops",title:V("Pace of the weekly event","\u0422\u0435\u043C\u043F \u043D\u0435\u0434\u0435\u043B\u044C\u043D\u043E\u0433\u043E \u0438\u0432\u0435\u043D\u0442\u0430"),for:{sections:["TimedEvent"]},question:"How fast should players collect the weekly event tokens by playing rounds?",kind:"score",levelTitles:[V("Slow","\u041C\u0435\u0434\u043B\u0435\u043D\u043D\u043E"),V("Normal","\u041E\u0431\u044B\u0447\u043D\u043E"),V("Fast","\u0411\u044B\u0441\u0442\u0440\u043E"),V("Very fast","\u041E\u0447\u0435\u043D\u044C \u0431\u044B\u0441\u0442\u0440\u043E")],levels:["Slow: the top prize is for the most devoted.","Normal.","Fast.","Very fast: most players reach the top."],patches:[{section:"TimedEvent",op:"set",path:`${Nd}.Content.TokenSources[SourceType=CustomAction].BaseWeight`,range:{min:2,max:10,integer:true}}]},{id:"liveops.boost-power",group:"liveops",title:V("Power of the reward boost","\u0421\u0438\u043B\u0430 \u0431\u0443\u0441\u0442\u0430 \u043D\u0430\u0433\u0440\u0430\u0434"),for:{sections:["TimedBoost"]},question:"How strong should the paid reward boost be?",kind:"choice",options:[Al("x1-5","Rewards x1.5","\u041D\u0430\u0433\u0440\u0430\u0434\u044B x1.5",1.5,"Every reward is 1.5 times bigger for an hour.","\u041A\u0430\u0436\u0434\u0430\u044F \u043D\u0430\u0433\u0440\u0430\u0434\u0430 \u0432 1.5 \u0440\u0430\u0437\u0430 \u0431\u043E\u043B\u044C\u0448\u0435 \u0432 \u0442\u0435\u0447\u0435\u043D\u0438\u0435 \u0447\u0430\u0441\u0430.","A gentle boost: a slow, balanced economy."),Al("x2","Double rewards","\u0414\u0432\u043E\u0439\u043D\u044B\u0435 \u043D\u0430\u0433\u0440\u0430\u0434\u044B",2,"Every reward is doubled for an hour.","\u041A\u0430\u0436\u0434\u0430\u044F \u043D\u0430\u0433\u0440\u0430\u0434\u0430 \u0443\u0434\u0432\u043E\u0435\u043D\u0430 \u043D\u0430 \u0447\u0430\u0441.","The classic double: fits most games."),Al("x3","Triple rewards","\u0422\u0440\u043E\u0439\u043D\u044B\u0435 \u043D\u0430\u0433\u0440\u0430\u0434\u044B",3,"Every reward is tripled for an hour.","\u041A\u0430\u0436\u0434\u0430\u044F \u043D\u0430\u0433\u0440\u0430\u0434\u0430 \u0443\u0442\u0440\u043E\u0435\u043D\u0430 \u043D\u0430 \u0447\u0430\u0441.","A big boost: a fast, generous economy.")]},{id:"liveops.quest-effort",group:"liveops",title:V("Effort of daily quests","\u0421\u043B\u043E\u0436\u043D\u043E\u0441\u0442\u044C \u0435\u0436\u0435\u0434\u043D\u0435\u0432\u043D\u044B\u0445 \u0437\u0430\u0434\u0430\u043D\u0438\u0439"),for:{sections:["Quest"]},question:"How much play should the daily quests ask for?",kind:"score",levelTitles:[V("A few minutes","\u041F\u0430\u0440\u0430 \u043C\u0438\u043D\u0443\u0442"),V("Short","\u041A\u043E\u0440\u043E\u0442\u043A\u043E"),V("Normal","\u041E\u0431\u044B\u0447\u043D\u043E"),V("Long","\u0414\u043E\u043B\u0433\u043E")],levels:["Very little: done in a few minutes.","A short session.","A normal session.","A long session: for devoted players."],patches:[Ko("daily_play","play",1,8),Ko("daily_earn","earn",50,500),Ko("kit_daily_coins","coins",100,1500),Ko("kit_daily_time","seconds",180,1800),Ko("kit_daily_levels","levels",1,6)]},{id:"liveops.quest-rewards",group:"liveops",title:V("Rewards of daily quests","\u041D\u0430\u0433\u0440\u0430\u0434\u044B \u0437\u0430 \u0437\u0430\u0434\u0430\u043D\u0438\u044F"),for:{sections:["Quest"]},question:"How generous should the rewards of the daily quests be?",kind:"score",levelTitles:[V("Small","\u041C\u0430\u043B\u0435\u043D\u044C\u043A\u0438\u0435"),V("Normal","\u041E\u0431\u044B\u0447\u043D\u044B\u0435"),V("Big","\u0411\u043E\u043B\u044C\u0448\u0438\u0435"),V("Very big","\u041E\u0447\u0435\u043D\u044C \u0431\u043E\u043B\u044C\u0448\u0438\u0435")],levels:["Small.","Normal.","Big.","Very big."],patches:[lo("daily_visit",10,100),lo("daily_earn",30,300),lo("daily_play",80,600),lo("kit_daily_coins",50,500),lo("kit_daily_time",50,500),lo("kit_daily_levels",5,40)]},{id:"liveops.leaderboard",group:"liveops",title:V("Weekly leaderboard","\u041D\u0435\u0434\u0435\u043B\u044C\u043D\u044B\u0439 \u0440\u0435\u0439\u0442\u0438\u043D\u0433"),for:{sections:["Leaderboard"]},question:"Is competing on a weekly leaderboard a good fit for this product?",kind:"noul",yes:"Yes: players like to compete and compare their scores.",no:"No: it is a calm, personal or creative product without competition.",onYes:[{section:"Leaderboard",op:"set",path:"Definitions.weekly_score.IsEnabled",value:true}],onNo:[{section:"Leaderboard",op:"set",path:"Definitions.weekly_score.IsEnabled",value:false}]}],Mn=(e,t,n,s)=>({id:e,title:V(t,n),what:s,patches:[{section:"Currency",op:"set",path:"VirtualCurrencies.CO.DisplayName",value:t},{section:"GameSpec",op:"set",path:"texts.'res.coins'",value:{en:t,ru:n}}],translations:{ru:{[t]:n}}}),tr=(e,t,n,s)=>({id:e,title:V(t,n),what:s,patches:[{section:"Currency",op:"set",path:"VirtualCurrencies.GE.DisplayName",value:t}],translations:{ru:{[t]:n}}}),gu=[{id:"texts.coin-name",group:"texts",title:V("Name of the coins","\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u043C\u043E\u043D\u0435\u0442"),for:{sections:["Currency"]},question:"What should the game's soft currency (earned in rounds) be called?",kind:"choice",options:[Mn("coins","Coins","\u041C\u043E\u043D\u0435\u0442\u044B","Plain coins: fits anything."),Mn("gold","Gold","\u0417\u043E\u043B\u043E\u0442\u043E","Gold: fantasy, medieval, pirates, treasure."),Mn("credits","Credits","\u041A\u0440\u0435\u0434\u0438\u0442\u044B","Credits: sci-fi, space, future, robots."),Mn("cash","Cash","\u041D\u0430\u043B\u0438\u0447\u043D\u044B\u0435","Cash: business, city, modern life, tycoon."),Mn("scrap","Scrap","\u0425\u043B\u0430\u043C","Scrap: post-apocalypse, survival, junk."),Mn("candies","Candies","\u041A\u043E\u043D\u0444\u0435\u0442\u044B","Candies: sweets, kids, cozy cartoon."),Mn("stars","Stars","\u0417\u0432\u0451\u0437\u0434\u044B","Stars: kids, space, dreams, music."),Mn("bones","Bones","\u041A\u043E\u0441\u0442\u0438","Bones: pets, dogs, dinosaurs, halloween."),Mn("shells","Shells","\u0420\u0430\u043A\u0443\u0448\u043A\u0438","Shells: the sea, islands, mermaids."),Mn("leaves","Leaves","\u041B\u0438\u0441\u0442\u044C\u044F","Leaves: nature, forest, farm, elves.")]},{id:"texts.gem-name",group:"texts",title:V("Name of the gems","\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u043A\u0440\u0438\u0441\u0442\u0430\u043B\u043B\u043E\u0432"),for:{sections:["Currency"]},question:"What should the game's premium currency be called?",kind:"choice",options:[tr("gems","Gems","\u041A\u0440\u0438\u0441\u0442\u0430\u043B\u043B\u044B","Gems: fits anything."),tr("diamonds","Diamonds","\u0410\u043B\u043C\u0430\u0437\u044B","Diamonds: luxury, mining, treasure."),tr("rubies","Rubies","\u0420\u0443\u0431\u0438\u043D\u044B","Rubies: fantasy, royal, magic."),tr("crystals","Energy cells","\u042D\u043D\u0435\u0440\u0433\u043E\u044F\u0447\u0435\u0439\u043A\u0438","Energy cells: sci-fi, robots, space."),tr("pearls","Pearls","\u0416\u0435\u043C\u0447\u0443\u0433","Pearls: the sea, mermaids, elegance."),tr("orbs","Orbs","\u0421\u0444\u0435\u0440\u044B","Magic orbs: wizards, spells, mystery."),tr("tokens","Tokens","\u0416\u0435\u0442\u043E\u043D\u044B","Tokens: arcade, casino, retro."),tr("hearts","Hearts","\u0421\u0435\u0440\u0434\u0435\u0447\u043A\u0438","Hearts: cute, love, pets, kids.")]}],bu=new Set(["Look","GameSpec"]),Oa=e=>e?.map(t=>bu.has(t.section)?t:{...t,ifExists:true}),vu=e=>{switch(e.kind){case "choice":return e.options?{...e,options:e.options.map(t=>({...t,patches:Oa(t.patches)}))}:e;case "score":return {...e,patches:Oa(e.patches)};case "noul":return {...e,onYes:Oa(e.onYes),...e.onNo?{onNo:Oa(e.onNo)}:{}}}},$d=[...pu,...uu,...fu,...mu,...yu,...gu].map(vu),xu={version:Id,knobs:$d,lists:Ol};var Ll=/^[a-z0-9][a-z0-9_.-]{0,63}$/,ku=new Set(["set","merge","unset","add","remove"]),Su=/[\u2013\u2014]/;function Da(e,t,n,s=false){(!e||e.length===0)&&n.push(`${t}: no patches`);for(let[r,o]of (e??[]).entries())(!o.section||!/^[A-Z][A-Za-z0-9]*$/.test(o.section))&&n.push(`${t}.patches[${r}]: section "${o.section}"`),ku.has(o.op)||n.push(`${t}.patches[${r}]: op "${o.op}"`),Ma(o.path)===null&&n.push(`${t}.patches[${r}]: path "${o.path}"`),s&&o.op==="set"&&!o.range&&o.value===void 0&&n.push(`${t}.patches[${r}]: a score patch needs a range`),o.range&&!(Number.isFinite(o.range.min)&&Number.isFinite(o.range.max))&&n.push(`${t}.patches[${r}]: range`);}function Bd(e,t,n){e.length===0&&n.push(`${t}: no options`),e.length>255&&n.push(`${t}: ${e.length} options, the decision model takes ${255}`);let s=new Set;for(let r of e)Ll.test(r.id)||n.push(`${t}: option id "${r.id}"`),s.has(r.id)&&n.push(`${t}: option "${r.id}" twice`),s.add(r.id),r.title?.en||n.push(`${t}.${r.id}: no English title`),r.what||n.push(`${t}.${r.id}: no description for the decision model`),Da(r.patches,`${t}.${r.id}`,n);}function wl(e,t){if(typeof e=="string")t.push(e);else if(Array.isArray(e))for(let n of e)wl(n,t);else if(e&&typeof e=="object")for(let n of Object.values(e))wl(n,t);}function Eu(e){let t=[];for(let[r,o]of Object.entries(e.lists))Ll.test(r)||t.push(`list "${r}": id`),Bd(o,`list ${r}`,t);let n=new Set;for(let r of e.knobs){let o=`knob ${r.id}`;Ll.test(r.id)||t.push(`${o}: id`),n.has(r.id)&&t.push(`${o}: twice`),n.add(r.id),r.title?.en||t.push(`${o}: no English title`),r.question||t.push(`${o}: no question`),r.kind==="choice"?(r.list&&r.options&&t.push(`${o}: options OR a list, not both`),r.list&&!e.lists[r.list]&&t.push(`${o}: no list "${r.list}"`),r.list||Bd(r.options??[],o,t)):r.kind==="score"?((r.levels.length<2||r.levels.length>10)&&t.push(`${o}: ${r.levels.length} levels, 2..${10}`),r.levelTitles?.length!==r.levels.length?t.push(`${o}: levelTitles must name every level`):r.levelTitles.forEach((d,p)=>{(!d.en||!d.ru)&&t.push(`${o}: level ${p} needs en and ru titles`);}),Da(r.patches,o,t,true)):r.kind==="noul"?((!r.yes||!r.no)&&t.push(`${o}: yes and no`),Da(r.onYes,o,t),r.onNo&&Da(r.onNo,`${o}.no`,t)):t.push(`${o}: kind`);}let s=[];wl(e,s);for(let r of s)Su.test(r)&&t.push(`a long dash in "${r.slice(0,60)}"`);return t}export{Pi as ABILITIES,kr as ASSET_PACKS,wd as BACKGROUND_OPTIONS,Vn as BLOCKS,Gi as BOSS_DEFEATED,Vs as BOSS_SPAWNED,Ui as BRANCH_LEVEL,qt as Body,Nn as Bullet,zs as CHAPTERS,zl as CORE_EFFECTS,Ed as DECISION_MAX_LEVELS,Sd as DECISION_MAX_OPTIONS,Vl as DEFAULT_REWARDS,Yp as DEMO_SPEC,jt as Drop,co as EFFECTS,hr as ENEMIES,Yo as ENGINES,Il as ENTRY_ID_RE,Jt as ExprError,Cn as FOES,Na as FUNCTIONS,Ne as Foe,Kt as GIVE_UP,qn as Gem,Fr as HEROES,Ad as HERO_LOOK_OPTIONS,cn as Jumper,Dd as KIT_PALETTES,$d as KNOBS,xu as KNOB_CATALOG,Id as KNOB_CATALOG_VERSION,Ol as KNOB_LISTS,Wl as KNOWN_SYSTEMS,lr as LEVELS_PER_WORLD,Ni as LEVEL_CLEARED,Yi as LEVEL_MAPS,zi as LEVEL_UP,uo as LINKS,du as LOOK_RUNTIME_IDS,Qa as M3_CHARACTER,ko as M3_ELEMENTS,ja as M3_ENEMIES,Lr as M3_HEROES,is as M3_LEVELS,xo as M3_LEVELS_PER_WORLD,as as M3_LEVEL_DEFS,sc as M3_META,ei as M3_META_STATS,Dn as M3_OBSTACLES,qa as M3_PIECES,Xa as M3_SKILLS,or as M3_SPECIALS,nc as M3_WORLDS,Ya as M3_WORLD_STARS,qi as MAPS,Sn as MAP_COLS,En as MAP_ROWS,Zt as MAX_LEVEL,$s as MAX_PASSIVES,Ns as MAX_WEAPONS,Bi as META_CHARACTER,$i as META_STATS,sr as MG_BOARDS,_o as MG_CHAINS,Si as MG_CHARACTER,mc as MG_COLS,Nr as MG_HEROES,Ms as MG_LEVELS,Ir as MG_LEVELS_PER_WORLD,Es as MG_LEVEL_DEFS,bc as MG_META,Ei as MG_META_STATS,rn as MG_OBSTACLES,Rs as MG_REVIVE_ENERGY,yc as MG_ROWS,vi as MG_SKILLS,yi as MG_SPECIAL_ITEMS,gc as MG_WORLDS,xi as MG_WORLD_STARS,To as MergeItem,mr as Missile,es as OBSTACLE_KINDS,Lc as Order,Gr as PASSIVES,Bs as PASSIVE_IDS,Ul as PIECE_COLORS,Ci as PLATFORMER_CHARACTER,Vr as PLATFORMER_HEROES,Ps as PLATFORMER_LEVELS,Nc as PLATFORMER_META,Ii as PLATFORMER_META_STATS,ka as PLATFORM_LINKS,so as PLATFORM_PACKS,kd as PLATFORM_PRESETS,fn as POWERS,go as POWER_IDS,Gn as PRESETS,Hc as REROLL_GEMS,Gt as REVIVE,Wc as REVIVE_GEMS,Vt as REVIVE_OFFER,ws as ROOMS,Pt as ROOM_ROWS,Bt as ROUND_ENDED,$t as ROUND_OVER,Nt as ROUND_STARTED,Ka as RUNNER_CHARACTER,Dr as RUNNER_HEROES,yo as RUNNER_LEVELS,Xl as RUNNER_META,Fa as RUNNER_META_STATS,Oe as Raider,xt as RoadItem,On as Runner,Lo as SELL_SHARE,zt as SHOW_START,Cd as SOUND_SET_OPTIONS,ho as SPEC_VERSION,qr as SPELLS,Ga as START_ROUND,Vc as SURVIVORS_META,fr as Shot,hn as Soldier,Js as Spot,Hs as Survivor,Qi as TD_CHARACTER,Jr as TD_HEROES,Co as TD_LEVELS,xn as TD_LEVELS_PER_WORLD,Xc as TD_LIVES,Yc as TD_META,el as TD_META_STATS,js as TD_REVIVE_LIVES,ji as TD_WORLDS,Xi as TD_WORLD_STARS,Ks as TOWERS,No as TY_BUSINESSES,ll as TY_CHARACTER,Qr as TY_EVENTS,eo as TY_HEROES,Zr as TY_LEVELS,to as TY_LEVELS_PER_WORLD,gr as TY_LEVEL_DEFS,sd as TY_META,cl as TY_META_STATS,$o as TY_MILESTONES,oa as TY_REVIVE_SECONDS,ol as TY_SKILLS,ta as TY_UPGRADES,rd as TY_WORLDS,sl as TY_WORLD_STARS,it as Thing,sn as Tower,ml as TyManager,Od as UI_THEMES,Hi as UPGRADE_PICK,Wi as UPGRADE_PICKED,Vi as UPGRADE_REROLL,nl as WAVE_STARTED,vn as WEAPONS,dr as WEAPON_IDS,Ai as WORLDS,Li as WORLD_STARS,Cs as abilitiesFor,ze as act,rp as applyLink,tu as applyPatches,za as attachRules,Fn as boardOf,Kc as buildFromVar,Ki as buildToVar,Tn as cellAt,Ze as cellCenter,Kr as chapterOf,Ha as checkEconomy,$a as checkExpr,jo as checkRules,dn as compileExpr,pn as contentOf,vl as cozyPack,pp as createKitRegistry,Uo as createRegistry,_l as defenseBoostsLink,Rn as defineKind,Qt as enemyOf,Ba as evalNumber,gl as fantasyPack,Pr as findMatches,G as fx,Wa as hasErrors,ai as hasMove,fd as heroCharacterOf,Sl as heroUpgradeLink,ns as laneRunnerBlock,Tr as levelOf,Eo as m3EnemyOf,wr as m3LevelOf,os as m3SkillOf,Ja as m3StarsToEnter,vs as match3Block,bd as match3Preset,As as mergeBlock,vd as mergePreset,Or as metersOf,gn as mgChainOf,$r as mgLevelOf,Ss as mgSkillOf,wn as mgSpecialOf,_s as mgStarsFor,ki as mgStarsToEnter,Gl as migrateSpec,jr as mirrored,Fc as offerFromVar,Fi as offerToVar,np as packName,Ma as parseKnobPath,ru as patchTargets,_d as patchValue,Ot as placeBackdrop,Is as platformerBlock,Hr as platformerLevelOf,md as platformerPreset,xl as postApocalypsePack,El as puzzleCityLink,po as registerCoreEffects,Xp as registerPlatformKit,Xo as resolveParams,Qo as roundBlock,Ml as runnerCollectionLink,hd as runnerPreset,bl as sciFiPack,mo as scrollBackdrop,Qe as setPose,an as shortCash,Jp as specForPreset,wi as starsToEnter,up as startMode,Gs as survivorsBlock,yd as survivorsPreset,Yr as tdLevelOf,qs as tdStarsFor,Zi as tdStarsToEnter,Ji as tdWavesOf,Fs as towerArt,Zs as towerDefenseBlock,gd as towerDefensePreset,kn as towerOf,Po as towerSpent,wo as towerStats,Xr as traceMap,_r as trackControls,ba as tyBotTimeOf,yr as tyBusinessOf,Qc as tyEventOf,ro as tyLevelOf,na as tySkillOf,ra as tyStarsFor,al as tyStarsToEnter,va as tycoonBlock,xd as tycoonPreset,pd as tycoonStateOf,Eu as validateKnobCatalog,lp as validateSpec,Ce as viewOf};