68 lines
273 KiB
JavaScript
68 lines
273 KiB
JavaScript
var _={version:"v29.00",time:{daySeconds:60,farmShutdownGraceSeconds:10},cash:{starting:250},grid:{x:170,y:78,cols:20,rows:10,cell:46,expansion:{colsPerPurchase:10,rowsPerPurchase:10,costBase:850,costGrowthRate:.75,truncateUnit:50}},map:{blockedRatio:0,blockedExpansionIncrement:.0075,blockedRatioMax:.12},economy:{income:{mixer:5,truck:10,sausage:26},poopFine:10,fairiesTribute:{perDay:10,profitExemption:300,legalWorkExemptionBonus:250,profitRate:.12},incomeUpgradeRate:1.1,explosionDamageDivisor:30,maleTruckFinePerHalfDay:30,shredderBonus:{maxCards:30,payoutCoefficient:1.6,payoutExponent:1.25,baseHitChance:.28,hitChancePerUpgrade:.018,maxHitChance:.82,jackpotBaseChance:.01,jackpotChancePerUpgrade:.0025,jackpotMaxChance:.08,bigWinBaseChance:.07,bigWinChancePerUpgrade:.0015,bigWinMaxChance:.12,doubleChance:.2,jackpotMultiplier:10,bigWinMultiplier:4,doubleMultiplier:2},chemicalWeaponSubsidy:{poopPerBlock:70,yenPerBlock:1200}},production:{poopRate:.08,autoScannerCooldown:1.5,autoScannerUpgradeRate:.95,autoScannerCardUpgradeRate:.95,autoScannerMinCooldown:.5,poopRateCardBonus:.04,eggSpawnRanges:[[1.95,4.35],[1.55,3.45],[1.25,2.8],[1.05,2.35]]},conveyor:{baseSpeed:52,maxSpeed:300,bearingSpeedMultiplier:1.075,minimumItemSpacingPx:25},power:{recalcHz:10,maxAssignmentPasses:8,wires:{powerWire:{id:"powerWire",name:"Power Wire",shortName:"WIRE",price:10,lossV:.5},insulatedPowerWire:{id:"insulatedPowerWire",name:"Insulated Wire",shortName:"INS WIRE",price:22,lossV:.15}},exempt:["manualScanner","eggFarm","conveyor","boostConveyor","powerWire","insulatedPowerWire","footbridge","starterGenerator","biomassGenerator","coalGenerator"],machines:{mixer:{minVoltage:10,drawV:4,relayDropV:4,powerPriority:100},trash:{minVoltage:8,drawV:3,relayDropV:3,powerPriority:100},truck:{minVoltage:6,drawV:2,relayDropV:2,powerPriority:100},autoScanner:{minVoltage:8,drawV:2,relayDropV:2,powerPriority:50},sausageMaker:{minVoltage:12,drawV:5,relayDropV:5,powerPriority:50},maintenanceRoom:{minVoltage:6,drawV:1,relayDropV:1,powerPriority:50},inboundTruck:{minVoltage:5,drawV:1,relayDropV:1,powerPriority:50}},generators:{starterGenerator:{outputV:25},biomassGenerator:{baseOutputV:0,pulseVoltage:5,pulseSeconds:2},coalGenerator:{baseOutputV:0,pulseVoltage:15,pulseSeconds:3}}},imports:{combinedLimitPerTruck:80,prices:{coal:2,zundaMochi:4},jitterRatio:.15},farmQuality:{overflowCoefficient:.45,overflowExponent:.85,minMultiplier:1,maxMultiplier:2.5,zundaSeconds:8,zundaMaxSeconds:30,zundaIntervalMultiplier:.55,safeMinIntervalSeconds:.25},effects:{explosionHorizontalVelocityMultiplier:.82},cards:{definitions:[{id:"upgradeEgg",title:"EGG Improvement",rarity:"common",type:"equipmentUpgrade",target:"eggFarm",description:"Choose one EGG FARM on the map and raise it by 1 level.",tags:["EGG","ACTIVE"]},{id:"upgradeAutoScanner",title:"AUTO SCANNER Improvement",rarity:"common",type:"equipmentUpgrade",target:"autoScanner",description:"Choose one AUTO SCANNER on the map and raise it by 1 level.",tags:["SCANNER","ACTIVE"]},{id:"autoScannerTuning",title:"AUTO SCANNER Tuning",rarity:"common",type:"instant",description:"All AUTO SCANNER cooldowns use default cooldown x0.95 per copy.",requiresFacility:"autoScanner",tags:["SCANNER","PASSIVE"]},{id:"upgradeMixer",title:"MIXER Improvement",rarity:"common",type:"equipmentUpgrade",target:"mixer",description:"Choose one MIXER. Each level improves meat quality and raises sausage sale value by 10%.",tags:["ECONOMY","ACTIVE"]},{id:"upgradeTruck",title:"TRUCK Improvement",rarity:"common",type:"equipmentUpgrade",target:"truck",description:"Choose TRUCK on the map and raise it by 1 level.",tags:["ECONOMY","ACTIVE"]},{id:"upgradeSausageMaker",title:"SAUSAGE MACHINE Improvement",rarity:"common",type:"equipmentUpgrade",target:"sausageMaker",description:"Choose one SAUSAGE MACHINE. Each level raises sausage sale value by 10%.",tags:["ECONOMY","SAUSAGE","ACTIVE"]},{id:"upgradeTrash",title:"SHREDDER Improvement",rarity:"common",type:"equipmentUpgrade",target:"trash",description:"Adds a nonlinear scrap-lottery upgrade. More copies raise both payout and win chance; max 30.",tags:["POOP","ACTIVE"]},{id:"crowdedFarming",title:"Crowded Farming",rarity:"common",type:"instant",description:"EGG production interval -5%. Equipment deterioration +4%. Max 10 cards.",requiresFacility:"eggFarm",tags:["EGG","RISK","PASSIVE"]},{id:"hatchingFeed",title:"Hatching Feed",rarity:"common",type:"instant",description:"EGG production interval -4%. Poop rate +3%. No card limit.",requiresFacility:"eggFarm",tags:["EGG","POOP","PASSIVE"]},{id:"poopRateBooster",title:"Poop Culture",rarity:"common",type:"instant",description:"Base poop rate +4 percentage points. No card limit.",tags:["POOP","PASSIVE"]},{id:"safetyCover",title:"Safety Cover",rarity:"common",type:"instant",description:"Explosion damage -5%. No card limit.",tags:["RISK","PASSIVE"]},{id:"preventiveMaintenance",title:"Preventive Maintenance Manual",rarity:"common",type:"instant",description:"All equipment deterioration speed -5%. No card limit.",requiresAnyFacility:["conveyor","eggFarm","autoScanner","manualScanner","mixer","trash","sausageMaker"],tags:["MAINTENANCE","PASSIVE"]},{id:"dudFilter",title:"DUD Filter",rarity:"common",type:"instant",description:"DUD chance -5 percentage points. Stacks until DUD chance reaches 0%.",tags:["CARD","PASSIVE"]},{id:"durabilityCoating",title:"Durability Coating",rarity:"common",type:"instant",description:"All equipment maximum durability +3%. No card limit.",requiresAnyFacility:["conveyor","eggFarm","autoScanner","manualScanner","mixer","trash","sausageMaker"],tags:["MAINTENANCE","PASSIVE"]},{id:"bearing",title:"High-Quality Bearing",rarity:"common",type:"instant",description:"Conveyor speed +7.5%.",requiresFacility:"conveyor",tags:["CONVEYOR","PASSIVE"]},{id:"sparePartsBin",title:"SPARE PARTS BIN",rarity:"common",type:"instant",description:"Restores 2% durability to every machine. A box of almost-compatible parts.",requiresAnyFacility:["conveyor","eggFarm","autoScanner","manualScanner","mixer","trash","sausageMaker"],tags:["MAINTENANCE","ACTIVE"]},{id:"dudRefund",title:"DUD REFUND",rarity:"common",type:"instant",description:"DUDs now come with paperwork. Gain JPY 50 per copy when you pick a DUD.",tags:["CARD","ECONOMY","PASSIVE"]},{id:"freeReroll",title:"FREE REROLL",rarity:"common",type:"instant",description:"The first bad ideas are free.",tags:["CARD","PASSIVE"]},{id:"composter",title:"COMPOSTER",rarity:"common",type:"instant",description:"Turns shredder waste into suspicious fertilizer. Gain JPY 3 per copy when SHREDDER processes poop.",requiresFacility:"trash",tags:["POOP","ECONOMY","PASSIVE"]},{id:"scannerQueueSpacing",title:"Scanner Queue Spacing",rarity:"common",type:"instant",description:"Manual and Auto Scanner queue spacing -15%. No card limit.",requiresAnyFacility:["manualScanner","autoScanner"],tags:["SCANNER","PASSIVE"]},{id:"extraEggOutlet",title:"Extra Egg Outlet",rarity:"rare",type:"equipmentUpgrade",target:"eggOutlet",description:"Choose one EGG FARM and add +1 output port to that EGG. Max +3 per EGG.",tags:["EGG","RARE","ACTIVE"]},{id:"recyclingSubsidy",title:"Recycling Subsidy",rarity:"rare",type:"instant",description:"SELL refund rate +10 points. Max 3 cards; normal SELL can reach 80%.",tags:["ECONOMY","RARE","PASSIVE"]},{id:"dynamite",title:"Dynamite",rarity:"rare",type:"cellAction",target:"blockedCell",description:"Choose and remove up to 3 unbuildable cells.",tags:["RISK","RARE","ONE-SHOT"]},{id:"usedMachine",title:"Used Machines",rarity:"rare",type:"instant",description:"Future equipment costs half. New purchases have no refund and 60% durability. New Machines cancels it.",tags:["ECONOMY","RISK","RARE"]},{id:"newMachine",title:"New Machines",rarity:"common",type:"instant",description:"Cancel Used Machines and restore normal prices, refunds, and durability.",tags:["ECONOMY","ONE-SHOT"]},{id:"flattery",title:"Flattery",rarity:"rare",type:"instant",description:"Next Fairies tribute -50%.",tags:["ECONOMY","RARE","ONE-SHOT"]},{id:"extraCards",title:"Extra Cards",rarity:"rare",type:"instant",description:"Draw 2 cards now and choose both.",tags:["RARE","ACTIVE"]},{id:"legalWork",title:"Legal Work",rarity:"rare",type:"instant",description:"Fairies tribute profit exemption +JPY 250.",tags:["ECONOMY","RARE","PASSIVE"]},{id:"chemicalWeaponSubsidy",title:"Chemical Weapons Subsidy",rarity:"ultraRare",type:"instant",description:"Each day, gain JPY 1200 per 70 poop shipped by truck. No card limit.",tags:["POOP","ULTRA RARE","PASSIVE"]},{id:"laborExploitation",title:"Motivational Exploitation",rarity:"ultraRare",type:"instant",description:"Repair room work time -30%. The repairman smiles with bloodshot eyes. One time only.",tags:["MAINTENANCE","ULTRA RARE","PASSIVE"]},{id:"rescueLoan",title:"Emergency Loan",rarity:"ultraRare",type:"instant",description:"If cash is below JPY 0 at day-end settlement, gain JPY 500. Consumed on use.",tags:["ECONOMY","ULTRA RARE","ONE-SHOT"]}],defaultEffects:{bearing:0,legalWork:0,fairiesFlatteryNext:0,autoScannerTuning:0,poopRateBooster:0,crowdedFarming:0,hatchingFeed:0,safetyCover:0,recyclingSubsidy:0,chemicalWeaponSubsidy:0,preventiveMaintenance:0,dudFilter:0,durabilityCoating:0,sparePartsBin:0,dudRefund:0,freeReroll:0,composter:0,scannerQueueSpacing:0,laborExploitation:0,usedMachineActive:!1,rescueLoanCharges:0},commonWeight:8,rareWeight:2,ultraRareWeight:.45,baseDraftSize:3,maxDudsPerDraft:2,dudChancePerCard:.3,dudChanceReductionPerFilter:.05,extraCardsAddedPicks:2,rerollCost:{dayDivisor:2,multiplier:100}},events:{eventChance:.1,firstTurn:8},maintenance:{fullPerformanceUntilWear:.5,minimumPerformance:.5,durability:{conveyor:1300,eggFarm:475,autoScanner:850,mixer:775,trash:950,sausageMaker:825,starterGenerator:1e3,biomassGenerator:900,coalGenerator:900,inboundTruck:850},processingDelayMaxSeconds:{mixer:1.2,trash:1,sausageMaker:.9},repairman:{secondsPerOnePercent:.5,walkSpeed:90}},facilities:{conveyor:{id:"conveyor",type:"conveyor",name:"Conveyor",shortName:"Belt",price:30,buildable:!0,upgradeable:!1},boostConveyor:{id:"boostConveyor",type:"conveyor",name:"Boost Conveyor",shortName:"BOOST BELT",price:75,buildable:!0,upgradeable:!1,speedMultiplier:2},powerWire:{id:"powerWire",type:"powerWire",name:"Power Wire",shortName:"WIRE",price:10,buildable:!0,upgradeable:!1},insulatedPowerWire:{id:"insulatedPowerWire",type:"powerWire",name:"Insulated Power Wire",shortName:"INS WIRE",price:22,buildable:!0,upgradeable:!1},footbridge:{id:"footbridge",type:"footbridge",name:"Footbridge",shortName:"BRIDGE",price:90,buildable:!0,upgradeable:!1,footprint:{cols:1,rows:3}},eggFarm:{id:"eggFarm",type:"eggFarm",name:"Egg Farm",shortName:"EGG",price:250,buildable:!0,upgradeable:!0,maxLevel:4},manualScanner:{id:"manualScanner",type:"scanner",kind:"manual",name:"Manual Scanner",shortName:"Manual Scanner",price:260,buildable:!0,upgradeable:!1},autoScanner:{id:"autoScanner",type:"scanner",kind:"auto",name:"Auto Scanner",shortName:"Auto Scanner",price:180,buildable:!0,upgradeable:!1},mixer:{id:"mixer",type:"facility",name:"Mixer",shortName:"MIXER",price:450,buildable:!0,upgradeable:!0,incomeKey:"mixer",body:{w:164,h:126}},trash:{id:"trash",type:"facility",name:"Waste Shredder",shortName:"SHREDDER",price:240,buildable:!0,upgradeable:!0,body:{w:180,h:100}},truck:{id:"truck",type:"facility",name:"Shipping Truck",shortName:"SHIP TRUCK",price:450,buildable:!0,upgradeable:!0,incomeKey:"truck",body:{w:176,h:138}},sausageMaker:{id:"sausageMaker",type:"facility",name:"Sausage Machine",shortName:"SAUSAGE",price:380,buildable:!0,upgradeable:!0,incomeKey:"sausage",footprint:{cols:3,rows:3},body:{w:138,h:138},outputProduct:"sausage"},starterGenerator:{id:"starterGenerator",type:"facility",name:"Starter Generator",shortName:"STARTER",price:0,buildable:!1,upgradeable:!1,footprint:{cols:2,rows:2},body:{w:92,h:92}},biomassGenerator:{id:"biomassGenerator",type:"facility",name:"Biomass Generator",shortName:"BIOMASS",price:520,buildable:!0,upgradeable:!1,footprint:{cols:3,rows:3},body:{w:138,h:138}},coalGenerator:{id:"coalGenerator",type:"facility",name:"Coal Generator",shortName:"COAL GEN",price:680,buildable:!0,upgradeable:!1,footprint:{cols:2,rows:3},body:{w:92,h:138}},inboundTruck:{id:"inboundTruck",type:"facility",name:"Inbound Truck",shortName:"INBOUND",price:350,buildable:!0,upgradeable:!1,body:{w:176,h:120}},maintenanceRoom:{id:"maintenanceRoom",type:"maintenanceRoom",name:"Maintenance Room",shortName:"REPAIR ROOM",price:220,buildable:!0,upgradeable:!1,footprint:{cols:2,rows:2}}}};var Ai=_.version,yt=_.time.daySeconds,Un=_.cash.starting,Ie=_.economy,$i=_.time.farmShutdownGraceSeconds,bo=_.production.autoScannerCooldown,Fi=_.production.autoScannerUpgradeRate,wr=_.production.autoScannerCardUpgradeRate||_.production.autoScannerUpgradeRate,mr=_.production.autoScannerMinCooldown,Oi=_.events.eventChance,Vn=_.events.firstTurn,vr=_.production.poopRate,Sr=_.production.poopRateCardBonus||0,wo=_.conveyor.baseSpeed,yn=_.conveyor.maxSpeed,mo=_.conveyor.bearingSpeedMultiplier,qe=_.cards,Bi=_.cards.definitions,kr=_.cards.defaultEffects,Gt=_.production.eggSpawnRanges,p=_.grid,Te=_.facilities,Mr=["conveyor","boostConveyor","powerWire","insulatedPowerWire","footbridge","eggFarm","autoScanner","manualScanner","mixer","trash","truck","inboundTruck","sausageMaker","biomassGenerator","coalGenerator","maintenanceRoom"],vo=["mixer","trash","truck","inboundTruck"],So=["sausageMaker","starterGenerator","biomassGenerator","coalGenerator"],Cr=[...vo,...So],Di=["mixer","trash","truck"],Li=["mixer","truck","sausageMaker"],_t=Object.fromEntries(Object.entries(Te).map(([e,t])=>[e,t.price])),fe=[{name:"right",dc:1,dr:0,angle:0,opposite:"left"},{name:"left",dc:-1,dr:0,angle:Math.PI,opposite:"right"},{name:"down",dc:0,dr:1,angle:Math.PI/2,opposite:"up"},{name:"up",dc:0,dr:-1,angle:-Math.PI/2,opposite:"down"}],w={bg:"#111318",ink:"#090a0d",muted:"#8f9bab",green:"#7bd84f",greenSoft:"#273c24",mixerBlue:"#4aa3ff",truckPink:"#ffb33e",wasteGreen:"#88d35a",meatRed:"#d96b72",sausageOrange:"#d78b3f",danger:"#e34a36",warn:"#ffb827",white:"#e6edf2",poop:"#7b4a23",male:"#4aa3ff",female:"#ff6fae"},_e={ambient:0,important:1,critical:2};function R(e){let t=Number(e)||0;return`${t<0?"-":""}\uFFE5${Math.ceil(Math.abs(t)).toLocaleString("ja-JP")}`}function E(e,t){return`${e},${t}`}function X(e){let[t,n]=String(e).split(",").map(Number);return{col:t,row:n}}function Kn(e,t,n){return Math.max(t,Math.min(n,e))}function ne(e,t){return e+Math.random()*(t-e)}function Re(e,t){return e>=0&&e<p.cols&&t>=0&&t<p.rows}function B(e,t){return{x:p.x+e*p.cell+p.cell/2,y:p.y+t*p.cell+p.cell/2}}function rt(e,t){let n=Math.floor((e-p.x)/p.cell),o=Math.floor((t-p.y)/p.cell);return Re(n,o)?{col:n,row:o}:null}function Gi(e,t){return Math.hypot(e.x-t.x,e.y-t.y)}function ko(e,t){return e&&t&&e.col===t.col&&e.row===t.row}function Tt(e,t){if(!e||!t)return null;let n=Math.sign((t.col??0)-(e.col??0)),o=Math.sign((t.row??0)-(e.row??0));return Math.abs((t.col??0)-(e.col??0))+Math.abs((t.row??0)-(e.row??0))!==1?null:n===1&&o===0?"right":n===-1&&o===0?"left":n===0&&o===1?"down":n===0&&o===-1?"up":null}function gr(e,t,n){return e+(t-e)*n}function Ni(e){let t=e.replace("#","");return{r:parseInt(t.slice(0,2),16),g:parseInt(t.slice(2,4),16),b:parseInt(t.slice(4,6),16)}}function Tl(e,t,n){let o=r=>Math.round(Kn(r,0,255)).toString(16).padStart(2,"0");return`#${o(e)}${o(t)}${o(n)}`}function qn(e,t,n){let o=Ni(e),r=Ni(t);return Tl(gr(o.r,r.r,n),gr(o.g,r.g,n),gr(o.b,r.b,n))}var pe={appTitle:"Chick Sorter",versionTitle:`Chick Sorter ${Ai}`,currency:"\uFFE5",phases:{title:"Title",build:"Build",running:"Sorting",clearing:"Clearing",loanDecision:"Emergency Loan",gameover:"Game Over"},actions:{startGame:"Start Game",nextDay:"Next Day",buildPhase:"Build Phase",restart:"Restart",close:"Close",remove:"Remove",refund:"Refund",autoMenu:"Auto Menu"},status:{build:e=>`BUILD: ${(e==="erase"?"SELL":e||"SELECT").toUpperCase()} | Right-drag pan | Hover equipment for info`,sorting:"Sorting: use scanner keys. Build after clearing the day.",allPortsConnected:"Start condition met: one EGG route reaches an exit.",equipmentPanelEmpty:"Hover equipment in Build phase."},routeLabels:{mixer:"MIXER",truck:"TRUCK",inboundTruck:"INBOUND",trash:"WASTE",sausageMaker:"SAUSAGE",biomassGenerator:"BIOMASS",coalGenerator:"COAL GEN",scanner:"NEXT","scanner-role-1":"NEXT",input:"IN"},fail:{outOfGrid:"Out of grid",cellOccupied:"Cell occupied",notEnoughCash:"Not enough cash",facilityExists:"Facility already exists",facilityOverlap:"Facility overlap",nothingToErase:"Nothing to sell",noUpgrade:"No upgrade available"}};function ht(e){return Te[e]?.name||String(e||"").replace(/^[a-z]/,t=>t.toUpperCase())}function El(e){let t=Te[e];return t?e==="conveyor"||e==="boostConveyor"?`${R(t.price)} / tile`:e==="autoScanner"?`${R(t.price)} / ${bo.toFixed(1)}s cooldown`:e==="trash"?R(t.price):R(t.price):""}function Pl(e){return{conveyor:"A narrow green belt. Routes decide whether chicks live, ship, or become invoices.",boostConveyor:"Moves chicks twice as fast. Wears down like a normal belt.",eggFarm:"A tiny gatehouse producing questionable eggs on schedule.",autoScanner:"Processes about 40 items per day at Lv1, roughly 2.1 Lv1 farms.",manualScanner:"A manual checkpoint. The operator is the algorithm.",mixer:"Makes meat when OUT is clear; otherwise falls back to direct sale.",trash:"A polite shredder for poop and other regrets.",truck:"Shipping Truck. Ships target chicks and all sausages.",powerWire:"Overlay wire. Loses 0.5V per tile.",insulatedPowerWire:"Overlay wire. Loses 0.15V per tile.",footbridge:"Lets repair workers cross conveyor cells.",inboundTruck:"Imports coal and zunda mochi during the day.",biomassGenerator:"Fuel generator. Chicks and poop add timed voltage.",coalGenerator:"Fuel generator. Coal adds timed voltage.",sausageMaker:"A 3\xD73 grid machine. Left inlet takes 2 meat; right outlet emits 1 sausage.",maintenanceRoom:"2\xD72 repair bay. Each room dispatches one repairman during the day."}[e]||""}function Rl(e){return{conveyor:"./assets/dark_factory/facilities/conveyor/conveyor_straight_h_16.png",boostConveyor:"./assets/dark_factory/facilities/conveyor/boost_conveyor_straight_h_16.png",eggFarm:"./assets/dark_factory/facilities/machines/egg_farm_16.png?v=dark_factory",autoScanner:"./assets/dark_factory/facilities/machines/auto_scanner_32x48.png",manualScanner:"./assets/dark_factory/facilities/machines/manual_scanner_32x48.png",mixer:"./assets/dark_factory/facilities/machines/mixer_32.png",trash:"./assets/dark_factory/facilities/machines/shredder_32.png",truck:"./assets/dark_factory/facilities/vehicles/truck_32.png",sausageMaker:"./assets/dark_factory/facilities/machines/mixer_32.png",maintenanceRoom:"./assets/dark_factory/facilities/utility/maintenance_room_32.png"}[e]||""}function _i(e){let t=Pl(e),n=Rl(e);return`${n?`<img class="tool-icon" src="${n}" alt="" aria-hidden="true" />`:""}<strong>${ht(e)}</strong><span class="tool-price">${El(e)}</span>${t?`<small class="tool-flavor">${t}</small>`:""}`}function Wi(e){return pe.routeLabels[e]||String(e).toUpperCase()}function Ui(e){let t=2166136261;for(let n=0;n<String(e).length;n+=1)t^=String(e).charCodeAt(n),t=Math.imul(t,16777619);return t>>>0}function Vi(e){let t=e>>>0;return()=>{t+=1831565813;let n=Math.imul(t^t>>>15,1|t);return n^=n+Math.imul(n^n>>>7,61|n),((n^n>>>14)>>>0)/4294967296}}function Ki(e,{base:t=0,increment:n=.0075,max:o=.12}={}){let r=Math.max(0,Math.floor(Number(e)||0));return Number(Math.min(o,t+r*n).toFixed(6))}function Mo(){return`RUN-${Date.now().toString(36)}-${Math.floor(Math.random()*1e6).toString(36)}`.toUpperCase()}function qi({seed:e,targetRatio:t=.2,reserved:n=[]}={}){let o=Vi(Ui(e||Mo())),r=new Set(n.map(c=>typeof c=="string"?c:E(c.col,c.row))),i=[];for(let c=0;c<p.rows;c+=1)for(let b=0;b<p.cols;b+=1){let M=E(b,c);r.has(M)||i.push({col:b,row:c,k:M})}for(let c=i.length-1;c>0;c-=1){let b=Math.floor(o()*(c+1));[i[c],i[b]]=[i[b],i[c]]}let a=Math.round(p.cols*p.rows*t+1e-9);return new Set(i.slice(0,Math.min(a,i.length)).map(c=>c.k))}function zi({seed:e,colStart:t=0,colEnd:n=p.cols,rowStart:o=0,rowEnd:r=p.rows,targetRatio:i=.2,reserved:a=[]}={}){let c=Vi(Ui(e||Mo())),b=new Set(a.map(z=>typeof z=="string"?z:E(z.col,z.row))),M=[],C=Math.max(0,Math.floor(t)),$=Math.max(C,Math.floor(n)),W=Math.max(0,Math.floor(o)),K=Math.max(W,Math.floor(r));for(let z=W;z<K;z+=1)for(let Q=C;Q<$;Q+=1){let ie=E(Q,z);b.has(ie)||M.push({col:Q,row:z,k:ie})}for(let z=M.length-1;z>0;z-=1){let Q=Math.floor(c()*(z+1));[M[z],M[Q]]=[M[Q],M[z]]}let G=Math.round(($-C)*(K-W)*i+1e-9);return new Set(M.slice(0,Math.min(G,M.length)).map(z=>z.k))}var hn=10,Hi=2,Yi=1;function bn(e,t){return`${e},${t}`}function Il(e){let[t,n]=String(e).split(",").map(Number);return{chunkX:t,chunkY:n}}function Co(e){let t=_.grid.expansion||{},n=Math.max(1,(e.gridExpansionPurchases||0)+1),o=Math.max(0,Number(t.costBase)||850),r=Math.max(0,Number(t.costGrowthRate)||.75),i=o*(1+r*(n-1)),a=Math.max(1,t.truncateUnit||50);return Math.floor(i/a)*a}function Qi(e){e.ownedCells=new Set,e.ownedChunks=new Set,e.gridChunkOriginX=0,e.gridChunkOriginY=0,e.gridExpansionPurchases=0,e.gridExpansionPurchasesByDirection={left:0,right:0,up:0,down:0};for(let t=0;t<Yi;t+=1)for(let n=0;n<Hi;n+=1)e.ownedChunks.add(bn(n,t));for(let t=0;t<_.grid.rows;t+=1)for(let n=0;n<_.grid.cols;n+=1)e.ownedCells.add(E(n,t))}function Xi(e){if(e.ownedChunks?.size)return e.ownedChunks;if(e.ownedChunks=new Set,e.ownedCells?.size){let t=e.gridChunkOriginY||0;for(let n of e.ownedCells){let o=X(n),r=e.gridChunkOriginX||0,i=Math.floor(o.col/hn)+r,a=Math.floor(o.row/hn)+t;e.ownedChunks.add(bn(i,a))}}else for(let t=0;t<Yi;t+=1)for(let n=0;n<Hi;n+=1)e.ownedChunks.add(bn(n,t));return e.ownedChunks}function je(e,t,n){return!e?.ownedCells||e.ownedCells.size===0?t>=0&&t<p.cols&&n>=0&&n<p.rows:e.ownedCells.has(E(t,n))}function ji(e){return e?.ownedCells?.size||p.cols*p.rows}function xr(e,t,n,o="up"){let r=e.gridChunkOriginX||0,i=e.gridChunkOriginY||0;return{direction:o,key:bn(t,n),chunkX:t,chunkY:n,colStart:(t-r)*hn,rowStart:(n-i)*hn,cols:hn,rows:hn}}function jt(e){let t=Xi(e),n=new Map;for(let r of t){let{chunkX:i,chunkY:a}=Il(r),c={chunkX:i-1,chunkY:a,direction:"left"},b={chunkX:i+1,chunkY:a,direction:"right"},M={chunkX:i,chunkY:a-1,direction:"up"},C={chunkX:i,chunkY:a+1,direction:"down"};for(let $ of[c,b,M,C]){let W=bn($.chunkX,$.chunkY);t.has(W)||n.has(W)||n.set(W,xr(e,$.chunkX,$.chunkY,$.direction))}}let o={left:0,right:1,up:2,down:3};return[...n.values()].sort((r,i)=>{let a=(o[r.direction]??9)-(o[i.direction]??9);return a||(r.chunkY!==i.chunkY?r.chunkY-i.chunkY:r.chunkX-i.chunkX)})}function Ji(e,t="right"){let n=jt(e);return n.find(o=>o.direction===t)||n[0]||null}function Et(e){return{x:p.x+e.colStart*p.cell,y:p.y+e.rowStart*p.cell,w:e.cols*p.cell,h:e.rows*p.cell}}function Tr(e){let t=Et(e);return{x:t.x+t.w/2-116,y:t.y+t.h/2-36,w:232,h:72,cx:t.x+t.w/2,cy:t.y+t.h/2}}function Zi(e,t){let n=Tr(e);return t.x>=n.x&&t.x<=n.x+n.w&&t.y>=n.y&&t.y<=n.y+n.h}function es(e){let t=[];for(let n=e.rowStart;n<e.rowStart+e.rows;n+=1)for(let o=e.colStart;o<e.colStart+e.cols;o+=1)t.push({col:o,row:n});return t}function go(e,t){let n=new Set;for(let o of e||[]){let r=X(o);n.add(E(r.col,r.row+t))}return n}function xo(e,t){let n=new Map;for(let[o,r]of e||[]){let i=X(o);n.set(E(i.col,i.row+t),r)}return n}function To(e,t){let n=new Set;for(let o of e||[]){let r=X(o);n.add(E(r.col+t,r.row))}return n}function Eo(e,t){let n=new Map;for(let[o,r]of e||[]){let i=X(o);n.set(E(i.col+t,i.row),r)}return n}function ts(e,t,n){Xi(e).add(bn(t,n))}function Pr(){return{mixerCount:0,truckFemale:0,truckMale:0,trashCount:0,poopSpawned:0,poopTruck:0,poopTrash:0,poopMixer:0,autoSorted:0,revenue:0,penalty:0,profit:0,pendingTruckRevenue:0,mixerRevenue:0,truckRevenue:0,sausageRevenue:0,meatProduced:0,sausageProduced:0,sausageShipped:0,chickShipmentIncome:0,poopShipmentIncome:0,manualComboBonus:0,manualComboSuccess:0,manualComboFailure:0,fairiesTribute:0,chemicalWeaponSubsidy:0,rescueLoan:0,cardRerollCost:0,dudRefundIncome:0,composterIncome:0,sparePartsRepair:0,mixerPoopFine:0,truckPoopFine:0,maleTruckFine:0,explosionDamage:0,shredderBonus:0,correct:0,mistakes:0,eventBonus:0,explosions:0,eventResult:null,conveyorPasses:0,eggProduced:0,coalOrdered:0,coalReleased:0,coalConsumed:0,coalUndelivered:0,zundaOrdered:0,zundaReleased:0,zundaConsumed:0,zundaUndelivered:0,zundaBoostSeconds:0,zundaBoostSecondsByFarm:{},importPurchaseCost:0,biomassFuelConsumed:0,maxGeneratorOutput:{},qualityRevenue:0,farmTheoreticalRate:0,farmActualOutputRate:0,qualityMultiplierSum:0,qualityMultiplierCount:0,maxQualityMultiplier:1,generatorAssignmentChanges:0,underVoltageSeconds:0,underVoltageSecondsByMachine:{},unreachableRepairTargets:0}}function Al(){return{turnsCompleted:0,processed:0,correct:0,mistakes:0,revenue:0,penalty:0,profit:0,maxCash:Un,autoSorted:0,poopTruck:0,poopTrash:0,poopMixer:0,meatProduced:0,sausageProduced:0,sausageShipped:0,explosionDamage:0,shredderBonus:0,eventBonus:0,explosions:0,fairiesTribute:0,chemicalWeaponSubsidy:0,rescueLoan:0,manualComboBonus:0,manualComboSuccess:0,manualComboFailure:0,cardRerollCost:0,dudRefundIncome:0,composterIncome:0,sparePartsRepair:0,mixerPoopFine:0,truckPoopFine:0,maleTruckFine:0,eventSuccess:0,eventFailed:0,conveyorPasses:0,eggProduced:0,coalOrdered:0,coalReleased:0,coalConsumed:0,coalUndelivered:0,zundaOrdered:0,zundaReleased:0,zundaConsumed:0,zundaUndelivered:0,zundaBoostSeconds:0,importPurchaseCost:0,biomassFuelConsumed:0,qualityRevenue:0,generatorAssignmentChanges:0,underVoltageSeconds:0,unreachableRepairTargets:0}}function Rr(){return{phase:"title",cash:Un,turn:1,timeLeft:yt,shutdownTimeLeft:0,shutdownGraceSeconds:$i,cleanupTimer:null,cleanupBlown:!1,lastTimestamp:0,nextId:10,runSeed:Mo(),gridCols:_.grid.cols,gridRows:_.grid.rows,gridExpansionPurchases:0,gridExpansionPurchasesByDirection:{left:0,right:0,up:0,down:0},gridChunkOriginX:0,gridChunkOriginY:0,ownedCells:new Set,blockedCells:new Set,buildTool:null,footbridgeOrientation:"vertical",buildSession:0,undoStack:[],redoStack:[],selected:null,multiSelected:[],selectionBox:null,groupDrag:null,pan:null,view:{x:0,y:0,scale:1},hover:null,chicks:[],effects:[],floatingTexts:[],shake:{time:0,strength:0},truckCargo:[],shippedCargo:[],conveyorTiles:new Set,conveyorMeta:new Map,powerWires:new Map,footbridges:new Map,powerOverlay:!1,power:{dirty:!0,elapsed:0,routes:new Map,assignments:new Map,sources:new Map,underVoltage:new Set},imports:{schedules:new Map},walkabilityVersion:0,eggFarms:[],scanners:[],facilities:{},maintenanceRooms:[],repairmen:[],branchCounters:new Map,routingVersion:0,factoryGraph:null,factoryGraphCommittedVersion:-1,factoryGraphSnapshot:null,mixerHalfTimer:0,congestion:new Map,componentLookup:new Map,frameId:0,frameCache:{frameId:-1,routingVersion:-1,chickRevision:0,spatialRevision:-1,spatial:new Map,congestionFrame:-1,componentChicks:new Map,manualMonitorSignature:"",draw:{}},lastExplodedComponent:new Map,eventOffer:null,eventActive:null,pendingFairiesTributeMultiplier:1,cardEffects:{bearing:0,legalWork:0,fairiesFlatteryNext:0,autoScannerTuning:0,poopRateBooster:0,crowdedFarming:0,hatchingFeed:0,safetyCover:0,recyclingSubsidy:0,chemicalWeaponSubsidy:0,preventiveMaintenance:0,dudFilter:0,durabilityCoating:0,sparePartsBin:0,dudRefund:0,freeReroll:0,composter:0,scannerQueueSpacing:0,laborExploitation:0,usedMachineActive:!1,rescueLoanCharges:0},cardDraft:{pending:!1,choices:[],rerolls:0,picksRemaining:0},cardTargetPick:null,manualCombo:{count:0,lastBonus:0},repairman:{active:!1,x:p.x+p.cell*.5,y:p.y+_.grid.rows*p.cell+84,target:null,repairedToday:0},stats:Pr(),lastResult:null,totals:Al()}}function zn(e){return Gt[(e?.level||1)-1]||Gt[Gt.length-1]||[2,4]}function Jt(e){let[t,n]=zn(e);return ne(t,n)}function Er(e,t,n){let o=Te[e],r={...o.body,name:o.name,price:o.price},i={left:p.x,right:p.x+p.cols*p.cell,top:p.y,bottom:p.y+p.rows*p.cell},a={x:p.x+t.col*p.cell+p.cell/2,y:p.y+t.row*p.cell+p.cell/2},c=a.x-r.w/2,b=a.y-r.h/2;n==="left"?(c=i.left-r.w-18,b=a.y-r.h/2):n==="right"?(c=i.right+18,b=a.y-r.h/2):n==="bottom"?(c=a.x-r.w/2,b=i.bottom+18):n==="top"&&(c=a.x-r.w/2,b=i.top-r.h-18);let M={type:"facility",id:e,name:r.name,x:c,y:b,w:r.w,h:r.h,baseW:r.w,baseH:r.h,level:1,price:r.price,entry:{...t},side:n};return e==="mixer"&&(n==="left"||n==="right")&&(M.w=Math.min(r.w,r.h),M.h=Math.max(r.w,r.h),n==="left"?(M.x=i.left-M.w-18,M.y=a.y-M.h/2):(M.x=i.right+18,M.y=a.y-M.h/2)),M}function $l(){return{mixer:Er("mixer",{col:0,row:4},"left"),trash:Er("trash",{col:12,row:9},"bottom"),truck:Er("truck",{col:18,row:9},"bottom")}}var Fl=Object.freeze([[1,1],[2,1],[3,1],[4,1],[5,1],[6,1],[7,1],[8,1],[8,2],[7,4],[6,4],[5,4],[4,4],[3,4],[2,4],[1,4],[0,4],[10,4],[11,4],[12,4],[13,4],[14,4],[15,4],[15,5],[14,7],[13,7],[12,7],[12,8],[12,9],[17,7],[18,7],[18,8],[18,9]]),Ol=Object.freeze([{type:"scanner",id:1,kind:"manual",slot:0,role:0,col:8,row:4,level:1,queue:[],cooldown:0,price:_t.manualScanner,builtSession:null,autoMode:"standard",keys:{left:{key:"a",code:"KeyA",label:"A"},right:{key:"d",code:"KeyD",label:"D"}}},{type:"scanner",id:2,kind:"manual",slot:1,role:1,col:15,row:7,level:1,queue:[],cooldown:0,price:_t.manualScanner,builtSession:null,autoMode:"standard",keys:{left:{key:"arrowleft",code:"ArrowLeft",label:"Left"},right:{key:"arrowright",code:"ArrowRight",label:"Right"}}}]),Bl=Object.freeze([{type:"eggFarm",id:1,col:1,row:0,level:1,nextSpawn:2,lastInterval:2,spawnCounter:0,price:_t.eggFarm,builtSession:null}]);function is(e,t,n,o={}){if(!Re(t,n))return;let r=E(t,n);if(e.conveyorTiles.add(r),!e.conveyorMeta.has(r)||o.forceMeta)e.conveyorMeta.set(r,{price:_t.conveyor,builtSession:null,uses:0,durability:_.maintenance.durability.conveyor,maintenanceType:"conveyor",kind:o.kind||"conveyor",speedMultiplier:o.speedMultiplier||1,dir:o.dir||null,outDirs:Array.isArray(o.outDirs)?[...o.outDirs]:[],branchMode:o.branchMode||"random"});else if(o.dir||o.outDirs){let i=e.conveyorMeta.get(r);o.dir&&(i.dir=o.dir),Array.isArray(o.outDirs)&&(i.outDirs=[...new Set([...i.outDirs||[],...o.outDirs])]),i.branchMode||(i.branchMode="random"),i.kind||(i.kind="conveyor"),i.speedMultiplier||(i.speedMultiplier=1)}}function ns(e,t,n){let o=E(t,n);return e.conveyorMeta.has(o)||is(e,t,n),e.conveyorMeta.get(o)}function Dl(e,t,n){let o=Tt(t,n);if(!o)return;let r=ns(e,t.col,t.row);r.outDirs=Array.isArray(r.outDirs)?r.outDirs:[],r.outDirs.includes(o)||r.outDirs.push(o),r.dir=o;let i=ns(e,n.col,n.row);i.dir||(i.dir=o)}function Ll(e){return[{col:e.col,row:e.row-2},{col:e.col-1,row:e.row},{col:e.col+2,row:e.row}].filter(t=>Re(t.col,t.row))}function Nl(e){return[{col:e.col,row:e.row-1},{col:e.col+1,row:e.row-1},{col:e.col,row:e.row},{col:e.col+1,row:e.row}].filter(t=>Re(t.col,t.row))}function Gl(e){return[{col:e.col,row:e.row+1},{col:e.col-1,row:e.row},{col:e.col+1,row:e.row},{col:e.col,row:e.row-1}].filter(t=>Re(t.col,t.row))}function ss(e){let t=new Set([...e.conveyorTiles]),n=o=>{o&&Re(o.col,o.row)&&t.add(E(o.col,o.row))};for(let o of e.scanners){for(let r of Nl(o))n(r);for(let r of Ll(o))n(r)}for(let o of e.eggFarms){n(o);for(let r of Gl(o))n(r)}for(let o of Object.values(e.facilities))n(o.entry);for(let o of Object.values(e.facilities))if(o.gridPlaced)for(let r=0;r<(o.hCells||1);r+=1)for(let i=0;i<(o.wCells||1);i+=1)n({col:o.col+i,row:o.row+r});return t}function _l(e,t,n,o="powerWire",r=!1){Re(t,n)&&e.powerWires.set(E(t,n),{kind:o,price:r?0:_.power.wires[o]?.price||0,builtSession:r?null:e.buildSession})}function Wl(e){let t=Te.starterGenerator,n={type:"facility",id:"starterGenerator",baseId:"starterGenerator",name:t.name,col:6,row:6,wCells:t.footprint.cols,hCells:t.footprint.rows,gridPlaced:!0,level:1,price:0,builtSession:null,unsellable:!0};n.x=p.x+n.col*p.cell,n.y=p.y+n.row*p.cell,n.w=n.wCells*p.cell,n.h=n.hCells*p.cell,e.facilities.starterGenerator=n}function os(e){e.powerWires=new Map;let t=[[5,6],[4,6],[3,6],[2,6],[1,6],[0,6],[0,5],[0,4],[8,7],[8,8],[9,8],[10,8],[11,8],[12,8],[12,9],[13,8],[14,8],[15,8],[16,8],[17,8],[18,8],[18,9]];for(let[n,o]of t)_l(e,n,o,"powerWire",!0)}function Ul(e){let t=new Set;for(let n of Object.values(e.facilities||{}))if(n.gridPlaced)for(let o=0;o<(n.hCells||1);o+=1)for(let r=0;r<(n.wCells||1);r+=1)t.add(E(n.col+r,n.row+o));for(let n of e.powerWires.keys())if(e.blockedCells.has(n)||t.has(n))throw new Error(`Invalid starter power wire at ${n}`);for(let n of["starterGenerator","mixer","trash","truck"])if(!e.facilities[n])throw new Error(`Missing starter power facility: ${n}`)}function rs(e){let t=Fl.map(([n,o])=>({col:n,row:o}));for(let{col:n,row:o}of t)is(e,n,o);for(let n=0;n<t.length-1;n+=1)Dl(e,t[n],t[n+1])}function Vl(e){let t=ss(e);for(let n of t)e.blockedCells.delete(n)}function Ir(e){p.x=_.grid.x,p.y=_.grid.y,p.cols=_.grid.cols,p.rows=_.grid.rows,e.gridCols=p.cols,e.gridRows=p.rows,Qi(e),e.gridOwnedCells=e.ownedCells.size,e.repairman&&(e.repairman.x=p.x+p.cell*.5,e.repairman.y=p.y+p.rows*p.cell+84,e.repairman.target=null,e.repairman.active=!1),e.conveyorTiles.clear(),e.conveyorMeta.clear(),e.powerWires=new Map,e.footbridges=new Map,e.maintenanceRooms=[],e.repairmen=[],e.blockedCells=new Set,rs(e),e.facilities=$l(),Wl(e),e.scanners=Ol.map(n=>({...n,keys:n.keys?{left:{...n.keys.left},right:{...n.keys.right}}:null,queue:[]})),e.eggFarms=Bl.map(n=>{let o=Jt(n);return{...n,nextSpawn:o,lastInterval:o}}),os(e);let t=ss(e);for(let n of e.powerWires.keys())t.add(n);e.blockedCells=qi({seed:e.runSeed,targetRatio:_.map.blockedRatio,reserved:[...t]}),Vl(e),rs(e),os(e),Ul(e),e.power={dirty:!0,elapsed:0,routes:new Map,assignments:new Map,sources:new Map,underVoltage:new Set},e.walkabilityVersion=(e.walkabilityVersion||0)+1,e.routingVersion=(e.routingVersion||0)+1,e.factoryGraph=null,e.factoryGraphCommittedVersion=-1}function Pt(e){return e?[{col:e.col,row:e.row-1},{col:e.col+1,row:e.row-1},{col:e.col,row:e.row},{col:e.col+1,row:e.row}]:[]}function ge(e){let t=B(e.col,e.row);return{x:t.x+p.cell/2,y:t.y-p.cell/2}}function it(e,t,n){return e.eggFarms.find(o=>o.col===t&&o.row===n)||null}function st(e,t,n){return e.scanners.find(o=>Pt(o).some(r=>r.col===t&&r.row===n))||null}function Zt(e,t){return e.scanners.find(n=>n.id===t)||null}function $r(e,t){return e.scanners.find(n=>n.kind==="manual"&&n.slot===t)||null}function mn(e){return e?.baseId||e?.id||""}function Fr(e,t){return Object.entries(e.facilities||{}).filter(([,n])=>mn(n)===t)}function Ro(e,t){return!!(t&&Re(t.col,t.row)&&(!e?.ownedCells?.size||e.ownedCells.has(E(t.col,t.row))))}function bt(e,t,n){return Object.values(e?.facilities||{}).find(o=>o?.gridPlaced?t>=o.col&&t<o.col+(o.wCells||3)&&n>=o.row&&n<o.row+(o.hCells||3):!1)||null}function wt(e,t){let n=typeof t=="string"?e?.facilities?.[t]:t;if(!n)return null;if(mn(n)==="sausageMaker"&&n.gridPlaced){let o={col:n.col-1,row:n.row+Math.floor((n.hCells||3)/2)};return Ro(e,o)?o:null}return Ro(e,n.entry)?{...n.entry}:null}function He(e,t){let n=typeof t=="string"?e?.facilities?.[t]:t,o=mn(n);if(!n||!["mixer","sausageMaker","inboundTruck"].includes(o))return null;if(o==="sausageMaker"&&n.gridPlaced){let a={col:n.col+(n.wCells||3),row:n.row+Math.floor((n.hCells||3)/2)};return Ro(e,a)?a:null}let r=wt(e,n);if(!r)return null;let i=[2,-2,3,-3,1,-1];for(let a of i){let c=n.side==="left"||n.side==="right"?{col:r.col,row:r.row+a}:{col:r.col+a,row:r.row};if(Ro(e,c))return c}return null}function kt(e,t){let n=He(e,t);return!!(n&&e?.conveyorTiles?.has?.(E(n.col,n.row)))}function We(e,t){return{inputA:{col:e.col,row:e.row-2},inputB:null,left:{col:e.col-1,row:e.row},right:{col:e.col+2,row:e.row}}[t]}function ls(e){return e?fe.map(t=>({col:e.col+t.dc,row:e.row+t.dr})).filter(t=>Re(t.col,t.row)):[]}function cs(e,t,n=[],o=[]){if(!t||!Re(t.col,t.row))return[];let r=[],i=a=>{!a||!Re(a.col,a.row)||!e.conveyorTiles.has(E(a.col,a.row))||n.some(c=>c&&ko(a,c))||r.some(c=>ko(c,a))||r.push({...a,viaTolerance:!ko(a,t)})};i(t);for(let a of o)i(a);for(let a of ls(t))i(a);return r}function Ar(e,t,n=[],o=[]){let r=cs(e,t,n,o),i=r.filter(a=>!a.viaTolerance);return i.length?i:r}function Kl(e,t){let n=We(t,"inputA");return!n||!Re(n.col,n.row)?[]:Ar(e,n,Pt(t))}function ql(e,t,n){let o=We(t,n);return cs(e,o,Pt(t))}function zl(e,t){let n=e.facilities[t]||Fr(e,t)[0]?.[1];if(!n)return null;let o=wt(e,n);if(o)return B(o.col,o.row);let r=mn(n)||t;return r==="mixer"?{x:n.x+n.w,y:n.y+n.h*.52}:r==="truck"?{x:n.x,y:n.y+n.h*.52}:r==="trash"?{x:n.x+n.w/2,y:n.y+8}:{x:n.x+n.w/2,y:n.y+n.h/2}}function us(e,t,n){return n==="inputA"?Kl(e,t).length>0:ql(e,t,n).length>0}function Ee(e){e.branchCounters?.clear?.(),e.routeCache=null,e.routingVersion=(e.routingVersion||0)+1,e.factoryGraph=null,e.factoryGraphCommittedVersion=-1,e.frameCache&&(e.frameCache.routingVersion=-1,e.frameCache.congestionFrame=-1,e.frameCache.draw={})}function ze(e,t){return E(e,t)}function wn(e){return X(e)}function Hl(e,t){let n=e.conveyorMeta?.get?.(t)||{},o=[];return Array.isArray(n.outDirs)&&o.push(...n.outDirs),n.dir&&o.push(n.dir),[...new Set(o)].filter(r=>fe.some(i=>i.name===r))}function as(e,t,n){let o=fe.find(a=>a.name===n);if(!o)return!1;let r=e.conveyorMeta?.get?.(ze(t.col+o.dc,t.row+o.dr));return r?[...new Set([...Array.isArray(r.outDirs)?r.outDirs:[],r.dir].filter(Boolean))].includes(o.opposite):!1}function Yl(e,t){let n=wn(t),o=e.conveyorMeta?.get?.(t)||{},r=fe.filter(C=>e.conveyorTiles.has(ze(n.col+C.dc,n.row+C.dr))).map(C=>C.name),i=Hl(e,t).filter(C=>r.includes(C)),a=i.length?i:r;if(r.length===1&&(!i.length||i.includes(r[0]))&&as(e,n,r[0]))return[];if(r.length<3)return a;let c=new Set(r.filter(C=>as(e,n,C))),b=r.filter(C=>!c.has(C)),M=c.size?b:[...new Set(a)];return!M.length&&!c.size&&(M=r),o.branchMode&&o.branchMode!=="random"&&M.length>=2&&M.includes(o.branchMode)?[o.branchMode]:M}function Ql(e){return{version:e.routingVersion||0,cells:new Set,adjacency:new Map,components:new Map,cellToComponent:new Map,scannerInputs:new Map,scannerPorts:new Map,facilityPorts:new Map,farmOutputs:new Map,pathCache:new Map,metrics:{conveyorCells:0,edges:0,components:0,deadEnds:0,crosses:0,scannerPorts:0,connectedScannerPorts:0,facilityPorts:0,connectedFacilityPorts:0,farmOutputs:0},issues:[]}}function Xl(e){let t=Ql(e);for(let o of e.conveyorTiles)t.cells.add(o),t.adjacency.set(o,[]);for(let o of t.cells){let r=wn(o),i=Yl(e,o),a=fe.filter(c=>i.includes(c.name));for(let c of a){let b=ze(r.col+c.dc,r.row+c.dr);t.cells.has(b)&&t.adjacency.get(o).push({key:b,dir:c.name})}}let n=0;for(let[o,r]of t.adjacency.entries()){n+=r.length;let i=new Set(r.map(a=>a.dir));r.length===1&&(t.metrics.deadEnds+=1),r.length===4&&i.has("left")&&i.has("right")&&i.has("up")&&i.has("down")&&(t.metrics.crosses+=1)}return t.metrics.conveyorCells=t.cells.size,t.metrics.edges=Math.floor(n/2),jl(t),Jl(e,t),t.issues=uc(e,t,{includeRoutes:!1}),t}function jl(e){let t=1;for(let n of e.cells){if(e.cellToComponent.has(n))continue;let o=t++,r=[n],i=[];for(e.cellToComponent.set(n,o);r.length;){let a=r.shift();i.push(a);for(let c of e.adjacency.get(a)||[])e.cellToComponent.has(c.key)||(e.cellToComponent.set(c.key,o),r.push(c.key))}e.components.set(o,{id:o,cells:i,capacity:Math.max(1,i.length),count:0,ratio:0})}e.metrics.components=e.components.size}function Jl(e,t){for(let n of e.scanners){let o={};for(let r of["inputA","left","right"]){let i=We(n,r),a=Ar(e,i,Pt(n)).filter(M=>t.cells.has(ze(M.col,M.row))),c=a.map(M=>ze(M.col,M.row)),b=c.length>0;if(o[r]={type:r,cell:i,cells:a,keys:c,key:c[0]||null,connected:b},t.metrics.scannerPorts+=1,b&&(t.metrics.connectedScannerPorts+=1),r==="inputA")for(let M of c)t.scannerInputs.set(M,n.id)}t.scannerPorts.set(n.id,o)}for(let[n,o]of Object.entries(e.facilities)){let r=wt(e,o);if(!r)continue;let i=Ar(e,r).filter(b=>t.cells.has(ze(b.col,b.row))),a=i.map(b=>ze(b.col,b.row)),c=a.length>0;t.facilityPorts.set(n,{id:n,cell:{...r},cells:i,keys:a,key:a[0]||null,connected:c}),t.metrics.facilityPorts+=1,c&&(t.metrics.connectedFacilityPorts+=1)}for(let n of e.eggFarms){let o=ls({col:n.col,row:n.row}).map(r=>ze(r.col,r.row)).filter(r=>t.cells.has(r));t.farmOutputs.set(n.id,o),t.metrics.farmOutputs+=o.length}}function at(e){let t=e.routingVersion||0;return(!e.factoryGraph||e.factoryGraph.version!==t)&&(e.factoryGraph=Xl(e)),e.factoryGraph}function ds(e){let t=at(e);return e.factoryGraphCommittedVersion=t.version,e.factoryGraphSnapshot=Zl(t),t}function Zl(e){return e?{version:e.version,conveyorCells:e.metrics.conveyorCells,edges:e.metrics.edges,components:e.metrics.components,deadEnds:e.metrics.deadEnds,crosses:e.metrics.crosses,scannerPorts:`${e.metrics.connectedScannerPorts}/${e.metrics.scannerPorts}`,facilityPorts:`${e.metrics.connectedFacilityPorts}/${e.metrics.facilityPorts}`,farmOutputs:e.metrics.farmOutputs,issues:[...e.issues||[]]}:null}function ec(e,t){let n=t.col-e.col,o=t.row-e.row;return fe.find(r=>r.dc===n&&r.dr===o)?.name||null}function Or(e,t,n){let o=at(e),r=ze(t.col,t.row);if(!o.cells.has(r))return[];let i=`${r}|${n.cacheKey||"dynamic"}`;if(n.cacheKey&&o.pathCache.has(i))return o.pathCache.get(i).map(ae=>ae.map(ye=>({...ye})));let a=`${r}|none`,c=[{key:r,col:t.col,row:t.row,incoming:"none",depth:0}],b=new Map([[a,0]]),M=new Map,C=[],$=1/0,W=8,K=24,G=80;for(;c.length;){let ae=c.shift();if(ae.depth>$)break;let ye=`${ae.key}|${ae.incoming}`;if(n(ae)){if(C.push(ye),$=ae.depth,C.length>=K)break;continue}for(let L of o.adjacency.get(ae.key)||[]){let V=wn(L.key),se=ec(ae,V),O=ae.depth+1;if(O>$)continue;let H=`${L.key}|${se}`,oe=b.get(H);if(oe==null)b.set(H,O),M.set(H,[ye]),c.push({key:L.key,col:V.col,row:V.row,incoming:se,depth:O});else if(oe===O){let ue=M.get(H)||[];ue.length<W&&!ue.includes(ye)&&ue.push(ye),M.set(H,ue)}}}let z=[],Q=(ae,ye)=>{if(z.length>=G)return;let[L]=ae.split("|"),V=[wn(L),...ye];if(ae===a||L===r){z.push(V);return}for(let se of M.get(ae)||[])Q(se,V)};for(let ae of C)Q(ae,[]);let ie=[],J=new Set;for(let ae of z){let ye=ae.map(L=>ze(L.col,L.row)).join(">");J.has(ye)||(J.add(ye),ie.push(ae))}return n.cacheKey&&o.pathCache.set(i,ie.map(ae=>ae.map(ye=>({...ye})))),ie}function fs(e){let t=at(e),n=new Map;for(let[o,r]of t.components.entries())n.set(o,{id:o,cells:[...r.cells],capacity:r.capacity,count:0,ratio:0});return{components:n,cellToComponent:new Map(t.cellToComponent)}}function Ao(e,t=null){let n=e.map(o=>B(o.col,o.row));return t&&n.push(t),n}function Wt(e,t){t&&(!e.length||Gi(e[e.length-1],t)>1)&&e.push(t)}function tc(e,t,n,o=null){let r=[{x:e.x,y:e.y}];Wt(r,B(t.col,t.row));for(let i of Ao(n,o))Wt(r,i);return r}function nc(e,t){let n=Ao(e),o=We(t,"inputA");return o&&Wt(n,B(o.col,o.row)),Wt(n,ge(t)),n}function oc(e,t,n,o){let r=[{x:e.x,y:e.y}];Wt(r,B(t.col,t.row));for(let a of Ao(n))Wt(r,a);let i=We(o,"inputA");return i&&Wt(r,B(i.col,i.row)),Wt(r,ge(o)),r}function rc(e,t,n=0){let o=B(t.col,t.row),r=0;for(let i of e.chicks||[]){if(i.stage==="flying"||i.stage==="queued")continue;Math.hypot(i.x-o.x,i.y-o.y)<p.cell*.5&&(r+=n<=1?100:Math.max(1,12-n))}return r}function ic(e,t){let n=t.cells||[],o=0,r=Math.min(n.length,8);for(let i=0;i<r;i+=1){let a=n[i],c=e.componentLookup?.get?.(ze(a.col,a.row)),b=c&&e.congestion?.get?.(c)?.ratio||0;o+=rc(e,a,i)+b*25}return o}function Io(e,t,n,o=!1){if(!n.length)return null;let r=[...n].sort((C,$)=>{let W=C.roleBias??0,K=$.roleBias??0;if(W!==K)return W-K;let G=C.cells?.length??C.route?.length??Number.POSITIVE_INFINITY,z=$.cells?.length??$.route?.length??Number.POSITIVE_INFINITY;if(G!==z)return G-z;let Q=C.key||JSON.stringify(C.route||C.cells||C),ie=$.key||JSON.stringify($.route||$.cells||$);return Q.localeCompare(ie)});if(!o||r.length===1)return r[0];let i=r[0].roleBias??0,a=r.filter(C=>(C.roleBias??0)===i),c=a.map(C=>({item:C,score:ic(e,C)})),b=Math.min(...c.map(C=>C.score));a=c.filter(C=>C.score===b).map(C=>C.item);let M=e.branchCounters.get(t)||0;return e.branchCounters.set(t,M+1),a[Math.floor(Math.random()*a.length)]}function ps(e){return e.role===0?{left:{match:"male",destination:"mixer"},right:{match:"default",destination:"scanner-role-1"}}:{left:{match:"poop",destination:"trash"},right:{match:"default",destination:"truck"}}}function Br(e){let t=ps(e);return{left:t.left.destination,right:t.right.destination}}function Dr(e,t){return ps(e).left.match===t.sex?"left":"right"}function Lr(e){return Wi(e)}function Nr(e){return{mixer:"#2477ff",truck:"#ff6aa8",inboundTruck:"#8bd0ff",trash:"#22b94f",sausageMaker:"#d78b3f",biomassGenerator:"#7bd84f",coalGenerator:"#d0d5dc","scanner-role-1":"#526456",scanner:"#526456",input:"#526456"}[e]||"#102015"}function en(e,t,n=!1){let o=at(e),r=(o.farmOutputs.get(t.id)||[]).map(wn),i=[];for(let b of r){let M=$=>o.scannerInputs.has(ze($.col,$.row));M.cacheKey=`farmInput:${b.col},${b.row}:v${o.version}`;let C=Or(e,b,M);for(let $ of C){let W=$[$.length-1],K=o.scannerInputs.get(ze(W.col,W.row)),G=Zt(e,K);G&&i.push({key:`${G.id}:${W.col},${W.row}:${$.length}`,scanner:G,cells:$})}}let a=Io(e,`farm:${t.id}`,i,n);if(a)return{scannerId:a.scanner.id,route:nc(a.cells,a.scanner)};let c=Io(e,`farm:${t.id}:output`,r.map(b=>({key:E(b.col,b.row),cells:[b]})),n);return c?{scannerId:null,route:Ao(c.cells)}:null}function ys(e,t,n,o,r=!1){let i=Zt(e,o);if(!i)return null;let c=at(e).scannerPorts.get(i.id)?.[t],b=We(i,t),M=c?.connected?(c.keys||[c.key]).filter(Boolean).map(wn):[];if(!b||!M.length)return null;let C=Br(i)[t];return C==="scanner-role-1"?sc(e,i,t,n,b,M,r):ac(e,i,t,n,b,M,C,r)}function sc(e,t,n,o,r,i,a){let c=at(e),b=e.scanners.filter($=>$.id!==t.id&&c.scannerPorts.get($.id)?.inputA?.connected),M=[];for(let $ of i)for(let W of b){let K=c.scannerPorts.get(W.id)?.inputA?.key;if(!K)continue;let G=(c.scannerPorts.get(W.id)?.inputA?.keys||[K]).filter(Boolean),z=J=>G.includes(ze(J.col,J.row));z.cacheKey=`toScanner:${$.col},${$.row}:${W.id}:v${c.version}`;let Q=Or(e,$,z),ie=W.role===1?0:1;for(let J of Q)M.push({key:`${ie}:start${E($.col,$.row)}:s${W.id}:${J.length}:${E(J[J.length-1].col,J[J.length-1].row)}`,target:W,cells:J,roleBias:ie})}let C=Io(e,`scanner:${t.id}:${n}:toRole1`,M,a);return C?{destination:"scanner",nextScannerId:C.target.id,route:oc(o,r,C.cells,C.target)}:null}function ac(e,t,n,o,r,i,a,c){let b=at(e),M=[...b.facilityPorts.entries()].filter(([W,K])=>K?.connected&&mn(e.facilities?.[W])===a);if(!M.length)return null;let C=[];for(let W of i)for(let[K,G]of M){let z=(G.keys||[G.key]).filter(Boolean);if(!z.length)continue;let Q=J=>z.includes(ze(J.col,J.row));Q.cacheKey=`toFacility:${W.col},${W.row}:${K}:v${b.version}`;let ie=Or(e,W,Q);for(let J of ie)C.push({key:`start${E(W.col,W.row)}:${K}:${J.length}:${E(J[J.length-1].col,J[J.length-1].row)}`,cells:J,facilityId:K})}let $=Io(e,`scanner:${t.id}:${n}:${a}`,C,c);return $?{destination:a,facilityId:$.facilityId,route:tc(o,r,$.cells,zl(e,$.facilityId))}:null}function hs(e,t,n=new Set){if(!t||n.has(t.id))return!1;n.add(t.id);for(let o of["left","right"]){let r=ys(e,o,ge(t),t.id,!1);if(r){if(["mixer","trash","truck","sausageMaker"].includes(r.destination))return!0;if(r.destination==="scanner"){let i=Zt(e,r.nextScannerId);if(hs(e,i,n))return!0}}}return!1}function lc(e,t){return!!en(e,t,!1)?.scannerId}function vn(e){if(e.phase!=="build")return[];let t=[];for(let n of e.eggFarms||[])lc(e,n)||t.push({type:"eggFarm",id:n.id,ref:n,message:"This Egg will not produce chicks"});for(let n of Cr)for(let[o,r]of Fr(e,n))at(e).facilityPorts.get(o)?.connected||t.push({type:"facility",id:o,ref:r,message:"This facility cannot receive items"});return t}function cc(e){let t=at(e);for(let r of e.eggFarms||[]){let i=en(e,r,!1);if(!i?.scannerId)continue;let a=Zt(e,i.scannerId);if(hs(e,a))return[]}let n=e.eggFarms?.length||0,o=[...t.facilityPorts.entries()].filter(([r,i])=>i?.connected&&["mixer","trash","truck"].includes(mn(e.facilities?.[r]))).length;return n?t.metrics.farmOutputs?e.scanners?.length?o?["No route from an EGG scanner to a receiver."]:["Connect at least one receiver exit: Mixer, Shredder, or Truck."]:["Build at least one scanner and connect it to an EGG route."]:["Connect at least one EGG to a conveyor."]:["Build at least one EGG before starting the next day."]}function Po(e){return e.kind==="manual"?`S${(e.slot??0)+1}`:`Auto Scanner #${e.id}`}function uc(e,t=at(e),n={}){let o=n.includeRoutes!==!1,r=[],i={mixer:"Mixer",trash:"Shredder",truck:"Truck",sausageMaker:"Sausage Machine"};for(let a of Cr){let c=Fr(e,a);if(!c.length){Di.includes(a)&&r.push(`${i[a]||a} is missing`);continue}for(let[b]of c)t.facilityPorts.get(b)?.connected||r.push(`${i[a]||a} receiver has no conveyor`)}for(let a of e.scanners){let c=t.scannerPorts.get(a.id)||{};if(c.inputA?.connected||r.push(`${Po(a)} input has no conveyor`),c.left?.connected||r.push(`${Po(a)} left output has no conveyor`),c.right?.connected||r.push(`${Po(a)} right output has no conveyor`),!!o)for(let b of["left","right"])c[b]?.connected&&!ys(e,b,ge(a),a.id)&&r.push(`${Po(a)} ${b} route is incomplete`)}if(o)for(let a of e.eggFarms)en(e,a)?.scannerId||r.push(`Egg Farm #${a.id} has no scanner route`);else for(let a of e.eggFarms)(t.farmOutputs.get(a.id)||[]).length||r.push(`Egg Farm #${a.id} has no output conveyor`);return[...new Set(r)]}function $o(e){return cc(e)}var Hn=[{key:"premiumFemaleShipment",target:"female",truckTarget:"female",title:"Premium Female Shipment",route:"Female -> Truck",note:"Today only: ship female chicks to Truck. Meet the export target for a bonus.",objective:"truckTarget"},{key:"contaminantSampleExport",target:"poop",truckTarget:"poop",title:"Contaminant Sample Export",route:"Poop value x2",note:"Today only: poop is valid Truck cargo and all poop income is doubled.",objective:"truckTarget",poopValueMultiplier:2},{key:"healthInspection",title:"Health Inspection",route:"Poop -> Shredder",note:"Today only: poop mistakes are fined double. Shred enough poop for an inspection bonus.",objective:"poopTrash",poopFineMultiplier:2},{key:"conveyorJamWarning",title:"Conveyor Jam Warning",route:"No explosions",note:"Today only: jam explosions trigger at 85% congestion. Finish with zero explosions for a bonus.",objective:"noExplosion",congestionExplosionThreshold:.85,congestionWarningThreshold:.68},{key:"powerSavingOrder",title:"Power Saving Order",route:"Slow factory subsidy",note:"Today only: conveyors -20% speed and Auto Scanners +20% cooldown. A subsidy is paid at settlement.",objective:"flatBonus",conveyorSpeedMultiplier:.8,autoScannerCooldownMultiplier:1.2},{key:"overtimeDay",title:"Overtime Day",route:"80 second day",note:"Today only: the work day is longer. No extra reward or penalty.",objective:"none",daySeconds:80},{key:"shortShift",title:"Short Shift",route:"40 second day",note:"Today only: the work day is shorter. The next Fairies tribute is reduced by 10%.",objective:"none",daySeconds:40,fairiesTributeMultiplier:.9},{key:"chickBoom",title:"Chick Boom",route:"EGG interval x0.65",note:"Today only: eggs hatch faster and poop rate rises by 5 percentage points.",objective:"none",productionMultiplier:1/.65,poopRateAdd:.05},{key:"rottenFeed",title:"Rotten Feed",route:"Poop surge",note:"Today only: poop rate rises by 20 percentage points and Shredder poop income is multiplied by 1.5.",objective:"none",poopRateAdd:.2,shredderIncomeMultiplier:1.5},{key:"maintenanceAudit",title:"Maintenance Audit",route:"Durability check",note:"Today only: machines below 50% remaining durability fail the audit. Passing with none below 50% pays a bonus.",objective:"maintenanceAudit"}];function Fe(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function dc(e,t=0,n=1){let o=Math.max(1,Number(e?.turn||1)+1),r=Math.floor(Gr(e)*(.08+Math.random()*.08)),i=Math.floor(Math.max(0,e.cash||0)*.25),a=Math.floor(Math.max(0,t)*Math.max(1,o)*.75);return Math.max(120,Math.ceil(Math.max(r,i,a)*n))}function bs(e){return Math.max(0,Math.ceil(500+Math.max(1,e?.turn||1)*25))}function Gr(e){return[...e.eggFarms.map(t=>t.price||0),...e.scanners.map(t=>t.price||0),...Object.values(e.facilities).map(t=>t.price||0),...[...e.conveyorMeta.values()].map(t=>t.price||0)].reduce((t,n)=>t+n,0)}function fc(e,t=1,n=yt){return e.eggFarms.reduce((o,r)=>{let[i,a]=zn(r),c=Math.max(.1,(i+a)/2);return o+Math.max(1,n)/c*Math.max(.01,t||1)},0)}function pc(e,t){let n=Fe(t.productionMultiplier,1),o=Fe(t.daySeconds,yt),r=fc(e,n,o),i=Math.max(0,Number(e?.cardEffects?.hatchingFeed)||0),a=Math.max(0,Number(e?.cardEffects?.poopRateBooster)||0),c=Math.pow(1.03,i),b=vr+Sr*a,M=Math.min(.95,Math.max(0,(b+Fe(t.poopRateAdd,0))*Fe(t.poopMultiplier,1)*c));return{estimate:r,poopRate:M}}function _r(e,t){let n=typeof t=="string"?Hn.find(c=>c.key===t):t;if(!n)return null;let{estimate:o,poopRate:r}=pc(e,n),i=0;n.objective==="truckTarget"?i=Math.max(1,Math.ceil(o*.3)):n.objective==="poopTrash"&&(i=Math.max(1,Math.ceil(o*r*.8)));let a=0;return["truckTarget","poopTrash","noExplosion"].includes(n.objective)&&(a=dc(e,o)),n.objective==="flatBonus"&&(a=bs(e)),n.objective==="maintenanceAudit"&&(a=bs(e)),{id:`event-${e.turn}-${Date.now()}-${Math.floor(Math.random()*9999)}`,...n,target:n.target||null,truckTarget:n.truckTarget||null,forced:!0,productionMultiplier:Fe(n.productionMultiplier,1),poopMultiplier:Fe(n.poopMultiplier,1),poopRateAdd:Fe(n.poopRateAdd,0),daySeconds:Fe(n.daySeconds,yt),targetAmount:i,estimatedOutput:Math.round(o),reward:a,createdTurn:e.turn,oneTurnOnly:!0}}function ws(e){if(e.turn+1<Vn||Math.random()>Oi)return null;let n=Hn[Math.floor(Math.random()*Hn.length)];return _r(e,n)}function ms(e){e.eventActive=e.eventOffer?{...e.eventOffer}:null,e.eventOffer=null}function vs(e){e.eventActive=null}function Ss(e){return Math.max(1,Fe(e.eventActive?.daySeconds,yt))}function ks(e){return Fe(e.eventActive?.productionMultiplier,1)}function Ms(e){let t=Math.max(0,Number(e?.cardEffects?.hatchingFeed)||0),n=Math.max(0,Number(e?.cardEffects?.poopRateBooster)||0),o=Math.pow(1.03,t),r=vr+Sr*n,i=Fe(e.eventActive?.poopRateAdd,0);return Math.min(.95,Math.max(0,(r+i)*Fe(e.eventActive?.poopMultiplier,1)*o))}function Sn(e){return e.eventActive?.truckTarget||e.eventActive?.target||"female"}function Wr(e,t){return t==="male"?e.truckMale||0:t==="poop"?e.poopTruck||0:e.truckFemale||0}function Cs(e,t){return Sn(e)===t}function gs(e){return Sn(e)!=="male"}function Ur(e){return Math.max(.01,Fe(e.eventActive?.poopValueMultiplier,1))}function Fo(e){return Math.max(.01,Ur(e)*Fe(e.eventActive?.shredderIncomeMultiplier,1))}function Vr(e){return Math.max(.01,Fe(e.eventActive?.poopFineMultiplier,1))}function Kr(e){return Math.max(.1,Math.min(1,Fe(e.eventActive?.congestionExplosionThreshold,1)))}function xs(e){return Math.max(.1,Math.min(1,Fe(e.eventActive?.congestionWarningThreshold,.8)))}function Ts(e){return Math.max(.01,Fe(e?.fairiesTributeMultiplier,1))}function yc(e){let t=0,n=(o,r)=>{let i=Math.max(1,Fe(r,1)),a=Math.max(0,Fe(o,0));1-Math.min(1,a/i)<.5&&(t+=1)};for(let o of e.conveyorMeta?.values?.()||[])n(o.uses,o.durability);for(let o of e.eggFarms||[])n(o.maintenance?.uses,o.maintenance?.durability);for(let o of e.scanners||[])o.kind==="auto"&&n(o.maintenance?.uses,o.maintenance?.durability);for(let o of Object.values(e.facilities||{})){let r=o?.baseId||o?.id;(r==="mixer"||r==="trash"||r==="sausageMaker")&&n(o.maintenance?.uses,o.maintenance?.durability)}return t}function Es(e){let t=e.eventActive;if(!t)return null;let n=0,o=!0,r=0,i="";t.objective==="truckTarget"?(n=Wr(e.stats,t.target),o=n>=t.targetAmount,r=o?t.reward:0):t.objective==="poopTrash"?(n=e.stats.poopTrash||0,o=n>=t.targetAmount,r=o?t.reward:0):t.objective==="noExplosion"?(n=e.stats.explosions||0,o=n===0,r=o?t.reward:0,i=`${n} explosion(s)`):t.objective==="flatBonus"?(o=!0,r=t.reward):t.objective==="maintenanceAudit"?(n=yc(e),o=n===0,o&&(r=t.reward),i=`${n} machine(s) below 50%`):o=!0,r>0?(tt(e,r),e.stats.eventBonus=(e.stats.eventBonus||0)+r,e.totals.eventBonus+=r,e.totals.eventSuccess+=1):t.objective&&t.objective!=="none"&&(e.stats.eventBonus=e.stats.eventBonus||0,e.totals.eventFailed+=o?0:1,o&&(e.totals.eventSuccess+=1));let a={title:t.title,key:t.key,target:t.target,route:t.route,objective:t.objective,targetAmount:t.targetAmount||0,count:n,success:o,bonus:r,reward:t.reward||0,productionMultiplier:t.productionMultiplier,poopMultiplier:t.poopMultiplier,daySeconds:t.daySeconds,detail:i};return e.stats.eventResult=a,a}function qr(e,t){return Math.max(0,Number(e?.cardEffects?.[t])||0)}function hc(e){return!!e?.cardEffects?.usedMachineActive}function bc(e,t){return t?1:Math.min(.8,.5+.1*Math.min(3,qr(e,"recyclingSubsidy")))}function wc(e){return Math.pow(.95,qr(e,"safetyCover"))}function Oo(e){let t=e?.ref||e||{},n=e?.type||t.type;return n==="conveyor"?t.price||Te[t.kind]?.price||Te.conveyor.price:n==="eggFarm"?t.price||Te.eggFarm.price:n==="scanner"?t.price||(t.kind==="auto"?Te.autoScanner.price:Te.manualScanner.price):n==="facility"?t.price||Te[t.id]?.price||0:n==="maintenanceRoom"?t.price||Te.maintenanceRoom.price:Te[t.id]?.price||0}function Le(e,t=null){let n=Te[e]?.price||0;return hc(t)?Math.ceil(n*.5):n}function mc(e,t){return e?.facilities?Object.values(e.facilities).filter(n=>(n?.baseId||n?.id)===t).reduce((n,o)=>n+Math.max(0,(o.level||1)-1),0):0}function Rt(e,t){return Li.includes(t)?Math.pow(Ie.incomeUpgradeRate,mc(e,t)):1}function Je(e){return Math.ceil(Ie.income.truck*Rt(e,"truck"))}function lt(e){return Math.ceil((Ie.income.sausage||26)*Rt(e,"mixer")*Rt(e,"sausageMaker"))}function Yn(e){return Math.ceil(Ie.poopFine*Rt(e,"mixer")*Vr(e))}function Qn(e){return Math.ceil(Ie.poopFine*Rt(e,"truck")*Vr(e))}function zr(e){let t=Ie.maleTruckFinePerHalfDay*(e.turn/2);return Math.ceil(t*Rt(e,"truck"))}function Hr(e){return e?.facilities?Object.values(e.facilities).filter(t=>(t?.baseId||t?.id)==="trash").reduce((t,n)=>t+Math.max(0,(n.level||1)-1),0):0}function At(e){return Math.min(Ie.shredderBonus.maxCards,Hr(e))}function kn(){return Ie.shredderBonus.maxCards}function Bo(){return Ie.shredderBonus||{}}function Ps(e){let t=typeof e=="number"?e:At(e),n=Bo(),o=Math.min(n.maxCards||30,Math.max(0,t));return o>0?Math.ceil((n.payoutCoefficient||1.6)*Math.pow(o,n.payoutExponent||1.25)):0}function tn(e){let t=typeof e=="number"?e:At(e);if(t<=0)return 0;let n=Bo();return Math.min(n.maxHitChance||.82,(n.baseHitChance||.28)+t*(n.hitChancePerUpgrade||.018))}function vc(e){let t=Bo(),n=Math.min(t.jackpotMaxChance||.08,(t.jackpotBaseChance||.01)+e*(t.jackpotChancePerUpgrade||.0025)),o=Math.min(t.bigWinMaxChance||.12,(t.bigWinBaseChance||.07)+e*(t.bigWinChancePerUpgrade||.0015)),r=Math.min(1-n-o,t.doubleChance||.2),i=Math.max(0,1-n-o-r);return n*(t.jackpotMultiplier||10)+o*(t.bigWinMultiplier||4)+r*(t.doubleMultiplier||2)+i}function It(e){let t=typeof e=="number"?e:At(e);return Math.round(Ps(t)*tn(t)*vc(t))}function Sc(e){let t=At(e),n=tn(t),o=Ps(t);if(t<=0||Math.random()>=n)return{cards:t,chance:n,amount:0,expected:It(t),baseAmount:o,multiplier:0,tier:"miss"};let r=Bo(),i=Math.min(r.jackpotMaxChance||.08,(r.jackpotBaseChance||.01)+t*(r.jackpotChancePerUpgrade||.0025)),a=Math.min(r.bigWinMaxChance||.12,(r.bigWinBaseChance||.07)+t*(r.bigWinChancePerUpgrade||.0015)),c=Math.min(1-i-a,r.doubleChance||.2),b=Math.random(),M=1,C="normal";b<i?(M=r.jackpotMultiplier||10,C="jackpot"):b<i+a?(M=r.bigWinMultiplier||4,C="big"):b<i+a+c&&(M=r.doubleMultiplier||2,C="double");let $=Math.ceil(o*M*Fo(e));return{cards:t,chance:n,amount:$,expected:It(t),baseAmount:o,multiplier:M,tier:C}}function Rs(e){let t=Sc(e);return t.amount>0&&(e.stats.shredderBonus=(e.stats.shredderBonus||0)+t.amount,e.totals.shredderBonus=(e.totals.shredderBonus||0)+t.amount,tt(e,t.amount)),t}function Yr(e,t=e.turn,n=null){let o=Math.max(1,Math.floor(Number(t)||1)),r=Ie.fairiesTribute||{perDay:10,profitExemption:300,legalWorkExemptionBonus:250,profitRate:.12},i=Math.ceil(o*(r.perDay||10)),a=Math.max(0,Math.floor(Number(n??e?.lastResult?.profit??e?.stats?.profit??0)||0)),c=Math.max(0,e?.cardEffects?.legalWork||0),b=Math.max(0,(r.profitExemption||0)+c*(r.legalWorkExemptionBonus||0)),M=Math.max(0,a-b),C=Math.ceil(M*Math.max(0,Number(r.profitRate)||0)),$=i+C,W=Math.max(0,e?.cardEffects?.fairiesFlatteryNext||e?.cardEffects?.flattery||0),K=W>0?Math.pow(.5,W):1,G=Math.max(.01,Number(e?.pendingFairiesTributeMultiplier)||1),z=K*G,Q=Math.max(0,Math.ceil($*z)),ie=Math.max(0,$-Q);return{day:o,base:i,profit:a,legalWork:c,profitExemption:b,taxableProfit:M,profitTribute:C,gross:$,flatteryCount:W,eventMultiplier:G,perCardReduction:Math.ceil($*.5),reduction:ie,amount:Q}}function Ut(e,t){let n=e?.ref||e||{},o=e?.type==="conveyor"?t?.conveyorMeta?.get(e.oldKey||n.id):n,r=o?.price||Oo(e||n),i=o?.builtSession===t?.buildSession;if(o?.noRefund||n?.noRefund)return{amount:0,sameBuild:i,price:r,rate:0,noRefund:!0};let a=bc(t,i);return{amount:Math.max(0,Math.ceil(r*a)),sameBuild:i,price:r,rate:a,noRefund:!1}}function kc(e,t=null){let n=Math.max(1,Math.ceil((Number(e)||0)/Ie.explosionDamageDivisor));return Math.max(1,Math.ceil(n*wc(t)))}function Mc(e,t){return Math.max(0,Math.ceil(t))}function Is(e,t){e.cash+=t,e.stats.profit+=t,e.totals.profit+=t,t>=0?(e.stats.revenue+=t,e.totals.revenue+=t):(e.stats.penalty+=Math.abs(t),e.totals.penalty+=Math.abs(t)),e.totals.maxCash=Math.max(e.totals.maxCash,e.cash)}function tt(e,t){let n=Math.max(0,Math.ceil(t));return n>0&&Is(e,n),n}function Mt(e,t){let n=Math.max(0,Math.ceil(t));return n>0&&Is(e,-n),n}function Ct(e,t){Mt(e,t)}function Qr(e,t){t<=0||(e.cash+=t,e.stats.profit+=t,e.totals.profit+=t,e.totals.maxCash=Math.max(e.totals.maxCash,e.cash))}function As(e){let t=Ie.income.mixer;return e.stats.mixerRevenue+=t,tt(e,t),t}function $s(e){let t=Yn(e);return e.stats.mixerPoopFine+=t,e.totals.mixerPoopFine+=t,Mt(e,t),t}function Fs(e){let t=Qn(e);return e.stats.truckPoopFine+=t,e.totals.truckPoopFine+=t,Mt(e,t),t}function Os(e){let t=zr(e);return e.stats.maleTruckFine+=t,e.totals.maleTruckFine+=t,Mt(e,t),t}function Bs(e,t){let n=kc(t,e);return e.stats.explosionDamage+=n,e.totals.explosionDamage+=n,Mt(e,n),n}function Ds(e){let t=Sn(e),n=t==="poop"?Math.ceil(Je(e)*Ur(e)):Je(e),o=Array.isArray(e.shippedCargo)?e.shippedCargo:Array.isArray(e.truckCargo)?e.truckCargo:[],r=o.filter(G=>G.sex===t),i=r.length||Wr(e.stats,t),a=r.length?r.reduce((G,z)=>G+Math.ceil(n*(t==="female"?Math.max(1,z.sourceQuality||1):1)),0):i*n,c=o.filter(G=>G.sex==="sausage"),b=c.length||Math.max(0,e?.stats?.sausageShipped||0),M=lt(e),C=c.length?c.reduce((G,z)=>G+Math.ceil(M*Math.max(1,z.sourceQuality||1)),0):b*M,$=i*n+b*M,W=Math.max(0,a+C-$);e.stats.qualityRevenue=(e.stats.qualityRevenue||0)+W,e.totals.qualityRevenue=(e.totals.qualityRevenue||0)+W;let K=Mc(e,a+C);return e.stats.pendingTruckRevenue=K,e.stats.truckRevenue=K,e.stats.sausageRevenue=C,t==="poop"?e.stats.poopShipmentIncome=a:e.stats.chickShipmentIncome=a,K>0&&tt(e,K),{base:a,adjusted:K,target:t,targetCount:i,unitPrice:n,sausageCount:b,sausageUnitPrice:M,sausageRevenue:C}}function Ls(e,t=e.turn,n=null,o={}){let r=Yr(e,t,n);return e.cardEffects&&(e.cardEffects.fairiesFlatteryNext=0,e.cardEffects.flattery!=null&&delete e.cardEffects.flattery),e.pendingFairiesTributeMultiplier!=null&&(e.pendingFairiesTributeMultiplier=1),r.amount<=0||(o.recordStats?(e.stats.fairiesTribute=(e.stats.fairiesTribute||0)+r.amount,e.totals.fairiesTribute=(e.totals.fairiesTribute||0)+r.amount,Mt(e,r.amount)):(e.totals.fairiesTribute=(e.totals.fairiesTribute||0)+r.amount,e.totals.penalty=(e.totals.penalty||0)+r.amount,e.totals.profit=(e.totals.profit||0)-r.amount,e.cash-=r.amount)),r}function Ns(e){let t=qr(e,"chemicalWeaponSubsidy"),n=Math.max(0,e?.stats?.poopTruck||0),o=Ie.chemicalWeaponSubsidy||{poopPerBlock:70,yenPerBlock:1200},r=Math.floor(n/Math.max(1,o.poopPerBlock||70)),i=t>0&&r>0?r*Math.max(0,o.yenPerBlock||1200)*t:0;return i>0&&(e.stats.chemicalWeaponSubsidy=(e.stats.chemicalWeaponSubsidy||0)+i,e.totals.chemicalWeaponSubsidy=(e.totals.chemicalWeaponSubsidy||0)+i,tt(e,i)),{cards:t,poopTruck:n,blocks:r,amount:i}}function Gs(e){let t=Gr(e),n=Math.max(1,e.totals.turnsCompleted||e.turn||1),o=Math.max(0,e.cash+e.totals.revenue+t*.5+e.totals.eventBonus*.5),r=Math.ceil(o/n),i=Math.floor(n*35+Math.max(0,n-5)*15),a=e.totals.correct*5,c=e.totals.explosionDamage;return{score:Math.max(0,Math.floor(o+r+a-e.totals.penalty-i)),factoryValue:t,base:o,dailyEarned:r,dayPenalty:i,correctBonus:a,explosionPenalty:c,days:n}}function Cc(e){return{...e,keys:e.keys?{left:{...e.keys.left},right:{...e.keys.right}}:null,queue:[],cooldown:e.cooldown||0}}function Xn(e){return JSON.stringify({cash:e.cash,stats:e.stats,totals:e.totals,nextId:e.nextId,gridX:p.x,gridY:p.y,gridCols:e.gridCols||p.cols,gridRows:e.gridRows||p.rows,gridExpansionPurchases:e.gridExpansionPurchases||0,gridExpansionPurchasesByDirection:e.gridExpansionPurchasesByDirection||{left:0,right:0,up:0,down:0},gridChunkOriginX:e.gridChunkOriginX||0,gridChunkOriginY:e.gridChunkOriginY||0,ownedCells:[...e.ownedCells||[]],ownedChunks:[...e.ownedChunks||[]],blockedCells:[...e.blockedCells||[]],selected:e.selected,multiSelected:e.multiSelected||[],buildTool:e.buildTool,view:e.view,facilities:e.facilities,eggFarms:e.eggFarms,scanners:e.scanners.map(Cc),conveyorTiles:[...e.conveyorTiles],conveyorMeta:[...e.conveyorMeta.entries()],powerWires:[...(e.powerWires||new Map).entries()],footbridges:[...(e.footbridges||new Map).entries()],footbridgeOrientation:e.footbridgeOrientation||"vertical",powerOverlay:!!e.powerOverlay,imports:{schedules:[...(e.imports?.schedules||new Map).entries()]},branchCounters:[...e.branchCounters.entries()],cardEffects:e.cardEffects,cardDraft:e.cardDraft,cardTargetPick:e.cardTargetPick})}function _s(e,t){let n=JSON.parse(t);e.cash=n.cash,e.stats=n.stats,e.totals=n.totals,e.nextId=n.nextId,p.x=n.gridX??_.grid.x,p.y=n.gridY??_.grid.y,p.cols=n.gridCols||_.grid.cols,p.rows=n.gridRows||_.grid.rows,e.gridCols=p.cols,e.gridRows=p.rows,e.gridExpansionPurchases=n.gridExpansionPurchases||0,e.gridExpansionPurchasesByDirection=n.gridExpansionPurchasesByDirection||{left:0,right:0,up:0,down:0},e.gridExpansionPurchasesByDirection.left==null&&(e.gridExpansionPurchasesByDirection.left=0),e.gridExpansionPurchasesByDirection.down==null&&(e.gridExpansionPurchasesByDirection.down=0),e.gridChunkOriginX=n.gridChunkOriginX||0,e.gridChunkOriginY=n.gridChunkOriginY||0,e.ownedCells=new Set(n.ownedCells||[]),e.ownedChunks=new Set(n.ownedChunks||[]),e.gridOwnedCells=e.ownedCells.size||p.cols*p.rows,e.blockedCells=new Set(n.blockedCells||[]),e.selected=n.selected,e.multiSelected=n.multiSelected||[],e.buildTool=n.buildTool,e.view=n.view||{x:0,y:0,scale:1},e.view.scale==null&&(e.view.scale=1),e.facilities=n.facilities||{},e.eggFarms=n.eggFarms||[],e.scanners=(n.scanners||[]).map(o=>({...o,queue:[],cooldown:o.cooldown||0})),e.conveyorTiles=new Set(n.conveyorTiles||[]),e.conveyorMeta=new Map(n.conveyorMeta||[]),e.powerWires=new Map(n.powerWires||[]),e.footbridges=new Map(n.footbridges||[]),e.footbridgeOrientation=n.footbridgeOrientation||"vertical",e.powerOverlay=!!n.powerOverlay,e.imports={schedules:new Map(n.imports?.schedules||[])},e.branchCounters=new Map(n.branchCounters||[]),e.cardEffects=n.cardEffects||{bearing:0,legalWork:0,fairiesFlatteryNext:0,scannerQueueSpacing:0},e.cardEffects.drawBonus!=null&&delete e.cardEffects.drawBonus,e.cardDraft=n.cardDraft||{pending:!1,choices:[],rerolls:0,picksRemaining:0},e.cardDraft.picksRemaining==null&&(e.cardDraft.picksRemaining=e.cardDraft.pending?1:0),e.cardDraft.freeRerolls==null&&(e.cardDraft.freeRerolls=0),e.cardTargetPick=n.cardTargetPick||null,e.groupDrag=null,e.selectionBox=null,e.pan=null,e.routingVersion=(e.routingVersion||0)+1,e.walkabilityVersion=(e.walkabilityVersion||0)+1,e.power={...e.power||{},dirty:!0},e.factoryGraph=null,e.factoryGraphCommittedVersion=-1}function Oe(e){e.phase==="build"&&(e.undoStack.push(Xn(e)),e.undoStack.length>80&&e.undoStack.shift(),e.redoStack=[])}function Xr(e){return e.phase!=="build"||!e.undoStack.length?!1:(e.redoStack.push(Xn(e)),_s(e,e.undoStack.pop()),!0)}function jr(e){return e.phase!=="build"||!e.redoStack.length?!1:(e.undoStack.push(Xn(e)),_s(e,e.redoStack.pop()),!0)}function Y(e,t,n,o,r=w.ink){e.floatingTexts.push({x:t,y:n,text:o,color:r,life:1,maxLife:1})}function nn(e,t,n){e.shake.strength=Math.max(e.shake.strength,t),e.shake.time=Math.max(e.shake.time,n)}function Ws(e,t,n){e.effects.push({type:"spawn",priority:_e.ambient,x:t,y:n,life:.42,maxLife:.42,size:12})}function Us(e,t,n,o=w.green){e.effects.push({type:"scannerPulse",priority:_e.important,x:t,y:n,color:o,life:.42,maxLife:.42,size:24})}function Vs(e,t,n){for(let o=0;o<12;o+=1)e.effects.push({type:"meat",priority:_e.important,x:t+ne(-18,18),y:n+ne(-12,16),vx:ne(-60,60),vy:ne(-90,-25),life:ne(.45,.85),maxLife:.85,size:ne(4,8)})}function Ks(e,t,n){for(let o=0;o<16;o+=1)e.effects.push({type:"sludge",priority:_e.important,x:t+ne(-18,18),y:n+ne(-12,16),vx:ne(-46,46),vy:ne(-70,-20),life:ne(.45,.9),maxLife:.9,size:ne(4,8)})}function qs(e,t,n,o){let r=o==="poop"?w.poop:o==="male"?w.male:w.female;for(let i=0;i<22;i+=1)e.effects.push({type:"shred",priority:_e.important,x:t+ne(-16,16),y:n+ne(-8,8),vx:ne(-70,70),vy:ne(40,160),color:i%3===0?w.white:r,life:ne(.45,.95),maxLife:.95,w:ne(3,7),h:ne(10,24),rot:ne(-Math.PI,Math.PI)});gt(e,t,n,w.green,34,_e.important)}function zs(e,t,n,o){let r=o==="poop"?w.poop:o==="male"?w.danger:w.green;for(let i=0;i<8;i+=1)e.effects.push({type:"load",priority:_e.important,x:t+ne(-18,18),y:n+ne(-18,18),vx:ne(-42,42),vy:ne(-90,-25),color:r,life:ne(.35,.65),maxLife:.65,size:8})}function gt(e,t,n,o=w.danger,r=52,i=_e.critical){e.effects.push({type:"shockwave",priority:i,x:t,y:n,color:o,life:.55,maxLife:.55,size:8,maxSize:r})}function $t(e,t,n,o=12,r=w.danger,i=_e.critical){for(let a=0;a<o;a+=1)e.effects.push({type:"spark",priority:i,x:t,y:n,vx:ne(-260,260),vy:ne(-270,120),life:ne(.35,.9),maxLife:.9,size:ne(3,8),color:r})}function Do(e,t,n,o=10){for(let r=0;r<o;r+=1)e.effects.push({type:"smoke",priority:_e.ambient,x:t+ne(-10,10),y:n+ne(-10,10),vx:ne(-26,26),vy:ne(-60,-12),life:ne(.6,1.2),maxLife:1.2,size:ne(8,18)})}function Jr(e,t,n,o,r=null,i=!1){let a=r===null?ne(-Math.PI,Math.PI):r+ne(-.9,.9),c=ne(260,620),b=Math.max(0,Number(_.effects?.explosionHorizontalVelocityMultiplier)||1);e.effects.push({type:"flyingChick",priority:_e.critical,sex:t,x:n+ne(-8,8),y:o+ne(-8,8),vx:Math.cos(a)*c*b,vy:Math.sin(a)*c-ne(80,220),radius:t==="poop"?11:13,hit:new Set,life:4.2,maxLife:4.2,spin:ne(-8,8),noDamage:i})}function ct(e,t,n){e.effects.push({type:"erase",priority:_e.important,x:t,y:n,life:.45,maxLife:.45,size:54}),$t(e,t,n,8,w.ink,_e.important)}function Hs(e,t,n){e.effects.push({type:"rage",priority:_e.important,x:t,y:n,vx:ne(-12,12),vy:ne(-45,-10),life:.45,maxLife:.45,size:ne(7,12),color:w.danger})}function Ys(e,t,n,o){e.shake.time>0&&(e.shake.time=Math.max(0,e.shake.time-t),e.shake.time<=0&&(e.shake.strength=0));for(let r of e.effects)if(r.life-=t,["meat","sludge","spark","smoke","shred","load","rage"].includes(r.type))r.x+=(r.vx||0)*t,r.y+=(r.vy||0)*t,r.vy=(r.vy||0)+150*t;else if(r.type==="flyingChick"){r.x+=r.vx*t,r.y+=r.vy*t,r.vy+=360*t,r.noDamage||gc(e,r,o);let i=r.x+e.view.x,a=r.y+e.view.y;(i<-100||a<-100||i>n.width+100||a>n.height+100)&&(r.life=0)}e.effects=e.effects.filter(r=>r.life>0);for(let r of e.floatingTexts)r.life-=t,r.y-=34*t;e.floatingTexts=e.floatingTexts.filter(r=>r.life>0)}function gc(e,t,n){t.hit||(t.hit=new Set);for(let o of n()){if(t.hit.has(o.id)||t.x<o.x||t.x>o.x+o.w||t.y<o.y||t.y>o.y+o.h)continue;t.hit.add(o.id);let r=Bs(e,o.price);Y(e,t.x,t.y-10,`-${R(r)}`,w.danger),gt(e,t.x,t.y,w.danger,30),$t(e,t.x,t.y,5,w.danger),nn(e,5,.18)}}var Qs=[[{key:"a",code:"KeyA",label:"A"},{key:"d",code:"KeyD",label:"D"}],[{key:"arrowleft",code:"ArrowLeft",label:"Left"},{key:"arrowright",code:"ArrowRight",label:"Right"}],[{key:"j",code:"KeyJ",label:"J"},{key:"l",code:"KeyL",label:"L"}],[{key:"f",code:"KeyF",label:"F"},{key:"h",code:"KeyH",label:"H"}],[{key:"q",code:"KeyQ",label:"Q"},{key:"e",code:"KeyE",label:"E"}],[{key:"z",code:"KeyZ",label:"Z"},{key:"x",code:"KeyX",label:"X"}],[{key:"u",code:"KeyU",label:"U"},{key:"o",code:"KeyO",label:"O"}],[{key:"n",code:"KeyN",label:"N"},{key:"m",code:"KeyM",label:"M"}]];function xc(e){let t=Qs[e]||Qs[0];return{left:{...t[0]},right:{...t[1]}}}function Xs(e,t,n){let o={type:"eggFarm",id:e.nextId++,col:t,row:n,level:1,nextSpawn:2,lastInterval:2,extraEggOutlet:0,price:_t.eggFarm,builtSession:e.buildSession};return o.nextSpawn=Jt(o),o.lastInterval=o.nextSpawn,o}function js(e,t,n,o){let r=o==="auto"?Te.autoScanner.price:Te.manualScanner.price,i=new Set(e.scanners.filter(c=>c.kind==="manual").map(c=>c.slot)),a=0;for(;i.has(a);)a+=1;return{type:"scanner",id:e.nextId++,kind:o,slot:o==="manual"?a:null,role:o==="manual"?a%2:0,col:t,row:n,level:1,queue:[],cooldown:0,price:r,builtSession:e.buildSession,autoMode:"standard",keys:o==="manual"?xc(a):null}}function Tc(e,t,n){let o=n.x-t.x,r=n.y-t.y,i=o*o+r*r,a=i>0?Math.max(0,Math.min(1,((e.x-t.x)*o+(e.y-t.y)*r)/i)):0,c=t.x+o*a,b=t.y+r*a;return Math.hypot(e.x-c,e.y-b)}function Ec(e){let t=[],n=e?.ownedCells?.size?[...e.ownedCells].map(o=>{let[r,i]=String(o).split(",").map(Number);return{col:r,row:i}}):Array.from({length:p.cols*p.rows},(o,r)=>({col:r%p.cols,row:Math.floor(r/p.cols)}));for(let o of n){let r=p.x+o.col*p.cell,i=p.y+o.row*p.cell,a=r+p.cell,c=i+p.cell;je(e,o.col-1,o.row)||t.push({side:"left",entry:o,a:{x:r,y:i},b:{x:r,y:c}}),je(e,o.col+1,o.row)||t.push({side:"right",entry:o,a:{x:a,y:i},b:{x:a,y:c}}),je(e,o.col,o.row-1)||t.push({side:"top",entry:o,a:{x:r,y:i},b:{x:a,y:i}}),je(e,o.col,o.row+1)||t.push({side:"bottom",entry:o,a:{x:r,y:c},b:{x:a,y:c}})}return t}function Lo(e,t=null){let n=Ec(t);if(n.length){let W=n.map(K=>({...K,distance:Tc(e,K.a,K.b)})).sort((K,G)=>K.distance-G.distance)[0];return{side:W.side,entry:{...W.entry}}}let o=(e.x-p.x)/p.cell,r=(e.y-p.y)/p.cell,i=Math.max(0,Math.min(p.cols-1,Math.round(o-.5))),a=Math.max(0,Math.min(p.rows-1,Math.round(r-.5))),c=Math.abs(e.x-p.x),b=Math.abs(e.x-(p.x+p.cols*p.cell)),M=Math.abs(e.y-p.y),C=Math.abs(e.y-(p.y+p.rows*p.cell)),$=[["left",c],["right",b],["top",M],["bottom",C]].sort((W,K)=>W[1]-K[1])[0][0];return $==="left"?{side:$,entry:{col:0,row:a}}:$==="right"?{side:$,entry:{col:p.cols-1,row:a}}:$==="top"?{side:$,entry:{col:i,row:0}}:{side:$,entry:{col:i,row:p.rows-1}}}function Mn(e){return e?.baseId||e?.id||""}function Cn(e){if(!e?.gridPlaced)return e;let t=Te[Mn(e)]||{};return e.wCells=Math.max(1,e.wCells||t.footprint?.cols||3),e.hCells=Math.max(1,e.hCells||t.footprint?.rows||3),e.x=p.x+e.col*p.cell,e.y=p.y+e.row*p.cell,e.w=e.wCells*p.cell,e.h=e.hCells*p.cell,Mn(e)==="sausageMaker"&&(e.entry={col:e.col-1,row:e.row+Math.floor(e.hCells/2)},e.side="grid"),(Mn(e)==="biomassGenerator"||Mn(e)==="coalGenerator")&&(e.entry={col:e.col-1,row:e.row+Math.floor(e.hCells/2)},e.side="grid"),e}function gn(e){if(!e?.gridPlaced)return[];let t=[];for(let n=0;n<(e.hCells||3);n+=1)for(let o=0;o<(e.wCells||3);o+=1)t.push({col:e.col+o,row:e.row+n});return t}function Pc(e,t){if(Mn(e)!=="mixer")return;let n=e.baseW||e.w||168,o=e.baseH||e.h||110;e.baseW=n,e.baseH=o;let r=t==="top"||t==="bottom";e.w=r?Math.max(n,o):Math.min(n,o),e.h=r?Math.min(n,o):Math.max(n,o)}function No(e,t="input"){if(!e)return null;let n=Mn(e);return n==="mixer"?e.side==="top"||e.side==="bottom"?t==="input"?{x:e.x+e.w/2,y:e.y}:{x:e.x+e.w/2,y:e.y+e.h}:t==="input"?{x:e.x,y:e.y+e.h/2}:{x:e.x+e.w,y:e.y+e.h/2}:n==="sausageMaker"&&e.gridPlaced?t==="input"?{x:e.x,y:e.y+e.h/2}:{x:e.x+e.w,y:e.y+e.h/2}:{x:e.x+e.w/2,y:e.y+e.h/2}}function Go(e,t,n){Pc(e,n);let o={x0:p.x+t.col*p.cell,y0:p.y+t.row*p.cell,x1:p.x+(t.col+1)*p.cell,y1:p.y+(t.row+1)*p.cell},r={x:(o.x0+o.x1)/2,y:(o.y0+o.y1)/2};return e.entry={...t},e.side=n,n==="left"?(e.x=o.x0-e.w-18,e.y=r.y-e.h/2):n==="right"?(e.x=o.x1+18,e.y=r.y-e.h/2):n==="top"?(e.x=r.x-e.w/2,e.y=o.y0-e.h-18):(e.x=r.x-e.w/2,e.y=o.y1+18),e}function Js(e,t,n,o){let{entry:r,side:i}=Lo(n,e),a=Te[t],c=a?{name:a.name,w:a.body?.w||168,h:a.body?.h||110,price:a.price}:{name:t[0].toUpperCase()+t.slice(1),w:168,h:110,price:o},b={type:"facility",id:t,name:c.name,x:0,y:0,w:c.w,h:c.h,baseW:c.w,baseH:c.h,level:1,price:o||c.price,builtSession:e.buildSession};return t==="inboundTruck"&&(b.inboundOrder={coalPerDay:0,zundaMochiPerDay:0}),Go(b,r,i)}function Zs(e,t,n,o,r){let i=Te[t],a={type:"facility",id:t,name:i?.name||t,baseId:t,col:n,row:o,wCells:i?.footprint?.cols||(t==="sausageMaker"?3:1),hCells:i?.footprint?.rows||(t==="sausageMaker"?3:1),gridPlaced:!0,level:1,price:r||i?.price||0,builtSession:e.buildSession};return(t==="biomassGenerator"||t==="coalGenerator")&&(a.fuelPulses=[]),Cn(a)}function xt(e){return e?[{col:e.col,row:e.row},{col:e.col+1,row:e.row},{col:e.col,row:e.row+1},{col:e.col+1,row:e.row+1}]:[]}function ea(e,t,n){return{type:"maintenanceRoom",id:e.nextId++,col:t,row:n,price:_t.maintenanceRoom,builtSession:e.buildSession,wCells:2,hCells:2}}function Rc(e){return Math.random()<Ms(e)?"poop":Math.random()<.5?"male":"female"}function ta(e,t){let n=Rc(e),o=(t.route||[]).map(i=>({x:i.x,y:i.y})),r=o[0];return{id:e.nextId++,sex:n,x:r.x,y:r.y,route:o,targetIndex:o.length>1?1:o.length,stage:t.stage||"belt",scannerId:t.scannerId??null,nextScannerId:null,pendingScannerId:null,radius:n==="poop"?15:17,bob:Math.random()*Math.PI*2,queueIndex:-1,queueRoute:null}}function jn(e){return e?.baseId||e?.id||""}function xn(e){if(!e)return null;let t=e.type==="scanner"?`${e.kind}Scanner`:jn(e)||e.type;return _.power.exempt.includes(t)?null:_.power.machines[t]||null}function ra(e){return _.power.generators[jn(e)]||null}function Tn(e){let t=ra(e);if(!t)return 0;let n=t.outputV||t.baseOutputV||0,o=(e.fuelPulses||[]).reduce((r,i)=>r+Math.max(0,i.voltage||0),0);return n+o}function Ic(e){return e?.gridPlaced?gn(e):[]}function Ac(e){if(!e)return[];if(e.type==="scanner")return[{col:e.col,row:e.row-1},{col:e.col+1,row:e.row-1},{col:e.col,row:e.row},{col:e.col+1,row:e.row}];if(e.type==="maintenanceRoom")return xt(e);if(e.gridPlaced){let t=jn(e),n=e.row+Math.floor((e.hCells||1)/2);return t==="sausageMaker"?[{col:e.col-1,row:n},{col:e.col+(e.wCells||3),row:n}]:[{col:e.col-1,row:n},{col:e.col+(e.wCells||1),row:n},{col:e.col+Math.floor((e.wCells||1)/2),row:e.row-1},{col:e.col+Math.floor((e.wCells||1)/2),row:e.row+(e.hCells||1)}]}return e.entry?[e.entry]:[]}function $c(e,t,n){let o=1/0;for(let r of t){for(let a of fe){let c=E(r.col+a.dc,r.row+a.dr),b=n.get(c);b!=null&&(o=Math.min(o,b))}let i=n.get(E(r.col,r.row));i!=null&&(o=Math.min(o,i))}return Number.isFinite(o)?o:null}function Fc(e,t){let n=new Map,o=[],r=(i,a)=>{a<0||a>=Tn(t)||n.has(i)&&n.get(i)<=a||(n.set(i,a),o.push({k:i,loss:a}))};for(let i of Ic(t))for(let a of fe){let c=E(i.col+a.dc,i.row+a.dr);e.powerWires?.has(c)&&r(c,_.power.wires[e.powerWires.get(c).kind]?.lossV||0)}for(;o.length;){o.sort((c,b)=>c.loss-b.loss);let i=o.shift();if(n.get(i.k)!==i.loss)continue;let a=X(i.k);for(let c of fe){let b=E(a.col+c.dc,a.row+c.dr),M=e.powerWires?.get(b);if(!M)continue;let C=_.power.wires[M.kind]?.lossV??.5;r(b,i.loss+C)}}return n}function na(e){let t=[];for(let n of Object.values(e.facilities||{}))xn(n)&&t.push(n);for(let n of e.scanners||[])xn(n)&&t.push(n);for(let n of e.maintenanceRooms||[])xn(n)&&t.push(n);return t}function ia(e){return Object.values(e.facilities||{}).filter(ra)}function Ft(e){return String(e.id??`${e.type}:${e.col},${e.row}`)}function oa(e){return e.builtSession==null?-1:e.builtSession}function _o(e){if(!e)return{dirty:!1,routes:new Map,assignments:new Map,sources:new Map,underVoltage:new Set};let t=new Map,n=ia(e).map(G=>{let z=Fc(e,G);return t.set(G.id,z),{generator:G,outputV:Tn(G),admitted:[],busVoltage:Tn(G)}}),o=[];for(let G of na(e)){let z=xn(G),Q=[];for(let ie of n){let J=$c(e,Ac(G),t.get(ie.generator.id));J!=null&&Q.push({source:ie,loss:J,openCircuit:ie.outputV-J})}Q.sort((ie,J)=>J.openCircuit-ie.openCircuit||ie.loss-J.loss||Ft(ie.source.generator).localeCompare(Ft(J.source.generator))),Q[0]&&o.push({item:G,spec:z,routes:Q})}o.sort((G,z)=>(z.spec.powerPriority||50)-(G.spec.powerPriority||50)||G.routes[0].loss-z.routes[0].loss||oa(G.item)-oa(z.item)||Ft(G.item).localeCompare(Ft(z.item)));let r=new Map,i="",a=0,c=Math.max(1,_.power.maxAssignmentPasses||8);for(let G=0;G<c;G+=1){a=G+1;for(let ie of n)ie.admitted=[],ie.busVoltage=ie.outputV;let z=new Map;for(let ie of o)for(let J of ie.routes){let ae=J.source,ye=ae.admitted.reduce((O,H)=>O+H.spec.drawV,0)+ie.spec.drawV,L=ae.outputV-ye,V=ae.admitted.every(O=>L-O.loss>=O.spec.minVoltage),se=L-J.loss>=ie.spec.minVoltage;if(!(!V||!se)){ae.admitted.push({item:ie.item,spec:ie.spec,loss:J.loss}),ae.busVoltage=L,z.set(Ft(ie.item),{sourceId:ae.generator.id,sourceName:ae.generator.name||ae.generator.shortName||ae.generator.id,sourceBusV:L,routeLossV:J.loss,receivedV:L-J.loss,minVoltage:ie.spec.minVoltage,drawV:ie.spec.drawV});break}}let Q=[...z.entries()].map(([ie,J])=>`${ie}:${J.sourceId}:${J.receivedV.toFixed(3)}`).join("|");if(r=z,Q===i)break;i=Q}let b=new Map,M=new Map;for(let G of n)M.set(G.generator.id,{outputV:G.outputV,busVoltage:G.busVoltage,admitted:G.admitted.length,stablePasses:a});for(let[G,z]of r)b.set(G,z);let C=e.power?.underVoltage||new Set,$=new Set;for(let G of na(e))r.has(Ft(G))||$.add(Ft(G));let W=e.power?.assignments||new Map,K=0;for(let[G,z]of r)W.get(G)?.sourceId!==z.sourceId&&(K+=1);return e.phase==="running"&&e.stats&&(e.stats.generatorAssignmentChanges=(e.stats.generatorAssignmentChanges||0)+K,e.totals&&(e.totals.generatorAssignmentChanges=(e.totals.generatorAssignmentChanges||0)+K)),e.power={...e.power||{},dirty:!1,routes:b,assignments:r,sources:M,underVoltage:$,previousUnder:C},e.power}function Wo(e){return(!e.power||e.power.dirty)&&_o(e),e.power}function Ye(e){e.power||(e.power={}),e.power.dirty=!0}function sa(e,t){let n=!1;for(let i of ia(e)){if(e.stats){e.stats.maxGeneratorOutput=e.stats.maxGeneratorOutput||{};let c=i.id||jn(i);e.stats.maxGeneratorOutput[c]=Math.max(e.stats.maxGeneratorOutput[c]||0,Tn(i))}if(!i.fuelPulses?.length)continue;for(let c of i.fuelPulses)c.timeLeft-=t;let a=i.fuelPulses.length;i.fuelPulses=i.fuelPulses.filter(c=>c.timeLeft>0),i.fuelPulses.length!==a&&(n=!0)}n&&Ye(e),e.power||(e.power={dirty:!0,elapsed:0}),e.power.elapsed=(e.power.elapsed||0)+t;let o=1/Math.max(1,_.power.recalcHz||10);(e.power.dirty||e.power.elapsed>=o)&&(e.power.elapsed=0,_o(e));let r=Wo(e);if(e.phase==="running"){let i=r.underVoltage?.size||0;if(i){e.stats.underVoltageSeconds=(e.stats.underVoltageSeconds||0)+i*t,e.stats.underVoltageSecondsByMachine=e.stats.underVoltageSecondsByMachine||{};for(let a of r.underVoltage)e.stats.underVoltageSecondsByMachine[a]=(e.stats.underVoltageSecondsByMachine[a]||0)+t;e.totals.underVoltageSeconds=(e.totals.underVoltageSeconds||0)+i*t}}}function nt(e,t){return xn(t)?Wo(e).assignments.has(Ft(t)):!0}function En(e,t){let n=xn(t);return n?Wo(e).assignments.get(Ft(t))||{sourceName:"None",sourceBusV:0,routeLossV:0,receivedV:0,minVoltage:n.minVoltage,drawV:n.drawV}:null}function aa(e){let t=Wo(e);return`POWER: ${[...(t.sources||new Map).entries()].map(([o,r])=>`${o} ${r.outputV.toFixed(0)}V / ${r.admitted} powered`).join(" | ")||"none"} / ${t.underVoltage?.size||0} under-voltage`}function la(e,t){let n=jn(e),o=_.power.generators[n];return!o||n==="biomassGenerator"&&!["male","female","poop"].includes(t)||n==="coalGenerator"&&t!=="coal"?!1:(e.fuelPulses=e.fuelPulses||[],e.fuelPulses.push({voltage:o.pulseVoltage,timeLeft:o.pulseSeconds}),!0)}var Ze=_.maintenance;function Zr(e,t){return Math.max(0,Number(e?.cardEffects?.[t])||0)}function Ko(e){let t=Math.min(1.4,1+.04*Math.min(10,Zr(e,"crowdedFarming"))),n=Math.pow(.95,Zr(e,"preventiveMaintenance"));return t*n}function Oc(e){return Math.pow(1.03,Zr(e,"durabilityCoating"))}function qo(e,t,n=1){let o=Ze.durability[t]||1e3;return Math.max(1,Math.ceil(o*Math.max(.1,n||1)*Oc(e)))}function ca(e){return Math.max(.1,Number(e?.durabilityBaseMultiplier)||1)}function Bc(e,t=0){if(!e)return{x:p.x+p.cell*(.5+t*.55),y:p.y+p.rows*p.cell+84};let n=p.x+e.col*p.cell+p.cell,o=p.y+e.row*p.cell+p.cell;return{x:n,y:o}}function Dc(e,t=0){let n=(e.maintenanceRooms||[])[t];return Bc(n,t)}function Be(e){e.repairman||(e.repairman={active:!1,x:p.x+p.cell*.5,y:p.y+p.rows*p.cell+84,target:null,repairedToday:0}),Array.isArray(e.maintenanceRooms)||(e.maintenanceRooms=[]),Array.isArray(e.repairmen)||(e.repairmen=[]);for(let[t,n]of e.conveyorMeta||[]){n.uses==null&&(n.uses=0),n.maintenanceType==null&&(n.maintenanceType="conveyor"),n.kind||(n.kind="conveyor"),n.speedMultiplier||(n.speedMultiplier=n.kind==="boostConveyor"?2:1),n.branchMode||(n.branchMode="random");let o=qo(e,"conveyor",ca(n));(n.durability==null||n.durability<o)&&(n.durability=o)}for(let t of e.eggFarms||[])ut(t,"eggFarm",e);for(let t of e.scanners||[])t.kind==="auto"&&ut(t,"autoScanner",e);for(let t of Object.values(e.facilities||{})){let n=Qo(t);n==="mixer"&&ut(t,"mixer",e),n==="trash"&&ut(t,"trash",e),n==="sausageMaker"&&ut(t,"sausageMaker",e),["starterGenerator","biomassGenerator","coalGenerator","inboundTruck"].includes(n)&&ut(t,n,e)}}function ut(e,t,n=null){if(!e)return;e.maintenance||(e.maintenance={}),e.maintenance.type=t,e.maintenance.uses==null&&(e.maintenance.uses=0);let o=n?qo(n,t,ca(e)):Ze.durability[t]||1e3;(e.maintenance.durability==null||e.maintenance.durability<o)&&(e.maintenance.durability=o)}function ei(e){return e?e.meta?Math.max(0,e.meta.uses||0):Math.max(0,e.maintenance?.uses||0):0}function ti(e){return e?e.meta?Math.max(1,e.meta.durability||Ze.durability.conveyor):Math.max(1,e.maintenance?.durability||Ze.durability[e.maintenance?.type]||1e3):1}function Lc(e,t){e&&(e.meta?e.meta.uses=Math.max(0,t):e.maintenance&&(e.maintenance.uses=Math.max(0,t)))}function Pn(e){return Math.max(0,Math.min(1,ei(e)/ti(e)))}function Zn(e){return Math.max(0,Math.round((1-Pn(e))*100))}function zo(e){let t=Pn(e);if(t<=Ze.fullPerformanceUntilWear)return 1;let n=(t-Ze.fullPerformanceUntilWear)/(1-Ze.fullPerformanceUntilWear);return Math.max(Ze.minimumPerformance,1-n*(1-Ze.minimumPerformance))}function Nc(e,t){let n=e.conveyorMeta?.get(t);return n?{type:"conveyor",key:t,meta:n}:null}function eo(e,t){Be(e);let n=Nc(e,t);return n?zo(n):1}function ni(e){Be(e);let t=0,n=0;for(let o of e.conveyorTiles||[])t+=eo(e,o),n+=1;return n?t/n:1}function oi(e){return 1/zo(e)}function Ho(e){return!e||e.kind!=="auto"?1:(ut(e,"autoScanner"),oi(e))}function Yo(e){return ut(e,"eggFarm"),oi(e)}function Qo(e){return e?.baseId||e?.id||e}function ri(e,t){return t?typeof t=="object"?t:e.facilities?.[t]||null:null}function ii(e,t){Be(e);let n=ri(e,t),o=Qo(n||t);return!n||!["mixer","trash","sausageMaker"].includes(o)?0:(ut(n,o),Math.max(0,oi(n)-1)*(Ze.processingDelayMaxSeconds?.[o]||1))}function ua(e,t){Be(e);let n=e.conveyorMeta?.get(t);n&&(n.uses=Math.min(n.durability||Ze.durability.conveyor,(n.uses||0)+Ko(e)),e.stats.conveyorPasses=(e.stats.conveyorPasses||0)+1)}function da(e,t){Be(e),ut(t,"eggFarm"),t.maintenance.uses=Math.min(t.maintenance.durability,(t.maintenance.uses||0)+Ko(e)),e.stats.eggProduced=(e.stats.eggProduced||0)+1}function fa(e,t){Be(e),!(!t||t.kind!=="auto")&&(ut(t,"autoScanner"),t.maintenance.uses=Math.min(t.maintenance.durability,(t.maintenance.uses||0)+Ko(e)))}function rn(e,t){Be(e);let n=ri(e,t),o=Qo(n||t);!n||!["mixer","trash","sausageMaker","starterGenerator","biomassGenerator","coalGenerator","inboundTruck"].includes(o)||(ut(n,o),n.maintenance.uses=Math.min(n.maintenance.durability,(n.maintenance.uses||0)+Ko(e)))}function Xo(e,t){let n=ri(e,t);if(!n)return 0;let o=ii(e,n);return n.processingCooldown=Math.max(n.processingCooldown||0,o),o}function pa(e,t){for(let n of Object.values(e.facilities||{}))["mixer","trash","sausageMaker"].includes(n.baseId||n.id)&&nt(e,n)&&n?.processingCooldown>0&&(n.processingCooldown=Math.max(0,n.processingCooldown-t))}function to(e){Be(e);let t=[];for(let[n,o]of e.conveyorMeta||[])t.push({type:"conveyor",key:n,meta:o,label:`${o.kind==="boostConveyor"?"Boost Belt":"Belt"} ${n}`,center:B(X(n).col,X(n).row)});for(let n of e.eggFarms||[])t.push({type:"eggFarm",ref:n,label:`EGG #${n.id}`,center:B(n.col,n.row)});for(let n of(e.scanners||[]).filter(o=>o.kind==="auto"))t.push({type:"autoScanner",ref:n,label:`AUTO #${n.id}`,center:B(n.col,n.row)});for(let n of Object.values(e.facilities||{})){let o=Qo(n);["mixer","trash","sausageMaker","starterGenerator","biomassGenerator","coalGenerator","inboundTruck"].includes(o)&&t.push({type:o,ref:n,label:`${n.shortName||n.name||o} #${n.id}`,center:{x:n.x+n.w/2,y:n.y+n.h/2}})}return t}function on(e){return e.meta?Pn(e):Pn(e.ref)}function Jn(e){return e.meta?ei(e):ei(e.ref)}function Uo(e){return e.meta?ti(e):ti(e.ref)}function ya(e,t){Lc(e.meta?e:e.ref,Math.max(0,Jn(e)-t))}function si(e){return e.type==="conveyor"?`conveyor:${e.key}`:`${e.type}:${e.ref?.id||e.ref?.type||e.type}`}function ha(e,t=.02){Be(e);let n=Math.max(0,Number(t)||0),o=0;for(let r of to(e)){let i=Jn(r);ya(r,Uo(r)*n),o+=Math.max(0,i-Jn(r))/Uo(r)*100}return o}function ba(e){Be(e);let t=e.maintenanceRooms||[];e.repairmen=t.map((o,r)=>{let i=ai(e,o),a=i?B(i.col,i.row):Dc(e,r);return{id:`room-${o.id}`,roomId:o.id,active:!0,x:a.x,y:a.y,target:null,repairedToday:0}});let n=e.repairmen[0];e.repairman.active=!!n,e.repairman.target=n?.target||null,e.repairman.repairedToday=0,n&&(e.repairman.x=n.x,e.repairman.y=n.y)}function wa(e){Be(e);for(let t of e.repairmen||[])t.active=!1,t.target=null;e.repairmen=[],e.repairman.active=!1,e.repairman.target=null}function Gc(e,t){return t&&to(e).find(o=>si(o)===t.key)||null}function _c(e){let t=null;for(let n of to(e)){if(!Vo(e,n))continue;let o=on(n);o<=.001||(!t||o>on(t))&&(t=n)}return t}function ma(e,t){Be(e);let n=e.repairmen?.length?e.repairmen:e.repairman?.active?[e.repairman]:[];if(!n.length||e.phase!=="running")return;let o=new Set(n.map(i=>i.target?.key).filter(Boolean));for(let i of n)Wc(e,i,t,o);let r=n[0];r&&e.repairman!==r&&(e.repairman.active=!0,e.repairman.x=r.x,e.repairman.y=r.y,e.repairman.target=r.target,e.repairman.repairedToday=r.repairedToday||0)}function Wc(e,t,n,o){if(!t.active)return;let r=(e.maintenanceRooms||[]).find(J=>J.id===t.roomId);if(r&&!nt(e,r))return;let i=Gc(e,t.target);if((!i||on(i)<=.001||!Vo(e,i))&&(t.target?.key&&o.delete(t.target.key),i=Uc(e,o)),!i){t.target=null;return}let a=si(i);o.add(a);let c=Vo(e,i,t);if(!c){e.stats.unreachableRepairTargets=(e.stats.unreachableRepairTargets||0)+1,e.totals.unreachableRepairTargets=(e.totals.unreachableRepairTargets||0)+1,o.delete(a),t.target=null;return}if(t.target={key:a,label:i.label,workKey:E(c.col,c.row)},zc(e,t,c),t.path?.length&&t.pathIndex<t.path.length){let J=B(t.path[t.pathIndex].col,t.path[t.pathIndex].row),ae=J.x-t.x,ye=J.y-t.y,L=Math.hypot(ae,ye);if(L>4){let V=Math.min(L,Ze.repairman.walkSpeed*n);t.x+=ae/L*V,t.y+=ye/L*V;return}t.pathIndex+=1;return}let b=Ze.repairman.walkSpeed,M=B(c.col,c.row),C=M.x-t.x,$=M.y-t.y,W=Math.hypot(C,$);if(W>8){let J=Math.min(W,b*n);t.x+=C/W*J,t.y+=$/W*J;return}let K=e?.cardEffects?.laborExploitation?.7:1,G=n/(Ze.repairman.secondsPerOnePercent*K*100),z=Jn(i),Q=G*Uo(i);ya(i,Q);let ie=Math.max(0,(z-Jn(i))/Uo(i)*100);t.repairedToday=(t.repairedToday||0)+ie,ie>0&&Math.random()<.02&&Y(e,t.x,t.y-28,"REPAIR",w.green),on(i)<=.001&&(o.delete(a),t.target=null)}function Uc(e,t=new Set){let n=null;for(let o of to(e)){if(t.has(si(o))||!Vo(e,o))continue;let r=on(o);r<=.001||(!n||r>on(n))&&(n=o)}return n||_c(e)}function Vc(e){if(e.type==="conveyor")return[X(e.key)];if(e.type==="eggFarm")return[{col:e.ref.col,row:e.ref.row}];if(e.type==="autoScanner"){let n=e.ref;return[{col:n.col,row:n.row-1},{col:n.col+1,row:n.row-1},{col:n.col,row:n.row},{col:n.col+1,row:n.row}]}let t=e.ref;if(t?.gridPlaced){let n=[];for(let o=0;o<(t.hCells||1);o+=1)for(let r=0;r<(t.wCells||1);r+=1)n.push({col:t.col+r,row:t.row+o});return n}return t?.entry?[t.entry]:[]}function Kc(e){let t=new Set;for(let n of e.eggFarms||[])t.add(E(n.col,n.row));for(let n of e.scanners||[])for(let o of[{col:n.col,row:n.row-1},{col:n.col+1,row:n.row-1},{col:n.col,row:n.row},{col:n.col+1,row:n.row}])t.add(E(o.col,o.row));for(let n of e.maintenanceRooms||[])for(let o=0;o<2;o+=1)for(let r=0;r<2;r+=1)t.add(E(n.col+r,n.row+o));for(let n of Object.values(e.facilities||{}))if(n.gridPlaced)for(let o=0;o<(n.hCells||1);o+=1)for(let r=0;r<(n.wCells||1);r+=1)t.add(E(n.col+r,n.row+o));return t}function Rn(e,t,n){if(!Re(t,n)||!e.ownedCells?.has?.(E(t,n))||e.blockedCells?.has?.(E(t,n)))return!1;let o=E(t,n);return!(Kc(e).has(o)||e.conveyorTiles?.has(o)&&!e.footbridges?.has(o))}function ai(e,t){if(!t)return{col:0,row:Math.max(0,p.rows-1)};let n=[];for(let o=0;o<2;o+=1)n.push({col:t.col+o,row:t.row-1},{col:t.col+o,row:t.row+2});for(let o=0;o<2;o+=1)n.push({col:t.col-1,row:t.row+o},{col:t.col+2,row:t.row+o});return n.find(o=>Rn(e,o.col,o.row))||null}function va(e,t,n){if(!t)return null;let o=new Set(n.map(c=>E(c.col,c.row))),r=E(t.col,t.row),i=[t],a=new Map([[r,null]]);for(;i.length;){let c=i.shift(),b=E(c.col,c.row);if(o.has(b)){let M=[],C=b;for(;C;){let $=X(C);M.push($),C=a.get(C)}return M.reverse()}for(let M of fe){let C={col:c.col+M.dc,row:c.row+M.dr},$=E(C.col,C.row);a.has($)||!Rn(e,C.col,C.row)||(a.set($,b),i.push(C))}}return null}function qc(e,t){let n=[];for(let r of Vc(t)){t.type==="conveyor"&&e.footbridges?.has(E(r.col,r.row))&&Rn(e,r.col,r.row)&&n.push(r);for(let i of fe){let a={col:r.col+i.dc,row:r.row+i.dr};Rn(e,a.col,a.row)&&n.push(a)}}let o=new Set;return n.filter(r=>{let i=E(r.col,r.row);return o.has(i)?!1:(o.add(i),!0)})}function Vo(e,t,n=null){let o=qc(e,t);if(!o.length)return null;let r=(e.maintenanceRooms||[]).find(c=>c.id===n?.roomId)||(e.maintenanceRooms||[])[0],i=n?ka(e,n,r):ai(e,r),a=va(e,i,o);return a?.[a.length-1]||null}function Sa(e,t){let n=Math.floor((e-p.x)/p.cell),o=Math.floor((t-p.y)/p.cell);return Re(n,o)?{col:n,row:o}:null}function ka(e,t,n){let o=Sa(t.x,t.y);return o&&Rn(e,o.col,o.row)?o:ai(e,n)}function zc(e,t,n){let o=E(n.col,n.row);if(t.path&&t.pathVersion===e.walkabilityVersion&&t.target?.workKey===o&&t.pathIndex<t.path.length)return;let r=(e.maintenanceRooms||[]).find(b=>b.id===t.roomId),i=ka(e,t,r);t.path=va(e,i,[n])||[];let a=Sa(t.x,t.y),c=a&&i&&a.col===i.col&&a.row===i.row&&Rn(e,a.col,a.row);t.pathIndex=c&&t.path.length>1?1:0,t.pathVersion=e.walkabilityVersion||0}function Hc(e){let t=0,n="none";for(let o of to(e)){let r=on(o);r>t&&(t=r,n=o.label)}return{ratio:t,percent:Math.round(t*100),label:n}}function li(e){let t=Hc(e),n=ni(e);return{worst:t,avgBeltPerformance:n,repairman:e.repairman||null,repairmen:e.repairmen||[],rooms:e.maintenanceRooms||[]}}var Yc=qe.commonWeight,Qc=qe.rareWeight,Xc=qe.ultraRareWeight||.45,sn=qe.baseDraftSize,An=Bi;function In(e,t){let n=Qe(e);return Math.max(0,Number(n[t])||0)}function Qe(e){e.cardEffects||(e.cardEffects={...kr});for(let[t,n]of Object.entries(kr))e.cardEffects[t]==null&&(e.cardEffects[t]=Array.isArray(n)?[]:n);return e.cardEffects.flattery!=null&&(e.cardEffects.fairiesFlatteryNext=Math.max(0,e.cardEffects.fairiesFlatteryNext||0)+Math.max(0,e.cardEffects.flattery||0),delete e.cardEffects.flattery),e.cardEffects.drawBonus!=null&&delete e.cardEffects.drawBonus,e.cardDraft||(e.cardDraft={pending:!1,choices:[],rerolls:0,picksRemaining:0}),e.cardDraft.picksRemaining==null&&(e.cardDraft.picksRemaining=e.cardDraft.pending?1:0),e.cardDraft.freeRerolls==null&&(e.cardDraft.freeRerolls=0),e.cardEffects}function Ra(e){let t=Math.max(.5,1-.05*Math.min(10,In(e,"crowdedFarming"))),n=Math.pow(.96,In(e,"hatchingFeed"));return t*n}function Ia(e,t=null){return Math.min(3,Math.max(0,Number(t?.extraEggOutlet)||0))}function Aa(e){return Math.pow(.85,In(e,"scannerQueueSpacing"))}function Vt(e,t=null){let n=Qe(e),o=wo*Math.pow(mo,Math.max(0,n.bearing||0)),r=t?Math.max(.1,Number(e?.conveyorMeta?.get?.(t)?.speedMultiplier)||1):1,i=t?1:ni(e),a=Math.max(.01,Number(e?.eventActive?.conveyorSpeedMultiplier)||1);return Math.min(yn,o*i)*r*a}function Bt(e,t=null){let n=Math.max(0,(e?.level||1)-1),o=t?In(t,"autoScannerTuning"):0,r=bo*Math.pow(Fi,n)*Math.pow(wr,o),i=Math.max(mr,r),a=t?Math.max(.01,Number(t?.eventActive?.autoScannerCooldownMultiplier)||1):1;return t?Math.max(mr,i*Ho(e)*a):i}function Ma(e){let t=e.cardDraft||{rerolls:0},n=Math.max(1,(t.rerolls||0)+1);return Math.ceil(Math.max(1,e.turn||1)/qe.rerollCost.dayDivisor*n*qe.rerollCost.multiplier)}function an(e){return An.find(t=>t.id===e)||null}function $a(e,t){let n=typeof t=="string"?an(t):t;return Qe(e),!n||!(n.type==="equipmentUpgrade"||n.type==="cellAction")?[]:dt(e,n).map(o=>({key:Ot(o),label:fi(e,o),type:o.type}))}function di(e,t,n={}){let o=typeof t=="string"?an(t):t;if(Qe(e),!o||o.type==="dud")return{ok:!1,reason:"Card not found."};if(o.id==="extraCards")return e.cardDraft=e.cardDraft||{pending:!1,choices:[],rerolls:0,picksRemaining:0},e.cardDraft.choices.push(...jo(e,2)),{ok:!0,reason:`${o.title} added 2 draft cards.`};if(o.type==="instant")return Oa(e,o),{ok:!0,reason:`${o.title} granted.`};if(o.type==="equipmentUpgrade"){let r=dt(e,o);if(!r.length)return{ok:!1,reason:`No valid target for ${o.title}.`};let i=n.targetKey&&n.targetKey!=="__auto__"?String(n.targetKey):"",a=i?r.find(c=>Ot(c)===i):r[0];return a?(Fa(e,a),{ok:!0,reason:`${o.title} applied to ${fi(e,a)}.`}):{ok:!1,reason:`Selected target is no longer valid for ${o.title}.`}}if(o.type==="cellAction"&&o.target==="blockedCell"){let r=dt(e,o);if(!r.length)return{ok:!1,reason:"No blocked cells to remove."};let i=new Set((Array.isArray(n.targetKeys)?n.targetKeys:[n.targetKey]).filter(c=>c&&c!=="__auto__").map(String)),a=i.size?r.filter(c=>i.has(Ot(c))):r.slice(0,10);if(!a.length)return{ok:!1,reason:`Selected target is no longer valid for ${o.title}.`};for(let c of a.slice(0,3)){e.blockedCells.delete(E(c.col,c.row));let b=B(c.col,c.row);ct(e,b.x,b.y),gt(e,b.x,b.y,w.danger,42),$t(e,b.x,b.y,8,w.warn)}return Ee(e),{ok:!0,reason:`${o.title} removed ${Math.min(10,a.length)} blocked cell(s).`}}return{ok:!1,reason:`${o.title} cannot be debug-granted.`}}function fi(e,t){if(t.type==="blockedCell")return`Blocked cell ${t.col},${t.row}`;if(t.type==="eggFarm")return`EGG #${t.id} L${t.level} -> L${t.level+1}`;if(t.type==="eggOutlet"){let n=Math.max(0,Number(t.farm?.extraEggOutlet)||0);return`EGG #${t.id} OUTLET ${1+n} -> ${2+n}`}if(t.type==="scanner")return`AUTO #${t.id} L${t.level} -> L${t.level+1} | CD ${Bt(t,e).toFixed(1)}s -> ${Bt({...t,level:t.level+1},e).toFixed(1)}s`;if(t.type==="facility"&&["mixer","sausageMaker"].includes(t.baseId||t.id)){let n=t.baseId||t.id,o=t.level||1,r=lt(e);t.level=o+1;let i=lt(e);return t.level=o,`${n==="mixer"?"MIXER":"SAUSAGE MACHINE"} L${t.level} -> L${t.level+1} | sausage ${R(r)} -> ${R(i)}`}if(t.type==="facility"&&(t.baseId||t.id)==="truck"){let n=t.level,o=Je(e);t.level=n+1;let r=Je(e);return t.level=n,`TRUCK L${t.level} -> L${t.level+1} | ${R(o)} -> ${R(r)}`}if(t.type==="facility"&&(t.baseId||t.id)==="trash"){let n=At(e),o=Math.min(kn(),n+1),r=It(n),i=It(o);return`SHREDDER L${t.level||1} -> L${(t.level||1)+1} | expected ${R(r)} -> ${R(i)} per poop`}return`${t.name||t.id} L${t.level||1} -> L${(t.level||1)+1}`}function jc(e){return[...e.blockedCells||[]].map(t=>{let[n,o]=String(t).split(",").map(Number);return{type:"blockedCell",id:t,col:n,row:o}}).filter(t=>Number.isFinite(t.col)&&Number.isFinite(t.row))}function dt(e,t){let n=typeof t=="string"?an(t):t;return Qe(e),n?n.target==="blockedCell"?jc(e):n.target==="eggFarm"?e.eggFarms.filter(o=>(o.level||1)<4):n.target==="eggOutlet"?e.eggFarms.filter(o=>Math.max(0,Number(o.extraEggOutlet)||0)<3).map(o=>({type:"eggOutlet",id:o.id,col:o.col,row:o.row,farm:o})):n.target==="autoScanner"?e.scanners.filter(o=>o.kind==="auto"):n.target==="mixer"?Object.values(e.facilities||{}).filter(o=>(o.baseId||o.id)==="mixer"):n.target==="truck"?Object.values(e.facilities||{}).filter(o=>(o.baseId||o.id)==="truck"):n.target==="sausageMaker"?Object.values(e.facilities||{}).filter(o=>(o.baseId||o.id)==="sausageMaker"):n.target==="trash"?Hr(e)<kn()?Object.values(e.facilities||{}).filter(o=>(o.baseId||o.id)==="trash"):[]:[]:[]}function Jc(e,t){let n=Qe(e);if(t.id==="crowdedFarming")return(n.crowdedFarming||0)>=10;if(t.id==="recyclingSubsidy")return(n.recyclingSubsidy||0)>=3;if(t.id==="dudFilter"){let o=Math.max(0,Math.min(1,qe.dudChancePerCard||0)),r=Math.max(1e-4,Math.min(1,qe.dudChanceReductionPerFilter||.05));return(n.dudFilter||0)>=Math.ceil(o/r)}return t.id==="laborExploitation"?!!n.laborExploitation:t.id==="usedMachine"?!!n.usedMachineActive:t.id==="newMachine"?!n.usedMachineActive:!1}function Zc(e){return!!((e.maintenanceRooms||[]).length||(e.repairmen||[]).length||e.repairman?.active)}function Ca(e,t){return t==="conveyor"?(e.conveyorTiles?.size||0)>0:t==="autoScanner"?(e.scanners||[]).some(n=>n.kind==="auto"):t==="manualScanner"?(e.scanners||[]).some(n=>n.kind==="manual"):t==="eggFarm"?(e.eggFarms||[]).length>0:Object.values(e.facilities||{}).some(n=>(n.baseId||n.id)===t)}function eu(e,t){return!(t.requiresFacility&&!Ca(e,t.requiresFacility)||Array.isArray(t.requiresAnyFacility)&&!t.requiresAnyFacility.some(n=>Ca(e,n)))}function tu(e){return An.filter(t=>!(t.id==="laborExploitation"&&!Zc(e)||!eu(e,t)||Jc(e,t)||(t.type==="equipmentUpgrade"||t.type==="cellAction")&&dt(e,t).length<=0))}function ga(e,t){return t.rarity==="ultraRare"?Xc:t.rarity==="rare"?Qc:Yc}function nu(e,t){let n=t.reduce((r,i)=>r+ga(e,i),0);if(n<=0)return t[Math.floor(Math.random()*t.length)];let o=Math.random()*n;for(let r of t)if(o-=ga(e,r),o<=0)return r;return t[t.length-1]}var xa=0;function ou(){return xa+=1,{id:`dud:${Date.now()}:${xa}`,title:"Dud",rarity:"dud",type:"dud",description:"Click to flick this dud away. It does not consume a pick."}}function ru(e){let t=Qe(e),n=Math.max(0,Math.min(1,qe.dudChancePerCard||0)),o=Math.max(0,Math.min(1,qe.dudChanceReductionPerFilter||0));return Math.max(0,n-o*Math.max(0,t.dudFilter||0))}function iu(e,t){let n=[...t],o=0,r=Math.max(0,qe.maxDudsPerDraft||0),i=ru(e);for(let a=0;a<n.length&&o<r;a+=1)Math.random()<i&&(n[a]=ou(),o+=1);return n}function jo(e,t=sn){Qe(e);let n=tu(e);if(!n.length)return[];let o=[],r=[...n];for(;o.length<t&&n.length;){r.length||(r=[...n]);let i=nu(e,r);o.push(i);let a=r.findIndex(c=>c.id===i.id);a>=0&&r.splice(a,1)}return iu(e,o)}function Ot(e){return e?e.type==="blockedCell"?`blockedCell:${e.id}`:e.type==="eggFarm"?`eggFarm:${e.id}`:e.type==="eggOutlet"?`eggOutlet:${e.id}`:e.type==="scanner"?`scanner:${e.id}`:e.type==="facility"?`facility:${e.id}`:`${e.type}:${e.id}`:""}function Ta(e){if(!e)return null;if(e.type==="blockedCell"){let t=B(e.col,e.row);return{x:t.x-p.cell*.48,y:t.y-p.cell*.48,w:p.cell*.96,h:p.cell*.96,cx:t.x,cy:t.y}}if(e.type==="eggFarm"||e.type==="eggOutlet"){let t=B(e.col,e.row);return{x:t.x-34,y:t.y-34,w:68,h:68,cx:t.x,cy:t.y}}if(e.type==="scanner"){let t=ge(e);return{x:t.x-48,y:t.y-48,w:96,h:96,cx:t.x,cy:t.y}}return e.type==="facility"?{x:e.x,y:e.y,w:e.w,h:e.h,cx:e.x+e.w/2,cy:e.y+e.h/2}:null}function pi(e){if(!e.cardTargetPick?.pending)return[];if(e.cardTargetPick.mode==="autoScannerMenu"){let n=new Set(e.cardTargetPick.targetKeys||[]);return e.scanners.filter(o=>o.kind==="auto"&&n.has(Ot(o))).map(o=>({key:Ot(o),label:"AUTO ROUTE SETTINGS",target:o,bounds:Ta(o)})).filter(o=>o.bounds)}let t=new Set(e.cardTargetPick.targetKeys||[]);return dt(e,e.cardTargetPick.cardId).filter(n=>t.has(Ot(n))).map(n=>({key:Ot(n),label:fi(e,n),target:n,bounds:Ta(n)})).filter(n=>n.bounds)}function su(e,t){let n=pi(e);for(let o of n){let r=o.bounds;if(t.x>=r.x&&t.x<=r.x+r.w&&t.y>=r.y&&t.y<=r.y+r.h)return o.target}return null}function Fa(e,t){if(t.type==="eggOutlet"){let n=t.farm||e.eggFarms.find(r=>r.id===t.id);if(!n)return;n.extraEggOutlet=Math.min(3,Math.max(0,Number(n.extraEggOutlet)||0)+1);let o=B(n.col,n.row);Y(e,o.x,o.y-30,`OUTLET ${1+n.extraEggOutlet}`,w.green),Ee(e);return}if(t.level=(t.level||1)+1,t.type==="eggFarm"){t.nextSpawn=Jt(t),t.lastInterval=t.nextSpawn;let n=B(t.col,t.row);Y(e,n.x,n.y-30,`LV ${t.level}`,w.green);return}if(t.type==="scanner"){let n=ge(t);Y(e,n.x,n.y-34,`LV ${t.level}`,w.green);return}t.type==="facility"&&Y(e,t.x+t.w/2,t.y+18,`LV ${t.level}`,w.green)}function Oa(e,t){let n=Qe(e),o=r=>{n[r]=Math.max(0,n[r]||0)+1};if(t.id==="bearing"&&o("bearing"),t.id==="autoScannerTuning"&&o("autoScannerTuning"),t.id==="legalWork"&&o("legalWork"),t.id==="crowdedFarming"&&(n.crowdedFarming=Math.min(10,(n.crowdedFarming||0)+1)),t.id==="hatchingFeed"&&o("hatchingFeed"),t.id==="poopRateBooster"&&o("poopRateBooster"),t.id==="safetyCover"&&o("safetyCover"),t.id==="recyclingSubsidy"&&(n.recyclingSubsidy=Math.min(3,(n.recyclingSubsidy||0)+1)),t.id==="chemicalWeaponSubsidy"&&o("chemicalWeaponSubsidy"),t.id==="preventiveMaintenance"&&o("preventiveMaintenance"),t.id==="dudFilter"&&o("dudFilter"),t.id==="durabilityCoating"&&(o("durabilityCoating"),Be(e)),t.id==="sparePartsBin"){o("sparePartsBin");let r=ha(e,.02);e.stats.sparePartsRepair=(e.stats.sparePartsRepair||0)+r,e.totals.sparePartsRepair=(e.totals.sparePartsRepair||0)+r,Y(e,p.x+p.cols*p.cell/2,p.y-30,"REPAIR +2%",w.green)}t.id==="dudRefund"&&o("dudRefund"),t.id==="freeReroll"&&o("freeReroll"),t.id==="composter"&&o("composter"),t.id==="scannerQueueSpacing"&&o("scannerQueueSpacing"),t.id==="flattery"&&o("fairiesFlatteryNext"),t.id==="usedMachine"&&(n.usedMachineActive=!0),t.id==="newMachine"&&(n.usedMachineActive=!1),t.id==="laborExploitation"&&(n.laborExploitation=1),t.id==="rescueLoan"&&(o("rescueLoanCharges"),Y(e,p.x+p.cols*p.cell/2,p.y-30,"RESCUE HELD",w.green))}function mt(e){return`${Math.round(Number(e||0)*100)}%`}function Ea(e){let t=Gt[Math.max(0,Math.min(Gt.length-1,e-1))]||Gt[0]||[0,0];return`${t[0].toFixed(2)}-${t[1].toFixed(2)}s`}function Pa(e,t){return Math.ceil(e*Math.pow(Ie.incomeUpgradeRate,Math.max(0,t-1)))}function ci(e,t,n){let r=dt(e,t==="mixer"?"upgradeMixer":t==="sausageMaker"?"upgradeSausageMaker":"upgradeTruck")[0];if(!r)return{before:Pa(n,1),after:Pa(n,2)};let i=()=>t==="truck"?Je(e):lt(e),a=i(),c=r.level||1;r.level=c+1;let b=i();return r.level=c,{before:a,after:b}}function au(e,t){let n=Qe(e);if(t.id==="upgradeEgg"){let o=dt(e,t),r=Math.min(3,Math.max(1,o[0]?.level||1));return`Choose one EGG. Level +1. Production interval ${Ea(r)} -> ${Ea(r+1)}.`}if(t.id==="upgradeAutoScanner"){let o=dt(e,t)[0]||{level:1},r=Bt(o,e),i=Bt({...o,level:(o.level||1)+1},e);return`Choose one AUTO SCANNER. Level +1. Cooldown ${r.toFixed(2)}s -> ${i.toFixed(2)}s.`}if(t.id==="upgradeMixer"){let o=ci(e,"mixer",Ie.income.sausage);return`Choose one MIXER. Meat quality +10%. Sausage sale value ${R(o.before)} -> ${R(o.after)}.`}if(t.id==="upgradeSausageMaker"){let o=ci(e,"sausageMaker",Ie.income.sausage);return`Choose one SAUSAGE MACHINE. Product value +10%. Sausage sale value ${R(o.before)} -> ${R(o.after)}.`}if(t.id==="upgradeTruck"){let o=ci(e,"truck",Ie.income.truck);return`Choose one TRUCK. Earning +10%. Correct shipment income ${R(o.before)} -> ${R(o.after)}.`}if(t.id==="upgradeTrash"){let o=At(e),r=Math.min(kn(),o+1),i=It(o),a=It(r),c=Math.round(tn(o)*100),b=Math.round(tn(r)*100);return`SHREDDER level +1. Expected value ${R(i)} -> ${R(a)} per poop; hit chance ${c}% -> ${b}%.`}if(t.id==="bearing"){let o=Math.min(yn,wo*Math.pow(mo,Math.max(0,n.bearing||0))),r=Math.min(yn,wo*Math.pow(mo,Math.max(0,(n.bearing||0)+1)));return`Conveyor speed +7.5%. After pick: ${o.toFixed(1)} -> ${r.toFixed(1)} px/s.`}if(t.id==="legalWork"){let o=Math.max(0,n.legalWork||0);return`Fairies tribute profit exemption +${R(250)}. After pick: exemption bonus ${R(250*(o+1))}.`}if(t.id==="crowdedFarming"){let o=Math.min(10,(n.crowdedFarming||0)+1);return`Held ${n.crowdedFarming||0}/10. After pick: EGG interval ${mt(Math.max(.5,1-.05*o))}, deterioration ${mt(Math.min(1.4,1+.04*o))}.`}if(t.id==="extraEggOutlet"){let o=dt(e,t),r=Math.max(0,Number(o[0]?.farm?.extraEggOutlet)||0);return`Choose one EGG. Output ports ${1+r} -> ${2+r}. Max 4 ports per EGG.`}if(t.id==="hatchingFeed")return`Held ${n.hatchingFeed||0}. After pick: EGG interval ${mt(Math.pow(.96,(n.hatchingFeed||0)+1))}, poop rate multiplier ${mt(Math.pow(1.03,(n.hatchingFeed||0)+1))}.`;if(t.id==="poopRateBooster")return`Held ${n.poopRateBooster||0}. After pick: base poop rate +${Math.round((n.poopRateBooster||0)+1)*4} percentage points.`;if(t.id==="autoScannerTuning")return`Held ${n.autoScannerTuning||0}. After pick: all AUTO SCANNER default cooldown ${mt(Math.pow(wr,(n.autoScannerTuning||0)+1))}.`;if(t.id==="safetyCover")return`Held ${n.safetyCover||0}. After pick: explosion damage ${mt(Math.pow(.95,(n.safetyCover||0)+1))}.`;if(t.id==="recyclingSubsidy")return`Held ${n.recyclingSubsidy||0}/3. After pick: normal SELL refund ${Math.round(Math.min(.8,.5+.1*((n.recyclingSubsidy||0)+1))*100)}%.`;if(t.id==="chemicalWeaponSubsidy")return`Held ${n.chemicalWeaponSubsidy||0}. After pick: ${R(1200*((n.chemicalWeaponSubsidy||0)+1))} per 70 truck-shipped poop each day.`;if(t.id==="preventiveMaintenance")return`Held ${n.preventiveMaintenance||0}. After pick: deterioration speed ${mt(Math.pow(.95,(n.preventiveMaintenance||0)+1))}.`;if(t.id==="dudFilter"){let o=Math.max(0,Math.min(1,qe.dudChancePerCard||0)),r=Math.max(0,Math.min(1,qe.dudChanceReductionPerFilter||.05)),i=Math.max(0,n.dudFilter||0),a=Math.max(0,o-r*i),c=Math.max(0,o-r*(i+1));return`Held ${i}. DUD chance per card ${mt(a)} -> ${mt(c)}.`}return t.id==="durabilityCoating"?`Held ${n.durabilityCoating||0}. After pick: maximum durability ${mt(Math.pow(1.03,(n.durabilityCoating||0)+1))}.`:t.id==="sparePartsBin"?`Held ${n.sparePartsBin||0}. Immediately restores 2% durability to every maintained machine. Common card weight.`:t.id==="dudRefund"?`Held ${n.dudRefund||0}. After pick: DUD clicks award ${R(50*((n.dudRefund||0)+1))}.`:t.id==="freeReroll"?`Held ${n.freeReroll||0}. After pick: each card screen starts with ${(n.freeReroll||0)+1} free reroll${(n.freeReroll||0)+1===1?"":"s"}.`:t.id==="composter"?`Held ${n.composter||0}. After pick: SHREDDER poop grants ${R(3*((n.composter||0)+1))}.`:t.id==="scannerQueueSpacing"?`Held ${n.scannerQueueSpacing||0}. After pick: Manual/Auto Scanner queue spacing ${mt(Math.pow(.85,(n.scannerQueueSpacing||0)+1))}.`:t.id==="flattery"?`Next Fairies tribute -50%. Held for next tribute: ${n.fairiesFlatteryNext||0}.`:t.id==="usedMachine"?"Enable Used Machines: future equipment costs 50%, has no SELL refund, and starts with 60% durability.":t.id==="newMachine"?"Cancel Used Machines. Future equipment returns to normal price, refund, and durability.":t.id==="laborExploitation"?"Repairman dispatch paperwork is streamlined. Repair rooms keep operating; one time only.":t.id==="rescueLoan"?`At day-end bankruptcy check, gain ${R(500)} if cash is below ${R(0)}. Held: ${n.rescueLoanCharges||0}.`:t.id==="dynamite"?"Choose any blocked tiles on the map and destroy up to 3. Empty-space clicks are ignored; press Esc to finish after at least one blast.":t.description}function ui(e,t){let n=e.cardDraft?.choices||[],o=n.findIndex(r=>r.id===t.id);o>=0&&n.splice(o,1)}function Ba({game:e,ui:t,onUpdatePanels:n}){function o(){n&&n()}function r(){Qe(e),e.cardTargetPick=null,e.cardDraft={pending:!0,choices:jo(e,sn),rerolls:0,freeRerolls:In(e,"freeReroll"),picksRemaining:1}}function i(){Qe(e),e.cardDraft.pending=!1,e.cardDraft.choices=[],e.cardDraft.picksRemaining=0,e.cardTargetPick=null,t.modal.classList.remove("visible","equipment-popover"),o()}function a(L=sn){Qe(e),e.cardDraft.choices=jo(e,L)}function c(){Qe(e),!e.cardDraft.choices.length&&e.cardDraft.picksRemaining>0&&a(sn)}function b(L){ui(e,L),e.cardDraft.picksRemaining=Math.max(0,(e.cardDraft.picksRemaining||1)-1),e.cardTargetPick=null,c(),e.cardDraft.picksRemaining<=0?i():ye()}function M(L){ui(e,L),e.cardDraft.picksRemaining=Math.max(0,(e.cardDraft.picksRemaining||1)-1)+qe.extraCardsAddedPicks,e.cardDraft.choices.push(...jo(e,2)),ye()}function C(L,V){let se=In(e,"dudRefund")*50;if(se>0){let O=tt(e,se);e.stats.dudRefundIncome=(e.stats.dudRefundIncome||0)+O,e.totals.dudRefundIncome=(e.totals.dudRefundIncome||0)+O,Y(e,p.x+p.cols*p.cell/2,p.y-30,`DUD REFUND +${R(O)}`,w.green)}nn(e,34,.62),document.body?.animate&&document.body.animate([{transform:"translate(0, 0)"},{transform:"translate(-10px, 7px)"},{transform:"translate(12px, -8px)"},{transform:"translate(-8px, -5px)"},{transform:"translate(9px, 6px)"},{transform:"translate(0, 0)"}],{duration:260,easing:"steps(5, end)"}),V&&(V.style.setProperty("--fling-x",`${260+Math.random()*260}px`),V.style.setProperty("--fling-y",`${-260-Math.random()*170}px`),V.style.setProperty("--fling-r",`${(Math.random()<.5?-1:1)*(52+Math.random()*38)}deg`),V.classList.add("flung")),window.setTimeout(()=>{ui(e,L),c(),ye()},340)}function $(L,V=null){if(L.type==="dud")return C(L,V);if(L.id==="extraCards")return M(L);if(L.type==="equipmentUpgrade"||L.type==="cellAction")return W(L);Oa(e,L),b(L)}function W(L){let V=dt(e,L);V.length&&(e.cardTargetPick={pending:!0,cardId:L.id,mode:L.target==="blockedCell"?"blockedCell":"equipment",targetKeys:V.map(Ot),remaining:L.id==="dynamite"?Math.min(10,V.length):1,used:0},t.modal.classList.remove("visible","equipment-popover"),o())}function K(L){if(!L||L.type!=="blockedCell")return!1;let V=E(L.col,L.row);if(!e.blockedCells?.has(V))return!1;e.blockedCells.delete(V);let se=B(L.col,L.row);return ct(e,se.x,se.y),gt(e,se.x,se.y,w.danger,62),$t(e,se.x,se.y,18,w.warn),Do(e,se.x,se.y,8),nn(e,16,.35),Y(e,se.x,se.y-18,"BOOM",w.danger),Ee(e),e.cardTargetPick.remaining=Math.max(0,(e.cardTargetPick.remaining||1)-1),e.cardTargetPick.used=Math.max(0,e.cardTargetPick.used||0)+1,e.cardTargetPick.targetKeys=dt(e,"dynamite").map(Ot),o(),!0}function G(L){if(!e.cardTargetPick?.pending)return!1;let V=an(e.cardTargetPick.cardId),se=su(e,L);return V?V.id==="dynamite"?(!se||!K(se)||((e.cardTargetPick.remaining||0)<=0||!dt(e,"dynamite").length)&&b(V),!0):se?(Fa(e,se),b(V),!0):(z(),!0):(z(),!0)}function z(){if(!e.cardTargetPick?.pending)return;let L=e.cardTargetPick,V=an(L.cardId);if(V?.id==="dynamite"&&(L.used||0)>0){b(V);return}e.cardTargetPick=null,ye()}function Q(){let L=Math.max(0,e.cardDraft?.freeRerolls||0);if(L>0){e.cardDraft.freeRerolls=L-1,e.cardDraft.rerolls+=1,a(sn),ye();return}let V=Ma(e);e.cash<V||(Mt(e,V),e.stats.cardRerollCost=(e.stats.cardRerollCost||0)+V,e.totals.cardRerollCost=(e.totals.cardRerollCost||0)+V,e.cardDraft.rerolls+=1,a(sn),ye())}function ie(L){let V=new Set(L.tags||[]),se={eggFarm:{type:"image",src:"./assets/dark_factory/facilities/machines/egg_farm_16.png?v=dark_factory",alt:"EGG"},eggOutlet:{type:"image",src:"./assets/dark_factory/facilities/machines/egg_farm_16.png?v=dark_factory",alt:"EGG"},autoScanner:{type:"image",src:"./assets/dark_factory/facilities/machines/auto_scanner_32x48.png",alt:"SCAN"},mixer:{type:"image",src:"./assets/dark_factory/facilities/machines/mixer_32.png",alt:"MIX"},truck:{type:"image",src:"./assets/dark_factory/facilities/vehicles/truck_32.png",alt:"TRUCK"},trash:{type:"image",src:"./assets/dark_factory/facilities/machines/shredder_32.png",alt:"SHR"},sausageMaker:{type:"glyph",text:"S"},blockedCell:{type:"image",src:"./assets/dark_factory/facilities/utility/obstacle_crate_16.png",alt:"BLOCK"}};return se[L.target]?se[L.target]:L.id==="bearing"||V.has("CONVEYOR")?{type:"image",src:"./assets/dark_factory/facilities/conveyor/conveyor_straight_h_16.png",alt:"BELT"}:V.has("SCANNER")?{type:"image",src:"./assets/dark_factory/facilities/machines/auto_scanner_32x48.png",alt:"SCAN"}:V.has("EGG")?{type:"image",src:"./assets/dark_factory/facilities/machines/egg_farm_16.png?v=dark_factory",alt:"EGG"}:V.has("POOP")?{type:"image",src:"./assets/images/poop.png",alt:"POOP"}:V.has("MAINTENANCE")?{type:"image",src:"./assets/dark_factory/facilities/utility/repairman_16.png",alt:"FIX"}:V.has("CARD")?{type:"image",src:"./assets/dark_factory/facilities/utility/maintenance_room_32.png",alt:"CARD"}:V.has("ECONOMY")?{type:"image",src:"./assets/dark_factory/facilities/vehicles/truck_32.png",alt:"YEN"}:V.has("RISK")?{type:"glyph",text:"!"}:{type:"glyph",text:"*"}}function J(L){let V=ie(L);return V.type==="image"?`<div class="card-badge-icon image"><img src="${V.src}" alt="${V.alt||""}" /></div><div class="card-icon image" aria-hidden="true"><img src="${V.src}" alt="" /></div>`:`<div class="card-badge-icon glyph" aria-hidden="true">${V.text||"*"}</div><div class="card-icon glyph" aria-hidden="true">${V.text||"*"}</div>`}function ae(L,V){let se=document.createElement("button");se.type="button";let O=L.type==="dud"?"dud":L.rarity==="ultraRare"?"ultra-rare":L.rarity==="rare"?"rare":"common";se.className=`card-choice ${O}`;let H=L.type==="dud"?"MISS":L.rarity==="ultraRare"?"ULTRA RARE":L.rarity==="rare"?"RARE":"COMMON",oe=[H,...(L.tags||[]).filter(ue=>ue!==H)].slice(0,5);return se.innerHTML=`${J(L)}<div class="card-copy"><strong>${L.title}</strong><div class="card-tags">${oe.map(ue=>`<span>${ue}</span>`).join("")}</div><small>${au(e,L)}</small></div>`,se.addEventListener("click",()=>$(L,se)),se.dataset.index=String(V),se}function ye(){Qe(e),e.cardTargetPick=null,e.cardDraft?.pending||r(),e.cardDraft.choices?.length||a(sn);let L=e.cardDraft.choices||[],V=Ma(e),se=Math.max(0,e.cardDraft?.freeRerolls||0),O=Math.max(1,e.cardDraft.picksRemaining||1);t.modalTitle.textContent="Choose Upgrade Card",t.modalBody.innerHTML=`<p class="muted-card-note">Choose ${O} card${O===1?"":"s"} before Build phase. Dud cards can be flicked away without consuming a pick. Equipment cards target machines; Dynamite targets blocked cells.</p><div id="cardChoices" class="card-choices"></div>`;let H=t.modalBody.querySelector("#cardChoices");L.forEach((Ve,xe)=>H.appendChild(ae(Ve,xe))),t.modalActions.innerHTML="";let oe=document.createElement("button");oe.type="button",oe.className="facility-action warn reroll-button",oe.textContent=se>0?`Reroll (FREE x${se})`:`Reroll ${R(V)}`,oe.disabled=se<=0&&e.cash<V,oe.title=se>0?`${se} free reroll${se===1?"":"s"} remaining.`:oe.disabled?"Not enough cash":"",oe.addEventListener("click",Q),t.modalActions.appendChild(oe);let ue=document.createElement("button");ue.type="button",ue.className="facility-action",ue.textContent="No Card",ue.title="Skip this upgrade pick and enter Build phase.",ue.addEventListener("click",i),t.modalActions.appendChild(ue),t.modal.classList.remove("equipment-popover"),t.modal.classList.add("visible")}return{prepareDraft:r,showDraft:ye,finishDraft:i,chooseTargetAtPoint:G,cancelTargetPick:z}}var lu=!0,cu={chickMale:"./assets/images/chick_male.png",chickFemale:"./assets/images/chick_female.png",poop:"./assets/images/poop.png",conveyorStraightH:"./assets/dark_factory/facilities/conveyor/conveyor_straight_h_16.png",conveyorStraightV:"./assets/dark_factory/facilities/conveyor/conveyor_straight_v_16.png",conveyorTurnNe:"./assets/dark_factory/facilities/conveyor/conveyor_turn_ne_16.png",conveyorTurnNw:"./assets/dark_factory/facilities/conveyor/conveyor_turn_nw_16.png",conveyorTurnSe:"./assets/dark_factory/facilities/conveyor/conveyor_turn_se_16.png",conveyorTurnSw:"./assets/dark_factory/facilities/conveyor/conveyor_turn_sw_16.png",boostConveyorStraightH:"./assets/dark_factory/facilities/conveyor/boost_conveyor_straight_h_16.png",boostConveyorStraightV:"./assets/dark_factory/facilities/conveyor/boost_conveyor_straight_v_16.png",boostConveyorTurnNe:"./assets/dark_factory/facilities/conveyor/boost_conveyor_turn_ne_16.png",boostConveyorTurnNw:"./assets/dark_factory/facilities/conveyor/boost_conveyor_turn_nw_16.png",boostConveyorTurnSe:"./assets/dark_factory/facilities/conveyor/boost_conveyor_turn_se_16.png",boostConveyorTurnSw:"./assets/dark_factory/facilities/conveyor/boost_conveyor_turn_sw_16.png",scannerManual:"./assets/dark_factory/facilities/machines/manual_scanner_32x48.png",scannerAuto:"./assets/dark_factory/facilities/machines/auto_scanner_32x48.png",eggFarm:"./assets/dark_factory/facilities/machines/egg_farm_16.png",mixer:"./assets/dark_factory/facilities/machines/mixer_32.png",shredder:"./assets/dark_factory/facilities/machines/shredder_32.png",truck:"./assets/dark_factory/facilities/vehicles/truck_32.png",maintenanceRoom:"./assets/dark_factory/facilities/utility/maintenance_room_32.png",repairman:"./assets/dark_factory/facilities/utility/repairman_16.png",obstacleCrate:"./assets/dark_factory/facilities/utility/obstacle_crate_16.png"},De={};for(let[e,t]of Object.entries(cu)){let n=new Image;n.loaded=!1,n.onerror=()=>{n.loaded=!1},lu&&t&&(n.onload=()=>{n.loaded=!0},n.src=t),De[e]=n}function bi(e){return e.frameCache||(e.frameCache={}),e.frameCache.draw||(e.frameCache.draw={}),e.frameCache.draw}function wi(e,t){let n=document.createElement("canvas");return n.width=Math.max(1,Math.ceil(e)),n.height=Math.max(1,Math.ceil(t)),n}function Ga(e,t,n,o){e.__gameRef=n,e.imageSmoothingEnabled=!1,e.clearRect(0,0,t.width,t.height),hu(e,t,n),e.save();let r=n.shake.time>0?ne(-n.shake.strength,n.shake.strength):0,i=n.shake.time>0?ne(-n.shake.strength,n.shake.strength):0,a=n.view?.scale||1;e.translate((n.view?.x||0)+r,(n.view?.y||0)+i),e.scale(a,a),vu(e,n),Su(e,n),Tu(e,n),Eu(e,n),Pu(e,n),Nu(e,n),Yu(e,n),Qu(e,n),Gu(e,n),Wu(e,n),du(e,n),od(e,n,o.activeQueuedChick),yd(e,n),ud(e,t,n),cd(e,n,o.selectedObject,o.selectedTitle),dd(e,n),fd(e,n),pd(e,n),e.restore(),bd(e,n,t)}function uu(e){if(e.type==="eggFarm"){let n=B(e.ref.col,e.ref.row);return{x:n.x-34,y:n.y-34,w:68,h:68,cx:n.x,cy:n.y}}let t=e.ref;return{x:t.x,y:t.y,w:t.w,h:t.h,cx:t.x+t.w/2,cy:t.y+t.h/2}}function du(e,t){if(t.phase!=="build")return;let n=vn(t);for(let o of n){let r=uu(o);e.save(),e.fillStyle="rgba(196,36,36,.22)",e.strokeStyle=w.danger,e.lineWidth=5,e.setLineDash([10,6]),ee(e,r.x,r.y,r.w,r.h,!0,!0),e.setLineDash([]),e.fillStyle=w.danger,e.strokeStyle=w.white,e.lineWidth=4,e.font="900 16px ui-monospace, monospace",e.textAlign="center",e.strokeText("!",r.cx,r.y+24),e.fillText("!",r.cx,r.y+24),e.font="900 11px ui-monospace, monospace",e.strokeText("NO ROUTE",r.cx,r.y+r.h-8),e.fillText("NO ROUTE",r.cx,r.y+r.h-8),e.restore()}}function ee(e,t,n,o,r,i=!0,a=!0){e.beginPath(),e.rect(t,n,o,r),i&&e.fill(),a&&e.stroke()}function oo(e,t,n,o,r=w.ink){e.save(),e.font="900 12px ui-monospace, monospace",e.textAlign="center",e.lineWidth=4,e.strokeStyle=w.white,e.fillStyle=r,e.strokeText(o,t,n),e.fillText(o,t,n),e.restore()}function ln(e,t,n,o,r,i){if(!t?.loaded)return!1;let a=e.imageSmoothingEnabled;return e.imageSmoothingEnabled=!1,e.drawImage(t,Math.round(n),Math.round(o),Math.round(r),Math.round(i)),e.imageSmoothingEnabled=a,!0}function fu(e,t,n,o,r,i,a=null,c=1){e.fillStyle=i,e.fillRect(Math.round(t),Math.round(n),Math.round(o),Math.round(r)),a&&(e.strokeStyle=a,e.lineWidth=c,e.strokeRect(Math.round(t)+.5,Math.round(n)+.5,Math.round(o)-1,Math.round(r)-1))}function pu(e,t){let n=(Math.imul(e+37,73856093)^Math.imul(t+71,19349663))>>>0;return n^=n>>>13,n>>>0}function yu(e,t,n,o,r){let i=pu(o,r);if(i%67!==0)return;let a=10+(i>>>4)%Math.max(1,p.cell-22),c=10+(i>>>9)%Math.max(1,p.cell-22),b=(i>>>14)%16*Math.PI/16;e.save(),e.globalAlpha=.38,e.fillStyle="#4a8d37",e.strokeStyle="rgba(30,66,27,.34)",e.lineWidth=1,e.beginPath();for(let C=0;C<8;C+=1){let $=b+C*Math.PI/4,W=3.5+(i>>>C+2&3),K=t+a+Math.cos($)*W*1.35,G=n+c+Math.sin($)*W*.75;C===0?e.moveTo(K,G):e.lineTo(K,G)}e.closePath(),e.fill(),e.stroke();let M=4+(i>>>24)%5;for(let C=0;C<M;C+=1){let $=b+C*2.17+(i>>>C+8&3)*.18,W=10+(i>>>C+11&10),K=.9+(i>>>C+17&3)*.35;e.beginPath(),e.arc(t+a+Math.cos($)*W,n+c+Math.sin($)*W*.72,K,0,Math.PI*2),e.fill()}e.fillStyle="rgba(151,218,101,.26)",e.beginPath(),e.arc(t+a-2,n+c-2,1.7,0,Math.PI*2),e.fill(),e.restore()}function Da(e,t){e.fillStyle=w.bg,e.fillRect(0,0,t.width,t.height),e.save(),e.globalAlpha=.85;for(let n=0;n<t.height;n+=16)for(let o=0;o<t.width;o+=16){let r=(o/16+n/16|0)%2===0;e.fillStyle=r?"#181b20":"#20242b",e.fillRect(o,n,16,16)}e.strokeStyle="rgba(255,184,39,.08)",e.lineWidth=1;for(let n=0;n<t.width;n+=64)e.beginPath(),e.moveTo(n,0),e.lineTo(n,t.height),e.stroke();for(let n=0;n<t.height;n+=64)e.beginPath(),e.moveTo(0,n),e.lineTo(t.width,n),e.stroke();e.restore()}function hu(e,t,n=null){let o=n?bi(n):null,r=`${t.width}x${t.height}`;if(!o)return Da(e,t);if(!o.background||o.background.signature!==r){let i=wi(t.width,t.height);Da(i.getContext("2d"),i),o.background={signature:r,layer:i}}e.drawImage(o.background.layer,0,0)}function _a(e){if(e.ownedCells?.size)return[...e.ownedCells];let t=[];for(let n=0;n<p.rows;n+=1)for(let o=0;o<p.cols;o+=1)t.push(E(o,n));return t}function bu(e,t){e.save();let n=_a(t);for(let o of n){let r=X(o),i=B(r.col,r.row),a=i.x-p.cell/2,c=i.y-p.cell/2,b=(r.col+r.row)%2===0?"#59616d":"#505965";fu(e,a,c,p.cell,p.cell,b,"rgba(190,199,210,.28)",1),e.fillStyle="rgba(255,255,255,.055)",e.fillRect(Math.round(a+2),Math.round(c+2),Math.round(p.cell-4),2),e.fillStyle="rgba(0,0,0,.18)",e.fillRect(Math.round(a+1),Math.round(c+p.cell-3),Math.round(p.cell-2),2),yu(e,a,c,r.col,r.row)}e.strokeStyle="rgba(255,184,39,.32)",e.lineWidth=3;for(let o of n){let r=X(o),i=B(r.col,r.row),a=i.x-p.cell/2,c=i.y-p.cell/2;je(t,r.col-1,r.row)||(e.beginPath(),e.moveTo(a,c),e.lineTo(a,c+p.cell),e.stroke()),je(t,r.col+1,r.row)||(e.beginPath(),e.moveTo(a+p.cell,c),e.lineTo(a+p.cell,c+p.cell),e.stroke()),je(t,r.col,r.row-1)||(e.beginPath(),e.moveTo(a,c),e.lineTo(a+p.cell,c),e.stroke()),je(t,r.col,r.row+1)||(e.beginPath(),e.moveTo(a,c+p.cell),e.lineTo(a+p.cell,c+p.cell),e.stroke())}for(let o of t.blockedCells||[]){let r=X(o);if(!je(t,r.col,r.row))continue;let i=B(r.col,r.row),a=i.x-p.cell/2,c=i.y-p.cell/2;e.save(),e.beginPath(),e.rect(Math.round(a+1),Math.round(c+1),p.cell-2,p.cell-2),e.clip(),e.fillStyle="rgba(124,82,36,.36)",e.fillRect(Math.round(a),Math.round(c),p.cell,p.cell),e.lineWidth=6,e.strokeStyle="rgba(255,199,73,.72)";for(let b=-p.cell;b<p.cell*2;b+=14)e.beginPath(),e.moveTo(a+b,c+p.cell),e.lineTo(a+b+p.cell,c),e.stroke();e.strokeStyle="rgba(18,20,24,.58)";for(let b=-p.cell+7;b<p.cell*2;b+=14)e.beginPath(),e.moveTo(a+b,c+p.cell),e.lineTo(a+b+p.cell,c),e.stroke();e.restore(),e.strokeStyle="rgba(255,213,91,.86)",e.lineWidth=2,e.strokeRect(Math.round(a)+1.5,Math.round(c)+1.5,p.cell-3,p.cell-3),e.strokeStyle="rgba(20,23,26,.82)",e.lineWidth=1,e.strokeRect(Math.round(a)+5.5,Math.round(c)+5.5,p.cell-11,p.cell-11)}e.restore()}function wu(e){let t=e.ownedCells?.size?[...e.ownedCells].sort().join("|"):`default:${p.cols}x${p.rows}`,n=[...e.blockedCells||[]].sort().join("|");return`${p.x},${p.y},${p.cols},${p.rows};${t};${n}`}function mu(e){let t=_a(e).map(X);for(let a of e.blockedCells||[])t.push(X(a));if(!t.length)return{x:0,y:0,w:1,h:1};let n=Math.min(...t.map(a=>a.col)),o=Math.max(...t.map(a=>a.col)),r=Math.min(...t.map(a=>a.row)),i=Math.max(...t.map(a=>a.row));return{x:p.x+n*p.cell-6,y:p.y+r*p.cell-6,w:(o-n+1)*p.cell+12,h:(i-r+1)*p.cell+12}}function vu(e,t){let n=bi(t),o=wu(t);if(!n.grid||n.grid.signature!==o){let a=mu(t),c=wi(a.w,a.h),b=c.getContext("2d");b.translate(-a.x,-a.y),bu(b,t),n.grid={signature:o,bounds:a,layer:c}}let{bounds:r,layer:i}=n.grid;e.drawImage(i,r.x,r.y)}function Su(e,t){if(t.phase!=="build"||t.cardDraft?.pending||t.cardTargetPick?.pending)return;let n=Co(t),o=t.cash>=n,r=i=>{let a=Et(i);return Object.values(t.facilities||{}).some(c=>{let b=c?.baseId||c?.id;return["mixer","trash","truck"].includes(b)?!(a.x+a.w<=c.x||c.x+c.w<=a.x||a.y+a.h<=c.y||c.y+c.h<=a.y):!1})};for(let i of jt(t)){let a=r(i),c=Et(i);e.save(),e.fillStyle=a?"rgba(112,130,118,.34)":o?"rgba(118,226,142,.36)":"rgba(255,255,255,.18)",e.strokeStyle=a?"#708278":o?"#6bd579":w.muted,e.lineWidth=5,e.setLineDash([16,10]),ee(e,c.x,c.y,c.w,c.h,!0,!0),e.setLineDash([]);let b=Tr(i),M=b.cx,C=b.cy;e.fillStyle="rgba(255,255,255,.94)",e.strokeStyle=w.ink,e.lineWidth=4,ee(e,b.x,b.y,b.w,b.h,!0,!0),e.fillStyle=a?"#7c9285":o?w.green:w.danger,e.font="900 16px ui-monospace, monospace",e.textAlign="center";let $=i.direction==="left"?"BUY LEFT LOT":i.direction==="right"?"BUY RIGHT LOT":i.direction==="down"?"BUY LOWER LOT":"BUY UPPER LOT";e.fillText($,M,C-12),e.fillStyle=w.ink,e.font="900 16px ui-monospace, monospace",e.fillText(`${R(n)} / 10\xD710`,M,C+15),e.restore()}}function Dt(e,t,n,o,r,i,a=0){let c=Pn(i);c<.5||(e.save(),e.globalAlpha=Math.min(.62,.12+c*.54),e.fillStyle="#6b4a23",a>0?(e.beginPath(),e.roundRect?.(t,n,o,r,a),e.roundRect?e.fill():ee(e,t,n,o,r,!0,!1)):ee(e,t,n,o,r,!0,!1),e.globalAlpha=Math.min(.9,.25+c*.6),e.strokeStyle="#3a2a16",e.lineWidth=Math.max(2,Math.floor(2+c*5)),e.setLineDash([5,6]),ee(e,t+3,n+3,o-6,r-6,!1,!0),e.restore())}function yi(e,t){let n=e.componentLookup?.get(t);return(n?e.congestion.get(n):null)?.ratio||0}function ku(e,t,n={}){let o=ro(e,t).sort(),i=n.kind==="boostConveyor"?"boostConveyor":"conveyor",a=c=>o.includes(c);if(o.length===2){if(a("left")&&a("right"))return De[`${i}StraightH`];if(a("up")&&a("down"))return De[`${i}StraightV`];if(a("up")&&a("right"))return De[`${i}TurnNe`];if(a("up")&&a("left"))return De[`${i}TurnNw`];if(a("down")&&a("right"))return De[`${i}TurnSe`];if(a("down")&&a("left"))return De[`${i}TurnSw`]}return o.length===1?a("up")||a("down")?De[`${i}StraightV`]:De[`${i}StraightH`]:a("up")||a("down")?De[`${i}StraightV`]:De[`${i}StraightH`]}function Mu(e){let t=Object.entries(De).filter(([o])=>o.includes("conveyor")||o.includes("Conveyor")).map(([o,r])=>`${o}:${r.loaded?1:0}`).join("|"),n=[...e.conveyorTiles].sort().map(o=>{let r=e.conveyorMeta.get(o)||{};return`${o}:${r.kind||""}:${r.dir||""}:${(r.outDirs||[]).join(",")}:${r.branchMode||""}`}).join("|");return`${e.routingVersion||0};${t};${n}`}function Cu(e){if(!e.conveyorTiles?.size)return{x:0,y:0,w:1,h:1};let t=[...e.conveyorTiles].map(X),n=Math.min(...t.map(a=>a.col)),o=Math.max(...t.map(a=>a.col)),r=Math.min(...t.map(a=>a.row)),i=Math.max(...t.map(a=>a.row));return{x:p.x+n*p.cell-36,y:p.y+r*p.cell-36,w:(o-n+1)*p.cell+72,h:(i-r+1)*p.cell+72}}function gu(e){let t=[],n=new Set;for(let i of e.conveyorTiles){let{col:a,row:c}=X(i);for(let b of fe){let M={col:a+b.dc,row:c+b.dr},C=E(M.col,M.row);if(!e.conveyorTiles.has(C))continue;let $=[i,C].sort().join("|");n.has($)||(n.add($),t.push({fromKey:i,toKey:C,a:B(a,c),b:B(M.col,M.row)}))}}let o=Bu(e),r=[...e.conveyorTiles].map(i=>{let a=X(i),c=B(a.col,a.row),b=e.conveyorMeta.get(i)||{},M=ro(e,i);return{k:i,c,meta:b,connectedDirs:M,branchDirs:Au(e,i,M),markers:o.get(i)||[],sprite:ku(e,i,b)}});return{edges:t,tiles:r}}function xu(e,t){e.save(),e.lineCap="round",e.lineJoin="round";for(let n of[{width:31,color:"#0b0c0f",alpha:1},{width:23,color:"#444b56",alpha:1},{width:15,color:"#171a1f",alpha:1}]){e.globalAlpha=n.alpha,e.strokeStyle=n.color,e.lineWidth=n.width;for(let o of t.edges)e.beginPath(),e.moveTo(o.a.x,o.a.y),e.lineTo(o.b.x,o.b.y),e.stroke()}e.globalAlpha=1;for(let n of t.tiles){let{c:o,meta:r,sprite:i}=n;e.fillStyle="rgba(0,0,0,.35)",e.strokeStyle="rgba(255,184,39,.34)",e.lineWidth=1,ee(e,o.x-20,o.y-20,40,40,!0,!0),ln(e,i,o.x-19,o.y-19,38,38)||(e.fillStyle=r.kind==="boostConveyor"?"#315e92":"#454b55",e.strokeStyle=w.ink,e.lineWidth=2,ee(e,o.x-18,o.y-18,36,36,!0,!0))}e.restore()}function Tu(e,t){let n=bi(t),o=Mu(t);if(!n.conveyors||n.conveyors.signature!==o){let c=gu(t),b=Cu(t),M=wi(b.w,b.h),C=M.getContext("2d");C.translate(-b.x,-b.y),xu(C,c),n.conveyors={signature:o,bounds:b,layer:M,data:c}}let{bounds:r,layer:i,data:a}=n.conveyors;e.drawImage(i,r.x,r.y),e.save(),e.lineCap="round",e.lineJoin="round";for(let c of a.edges){let b=Math.max(yi(t,c.fromKey),yi(t,c.toKey)),M=Math.max(0,(b-.5)/.5);e.strokeStyle=qn(w.green,w.danger,M),e.globalAlpha=b>.5?.35+M*.55:.8,e.lineWidth=6,e.beginPath(),e.moveTo(c.a.x,c.a.y),e.lineTo(c.b.x,c.b.y),e.stroke()}e.globalAlpha=1;for(let c of a.tiles){let{k:b,c:M,meta:C}=c,$=yi(t,b);$>.5&&(e.fillStyle="rgba(196,36,36,.28)",e.strokeStyle=w.danger,e.lineWidth=3,ee(e,M.x-20,M.y-20,40,40,!0,!0)),Ru(e,t,M,b,C,$),Dt(e,M.x-18,M.y-18,36,36,{meta:C}),ft(e,t,"conveyor",b,M.x,M.y,38,38),Du(e,M,c.markers),Fu(e,M,C,c.branchDirs,c.connectedDirs),$>.5&&oo(e,M.x,M.y-15,`${Math.floor($*100)}%`,w.danger)}e.restore()}function Eu(e,t){if(t.powerWires?.size){e.save();for(let[n,o]of t.powerWires){let r=X(n),i=B(r.col,r.row),a=o.kind==="insulatedPowerWire";e.globalAlpha=t.powerOverlay||t.phase==="build"?.95:.32,e.strokeStyle=a?"#d7eef7":"#1e252b",e.lineWidth=a?8:5,e.lineCap="round",e.beginPath(),e.moveTo(i.x-15,i.y),e.lineTo(i.x+15,i.y),e.moveTo(i.x,i.y-15),e.lineTo(i.x,i.y+15),e.stroke(),e.strokeStyle=a?"#2c8ec4":"#f3c33d",e.lineWidth=a?3:2,e.stroke(),t.powerOverlay&&oo(e,i.x,i.y-14,a?"I":"V",a?"#2c8ec4":w.warn)}e.restore()}}function Pu(e,t){if(t.footbridges?.size){e.save();for(let n of t.footbridges.keys()){let o=X(n),r=B(o.col,o.row);e.fillStyle="rgba(210,222,228,.52)",e.strokeStyle="#e6edf2",e.lineWidth=3,ee(e,r.x-20,r.y-14,40,28,!0,!0),e.strokeStyle="#34404a",e.lineWidth=2,e.beginPath(),e.moveTo(r.x-18,r.y-9),e.lineTo(r.x+18,r.y-9),e.moveTo(r.x-18,r.y+9),e.lineTo(r.x+18,r.y+9),e.stroke(),ft(e,t,"footbridge",n,r.x,r.y,44,34)}e.restore()}}function Ru(e,t,n,o,r={},i=0){let a=r.kind==="boostConveyor",b=[...new Set([...Array.isArray(r.outDirs)?r.outDirs:[],r.dir].filter(Boolean))][0]||"right",M=b==="up"||b==="down",C=b==="left"||b==="up",$=Vt(t,o)*eo(t,o),K=(typeof performance<"u"?performance.now()/1e3:0)*$,G=((C?-K:K)%10+10)%10;e.save(),e.beginPath(),e.rect(n.x-18,n.y-18,36,36),e.clip();let z=a?"rgba(20,126,124,.62)":"rgba(42,47,54,.72)";if(e.fillStyle=z,e.fillRect(n.x-18,n.y-18,36,36),e.strokeStyle=i>.5?"rgba(238,83,61,.90)":"rgba(184,190,198,.92)",e.lineWidth=4,M)for(let Q=n.y-28+G;Q<n.y+28;Q+=10)e.beginPath(),e.moveTo(n.x-17,Q),e.lineTo(n.x+17,Q),e.stroke();else for(let Q=n.x-28+G;Q<n.x+28;Q+=10)e.beginPath(),e.moveTo(Q,n.y-17),e.lineTo(Q,n.y+17),e.stroke();if(e.globalAlpha=.55,e.strokeStyle="#050609",e.lineWidth=1,M)for(let Q=n.y-23+G;Q<n.y+28;Q+=10)e.beginPath(),e.moveTo(n.x-17,Q),e.lineTo(n.x+17,Q),e.stroke();else for(let Q=n.x-23+G;Q<n.x+28;Q+=10)e.beginPath(),e.moveTo(Q,n.y-17),e.lineTo(Q,n.y+17),e.stroke();e.globalAlpha=1,e.strokeStyle="rgba(8,9,12,.92)",e.lineWidth=2,ee(e,n.x-18,n.y-18,36,36,!1,!0),e.restore()}function ro(e,t){let n=X(t);return fe.filter(o=>e.conveyorTiles.has(E(n.col+o.dc,n.row+o.dr))).map(o=>o.name)}function Wa(e,t,n){let o=fe.find(a=>a.name===n);if(!o)return!1;let r=e.conveyorMeta?.get?.(E(t.col+o.dc,t.row+o.dr));return r?[...new Set([...Array.isArray(r.outDirs)?r.outDirs:[],r.dir].filter(Boolean))].includes(o.opposite):!1}function Ua(e,t,n,o=ro(e,t)){if(o.length<3)return n;let r=X(t),i=new Set(o.filter(b=>Wa(e,r,b))),a=o.filter(b=>!i.has(b));if(i.size)return a;let c=n.filter(b=>o.includes(b));return c.length>=2?[...new Set(c)]:o}function Iu(e,t,n,o=ro(e,t),r="random"){let i=Ua(e,t,n,o);return o.length>=3&&r&&r!=="random"&&i.includes(r)?[r]:i}function Au(e,t,n=ro(e,t)){let o=e.conveyorMeta?.get?.(t)||{},r=[...new Set([...Array.isArray(o.outDirs)?o.outDirs:[],o.dir].filter(Boolean))];return n.length<3?[]:Ua(e,t,r,n)}function $u(e,t,n){let o=X(t),r=fe.filter(c=>e.conveyorTiles.has(E(o.col+c.dc,o.row+c.dr))).map(c=>c.name),i=[...new Set([...Array.isArray(n.outDirs)?n.outDirs:[],n.dir].filter(Boolean))].filter(c=>r.includes(c));if(r.length===1&&(!i.length||i.includes(r[0]))&&Wa(e,o,r[0]))return[];let a=r;return i.length?i:a}function Fu(e,t,n,o,r=o){if(r.length<3||o.length<2)return;e.save();let i=o.includes(n.branchMode)?n.branchMode:"random",a=i!=="random";if(e.lineJoin="round",e.lineCap="round",e.lineWidth=2,e.fillStyle="rgba(18,21,26,.94)",e.strokeStyle=a?w.warn:w.green,e.lineWidth=4,ee(e,t.x-18,t.y-18,36,36,!0,!0),e.strokeStyle="#ffd36a",e.lineWidth=3,e.fillStyle="#020304",i!=="random"){let c=fe.find(b=>b.name===i);no(e,t.x,t.y-4,c?.angle||0,8,5)}else e.beginPath(),e.moveTo(t.x-10,t.y),e.lineTo(t.x-2,t.y),e.lineTo(t.x+8,t.y-8),e.moveTo(t.x-2,t.y),e.lineTo(t.x+8,t.y+8),e.stroke(),no(e,t.x+9,t.y-9,-Math.PI/4,4,3),no(e,t.x+9,t.y+9,Math.PI/4,4,3);i==="random"&&(e.font="900 9px ui-monospace, monospace",e.textAlign="center",e.textBaseline="middle",e.lineWidth=3,e.strokeStyle="#020304",e.fillStyle=w.warn,e.strokeText("RND",t.x,t.y+11),e.fillText("RND",t.x,t.y+11)),e.restore()}function Ou(e,t,n){if(!n)return[];let o=X(t),r=fe.filter(c=>e.conveyorTiles.has(E(o.col+c.dc,o.row+c.dr))).map(c=>c.name),i=[...new Set([...Array.isArray(n.outDirs)?n.outDirs:[],n.dir].filter(Boolean))].filter(c=>r.includes(c));return Iu(e,t,i.length?i:$u(e,t,n),r,n.branchMode||"random").map(c=>fe.find(b=>b.name===c)).filter(Boolean)}function Bu(e){let t=new Map;for(let[n,o]of e.conveyorMeta||[]){let r=Ou(e,n,o);r.length&&t.set(n,r)}return t}function Du(e,t,n){let o=n.slice(0,4);o.length&&(e.save(),e.globalAlpha=1,o.forEach(r=>{let i=t.x+r.dc*11,a=t.y+r.dr*11;e.fillStyle="rgba(255,205,83,.96)",no(e,i,a,r.angle,9,7),e.fillStyle="#020304",no(e,i,a,r.angle,6.5,4.6)}),e.restore())}function no(e,t,n,o,r=11,i=8){e.save(),e.translate(t,n),e.rotate(o),e.beginPath(),e.moveTo(r,0),e.lineTo(-r*.72,-i),e.lineTo(-r*.72,i),e.closePath(),e.fill(),e.restore()}function Lu(e,t,n,o,r){let i=ge(t),a=null;if(n==="inputA"&&(a={x:i.x,y:i.y-40}),n==="left"&&(a={x:i.x-42,y:i.y+10}),n==="right"&&(a={x:i.x+42,y:i.y+10}),!a)return;let c=n==="inputA"?{x:o.x,y:a.y}:{x:a.x,y:o.y};e.save(),e.lineCap="square",e.lineJoin="bevel",e.strokeStyle="#050609",e.lineWidth=15,e.beginPath(),e.moveTo(o.x,o.y),e.lineTo(c.x,c.y),e.lineTo(a.x,a.y),e.stroke(),e.strokeStyle="#596473",e.lineWidth=9,e.beginPath(),e.moveTo(o.x,o.y),e.lineTo(c.x,c.y),e.lineTo(a.x,a.y),e.stroke(),e.strokeStyle=r||"#7b8795",e.lineWidth=3,e.beginPath(),e.moveTo(o.x,o.y),e.lineTo(c.x,c.y),e.lineTo(a.x,a.y),e.stroke(),e.fillStyle=r||"#7b8795",e.strokeStyle="#050609",e.lineWidth=3,ee(e,a.x-9,a.y-7,18,14,!0,!0),e.restore()}function Nu(e,t){e.save(),e.lineWidth=2,e.font="900 12px ui-monospace, monospace",e.textAlign="center";for(let n of t.scanners){let o=Br(n),r=[{type:"inputA",p:We(n,"inputA"),label:"IN",color:w.green},{type:"left",p:We(n,"left"),label:Lr(o.left),color:Nr(o.left)},{type:"right",p:We(n,"right"),label:Lr(o.right),color:Nr(o.right)}];for(let i of r){if(!i.p)continue;let a=B(i.p.col,i.p.row);Lu(e,n,i.type,a,i.color);let c=us(t,n,i.type||(i.label==="IN"?"inputA":null))||t.conveyorTiles.has(E(i.p.col,i.p.row));e.fillStyle=c?qn("#1a1d23",i.color,.24):"#3a1e22",e.strokeStyle=c?i.color:w.danger,ee(e,a.x-18,a.y-12,36,24,!0,!0),e.fillStyle=w.white,e.fillText(i.label,a.x,a.y+4)}}e.restore()}function Gu(e,t){for(let n of t.eggFarms)_u(e,n,t)}function _u(e,t,n){let o=B(t.col,t.row);e.save(),e.fillStyle="#5a6470",e.strokeStyle=w.ink,e.lineWidth=3,ee(e,o.x-27,o.y-27,54,54,!0,!0),e.fillStyle="#6f5130",e.strokeStyle="#2f2112",e.lineWidth=3,e.beginPath(),e.ellipse(o.x,o.y+3,19,12,0,0,Math.PI*2),e.fill(),e.stroke(),e.strokeStyle="#a77b4b",e.lineWidth=2;for(let c=-16;c<=16;c+=6)e.beginPath(),e.moveTo(o.x-18,o.y+c*.1),e.quadraticCurveTo(o.x+c,o.y-10+Math.abs(c)*.2,o.x+18,o.y+c*.08),e.stroke();let r=[{x:-8,y:1},{x:0,y:-3},{x:8,y:2}];for(let c of r)e.fillStyle="#e8e2cf",e.strokeStyle="#8d8475",e.lineWidth=1.5,e.beginPath(),e.ellipse(o.x+c.x,o.y+c.y,4.8,6.2,.2,0,Math.PI*2),e.fill(),e.stroke();let i=1+Math.max(0,Number(t.extraEggOutlet)||0);e.fillStyle="rgba(255,255,255,.92)",e.strokeStyle=w.ink,e.lineWidth=2,ee(e,o.x+8,o.y+11,30,18,!0,!0),e.fillStyle=w.ink,e.font="900 10px ui-monospace, monospace",e.textAlign="center",e.fillText(`O${i}`,o.x+23,o.y+23),e.fillStyle="#d5e35a",e.font="900 9px ui-monospace, monospace",e.fillText(`L${t.level}`,o.x-13,o.y-15);let a=Math.max(0,Math.min(1,t.shutterProgress||0));if(a>0){let c=54*a;e.fillStyle="rgba(10,12,15,.86)",ee(e,o.x-27,o.y-27,54,c,!0,!1),e.strokeStyle="rgba(230,237,242,.64)",e.lineWidth=2;for(let b=o.y-23;b<o.y-27+c;b+=8)e.beginPath(),e.moveTo(o.x-23,b),e.lineTo(o.x+23,b),e.stroke();a>=1&&(e.fillStyle=w.white,e.font="900 12px ui-monospace, monospace",e.fillText("SHUT",o.x,o.y+4))}Dt(e,o.x-28,o.y-28,56,56,t),ft(e,n,"eggFarm",t.id,o.x,o.y,68,68),e.restore()}function Wu(e,t){for(let n of t.scanners)Uu(e,n,t)}function Uu(e,t,n){let o=ge(t);if(e.save(),t.kind==="manual"&&(n.manualCombo?.count||0)>=10){let b=n.manualCombo.count;e.save(),e.globalAlpha=Math.min(.55,.16+b/120),e.strokeStyle=b>=30?w.warn:w.green,e.lineWidth=Math.min(12,4+Math.floor(b/10)),e.shadowColor=e.strokeStyle,e.shadowBlur=Math.min(24,8+b),ee(e,o.x-48,o.y-48,96,96,!1,!0),e.restore()}let r=t.kind==="auto"?De.scannerAuto:De.scannerManual;if(ln(e,r,o.x-44,o.y-44,88,88)){t.kind==="auto"?Dt(e,o.x-44,o.y-44,88,88,t):La(e,t,o),ft(e,n,"scanner",t.id,o.x,o.y,96,96),e.restore();return}e.fillStyle=t.kind==="auto"?"#d8ffe2":w.white,e.strokeStyle=w.ink,e.lineWidth=4,ee(e,o.x-44,o.y-44,88,88,!0,!0),e.fillStyle=t.kind==="auto"?w.green:w.ink,e.font="900 16px ui-monospace, monospace",e.textAlign="center",e.fillText(t.kind==="auto"?"AUTO":`S${(t.slot??0)+1}`,o.x,o.y-24),e.font="900 9px ui-monospace, monospace";let i=t.keys?.left?.label||(t.slot===0?"A":"Left"),a=t.keys?.right?.label||(t.slot===0?"D":"Right");e.fillText(t.kind==="auto"?"2.1 FARMS":`${i}/${a}`,o.x,o.y-8);let c=t.queue.length;t.kind==="manual"?La(e,t,o):(e.fillStyle=c>0?w.green:w.muted,e.font="900 10px ui-monospace, monospace",e.fillText(`Q:${c} CD:${t.cooldown.toFixed(1)}`,o.x,o.y+35),Dt(e,o.x-44,o.y-44,88,88,t)),ft(e,n,"scanner",t.id,o.x,o.y,96,96),e.restore()}function La(e,t,n){if(t.kind!=="manual")return;let r=(t.slot??0)===0?[{side:"left",text:"A"},{side:"right",text:"D"}]:[{side:"left",text:"\u2190"},{side:"right",text:"\u2192"}];r[0].text=t.keys?.left?.label||r[0].text,r[1].text=t.keys?.right?.label||r[1].text;let i=t.keyPressTime>0?t.keyPressSide:null,a=n.x-30,c=n.y+8;e.save(),e.lineWidth=3,e.fillStyle="#f7fff5",e.strokeStyle=w.ink,ee(e,a-4,c-4,68,25,!0,!0),e.font="900 19px ui-monospace, monospace",e.textAlign="center";for(let b=0;b<r.length;b+=1){let M=r[b],C=i===M.side,$=a+b*32,W=c+(C?3:0);e.fillStyle=C?w.greenSoft:w.white,e.strokeStyle=w.ink,e.lineWidth=C?4:3,ee(e,$,W,28,17,!0,!0),C||(e.fillStyle="rgba(16,32,21,.18)",ee(e,$+3,W+17,28,3,!0,!1)),e.fillStyle=w.ink,e.fillText(M.text,$+14,W+13)}e.fillStyle=w.muted,e.font="900 8px ui-monospace, monospace",e.fillText("KEYBOARD",n.x,c-7),e.restore()}function hi(e){return e.eventActive?.target||e.eventOffer?.target||"female"}function mi(e,t,n,o){o==="poop"?Va(e,t,n):o==="meat"?Ka(e,t,n,9):o==="sausage"?tr(e,t,n,10):Si(e,t,n,o,!1)}function Jo(e,t,n,o,r,i,a=""){e.save(),e.fillStyle="rgba(255,255,255,.92)",e.strokeStyle=w.ink,e.lineWidth=3,ee(e,t,n,o,32,!0,!0),mi(e,t+18,n+16,i),e.fillStyle=w.ink,e.font="900 12px ui-monospace, monospace",e.textAlign="left",e.fillText(r,t+34,n+13),a&&(e.fillStyle=w.muted,e.font="900 10px ui-monospace, monospace",e.fillText(a,t+34,n+25)),e.restore()}function Vu(e,t){return e==="mixer"?{title:"IN: MALE",type:"male",color:w.mixerBlue}:e==="trash"?{title:"IN: POOP",type:"poop",color:w.wasteGreen}:e==="sausageMaker"?{title:"IN: MEAT",type:"meat",color:w.sausageOrange}:e==="truck"?{title:`IN: ${hi(t).toUpperCase()}`,type:hi(t),color:w.truckPink}:{title:"IN",type:"female",color:w.green}}function Zo(e){return typeof e=="string"?e:e?.baseId||e?.id||""}function Ku(e,t,n){let o=typeof n=="string"?t.facilities[n]:n,r=wt(t,o);if(!o||!r)return;let i=Zo(o),a=B(r.col,r.row),c=Vu(i,t);if(o.gridPlaced){let b=No(o,"input");b&&(e.save(),e.strokeStyle="#07080a",e.lineWidth=11,e.lineCap="round",e.beginPath(),e.moveTo(a.x,a.y),e.lineTo(b.x,b.y),e.stroke(),e.strokeStyle="#6f4a43",e.lineWidth=5,e.beginPath(),e.moveTo(a.x,a.y),e.lineTo(b.x,b.y),e.stroke(),e.restore())}e.save(),e.fillStyle="#191c22",e.strokeStyle=c.color,e.lineWidth=5,ee(e,a.x-22,a.y-22,44,44,!0,!0),e.strokeStyle=w.ink,e.lineWidth=2,ee(e,a.x-18,a.y-18,36,36,!1,!0),mi(e,a.x,a.y-3,c.type),e.font="900 10px ui-monospace, monospace",e.textAlign="center",e.fillStyle=w.ink,e.fillText(c.title,a.x,a.y+20),e.restore()}function cn(e,t,n,o,r,i="#252b34",a="#08090c",c="#606a78"){e.save();let b=e.createLinearGradient(t,n,t,n+r);b.addColorStop(0,qn(i,"#ffffff",.12)),b.addColorStop(.55,i),b.addColorStop(1,qn(i,"#000000",.28)),e.fillStyle=b,e.strokeStyle=a,e.lineWidth=4,ee(e,t,n,o,r,!0,!0),e.fillStyle="rgba(255,255,255,.08)",e.fillRect(t+5,n+5,Math.max(0,o-10),3),e.strokeStyle="rgba(0,0,0,.34)",e.lineWidth=1;for(let M=n+11;M<n+r-8;M+=13)e.beginPath(),e.moveTo(t+6,M),e.lineTo(t+o-6,M),e.stroke();e.fillStyle=c;for(let[M,C]of[[t+8,n+8],[t+o-8,n+8],[t+8,n+r-8],[t+o-8,n+r-8]])e.beginPath(),e.arc(M,C,2.2,0,Math.PI*2),e.fill();e.restore()}function $n(e,t,n=w.green){e.save(),e.strokeStyle="#06070a",e.lineWidth=4,e.beginPath(),e.moveTo(t.x+12,t.y+t.h-18),e.lineTo(t.x+t.w-12,t.y+t.h-18),e.stroke(),e.strokeStyle=n,e.lineWidth=2,e.beginPath(),e.moveTo(t.x+16,t.y+22),e.lineTo(t.x+t.w-18,t.y+22),e.stroke(),e.fillStyle="#20242b",e.strokeStyle="#07080a",e.lineWidth=2,ee(e,t.x+t.w-44,t.y+12,30,22,!0,!0),e.fillStyle=n,e.fillRect(t.x+t.w-38,t.y+18,6,6),e.fillStyle=w.danger,e.fillRect(t.x+t.w-27,t.y+18,6,6);let o=En(qu(e),t);o&&o.receivedV<o.minVoltage&&(e.fillStyle=w.danger,e.font="900 18px ui-monospace, monospace",e.textAlign="center",e.fillText("X\u26A1",t.x+t.w-28,t.y+52)),e.strokeStyle="#47515f",e.lineWidth=3,e.beginPath(),e.moveTo(t.x+12,t.y+t.h-35),e.bezierCurveTo(t.x+42,t.y+t.h-52,t.x+60,t.y+t.h-20,t.x+88,t.y+t.h-38),e.stroke(),e.restore()}function qu(e){return e.__gameRef||{}}function zu(e,t,n,o=1.45){if(!t?.loaded)return!1;let r=p.cell*Math.min(1.45,o),i=Math.max(42,Math.min(r,n.w-34,n.h-42)),a=n.x+Math.round((n.w-i)/2),c=n.y+Math.round((n.h-i)/2)+2;return ln(e,t,a,c,i,i)}function Hu(e){let t=B(e.col,e.row);return{x:t.x-p.cell/2,y:t.y-p.cell/2,w:p.cell*2,h:p.cell*2,cx:t.x+p.cell/2,cy:t.y+p.cell/2}}function Yu(e,t){for(let n of t.maintenanceRooms||[]){let o=Hu(n);if(e.save(),cn(e,o.x+2,o.y+2,o.w-4,o.h-4,"#343b45","#0a0b0e","#7a6750"),!ln(e,De.maintenanceRoom,o.x+5,o.y+5,o.w-10,o.h-10)){e.fillStyle="#414a55",e.strokeStyle=w.ink,e.lineWidth=3,ee(e,o.x+8,o.y+8,o.w-16,o.h-16,!0,!0),e.fillStyle="#6e573e",e.strokeStyle="#111318",e.lineWidth=2,ee(e,o.x+13,o.y+14,24,51,!0,!0),e.strokeStyle="#b58a52";for(let r of[o.y+29,o.y+44,o.y+59])e.beginPath(),e.moveTo(o.x+14,r),e.lineTo(o.x+36,r),e.stroke();e.fillStyle="#515b68",e.strokeStyle="#111318",ee(e,o.x+o.w-34,o.y+13,20,43,!0,!0),e.fillStyle="#d49d28",e.fillRect(o.x+o.w-21,o.y+32,3,3),e.fillStyle="#735431",e.strokeStyle="#111318",ee(e,o.x+41,o.y+o.h-31,34,14,!0,!0),e.fillStyle="#1b2027",e.fillRect(o.x+46,o.y+o.h-39,24,8),e.fillStyle="#7b8795",e.fillRect(o.x+51,o.y+o.h-37,4,5),e.fillStyle="#805b35",e.strokeStyle="#111318",ee(e,o.x+o.w-32,o.y+o.h-28,16,12,!0,!0),e.fillStyle="#222831",e.beginPath(),e.arc(o.x+o.w-46,o.y+o.h-20,7,0,Math.PI*2),e.fill(),e.fillStyle="#ddd0ad",e.font="900 8px ui-monospace, monospace",e.textAlign="center",e.fillText("STORE / REST",o.cx,o.y+11)}Dt(e,o.x+5,o.y+5,o.w-10,o.h-10,n),ft(e,t,"maintenanceRoom",n.id,o.cx,o.cy,o.w+6,o.h+6),e.restore()}}function Qu(e,t){for(let n of Object.values(t.facilities||{})){let o=Zo(n);o==="mixer"?Zu(e,t,n):o==="trash"?ed(e,t,n):o==="truck"?nd(e,t,n):o==="sausageMaker"?td(e,t,n):o==="starterGenerator"||o==="biomassGenerator"||o==="coalGenerator"?Xu(e,t,n,o):o==="inboundTruck"&&ju(e,t,n)}for(let n of Object.values(t.facilities||{}))Ku(e,t,n),Ju(e,t,n)}function Xu(e,t,n,o){e.save();let r=o==="starterGenerator"?w.warn:o==="biomassGenerator"?w.green:"#d0d5dc";cn(e,n.x,n.y,n.w,n.h,"#252b31",w.ink,r),$n(e,n,r),e.fillStyle=w.white,e.font="900 13px ui-monospace, monospace",e.textAlign="left";let i=o==="starterGenerator"?"STARTER":o==="biomassGenerator"?"BIOMASS":"COAL GEN";e.fillText(i,n.x+12,n.y+18),e.font="900 18px ui-monospace, monospace",e.textAlign="center",e.fillStyle=r,e.fillText(o==="biomassGenerator"?"LEAF":"\u26A1",n.x+n.w/2,n.y+n.h/2-4),e.font="900 12px ui-monospace, monospace",e.fillText(`${Tn(n).toFixed(0)}V`,n.x+n.w/2,n.y+n.h/2+20),ft(e,t,"facility",n.id,n.x+n.w/2,n.y+n.h/2,n.w+12,n.h+12),e.restore()}function ju(e,t,n){e.save(),er(e,n),cn(e,n.x,n.y,n.w,n.h,"#29313a",w.ink,"#8bd0ff"),$n(e,n,"#8bd0ff"),e.fillStyle=w.white,e.font="900 14px ui-monospace, monospace",e.textAlign="left",e.fillText("INBOUND",n.x+14,n.y+18),e.fillStyle="#8bd0ff",e.font="900 11px ui-monospace, monospace",e.fillText(`COAL ${n.inboundOrder?.coalPerDay||0} / ZUNDA ${n.inboundOrder?.zundaMochiPerDay||0}`,n.x+14,n.y+36),e.fillStyle="rgba(10,18,24,.9)",ee(e,n.x+18,n.y+54,n.w-36,n.h-70,!0,!0),oo(e,n.x+n.w/2,n.y+n.h-18,`Q ${n.inboundQueue?.length||0}`,"#8bd0ff"),ft(e,t,"facility",n.id,n.x+n.w/2,n.y+n.h/2,n.w+12,n.h+12),e.restore()}function Ju(e,t,n){let o=He(t,n);if(!o)return;let r=B(o.col,o.row),i=No(n,"output");i&&(e.save(),e.strokeStyle="#07080a",e.lineWidth=11,e.lineCap="round",e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(r.x,r.y),e.stroke(),e.strokeStyle="#77524a",e.lineWidth=5,e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(r.x,r.y),e.stroke(),e.restore());let a=Zo(n),c=a==="mixer"?"meat":"sausage",b=a==="mixer"?w.meatRed:w.sausageOrange,M=kt(t,n);e.save(),e.fillStyle=M?"#1d2423":"#3a1e22",e.strokeStyle=M?b:w.danger,e.lineWidth=5,ee(e,r.x-22,r.y-22,44,44,!0,!0),mi(e,r.x,r.y-3,c),e.fillStyle=w.white,e.font="900 10px ui-monospace, monospace",e.textAlign="center",e.fillText("OUT",r.x,r.y+20),e.restore()}function er(e,t){if(!t?.entry||t.gridPlaced)return;let n=B(t.entry.col,t.entry.row),o=No(t,"input"),r=o?.x??t.x+t.w/2,i=o?.y??t.y+t.h/2;Zo(t)!=="mixer"&&(t.side==="left"?(r=t.x+t.w,i=n.y):t.side==="right"?(r=t.x,i=n.y):t.side==="top"?(r=n.x,i=t.y+t.h):t.side==="bottom"&&(r=n.x,i=t.y)),e.save(),e.strokeStyle="#07080a",e.lineWidth=11,e.lineCap="round",e.beginPath(),e.moveTo(n.x,n.y),e.lineTo(r,i),e.stroke(),e.strokeStyle="#555f70",e.lineWidth=5,e.beginPath(),e.moveTo(n.x,n.y),e.lineTo(r,i),e.stroke(),e.restore()}function Zu(e,t,n=t.facilities.mixer){e.save(),er(e,n),cn(e,n.x,n.y,n.w,n.h,"#2b333d",w.ink,w.mixerBlue),$n(e,n,w.mixerBlue),e.fillStyle=w.white,e.font="900 14px ui-monospace, monospace",e.textAlign="left",e.fillText(`MIXER L${n.level}`,n.x+14,n.y+18),e.fillStyle=w.muted,e.font="900 10px ui-monospace, monospace",e.fillText(`MEAT ${n.meatBuffer||0} | SAUSAGE ${R(lt(t))}`,n.x+14,n.y+34),e.fillStyle="#1a2028",e.strokeStyle="#87bfff",e.lineWidth=4,ee(e,n.x+44,n.y+34,76,50,!0,!0),e.strokeStyle="#4aa3ff",e.lineWidth=3,e.beginPath(),e.arc(n.x+82,n.y+58,15,0,Math.PI*2),e.stroke(),e.beginPath(),e.moveTo(n.x+82,n.y+43),e.lineTo(n.x+82,n.y+73),e.stroke(),e.beginPath(),e.moveTo(n.x+69,n.y+56),e.lineTo(n.x+95,n.y+60),e.stroke(),e.fillStyle="#59687a",e.strokeStyle="#0d1014",ee(e,n.x+56,n.y+24,12,10,!0,!0),ee(e,n.x+96,n.y+24,12,10,!0,!0),e.fillStyle="#7ea9dc",e.fillRect(n.x+48,n.y+42,68,5),Jo(e,n.x+14,n.y+n.h-40,n.w-28,"CHICK -> MEAT","meat","connect OUT to sausage machine"),Dt(e,n.x,n.y,n.w,n.h,n),ft(e,t,"facility",n.id,n.x+n.w/2,n.y+n.h/2,n.w+12,n.h+12),e.restore()}function ed(e,t,n=t.facilities.trash){e.save(),er(e,n),cn(e,n.x,n.y,n.w,n.h,"#29342d",w.ink,w.wasteGreen),$n(e,n,w.wasteGreen),e.fillStyle=w.white,e.font="900 14px ui-monospace, monospace",e.textAlign="left",e.fillText(`SHREDDER L${n.level}`,n.x+14,n.y+18),e.fillStyle="#181d20",e.strokeStyle="#9fd473",e.lineWidth=4,ee(e,n.x+38,n.y+36,92,22,!0,!0),e.fillStyle="#262d30",e.strokeStyle="#0d1014",ee(e,n.x+46,n.y+58,76,18,!0,!0),e.fillStyle="#111418";for(let o=0;o<7;o+=1){let r=n.x+51+o*10;e.beginPath(),e.moveTo(r,n.y+58),e.lineTo(r+5,n.y+68),e.lineTo(r+10,n.y+58),e.closePath(),e.fill()}e.fillStyle="#6f7e8d",ee(e,n.x+54,n.y+27,16,9,!0,!0),ee(e,n.x+98,n.y+27,16,9,!0,!0),Jo(e,n.x+14,n.y+n.h-42,n.w-28,"SEND POOP","poop","shredder"),Dt(e,n.x,n.y,n.w,n.h,n),ft(e,t,"facility",n.id,n.x+n.w/2,n.y+n.h/2,n.w+12,n.h+12),e.restore()}function td(e,t,n){e.save(),cn(e,n.x,n.y,n.w,n.h,"#3b3029",w.ink,w.sausageOrange),$n(e,n,w.sausageOrange),e.fillStyle=w.white,e.font="900 14px ui-monospace, monospace",e.textAlign="left",e.fillText(`SAUSAGE L${n.level}`,n.x+14,n.y+18),e.fillStyle=w.muted,e.font="900 10px ui-monospace, monospace",e.fillText(`2 MEAT -> 1 | ${R(lt(t))}`,n.x+14,n.y+34),e.fillStyle="#211915",e.strokeStyle=w.sausageOrange,e.lineWidth=4,ee(e,n.x+20,n.y+43,n.w-40,38,!0,!0);for(let o=0;o<3;o+=1)tr(e,n.x+n.w/2-28+o*28,n.y+62,9);e.fillStyle=w.meatRed,e.fillRect(n.x,n.y+n.h/2-8,8,16),e.fillStyle=w.sausageOrange,e.fillRect(n.x+n.w-8,n.y+n.h/2-8,8,16),Jo(e,n.x+10,n.y+n.h-42,n.w-20,"2 MEAT -> SAUSAGE","sausage",`buffer ${n.meatBuffer||0}/2`),Dt(e,n.x,n.y,n.w,n.h,n),ft(e,t,"facility",n.id,n.x+n.w/2,n.y+n.h/2,n.w+12,n.h+12),e.restore()}function nd(e,t,n=t.facilities.truck){e.save(),er(e,n),cn(e,n.x,n.y,n.w,n.h,"#343128",w.ink,w.truckPink),$n(e,n,w.truckPink),e.fillStyle=w.white,e.font="900 14px ui-monospace, monospace",e.textAlign="left",e.fillText(`SHIP TRUCK L${n.level}`,n.x+14,n.y+18),e.fillStyle=w.muted,e.font="900 10px ui-monospace, monospace",e.fillText(`UNIT ${R(Je(t))}`,n.x+14,n.y+34),zu(e,De.truck,n,2);let o=hi(t);Jo(e,n.x+15,n.y+50,n.w-30,`SEND ${o.toUpperCase()}`,o,t.eventOffer&&!t.eventActive?"next event":"truck cargo"),e.fillStyle="rgba(39,60,36,.9)",ee(e,n.x+13,n.y+88,n.w-26,Math.max(18,n.h-103),!0,!1);for(let r of t.truckCargo)r.sex==="poop"?Va(e,n.x+r.x,n.y+r.y):r.sex==="sausage"?tr(e,n.x+r.x,n.y+r.y,7):Si(e,n.x+r.x,n.y+r.y,r.sex,r.sex==="male");Dt(e,n.x,n.y,n.w,n.h,n),ft(e,t,"facility",n.id,n.x+n.w/2,n.y+n.h/2,n.w+12,n.h+12),e.restore()}function od(e,t,n){let o=n(0),r=n(1);for(let i of t.chicks){let a=o&&o.id===i.id||r&&r.id===i.id||i.queueIndex===0;rd(e,i,a,t)}}function rd(e,t,n,o){let r=o.componentLookup&&id(o,t)>.8,i=t.y+Math.sin(t.bob)*(r?5:1.5);if(e.save(),n&&(e.strokeStyle=w.green,e.lineWidth=5,e.beginPath(),e.arc(t.x,i,t.radius+8,0,Math.PI*2),e.stroke()),r&&(e.strokeStyle=w.danger,e.lineWidth=3,e.beginPath(),e.arc(t.x,i,t.radius+12+Math.sin(t.bob*2)*4,0,Math.PI*2),e.stroke()),t.sex==="poop")vi(e,t.x,i,t.radius);else if(t.sex==="meat")Ka(e,t.x,i,t.radius);else if(t.sex==="sausage")tr(e,t.x,i,t.radius);else if(t.sex==="coal")sd(e,t.x,i,t.radius);else if(t.sex==="zundaMochi")ad(e,t.x,i,t.radius);else{let a=t.sex==="male"?De.chickMale:De.chickFemale;if(!ln(e,a,t.x-t.radius,i-t.radius,t.radius*2,t.radius*2)){let M=t.sex==="male"?w.male:w.female,C=t.sex==="male"?"#164f8f":"#8b2252";e.fillStyle=M,e.strokeStyle=w.ink,e.lineWidth=5,e.beginPath(),e.arc(t.x,i,t.radius,0,Math.PI*2),e.fill(),e.stroke(),e.fillStyle="rgba(255,255,255,.24)",e.beginPath(),e.arc(t.x-5,i-7,t.radius*.36,0,Math.PI*2),e.fill(),e.fillStyle=w.ink,e.beginPath(),e.arc(t.x-6,i-5,2.5,0,Math.PI*2),e.arc(t.x+6,i-5,2.5,0,Math.PI*2),e.fill(),e.fillStyle="#ffaa2e",e.beginPath(),e.moveTo(t.x,i+2),e.lineTo(t.x+9,i+6),e.lineTo(t.x,i+10),e.closePath(),e.fill(),e.strokeStyle=C,e.lineWidth=3,t.sex==="male"?(e.beginPath(),e.moveTo(t.x-8,i-t.radius-2),e.lineTo(t.x+8,i-t.radius-2),e.stroke()):(e.beginPath(),e.moveTo(t.x-9,i-t.radius+2),e.lineTo(t.x,i-t.radius-6),e.lineTo(t.x+9,i-t.radius+2),e.stroke())}e.fillStyle=t.sex==="male"?"#dff1ff":"#fff0f7",e.strokeStyle="#050609",e.lineWidth=3,e.font=`900 ${Math.max(10,Math.round(t.radius*.72))}px ui-monospace, monospace`,e.textAlign="center";let b=t.sex==="male"?"\u2642":"\u2640";e.strokeText(b,t.x+t.radius*.54,i+t.radius*.7),e.fillText(b,t.x+t.radius*.54,i+t.radius*.7)}e.restore()}function id(e,t){let n=null,o=1/0;for(let[r,i]of e.componentLookup.entries()){let a=X(r),c=B(a.col,a.row),b=Math.hypot(t.x-c.x,t.y-c.y);b<o&&(o=b,n=i)}return e.congestion.get(n)?.ratio||0}function vi(e,t,n,o){ln(e,De.poop,t-o,n-o,o*2,o*2)||(e.save(),e.fillStyle=w.poop,e.strokeStyle=w.ink,e.lineWidth=4,e.beginPath(),e.arc(t,n+7,o*.86,Math.PI,0,!0),e.arc(t,n+1,o*.66,Math.PI,0,!0),e.arc(t,n-5,o*.44,Math.PI,0,!0),e.closePath(),e.fill(),e.stroke(),e.fillStyle=w.white,e.beginPath(),e.arc(t-5,n+1,2,0,Math.PI*2),e.arc(t+5,n+1,2,0,Math.PI*2),e.fill(),e.restore())}function Va(e,t,n){vi(e,t,n,7)}function Ka(e,t,n,o=10){e.save(),e.fillStyle=w.meatRed,e.strokeStyle=w.ink,e.lineWidth=3,e.beginPath(),e.ellipse(t,n,o*1.15,o*.78,-.25,0,Math.PI*2),e.fill(),e.stroke(),e.fillStyle="#f1b8b8",e.beginPath(),e.arc(t-o*.25,n-o*.12,o*.22,0,Math.PI*2),e.fill(),e.restore()}function tr(e,t,n,o=10){e.save(),e.translate(t,n),e.rotate(-.2),e.fillStyle=w.sausageOrange,e.strokeStyle=w.ink,e.lineWidth=3,ee(e,-o,-o*.45,o*2,o*.9,!0,!0),e.strokeStyle="#8a4823",e.lineWidth=2;for(let r of[-o*.45,o*.45])e.beginPath(),e.moveTo(r,-o*.36),e.lineTo(r,o*.36),e.stroke();e.restore()}function sd(e,t,n,o=10){e.save(),e.fillStyle="#111318",e.strokeStyle="#050609",e.lineWidth=3,ee(e,t-o,n-o*.85,o*2,o*1.7,!0,!0),e.fillStyle="#3b424b",e.fillRect(t-o*.5,n-o*.5,o*.8,o*.35),e.restore()}function ad(e,t,n,o=10){e.save(),e.fillStyle="#6fce57",e.strokeStyle=w.ink,e.lineWidth=3,e.beginPath(),e.moveTo(t,n-o),e.lineTo(t+o,n),e.lineTo(t,n+o),e.lineTo(t-o,n),e.closePath(),e.fill(),e.stroke(),e.restore()}function Si(e,t,n,o,r=!1){e.save();let i=o==="male"?w.male:w.female,a=o==="male"?"#164f8f":"#8b2252";e.fillStyle=i,e.strokeStyle=w.ink,e.lineWidth=2,e.beginPath(),e.arc(t,n,7,0,Math.PI*2),e.fill(),e.stroke(),e.strokeStyle=a,e.lineWidth=2,o==="male"?(e.beginPath(),e.moveTo(t-4,n-8),e.lineTo(t+4,n-8),e.stroke()):(e.beginPath(),e.moveTo(t-5,n-7),e.lineTo(t,n-11),e.lineTo(t+5,n-7),e.stroke()),r&&(e.fillStyle=w.danger,e.font="900 12px ui-monospace, monospace",e.textAlign="center",e.fillText("!",t,n+15)),e.restore()}function Na(e,t){return`${e}:${t}`}function ld(e,t,n){return e.selected&&e.selected.type===t&&e.selected.id===n?!0:(e.multiSelected||[]).some(o=>Na(o.type,o.id)===Na(t,n))}function ft(e,t,n,o,r,i,a,c){ld(t,n,o)&&(e.save(),e.fillStyle="rgba(34,185,79,.18)",e.strokeStyle=w.green,e.lineWidth=(t.multiSelected||[]).length>1?6:4,e.setLineDash((t.multiSelected||[]).length>1?[]:[8,5]),ee(e,r-a/2,i-c/2,a,c,!0,!0),e.restore())}function cd(e,t,n,o){if(t.phase==="build"&&(t.multiSelected||[]).length>1){e.save(),e.fillStyle="rgba(255,255,255,.96)",e.strokeStyle=w.ink,e.lineWidth=3,ee(e,54-t.view.x,66-t.view.y,214,42,!0,!0),e.fillStyle=w.ink,e.font="900 11px ui-monospace, monospace",e.fillText(`${t.multiSelected.length} ITEMS SELECTED`,65-t.view.x,83-t.view.y),e.fillStyle=w.muted,e.font="900 11px ui-monospace, monospace",e.fillText("drag any selected item to move group",65-t.view.x,99-t.view.y),e.restore();return}}function ud(e,t,n){if(!n.cardTargetPick?.pending)return;let o=pi(n);e.save(),e.fillStyle="rgba(0,0,0,.66)",e.beginPath();let r=n.view?.scale||1;e.rect(-(n.view?.x||0)/r,-(n.view?.y||0)/r,t.width/r,t.height/r);for(let M of o){let C=M.bounds,$=8;e.rect(C.x-$,C.y-$,C.w+$*2,C.h+$*2)}e.fill("evenodd");let i=n.cardTargetPick?.mode==="blockedCell";if(!o.length){e.fillStyle="rgba(255,255,255,.95)",e.strokeStyle=w.ink,e.lineWidth=3,ee(e,(260-(n.view?.x||0))/r,(96-(n.view?.y||0))/r,420/r,42/r,!0,!0),e.fillStyle=w.danger,e.font="900 12px ui-monospace, monospace",e.textAlign="center",e.fillText(i?"NO BLOCKED CELL. PRESS ESC.":"NO VALID UPGRADE TARGET. PRESS ESC.",(470-(n.view?.x||0))/r,(122-(n.view?.y||0))/r),e.restore();return}e.fillStyle="rgba(255,255,255,.95)",e.strokeStyle=w.ink,e.lineWidth=3;let a=Math.max(1,n.cardTargetPick?.remaining||1),c=Math.max(0,n.cardTargetPick?.used||0),b=n.cardTargetPick?.mode==="autoScannerMenu"?"AUTO SCANNER ROUTE SETTINGS. CLICK EMPTY AREA TO CLOSE.":i?`DYNAMITE: CLICK ANY BLOCKED TILE (${a} LEFT). ESC ${c>0?"FINISHES":"CANCELS"}.`:"CLICK AN UPGRADEABLE MACHINE. PRESS ESC TO CANCEL.";ee(e,(216-(n.view?.x||0))/r,(96-(n.view?.y||0))/r,560/r,42/r,!0,!0),e.fillStyle=w.ink,e.font="900 12px ui-monospace, monospace",e.textAlign="center",e.fillText(b,(496-(n.view?.x||0))/r,(122-(n.view?.y||0))/r),e.restore()}function dd(e,t){if(t.phase!=="build"||!t.selectionBox)return;let n=t.selectionBox,o=Math.min(n.x1,n.x2),r=Math.min(n.y1,n.y2),i=Math.abs(n.x2-n.x1),a=Math.abs(n.y2-n.y1);e.save(),e.fillStyle="rgba(34,185,79,.12)",e.strokeStyle=w.green,e.lineWidth=2,e.setLineDash([7,4]),ee(e,o,r,i,a,!0,!0),e.restore()}function fd(e,t){let n=[...t.effects].sort((o,r)=>(o.priority??_e.ambient)-(r.priority??_e.ambient));for(let o of n){let r=Math.max(0,o.life/o.maxLife);e.save(),e.globalAlpha=r,o.type==="meat"?(e.fillStyle=w.green,ee(e,o.x-o.size/2,o.y-o.size/2,o.size*1.5,o.size,!0,!1)):o.type==="sludge"?(e.fillStyle=w.poop,ee(e,o.x-o.size/2,o.y-o.size/2,o.size*1.4,o.size,!0,!1)):o.type==="spawn"?(e.strokeStyle=w.green,e.lineWidth=3,e.beginPath(),e.arc(o.x,o.y,o.size+(1-r)*20,0,Math.PI*2),e.stroke()):o.type==="spark"?(e.fillStyle=o.color||w.danger,ee(e,o.x-o.size/2,o.y-o.size/2,o.size,o.size,!0,!1)):o.type==="smoke"?(e.fillStyle="rgba(16,32,21,.24)",e.beginPath(),e.arc(o.x,o.y,o.size*(1.2-r*.2),0,Math.PI*2),e.fill()):o.type==="shockwave"?(e.strokeStyle=o.color||w.danger,e.lineWidth=4,e.beginPath(),e.arc(o.x,o.y,o.size+(1-r)*(o.maxSize||44),0,Math.PI*2),e.stroke()):o.type==="scannerPulse"?(e.strokeStyle=o.color||w.green,e.lineWidth=5,e.setLineDash([8,6]),e.beginPath(),e.arc(o.x,o.y,o.size+(1-r)*38,0,Math.PI*2),e.stroke()):o.type==="shred"?(e.fillStyle=o.color||w.ink,e.save(),e.translate(o.x,o.y),e.rotate(o.rot||0),ee(e,-o.w/2,-o.h/2,o.w,o.h,!0,!1),e.restore()):o.type==="load"?(e.strokeStyle=o.color||w.green,e.lineWidth=3,e.beginPath(),e.moveTo(o.x-14,o.y),e.lineTo(o.x+14,o.y),e.moveTo(o.x,o.y-14),e.lineTo(o.x,o.y+14),e.stroke()):o.type==="erase"?(e.strokeStyle=w.ink,e.lineWidth=3,e.setLineDash([4,4]),ee(e,o.x-o.size/2,o.y-o.size/2,o.size,o.size,!1,!0)):o.type==="rage"?(e.fillStyle=o.color||w.danger,e.font="900 16px ui-monospace, monospace",e.textAlign="center",e.fillText("!",o.x,o.y)):o.type==="flyingChick"&&(o.sex==="poop"?vi(e,o.x,o.y,o.radius||11):Si(e,o.x,o.y,o.sex,o.sex==="male")),e.restore()}}function pd(e,t){e.save(),e.font="900 19px ui-monospace, monospace",e.textAlign="center";for(let n of t.floatingTexts){let o=Math.max(0,n.life/n.maxLife);e.globalAlpha=o,e.lineWidth=5,e.strokeStyle=w.white,e.fillStyle=n.color,e.strokeText(n.text,n.x,n.y),e.fillText(n.text,n.x,n.y)}e.restore()}function yd(e,t){let n=t.repairmen&&t.repairmen.length?t.repairmen:t.repairman?[t.repairman]:[];for(let o of n)hd(e,t,o)}function hd(e,t,n){if(!!!n?.active)return;if(e.save(),ln(e,De.repairman,n.x-18,n.y-18,36,36)){n.target?.label&&oo(e,n.x,n.y-24,n.target.label,w.green),e.restore();return}e.lineWidth=3,e.fillStyle="#fff0d1",e.strokeStyle=w.ink,e.beginPath(),e.arc(n.x,n.y,17,0,Math.PI*2),e.fill(),e.stroke(),e.fillStyle="#ffd6e7",e.beginPath(),e.arc(n.x-6,n.y-2,3.2,0,Math.PI*2),e.fill(),e.beginPath(),e.arc(n.x+6,n.y-2,3.2,0,Math.PI*2),e.fill();let r=!!t.cardEffects?.laborExploitation;e.fillStyle=r?w.danger:w.ink,e.beginPath(),e.arc(n.x-5,n.y-5,r?2.8:2.2,0,Math.PI*2),e.fill(),e.beginPath(),e.arc(n.x+5,n.y-5,r?2.8:2.2,0,Math.PI*2),e.fill(),e.strokeStyle=w.ink,e.lineWidth=r?3:2,e.beginPath(),e.arc(n.x,n.y+(r?0:1),r?8:7,.1*Math.PI,.9*Math.PI),e.stroke(),e.fillStyle=w.green,ee(e,n.x-9,n.y+14,18,8,!0,!0),e.strokeStyle=w.ink,e.lineWidth=3,e.beginPath(),e.moveTo(n.x-11,n.y+18),e.lineTo(n.x-20,n.y+24),e.stroke(),e.beginPath(),e.moveTo(n.x+11,n.y+18),e.lineTo(n.x+20,n.y+24),e.stroke(),e.fillStyle=w.ink,e.font="900 11px ui-monospace, monospace",e.textAlign="center",e.fillText("FIX",n.x,n.y+33),n.target?.label&&oo(e,n.x,n.y-24,n.target.label,w.green),e.restore()}function bd(e,t,n){e.save(),e.font="900 19px ui-monospace, monospace",e.textAlign="left",e.fillStyle=w.ink,e.font="900 19px ui-monospace, monospace",e.fillStyle=w.ink;let o=[];t.phase==="running"&&o.push(t.timeLeft<=0?"TIME UP: FARMS SHUT. CLEAR LINE.":"A/D: S1 \u2190/\u2192: S2"),t.phase==="build"&&o.push(`BUILD: ${t.buildTool||"SELECT"} | connect 1 EGG route to any exit`);let r=76;for(let i of o)e.strokeStyle=w.white,e.lineWidth=4,e.strokeText(i,24,r),e.fillText(i,24,r),r+=20;e.restore()}function qa({game:e,canvasPoint:t,updatePanels:n,equipmentAtPoint:o,fail:r,pointInGrid:i,rectOfFacility:a,rectsOverlap:c}){function b(x){return x?x.type==="conveyor"?`conveyor:${x.id||x.oldKey}`:x.type==="facility"?`facility:${x.id||x.ref?.id}`:x.type==="maintenanceRoom"?`maintenanceRoom:${x.id||x.ref?.id}`:`${x.type}:${x.id||x.ref?.id}`:""}function M(x){return x?x.type==="conveyor"?{type:"conveyor",id:x.oldKey}:{type:x.type,id:x.ref.id}:null}function C(x){let g=b(M(x));return(e.multiSelected||[]).some(D=>b(D)===g)}function $(x){return x?x.type==="eggFarm"?e.eggFarms.find(g=>g.id===x.id)||null:x.type==="scanner"?e.scanners.find(g=>g.id===x.id)||null:x.type==="facility"?e.facilities[x.id]||null:x.type==="maintenanceRoom"?(e.maintenanceRooms||[]).find(g=>g.id===x.id)||null:x.type==="conveyor"?e.conveyorTiles.has(x.id)?{type:"conveyor",id:x.id}:null:x.type==="powerWire"?e.powerWires?.has(x.id)?{type:"powerWire",id:x.id}:null:x.type==="footbridge"&&e.footbridges?.has(x.id)?{type:"footbridge",id:x.id}:null:null}function W(){let x=[];for(let g of e.conveyorTiles){let D=X(g),Z=B(D.col,D.row);x.push({type:"conveyor",id:g,center:Z,cell:D})}if(e.powerOverlay)for(let[g]of e.powerWires||new Map){let D=X(g);x.push({type:"powerWire",id:g,center:B(D.col,D.row),cell:D})}for(let[g]of e.footbridges||new Map){let D=X(g);x.push({type:"footbridge",id:g,center:B(D.col,D.row),cell:D})}for(let g of e.eggFarms)x.push({type:"eggFarm",id:g.id,ref:g,center:B(g.col,g.row),cell:{col:g.col,row:g.row}});for(let g of e.scanners)x.push({type:"scanner",id:g.id,ref:g,center:ge(g),cell:{col:g.col,row:g.row}});for(let g of e.maintenanceRooms||[]){let D=B(g.col,g.row);x.push({type:"maintenanceRoom",id:g.id,ref:g,center:{x:D.x+p.cell/2,y:D.y+p.cell/2},cell:{col:g.col,row:g.row}})}for(let g of Object.values(e.facilities)){let D={x:g.x+g.w/2,y:g.y+g.h/2},Z=g.entry?B(g.entry.col,g.entry.row):D;x.push({type:"facility",id:g.id,ref:g,center:D,portCenter:Z})}return x}function K(x,g){let D=Math.min(g.x1,g.x2),Z=Math.max(g.x1,g.x2),j=Math.min(g.y1,g.y2),le=Math.max(g.y1,g.y2);return x.x>=D&&x.x<=Z&&x.y>=j&&x.y<=le}function G(x){let g=[];for(let D of W())(K(D.center,x)||D.portCenter&&K(D.portCenter,x))&&g.push({type:D.type,id:D.id});return e.multiSelected=g,e.selected=g[0]||null,n(),g.length}function z(){e.multiSelected=[],e.selected=null,n()}function Q(x){let g=t(x);return e.selectionBox={x1:g.x,y1:g.y,x2:g.x,y2:g.y},e.multiSelected=[],e.selected=null,n(),!0}function ie(x){if(!e.selectionBox)return;let g=t(x);e.selectionBox.x2=g.x,e.selectionBox.y2=g.y}function J(){if(!e.selectionBox)return 0;let x=e.selectionBox,g=Math.abs(x.x2-x.x1),D=Math.abs(x.y2-x.y1);return e.selectionBox=null,g<6&&D<6?(z(),0):G(x)}function ae(x){let g=M(x);return g?(e.multiSelected||[]).length&&C(x)?[...e.multiSelected]:[g]:[]}function ye(x){let g=$(x);if(!g)return null;if(x.type==="conveyor"){let D=X(x.id);return{...x,obj:g,oldKey:x.id,currentKey:x.id,meta:e.conveyorMeta.get(x.id)||{price:Le("conveyor"),builtSession:null},col:D.col,row:D.row}}if(x.type==="powerWire"){let D=X(x.id);return{...x,obj:g,oldKey:x.id,currentKey:x.id,meta:{...e.powerWires?.get(x.id)||{}},col:D.col,row:D.row}}if(x.type==="footbridge"){let D=X(x.id),Z=e.footbridges?.get(x.id)||{},j=[];for(let[le,ce]of e.footbridges||new Map)if(Z.bridgeId&&ce.bridgeId===Z.bridgeId||le===x.id){let ve=X(le);j.push({key:le,dc:ve.col-D.col,dr:ve.row-D.row,meta:{...ce}})}return{...x,obj:g,oldKey:x.id,currentKey:x.id,meta:{...Z},cells:j,dragToken:`footbridge:${Z.bridgeId||x.id}`,col:D.col,row:D.row}}return x.type==="eggFarm"||x.type==="scanner"||x.type==="maintenanceRoom"?{...x,obj:g,col:g.col,row:g.row}:x.type==="facility"?g.gridPlaced?{...x,obj:g,gridPlaced:!0,col:g.col,row:g.row,x:g.x,y:g.y,w:g.w,h:g.h,entry:g.entry?{...g.entry}:null,side:g.side,center:{x:g.x+g.w/2,y:g.y+g.h/2}}:{...x,obj:g,gridPlaced:!1,x:g.x,y:g.y,w:g.w,h:g.h,entry:g.entry?{...g.entry}:null,side:g.side,center:{x:g.x+g.w/2,y:g.y+g.h/2}}:null}function L(x){let g=t(x),D=o(g);if(!D)return!1;let Z=ae(D),j=[],le=new Set;for(let ce of Z.map(ye).filter(Boolean)){let ve=ce.dragToken||b(ce);le.has(ve)||(le.add(ve),j.push(ce))}return j.length?(e.groupDrag={start:g,selections:Z,origins:j,historySnapshot:Xn(e),committed:!1,lastDCol:0,lastDRow:0},e.multiSelected=Z,e.selected=Z[0]||null,n(),!0):!1}function V(){!e.groupDrag||e.groupDrag.committed||(e.undoStack.push(e.groupDrag.historySnapshot),e.redoStack=[],e.groupDrag.committed=!0)}function se(x,g,D){let Z=E(x,g),j=it(e,x,g);if(j&&!D.has(`eggFarm:${j.id}`))return!0;let le=st(e,x,g);if(le&&!D.has(`scanner:${le.id}`))return!0;let ce=(e.maintenanceRooms||[]).find(Me=>xt(Me).some(Se=>Se.col===x&&Se.row===g));if(ce&&!D.has(`maintenanceRoom:${ce.id}`))return!0;let ve=bt(e,x,g);return!!(ve&&!D.has(`facility:${ve.id}`)||e.conveyorTiles.has(Z)&&!D.has(`conveyor:${Z}`))}function O(x,g,D){for(let Z of Object.values(e.facilities||{})){if(D.has(`facility:${Z.id}`))continue;let j=wt(e,Z),le=He(e,Z);if(j&&j.col===x&&j.row===g||le&&le.col===x&&le.row===g)return!0}return!1}function H(x,g,D,Z){let j=it(e,g,D);if(j&&!Z.has(`eggFarm:${j.id}`))return!0;let le=st(e,g,D);if(le&&!Z.has(`scanner:${le.id}`))return!0;let ce=(e.maintenanceRooms||[]).find(Me=>xt(Me).some(Se=>Se.col===g&&Se.row===D));if(ce&&!Z.has(`maintenanceRoom:${ce.id}`))return!0;let ve=bt(e,g,D);if(ve&&ve.id!==x.id&&!Z.has(`facility:${ve.id}`))return!0;for(let Me of Object.values(e.facilities||{})){if(Me.id===x.id||Z.has(`facility:${Me.id}`))continue;let Se=wt(e,Me),Ke=He(e,Me);if(Se&&Se.col===g&&Se.row===D||Ke&&Ke.col===g&&Ke.row===D)return!0}return!1}function oe(x,g,D,Z){let j=E(g,D);if(!i(g,D)||e.blockedCells?.has?.(j))return"Selection hits blocked ground";if(it(e,g,D)||st(e,g,D))return"Cell occupied";let le=(e.maintenanceRooms||[]).find(Me=>xt(Me).some(Se=>Se.col===g&&Se.row===D));if(le&&!Z.has(`maintenanceRoom:${le.id}`))return"Cell occupied";let ce=bt(e,g,D);if(ce&&!Z.has(`facility:${ce.id}`))return"Cell occupied";let ve=x.cells?.some(Me=>Me.key===j);return x.type==="powerWire"&&e.powerWires?.has(j)&&!Z.has(`powerWire:${j}`)?"Power wire already covers that cell":x.type==="footbridge"&&e.footbridges?.has(j)&&!Z.has(`footbridge:${j}`)&&!ve?"Footbridge already covers that cell":""}function ue(x,g,D){let Z=[];for(let j of e.groupDrag.origins){if(j.type!=="facility"||j.gridPlaced)continue;let le={x:j.center.x+x,y:j.center.y+g},{entry:ce,side:ve}=Lo(le,e);if(!i(ce.col,ce.row)||e.blockedCells?.has?.(E(ce.col,ce.row)))return!0;let Me={...j.obj,entry:{...ce},side:ve};Go(Me,ce,ve),Z.push({id:j.id,rect:a(Me)})}for(let j of Z)for(let le of Object.values(e.facilities))if(!D.has(`facility:${le.id}`)&&c(j.rect,a(le),12))return!0;for(let j=0;j<Z.length;j+=1)for(let le=j+1;le<Z.length;le+=1)if(c(Z[j].rect,Z[le].rect,12))return!0;return!1}function Ve(x){let g=new Set(Pt(x).map(D=>E(D.col,D.row)));for(let D of["left","right"]){let Z=We(x,D),j=E(Z.col,Z.row);if(!e.conveyorTiles.has(j))continue;let le=e.conveyorMeta.get(j);if(!le)continue;let ce=fe.find(Se=>Se.name===D),ve=fe.filter(Se=>{let Ke=E(Z.col+Se.dc,Z.row+Se.dr);return e.conveyorTiles.has(Ke)&&!g.has(Ke)}),Me=ve.find(Se=>Se.name===ce?.name)||ve[0]||ce;Me&&(le.dir=Me.name,le.outDirs=[Me.name],le.branchMode="random")}}function xe(x){if(!e.groupDrag)return;let g=t(x),D=g.x-e.groupDrag.start.x,Z=g.y-e.groupDrag.start.y;if(Math.hypot(D,Z)<3)return;let j=Math.round(D/p.cell),le=Math.round(Z/p.cell),ce=new Set(e.groupDrag.selections.map(b)),ve=new Set;for(let T of e.groupDrag.origins){if(T.type==="facility"&&!T.gridPlaced)continue;let ke=T.col+j,Ae=T.row+le;if(T.type==="powerWire"||T.type==="footbridge"){let Ce=T.type==="footbridge"&&T.cells?.length?T.cells.map(Ue=>({col:ke+Ue.dc,row:Ae+Ue.dr})):[{col:ke,row:Ae}];for(let Ue of Ce){let St=oe(T,Ue.col,Ue.row,ce);if(St)return r(St);let et=`${T.type}:${E(Ue.col,Ue.row)}`;if(ve.has(et))return r("Selection overlap");ve.add(et)}continue}let ot=T.type==="scanner"?Pt({col:ke,row:Ae}):T.type==="maintenanceRoom"?xt({col:ke,row:Ae}):T.type==="facility"?gn({...T.obj,col:ke,row:Ae}):[{col:ke,row:Ae}];for(let Ce of ot){if(!i(Ce.col,Ce.row))return r("Selection outside grid");if(e.blockedCells?.has?.(E(Ce.col,Ce.row)))return r("Selection hits blocked ground");let Ue=E(Ce.col,Ce.row);if(ve.has(Ue))return r("Selection overlap");if(se(Ce.col,Ce.row,ce))return r("Cell occupied");if(T.type!=="conveyor"&&O(Ce.col,Ce.row,ce))return r("Machine port must remain open");ve.add(Ue)}if(T.type==="facility"&&T.gridPlaced){let Ce={...T.obj,col:ke,row:Ae},Ue={col:ke-1,row:Ae+Math.floor((Ce.hCells||3)/2)},St={col:ke+(Ce.wCells||3),row:Ae+Math.floor((Ce.hCells||3)/2)};for(let et of[Ue,St]){if(!i(et.col,et.row)||e.blockedCells?.has?.(E(et.col,et.row)))return r("Machine port outside usable grid");if(H(T.obj,et.col,et.row,ce))return r("Machine port is occupied")}}}if(ue(D,Z,ce))return r("Facility overlap");V();let Me=e.groupDrag.origins.filter(T=>T.type==="conveyor");for(let T of Me){let ke=T.currentKey||T.oldKey;e.conveyorTiles.delete(ke),e.conveyorMeta.delete(ke)}for(let T of Me){let ke=E(T.col+j,T.row+le);e.conveyorTiles.add(ke),e.conveyorMeta.set(ke,T.meta||{price:Le("conveyor"),builtSession:null,uses:0}),T.currentKey=ke}let Se=e.groupDrag.origins.filter(T=>T.type==="powerWire");for(let T of Se)e.powerWires.delete(T.currentKey||T.oldKey);for(let T of Se){let ke=E(T.col+j,T.row+le);e.powerWires.set(ke,T.meta||{}),T.currentKey=ke}let Ke=e.groupDrag.origins.filter(T=>T.type==="footbridge");for(let T of Ke)for(let ke of T.cells||[{key:T.currentKey||T.oldKey}])e.footbridges.delete(ke.key);for(let T of Ke){let ke=E(T.col+j,T.row+le);for(let Ae of T.cells||[{dc:0,dr:0,meta:T.meta||{}}]){let ot=E(T.col+j+(Ae.dc||0),T.row+le+(Ae.dr||0));e.footbridges.set(ot,{...Ae.meta||T.meta||{}})}T.currentKey=ke}for(let T of e.groupDrag.origins)if(T.type==="eggFarm")T.obj.col=T.col+j,T.obj.row=T.row+le;else if(T.type==="scanner")T.obj.col=T.col+j,T.obj.row=T.row+le,Ve(T.obj);else if(T.type==="maintenanceRoom")T.obj.col=T.col+j,T.obj.row=T.row+le;else if(T.type==="facility"&&T.gridPlaced)T.obj.col=T.col+j,T.obj.row=T.row+le,Cn(T.obj);else if(T.type==="facility"){let ke={x:T.center.x+D,y:T.center.y+Z},{entry:Ae,side:ot}=Lo(ke,e);Go(T.obj,Ae,ot)}e.groupDrag.selections=e.groupDrag.origins.map(T=>["conveyor","powerWire","footbridge"].includes(T.type)?{type:T.type,id:T.currentKey||T.oldKey}:{type:T.type,id:T.id}),e.multiSelected=[...e.groupDrag.selections],e.selected=e.multiSelected[0]||null,Ee(e),e.groupDrag.origins.some(T=>T.type!=="powerWire")&&(e.walkabilityVersion=(e.walkabilityVersion||0)+1),e.groupDrag.origins.some(T=>T.type==="powerWire"||T.type!=="conveyor"&&T.type!=="footbridge")&&Ye(e),n()}function Ge(){e.groupDrag&&(Ee(e),e.groupDrag=null,n())}return{selectionFromHit:M,startSelectionBox:Q,updateSelectionBox:ie,finishSelectionBox:J,startGroupDrag:L,updateGroupDrag:xe,finishGroupDrag:Ge}}function Kt(e){return Vt(e)*(_.facilities.boostConveyor.speedMultiplier||2)/Math.max(1,_.conveyor.minimumItemSpacingPx||25)}function io(e,t,n){let o=Math.max(_.farmQuality.safeMinIntervalSeconds,Number(n)||1),r=(t.zundaBoostTime||0)>0?_.farmQuality.zundaIntervalMultiplier:1;return 1/Math.max(_.farmQuality.safeMinIntervalSeconds,o*r)}function so(e,t){let n=_.farmQuality,o=Math.max(1e-4,t),r=Math.max(0,e/o-1);return Math.max(n.minMultiplier,Math.min(n.maxMultiplier,1+n.overflowCoefficient*Math.pow(r,n.overflowExponent)))}function za(e,t){return 1/Math.max(1e-4,Math.min(e,t))}function Ha(e){return e>=1.75?"Luxury":e>=1.35?"Premium":e>=1.15?"Select":"Standard"}function Ya(e,t){let n=t.zundaBoostTime||0;t.zundaBoostTime=Math.min(_.farmQuality.zundaMaxSeconds,n+_.farmQuality.zundaSeconds);let o=Math.max(0,t.zundaBoostTime-n);e.stats.zundaConsumed=(e.stats.zundaConsumed||0)+1,e.stats.zundaBoostSeconds=(e.stats.zundaBoostSeconds||0)+o,e.totals.zundaConsumed=(e.totals.zundaConsumed||0)+1,e.totals.zundaBoostSeconds=(e.totals.zundaBoostSeconds||0)+o,e.stats.zundaBoostSecondsByFarm=e.stats.zundaBoostSecondsByFarm||{},e.stats.zundaBoostSecondsByFarm[t.id]=(e.stats.zundaBoostSecondsByFarm[t.id]||0)+o}function Qa({game:e,ui:t,canvas:n,canvasPoint:o,onUpdatePanels:r}){function i(){r&&r()}let a=null,c=!1,b=null,M=!1,C=["random","up","right","down","left"],$={random:"RND",up:"\u25B2",right:"\u25B6",down:"\u25BC",left:"\u25C0"},W={w:40,h:40,y:0};function K(){return Co(e)}function G(){e.gridCols=p.cols,e.gridRows=p.rows,e.gridOwnedCells=ji(e)}function z(s){if(s){p.y-=s*p.cell,p.rows+=s,e.gridChunkOriginY=(e.gridChunkOriginY||0)-Math.floor(s/10),e.ownedCells=go(e.ownedCells,s),e.blockedCells=go(e.blockedCells,s),e.conveyorTiles=go(e.conveyorTiles,s),e.conveyorMeta=xo(e.conveyorMeta,s),e.powerWires=xo(e.powerWires||new Map,s),e.footbridges=xo(e.footbridges||new Map,s);for(let l of e.eggFarms||[])l.row+=s;for(let l of e.scanners||[])l.row+=s;for(let l of Object.values(e.facilities||{}))l.gridPlaced?(l.row+=s,Cn(l)):l.entry&&(l.entry.row+=s)}}function Q(s){if(s){p.x-=s*p.cell,p.cols+=s,e.gridChunkOriginX=(e.gridChunkOriginX||0)-Math.floor(s/10),e.ownedCells=To(e.ownedCells,s),e.blockedCells=To(e.blockedCells,s),e.conveyorTiles=To(e.conveyorTiles,s),e.conveyorMeta=Eo(e.conveyorMeta,s),e.powerWires=Eo(e.powerWires||new Map,s),e.footbridges=Eo(e.footbridges||new Map,s);for(let l of e.eggFarms||[])l.col+=s;for(let l of e.scanners||[])l.col+=s;for(let l of e.maintenanceRooms||[])l.col+=s;for(let l of Object.values(e.facilities||{}))l.gridPlaced?(l.col+=s,Cn(l)):l.entry&&(l.entry.col+=s)}}function ie(s){e.ownedCells=e.ownedCells||new Set;for(let l of es(s))e.ownedCells.add(E(l.col,l.row))}function J(s){return e.phase!=="build"||e.cardDraft?.pending||e.cardTargetPick?.pending?null:jt(e).map(l=>L(l)).find(l=>l&&Zi(l,s))||null}function ae(s){let l=Et(s);return{x:l.x,y:l.y,w:l.w,h:l.h}}function ye(s){let l=ae(s);return Object.values(e.facilities||{}).some(y=>{let h=y?.baseId||y?.id;return!vo.includes(h)||y.gridPlaced?!1:ue(l,oe(y),0)})}function L(s){if(!s)return null;let l=ye(s);return{...s,disabled:l,disabledReason:l?"Move edge facilities before buying this lot.":""}}function V(s="right"){if(s&&typeof s=="object"&&Number.isFinite(s.chunkX)&&Number.isFinite(s.chunkY))return s;let l=["left","right","up","down"].includes(s)?s:"right";return Ji(e,l)}function se(s="right"){let l=V(s);if(e.phase!=="build"||e.cardDraft?.pending||e.cardTargetPick?.pending)return{ok:!1,reason:"Cannot expand now."};if(!l)return{ok:!1,reason:"Invalid expansion lot."};if(ye(l)){let $e="Move edge facilities before buying this lot.";return T($e),{ok:!1,reason:$e}}let y=l.direction||"right",h=K();if(e.cash<h){let $e=`Need ${R(h-e.cash)} more.`;return T($e),{ok:!1,reason:$e}}Oe(e),Ct(e,h),e.gridExpansionPurchasesByDirection||(e.gridExpansionPurchasesByDirection={left:0,right:0,up:0,down:0});let m=e.gridChunkOriginY||0,P=e.gridChunkOriginX||0;if(l.chunkX<P){let $e=P-l.chunkX;Q($e*(_.grid.expansion?.colsPerPurchase||10))}if(l.chunkY<m){let $e=m-l.chunkY;z($e*(_.grid.expansion?.rowsPerPurchase||10))}let F=xr(e,l.chunkX,l.chunkY,y);F.colStart+F.cols>p.cols&&(p.cols=F.colStart+F.cols),F.rowStart+F.rows>p.rows&&(p.rows=F.rowStart+F.rows),ie(F),ts(e,F.chunkX,F.chunkY),e.gridExpansionPurchases=(e.gridExpansionPurchases||0)+1,e.gridExpansionPurchasesByDirection[y]=(e.gridExpansionPurchasesByDirection[y]||0)+1,G();let q=Ki(e.gridExpansionPurchases,{base:_.map.blockedRatio??0,increment:_.map.blockedExpansionIncrement??.0075,max:_.map.blockedRatioMax??.12}),be=zi({seed:`${e.runSeed}:grid-expansion:${F.chunkX},${F.chunkY}:${e.gridExpansionPurchases}`,colStart:F.colStart,colEnd:F.colStart+F.cols,rowStart:F.rowStart,rowEnd:F.rowStart+F.rows,targetRatio:q});for(let $e of be)e.blockedCells.add($e);Ee(e);let Pe=F.cols*F.rows,we=Et(F);return Y(e,we.x+we.w/2,we.y+we.h/2,`${y.toUpperCase()} +${Pe} CELLS -${R(h)}`,w.green),i(),{ok:!0,direction:y,cost:h,addedCells:Pe,blocked:be.size,blockedRatio:q,chunkX:F.chunkX,chunkY:F.chunkY}}function O(s,l){return s>=0&&s<p.cols&&l>=0&&l<p.rows&&je(e,s,l)}function H(s,l){return!je(e,s,l)||e.blockedCells?.has?.(E(s,l))}function oe(s){return{x:s.x,y:s.y,w:s.w,h:s.h}}function ue(s,l,y=10){return!(s.x+s.w+y<=l.x||l.x+l.w+y<=s.x||s.y+s.h+y<=l.y||l.y+l.h+y<=s.y)}function Ve(s,l=new Set){let y=oe(s);return Object.values(e.facilities).some(h=>!l.has(h.id)&&ue(y,oe(h),12))}function xe(s,l,y=null){if(!O(s,l))return!1;if(H(s,l))return!0;let h=E(s,l),m=it(e,s,l);if(m&&!(y?.type==="eggFarm"&&y.ref?.id===m.id))return!0;let P=st(e,s,l);if(P&&!(y?.type==="scanner"&&y.ref?.id===P.id))return!0;let F=x(e,s,l);if(F&&!(y?.type==="maintenanceRoom"&&y.ref?.id===F.id))return!0;let q=bt(e,s,l);return!!(q&&!(y?.type==="facility"&&y.ref?.id===q.id)||e.conveyorTiles.has(h)&&!(y?.type==="conveyor"&&y.oldKey===h))}function Ge(s,l,y=null){return Object.values(e.facilities||{}).find(h=>{if(y?.type==="facility"&&y.ref?.id===h.id)return!1;let m=wt(e,h),P=He(e,h);return m&&m.col===s&&m.row===l||P&&P.col===s&&P.row===l})||null}function x(s,l,y){return(s.maintenanceRooms||[]).find(h=>xt(h).some(m=>m.col===l&&m.row===y))||null}function g(s,l,y=null){let h={col:s,row:l};for(let m of xt(h)){if(!O(m.col,m.row)||H(m.col,m.row))return!0;let P=E(m.col,m.row);if(it(e,m.col,m.row)||st(e,m.col,m.row))return!0;let be=x(e,m.col,m.row);if(be&&!(y?.type==="maintenanceRoom"&&y.ref?.id===be.id)||bt(e,m.col,m.row)||Ge(m.col,m.row,y)||e.conveyorTiles.has(P))return!0}return!1}function D(s,l,y=null){let h={col:s,row:l};for(let m of Pt(h)){if(!O(m.col,m.row)||H(m.col,m.row))return!0;let P=E(m.col,m.row);if(it(e,m.col,m.row))return!0;let q=st(e,m.col,m.row);if(q&&!(y?.type==="scanner"&&y.ref?.id===q.id)||bt(e,m.col,m.row)||Ge(m.col,m.row,y)||e.conveyorTiles.has(P))return!0}return!1}function Z(s,l,y,h=null){let m=_.facilities[s]||{},P={baseId:s,id:s,gridPlaced:!0,col:l,row:y,wCells:m.footprint?.cols||(s==="sausageMaker"?3:1),hCells:m.footprint?.rows||(s==="sausageMaker"?3:1)};for(let F of gn(P))if(!O(F.col,F.row)||H(F.col,F.row)||xe(F.col,F.row,h)||Ge(F.col,F.row,h))return!0;if(s==="sausageMaker"||s==="biomassGenerator"||s==="coalGenerator"){let F={col:l-1,row:y+1},q={col:l+(P.wCells||1),row:y+1},be=[F,{col:l+1,row:y-1},{col:l+1,row:y+(P.hCells||3)}],Pe=s==="sausageMaker"?[F,q]:s==="biomassGenerator"?be:[F];for(let we of Pe){if(!O(we.col,we.row)||H(we.col,we.row))return!0;let $e=bt(e,we.col,we.row);if($e&&$e.id!==h?.ref?.id||it(e,we.col,we.row)||st(e,we.col,we.row)||x(e,we.col,we.row)||Ge(we.col,we.row,h))return!0}}return!1}function j(){return e.selected?e.selected.type==="eggFarm"?e.eggFarms.find(s=>s.id===e.selected.id)||null:e.selected.type==="scanner"?e.scanners.find(s=>s.id===e.selected.id)||null:e.selected.type==="conveyor"?e.conveyorTiles.has(e.selected.id)?{type:"conveyor",id:e.selected.id}:null:e.selected.type==="powerWire"?e.powerWires?.has(e.selected.id)?{type:"powerWire",id:e.selected.id}:null:e.selected.type==="footbridge"?e.footbridges?.has(e.selected.id)?{type:"footbridge",id:e.selected.id}:null:e.selected.type==="facility"?e.facilities[e.selected.id]||null:e.selected.type==="maintenanceRoom"&&(e.maintenanceRooms||[]).find(s=>s.id===e.selected.id)||null:null}function le(s){return s?s.type==="eggFarm"?`${ht("eggFarm")} #${s.id}`:s.type==="scanner"?`${s.kind==="auto"?ht("autoScanner"):ht("manualScanner")} #${s.id}`:s.type==="conveyor"?e.conveyorMeta.get(s.id)?.kind==="boostConveyor"?ht("boostConveyor"):ht("conveyor"):s.type==="powerWire"?e.powerWires?.get(s.id)?.kind==="insulatedPowerWire"?ht("insulatedPowerWire"):ht("powerWire"):s.type==="footbridge"?ht("footbridge"):s.type==="facility"?s.name:s.type==="maintenanceRoom"?`${ht("maintenanceRoom")} #${s.id}`:"Equipment":"Equipment"}function ce(s){return s?.type==="conveyor"?e.conveyorMeta?.get(s.oldKey||s.ref?.id)?.price||Oo(s):s?.type==="powerWire"?e.powerWires?.get(s.oldKey||s.ref?.id)?.price||0:s?.type==="footbridge"?e.footbridges?.get(s.oldKey||s.ref?.id)?.price||_.facilities.footbridge.price:Oo(s)}function ve(){return!!e.cardEffects?.usedMachineActive}function Me(){return ve()?{usedMachine:!0,noRefund:!0,durabilityBaseMultiplier:.6}:{usedMachine:!1,noRefund:!1,durabilityBaseMultiplier:1}}function Se(s){let l=Me();return Object.assign(s,l),s}function Ke(s){let l=s?.ref||s||{};if(l.unsellable||(l.baseId||l.id)==="starterGenerator")return"Starter Generator cannot be sold.";if(s?.type==="eggFarm"||l.type==="eggFarm")return e.eggFarms.length<=1?"Cannot sell the last EGG FARM.":"";if((s?.type==="facility"||l.type==="facility")&&["mixer","trash","truck"].includes(l.baseId||l.id)){let y=l.baseId||l.id;if(Object.values(e.facilities).filter(m=>(m.baseId||m.id)===y).length<=1)return`Cannot sell the last ${l.shortName||l.name||l.id}.`}return""}function T(s){t.buildStatus.textContent=s,Y(e,n.width/2-e.view.x,86-e.view.y,s.toUpperCase(),w.danger)}function ke(s){if(!s)return null;let l=E(s.col,s.row);return e.conveyorMeta.get(l)||null}function Ae(s){return s?(Array.isArray(s.outDirs)||(s.outDirs=[]),s.outDirs=[...new Set(s.outDirs.filter(l=>["right","left","down","up"].includes(l)))],C.includes(s.branchMode)||(s.branchMode="random"),s.kind||(s.kind="conveyor"),s.speedMultiplier||(s.speedMultiplier=s.kind==="boostConveyor"?2:1),s.outDirs):[]}function ot(s){return s?fe.filter(l=>e.conveyorTiles.has(E(s.col+l.dc,s.row+l.dr))).map(l=>l.name):[]}function Ce(s){return ot(s).length>=3}function Ue(s,l){let y=fe.find(q=>q.name===l);if(!s||!y)return!1;let h=E(s.col+y.dc,s.row+y.dr),m=e.conveyorMeta.get(h);if(!m)return!1;let P=y.opposite;return[...new Set([...Array.isArray(m.outDirs)?m.outDirs:[],m.dir].filter(Boolean))].includes(P)}function St(s,l){let y=ot(s);if(y.length!==1)return null;let h=y[0];return l.includes(h)&&Ue(s,h)?h:null}function et(s){if(!e.conveyorTiles.has(s))return[];let l=X(s),y=e.conveyorMeta.get(s),h=Ae(y),m=ot(l),P=[...new Set([...h,y?.dir].filter(Boolean))].filter(we=>m.includes(we)),F=m,q=P.length?P:F,be=St(l,q),Pe=P.length?P.filter(we=>we!==be):F.filter(we=>we!==be);return y&&(y.outDirs=h.filter(we=>m.includes(we)),y.dir&&!m.includes(y.dir)&&(y.dir=y.outDirs[0]||null),y.branchMode!=="random"&&!m.includes(y.branchMode)&&(y.branchMode="random")),Pe}function Ln(s){if(!e.conveyorTiles.has(s))return[];let l=X(s),y=ot(l);return Ce(l)?y:et(s)}function Ht(s){let l=X(s),y=Ln(s);if(y.length<3)return[];let h=e.conveyorMeta.get(s)||{},m=new Set(y.filter(q=>Ue(l,q))),P=y.filter(q=>!m.has(q));if(m.size)return P.length>=2?P:[];let F=[...new Set([...Array.isArray(h.outDirs)?h.outDirs:[],h.dir].filter(Boolean))].filter(q=>y.includes(q));return F.length>=2?F:y}function lo(s,l){let y=Tt(s,l);if(!y)return!1;let h=E(s.col,s.row),m=E(l.col,l.row),P=e.conveyorMeta.get(h),F=e.conveyorMeta.get(m);if(!P||!F)return!1;let q=Ae(P),be=!q.includes(y)||P.dir!==y||!F.dir;return q.includes(y)||q.push(y),P.dir=y,F.dir||(F.dir=y),be}function co(s){if(pt(s).length===0)return Nn(s);let l=ir(s);return l.length<2?Nn(s):(Oe(e),sr(l),Ee(e),i(),!0)}function Nn(s){if(!s)return!1;let l=E(s.col,s.row),y=e.conveyorMeta.get(l);if(!y||Ce(s))return!1;let h=St(s,fe.map(q=>q.name)),m=fe.map(q=>q.name).filter(q=>q!==h),P=y.dir&&m.includes(y.dir)?y.dir:null,F=m[(Math.max(-1,m.indexOf(P))+1)%m.length];return Oe(e),y.dir=F,y.outDirs=[F],y.branchMode="random",Ee(e),i(),!0}function pt(s){return s?fe.map(l=>({col:s.col+l.dc,row:s.row+l.dr})).filter(l=>e.conveyorTiles.has(E(l.col,l.row))):[]}function ir(s){if(!s||!e.conveyorTiles.has(E(s.col,s.row))||Ce(s))return[];let l=pt(s);if(!l.length||l.length>2)return[];let y=P=>{let F=[],q=new Set([E(s.col,s.row)]),be=s,Pe=P,we=0;for(;Pe&&we<200;){we+=1;let $e=E(Pe.col,Pe.row);if(q.has($e)||(q.add($e),F.push(Pe),Ce(Pe)))break;let Ri=pt(Pe).filter(Ii=>!(Ii.col===be.col&&Ii.row===be.row));if(Ri.length!==1)break;be=Pe,Pe=Ri[0]}return F},h=l[0]?y(l[0]).reverse():[],m=l[1]?y(l[1]):[];return[...h,s,...m]}function uo(s,l){return!!s&&[...new Set([...Array.isArray(s.outDirs)?s.outDirs:[],s.dir].filter(Boolean))].includes(l)}function sr(s){let l=0,y=0;for(let m=0;m<s.length-1;m+=1){let P=s[m],F=s[m+1],q=Tt(P,F),be=Tt(F,P);uo(e.conveyorMeta.get(E(P.col,P.row)),q)&&(l+=1),uo(e.conveyorMeta.get(E(F.col,F.row)),be)&&(y+=1)}let h=l>y?[...s].reverse():s;for(let m=0;m<h.length-1;m+=1){let P=h[m];if(Ce(P))continue;let F=h[m+1],q=e.conveyorMeta.get(E(P.col,P.row)),be=Tt(P,F);!q||!be||(q.dir=be,q.outDirs=[be],q.branchMode="random")}if(h.length>=2){let m=h[h.length-2],P=h[h.length-1];if(!Ce(P)){let F=e.conveyorMeta.get(E(P.col,P.row)),q=Tt(m,P);F&&q&&(F.dir=q,F.outDirs=[q],F.branchMode="random")}}}function fo(){return _.facilities[e.buildTool==="boostConveyor"?"boostConveyor":"conveyor"]}function Gn(s,l=null){if(!s)return{ok:!1,reason:pe.fail.outOfGrid};let{col:y,row:h}=s,m=E(y,h);if(e.conveyorTiles.has(m))return{ok:!1,exists:!0};if(H(y,h))return{ok:!1,reason:"Cannot build on blocked ground."};if(xe(y,h))return{ok:!1,reason:pe.fail.cellOccupied};let P=fo(),F=P.id||"conveyor",q=Le(F,e);if(e.cash<q)return{ok:!1,reason:pe.fail.notEnoughCash};Oe(e),Ct(e,q),e.conveyorTiles.add(m);let be=Me();return e.conveyorMeta.set(m,{price:q,builtSession:e.buildSession,uses:0,durability:qo(e,"conveyor",be.durabilityBaseMultiplier),maintenanceType:"conveyor",kind:F,speedMultiplier:P.speedMultiplier||1,dir:l||null,outDirs:[],branchMode:"random",...be}),e.selected={type:"conveyor",id:m},Y(e,B(y,h).x,B(y,h).y,`-${R(q)}`,w.ink),{ok:!0,cell:s,key:m}}function Yt(s){if(!s)return T(pe.fail.outOfGrid);let l=E(s.col,s.row),y=e.conveyorTiles.has(l),h=a;if(h&&h.col===s.col&&h.row===s.row)return;if(h&&(M=!0),y){h&&lo(h,s)&&(c||(Oe(e),c=!0),Ee(e)),e.selected={type:"conveyor",id:l},a={col:s.col,row:s.row};return}let m=h?Tt(h,s):null,P=Gn(s,m);if(!P.ok)return T(P.reason||pe.fail.cellOccupied);h&&lo(h,s),a={col:s.col,row:s.row},Ee(e)}function ar(s,l){if(!s||!l)return l;let y=l.col-s.col,h=l.row-s.row;return y===0&&h===0?s:Math.abs(y)>=Math.abs(h)?{col:s.col+Math.sign(y),row:s.row}:{col:s.col,row:s.row+Math.sign(h)}}function lr(s){c=!1,b=s?{col:s.col,row:s.row}:null,M=!1,a=null,Yt(s)}function cr(s){if(!s)return;if(!a)return Yt(s);let l=a,y=0;for(;(l.col!==s.col||l.row!==s.row)&&y<64;){let h=ar(l,s);if(Yt(h),l=a||h,y+=1,!a)break}}function Qt(){!M&&b&&e.conveyorTiles.has(E(b.col,b.row))&&co(b),b=null,M=!1,a=null,c=!1}function Xt(s,l){return!O(s,l)||H(s,l)||it(e,s,l)||st(e,s,l)||x(e,s,l)||bt(e,s,l)}function dn(s,l){if(!s)return{ok:!1,reason:pe.fail.outOfGrid};if(Xt(s.col,s.row))return{ok:!1,reason:"Power wire cannot cross equipment or blocked ground."};let y=E(s.col,s.row),h=_.power.wires[l]?.price||Le(l,e),m=e.powerWires?.get(y),P=m&&_.power.wires[m.kind]?.price||0,F=h-P;return F>0&&e.cash<F?{ok:!1,reason:pe.fail.notEnoughCash}:(Oe(e),F>0&&Ct(e,F),F<0&&Qr(e,-F),e.powerWires=e.powerWires||new Map,e.powerWires.set(y,{kind:l,price:h,builtSession:e.buildSession}),Ye(e),e.selected={type:"powerWire",id:y},i(),{ok:!0})}function ur(s){if(!s)return T(pe.fail.outOfGrid);let l=(e.footbridgeOrientation||"vertical")!=="horizontal",y=l?[s.row-1,s.row,s.row+1].map(P=>({col:s.col,row:P})):[s.col-1,s.col,s.col+1].map(P=>({col:P,row:s.row}));if(y.some(P=>Xt(P.col,P.row)))return T("Footbridge cannot cross equipment or blocked ground.");if(y.some(P=>e.footbridges?.has(E(P.col,P.row))))return T("Footbridge already covers that cell.");let h=Le("footbridge",e);if(e.cash<h)return T(pe.fail.notEnoughCash);let m=`footbridge:${e.nextId++}`;Oe(e),Ct(e,h),e.footbridges=e.footbridges||new Map;for(let P of y)e.footbridges.set(E(P.col,P.row),{kind:"footbridge",bridgeId:m,orientation:l?"vertical":"horizontal",price:h,builtSession:e.buildSession});e.walkabilityVersion=(e.walkabilityVersion||0)+1,e.selected={type:"footbridge",id:E(s.col,s.row)},i()}function po(s){if(!s)return T(pe.fail.outOfGrid);let{col:l,row:y}=s;if(e.buildTool==="conveyor"||e.buildTool==="boostConveyor"){let h=Gn(s,null);if(!h.ok)return T(h.reason||pe.fail.cellOccupied);Ee(e);return}if(e.buildTool==="powerWire"||e.buildTool==="insulatedPowerWire"){let h=dn(s,e.buildTool);return h.ok?void 0:T(h.reason||pe.fail.cellOccupied)}if(e.buildTool==="footbridge")return ur(s);if(H(l,y))return T("Cannot build on blocked ground.");if(Ge(l,y)&&!["conveyor","boostConveyor"].includes(e.buildTool))return T("Machine port must remain open for a conveyor.");if(e.buildTool==="maintenanceRoom")return g(l,y)?T(pe.fail.cellOccupied):fr(l,y);if(So.includes(e.buildTool))return Z(e.buildTool,l,y)?T("3x3 machine or its ports do not fit here."):f(l,y,e.buildTool);if(e.buildTool==="manualScanner"||e.buildTool==="autoScanner"?D(l,y):xe(l,y))return T(pe.fail.cellOccupied);e.buildTool==="eggFarm"?dr(l,y):e.buildTool==="manualScanner"?pn(l,y,"manual"):e.buildTool==="autoScanner"&&pn(l,y,"auto")}function fn(s){let l=rt(s.x,s.y);if(["conveyor","boostConveyor","powerWire","insulatedPowerWire","footbridge","eggFarm","manualScanner","autoScanner","maintenanceRoom",...So.filter(y=>y!=="starterGenerator")].includes(e.buildTool))return po(l);if(vo.includes(e.buildTool))return v(s,e.buildTool)}function dr(s,l){let y=Le("eggFarm",e);if(e.cash<y)return T(pe.fail.notEnoughCash);Oe(e),Ct(e,y);let h=Se(Xs(e,s,l));h.price=y,e.eggFarms.push(h),Ee(e),e.selected={type:"eggFarm",id:h.id},Y(e,B(s,l).x,B(s,l).y,`-${R(y)}`,w.ink)}function pn(s,l,y){if(y==="manual"&&e.scanners.filter(P=>P.kind==="manual").length>=8)return T("Manual Scanner limit reached (8 max).");let h=y==="auto"?Le("autoScanner",e):Le("manualScanner",e);if(e.cash<h)return T(pe.fail.notEnoughCash);if(D(s,l))return T(pe.fail.cellOccupied);Oe(e),Ct(e,h);let m=Se(js(e,s,l,y));m.price=h,e.scanners.push(m),Ee(e),e.selected={type:"scanner",id:m.id},Y(e,B(s,l).x,B(s,l).y,`-${R(h)}`,w.ink)}function fr(s,l){let y=Le("maintenanceRoom",e);if(e.cash<y)return T(pe.fail.notEnoughCash);if(g(s,l))return T(pe.fail.cellOccupied);Oe(e),Ct(e,y);let h=Se(ea(e,s,l));h.price=y,e.maintenanceRooms=e.maintenanceRooms||[],e.maintenanceRooms.push(h),Ye(e),e.walkabilityVersion=(e.walkabilityVersion||0)+1,e.selected={type:"maintenanceRoom",id:h.id};let m=u(h);Y(e,m.x,m.y,`-${R(y)}`,w.ink)}function u(s){let l=B(s.col,s.row);return{x:l.x+p.cell/2,y:l.y+p.cell/2}}function f(s,l,y){let h=Le(y,e);if(e.cash<h)return T(pe.fail.notEnoughCash);if(Z(y,s,l))return T("3x3 machine or its ports do not fit here.");let m=Se(Zs(e,y,s,l,h)),P=e.facilities[y]?`${y}:${e.nextId++}`:y;m.baseId=y,m.id=P,Oe(e),Ct(e,h),e.facilities[P]=m,Ee(e),Ye(e),e.walkabilityVersion=(e.walkabilityVersion||0)+1,e.selected={type:"facility",id:P},Y(e,m.x+m.w/2,m.y+m.h/2,`-${R(h)}`,w.ink)}function v(s,l){let y=Le(l,e);if(e.cash<y)return T(pe.fail.notEnoughCash);let h=Se(Js(e,l,s,y)),m=e.facilities[l]?`${l}:${e.nextId++}`:l;if(h.baseId=l,h.id=m,h.entry&&H(h.entry.col,h.entry.row))return T("Receiver cell is blocked.");if(h.entry&&(it(e,h.entry.col,h.entry.row)||st(e,h.entry.col,h.entry.row)||x(e,h.entry.col,h.entry.row)||bt(e,h.entry.col,h.entry.row)))return T("Receiver cell must remain free of equipment. A conveyor may occupy it.");if(Ve(h))return T(pe.fail.facilityOverlap);Oe(e),Ct(e,y),e.facilities[m]=h,Ee(e),Ye(e),e.walkabilityVersion=(e.walkabilityVersion||0)+1,e.selected={type:"facility",id:m},Y(e,s.x,s.y-14,`-${R(y)}`,w.ink)}function k(s,l,y){let h=Ut(s,e);if(h.amount<=0)return;Qr(e,h.amount);let m=h.sameBuild?"REFUND":"SOLD";Y(e,l,y-16,`${m} +${R(h.amount)}`,w.green)}function S(s){let l=I(s);if(!l)return T(pe.fail.nothingToErase);let y=Ke(l);if(y)return T(y);if(Oe(e),l.type==="footbridge"){let h=X(l.oldKey),m=B(h.col,h.row);k(l,m.x,m.y);let P=e.footbridges.get(l.oldKey)?.bridgeId;for(let[F,q]of e.footbridges||new Map)(!P||q.bridgeId===P)&&e.footbridges.delete(F);e.walkabilityVersion=(e.walkabilityVersion||0)+1,ct(e,m.x,m.y)}else if(l.type==="powerWire"){let h=X(l.oldKey),m=B(h.col,h.row);k(l,m.x,m.y),e.powerWires.delete(l.oldKey),Ye(e),ct(e,m.x,m.y)}else if(l.type==="conveyor"){let h=X(l.oldKey),m=B(h.col,h.row);k(l,m.x,m.y),e.conveyorTiles.delete(l.oldKey),e.conveyorMeta.delete(l.oldKey),ct(e,m.x,m.y),Ee(e),e.walkabilityVersion=(e.walkabilityVersion||0)+1}else if(l.type==="eggFarm"){let h=B(l.ref.col,l.ref.row);k(l,h.x,h.y),e.eggFarms=e.eggFarms.filter(m=>m.id!==l.ref.id),ct(e,h.x,h.y),Ee(e),e.walkabilityVersion=(e.walkabilityVersion||0)+1}else if(l.type==="scanner"){let h=ge(l.ref);k(l,h.x,h.y),e.scanners=e.scanners.filter(m=>m.id!==l.ref.id),ct(e,h.x,h.y),Ee(e),Ye(e),e.walkabilityVersion=(e.walkabilityVersion||0)+1}else if(l.type==="facility"){let h=l.ref;k(l,h.x+h.w/2,h.y+h.h/2),delete e.facilities[h.id],ct(e,h.x+h.w/2,h.y+h.h/2),Ee(e),Ye(e),e.walkabilityVersion=(e.walkabilityVersion||0)+1}else if(l.type==="maintenanceRoom"){let h=l.ref,m=u(h);k(l,m.x,m.y),e.maintenanceRooms=(e.maintenanceRooms||[]).filter(P=>P.id!==h.id),ct(e,m.x,m.y),Ye(e),e.walkabilityVersion=(e.walkabilityVersion||0)+1}e.selected=null,e.multiSelected=[],i()}function I(s){let l=Object.values(e.facilities).find(q=>{if(s.x>=q.x&&s.x<=q.x+q.w&&s.y>=q.y&&s.y<=q.y+q.h)return!0;if(!q.entry)return!1;let Pe=B(q.entry.col,q.entry.row);return Math.abs(s.x-Pe.x)<=p.cell*.46&&Math.abs(s.y-Pe.y)<=p.cell*.46});if(l)return{type:"facility",ref:l};let y=rt(s.x,s.y);if(!y)return null;let h=it(e,y.col,y.row);if(h)return{type:"eggFarm",ref:h};let m=st(e,y.col,y.row);if(m)return{type:"scanner",ref:m};let P=x(e,y.col,y.row);if(P)return{type:"maintenanceRoom",ref:P};let F=E(y.col,y.row);return e.footbridges?.has(F)?{type:"footbridge",oldKey:F,ref:{type:"footbridge",id:F}}:e.powerOverlay&&e.powerWires?.has(F)?{type:"powerWire",oldKey:F,ref:{type:"powerWire",id:F}}:e.conveyorTiles.has(F)?{type:"conveyor",oldKey:F,ref:{type:"conveyor",id:F}}:null}let A=qa({game:e,canvasPoint:o,updatePanels:i,equipmentAtPoint:I,fail:T,pointInGrid:O,rectOfFacility:oe,rectsOverlap:ue});function U(s){return null}function he(){let s=j();if(s)if(s.type==="conveyor")S(B(...Object.values(X(s.id))));else if(s.type==="powerWire"){let l=X(s.id),y=e.powerWires?.get(s.id);if(!y)return;Oe(e);let h=B(l.col,l.row);k({type:"powerWire",oldKey:s.id,ref:{id:s.id,price:y.price||0,builtSession:y.builtSession}},h.x,h.y),e.powerWires.delete(s.id),Ye(e),ct(e,h.x,h.y),e.selected=null,e.multiSelected=[],i()}else if(s.type==="footbridge"){let l=X(s.id);S(B(l.col,l.row))}else s.type==="eggFarm"?S(B(s.col,s.row)):s.type==="scanner"?S(ge(s)):s.type==="facility"?S({x:s.x+s.w/2,y:s.y+s.h/2}):s.type==="maintenanceRoom"&&S(u(s))}function de(s,l,y="primary-button"){let h=document.createElement("button");return h.type="button",h.className=y,h.textContent=s,h.addEventListener("click",l),h}function Xe(){e.cardTargetPick?.mode==="autoScannerMenu"&&(e.cardTargetPick=null),t.modal.classList.remove("visible","equipment-popover"),t.modal.style.removeProperty("--popover-x"),t.modal.style.removeProperty("--popover-y")}function _n(s){t.modalTitle.textContent="Auto Scanner",e.cardTargetPick={pending:!0,mode:"autoScannerMenu",cardId:null,targetKeys:[`scanner:${s.id}`],remaining:1},t.modalBody.innerHTML=`
|
|
<div class="equipment-menu-lines compact">
|
|
<p>Left / right output routing for this AUTO scanner.</p>
|
|
<p>Current: ${s.role===0?"Male left / others right":"Poop left / others right"}</p>
|
|
<p>Cooldown: ${Bt(s).toFixed(1)}s.</p>
|
|
</div>`,t.modalActions.innerHTML="";let l=de("Male Left / Others Right",()=>{Oe(e),s.role=0,Xe(),i()},s.role===0?"facility-action warn":"facility-action"),y=de("Poop Left / Others Right",()=>{Oe(e),s.role=1,Xe(),i()},s.role===1?"facility-action warn":"facility-action");t.modalActions.append(l,y,de("Close",Xe,"facility-action")),ho(s),t.modal.classList.add("visible","equipment-popover"),i()}function yo(s){return s?.label||s?.key||"?"}function pr(s){let l=s.key===" "?"Space":s.key.length===1?s.key.toUpperCase():s.key.replace(/^Arrow/,"");return{key:s.key.toLowerCase(),code:s.code,label:l}}function wl(s,l,y){for(let h of e.scanners.filter(m=>m.kind==="manual"))for(let m of["left","right"]){if(h.id===s.id&&m===l)continue;let P=h.keys?.[m];if(P&&(P.code===y.code||P.key===y.key))return!0}return!1}function Wn(s,l=""){if(!s||s.kind!=="manual")return;t.modalTitle.textContent=`Manual Scanner #${s.id}`;let y=yo(s.keys?.left),h=yo(s.keys?.right),m=ml(s);t.modalBody.innerHTML=`
|
|
<div class="equipment-menu-lines compact">
|
|
<p>Left route key: <b>${y}</b></p>
|
|
<p>Right route key: <b>${h}</b></p>
|
|
${l?`<p class="cash-positive">${l}</p>`:""}
|
|
${m?`<p class="cash-negative">${m}</p>`:""}
|
|
</div>`,t.modalActions.innerHTML="",t.modalActions.appendChild(de("Set Left Key",()=>gi(s,"left"),"facility-action warn")),t.modalActions.appendChild(de("Set Right Key",()=>gi(s,"right"),"facility-action warn")),t.modalActions.appendChild(de("Close",Xe,"facility-action")),ho(s),t.modal.classList.add("visible","equipment-popover")}function Ci(s){if(!s||(s.baseId||s.id)!=="inboundTruck")return;s.inboundOrder=s.inboundOrder||{coalPerDay:0,zundaMochiPerDay:0};let l=_.imports.combinedLimitPerTruck,y=Math.max(0,Math.floor(s.inboundOrder.coalPerDay||0)),h=Math.max(0,Math.floor(s.inboundOrder.zundaMochiPerDay||0)),m=y*_.imports.prices.coal+h*_.imports.prices.zundaMochi,P=y+h,F=P>0?(_.time.daySeconds/P).toFixed(1):"none";t.modalTitle.textContent=`Inbound Truck #${s.id}`,t.modalBody.innerHTML=`
|
|
<div class="equipment-menu-lines compact">
|
|
<label>Coal per day <input id="inboundCoalInput" type="number" min="0" max="${l}" step="1" value="${y}" /></label>
|
|
<label>Zunda mochi per day <input id="inboundZundaInput" type="number" min="0" max="${l}" step="1" value="${h}" /></label>
|
|
<p>Combined total: <b>${P}/${l}</b></p>
|
|
<p>Daily purchase cost: <b>${R(m)}</b></p>
|
|
<p>Average release interval: <b>${F}${P>0?"s":""}</b></p>
|
|
<p>Output queue: <b>${s.inboundQueue?.length||0}</b></p>
|
|
</div>`,t.modalActions.innerHTML="";let q=de("Apply",()=>{if(e.phase!=="build")return;let be=Math.max(0,Math.floor(Number(document.getElementById("inboundCoalInput")?.value)||0)),Pe=Math.max(0,Math.floor(Number(document.getElementById("inboundZundaInput")?.value)||0)),we=be+Pe,$e=we>l?l/we:1;Oe(e),s.inboundOrder={coalPerDay:Math.floor(be*$e),zundaMochiPerDay:Math.floor(Pe*$e)},Ci(s),i()},"primary-button");q.disabled=e.phase!=="build",t.modalActions.appendChild(q),t.modalActions.appendChild(de("Close",Xe,"facility-action")),ho(s),t.modal.classList.add("visible","equipment-popover")}function ml(s){let l=[{side:"left",binding:s.keys?.left},{side:"right",binding:s.keys?.right}];if(l[0].binding&&l[1].binding&&(l[0].binding.code===l[1].binding.code||l[0].binding.key===l[1].binding.key))return"Left and right keys conflict.";for(let y of l)if(y.binding)for(let h of e.scanners.filter(m=>m.kind==="manual"&&m.id!==s.id)){if(h.keys?.left&&(h.keys.left.code===y.binding.code||h.keys.left.key===y.binding.key))return`Key conflicts with Manual Scanner #${h.id} left.`;if(h.keys?.right&&(h.keys.right.code===y.binding.code||h.keys.right.key===y.binding.key))return`Key conflicts with Manual Scanner #${h.id} right.`}return""}function gi(s,l){t.modalBody.innerHTML=`<div class="equipment-menu-lines compact"><p>Press a key for ${l.toUpperCase()} route.</p><p>Esc cancels.</p></div>`,t.modalActions.innerHTML="";let y=h=>{if(h.preventDefault(),h.stopPropagation(),window.removeEventListener("keydown",y,!0),h.key==="Escape")return Wn(s);let m=pr(h),P=wl(s,l,m);Oe(e),s.keys=s.keys||{left:null,right:null},s.keys[l]=m,i(),Wn(s,P?`${m.label} assigned, but another scanner already uses it.`:`${l.toUpperCase()} set to ${m.label}.`)};window.addEventListener("keydown",y,!0)}function vl(){let s=j();if(!(!s||s.type!=="scanner"))return s.kind==="auto"?_n(s):Wn(s)}function Sl(s){if(!s)return{x:80,y:80};if(s.type==="conveyor"){let l=X(s.id);return B(l.col,l.row)}return s.type==="eggFarm"?B(s.col,s.row):s.type==="scanner"?ge(s):s.type==="facility"?{x:s.x+s.w/2,y:s.y+10}:{x:80,y:80}}function ho(s){let l=n.getBoundingClientRect(),y=Sl(s),h=e.view?.scale||1,m=l.left+(y.x*h+(e.view?.x||0))/n.width*l.width+18,P=l.top+(y.y*h+(e.view?.y||0))/n.height*l.height-12,F=Math.max(12,window.innerWidth-274),q=Math.max(12,window.innerHeight-220);t.modal.style.setProperty("--popover-x",`${Math.max(12,Math.min(F,m))}px`),t.modal.style.setProperty("--popover-y",`${Math.max(12,Math.min(q,P))}px`)}function xi(){let s=j();if(!s)return;let l=Pi(s);if(t.modalTitle.textContent=le(s),t.modalBody.innerHTML=`
|
|
<div class="equipment-menu-lines compact">${l.map(m=>`<p>${m}</p>`).join("")}</div>
|
|
${["mixer","truck"].includes(s.baseId||s.id)?'<p class="formula-box compact">Income/Fine = ceil(base x 1.10^upgrades)</p>':""}`,t.modalActions.innerHTML="",s.type==="scanner"&&s.kind==="auto"&&t.modalActions.appendChild(de("Auto Menu",()=>_n(s),"facility-action warn")),s.type==="scanner"&&s.kind==="manual"&&t.modalActions.appendChild(de("Set Keys",()=>Wn(s),"facility-action warn")),s.type==="conveyor"&&yr(s.id)&&Ht(s.id).length>=2){let m=e.conveyorMeta.get(s.id)?.branchMode||"random";t.modalActions.appendChild(de(`Branch: ${Ti(m)}`,()=>{hr(s.id),e.selected={type:"conveyor",id:s.id},xi()},"facility-action warn branch-action"))}let y=s.type==="conveyor"?{type:"conveyor",oldKey:s.id,ref:s}:{type:s.type,ref:s},h=Ke(y);if(h){let m=de(h,()=>{},"facility-action danger disabled");m.disabled=!0,t.modalActions.appendChild(m)}else{let m=Ut(y,e),P=m.sameBuild?`Remove / Refund ${R(m.amount)}`:`Sell ${R(m.amount)}`;t.modalActions.appendChild(de(P,()=>{he(),Xe()},"facility-action danger"))}ho(s),t.modal.classList.add("visible","equipment-popover")}function kl(s){e.phase==="build"&&(Qt(),e.buildTool=e.buildTool===s?null:s,e.selected=null,e.multiSelected=[],e.selectionBox=null,i())}function Ml(){let s=[];for(let[l,y]of Object.entries(e.facilities))if(s.push({id:`facility:${l}`,price:ce({type:"facility",ref:y}),x:y.x,y:y.y,w:y.w,h:y.h}),y.entry){let h=B(y.entry.col,y.entry.row);s.push({id:`facilityPort:${l}`,price:ce({type:"facility",ref:y}),x:h.x-18,y:h.y-18,w:36,h:36})}for(let l of e.maintenanceRooms||[]){let y=u(l);s.push({id:`maintenanceRoom:${l.id}`,price:ce({type:"maintenanceRoom",ref:l}),x:y.x-p.cell,y:y.y-p.cell,w:p.cell*2,h:p.cell*2})}for(let l of e.eggFarms){let y=B(l.col,l.row);s.push({id:`eggFarm:${l.id}`,price:ce({type:"eggFarm",ref:l}),x:y.x-24,y:y.y-24,w:48,h:48})}for(let l of e.scanners){let y=ge(l);s.push({id:`scanner:${l.id}`,price:ce({type:"scanner",ref:l}),x:y.x-50,y:y.y-73,w:100,h:146})}for(let l of e.conveyorTiles){let y=X(l),h=B(y.col,y.row),m=e.conveyorMeta.get(l)||{};s.push({id:`conveyor:${l}`,price:m.price||Le(m.kind==="boostConveyor"?"boostConveyor":"conveyor",e),x:h.x-22,y:h.y-22,w:44,h:44})}if(e.powerOverlay)for(let[l,y]of e.powerWires||new Map){let h=X(l),m=B(h.col,h.row);s.push({id:`powerWire:${l}`,price:y.price||0,x:m.x-18,y:m.y-18,w:36,h:36})}for(let[l,y]of e.footbridges||new Map){let h=X(l),m=B(h.col,h.row);s.push({id:`footbridge:${l}`,price:y.price||Le("footbridge",e),x:m.x-22,y:m.y-22,w:44,h:44})}return s}function Ti(s){return $[s]||$.random}function ef(s){return Ln(s)}function yr(s){return e.conveyorTiles.has(s)?Ce(X(s)):!1}function Ei(s){if(e.phase!=="build"||e.cardDraft?.pending||e.cardTargetPick?.pending)return null;for(let l of e.conveyorTiles){if(!yr(l)||Ht(l).length<2)continue;let y=X(l),h=B(y.col,y.row),m=h.x-W.w/2,P=h.y+W.y-W.h/2;if(s.x>=m&&s.x<=m+W.w&&s.y>=P&&s.y<=P+W.h)return l}return null}function Cl(s){let l=Ei(s);return l?hr(l):!1}function hr(s){let l=e.conveyorMeta.get(s);if(!l)return!1;let y=Ht(s);if(y.length<2)return!1;Oe(e);let h=C.includes(l.branchMode)?l.branchMode:"random",m=["random",...fe.map(P=>P.name).filter(P=>y.includes(P))];return l.branchMode=m[(Math.max(0,m.indexOf(h))+1)%m.length],Ee(e),e.selected=null,e.multiSelected=[],i(),!0}function Pi(s){Be(e);let l=[],y=s?.type==="facility"?s.baseId||s.id:"";if(s.type==="eggFarm"){let[h,m]=zn(s);l.push(`Price: ${R(ce(s))}`);{let be=Ke({type:s.type,ref:s});l.push(be?`Sale: blocked (${be})`:`Sale value: ${R(Ut({type:s.type,ref:s},e).amount)}`)}l.push(`Level: ${s.level}/4`),l.push(`Random interval: ${h.toFixed(2)}-${m.toFixed(2)}s`),l.push(`Durability: ${Zn(s)}% | Spawn delay x${Yo(s).toFixed(2)}`);let P=Kt(e),F=s.theoreticalRate||io(e,s,s.lastInterval||1),q=so(F,P);l.push(`Rate: ${F.toFixed(2)}/s theoretical | ${Math.min(F,P).toFixed(2)}/s actual`),l.push(`Boost cap: ${P.toFixed(2)}/s | Quality: x${q.toFixed(2)} ${Ha(q)}`),s.zundaBoostTime>0&&l.push(`Zunda boost: ${s.zundaBoostTime.toFixed(1)}s`)}else if(s.type==="scanner"){l.push(`Price: ${R(ce(s))}`),l.push(`Sale value: ${R(Ut({type:s.type,ref:s},e).amount)}`),l.push(`Type: ${s.kind.toUpperCase()} / Standard`),s.kind==="auto"&&l.push(`Role: ${s.role===0?"Male left / Others right":"Poop left / Others right"}`),l.push(`Queue: ${s.queue.length}`),s.kind==="auto"&&l.push(`Cooldown: ${s.cooldown.toFixed(1)}s / ${Bt(s,e).toFixed(1)}s`),s.kind==="auto"&&l.push(`Durability: ${Zn(s)}% | Delay x${Ho(s).toFixed(2)}`),s.kind==="manual"&&l.push("Durability: none | Always normal");let h=En(e,s);h&&br(l,h)}else if(s.type==="conveyor"){let h=e.conveyorMeta.get(s.id),m=e.componentLookup?.get(s.id),P=m?e.congestion.get(m):null;l.push(`Price: ${R(ce({type:"conveyor",oldKey:s.id,ref:s}))}`),l.push(`Cell: ${s.id}`),l.push(`Type: ${h?.kind==="boostConveyor"?"BOOST BELT":"Normal Belt"} | Speed x${Number(h?.speedMultiplier||1).toFixed(1)}`),l.push(`Congestion: ${P?Math.floor(P.ratio*100):0}%`),l.push(`Durability: ${Zn({meta:h})}% | Speed x${zo({meta:h}).toFixed(2)}`),yr(s.id)?Ht(s.id).length>=2?(l.push(`Branch mode: ${Ti(h?.branchMode||"random")}`),l.push("Click the Branch button or the on-belt triangle to cycle RANDOM / fixed exit.")):l.push("Branch mode: unavailable \u2014 fewer than two outgoing conveyors."):l.push("Branch mode: needs 3+ conveyor connections."),l.push(`Sale value: ${R(Ut({type:"conveyor",oldKey:s.id,ref:s},e).amount)}`)}else if(s.type==="powerWire"){let h=e.powerWires?.get(s.id),m=_.power.wires[h?.kind||"powerWire"];l.push(`Price: ${R(h?.price||m.price)}`),l.push(`Cell: ${s.id}`),l.push(`Type: ${m.name} | Loss ${m.lossV}V/tile`)}else if(s.type==="footbridge"){let h=e.footbridges?.get(s.id);l.push(`Price: ${R(h?.price||Le("footbridge",e))}`),l.push(`Cell: ${s.id}`),l.push(`Orientation: ${h?.orientation||"vertical"}`),l.push("Repair workers may cross this conveyor cell.")}else if(s.type==="maintenanceRoom"){l.push(`Price: ${R(ce({type:"maintenanceRoom",ref:s}))}`),l.push(`Sale value: ${R(Ut({type:"maintenanceRoom",ref:s},e).amount)}`),l.push("Size: 2\xD72 grid cells"),l.push("Dispatch: 1 repairman during each production day");let h=En(e,s);h&&br(l,h)}else if(s.type==="facility"){l.push(`Price: ${R(ce(s))}`);{let m=Ke({type:s.type,ref:s});l.push(m?`Sale: blocked (${m})`:`Sale value: ${R(Ut({type:s.type,ref:s},e).amount)}`)}if(l.push(["mixer","truck","trash","sausageMaker"].includes(y)?`Level: ${s.level} / no cap`:`Level: ${s.level}`),y==="truck"&&l.push("Durability: none | Always normal"),["mixer","trash","sausageMaker"].includes(y)&&l.push(`Durability: ${Zn(s)}% | Extra delay ${ii(e,s).toFixed(2)}s`),y==="mixer"){l.push(`Output: 1 meat per non-poop chick | meat buffer ${s.meatBuffer||0}`),l.push(`Meat quality: x${Rt(e,"mixer").toFixed(3)} to sausage value`);let m=He(e,s);l.push(`OUT: ${m?`${m.col},${m.row}`:"none"} | conveyor ${kt(e,s)?"connected":"missing"}`),l.push(`Fallback sale: ${R(Ie.income.mixer)} when OUT is missing or blocked`),l.push(`Poop fine: -${R(Yn(e))}`)}if(y==="truck"&&(l.push(`Income: ${R(Je(e))} per target cargo | upgrade x${Rt(e,"truck").toFixed(3)}`),l.push(`Poop shipment fine: -${R(Qn(e))}`)),y==="trash"){let m=At(e),P=It(m),F=tn(m);l.push(`Bonus cards: ${m}/${kn()}`),l.push(`Expected poop bonus: ${R(P)} | hit chance ${Math.round(F*100)}%`),l.push("Winning payouts roll 1x / 2x / 4x / 10x, with jackpot odds rising per card."),l.push("With enough upgrades, poop can out-earn male/female routes.")}if(y==="sausageMaker"){let m=wt(e,s),P=He(e,s);l.push("Size: 3\xD73 grid cells | IN left / OUT right"),l.push(`Recipe: 2 meat -> 1 sausage | meat buffer ${s.meatBuffer||0} | sausage buffer ${s.sausageBuffer||0}`),l.push(`Sausage sale value: ${R(lt(e))}`),l.push(`IN: ${m?`${m.col},${m.row}`:"none"} | OUT: ${P?`${P.col},${P.row}`:"none"} | conveyor ${kt(e,s)?"connected":"missing"}`)}s.entry&&l.push(`Receiver: edge cell ${s.entry.col},${s.entry.row} (${s.side})`);let h=En(e,s);h&&br(l,h)}return l}function br(s,l){s.push(`Power: ${l.receivedV.toFixed(1)}V / ${l.minVoltage}V`),s.push(`Source: ${l.sourceName} | Source bus: ${l.sourceBusV.toFixed(1)}V`),s.push(`Route loss: ${l.routeLossV.toFixed(1)}V | Voltage Load: ${l.drawV}V`),l.receivedV<l.minVoltage&&s.push("Status: UNDER VOLTAGE")}function gl(s){if(!s||e.phase!=="build")return"";let l=vn(e).find(y=>y.type===s.type&&y.id===s.id);return l?l.message||"Not connected to conveyor route":""}function xl(s){return s?s.type==="conveyor"&&e.conveyorMeta.get(s.id)?.kind==="boostConveyor"?"Moves chicks twice as fast. Wears down like a normal belt.":s.type==="conveyor"?"A stubborn belt tile. It only cares about the next cell.":s.type==="eggFarm"?"A tiny gatehouse producing questionable eggs on schedule.":s.type==="scanner"&&s.kind==="auto"?"A compact 2\xD72 scanner sized for roughly 2.1 level-1 farms.":s.type==="scanner"?"A manual checkpoint. The operator is the algorithm.":s.type==="facility"&&(s.baseId||s.id)==="mixer"?"Chicks become meat when OUT is clear; a blocked OUT falls back to direct sale.":s.type==="facility"&&(s.baseId||s.id)==="trash"?"Poop goes in. Sometimes coins come out, for reasons best left unaudited.":s.type==="facility"&&(s.baseId||s.id)==="truck"?"The shipping endpoint. Correct cargo and sausages pay; wrong cargo complains.":s.type==="facility"&&(s.baseId||s.id)==="sausageMaker"?"A 3\xD73 in-grid machine with one meat inlet on the left and one sausage outlet on the right.":s.type==="maintenanceRoom"?"A cramped 2\xD72 storage and break room with lockers, spare parts, a bench and one dispatched repairman.":"Factory equipment.":""}return{buildAtCell:po,buildAtPoint:fn,eraseAtPoint:S,equipmentAtPoint:I,startSelectionBox:A.startSelectionBox,updateSelectionBox:A.updateSelectionBox,finishSelectionBox:A.finishSelectionBox,startGroupDrag:A.startGroupDrag,updateGroupDrag:A.updateGroupDrag,finishGroupDrag:A.finishGroupDrag,selectedObject:j,selectedTitle:le,equipmentPrice:ce,selectedUpgradeCost:U,selectedInfoLines:Pi,flavorText:xl,disconnectedWarningFor:gl,gridExpansionCost:K,buyGridExpansion:se,expansionOfferAtPoint:J,beginConveyorDrag:lr,continueConveyorDrag:cr,endConveyorDrag:Qt,cycleSingleConveyorDirection:co,branchSwitcherAtPoint:Ei,cycleBranchModeAtPoint:Cl,cycleBranchModeForKey:hr,branchSelectableExitDirsForKey:Ht,removeSelected:he,switchScannerRole:vl,showManualScannerMenu:Wn,showInboundTruckMenu:Ci,showAutoScannerMenu:_n,showSelectedMenu:xi,setBuildTool:kl,fail:T,isEquipmentCell:xe,equipmentHitBoxes:Ml,routeFromFarmToScanner:en}}function Xa({game:e,ui:t,build:n,startGame:o,beginCardDraft:r,activeQueuedChick:i}){function a(O){return String(O).replace(/[&<>"']/g,H=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[H])}function c(){return Math.round(Vt(e))}function b(){if(e.phase!=="build"||e.cardDraft?.pending||e.cardTargetPick?.pending)return!1;let O=!1;for(let H of Mr)if(O=!0,e.cash>=Le(H,e))return!1;return O}function M(){C(),$(),K(),W()}function C(){for(let[H,oe]of Object.entries(t.buttons))oe?.classList?.contains("tool-button")&&oe.classList.toggle("active",e.buildTool===H);t.buttons.powerOverlay?.classList.toggle("active",!!e.powerOverlay),t.buttons.powerOverlay&&(t.buttons.powerOverlay.disabled=e.phase!=="build"||!!e.cardDraft?.pending||!!e.cardTargetPick?.pending);for(let H of Mr){let oe=t.buttons[H];if(!oe)continue;let ue=Le(H,e),Ve=oe.querySelector("span");Ve&&(Ve.textContent=H==="conveyor"||H==="boostConveyor"?`${R(ue)} / tile`:R(ue));let xe=H==="manualScanner"&&e.scanners.filter(x=>x.kind==="manual").length>=8,Ge=e.cash<ue;oe.disabled=e.phase!=="build"||!!e.cardDraft?.pending||!!e.cardTargetPick?.pending||Ge||xe,oe.disabled&&e.buildTool===H&&(e.buildTool=null),oe.classList.toggle("unaffordable",Ge),oe.classList.toggle("already-built",xe),oe.title=Ge?`Need ${R(ue-e.cash)} more`:xe?"Manual Scanner limit reached (8 max)":""}t.buttons.erase&&(t.buttons.erase.disabled=e.phase!=="build"||!!e.cardDraft?.pending||!!e.cardTargetPick?.pending);let O=b();t.buttons.nextTurn?.classList.toggle("cashout-emphasis",O),t.buttons.erase?.classList.toggle("cashout-emphasis",O)}function $(){let O=b();t.buildStatus.textContent=e.phase==="build"?e.cardTargetPick?.pending?"Select an upgrade target on the map.":e.cardDraft?.pending?"Choose upgrade card before building.":O?"No affordable equipment. Start the next day or sell equipment to recover cash.":pe.status.build(e.buildTool):pe.status.sorting}function W(){t.buttons.undo.disabled=e.phase!=="build"||e.undoStack.length===0,t.buttons.redo.disabled=e.phase!=="build"||e.redoStack.length===0}function K(){let O=e.eggFarms.filter(oe=>en(e,oe)?.scannerId).length,H=$o(e);t.turnSummary.innerHTML=[`Seed: <b>${a(e.runSeed||"none")}</b> | Grid box: <b>${e.gridRows||10}x${e.gridCols||20}</b> | Owned: <b>${e.gridOwnedCells||e.ownedCells?.size||(e.gridRows||10)*(e.gridCols||20)}</b> cells | Blocked: <b>${e.blockedCells?.size||0}</b> cells`,`Penalties: <b>wrong shipment -${R(zr(e))}</b> | <b>Mixer poop -${R(Yn(e))}</b> | <b>Shipment poop -${R(Qn(e))}</b>`,aa(e),`Maintenance: <b>worst ${li(e).worst.percent}% dirty (${li(e).worst.label})</b> | Rooms: <b>${(e.maintenanceRooms||[]).length}</b> | Repairmen: <b>${(e.repairmen||[]).length}</b>`,`Card draft: <b>${e.cardDraft?.pending?Math.max(1,e.cardDraft.picksRemaining||1)+" pick(s) left":"ready after each day"}</b> | Farms with scanner route: <b>${O}/${e.eggFarms.length}</b>`,e.cardEffects?.usedMachineActive?'<span class="cash-negative">Procurement: USED MACHINE MODE / no refunds / 60% durability</span>':"",H.length?`<span class="cash-negative">Blocked: ${H[0]}</span>`:`<span class="cash-positive">${pe.status.allPortsConnected}</span>`].filter(Boolean).join("<br>")}function G(){C(),t.shell.classList.toggle("phase-running",e.phase==="running"),t.shell.classList.toggle("phase-build",e.phase==="build"),t.shell.classList.toggle("phase-gameover",e.phase==="gameover"),t.shell.classList.toggle("phase-title",e.phase==="title"),t.shell.classList.toggle("phase-loanDecision",e.phase==="loanDecision"),t.money.textContent=R(e.cash),t.money.classList.toggle("cash-negative",e.cash<0),t.money.classList.toggle("cash-positive",e.cash>Un),t.turn.textContent=e.turn,t.timeLeft.textContent=e.phase==="running"&&e.timeLeft<=0&&e.shutdownTimeLeft>0?`+${e.shutdownTimeLeft.toFixed(1)}s`:`${Math.max(0,e.timeLeft).toFixed(1)}s`,t.timeLeft.closest?.(".hud-card")?.classList.toggle("time-critical",e.phase==="running"&&(e.timeLeft<=10||e.timeLeft<=0&&e.shutdownTimeLeft>0)),t.phase.textContent=Q(),t.comboCount&&(t.comboCount.textContent=e.manualCombo?.count||0),z(),t.turnProfit.textContent=R(e.stats.profit),t.turnProfit.classList.toggle("cash-negative",e.stats.profit<0),t.turnProfit.classList.toggle("cash-positive",e.stats.profit>0),t.mixerCount.textContent=e.stats.mixerCount,t.truckFemaleCount.textContent=e.stats.truckFemale,t.truckMaleCount.textContent=e.stats.truckMale,t.poopCount.textContent=e.stats.poopSpawned,t.buttons.s1Left.disabled=e.phase!=="running"||!i(0),t.buttons.s1Right.disabled=e.phase!=="running"||!i(0),t.buttons.s2Left.disabled=e.phase!=="running"||!i(1),t.buttons.s2Right.disabled=e.phase!=="running"||!i(1);let O=e.scanners.find(xe=>xe.kind==="manual"&&xe.slot===0),H=e.scanners.find(xe=>xe.kind==="manual"&&xe.slot===1);O&&(t.buttons.s1Left.textContent=`S1 ${O.keys?.left?.label||"A"} -> Mixer`,t.buttons.s1Right.textContent=`S1 ${O.keys?.right?.label||"D"} -> S2`),H&&(t.buttons.s2Left.textContent=`S2 ${H.keys?.left?.label||"Left"} -> Waste`,t.buttons.s2Right.textContent=`S2 ${H.keys?.right?.label||"Right"} -> Truck`);let oe=Math.max(0,Math.floor(e.lastResult?.profit??e.stats?.profit??0)),ue=Yr(e,Math.max(1,Number(e.turn)||1),oe).amount,Ve=e.phase==="build"&&ue>0?`<span class="next-day-main">NEXT DAY</span><small class="next-day-fee">FAIRIES -${R(ue)}</small>`:`<span class="next-day-main">${pe.actions.nextDay}</span>`;t.buttons.nextTurn.dataset.renderedHtml!==Ve&&(t.buttons.nextTurn.innerHTML=Ve,t.buttons.nextTurn.dataset.renderedHtml=Ve),t.buttons.nextTurn.disabled=e.phase!=="build"||!!e.cardDraft?.pending||!!e.cardTargetPick?.pending}function z(){if(!t.eventBrief||!t.speedBrief)return;t.speedBrief.textContent=`BELT SPEED: ${c()} px/s`,t.speedBrief.title=`Conveyor speed does not increase by day. Degraded belts reduce speed. Cap: ${yn}px/s.`;let O=e.eventActive,H=e.eventOffer;O?(t.eventBrief.textContent=`ACTIVE EVENT: ${O.title} | ${O.route}`,t.eventBrief.className="event-brief active"):e.phase==="build"&&H?(t.eventBrief.textContent=`NEXT DAY EVENT: ${H.title} | ${H.route}${H.targetAmount?` | Target ${H.targetAmount}`:""}${H.reward?` | Reward ${R(H.reward)}`:""}`,t.eventBrief.className="event-brief next"):e.phase==="build"&&e.turn+1<Vn?(t.eventBrief.textContent=`NO EVENTS UNTIL DAY ${Vn}`,t.eventBrief.className="event-brief locked"):(t.eventBrief.textContent="NO ACTIVE EVENT",t.eventBrief.className="event-brief")}function Q(){return e.phase==="running"?e.timeLeft<=0?pe.phases.clearing:pe.phases.running:e.phase==="loanDecision"?pe.phases.loanDecision:e.phase==="build"?pe.phases.build:e.phase==="gameover"?pe.phases.gameover:pe.phases.title}function ie(){t.modalTitle.textContent=pe.versionTitle,t.modalBody.innerHTML='<div class="route-cards"><div class="route-card"><span class="route-icon male" aria-label="male chick">\u2642</span><strong>Male</strong><b>-></b><em>Mixer -> Meat</em><small>S1: A</small></div><div class="route-card"><span class="route-icon female" aria-label="female chick">\u2640</span><strong>Female</strong><b>-></b><em>Truck</em><small>S1: D, then S2: right</small></div><div class="route-card"><span class="route-icon poop" aria-label="poop">\u{1F4A9}</span><strong>Poop</strong><b>-></b><em>Shredder</em><small>S1: D, then S2: left</small></div></div><p>Build phase: connect at least one EGG through a scanner to Mixer, Shredder, or Truck before Next Day. One day is one run.</p>',t.modalActions.innerHTML="",t.modalActions.appendChild(L(pe.actions.startGame,o,"primary-button")),t.modal.classList.remove("equipment-popover","gameover-modal"),t.modal.classList.add("visible")}function J(O){let H=D=>`<span class="${D>0?"cash-positive":""}">${D>0?"+":""}${R(D)}</span>`,oe=D=>`<span class="${D>0?"cash-negative":""}">${D>0?"-":""}${R(D)}</span>`,ue=O.profit>=0?"cash-positive":"cash-negative",Ve=(O.mixerPoopFine||0)+(O.truckPoopFine||0)+(O.maleTruckFine||0)+(O.explosionDamage||0)+(O.cardRerollCost||0),xe=O.qualityMultiplierCount?(O.qualityMultiplierSum||0)/O.qualityMultiplierCount:1,Ge=O.qualityRevenue||0,x=Ge>0?"cash-positive":"",g=Object.values(O.maxGeneratorOutput||{}).reduce((D,Z)=>Math.max(D,Number(Z)||0),0);t.modalTitle.textContent=`Day ${O.turn} Settlement`,t.modalBody.innerHTML=`
|
|
<div class="settlement-net ${ue}"><span>Net result</span><strong>${R(O.profit)}</strong></div>
|
|
<div class="result-grid settlement-grid">
|
|
<div><strong>Chick shipment income</strong>${H(O.chickShipmentIncome||0)}</div>
|
|
<div><strong>Poop shipment income</strong>${H(O.poopShipmentIncome||0)}</div>
|
|
<div><strong>Sausage shipment income</strong>${H(O.sausageRevenue||0)}</div>
|
|
<div><strong>Meat / sausages</strong><span>${O.meatProduced||0} meat -> ${O.sausageProduced||0} made / ${O.sausageShipped||0} shipped</span></div>
|
|
<div><strong>Imports</strong><span>coal ${O.coalReleased||0}/${O.coalOrdered||0}, zunda ${O.zundaReleased||0}/${O.zundaOrdered||0}</span></div>
|
|
<div><strong>Import use</strong><span>coal fuel ${O.coalConsumed||0}, zunda used ${O.zundaConsumed||0}, undelivered ${O.coalUndelivered||0}/${O.zundaUndelivered||0}</span></div>
|
|
<div><strong>Import cost</strong>${oe(O.importPurchaseCost||0)}</div>
|
|
<div><strong>Generator fuel</strong><span>biomass ${O.biomassFuelConsumed||0}, max output ${g.toFixed(0)}V</span></div>
|
|
<div><strong>Quality revenue</strong><span><b class="${x}">${Ge>0?"+":""}${R(Ge)}</b> avg x${xe.toFixed(2)} / max x${(O.maxQualityMultiplier||1).toFixed(2)}</span></div>
|
|
<div><strong>Zunda boost</strong><span>${(O.zundaBoostSeconds||0).toFixed(1)} farm-seconds</span></div>
|
|
<div><strong>Power trouble</strong><span>${(O.underVoltageSeconds||0).toFixed(1)} machine-seconds / ${O.generatorAssignmentChanges||0} source changes</span></div>
|
|
<div><strong>Repair access</strong><span>${O.unreachableRepairTargets||0} unreachable target checks</span></div>
|
|
<div><strong>Composter income</strong>${H(O.composterIncome||0)}</div>
|
|
<div><strong>DUD refund income</strong>${H(O.dudRefundIncome||0)}</div>
|
|
<div><strong>Manual combo bonus</strong>${H(O.manualComboBonus||0)}</div>
|
|
<div><strong>Chemical subsidy</strong>${H(O.chemicalWeaponSubsidy||0)}</div>
|
|
<div><strong>Event bonus</strong>${H(O.eventBonus||0)}</div>
|
|
<div><strong>Penalties</strong>${oe(Ve)}</div>
|
|
<div><strong>Fairies fee</strong>${oe(O.fairiesTribute?.amount||O.fairiesTribute||0)}</div>
|
|
</div>
|
|
<p class="formula-box compact">Income ${R(O.revenue)} - losses ${R(O.penalty)} = <b class="${ue}">${R(O.profit)}</b></p>`,t.modalActions.innerHTML="",t.modalActions.appendChild(L("Choose Upgrade Card",r||V,"primary-button")),t.modal.classList.remove("equipment-popover","gameover-modal"),t.modal.classList.add("visible")}function ae(O,H){let oe=Math.max(0,e.cardEffects?.rescueLoanCharges||0);t.modalTitle.textContent="Emergency Loan Available",t.modalBody.innerHTML=`
|
|
<p class="gameover-reason">End-of-day cash is below ${R(0)}.</p>
|
|
<div class="result-grid settlement-grid">
|
|
<div><strong>Current money</strong><span class="cash-negative">${R(e.cash)}</span></div>
|
|
<div><strong>Emergency Loan</strong><span class="cash-positive">+${R(500)}</span></div>
|
|
<div><strong>Cards remaining</strong><span>${oe}</span></div>
|
|
</div>
|
|
<p class="formula-box compact">Use one Emergency Loan to gain ${R(500)} immediately. If cash is still negative, another decision will be shown if another card remains.</p>`,t.modalActions.innerHTML="",t.modalActions.appendChild(L("Accept Game Over",H,"facility-action danger")),t.modalActions.appendChild(L("Use Emergency Loan",O,"primary-button")),t.modal.classList.remove("equipment-popover","gameover-modal"),t.modal.classList.add("visible")}function ye(){let O=e.totals.processed,H=O?Math.round(e.totals.correct/O*100):0,oe=Gs(e);t.modalTitle.textContent=pe.phases.gameover,t.modalBody.innerHTML=`<p class="gameover-reason">Your cash went negative.</p>
|
|
<div class="result-grid gameover-summary"><div><strong>Final Score</strong><span>${oe.score}</span></div><div><strong>Survival</strong><span>${e.totals.turnsCompleted} days</span></div><div><strong>Final Cash</strong><span>${R(e.cash)}</span></div><div><strong>Accuracy</strong><span>${H}%</span></div></div>
|
|
<details class="gameover-details"><summary>Score breakdown</summary>
|
|
<div class="formula-box compact"><strong>Formula</strong><br>Base = Cash + Total revenue + Factory value \xD70.5 + Event bonus \xD70.5 = ${R(oe.base)}<br>Daily earned = ceil(Base \xF7 Days) = ${R(oe.dailyEarned)}<br>Score = max(0, floor(Base + Daily earned + Correct bonus - Total outflow - Day penalty)) = ${oe.score}</div>
|
|
<div class="result-grid gameover-breakdown"><div><strong>Factory Value</strong><span>${R(oe.factoryValue)}</span></div><div><strong>Total Revenue</strong><span>${R(e.totals.revenue)}</span></div><div><strong>Daily Earned</strong><span>${R(oe.dailyEarned)} / day</span></div><div><strong>Total Outflow</strong><span>${R(e.totals.penalty)}</span></div><div><strong>Fairies Tribute</strong><span>${R(e.totals.fairiesTribute||0)}</span></div><div><strong>Correct Sorts</strong><span>${e.totals.correct}</span></div><div><strong>Auto Sorted</strong><span>${e.totals.autoSorted}</span></div><div><strong>Poop Control</strong><span>${e.totals.poopTrash} trashed / ${e.totals.poopTruck} shipped / ${e.totals.poopMixer} mixer</span></div><div><strong>Explosion Penalty</strong><span>${R(e.totals.explosionDamage)}</span></div><div><strong>Event Bonus</strong><span>${R(e.totals.eventBonus)}</span></div><div><strong>Day Penalty</strong><span>-${oe.dayPenalty}</span></div><div><strong>Events</strong><span>${e.totals.eventSuccess} success / ${e.totals.eventFailed} failed</span></div></div>
|
|
</details>`,t.modalActions.innerHTML="",t.modalActions.appendChild(L(pe.actions.restart||"Restart",o,"primary-button restart-button")),t.modal.classList.remove("equipment-popover"),t.modal.classList.add("visible","gameover-modal")}function L(O,H,oe="primary-button"){let ue=document.createElement("button");return ue.type="button",ue.className=oe,ue.textContent=O,ue.addEventListener("click",H),ue}function V(){t.modal.classList.remove("visible","equipment-popover","gameover-modal"),t.modal.style.removeProperty("--popover-x"),t.modal.style.removeProperty("--popover-y")}function se(){}return{updatePanels:M,updateUI:G,showTitle:ie,showTurnResult:J,showEmergencyLoanDecision:ae,showGameOver:ye,hideModal:V,checkGameOver:se}}function ki(e){e.totals.processed+=1}function Fn(e){e.stats.correct+=1,e.totals.correct+=1}function vt(e){e.stats.mistakes+=1,e.totals.mistakes+=1}function ja(e){e.stats.autoSorted+=1,e.totals.autoSorted+=1}function Ja(e){e.stats.poopSpawned+=1}function Za(e){e.stats.mixerCount+=1,ki(e)}function el(e){e.stats.trashCount+=1,ki(e)}function tl(e,t){t==="female"?e.stats.truckFemale+=1:t==="male"&&(e.stats.truckMale+=1),ki(e)}function nr(e,t){let n=t==="truck"?"poopTruck":t==="trash"?"poopTrash":t==="mixer"?"poopMixer":null;n&&(e.stats[n]+=1,e.totals[n]+=1)}function wd(e){let t=2166136261;for(let n=0;n<String(e).length;n+=1)t^=String(e).charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0)%1e5/1e5}function Mi(e={}){let t=_.imports.combinedLimitPerTruck,n=Math.max(0,Math.floor(Number(e.coalPerDay)||0)),o=Math.max(0,Math.floor(Number(e.zundaMochiPerDay)||0));if(n+o>t){let r=t/Math.max(1,n+o);n=Math.floor(n*r),o=Math.max(0,t-n)}return{coalPerDay:n,zundaMochiPerDay:o}}function md(e={}){let t=Mi(e);return t.coalPerDay*_.imports.prices.coal+t.zundaMochiPerDay*_.imports.prices.zundaMochi}function vd(e,t="imports"){let n=Mi(e),o=[...Array.from({length:n.coalPerDay},()=>({type:"coal"})),...Array.from({length:n.zundaMochiPerDay},()=>({type:"zundaMochi"}))],r=Math.max(1,o.length);return o.map((i,a)=>{let c=yt/r,b=(a+.5)/r*yt,M=(wd(`${t}:${i.type}:${a}`)*2-1)*_.imports.jitterRatio*c;return{type:i.type,due:Math.max(0,Math.min(yt,b+M)),released:!1}}).sort((i,a)=>i.due-a.due||i.type.localeCompare(a.type))}function nl(e){e.imports={schedules:new Map};for(let t of Object.values(e.facilities||{})){if((t.baseId||t.id)!=="inboundTruck")continue;t.inboundOrder=Mi(t.inboundOrder),t.inboundQueue=[],t.importClock=0;let n=md(t.inboundOrder);n>0&&(Mt(e,n),e.stats.importPurchaseCost=(e.stats.importPurchaseCost||0)+n,e.stats.coalOrdered=(e.stats.coalOrdered||0)+t.inboundOrder.coalPerDay,e.stats.zundaOrdered=(e.stats.zundaOrdered||0)+t.inboundOrder.zundaMochiPerDay,e.totals.importPurchaseCost=(e.totals.importPurchaseCost||0)+n,e.totals.coalOrdered=(e.totals.coalOrdered||0)+t.inboundOrder.coalPerDay,e.totals.zundaOrdered=(e.totals.zundaOrdered||0)+t.inboundOrder.zundaMochiPerDay),e.imports.schedules.set(t.id,vd(t.inboundOrder,`${e.runSeed}:${e.turn}:${t.id}`))}}function Sd(e,t){if(!t||!e.conveyorTiles.has(E(t.col,t.row)))return!1;let n=B(t.col,t.row);return!e.chicks.some(o=>o.stage!=="flying"&&Math.hypot(o.x-n.x,o.y-n.y)<25)}function kd(e,t,n){let o=B(n.col,n.row);return{id:e.nextId++,sex:t,x:o.x,y:o.y,route:[{x:o.x,y:o.y}],targetIndex:1,stage:"belt",scannerId:null,nextScannerId:null,pendingScannerId:null,radius:t==="coal"?10:11,bob:0,queueIndex:-1,queueRoute:null,stoppedTimer:0}}function ol(e,t,n=()=>{}){if(e.phase==="running")for(let o of Object.values(e.facilities||{})){if((o.baseId||o.id)!=="inboundTruck"||!nt(e,o))continue;o.importClock=(o.importClock||0)+t;let r=e.imports?.schedules?.get(o.id)||[];for(let b of r)!b.released&&b.due<=o.importClock&&(o.inboundQueue=o.inboundQueue||[],o.inboundQueue.push(b),b.released=!0);let i=He(e,o);if(!o.inboundQueue?.length||!kt(e,o)||!Sd(e,i))continue;let a=o.inboundQueue.shift(),c=a.type;a.delivered=!0,e.chicks.push(kd(e,c,i)),c==="coal"&&(e.stats.coalReleased=(e.stats.coalReleased||0)+1,e.totals.coalReleased=(e.totals.coalReleased||0)+1),c==="zundaMochi"&&(e.stats.zundaReleased=(e.stats.zundaReleased||0)+1,e.totals.zundaReleased=(e.totals.zundaReleased||0)+1),rn(e,o),n()}}function rl(e){for(let t of Object.values(e.facilities||{})){if((t.baseId||t.id)!=="inboundTruck")continue;let n=e.imports?.schedules?.get(t.id)||[];for(let o of n)o.delivered||(o.type==="coal"&&(e.stats.coalUndelivered=(e.stats.coalUndelivered||0)+1,e.totals.coalUndelivered=(e.totals.coalUndelivered||0)+1),o.type==="zundaMochi"&&(e.stats.zundaUndelivered=(e.stats.zundaUndelivered||0)+1,e.totals.zundaUndelivered=(e.totals.zundaUndelivered||0)+1));t.inboundQueue=[]}}function il({game:e,currentConveyorSpeed:t,onGameOverCheck:n}){function o(){return e.frameCache||(e.frameCache={frameId:-1,routingVersion:-1,chickRevision:0,spatialRevision:-1,spatial:new Map,congestionFrame:-1,componentChicks:new Map,manualMonitorSignature:"",draw:{}}),e.frameCache}function r(){let u=o();u.chickRevision=(u.chickRevision||0)+1,u.congestionFrame=-1}function i(){o().congestionFrame=-1}function a(u){let f=o();f.frameId!==u&&(f.frameId=u,f.spatialRevision=-1,f.congestionFrame=-1)}function c(u,f){return`${Math.floor(u/p.cell)},${Math.floor(f/p.cell)}`}function b(){let u=o();if(u.spatialRevision===u.chickRevision)return u.spatial;let f=new Map;for(let v of e.chicks){if(v.stage==="flying")continue;let k=c(v.x,v.y);f.has(k)||f.set(k,[]),f.get(k).push(v)}return u.spatial=f,u.spatialRevision=u.chickRevision,f}function M(u){let f=b(),v=Math.floor(u.x/p.cell),k=Math.floor(u.y/p.cell),S=[];for(let I=k-1;I<=k+1;I+=1)for(let A=v-1;A<=v+1;A+=1){let U=f.get(`${A},${I}`);U&&S.push(...U)}return S}function C(u){let f=Jt(u)*Yo(u)*Ra(e)/ks(e),v=io(e,u,f);return u.theoreticalRate=v,u.actualOutputRate=Math.min(v,Kt(e)),u.qualityMultiplier=so(v,Kt(e)),Math.max(.25,za(v,Kt(e)))}function $(u){let f=B(u.col,u.row),v=1+Ia(e,u),k=K(u,v).slice(0,1);if(!k.length)return W(u,f),!0;let S=0,I=0;for(let A of k){let U=B(A.col,A.row),he=G(U);if(he){he.stoppedTimer=.85,I+=1;continue}let de=ta(e,{stage:"belt",scannerId:null,route:[U]}),Xe=u.theoreticalRate||io(e,u,u.lastInterval||C(u));de.sourceQuality=so(Xe,Kt(e)),e.stats.farmTheoreticalRate=Math.max(e.stats.farmTheoreticalRate||0,Xe),e.stats.farmActualOutputRate=Math.max(e.stats.farmActualOutputRate||0,Math.min(Xe,Kt(e))),e.stats.qualityMultiplierSum=(e.stats.qualityMultiplierSum||0)+de.sourceQuality,e.stats.qualityMultiplierCount=(e.stats.qualityMultiplierCount||0)+1,e.stats.maxQualityMultiplier=Math.max(e.stats.maxQualityMultiplier||1,de.sourceQuality),de.sex==="poop"&&Ja(e),e.chicks.push(de),r(),da(e,u),S+=1}return S>0?(Ws(e,f.x,f.y),S>1&&Y(e,f.x,f.y-28,`x${S}`,w.green),!0):I===0}function W(u,f){(u.noRouteNoticeCooldown||0)<=0&&(Y(e,f.x,f.y-24,"NO BELT: PAUSED",w.warn),u.noRouteNoticeCooldown=2.5)}function K(u,f){let k=fe.map(S=>({col:u.col+S.dc,row:u.row+S.dr})).filter(S=>Re(S.col,S.row)&&e.conveyorTiles.has(E(S.col,S.row))).map(S=>({p:S,blocked:ae(null,B(S.col,S.row))?1:0,roll:Math.random()}));return k.sort((S,I)=>S.blocked-I.blocked||S.roll-I.roll),k.slice(0,Math.max(1,f||1)).map(S=>S.p)}function G(u){return M(u).find(f=>Math.hypot(f.x-u.x,f.y-u.y)<p.cell*.68)||null}function z(u,{closeFarmShutters:f,completeTurn:v}){if(ma(e,u),pa(e,u),ol(e,u,r),Yt(),e.cleanupTimer!==null){e.cleanupTimer=Math.max(0,e.cleanupTimer-u),e.cleanupTimer<=0&&v();return}let k=e.timeLeft>0;if(e.timeLeft=Math.max(0,e.timeLeft-u),k&&e.timeLeft<=0&&f(),e.timeLeft<=0){e.shutdownTimeLeft>0&&(e.shutdownTimeLeft=Math.max(0,e.shutdownTimeLeft-u));for(let S of e.eggFarms)S.shutterProgress=Math.min(1,(S.shutterProgress||0)+u*2.8)}if(k&&e.timeLeft>0){for(let S of e.eggFarms)if(S.noRouteNoticeCooldown>0&&(S.noRouteNoticeCooldown=Math.max(0,S.noRouteNoticeCooldown-u)),S.zundaBoostTime>0&&(S.zundaBoostTime=Math.max(0,S.zundaBoostTime-u)),S.nextSpawn-=u,S.nextSpawn<=0){let I=$(S);S.nextSpawn=I?C(S):.15,S.lastInterval=S.nextSpawn}}for(let S=e.chicks.length-1;S>=0;S-=1){let I=e.chicks[S];I.bob+=u*7,I.stoppedTimer>0&&(I.stoppedTimer=Math.max(0,I.stoppedTimer-u)),I.stage!=="queued"&&(ce(I,S)||ie(I,S,u))}ot(u),fn(e.frameId),dr(),e.timeLeft<=0&&(e.chicks.length===0?v():e.shutdownTimeLeft<=0&&Q())}function Q(){if(e.cleanupBlown)return;e.cleanupBlown=!0,e.cleanupTimer=1;let u=[...e.chicks];for(let f of u)Jr(e,f.sex,f.x,f.y,-Math.PI/2,!0);e.chicks=[];for(let f of e.scanners)f.queue=[];if(r(),fn(e.frameId),u.length){let f=u.reduce((k,S)=>k+S.x,0)/u.length,v=u.reduce((k,S)=>k+S.y,0)/u.length;gt(e,f,v,w.warn,58),Y(e,f,v-24,"CLEANUP",w.warn)}}function ie(u,f,v){if(J(u)){u.stoppedTimer=.35;return}if(Ke(u,v),!(u.route&&u.targetIndex<u.route.length)){if(u.pendingScannerId){let k=Zt(e,u.pendingScannerId);u.pendingScannerId=null,k?T(u,k,u.route):Qt(f,"NO SCANNER");return}le(u,f)}}function J(u){if(!u.route||u.targetIndex>=u.route.length)return!1;let f=u.route[u.targetIndex];return ae(u,f)}function ae(u,f){if(!f)return!1;for(let v of M(f))if(!(u&&v.id===u.id)&&Math.hypot(v.x-f.x,v.y-f.y)<p.cell*.55)return!0;return!1}function ye(u,f){if(!f)return;let v=u[u.length-1];(!v||Math.hypot(v.x-f.x,v.y-f.y)>1)&&u.push({x:f.x,y:f.y})}function L(u){let f=e.conveyorMeta?.get?.(u)||{},v=[];Array.isArray(f.outDirs)&&v.push(...f.outDirs),f.dir&&v.push(f.dir);let k=[...new Set(v)].filter(de=>fe.some(Xe=>Xe.name===de)),S=X(u),I=fe.filter(de=>xe(S,de.name,null)).map(de=>de.name),A=k.filter(de=>I.includes(de)),U=fe.filter(de=>e.conveyorTiles.has(E(S.col+de.dc,S.row+de.dr))).map(de=>de.name);if(U.length===1&&(!A.length||A.includes(U[0]))&&Ge(S,U[0]))return A.filter(de=>de!==U[0]);let he=I;return A.length?A:he}function V(u){return fe.find(f=>f.name===u)||null}function se(u,f){return e.scanners.find(v=>v.col<=u&&u<=v.col+1&&v.row-1<=f&&f<=v.row)||null}function O(u,f){let v=V(f);if(!v)return null;let k=se(u.col+v.dc,u.row+v.dr);if(!k)return null;let S=We(k,"inputA");return S&&S.col===u.col&&S.row===u.row?k:null}function H(u){return Object.entries(e.facilities||{}).find(([,f])=>f?.entry&&f.entry.col===u.col&&f.entry.row===u.row)||null}function oe(u,f){for(let v of Object.values(e.facilities||{})){let k=ue(v);if(!v.gridPlaced||!["biomassGenerator","coalGenerator"].includes(k))continue;if((k==="biomassGenerator"?[{col:v.col-1,row:v.row+1,dir:"right"},{col:v.col+1,row:v.row-1,dir:"down"},{col:v.col+1,row:v.row+(v.hCells||3),dir:"up"}]:[{col:v.col-1,row:v.row+1,dir:"right"}]).some(I=>I.col===u.col&&I.row===u.row&&I.dir===f))return v}return null}function ue(u){return u?.baseId||u?.id||""}function Ve(u,f){return u?.gridPlaced&&ue(u)==="sausageMaker"||u?.gridPlaced&&["biomassGenerator","coalGenerator"].includes(ue(u))?f==="right":u.side==="left"&&f==="left"||u.side==="right"&&f==="right"||u.side==="top"&&f==="up"||u.side==="bottom"&&f==="down"}function xe(u,f,v=null){let k=V(f);if(!k)return null;let S={col:u.col+k.dc,row:u.row+k.dr};if(Re(S.col,S.row)&&e.conveyorTiles.has(E(S.col,S.row)))return{type:"conveyor",dirName:f,target:B(S.col,S.row),nextCell:S};let I=O(u,f);if(I&&!["meat","sausage","coal","zundaMochi"].includes(v?.sex))return{type:"scanner",dirName:f,target:ge(I),scanner:I};let A=oe(u,f);if(A)return{type:"facility",dirName:f,facilityId:A.id,facility:A,target:B(u.col,u.row)};let U=H(u);return U&&Ve(U[1],f)?{type:"facility",dirName:f,facilityId:U[0],facility:U[1],target:B(u.col,u.row)}:null}function Ge(u,f){let v=V(f);if(!v)return!1;let k=e.conveyorMeta?.get?.(E(u.col+v.dc,u.row+v.dr));return k?[...new Set([...Array.isArray(k.outDirs)?k.outDirs:[],k.dir].filter(Boolean))].includes(v.opposite):!1}function x(u){return fe.filter(f=>Re(u.col+f.dc,u.row+f.dr)&&e.conveyorTiles.has(E(u.col+f.dc,u.row+f.dr))).map(f=>f.name)}function g(u,f,v="random"){let k=x(u);if(k.length<3)return f;let S=new Set(k.filter(U=>Ge(u,U))),I=k.filter(U=>!S.has(U)),A=S.size?I:[...new Set(f.filter(U=>k.includes(U)))];return!A.length&&!S.size&&(A=k),v&&v!=="random"&&v!=="pass"&&A.length>=2&&A.includes(v)?[v]:A}function D(u,f){return f&&(f.type==="facility"||!ae(u,f.target))}function Z(u,f,v,k="random"){let S=v.map(he=>xe(f,he,u)).filter(Boolean);if(!S.length)return null;let A=S.filter(he=>he.type!=="facility").filter(he=>!ae(u,he.target)),U=A.length?A:S.filter(he=>he.type==="facility");return U.length?U[Math.floor(Math.random()*U.length)]:null}function j(u,f){let v=[];ye(v,{x:u.x,y:u.y}),ye(v,f),u.route=v.length?v:[{x:u.x,y:u.y}],u.targetIndex=u.route.length>1?1:u.route.length}function le(u,f){let v=rt(u.x,u.y);if(!v)return Qt(f,"OFF GRID");let k=E(v.col,v.row);if(!e.conveyorTiles.has(k))return Qt(f,"OFF BELT");let S=e.conveyorMeta?.get(k)||{},I=g(v,L(k),S.branchMode||"random");if(!I.length){u.stoppedTimer=.25;return}let A=Z(u,v,I,S.branchMode||"random");if(!A){u.stoppedTimer=.25;return}if(A.type==="facility"){let U=ue(A.facility);if(U==="mixer")ir(f,A.facility);else if(U==="truck")uo(f,A.facility);else if(U==="trash")lr(f,A.facility);else if(U==="sausageMaker")ar(f,A.facility);else if(U==="biomassGenerator"||U==="coalGenerator")cr(f,A.facility);else if(U==="inboundTruck"){let he=e.chicks[f];he&&(he.stoppedTimer=.25)}else Qt(f,"DONE");return}A.type==="scanner"&&(u.pendingScannerId=A.scanner.id),u.prevConveyorCell=k,j(u,A.target)}function ce(u,f){if(u.sex!=="zundaMochi")return!1;let v=rt(u.x,u.y);if(!v)return!1;let k=e.eggFarms.find(I=>Math.abs(I.col-v.col)+Math.abs(I.row-v.row)===1);if(!k)return!1;Ya(e,k),pt(f);let S=B(k.col,k.row);return Y(e,S.x,S.y-24,"ZUNDA BOOST",w.green),!0}function ve(u){let f=rt(u.x,u.y);if(!f)return null;let v=E(f.col,f.row);return e.conveyorTiles.has(v)?v:null}function Me(u){let f=ve(u)||ve(u.route?.[u.targetIndex]||u);return t(f)}function Se(u,f){let v=ve(f);!v||u.lastWearKey===v||(u.lastWearKey=v,ua(e,v))}function Ke(u,f){let v=Me(u)*f;for(;v>0&&u.targetIndex<u.route.length;){let k=u.route[u.targetIndex],S=k.x-u.x,I=k.y-u.y,A=Math.hypot(S,I);if(A<=.001){Se(u,k),u.targetIndex+=1;continue}v>=A?(u.x=k.x,u.y=k.y,Se(u,k),u.targetIndex+=1,v-=A,i()):(u.x+=S/A*v,u.y+=I/A*v,v=0,i())}}function T(u,f,v){u.stage="queued",u.route=null,u.queueRoute=v?v.map(k=>({x:k.x,y:k.y})):[ge(f)],u.scannerId=f.id,f.queue.includes(u.id)||f.queue.push(u.id),r(),ke(f)}function ke(u){u.queue=u.queue.filter(v=>e.chicks.some(k=>k.id===v&&k.stage==="queued"));let f=p.cell*.86*Aa(e);u.queue.forEach((v,k)=>{let S=e.chicks.find(I=>I.id===v);S&&(Ae(S,S.queueRoute||[ge(u)],k*f),S.queueIndex=k)})}function Ae(u,f,v){if(!f||!f.length)return;if(f.length===1||v<=0){let I=f[f.length-1];u.x=I.x,u.y=I.y,i();return}let k=v;for(let I=f.length-1;I>0;I-=1){let A=f[I-1],U=f[I],he=Math.hypot(U.x-A.x,U.y-A.y);if(k<=he){let de=1-k/he;u.x=A.x+(U.x-A.x)*de,u.y=A.y+(U.y-A.y)*de,i();return}k-=he}let S=f[0];u.x=S.x,u.y=S.y,i()}function ot(u){for(let f of e.scanners){let v=f.kind!=="auto"||nt(e,f);if(f.keyPressTime>0&&(f.keyPressTime=Math.max(0,f.keyPressTime-u)),ke(f),!v||(f.cooldown>0&&(f.cooldown=Math.max(0,f.cooldown-u)),f.kind!=="auto"||f.cooldown>0||!f.queue.length))continue;let k=f.queue[0],S=e.chicks.findIndex(I=>I.id===k);if(S<0){f.queue.shift();continue}Nn(S,Dr(f,e.chicks[S]),!0)&&(fa(e,f),f.cooldown=Bt(f,e),ja(e))}}function Ce(u){let f=$r(e,u);return!f||!f.queue.length?null:e.chicks.find(v=>v.id===f.queue[0])||null}function Ue(u,f){if(e.phase!=="running")return;let v=$r(e,u);St(v,f)}function St(u,f){if(e.phase!=="running"||!u||u.kind!=="manual"||(u.keyPressTime=.18,u.keyPressSide=f,!u.queue.length))return;let v=e.chicks.findIndex(k=>k.id===u.queue[0]);v>=0&&Nn(v,f,!1)}function et(u,f,v){return u.kind==="manual"&&Dr(u,f)===v}function Ln(u){let f=e.manualCombo?.count||0;if(e.manualCombo||(e.manualCombo={count:0,lastBonus:0}),e.manualCombo.count=0,e.manualCombo.lastBonus=0,e.stats.manualComboFailure=(e.stats.manualComboFailure||0)+1,e.totals.manualComboFailure=(e.totals.manualComboFailure||0)+1,f>=10){let v=ge(u);nn(e,10,.25),Y(e,v.x,v.y-36,"COMBO RESET",w.danger)}}function Ht(u){e.manualCombo||(e.manualCombo={count:0,lastBonus:0}),e.manualCombo.count=Math.max(0,e.manualCombo.count||0)+1,e.stats.manualComboSuccess=(e.stats.manualComboSuccess||0)+1,e.totals.manualComboSuccess=(e.totals.manualComboSuccess||0)+1;let f=e.manualCombo.count;if(e.manualCombo.lastBonus=0,f<10)return 0;let v=Math.max(1,Math.floor(f/10)),k=e.scanners.filter(U=>U.kind==="manual").length,S=Math.min(1,(20+k*10)/100),I=0;for(let U=0;U<v;U+=1)Math.random()<S&&(I+=1);let A=Math.floor(I*Math.max(1,e.turn||1)*5/4);if(A>0){tt(e,A),e.stats.manualComboBonus=(e.stats.manualComboBonus||0)+A,e.totals.manualComboBonus=(e.totals.manualComboBonus||0)+A,e.manualCombo.lastBonus=A;let U=ge(u);Y(e,U.x,U.y-42,`COMBO +${R(A)}`,w.green)}return A}function lo(u,f){let v=We(u,f);if(!v)return null;let k=E(v.col,v.row);if(e.conveyorTiles.has(k))return{...v};let I=(at(e).scannerPorts.get(u.id)?.[f]?.keys||[]).filter(Boolean);if(!I.length)return null;let A=I.map(X).sort((he,de)=>{let Xe=B(he.col,he.row),_n=B(de.col,de.row),yo=ae(null,Xe)?1:0,pr=ae(null,_n)?1:0;return yo-pr});return A.find(he=>he.col===v.col&&he.row===v.row)||A[0]||null}function co(u,f,v,k){let S=[];ye(S,{x:u.x,y:u.y});let I=We(f,v);return I&&ye(S,B(I.col,I.row)),ye(S,B(k.col,k.row)),S}function Nn(u,f,v){let k=e.chicks[u];if(!k||k.stage!=="queued")return!1;let S=Zt(e,k.scannerId);if(!S||S.kind==="auto"&&!nt(e,S))return!1;if(["coal","zundaMochi"].includes(k.sex))return Y(e,k.x,k.y-16,"NOT SCANNABLE",w.warn),!1;let I=lo(S,f);if(!I)return!v&&S.kind==="manual"&&Ln(S),Y(e,k.x,k.y-16,f==="left"?"NO LEFT BELT":"NO RIGHT BELT",w.danger),!1;!v&&S.kind==="manual"&&(et(S,k,f)?Ht(S):Ln(S)),S.queue=S.queue.filter(U=>U!==k.id),k.stage="belt",k.route=co(k,S,f,I),k.targetIndex=k.route.length>1?1:k.route.length,k.scannerId=null,k.nextScannerId=null,k.pendingScannerId=null,k.queueRoute=null,k.queueIndex=-1,r();let A=v?w.green:f==="left"?w.mixerBlue:w.truckPink;return Us(e,ge(S).x,ge(S).y,A),Y(e,k.x,k.y-20,v?"AUTO":f.toUpperCase(),A),!0}function pt(u){let f=e.chicks[u];return f?(e.chicks.splice(u,1),r(),f):null}function ir(u,f=e.facilities.mixer){if(!nt(e,f)){let A=e.chicks[u];A&&(A.stoppedTimer=.25);return}if(f?.processingCooldown>0){let A=e.chicks[u];A&&(A.stoppedTimer=.25);return}if(Xt(e.chicks[u]))return dn(u,"CHICKS ONLY");let v=pt(u);if(!v)return;let{x:k,y:S}=v;if(Za(e),rn(e,f),Xo(e,f),v.sex==="meat"||v.sex==="sausage"){vt(e),Y(e,k,S-18,"CHICKS ONLY",w.warn);return}if(v.sex==="poop"){let A=$s(e);nr(e,"mixer"),vt(e),Ks(e,k,S),Y(e,k,S-18,`-${R(A)}`,w.danger);return}v.sex==="male"?Fn(e):vt(e);let I=He(e,f);if(!I||!kt(e,f)||!fo(I)){let A=As(e);Y(e,k,S-18,`DIRECT +${R(A)}`,w.green);return}f.meatBuffer=Math.max(0,f.meatBuffer||0)+1,f.meatQualityQueue=f.meatQualityQueue||[],f.meatQualityQueue.push(v.sourceQuality||1),e.stats.meatProduced=(e.stats.meatProduced||0)+1,e.totals.meatProduced=(e.totals.meatProduced||0)+1,Vs(e,k,S),Y(e,k,S-18,"MEAT +1",w.meatRed),Yt()}function uo(u,f=e.facilities.truck){if(!nt(e,f)){let U=e.chicks[u];U&&(U.stoppedTimer=.25);return}if(Xt(e.chicks[u]))return dn(u,"NO IMPORTS");let v=pt(u);if(!v)return;let{x:k,y:S}=v;ur(v.sex,f,v.sourceQuality||1),zs(e,k,S,v.sex),tl(e,v.sex);let I=Sn(e),A=Cs(e,v.sex);if(v.sex==="sausage"){e.stats.sausageShipped=(e.stats.sausageShipped||0)+1,e.totals.sausageShipped=(e.totals.sausageShipped||0)+1,Y(e,k,S-18,`SAUSAGE +${R(lt(e))}`,w.sausageOrange);return}if(v.sex==="meat"){vt(e),Y(e,k,S-18,"RAW MEAT REJECT",w.warn);return}if(v.sex==="poop"){if(nr(e,"truck"),A)Fn(e),Y(e,k,S-18,`+${R(Je(e))}`,w.green);else{let U=Fs(e);vt(e),Y(e,k,S-18,`-${R(U)}`,w.danger)}return}if(v.sex==="female"){A?(Fn(e),Y(e,k,S-18,`+${R(Je(e))}`,w.green)):(vt(e),Y(e,k,S-18,I==="male"?"REJECT":"NO SALE",w.warn));return}if(A){Fn(e),Y(e,k,S-18,`+${R(Je(e))}`,w.green);return}if(gs(e)){let U=Os(e);vt(e),Y(e,k,S-18,`-${R(U)}`,w.danger)}else vt(e),Y(e,k,S-18,"REJECT",w.warn)}function sr(u,f){let v=B(f.col,f.row);return{id:e.nextId++,sex:u,x:v.x,y:v.y,route:[{x:v.x,y:v.y}],targetIndex:1,stage:"belt",scannerId:null,nextScannerId:null,pendingScannerId:null,radius:u==="sausage"?11:10,bob:Math.random()*Math.PI*2,queueIndex:-1,queueRoute:null,stoppedTimer:0}}function fo(u){if(!u||!e.conveyorTiles.has(E(u.col,u.row)))return!1;let f=B(u.col,u.row);return!ae(null,f)}function Gn(u,f,v){if(!nt(e,u))return!1;let k=He(e,u);if(!k||!kt(e,u)||!fo(k)||Math.max(0,u[v]||0)<=0)return!1;u[v]-=1;let S=sr(f,k);f==="meat"&&(S.sourceQuality=(u.meatQualityQueue||[]).shift()||1),f==="sausage"&&(S.sourceQuality=(u.sausageQualityQueue||[]).shift()||1),e.chicks.push(S),r();let I=B(k.col,k.row);return Y(e,I.x,I.y-16,f==="meat"?"MEAT OUT":"SAUSAGE OUT",f==="meat"?w.meatRed:w.sausageOrange),!0}function Yt(){for(let u of Object.values(e.facilities||{})){let f=ue(u);f==="mixer"&&Gn(u,"meat","meatBuffer"),f==="sausageMaker"&&Gn(u,"sausage","sausageBuffer")}}function ar(u,f){if(!nt(e,f)){let I=e.chicks[u];I&&(I.stoppedTimer=.25);return}if(f?.processingCooldown>0){let I=e.chicks[u];I&&(I.stoppedTimer=.25);return}if(Xt(e.chicks[u]))return dn(u,"MEAT ONLY");let v=pt(u);if(!v)return;let{x:k,y:S}=v;if(v.sex!=="meat"){vt(e),Y(e,k,S-18,"MEAT ONLY",w.warn);return}if(rn(e,f),Xo(e,f),f.meatBuffer=Math.max(0,f.meatBuffer||0)+1,f.meatQualityQueue=f.meatQualityQueue||[],f.meatQualityQueue.push(v.sourceQuality||1),f.meatBuffer>=2){f.meatBuffer-=2,f.sausageBuffer=Math.max(0,f.sausageBuffer||0)+1;let I=f.meatQualityQueue.shift()||1,A=f.meatQualityQueue.shift()||1;f.sausageQualityQueue=f.sausageQualityQueue||[],f.sausageQualityQueue.push((I+A)/2),e.stats.sausageProduced=(e.stats.sausageProduced||0)+1,e.totals.sausageProduced=(e.totals.sausageProduced||0)+1,Y(e,k,S-18,"SAUSAGE +1",w.sausageOrange)}else Y(e,k,S-18,"MEAT 1/2",w.meatRed);Yt()}function lr(u,f=e.facilities.trash){if(!nt(e,f)){let U=e.chicks[u];U&&(U.stoppedTimer=.25);return}if(f?.processingCooldown>0){let U=e.chicks[u];U&&(U.stoppedTimer=.25);return}if(Xt(e.chicks[u]))return dn(u,"NO IMPORTS");let v=pt(u);if(!v)return;let{x:k,y:S}=v;qs(e,k,S,v.sex),el(e),rn(e,f),Xo(e,f);let I={amount:0},A="";if(v.sex==="poop"){I=Rs(e),A=I.amount>0?` ${I.tier==="jackpot"?"JACKPOT ":"+"}${R(I.amount)}`:" MISS",nr(e,"trash"),Fn(e);let U=Math.ceil(Math.max(0,Number(e.cardEffects?.composter)||0)*3*Fo(e));if(U>0){let he=tt(e,U);e.stats.composterIncome=(e.stats.composterIncome||0)+he,e.totals.composterIncome=(e.totals.composterIncome||0)+he,Y(e,k,S-36,`COMPOST +${R(he)}`,w.green)}Y(e,k,S-18,`CLEAN${A}`,I.amount>0?w.green:w.green)}else vt(e),Y(e,k,S-18,I.amount>0?`WASTE${A}`:"WASTE",I.amount>0?w.green:w.ink)}function cr(u,f){let v=e.chicks[u];if(!v)return;if(!la(f,v.sex)){v.stoppedTimer=.25;return}let k=pt(u);k&&((f.baseId||f.id)==="biomassGenerator"&&(e.stats.biomassFuelConsumed=(e.stats.biomassFuelConsumed||0)+1,e.totals.biomassFuelConsumed=(e.totals.biomassFuelConsumed||0)+1),(f.baseId||f.id)==="coalGenerator"&&(e.stats.coalConsumed=(e.stats.coalConsumed||0)+1,e.totals.coalConsumed=(e.totals.coalConsumed||0)+1),rn(e,f),Ye(e),Y(e,k.x,k.y-18,"FUEL +V",w.green))}function Qt(u,f){let v=pt(u);v&&Y(e,v.x,v.y-12,f,w.muted)}function Xt(u){return u?.sex==="coal"||u?.sex==="zundaMochi"}function dn(u,f){let v=e.chicks[u];v&&(v.stoppedTimer=.25,Y(e,v.x,v.y-18,f,w.warn))}function ur(u,f=e.facilities.truck,v=1){let k=f||e.facilities.truck;k&&(e.shippedCargo=e.shippedCargo||[],e.shippedCargo.push({sex:u,sourceQuality:v}),e.truckCargo.push({sex:u,sourceQuality:v,x:ne(22,k.w-22),y:ne(66,k.h-24)}),e.truckCargo.length>45&&e.truckCargo.shift())}function po(u){let f=rt(u.x,u.y);if(f){let S=E(f.col,f.row);if(e.conveyorTiles.has(S))return S}if(!f)return null;let v=null,k=1/0;for(let S of[f,...fe.map(I=>({col:f.col+I.dc,row:f.row+I.dr}))]){if(!Re(S.col,S.row))continue;let I=E(S.col,S.row);if(!e.conveyorTiles.has(I))continue;let A=B(S.col,S.row),U=Math.hypot(u.x-A.x,u.y-A.y);U<k&&(v=I,k=U)}return k<=p.cell*.55?v:null}function fn(u=e.frameId||0){let f=o(),v=e.routingVersion||0;if(f.congestionFrame===u&&f.routingVersion===v)return e.congestion;let{components:k,cellToComponent:S}=fs(e),I=new Map;for(let A of e.chicks){if(A.stage==="flying")continue;let U=po(A);if(!U)continue;let he=S.get(U),de=k.get(he);de&&(de.count+=1),he!=null&&(I.has(he)||I.set(he,[]),I.get(he).push(A))}for(let A of k.values())A.ratio=A.count/A.capacity;return e.congestion=k,e.componentLookup=S,f.routingVersion=v,f.congestionFrame=u,f.componentChicks=I,e.congestion}function dr(){for(let u of e.congestion.values()){let f=Kr(e),v=xs(e);if(u.ratio>v&&u.ratio<f)for(let k of pn(u.id).slice(0,3))Math.random()<.06&&Hs(e,k.x,k.y-k.radius-8);if(u.ratio>=f){let k=pn(u.id);if(!k.length||k.some(A=>A.stage!=="queued"&&A.stoppedTimer<=.2))continue;let S=e.lastExplodedComponent.get(u.id)||0,I=performance.now();I-S>900&&(e.lastExplodedComponent.set(u.id,I),fr(u))}}}function pn(u){return fn(e.frameId||0),e.frameCache?.componentChicks?.get(u)||[]}function fr(u){let f=pn(u.id);if(!f.length)return;for(let S of f)Jr(e,S.sex,S.x,S.y);e.chicks=e.chicks.filter(S=>!f.some(I=>I.id===S.id));for(let S of e.scanners)S.queue=S.queue.filter(I=>e.chicks.some(A=>A.id===I));r();for(let S of u.cells){let I=X(S),A=B(I.col,I.row);gt(e,A.x,A.y,w.danger),$t(e,A.x,A.y,6),Do(e,A.x,A.y,4)}nn(e,18,.75);let v=X(u.cells[0]),k=B(v.col,v.row);e.stats.explosions=(e.stats.explosions||0)+1,e.totals.explosions=(e.totals.explosions||0)+1,Y(e,k.x,k.y-22,`${Math.round(Kr(e)*100)}% JAM EXPLOSION`,w.danger)}return{activeQueuedChick:Ce,beginFrame:a,currentSpawnDelay:C,sortSlot:Ue,updateCongestion:fn,sortScanner:St,updateRunning:z}}var me=document.getElementById("gameCanvas"),Md=me.getContext("2d"),N={shell:document.getElementById("gameShell"),money:document.getElementById("money"),turn:document.getElementById("turn"),timeLeft:document.getElementById("timeLeft"),phase:document.getElementById("phaseLabel"),comboCount:document.getElementById("comboCount"),eventBrief:document.getElementById("eventBrief"),speedBrief:document.getElementById("speedBrief"),turnProfit:document.getElementById("turnProfit"),mixerCount:document.getElementById("mixerCount"),truckFemaleCount:document.getElementById("truckFemaleCount"),truckMaleCount:document.getElementById("truckMaleCount"),poopCount:document.getElementById("poopCount"),buildStatus:document.getElementById("buildStatus"),turnSummary:document.getElementById("turnSummary"),modal:document.getElementById("modal"),modalTitle:document.getElementById("modalTitle"),modalBody:document.getElementById("modalBody"),modalActions:document.getElementById("modalActions"),hoverTooltip:document.getElementById("hoverTooltip"),manualScannerMonitor:document.getElementById("manualScannerMonitor"),debug:{panel:document.getElementById("debugPanel"),infiniteCash:document.getElementById("debugInfiniteCash"),dayInput:document.getElementById("debugDayInput"),setDay:document.getElementById("debugSetDayButton"),zeroTimer:document.getElementById("debugZeroTimerButton"),cardSelect:document.getElementById("debugCardSelect"),targetSelect:document.getElementById("debugTargetSelect"),eventSelect:document.getElementById("debugEventSelect"),grantCard:document.getElementById("debugGrantCardButton"),grantAllCards:document.getElementById("debugGrantAllCardsButton"),readout:document.getElementById("debugReadout")},buttons:{s1Left:document.getElementById("scanner1MixerButton"),s1Right:document.getElementById("scanner1TruckButton"),s2Left:document.getElementById("scanner2MixerButton"),s2Right:document.getElementById("scanner2TruckButton"),nextTurn:document.getElementById("nextTurnButton"),conveyor:document.getElementById("buildConveyorButton"),boostConveyor:document.getElementById("buildBoostConveyorButton"),powerWire:document.getElementById("buildPowerWireButton"),insulatedPowerWire:document.getElementById("buildInsulatedPowerWireButton"),powerOverlay:document.getElementById("powerOverlayButton"),footbridge:document.getElementById("buildFootbridgeButton"),eggFarm:document.getElementById("buildEggFarmButton"),autoScanner:document.getElementById("buildAutoScannerButton"),manualScanner:document.getElementById("buildManualScannerButton"),mixer:document.getElementById("buildMixerButton"),trash:document.getElementById("buildTrashButton"),truck:document.getElementById("buildTruckButton"),inboundTruck:document.getElementById("buildInboundTruckButton"),sausageMaker:document.getElementById("buildSausageMakerButton"),biomassGenerator:document.getElementById("buildBiomassGeneratorButton"),coalGenerator:document.getElementById("buildCoalGeneratorButton"),maintenanceRoom:document.getElementById("buildMaintenanceRoomButton"),erase:document.getElementById("eraseButton"),undo:document.getElementById("undoButton"),redo:document.getElementById("redoButton")}};function Cd(){let e={conveyor:"conveyor",boostConveyor:"boostConveyor",powerWire:"powerWire",insulatedPowerWire:"insulatedPowerWire",footbridge:"footbridge",eggFarm:"eggFarm",autoScanner:"autoScanner",manualScanner:"manualScanner",mixer:"mixer",trash:"trash",truck:"truck",inboundTruck:"inboundTruck",sausageMaker:"sausageMaker",biomassGenerator:"biomassGenerator",coalGenerator:"coalGenerator",maintenanceRoom:"maintenanceRoom"};for(let[t,n]of Object.entries(e))N.buttons[t]&&(N.buttons[t].innerHTML=_i(n))}function gd(e){let t=new Set(e.tags||[]);return["upgradeEgg","crowdedFarming","hatchingFeed","extraEggOutlet"].includes(e.id)||t.has("EGG")?"Production / EGG":["upgradeTrash","poopRateBooster","composter","chemicalWeaponSubsidy"].includes(e.id)||t.has("POOP")?"Poop / Shredder":["upgradeAutoScanner","autoScannerTuning","scannerQueueSpacing"].includes(e.id)||t.has("SCANNER")?"Scanner":["bearing","dynamite"].includes(e.id)||t.has("CONVEYOR")?"Conveyor / Map":["safetyCover","preventiveMaintenance","durabilityCoating","sparePartsBin","laborExploitation"].includes(e.id)||t.has("MAINTENANCE")?"Maintenance / Risk":["dudFilter","dudRefund","freeReroll","extraCards"].includes(e.id)||t.has("CARD")?"Card Engine":t.has("ULTRA RARE")?"Ultra Rare":t.has("ECONOMY")||["upgradeMixer","upgradeTruck","upgradeSausageMaker","recyclingSubsidy","usedMachine","newMachine","flattery","legalWork","rescueLoan"].includes(e.id)?"Economy / Shipment":"Other"}function xd(){if(!N.debug?.panel||!N.debug.cardSelect)return;let e=["Production / EGG","Poop / Shredder","Scanner","Conveyor / Map","Maintenance / Risk","Card Engine","Economy / Shipment","Ultra Rare","Other"],t=new Map(e.map(n=>[n,[]]));for(let n of An){let o=gd(n);t.has(o)||t.set(o,[]),t.get(o).push(n)}N.debug.cardSelect.innerHTML="";for(let n of e){let o=t.get(n)||[];if(!o.length)continue;let r=document.createElement("optgroup");r.label=n;for(let i of o){let a=document.createElement("option");a.value=i.id;let c=i.rarity==="ultraRare"?"UR":i.rarity==="rare"?"R":"C";a.textContent=`[${c}] ${i.title}`,r.appendChild(a)}N.debug.cardSelect.appendChild(r)}N.debug.cardSelect.addEventListener("change",un),Td(),un()}function Td(){if(!N.debug?.eventSelect)return;N.debug.eventSelect.innerHTML="";let e=document.createElement("option");e.value="__roll__",e.textContent="Roll normally",N.debug.eventSelect.appendChild(e);let t=document.createElement("option");t.value="__none__",t.textContent="No event",N.debug.eventSelect.appendChild(t);for(let n of Hn){let o=document.createElement("option");o.value=n.key,o.textContent=n.title,N.debug.eventSelect.appendChild(o)}N.debug.eventSelect.value=d.debugNextEventKey||"__roll__",N.debug.eventSelect.addEventListener("change",Pd)}function cl(){let e=d.debugNextEventKey||"__roll__";return e==="__none__"?null:e==="__roll__"?ws(d):_r(d,e)}function un(){if(!N.debug?.targetSelect)return;let e=N.debug.cardSelect?.value,t=an(e),n=t?$a(d,t):[];if(N.debug.targetSelect.innerHTML="",!n.length){let r=document.createElement("option");r.value="__none__",r.textContent=t?"No target required":"No card selected",N.debug.targetSelect.appendChild(r),N.debug.targetSelect.disabled=!0;return}let o=document.createElement("option");o.value="__auto__",o.textContent=t?.id==="dynamite"?"Auto: first 10 blocked cells":"Auto: first valid target",N.debug.targetSelect.appendChild(o);for(let r of n){let i=document.createElement("option");i.value=r.key,i.textContent=r.label,N.debug.targetSelect.appendChild(i)}N.debug.targetSelect.disabled=!1}function Ed(){let e=Math.max(1,Math.floor(Number(N.debug.dayInput?.value)||1));d.turn=e,N.debug.dayInput&&(N.debug.dayInput.value=String(e)),Y(d,me.width/2-d.view.x,86-d.view.y,`DAY ${e}`,w.green),re.updatePanels(),re.updateUI(),un(),zt(`Day set to ${e}.`)}function Pd(){d.debugNextEventKey=N.debug.eventSelect?.value||"__roll__",d.phase==="build"&&(d.eventOffer=cl(),re.updatePanels(),re.updateUI());let e=N.debug.eventSelect?.selectedOptions?.[0]?.textContent||"Roll normally";zt(`Next event: ${e}.`)}function Rd(){let e=d.phase==="running"&&(d.timeLeft<=0||d.shutdownTimeLeft>0||d.cleanupTimer!==null);d.timeLeft=0,d.cleanupTimer!==null&&(d.cleanupTimer=0),e?d.shutdownTimeLeft=0:d.phase==="running"&&fl(),Y(d,me.width/2-d.view.x,86-d.view.y,"TIMER 0",w.warn),re.updatePanels(),re.updateUI(),zt("Timer set to 0.")}function Id(){let e=N.debug.cardSelect?.value,t=N.debug.targetSelect?.disabled?void 0:N.debug.targetSelect?.value,n=di(d,e,{targetKey:t});N.debug.grantCard&&(N.debug.grantCard.textContent=n.ok?"Granted":"Failed",window.setTimeout(()=>{N.debug.grantCard&&(N.debug.grantCard.textContent="Grant Selected")},900)),Ne?.updateCongestion?.(d.frameId||0),re.updatePanels(),re.updateUI(),un(),zt(n.reason)}function Ad(){let t=An.map(n=>di(d,n,{targetKey:"__auto__"})).filter(n=>n.ok).length;Ne?.updateCongestion?.(d.frameId||0),re.updatePanels(),re.updateUI(),un(),zt(`Granted ${t}/${An.length} cards.`)}function $d(){N.debug?.infiniteCash?.checked&&d.cash<999999&&(d.cash=999999,d.totals.maxCash=Math.max(d.totals.maxCash,d.cash))}function zt(e=""){N.debug?.readout&&(N.debug.readout.textContent=[e,`D${d.turn}`,R(d.cash),`Combo ${d.manualCombo?.count||0}`,`Event ${d.eventActive?.title||d.eventOffer?.title||"none"}`,`Next ${N.debug?.eventSelect?.selectedOptions?.[0]?.textContent||"Roll normally"}`,`Rescue ${d.cardEffects?.rescueLoanCharges||0}`,`Chem ${d.cardEffects?.chemicalWeaponSubsidy||0}`].filter(Boolean).join(" | "))}var d=Rr(),te,re,Ne,Bn;function Fd(e=null){let t=Vt(d,e);return e?t*eo(d,e):t}function Od(){Object.assign(d,Rr()),d.phase="running",d.view={x:0,y:0,scale:1},Ir(d),yl(),Be(d),re.hideModal(),Ne.updateCongestion(d.frameId||0),re.updatePanels(),re.updateUI(),zt()}function Bd(){if(d.phase!=="build")return;if(d.cardDraft?.pending||d.cardTargetPick?.pending){te.fail(d.cardTargetPick?.pending?"Choose upgrade target first.":"Choose an upgrade card first."),re.updatePanels();return}let e=$o(d);if(e.length){Wd(),te.fail(`Cannot start: ${e[0]}`),re.updatePanels();return}Be(d),ds(d);let t=_o(d);t.underVoltage?.size&&Y(d,me.width/2-d.view.x,136-d.view.y,`${t.underVoltage.size} UNDER-VOLTAGE`,w.warn),ba(d);let n=Math.max(0,Math.floor(d.lastResult?.profit??d.stats?.profit??0)),o=Ls(d,Math.max(1,d.turn||1),n);d.lastStartFees={fairiesTribute:o.amount||0,tribute:o},o.amount>0&&Y(d,me.width/2-d.view.x,116-d.view.y,`FAIRIES -${R(o.amount)}`,w.danger),ms(d),d.phase="running",d.turn+=1,d.timeLeft=Ss(d),d.shutdownTimeLeft=0,d.cleanupTimer=null,d.cleanupBlown=!1,d.chicks=[],d.effects=[],d.floatingTexts=[],d.shake={time:0,strength:0},d.truckCargo=[],d.shippedCargo=[],yl(),d.stats=Pr(),nl(d),d.stats.fairiesTribute=d.lastStartFees?.fairiesTribute||0,d.stats.fairiesTribute>0&&(d.stats.penalty+=d.stats.fairiesTribute,d.stats.profit-=d.stats.fairiesTribute);for(let r of d.scanners)r.queue=[],r.cooldown=0;for(let r of d.eggFarms)r.nextSpawn=Ne.currentSpawnDelay(r),r.lastInterval=r.nextSpawn,r.shutterProgress=0,r.shutterSparked=!1,r.zundaBoostTime=0;d.buildTool=null,d.selected=null,d.groupDrag=null,d.selectionBox=null,d.pan=null,Ne.updateCongestion(d.frameId||0),re.updatePanels(),re.updateUI()}function Dd(){if(d.phase!=="running")return;rl(d);for(let i of Object.values(d.facilities||{}))i.fuelPulses&&(i.fuelPulses=[]);for(let i of d.eggFarms||[])i.zundaBoostTime=0;let e=Ds(d),t=d.eventActive?{...d.eventActive}:null,n=Es(d),o=Ns(d);if(e.adjusted>0){let i=d.facilities.truck,a=i?i.x+i.w/2:me.width/2-d.view.x,c=i?i.y+26:96-d.view.y;Y(d,a,c,`${e.target==="poop"?"POOP SHIP":"SHIP"} +${R(e.adjusted)}`,w.green)}n?.bonus>0&&Y(d,me.width/2-d.view.x,96-d.view.y,`EVENT +${R(n.bonus)}`,w.green),o.amount>0&&Y(d,me.width/2-d.view.x,116-d.view.y,`CHEM SUBSIDY +${R(o.amount)}`,w.green),vs(d),d.totals.turnsCompleted+=1;let r=Ts(t);if(r!==1&&(d.pendingFairiesTributeMultiplier=r),d.lastResult={...d.stats,ship:e,event:n,chemical:o,rescue:{amount:0,used:0,remaining:d.cardEffects?.rescueLoanCharges||0},fairiesTribute:{amount:d.stats.fairiesTribute||0},tributeMultiplier:r,turn:d.turn,cash:d.cash},d.cash<0){if((d.cardEffects?.rescueLoanCharges||0)>0){d.phase="loanDecision",re.showEmergencyLoanDecision(dl,or);return}d.phase="gameover",re.showGameOver();return}ul()}function ul(){d.phase="build",d.truckCargo=[],d.shippedCargo=[],d.chicks=[],d.shutdownTimeLeft=0,d.cleanupTimer=null,d.cleanupBlown=!1,d.buildSession+=1,d.undoStack=[],d.redoStack=[],d.timeLeft=0;for(let e of d.scanners)e.queue=[];for(let e of d.eggFarms)e.shutterProgress=0,e.shutterSparked=!1;wa(d),d.eventOffer=cl(),Bn&&Bn.prepareDraft(),d.cardTargetPick=null,d.buildTool=null,d.groupDrag=null,d.selectionBox=null,d.pan=null,re.updatePanels(),re.showTurnResult(d.lastResult)}function dl(){if((d.cardEffects?.rescueLoanCharges||0)<=0)return or();d.cardEffects.rescueLoanCharges-=1,d.stats.rescueLoan=(d.stats.rescueLoan||0)+500,d.totals.rescueLoan=(d.totals.rescueLoan||0)+500;let e=tt(d,500);d.lastResult={...d.lastResult||{},...d.stats,rescue:{amount:(d.lastResult?.rescue?.amount||0)+e,used:(d.lastResult?.rescue?.used||0)+1,remaining:d.cardEffects.rescueLoanCharges},cash:d.cash},Y(d,me.width/2-d.view.x,176-d.view.y,`RESCUE +${R(e)}`,w.green),d.cash>=0?ul():(d.cardEffects?.rescueLoanCharges||0)>0?(d.phase="loanDecision",re.showEmergencyLoanDecision(dl,or)):or()}function or(){d.phase="gameover",re.showGameOver()}function fl(){d.shutdownTimeLeft<=0&&(d.shutdownTimeLeft=d.shutdownGraceSeconds||10);for(let e of d.eggFarms){if(e.shutterSparked)continue;e.shutterProgress=.02,e.shutterSparked=!0;let t=B(e.col,e.row);gt(d,t.x,t.y,w.ink),$t(d,t.x,t.y+10,10),Y(d,t.x,t.y-34,"SHUT +10s",w.ink)}}function pl(e){d.lastTimestamp||(d.lastTimestamp=e);let t=Math.min((e-d.lastTimestamp)/1e3,.05);d.lastTimestamp=e,d.frameId=(d.frameId||0)+1,Ne.beginFrame?.(d.frameId),sa(d,t),d.phase==="running"&&Ne.updateRunning(t,{closeFarmShutters:fl,completeTurn:Dd}),Ys(d,t,me,te.equipmentHitBoxes),Ne.updateCongestion(d.frameId),Ga(Md,me,d,{activeQueuedChick:Ne.activeQueuedChick,selectedObject:te.selectedObject,selectedTitle:te.selectedTitle}),$d(),re.updateUI(),bl(),zt(),requestAnimationFrame(pl)}function ao(){return d.view?.scale||1}function Dn(){d.view||(d.view={x:0,y:0,scale:1}),d.view.scale==null&&(d.view.scale=1)}function rr(e){let t=me.getBoundingClientRect();return{x:(e.clientX-t.left)*me.width/t.width,y:(e.clientY-t.top)*me.height/t.height}}function qt(e){let t=rr(e),n=ao();return{x:(t.x-(d.view?.x||0))/n,y:(t.y-(d.view?.y||0))/n}}function Ld(e){let t=ao();return{x:e.x*t+(d.view?.x||0),y:e.y*t+(d.view?.y||0)}}function Nd(){let e={left:p.x-90,top:p.y-130,right:p.x+p.cols*p.cell+260,bottom:p.y+p.rows*p.cell+220};if(d.phase==="build")for(let t of jt(d)){let n=Et(t);e.left=Math.min(e.left,n.x-60),e.top=Math.min(e.top,n.y-80),e.right=Math.max(e.right,n.x+n.w+80),e.bottom=Math.max(e.bottom,n.y+n.h+80)}return e}function sl(e,t){if(e<=t)return[e,t];let n=(e+t)/2;return[n,n]}function Lt(){Dn();let e=ao(),t=Nd(),[n,o]=sl(me.width-160-t.right*e,110-t.left*e),[r,i]=sl(me.height-150-t.bottom*e,150-t.top*e);d.view.x=Kn(d.view.x,n,o),d.view.y=Kn(d.view.y,r,i)}function yl(){Dn(),d.view.scale=1;let e=d.eggFarms?.[0],t=e?B(e.col,e.row):{x:p.x,y:p.y};d.view.x=280-t.x,d.view.y=190-t.y,Lt()}function Gd(e){if(!e)return!1;Dn();let t=ao();return d.view.x=me.width/2-e.x*t,d.view.y=me.height/2-e.y*t,Lt(),!0}function _d(e){let t=e?.ref;return t?e.type==="facility"?{x:t.x+t.w/2,y:t.y+t.h/2}:e.type==="eggFarm"?B(t.col,t.row):e.type==="scanner"?{x:B(t.col,t.row).x+p.cell/2,y:B(t.col,t.row).y}:e.type==="maintenanceRoom"?{x:B(t.col,t.row).x+p.cell/2,y:B(t.col,t.row).y+p.cell/2}:null:null}function Wd(){let e=vn(d),t=e.find(o=>o.type==="facility")||e[0]||Ud(),n=_d(t);Gd(n)&&t&&(d.selected={type:t.type,id:t.id})}function Ud(){let e=Object.values(d.facilities||{}).find(o=>o?.entry&&d.conveyorTiles.has(E(o.entry.col,o.entry.row)))||Object.values(d.facilities||{})[0];if(e)return{type:"facility",id:e.id,ref:e};let t=d.scanners?.find(o=>o);if(t)return{type:"scanner",id:t.id,ref:t};let n=d.eggFarms?.[0];return n?{type:"eggFarm",id:n.id,ref:n}:null}function Vd(e){let t=rr(e);Dn(),d.pan={start:t,viewX:d.view.x,viewY:d.view.y,moved:!1}}function Kd(e){if(!d.pan)return;let t=rr(e);Math.hypot(t.x-d.pan.start.x,t.y-d.pan.start.y)>5&&(d.pan.moved=!0),Dn(),d.view.x=d.pan.viewX+t.x-d.pan.start.x,d.view.y=d.pan.viewY+t.y-d.pan.start.y,Lt()}function qd(e){e.preventDefault(),Dn();let t=rr(e),n=qt(e),o=Math.exp(-e.deltaY*.0012),r=Kn(ao()*o,.55,1.8);d.view.scale=r,d.view.x=t.x-n.x*r,d.view.y=t.y-n.y*r,Lt(),Nt()}function zd(e){return e?e.type==="conveyor"?{type:"conveyor",id:e.oldKey}:{type:e.type,id:e.ref.id}:null}function Hd(e){return e?e.type==="conveyor"?{type:"conveyor",id:e.oldKey}:e.ref||null:null}function Nt(){N.hoverTooltip&&(N.hoverTooltip.classList.remove("visible"),N.hoverTooltip.setAttribute("aria-hidden","true"),d.hover=null)}function Yd(e,t){if(!N.hoverTooltip||d.phase!=="build"||d.cardTargetPick?.pending||d.groupDrag||d.selectionBox||d.pan)return Nt();let n=Hd(t);if(!n)return Nt();let o=te.selectedTitle(n),r=te.flavorText?te.flavorText(n):"",i=te.disconnectedWarningFor?te.disconnectedWarningFor(n):"",a=te.selectedInfoLines(n).slice(0,7);N.hoverTooltip.innerHTML=`<strong>${o}</strong>${i?`<em class="warning">${i}</em>`:r?`<em>${r}</em>`:""}${a.map(M=>`<span>${M}</span>`).join("")}`;let c=Math.min(window.innerWidth-330,e.clientX+18),b=Math.min(window.innerHeight-220,e.clientY+18);N.hoverTooltip.style.left=`${Math.max(8,c)}px`,N.hoverTooltip.style.top=`${Math.max(8,b)}px`,N.hoverTooltip.classList.add("visible"),N.hoverTooltip.setAttribute("aria-hidden","false"),d.hover={type:t.type,id:t.oldKey||t.ref?.id||null}}function Qd(e){if(d.phase!=="build")return Nt();Yd(e,te.equipmentAtPoint(qt(e)))}function hl(e){Nt();let t=qt(e),n=te.equipmentAtPoint(t),o=zd(n);if(!o){d.selected=null,d.multiSelected=[],re.updatePanels();return}d.selected=o,d.multiSelected=[o],re.updatePanels();let r=te.selectedObject();r?.type==="scanner"&&r.kind==="manual"&&te.showManualScannerMenu(r),r?.type==="scanner"&&r.kind==="auto"&&te.showAutoScannerMenu(r),r?.type==="facility"&&(r.baseId||r.id)==="inboundTruck"&&te.showInboundTruckMenu(r)}function On(){d.buildTool=null,d.selected=null,d.multiSelected=[],d.selectionBox=null,d.cardTargetPick?.mode==="autoScannerMenu"&&(d.cardTargetPick=null),re.hideModal(),Nt(),re.updatePanels(),re.updateUI()}function al(e){return String(e).replace(/[&<>"']/g,t=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[t])}function Xd(e){let t=e?.queue?.[0];return t==null?null:d.chicks.find(n=>n.id===t)||null}function jd(e){if(!e)return'<span class="scanner-current empty">WAIT</span>';let t=e.sex==="poop"?"POOP":e.sex==="male"?"M MALE":"F FEMALE";return`<span class="scanner-current ${e.sex}">${t}</span>`}function Jd(e,t){let n=new Set(d.eggFarms.map(C=>E(C.col,C.row))),o=new Map(d.scanners.map(C=>[E(C.col,C.row),C])),r=We(e,"inputA"),i=r?E(r.col,r.row):null,a=new Set(Object.values(d.facilities||{}).map(C=>C.entry?E(C.entry.col,C.entry.row):null).filter(Boolean)),c=t?.sex||"",b=c==="poop"?"P":c==="male"?"M":c==="female"?"F":"",M=[];for(let C=e.row-2;C<=e.row+2;C+=1)for(let $=e.col-2;$<=e.col+2;$+=1){let W=E($,C),K=["mini-cell"],G="";$===e.col&&C===e.row?(K.push("scanner"),c&&K.push(c),G=b||"S"):W===i?(K.push("input"),G="IN"):n.has(W)?(K.push("egg"),G="E"):o.has(W)?(K.push("scanner-other"),G="S"):a.has(W)?(K.push("port"),G="P"):d.conveyorTiles.has(W)?(K.push("belt"),G="."):d.blockedCells?.has?.(W)&&(K.push("blocked"),G="X"),M.push(`<span class="${K.join(" ")}">${G}</span>`)}return`<div class="scanner-mini-grid" aria-label="scanner vicinity">${M.join("")}</div>`}function Zd(e){let t=Ld(B(e.col,e.row)),n=76;return t.x<-n||t.y<-n||t.x>me.width+n||t.y>me.height+n}function bl(){if(!N.manualScannerMonitor)return;let e=d.frameCache||(d.frameCache={}),t=d.view||{},n=[d.phase,Math.round((t.x||0)*10),Math.round((t.y||0)*10),Math.round((t.scale||1)*100),d.chicks.length,d.scanners.map(r=>[r.id,r.kind,r.col,r.row,r.queue?.join(",")||"",r.keyPressSide||"",Math.ceil((r.keyPressTime||0)*10)].join(":")).join("|")].join(";");if(e.manualMonitorSignature===n)return;if(e.manualMonitorSignature=n,d.phase!=="running"){N.manualScannerMonitor.classList.remove("visible"),N.manualScannerMonitor.innerHTML="";return}let o=d.scanners.filter(r=>r.kind==="manual"&&Zd(r));if(!o.length){N.manualScannerMonitor.classList.remove("visible"),N.manualScannerMonitor.innerHTML="";return}N.manualScannerMonitor.innerHTML=o.map(r=>{let i=Xd(r),a=r.keys?.left?.label||(r.slot===0?"A":"Left"),c=r.keys?.right?.label||(r.slot===0?"D":"Right"),b=r.role===0?"MIXER":"WASTE",M=r.role===0?"S2":"TRUCK",C=i?"":" disabled";return`
|
|
<section class="scanner-monitor-card">
|
|
<header><strong>S${(r.slot??0)+1}</strong><span>OFFSCREEN / Q:${r.queue.length}</span></header>
|
|
<div class="scanner-mini-map">
|
|
<span>IN</span><b>${jd(i)}</b><span>SCANNER</span>
|
|
</div>
|
|
${Jd(r,i)}
|
|
<div class="scanner-monitor-actions">
|
|
<button type="button" data-scanner-id="${r.id}" data-side="left"${C}>${al(a)} -> ${b}</button>
|
|
<button type="button" data-scanner-id="${r.id}" data-side="right"${C}>${al(c)} -> ${M}</button>
|
|
</div>
|
|
</section>`}).join(""),N.manualScannerMonitor.classList.add("visible")}N.manualScannerMonitor?.addEventListener("click",e=>{let t=e.target.closest("button[data-scanner-id]");if(!t||t.disabled)return;let n=d.scanners.find(o=>o.id===Number(t.dataset.scannerId));n&&(Ne.sortScanner(n,t.dataset.side),bl())});me.addEventListener("contextmenu",e=>e.preventDefault());me.addEventListener("wheel",qd,{passive:!1});me.addEventListener("pointerdown",e=>{if(!["build","running"].includes(d.phase))return;if(e.button===2||e.button===1||d.phase==="running"&&e.button===0){me.setPointerCapture(e.pointerId),Vd(e);return}if(d.phase!=="build"||e.button!==0)return;me.setPointerCapture(e.pointerId);let t=qt(e);if(d.cardTargetPick?.mode==="autoScannerMenu"){On();return}if(d.cardTargetPick?.pending){Bn.chooseTargetAtPoint(t);return}let n=te.expansionOfferAtPoint?.(t);if(n){te.buyGridExpansion(n),Lt(),re.updatePanels(),re.updateUI();return}if(te.cycleBranchModeAtPoint?.(t)){re.updatePanels(),re.updateUI();return}let o=rt(t.x,t.y),r=te.equipmentAtPoint(t);if(!d.buildTool&&r?.type==="conveyor"&&o&&te.cycleSingleConveyorDirection?.(o)){re.updatePanels(),re.updateUI();return}if(d.buildTool==="erase"){if(!te.equipmentAtPoint(t)){On();return}te.eraseAtPoint(t);return}if(d.buildTool){let i=rt(t.x,t.y);if(!i&&!["mixer","trash","truck"].includes(d.buildTool)){On();return}if(d.buildTool==="conveyor"||d.buildTool==="boostConveyor"){te.beginConveyorDrag(i);return}if(te.equipmentAtPoint(t)){d.buildTool=null,hl(e);return}te.buildAtPoint(t);return}te.startGroupDrag(e)||te.startSelectionBox(e)});me.addEventListener("pointermove",e=>{if(d.pan&&e.buttons&7&&Kd(e),d.phase!=="build"){Nt();return}Qd(e),d.groupDrag&&e.buttons&1&&te.updateGroupDrag(e),d.selectionBox&&e.buttons&1&&te.updateSelectionBox(e),(d.buildTool==="conveyor"||d.buildTool==="boostConveyor")&&e.buttons&1&&te.continueConveyorDrag(rt(qt(e).x,qt(e).y)),d.buildTool==="erase"&&e.buttons&1&&te.eraseAtPoint(qt(e))});me.addEventListener("pointerup",e=>{d.selectionBox?te.finishSelectionBox():d.groupDrag&&(d.groupDrag.committed||hl(e),te.finishGroupDrag()),(e.button===2||e.button===1)&&d.pan&&!d.pan.moved&&d.buildTool&&d.phase==="build"&&On(),(d.buildTool==="conveyor"||d.buildTool==="boostConveyor")&&te.endConveyorDrag?.(),d.groupDrag=null,d.pan=null;try{me.releasePointerCapture(e.pointerId)}catch{}});me.addEventListener("pointerleave",Nt);me.addEventListener("pointercancel",()=>{te?.endConveyorDrag?.(),d.groupDrag=null,d.selectionBox=null,d.pan=null,Nt()});document.addEventListener("pointerdown",e=>{!N.modal.classList.contains("visible")||!N.modal.classList.contains("equipment-popover")||e.target.closest("#modal .modal-card")||On()},!0);N.buttons.s1Left.addEventListener("click",()=>Ne.sortSlot(0,"left"));N.buttons.s1Right.addEventListener("click",()=>Ne.sortSlot(0,"right"));N.buttons.s2Left.addEventListener("click",()=>Ne.sortSlot(1,"left"));N.buttons.s2Right.addEventListener("click",()=>Ne.sortSlot(1,"right"));N.buttons.nextTurn.addEventListener("click",Bd);N.buttons.conveyor.addEventListener("click",()=>te.setBuildTool("conveyor"));N.buttons.boostConveyor.addEventListener("click",()=>te.setBuildTool("boostConveyor"));N.buttons.powerWire?.addEventListener("click",()=>te.setBuildTool("powerWire"));N.buttons.insulatedPowerWire?.addEventListener("click",()=>te.setBuildTool("insulatedPowerWire"));N.buttons.powerOverlay?.addEventListener("click",()=>{d.powerOverlay=!d.powerOverlay,re.updatePanels()});N.buttons.footbridge?.addEventListener("click",()=>te.setBuildTool("footbridge"));N.buttons.eggFarm.addEventListener("click",()=>te.setBuildTool("eggFarm"));N.buttons.autoScanner.addEventListener("click",()=>te.setBuildTool("autoScanner"));N.buttons.manualScanner.addEventListener("click",()=>te.setBuildTool("manualScanner"));N.buttons.mixer.addEventListener("click",()=>te.setBuildTool("mixer"));N.buttons.trash.addEventListener("click",()=>te.setBuildTool("trash"));N.buttons.truck.addEventListener("click",()=>te.setBuildTool("truck"));N.buttons.inboundTruck?.addEventListener("click",()=>te.setBuildTool("inboundTruck"));N.buttons.sausageMaker.addEventListener("click",()=>te.setBuildTool("sausageMaker"));N.buttons.biomassGenerator?.addEventListener("click",()=>te.setBuildTool("biomassGenerator"));N.buttons.coalGenerator?.addEventListener("click",()=>te.setBuildTool("coalGenerator"));N.buttons.maintenanceRoom.addEventListener("click",()=>te.setBuildTool("maintenanceRoom"));N.buttons.erase.addEventListener("click",()=>te.setBuildTool("erase"));N.debug.setDay?.addEventListener("click",Ed);N.debug.zeroTimer?.addEventListener("click",Rd);N.debug.grantCard?.addEventListener("click",Id);N.debug.grantAllCards?.addEventListener("click",Ad);N.buttons.undo.addEventListener("click",()=>{Xr(d)&&(Lt(),re.updatePanels(),re.updateUI(),un())});N.buttons.redo.addEventListener("click",()=>{jr(d)&&(Lt(),re.updatePanels(),re.updateUI(),un())});function ll(e,t,n){let o=e.keys?.[t];return o?o.code&&n.code===o.code||o.key&&n.key.toLowerCase()===o.key:!1}window.addEventListener("keydown",e=>{if(e.repeat)return;let t=e.key.toLowerCase();if(d.phase==="running")for(let n of d.scanners.filter(o=>o.kind==="manual")){if(ll(n,"left",e)){e.preventDefault(),Ne.sortScanner(n,"left");return}if(ll(n,"right",e)){e.preventDefault(),Ne.sortScanner(n,"right");return}}if(d.phase==="build"&&(e.ctrlKey||e.metaKey)&&t==="z"&&(e.preventDefault(),Xr(d)&&(Lt(),re.updatePanels(),re.updateUI())),d.phase==="build"&&(e.ctrlKey||e.metaKey)&&(t==="y"||e.shiftKey&&t==="z")&&(e.preventDefault(),jr(d)&&(Lt(),re.updatePanels(),re.updateUI())),d.phase==="build"&&d.buildTool==="footbridge"&&t==="r"){e.preventDefault(),d.footbridgeOrientation=d.footbridgeOrientation==="horizontal"?"vertical":"horizontal",Y(d,me.width/2-d.view.x,86-d.view.y,`FOOTBRIDGE ${d.footbridgeOrientation.toUpperCase()}`,w.green),re.updatePanels();return}e.key==="Escape"&&d.cardTargetPick?.pending&&(e.preventDefault(),d.cardTargetPick.mode==="autoScannerMenu"?On():Bn.cancelTargetPick())});te=Qa({game:d,ui:N,canvas:me,canvasPoint:qt,onUpdatePanels:()=>re?.updatePanels()});Ne=il({game:d,currentConveyorSpeed:Fd,onGameOverCheck:()=>re?.checkGameOver()});Bn=Ba({game:d,ui:N,onUpdatePanels:()=>re?.updatePanels()});re=Xa({game:d,ui:N,build:te,startGame:Od,beginCardDraft:()=>Bn.showDraft(),activeQueuedChick:Ne.activeQueuedChick});Cd();xd();Ir(d);Be(d);Ne.updateCongestion(d.frameId||0);re.updatePanels();re.updateUI();re.showTitle();zt();requestAnimationFrame(pl);
|