Path: blob/main/assets/javascript/cookieclicker/minigameGarden.js
15352 views
var M={};1M.parent=Game.Objects['Farm'];2M.parent.minigame=M;3M.launch=function()4{5var M=this;6M.name=M.parent.minigameName;7M.init=function(div)8{9M.plants={10'bakerWheat':{11name:'Baker\'s wheat',12icon:0,13cost:1,14costM:30,15ageTick:7,16ageTickR:2,17mature:35,18children:['bakerWheat','thumbcorn','cronerice','bakeberry','clover','goldenClover','chocoroot','tidygrass'],19effsStr:'<div class="green">• +1% CpS</div>',20q:'A plentiful crop whose hardy grain is used to make flour for pastries.',21onHarvest:function(x,y,age)22{23if (age>=this.mature) M.dropUpgrade('Wheat slims',0.001);24},25},26'thumbcorn':{27name:'Thumbcorn',28icon:1,29cost:5,30costM:100,31ageTick:6,32ageTickR:2,33mature:20,34children:['bakerWheat','thumbcorn','cronerice','gildmillet','glovemorel'],35effsStr:'<div class="green">• +2% cookies per click</div>',36q:'A strangely-shaped variant of corn. The amount of strands that can sprout from one seed is usually in the single digits.',37},38'cronerice':{39name:'Cronerice',40icon:2,41cost:15,42costM:250,43ageTick:0.4,44ageTickR:0.7,45mature:55,46children:['thumbcorn','gildmillet','elderwort','wardlichen'],47effsStr:'<div class="green">• +3% grandma CpS</div>',48q:'Not only does this wrinkly bulb look nothing like rice, it\'s not even related to it either; its closest extant relative is the weeping willow.',49},50'gildmillet':{51name:'Gildmillet',52icon:3,53cost:15,54costM:1500,55ageTick:2,56ageTickR:1.5,57mature:40,58children:['clover','goldenClover','shimmerlily'],59effsStr:'<div class="green">• +1% golden cookie gains</div><div class="green">• +0.1% golden cookie effect duration</div>',60q:'An ancient staple crop, famed for its golden sheen. Was once used to bake birthday cakes for kings and queens of old.',61},62'clover':{63name:'Ordinary clover',64icon:4,65cost:25,66costM:77777,67ageTick:1,68ageTickR:1.5,69mature:35,70children:['goldenClover','greenRot','shimmerlily'],71effsStr:'<div class="green">• +1% golden cookie frequency</div>',72q:'<i>Trifolium repens</i>, a fairly mundane variety of clover with a tendency to produce four leaves. Such instances are considered lucky by some.',73},74'goldenClover':{75name:'Golden clover',76icon:5,77cost:125,78costM:777777777777,79ageTick:4,80ageTickR:12,81mature:50,82children:[],83effsStr:'<div class="green">• +3% golden cookie frequency</div>',84q:'A variant of the ordinary clover that traded its chlorophyll for pure organic gold. Tragically short-lived, this herb is an evolutionary dead-end - but at least it looks pretty.',85},86'shimmerlily':{87name:'Shimmerlily',88icon:6,89cost:60,90costM:777777,91ageTick:5,92ageTickR:6,93mature:70,94children:['elderwort','whiskerbloom','chimerose','cheapcap'],95effsStr:'<div class="green">• +1% golden cookie gains</div><div class="green">• +1% golden cookie frequency</div><div class="green">• +1% random drops</div>',96q:'These little flowers are easiest to find at dawn, as the sunlight refracting in dew drops draws attention to their pure-white petals.',97},98'elderwort':{99name:'Elderwort',100icon:7,101cost:60*3,102costM:100000000,103ageTick:0.3,104ageTickR:0.5,105mature:90,106immortal:1,107noContam:true,108detailsStr:'Immortal',109children:['everdaisy','ichorpuff','shriekbulb'],110effsStr:'<div class="green">• +1% wrath cookie gains</div><div class="green">• +1% wrath cookie frequency</div><div class="green">• +1% grandma CpS</div><div class="green">• immortal</div><div class="gray">• surrounding plants (3x3) age 3% faster</div>',111q:'A very old, long-forgotten subspecies of edelweiss that emits a strange, heady scent. There is some anecdotal evidence that these do not undergo molecular aging.',112onHarvest:function(x,y,age)113{114if (age>=this.mature) M.dropUpgrade('Elderwort biscuits',0.01);115},116},117'bakeberry':{118name:'Bakeberry',119icon:8,120cost:45,121costM:100000000,122ageTick:1,123ageTickR:1,124mature:50,125children:['queenbeet'],126effsStr:'<div class="green">• +1% CpS</div><div class="green">• harvest when mature for +30 minutes of CpS (max. 3% of bank)</div>',127q:'A favorite among cooks, this large berry has a crunchy brown exterior and a creamy red center. Excellent in pies or chicken stews.',128onHarvest:function(x,y,age)129{130if (age>=this.mature)131{132var moni=Math.min(Game.cookies*0.03,Game.cookiesPs*60*30);133if (moni!=0)134{135Game.Earn(moni);136Game.Popup('(Bakeberry)<br>+'+Beautify(moni)+' cookies!',Game.mouseX,Game.mouseY);137}138M.dropUpgrade('Bakeberry cookies',0.015);139}140},141},142'chocoroot':{143name:'Chocoroot',144icon:9,145cost:15,146costM:100000,147ageTick:4,148ageTickR:0,149mature:25,150detailsStr:'Predictable growth',151children:['whiteChocoroot','drowsyfern','queenbeet'],152effsStr:'<div class="green">• +1% CpS</div><div class="green">• harvest when mature for +3 minutes of CpS (max. 3% of bank)</div><div class="green">• predictable growth</div>',153q:'A tangly bramble coated in a sticky, sweet substance. Unknown genetic ancestry. Children often pick these from fields as-is as a snack.',154onHarvest:function(x,y,age)155{156if (age>=this.mature)157{158var moni=Math.min(Game.cookies*0.03,Game.cookiesPs*60*3);159if (moni!=0)160{161Game.Earn(moni);162Game.Popup('(Chocoroot)<br>+'+Beautify(moni)+' cookies!',Game.mouseX,Game.mouseY);163}164}165},166},167'whiteChocoroot':{168name:'White chocoroot',169icon:10,170cost:15,171costM:100000,172ageTick:4,173ageTickR:0,174mature:25,175detailsStr:'Predictable growth',176children:['whiskerbloom','tidygrass'],177effsStr:'<div class="green">• +1% golden cookie gains</div><div class="green">• harvest when mature for +3 minutes of CpS (max. 3% of bank)</div><div class="green">• predictable growth</div>',178q:'A pale, even sweeter variant of the chocoroot. Often impedes travelers with its twisty branches.',179onHarvest:function(x,y,age)180{181if (age>=this.mature)182{183var moni=Math.min(Game.cookies*0.03,Game.cookiesPs*60*3);184if (moni!=0)185{186Game.Earn(moni);187Game.Popup('(White chocoroot)<br>+'+Beautify(moni)+' cookies!',Game.mouseX,Game.mouseY);188}189}190},191},192193'whiteMildew':{194name:'White mildew',195fungus:true,196icon:26,197cost:20,198costM:9999,199ageTick:8,200ageTickR:12,201mature:70,202detailsStr:'Spreads easily',203children:['brownMold','whiteChocoroot','wardlichen','greenRot'],204effsStr:'<div class="green">• +1% CpS</div><div class="gray">• may spread as brown mold</div>',205q:'A common rot that infests shady plots of earth. Grows in little creamy capsules. Smells sweet, but sadly wilts quickly.',206},207'brownMold':{208name:'Brown mold',209fungus:true,210icon:27,211cost:20,212costM:9999,213ageTick:8,214ageTickR:12,215mature:70,216detailsStr:'Spreads easily',217children:['whiteMildew','chocoroot','keenmoss','wrinklegill'],218effsStr:'<div class="red">• -1% CpS</div><div class="gray">• may spread as white mildew</div>',219q:'A common rot that infests shady plots of earth. Grows in odd reddish clumps. Smells bitter, but thankfully wilts quickly.',220},221222'meddleweed':{223name:'Meddleweed',224weed:true,225icon:29,226cost:1,227costM:10,228ageTick:10,229ageTickR:6,230mature:50,231contam:0.05,232detailsStr:'Grows in empty tiles, spreads easily',233children:['meddleweed','brownMold','crumbspore'],234effsStr:'<div class="red">• useless</div><div class="red">• may overtake nearby plants</div><div class="gray">• may sometimes drop spores when uprooted</div>',235q:'The sign of a neglected farmland, this annoying weed spawns from unused dirt and may sometimes spread to other plants, killing them in the process.',236onKill:function(x,y,age)237{238if (Math.random()<0.2*(age/100)) M.plot[y][x]=[M.plants[choose(['brownMold','crumbspore'])].id+1,0];239},240},241242'whiskerbloom':{243name:'Whiskerbloom',244icon:11,245cost:20,246costM:1000000,247ageTick:2,248ageTickR:2,249mature:60,250children:['chimerose','nursetulip'],251effsStr:'<div class="green">• +0.2% effects from milk</div>',252q:'Squeezing the translucent pods makes them excrete a milky liquid, while producing a faint squeak akin to a cat\'s meow.',253},254'chimerose':{255name:'Chimerose',256icon:12,257cost:15,258costM:242424,259ageTick:1,260ageTickR:1.5,261mature:30,262children:['chimerose'],263effsStr:'<div class="green">• +1% reindeer gains</div><div class="green">• +1% reindeer frequency</div>',264q:'Originating in the greener flanks of polar mountains, this beautiful flower with golden accents is fragrant enough to make any room feel a little bit more festive.',265},266'nursetulip':{267name:'Nursetulip',268icon:13,269cost:40,270costM:1000000000,271ageTick:0.5,272ageTickR:2,273mature:60,274children:[],275effsStr:'<div class="green">• surrounding plants (3x3) are 20% more efficient</div><div class="red">• -2% CpS</div>',276q:'This flower grows an intricate root network that distributes nutrients throughout the surrounding soil. The reason for this seemingly altruistic behavior is still unknown.',277},278'drowsyfern':{279name:'Drowsyfern',280icon:14,281cost:90,282costM:100000,283ageTick:0.05,284ageTickR:0.1,285mature:30,286children:[],287effsStr:'<div class="green">• +3% CpS</div><div class="red">• -5% cookies per click</div><div class="red">• -10% golden cookie frequency</div>',288q:'Traditionally used to brew a tea that guarantees a good night of sleep.',289onHarvest:function(x,y,age)290{291if (age>=this.mature) M.dropUpgrade('Fern tea',0.01);292},293},294'wardlichen':{295name:'Wardlichen',296icon:15,297cost:10,298costM:10000,299ageTick:5,300ageTickR:4,301mature:65,302children:['wardlichen'],303effsStr:'<div class="gray">• 2% less wrath cookies</div><div class="gray">• wrinklers spawn 15% slower</div>',304q:'The metallic stench that emanates from this organism has been known to keep insects and slugs away.',305},306'keenmoss':{307name:'Keenmoss',308icon:16,309cost:50,310costM:1000000,311ageTick:4,312ageTickR:5,313mature:65,314children:['drowsyfern','wardlichen','keenmoss'],315effsStr:'<div class="green">• +3% random drops</div>',316q:'Fuzzy to the touch and of a vibrant green. In plant symbolism, keenmoss is associated with good luck for finding lost objects.',317},318'queenbeet':{319name:'Queenbeet',320icon:17,321cost:60*1.5,322costM:1000000000,323ageTick:1,324ageTickR:0.4,325mature:80,326noContam:true,327children:['duketater','queenbeetLump','shriekbulb'],328effsStr:'<div class="green">• +0.3% golden cookie effect duration</div><div class="red">• -2% CpS</div><div class="green">• harvest when mature for +1 hour of CpS (max. 4% of bank)</div>',329q:'A delicious taproot used to prepare high-grade white sugar. Entire countries once went to war over these.',330onHarvest:function(x,y,age)331{332if (age>=this.mature)333{334var moni=Math.min(Game.cookies*0.04,Game.cookiesPs*60*60);335if (moni!=0)336{337Game.Earn(moni);338Game.Popup('(Queenbeet)<br>+'+Beautify(moni)+' cookies!',Game.mouseX,Game.mouseY);339}340}341},342},343'queenbeetLump':{344name:'Juicy queenbeet',345icon:18,346plantable:false,347cost:60*2,348costM:1000000000000,349ageTick:0.04,350ageTickR:0.08,351mature:85,352noContam:true,353children:[],354effsStr:'<div class="red">• -10% CpS</div><div class="red">• surrounding plants (3x3) are 20% less efficient</div><div class="green">• harvest when mature for a sugar lump</div>',355q:'A delicious taproot used to prepare high-grade white sugar. Entire countries once went to war over these.<br>It looks like this one has grown especially sweeter and juicier from growing in close proximity to other queenbeets.',356onHarvest:function(x,y,age)357{358if (age>=this.mature)359{360Game.gainLumps(1);361popup='(Juicy queenbeet)<br>Sweet!<div style="font-size:65%;">Found 1 sugar lump!</div>';362}363},364},365'duketater':{366name:'Duketater',367icon:19,368cost:60*8,369costM:1000000000000,370ageTick:0.4,371ageTickR:0.1,372mature:95,373noContam:true,374children:['shriekbulb'],375effsStr:'<div class="green">• harvest when mature for +2 hours of CpS (max. 8% of bank)</div>',376q:'A rare, rich-tasting tuber fit for a whole meal, as long as its strict harvesting schedule is respected. Its starch has fascinating baking properties.',377onHarvest:function(x,y,age)378{379if (age>=this.mature)380{381var moni=Math.min(Game.cookies*0.08,Game.cookiesPs*60*60*2);382if (moni!=0)383{384Game.Earn(moni);385Game.Popup('(Duketater)<br>+'+Beautify(moni)+' cookies!',Game.mouseX,Game.mouseY);386}387M.dropUpgrade('Duketater cookies',0.005);388}389},390},391'crumbspore':{392name:'Crumbspore',393fungus:true,394icon:20,395cost:10,396costM:999,397ageTick:3,398ageTickR:3,399mature:65,400contam:0.03,401noContam:true,402detailsStr:'Spreads easily',403children:['crumbspore','glovemorel','cheapcap','doughshroom','wrinklegill','ichorpuff'],404effsStr:'<div class="green">• explodes into up to 1 minute of CpS at the end of its lifecycle (max. 1% of bank)</div><div class="red">• may overtake nearby plants</div>',405q:'An archaic mold that spreads its spores to the surrounding dirt through simple pod explosion.',406onDie:function(x,y)407{408var moni=Math.min(Game.cookies*0.01,Game.cookiesPs*60)*Math.random();409if (moni!=0)410{411Game.Earn(moni);412Game.Popup('(Crumbspore)<br>+'+Beautify(moni)+' cookies!',Game.mouseX,Game.mouseY);413}414},415},416'doughshroom':{417name:'Doughshroom',418fungus:true,419icon:24,420cost:100,421costM:100000000,422ageTick:1,423ageTickR:2,424mature:85,425contam:0.03,426noContam:true,427detailsStr:'Spreads easily',428children:['crumbspore','doughshroom','foolBolete','shriekbulb'],429effsStr:'<div class="green">• explodes into up to 5 minutes of CpS at the end of its lifecycle (max. 3% of bank)</div><div class="red">• may overtake nearby plants</div>',430q:'Jammed full of warm spores; some forest walkers often describe the smell as similar to passing by a bakery.',431onDie:function(x,y)432{433var moni=Math.min(Game.cookies*0.03,Game.cookiesPs*60*5)*Math.random();434if (moni!=0)435{436Game.Earn(moni);437Game.Popup('(Doughshroom)<br>+'+Beautify(moni)+' cookies!',Game.mouseX,Game.mouseY);438}439},440},441'glovemorel':{442name:'Glovemorel',443fungus:true,444icon:21,445cost:30,446costM:10000,447ageTick:3,448ageTickR:18,449mature:80,450children:[],451effsStr:'<div class="green">• +4% cookies per click</div><div class="green">• +1% cursor CpS</div><div class="red">• -1% CpS</div>',452q:'Touching its waxy skin reveals that the interior is hollow and uncomfortably squishy.',453},454'cheapcap':{455name:'Cheapcap',456fungus:true,457icon:22,458cost:40,459costM:100000,460ageTick:6,461ageTickR:16,462mature:40,463children:[],464effsStr:'<div class="green">• buildings and upgrades are 0.2% cheaper</div><div class="red">• cannot handle cold climates; 15% chance to die when frozen</div>',465q:'Small, tough, and good in omelettes. Some historians propose that the heads of dried cheapcaps were once used as currency in some bronze age societies.',466},467'foolBolete':{468name:'Fool\'s bolete',469fungus:true,470icon:23,471cost:15,472costM:10000,473ageTick:5,474ageTickR:25,475mature:50,476children:[],477effsStr:'<div class="green">• +2% golden cookie frequency</div><div class="red">• -5% golden cookie gains</div><div class="red">• -2% golden cookie duration</div><div class="red">• -2% golden cookie effect duration</div>',478q:'Named for its ability to fool mushroom pickers. The fool\'s bolete is not actually poisonous, it\'s just extremely bland.',479},480'wrinklegill':{481name:'Wrinklegill',482fungus:true,483icon:25,484cost:20,485costM:1000000,486ageTick:1,487ageTickR:3,488mature:65,489children:['elderwort','shriekbulb'],490effsStr:'<div class="gray">• wrinklers spawn 2% faster</div><div class="gray">• wrinklers eat 1% more</div>',491q:'This mushroom\'s odor resembles that of a well-done steak, and is said to whet the appetite - making one\'s stomach start gurgling within seconds.',492},493'greenRot':{494name:'Green rot',495fungus:true,496icon:28,497cost:60,498costM:1000000,499ageTick:12,500ageTickR:13,501mature:65,502children:['keenmoss','foolBolete'],503effsStr:'<div class="green">• +0.5% golden cookie duration</div><div class="green">• +1% golden cookie frequency</div><div class="green">• +1% random drops</div>',504q:'This short-lived mold is also known as "emerald pebbles", and is considered by some as a pseudo-gem that symbolizes good fortune.',505onHarvest:function(x,y,age)506{507if (age>=this.mature) M.dropUpgrade('Green yeast digestives',0.005);508},509},510'shriekbulb':{511name:'Shriekbulb',512icon:30,513cost:60,514costM:4444444444444,515ageTick:3,516ageTickR:1,517mature:60,518noContam:true,519detailsStr:'The unfortunate result of some plant combinations',520children:['shriekbulb'],521effsStr:'<div class="red">• -2% CpS</div><div class="red">• surrounding plants (3x3) are 5% less efficient</div>',522q:'A nasty vegetable with a dreadful quirk : its flesh resonates with a high-pitched howl whenever it is hit at the right angle by sunlight, moonlight, or even a slight breeze.',523},524'tidygrass':{525name:'Tidygrass',526icon:31,527cost:90,528costM:100000000000000,529ageTick:0.5,530ageTickR:0,531mature:40,532children:['everdaisy'],533effsStr:'<div class="green">• surrounding tiles (5x5) develop no weeds or fungus</div>',534q:'The molecules this grass emits are a natural weedkiller. Its stems grow following a predictable pattern, making it an interesting -if expensive- choice for a lawn grass.',535},536'everdaisy':{537name:'Everdaisy',538icon:32,539cost:180,540costM:100000000000000000000,541ageTick:0.3,542ageTickR:0,543mature:75,544noContam:true,545immortal:1,546detailsStr:'Immortal',547children:[],548effsStr:'<div class="green">• surrounding tiles (3x3) develop no weeds or fungus</div><div class="green">• immortal</div>',549q:'While promoted by some as a superfood owing to its association with longevity and intriguing geometry, this elusive flower is actually mildly toxic.',550},551'ichorpuff':{552name:'Ichorpuff',553fungus:true,554icon:33,555cost:120,556costM:987654321,557ageTick:1,558ageTickR:1.5,559mature:35,560children:[],561effsStr:'<div class="green">• surrounding plants (3x3) age half as fast</div><div class="red">• surrounding plants (3x3) are half as efficient</div>',562q:'This puffball mushroom contains sugary spores, but it never seems to mature to bursting on its own. Surrounding plants under its influence have a very slow metabolism, reducing their effects but lengthening their lifespan.',563onHarvest:function(x,y,age)564{565if (age>=this.mature) M.dropUpgrade('Ichor syrup',0.005);566},567},568};569M.plantsById=[];var n=0;570for (var i in M.plants)571{572M.plants[i].unlocked=0;573M.plants[i].id=n;574M.plants[i].key=i;575M.plants[i].matureBase=M.plants[i].mature;576M.plantsById[n]=M.plants[i];577if (typeof M.plants[i].plantable==='undefined') {M.plants[i].plantable=true;}578n++;579}580M.plantsN=M.plantsById.length;581M.plantsUnlockedN=0;582M.getUnlockedN=function()583{584M.plantsUnlockedN=0;585for (var i in M.plants){if (M.plants[i].unlocked) M.plantsUnlockedN++;}586if (M.plantsUnlockedN>=M.plantsN)587{588Game.Win('Keeper of the conservatory');589l('gardenTool-3').classList.remove('locked');590}591else l('gardenTool-3').classList.add('locked');592593return M.plantsUnlockedN;594}595596M.dropUpgrade=function(upgrade,rate)597{598if (!Game.Has(upgrade) && Math.random()<=rate*Game.dropRateMult()*(Game.HasAchiev('Seedless to nay')?1.05:1))599{600Game.Unlock(upgrade);601}602}603604M.computeMatures=function()605{606var mult=1;607if (Game.HasAchiev('Seedless to nay')) mult=0.95;608for (var i in M.plants)609{610M.plants[i].mature=M.plants[i].matureBase*mult;611}612}613614M.plantContam={};615for (var i in M.plants)616{617if (M.plants[i].contam) M.plantContam[M.plants[i].key]=M.plants[i].contam;618}619620M.getMuts=function(neighs,neighsM)621{622//get possible mutations given a list of neighbors623//note : neighs stands for neighbors, not horsey noises624var muts=[];625626if (neighsM['bakerWheat']>=2) muts.push(['bakerWheat',0.2],['thumbcorn',0.05],['bakeberry',0.001]);627if (neighsM['bakerWheat']>=1 && neighsM['thumbcorn']>=1) muts.push(['cronerice',0.01]);628if (neighsM['thumbcorn']>=2) muts.push(['thumbcorn',0.1],['bakerWheat',0.05]);629if (neighsM['cronerice']>=1 && neighsM['thumbcorn']>=1) muts.push(['gildmillet',0.03]);630if (neighsM['cronerice']>=2) muts.push(['thumbcorn',0.02]);631if (neighsM['bakerWheat']>=1 && neighsM['gildmillet']>=1) muts.push(['clover',0.03],['goldenClover',0.0007]);632if (neighsM['clover']>=1 && neighsM['gildmillet']>=1) muts.push(['shimmerlily',0.02]);633if (neighsM['clover']>=2 && neighs['clover']<5) muts.push(['clover',0.007],['goldenClover',0.0001]);634if (neighsM['clover']>=4) muts.push(['goldenClover',0.0007]);635if (neighsM['shimmerlily']>=1 && neighsM['cronerice']>=1) muts.push(['elderwort',0.01]);636if (neighsM['wrinklegill']>=1 && neighsM['cronerice']>=1) muts.push(['elderwort',0.002]);637if (neighsM['bakerWheat']>=1 && neighs['brownMold']>=1) muts.push(['chocoroot',0.1]);638if (neighsM['chocoroot']>=1 && neighs['whiteMildew']>=1) muts.push(['whiteChocoroot',0.1]);639if (neighsM['whiteMildew']>=1 && neighs['brownMold']<=1) muts.push(['brownMold',0.5]);640if (neighsM['brownMold']>=1 && neighs['whiteMildew']<=1) muts.push(['whiteMildew',0.5]);641if (neighsM['meddleweed']>=1 && neighs['meddleweed']<=3) muts.push(['meddleweed',0.15]);642643if (neighsM['shimmerlily']>=1 && neighsM['whiteChocoroot']>=1) muts.push(['whiskerbloom',0.01]);644if (neighsM['shimmerlily']>=1 && neighsM['whiskerbloom']>=1) muts.push(['chimerose',0.05]);645if (neighsM['chimerose']>=2) muts.push(['chimerose',0.005]);646if (neighsM['whiskerbloom']>=2) muts.push(['nursetulip',0.05]);647if (neighsM['chocoroot']>=1 && neighsM['keenmoss']>=1) muts.push(['drowsyfern',0.005]);648if ((neighsM['cronerice']>=1 && neighsM['keenmoss']>=1) || (neighsM['cronerice']>=1 && neighsM['whiteMildew']>=1)) muts.push(['wardlichen',0.005]);649if (neighsM['wardlichen']>=1 && neighs['wardlichen']<2) muts.push(['wardlichen',0.05]);650if (neighsM['greenRot']>=1 && neighsM['brownMold']>=1) muts.push(['keenmoss',0.1]);651if (neighsM['keenmoss']>=1 && neighs['keenmoss']<2) muts.push(['keenmoss',0.05]);652if (neighsM['chocoroot']>=1 && neighsM['bakeberry']>=1) muts.push(['queenbeet',0.01]);653if (neighsM['queenbeet']>=8) muts.push(['queenbeetLump',0.001]);654if (neighsM['queenbeet']>=2) muts.push(['duketater',0.001]);655656if (neighsM['crumbspore']>=1 && neighs['crumbspore']<=1) muts.push(['crumbspore',0.07]);657if (neighsM['crumbspore']>=1 && neighsM['thumbcorn']>=1) muts.push(['glovemorel',0.02]);658if (neighsM['crumbspore']>=1 && neighsM['shimmerlily']>=1) muts.push(['cheapcap',0.04]);659if (neighsM['doughshroom']>=1 && neighsM['greenRot']>=1) muts.push(['foolBolete',0.04]);660if (neighsM['crumbspore']>=2) muts.push(['doughshroom',0.005]);661if (neighsM['doughshroom']>=1 && neighs['doughshroom']<=1) muts.push(['doughshroom',0.07]);662if (neighsM['doughshroom']>=2) muts.push(['crumbspore',0.005]);663if (neighsM['crumbspore']>=1 && neighsM['brownMold']>=1) muts.push(['wrinklegill',0.06]);664if (neighsM['whiteMildew']>=1 && neighsM['clover']>=1) muts.push(['greenRot',0.05]);665666if (neighsM['wrinklegill']>=1 && neighsM['elderwort']>=1) muts.push(['shriekbulb',0.001]);667if (neighsM['elderwort']>=5) muts.push(['shriekbulb',0.001]);668if (neighs['duketater']>=3) muts.push(['shriekbulb',0.005]);669if (neighs['doughshroom']>=4) muts.push(['shriekbulb',0.002]);670if (neighsM['queenbeet']>=5) muts.push(['shriekbulb',0.001]);671if (neighs['shriekbulb']>=1 && neighs['shriekbulb']<2) muts.push(['shriekbulb',0.005]);672673if (neighsM['bakerWheat']>=1 && neighsM['whiteChocoroot']>=1) muts.push(['tidygrass',0.002]);674if (neighsM['tidygrass']>=3 && neighsM['elderwort']>=3) muts.push(['everdaisy',0.002]);675if (neighsM['elderwort']>=1 && neighsM['crumbspore']>=1) muts.push(['ichorpuff',0.002]);676677return muts;678}679680M.computeBoostPlot=function()681{682//some plants apply effects to surrounding tiles683//this function computes those effects by creating a grid in which those effects stack684for (var y=0;y<6;y++)685{686for (var x=0;x<6;x++)687{688//age mult, power mult, weed mult689M.plotBoost[y][x]=[1,1,1];690}691}692693var effectOn=function(X,Y,s,mult)694{695for (var y=Math.max(0,Y-s);y<Math.min(6,Y+s+1);y++)696{697for (var x=Math.max(0,X-s);x<Math.min(6,X+s+1);x++)698{699if (X==x && Y==y) {}700else701{702for (var i=0;i<mult.length;i++)703{704M.plotBoost[y][x][i]*=mult[i];705}706}707}708}709}710for (var y=0;y<6;y++)711{712for (var x=0;x<6;x++)713{714var tile=M.plot[y][x];715if (tile[0]>0)716{717var me=M.plantsById[tile[0]-1];718var name=me.key;719var stage=0;720if (tile[1]>=me.mature) stage=4;721else if (tile[1]>=me.mature*0.666) stage=3;722else if (tile[1]>=me.mature*0.333) stage=2;723else stage=1;724725var soilMult=M.soilsById[M.soil].effMult;726var mult=soilMult;727728if (stage==1) mult*=0.1;729else if (stage==2) mult*=0.25;730else if (stage==3) mult*=0.5;731else mult*=1;732733//age mult, power mult, weed mult734/*if (name=='elderwort') effectOn(x,y,1,[1+0.03*mult,1,1]);735else if (name=='queenbeetLump') effectOn(x,y,1,[1,1-0.2*mult,1]);736else if (name=='nursetulip') effectOn(x,y,1,[1,1+0.2*mult,1]);737else if (name=='shriekbulb') effectOn(x,y,1,[1,1-0.05*mult,1]);738else if (name=='tidygrass') effectOn(x,y,2,[1,1,0]);739else if (name=='everdaisy') effectOn(x,y,1,[1,1,0]);740else if (name=='ichorpuff') effectOn(x,y,1,[1-0.5*mult,1-0.5*mult,1]);*/741742var ageMult=1;743var powerMult=1;744var weedMult=1;745var range=0;746747if (name=='elderwort') {ageMult=1.03;range=1;}748else if (name=='queenbeetLump') {powerMult=0.8;range=1;}749else if (name=='nursetulip') {powerMult=1.2;range=1;}750else if (name=='shriekbulb') {powerMult=0.95;range=1;}751else if (name=='tidygrass') {weedMult=0;range=2;}752else if (name=='everdaisy') {weedMult=0;range=1;}753else if (name=='ichorpuff') {ageMult=0.5;powerMult=0.5;range=1;}754755//by god i hope these are right756if (ageMult>=1) ageMult=(ageMult-1)*mult+1; else if (mult>=1) ageMult=1/((1/ageMult)*mult); else ageMult=1-(1-ageMult)*mult;757if (powerMult>=1) powerMult=(powerMult-1)*mult+1; else if (mult>=1) powerMult=1/((1/powerMult)*mult); else powerMult=1-(1-powerMult)*mult;758759if (range>0) effectOn(x,y,range,[ageMult,powerMult,weedMult]);760}761}762}763}764765M.computeEffs=function()766{767M.toCompute=false;768var effs={769cps:1,770click:1,771cursorCps:1,772grandmaCps:1,773goldenCookieGain:1,774goldenCookieFreq:1,775goldenCookieDur:1,776goldenCookieEffDur:1,777wrathCookieGain:1,778wrathCookieFreq:1,779wrathCookieDur:1,780wrathCookieEffDur:1,781reindeerGain:1,782reindeerFreq:1,783reindeerDur:1,784itemDrops:1,785milk:1,786wrinklerSpawn:1,787wrinklerEat:1,788upgradeCost:1,789buildingCost:1,790};791792if (!M.freeze)793{794var soilMult=M.soilsById[M.soil].effMult;795796for (var y=0;y<6;y++)797{798for (var x=0;x<6;x++)799{800var tile=M.plot[y][x];801if (tile[0]>0)802{803var me=M.plantsById[tile[0]-1];804var name=me.key;805var stage=0;806if (tile[1]>=me.mature) stage=4;807else if (tile[1]>=me.mature*0.666) stage=3;808else if (tile[1]>=me.mature*0.333) stage=2;809else stage=1;810811var mult=soilMult;812813if (stage==1) mult*=0.1;814else if (stage==2) mult*=0.25;815else if (stage==3) mult*=0.5;816else mult*=1;817818mult*=M.plotBoost[y][x][1];819820if (name=='bakerWheat') effs.cps+=0.01*mult;821else if (name=='thumbcorn') effs.click+=0.02*mult;822else if (name=='cronerice') effs.grandmaCps+=0.03*mult;823else if (name=='gildmillet') {effs.goldenCookieGain+=0.01*mult;effs.goldenCookieEffDur+=0.001*mult;}824else if (name=='clover') effs.goldenCookieFreq+=0.01*mult;825else if (name=='goldenClover') effs.goldenCookieFreq+=0.03*mult;826else if (name=='shimmerlily') {effs.goldenCookieGain+=0.01*mult;effs.goldenCookieFreq+=0.01*mult;effs.itemDrops+=0.01*mult;}827else if (name=='elderwort') {effs.wrathCookieGain+=0.01*mult;effs.wrathCookieFreq+=0.01*mult;effs.grandmaCps+=0.01*mult;}828else if (name=='bakeberry') effs.cps+=0.01*mult;829else if (name=='chocoroot') effs.cps+=0.01*mult;830else if (name=='whiteChocoroot') effs.goldenCookieGain+=0.01*mult;831832else if (name=='whiteMildew') effs.cps+=0.01*mult;833else if (name=='brownMold') effs.cps*=1-0.01*mult;834835else if (name=='meddleweed') {}836837else if (name=='whiskerbloom') effs.milk+=0.002*mult;838else if (name=='chimerose') {effs.reindeerGain+=0.01*mult;effs.reindeerFreq+=0.01*mult;}839840else if (name=='nursetulip') {effs.cps*=1-0.02*mult;}841else if (name=='drowsyfern') {effs.cps+=0.03*mult;effs.click*=1-0.05*mult;effs.goldenCookieFreq*=1-0.1*mult;}842else if (name=='wardlichen') {effs.wrinklerSpawn*=1-0.15*mult;effs.wrathCookieFreq*=1-0.02*mult;}843else if (name=='keenmoss') {effs.itemDrops+=0.03*mult;}844else if (name=='queenbeet') {effs.goldenCookieEffDur+=0.003*mult;effs.cps*=1-0.02*mult;}845else if (name=='queenbeetLump') {effs.cps*=1-0.1*mult;}846else if (name=='glovemorel') {effs.click+=0.04*mult;effs.cursorCps+=0.01*mult;effs.cps*=1-0.01*mult;}847else if (name=='cheapcap') {effs.upgradeCost*=1-0.002*mult;effs.buildingCost*=1-0.002*mult;}848else if (name=='foolBolete') {effs.goldenCookieFreq+=0.02*mult;effs.goldenCookieGain*=1-0.05*mult;effs.goldenCookieDur*=1-0.02*mult;effs.goldenCookieEffDur*=1-0.02*mult;}849else if (name=='wrinklegill') {effs.wrinklerSpawn+=0.02*mult;effs.wrinklerEat+=0.01*mult;}850else if (name=='greenRot') {effs.goldenCookieDur+=0.005*mult;effs.goldenCookieFreq+=0.01*mult;effs.itemDrops+=0.01*mult;}851else if (name=='shriekbulb') {effs.cps*=1-0.02*mult;}852}853}854}855}856M.effs=effs;857Game.recalculateGains=1;858}859860861M.soils={862'dirt':{863name:'Dirt',864icon:0,865tick:5,866effMult:1,867weedMult:1,868req:0,869effsStr:'<div class="gray">• tick every <b>5 minutes</b></div>',870q:'Simple, regular old dirt that you\'d find in nature.',871},872'fertilizer':{873name:'Fertilizer',874icon:1,875tick:3,876effMult:0.75,877weedMult:1.2,878req:50,879effsStr:'<div class="gray">• tick every <b>3 minutes</b></div><div class="red">• passive plant effects <b>-25%</b></div><div class="red">• weeds appear <b>20%</b> more</div>',880q:'Soil with a healthy helping of fresh manure. Plants grow faster but are less efficient.',881},882'clay':{883name:'Clay',884icon:2,885tick:15,886effMult:1.25,887weedMult:1,888req:100,889effsStr:'<div class="gray">• tick every <b>15 minutes</b></div><div class="green">• passive plant effects <b>+25%</b></div>',890q:'Rich soil with very good water retention. Plants grow slower but are more efficient.',891},892'pebbles':{893name:'Pebbles',894icon:3,895tick:5,896effMult:0.25,897weedMult:0.1,898req:200,899effsStr:'<div class="gray">• tick every <b>5 minutes</b></div><div class="red">• passive plant effects <b>-75%</b></div><div class="green">• <b>35% chance</b> of collecting seeds automatically when plants expire</div><div class="green">• weeds appear <b>10 times</b> less</div>',900q:'Dry soil made of small rocks tightly packed together. Not very conductive to plant health, but whatever falls off your crops will be easy to retrieve.<br>Useful if you\'re one of those farmers who just want to find new seeds without having to tend their garden too much.',901},902'woodchips':{903name:'Wood chips',904icon:4,905tick:5,906effMult:0.25,907weedMult:0.1,908req:300,909effsStr:'<div class="gray">• tick every <b>5 minutes</b></div><div class="red">• passive plant effects <b>-75%</b></div><div class="green">• plants spread and mutate <b>3 times more</b></div><div class="green">• weeds appear <b>10 times</b> less</div>',910q:'Soil made of bits and pieces of bark and sawdust. Helpful for young sprouts to develop, not so much for mature plants.',911},912};913M.soilsById=[];var n=0;for (var i in M.soils){M.soils[i].id=n;M.soils[i].key=i;M.soilsById[n]=M.soils[i];n++;}914915916M.tools={917'info':{918name:'Garden information',919icon:3,920desc:'-',921descFunc:function()922{923var str='';924if (M.freeze) str='Your garden is frozen, providing no effects.';925else926{927var effs={928cps:{n:'CpS'},929click:{n:'cookies/click'},930cursorCps:{n:'cursor CpS'},931grandmaCps:{n:'grandma CpS'},932goldenCookieGain:{n:'golden cookie gains'},933goldenCookieFreq:{n:'golden cookie frequency'},934goldenCookieDur:{n:'golden cookie duration'},935goldenCookieEffDur:{n:'golden cookie effect duration'},936wrathCookieGain:{n:'wrath cookie gains'},937wrathCookieFreq:{n:'wrath cookie frequency'},938wrathCookieDur:{n:'wrath cookie duration'},939wrathCookieEffDur:{n:'wrath cookie effect duration'},940reindeerGain:{n:'reindeer gains'},941reindeerFreq:{n:'reindeer cookie frequency'},942reindeerDur:{n:'reindeer cookie duration'},943itemDrops:{n:'random drops'},944milk:{n:'milk effects'},945wrinklerSpawn:{n:'wrinkler spawn rate'},946wrinklerEat:{n:'wrinkler appetite'},947upgradeCost:{n:'upgrade costs',rev:true},948buildingCost:{n:'building costs',rev:true},949};950951var effStr='';952for (var i in M.effs)953{954if (M.effs[i]!=1 && effs[i])955{956var amount=(M.effs[i]-1)*100;957effStr+='<div style="font-size:10px;margin-left:64px;"><b>• '+effs[i].n+' :</b> <span class="'+((amount*(effs[i].rev?-1:1))>0?'green':'red')+'">'+(amount>0?'+':'-')+Beautify(Math.abs(M.effs[i]-1)*100,2)+'%</span></div>';958}959}960if (effStr=='') effStr='<div style="font-size:10px;margin-left:64px;"><b>None.</b></div>';961str+='<div>Combined effects of all your plants :</div>'+effStr;962}963str+='<div class="line"></div>';964str+='<img src="img/gardenTip.png" style="float:right;margin:0px 0px 8px 8px;"/><small style="line-height:100%;">• You can cross-breed plants by planting them close to each other; new plants will grow in the empty tiles next to them.<br>• Unlock new seeds by harvesting mature plants.<br>• When you ascend, your garden plants are reset, but you keep all the seeds you\'ve unlocked.<br>• Your garden has no effect and does not grow while the game is closed.</small>';965return str;966},967func:function(){},968},969'harvestAll':{970name:'Harvest all',971icon:0,972descFunc:function(){return 'Instantly harvest all plants in your garden.<div class="line"></div>'+((Game.keys[16] && Game.keys[17])?'<b>You are holding shift+ctrl.</b> Only mature, mortal plants will be harvested.':'Shift+ctrl+click to harvest only mature, mortal plants.');},973func:function(){974PlaySound('snd/toneTick.mp3');975/*if (M.freeze){return false;}*/976if (Game.keys[16] && Game.keys[17]) M.harvestAll(0,1,1);//ctrl & shift, harvest only mature non-immortal plants977else M.harvestAll();978},979},980'freeze':{981name:'Freeze',982icon:1,983descFunc:function()984{985return 'Cryogenically preserve your garden.<br>Plants no longer grow, spread or die; they provide no benefits.<br>Soil cannot be changed.<div class="line"></div>Using this will effectively pause your garden.<div class="line"></div>';//<span class="red">'+((M.nextFreeze>Date.now())?'You will be able to freeze your garden again in '+Game.sayTime((M.nextFreeze-Date.now())/1000*30+30,-1)+'.':'After unfreezing your garden, you must wait 10 minutes to freeze it again.')+'</span>986},987func:function(){988//if (!M.freeze && M.nextFreeze>Date.now()) return false;989PlaySound('snd/toneTick.mp3');990M.freeze=(M.freeze?0:1);991if (M.freeze)992{993M.computeEffs();994PlaySound('snd/freezeGarden.mp3');995this.classList.add('on');996l('gardenContent').classList.add('gardenFrozen');997998999for (var y=0;y<6;y++)1000{1001for (var x=0;x<6;x++)1002{1003var tile=M.plot[y][x];1004if (tile[0]>0)1005{1006var me=M.plantsById[tile[0]-1];1007var age=tile[1];1008if (me.key=='cheapcap' && Math.random()<0.15)1009{1010M.plot[y][x]=[0,0];1011if (me.onKill) me.onKill(x,y,age);1012M.toRebuild=true;1013}1014}1015}1016}1017}1018else1019{1020//M.nextFreeze=Date.now()+(Game.Has('Turbo-charged soil')?1:(1000*60*10));1021M.computeEffs();1022this.classList.remove('on');1023l('gardenContent').classList.remove('gardenFrozen');1024}1025},1026isOn:function(){if (M.freeze){l('gardenContent').classList.add('gardenFrozen');}else{l('gardenContent').classList.remove('gardenFrozen');}return M.freeze;},1027},1028'convert':{1029name:'Sacrifice garden',1030icon:2,1031desc:'A swarm of sugar hornets comes down on your garden, <span class="red">destroying every plant as well as every seed you\'ve unlocked</span> - leaving only a Baker\'s wheat seed.<br>In exchange, they will grant you <span class="green"><b>10</b> sugar lumps</span>.<br>This action is only available with a complete seed log.',1032func:function(){PlaySound('snd/toneTick.mp3');M.askConvert();},1033isDisplayed:function(){if (M.plantsUnlockedN>=M.plantsN) return true; else return false;},1034},1035};1036M.toolsById=[];var n=0;for (var i in M.tools){M.tools[i].id=n;M.tools[i].key=i;M.toolsById[n]=M.tools[i];n++;}103710381039M.plot=[];1040for (var y=0;y<6;y++)1041{1042M.plot[y]=[];1043for (var x=0;x<6;x++)1044{1045M.plot[y][x]=[0,0];1046}1047}1048M.plotBoost=[];1049for (var y=0;y<6;y++)1050{1051M.plotBoost[y]=[];1052for (var x=0;x<6;x++)1053{1054//age mult, power mult, weed mult1055M.plotBoost[y][x]=[1,1,1];1056}1057}10581059M.tileSize=40;10601061M.seedSelected=-1;10621063M.soil=0;1064M.nextSoil=0;//timestamp for when soil will be ready to change again10651066M.stepT=1;//in seconds1067M.nextStep=0;//timestamp for next step tick10681069M.harvests=0;1070M.harvestsTotal=0;10711072M.loopsMult=1;10731074M.toRebuild=false;1075M.toCompute=false;10761077M.freeze=0;1078M.nextFreeze=0;//timestamp for when we can freeze again; unused, but still stored10791080M.getCost=function(me)1081{1082if (Game.Has('Turbo-charged soil')) return 0;1083return Math.max(me.costM,Game.cookiesPs*me.cost*60)*(Game.HasAchiev('Seedless to nay')?0.95:1);1084}10851086M.getPlantDesc=function(me)1087{1088var children='';1089if (me.children.length>0)1090{1091children+='<div class="shadowFilter" style="display:inline-block;">';1092for (var i in me.children)1093{1094if (!M.plants[me.children[i]]) console.log('No plant named '+me.children[i]);1095else1096{1097var it=M.plants[me.children[i]];1098if (it.unlocked) children+='<div class="gardenSeedTiny" style="background-position:'+(-0*48)+'px '+(-it.icon*48)+'px;"></div>';1099else children+='<div class="gardenSeedTiny" style="background-image:url(img/icons.png?v='+Game.version+');background-position:'+(-0*48)+'px '+(-7*48)+'px;opacity:0.35;"></div>';1100}1101}1102children+='</div>';1103}11041105return '<div class="description">'+1106(!me.immortal?('<div style="margin:6px 0px;font-size:11px;"><b>Average lifespan :</b> '+Game.sayTime(((100/(me.ageTick+me.ageTickR/2))*M.stepT)*30,-1)+' <small>('+Beautify(Math.ceil((100/((me.ageTick+me.ageTickR/2)))*(1)))+' ticks)</small></div>'):'')+1107'<div style="margin:6px 0px;font-size:11px;"><b>Average maturation :</b> '+Game.sayTime(((100/((me.ageTick+me.ageTickR/2)))*(me.mature/100)*M.stepT)*30,-1)+' <small>('+Beautify(Math.ceil((100/((me.ageTick+me.ageTickR/2)))*(me.mature/100)))+' ticks)</small></div>'+1108(me.weed?'<div style="margin:6px 0px;font-size:11px;"><b>Is a weed</b></div>':'')+1109(me.fungus?'<div style="margin:6px 0px;font-size:11px;"><b>Is a fungus</b></div>':'')+1110(me.detailsStr?('<div style="margin:6px 0px;font-size:11px;"><b>Details :</b> '+me.detailsStr+'</div>'):'')+1111(children!=''?('<div style="margin:6px 0px;font-size:11px;"><b>Possible mutations :</b> '+children+'</div>'):'')+1112'<div class="line"></div>'+1113'<div style="margin:6px 0px;"><b>Effects :</b></div>'+1114'<div style="font-size:11px;font-weight:bold;">'+me.effsStr+'</div>'+1115(me.q?('<q>'+me.q+'</q>'):'')+1116'</div>';1117}1118M.canPlant=function(me)1119{1120if (Game.cookies>=M.getCost(me)) return true; else return false;1121}11221123M.cursor=1;1124M.hideCursor=function()1125{1126M.cursor=0;1127}1128M.showCursor=function()1129{1130M.cursor=1;1131}11321133M.soilTooltip=function(id)1134{1135return function(){1136var me=M.soilsById[id];1137var str='<div style="padding:8px 4px;min-width:350px;">'+1138(M.parent.amount<me.req?(1139'<div style="text-align:center;">Soil unlocked at '+me.req+' farms.</div>'1140):('<div class="icon" style="background:url(img/gardenPlants.png?v='+Game.version+');float:left;margin-left:-8px;margin-top:-8px;background-position:'+(-me.icon*48)+'px '+(-34*48)+'px;"></div>'+1141'<div><div class="name">'+me.name+'</div><div><small>'+((M.soil==me.id)?'Your field is currently using this soil.':(M.nextSoil>Date.now())?'You will be able to change your soil again in '+Game.sayTime((M.nextSoil-Date.now())/1000*30+30,-1)+'.':'Click to use this type of soil for your whole field.')+'</small></div></div>'+1142'<div class="line"></div>'+1143'<div class="description">'+1144'<div style="margin:6px 0px;"><b>Effects :</b></div>'+1145'<div style="font-size:11px;font-weight:bold;">'+me.effsStr+'</div>'+1146(me.q?('<q>'+me.q+'</q>'):'')+1147'</div>'))+1148'</div>';1149return str;1150};1151}1152M.seedTooltip=function(id)1153{1154return function(){1155var me=M.plantsById[id];1156var str='<div style="padding:8px 4px;min-width:400px;">'+1157'<div class="icon" style="background:url(img/gardenPlants.png?v='+Game.version+');float:left;margin-left:-24px;margin-top:-4px;background-position:'+(-0*48)+'px '+(-me.icon*48)+'px;"></div>'+1158'<div class="icon" style="background:url(img/gardenPlants.png?v='+Game.version+');float:left;margin-left:-24px;margin-top:-28px;background-position:'+(-4*48)+'px '+(-me.icon*48)+'px;"></div>'+1159'<div style="background:url(img/turnInto.png);width:20px;height:22px;position:absolute;left:28px;top:24px;z-index:1000;"></div>'+1160(me.plantable?('<div style="float:right;text-align:right;width:100px;"><small>Planting cost :</small><br><span class="price'+(M.canPlant(me)?'':' disabled')+'">'+Beautify(Math.round(shortenNumber(M.getCost(me))))+'</span><br><small>'+Game.sayTime(me.cost*60*30,-1)+' of CpS,<br>minimum '+Beautify(me.costM)+' cookies</small></div>'):'')+1161'<div style="width:300px;"><div class="name">'+me.name+' seed</div><div><small>'+(me.plantable?'Click to select this seed for planting.':'<span class="red">This seed cannot be planted.</span>')+'<br>Shift+ctrl+click to harvest all mature plants of this type.</small></div></div>'+1162'<div class="line"></div>'+1163M.getPlantDesc(me)+1164'</div>';1165return str;1166};1167}1168M.toolTooltip=function(id)1169{1170return function(){1171var me=M.toolsById[id];1172var icon=[me.icon,35];1173var str='<div style="padding:8px 4px;min-width:350px;">'+1174'<div class="icon" style="background:url(img/gardenPlants.png?v='+Game.version+');float:left;margin-left:-8px;margin-top:-8px;background-position:'+(-icon[0]*48)+'px '+(-icon[1]*48)+'px;"></div>'+1175'<div><div class="name">'+me.name+'</div></div>'+1176'<div class="line"></div>'+1177'<div class="description">'+1178(me.descFunc?me.descFunc():me.desc)+1179'</div>'+1180'</div>';1181return str;1182};1183}1184M.tileTooltip=function(x,y)1185{1186return function(){1187var tile=M.plot[y][x];1188if (tile[0]==0)1189{1190var me=(M.seedSelected>=0)?M.plantsById[M.seedSelected]:0;1191var str='<div style="padding:8px 4px;min-width:350px;text-align:center;">'+1192'<div class="name">Empty tile</div>'+'<div class="line"></div><div class="description">'+1193'This tile of soil is empty.<br>Pick a seed and plant something!'+1194(me?'<div class="line"></div>Click to plant <b>'+me.name+'</b> for <span class="price'+(M.canPlant(me)?'':' disabled')+'">'+Beautify(Math.round(M.getCost(me)))+'</span>.<br><small>(Shift-click to plant multiple.)</small>':'')+1195(M.plotBoost[y][x]!=[1,1,1]?('<small>'+1196(M.plotBoost[y][x][0]!=1?'<br>Aging multiplier : '+Beautify(M.plotBoost[y][x][0]*100)+'%':'')+1197(M.plotBoost[y][x][1]!=1?'<br>Effect multiplier : '+Beautify(M.plotBoost[y][x][1]*100)+'%':'')+1198(M.plotBoost[y][x][2]!=1?'<br>Weeds/fungus repellent : '+Beautify(100-M.plotBoost[y][x][2]*100)+'%':'')+1199'</small>'1200):'')+1201'</div>'+1202'</div>';1203return str;1204}1205else1206{1207var me=M.plantsById[tile[0]-1];1208var stage=0;1209if (tile[1]>=me.mature) stage=4;1210else if (tile[1]>=me.mature*0.666) stage=3;1211else if (tile[1]>=me.mature*0.333) stage=2;1212else stage=1;1213var icon=[stage,me.icon];1214var str='<div style="padding:8px 4px;min-width:350px;">'+1215'<div class="icon" style="background:url(img/gardenPlants.png?v='+Game.version+');float:left;margin-left:-8px;margin-top:-8px;background-position:'+(-icon[0]*48)+'px '+(-icon[1]*48)+'px;"></div>'+1216'<div class="name">'+me.name+'</div><div><small>This plant is growing here.</small></div>'+1217'<div class="line"></div>'+1218'<div style="text-align:center;">'+1219'<div style="display:inline-block;position:relative;box-shadow:0px 0px 0px 1px #000,0px 0px 0px 1px rgba(255,255,255,0.5) inset,0px -2px 2px 0px rgba(255,255,255,0.5) inset;width:256px;height:6px;background:linear-gradient(to right,#fff 0%,#0f9 '+me.mature+'%,#3c0 '+(me.mature+0.1)+'%,#960 100%)">'+1220'<div class="gardenGrowthIndicator" style="left:'+Math.floor((tile[1]/100)*256)+'px;"></div>'+1221'<div style="background:url(img/gardenPlants.png?v='+Game.version+');background-position:'+(-1*48)+'px '+(-icon[1]*48)+'px;position:absolute;left:'+(0-24)+'px;top:-32px;transform:scale(0.5,0.5);width:48px;height:48px;"></div>'+1222'<div style="background:url(img/gardenPlants.png?v='+Game.version+');background-position:'+(-2*48)+'px '+(-icon[1]*48)+'px;position:absolute;left:'+((((me.mature*0.333)/100)*256)-24)+'px;top:-32px;transform:scale(0.5,0.5);width:48px;height:48px;"></div>'+1223'<div style="background:url(img/gardenPlants.png?v='+Game.version+');background-position:'+(-3*48)+'px '+(-icon[1]*48)+'px;position:absolute;left:'+((((me.mature*0.666)/100)*256)-24)+'px;top:-32px;transform:scale(0.5,0.5);width:48px;height:48px;"></div>'+1224'<div style="background:url(img/gardenPlants.png?v='+Game.version+');background-position:'+(-4*48)+'px '+(-icon[1]*48)+'px;position:absolute;left:'+((((me.mature)/100)*256)-24)+'px;top:-32px;transform:scale(0.5,0.5);width:48px;height:48px;"></div>'+1225'</div><br>'+1226'<b>Stage :</b> '+['bud','sprout','bloom','mature'][stage-1]+'<br>'+1227'<small>'+(stage==1?'Plant effects : 10%':stage==2?'Plant effects : 25%':stage==3?'Plant effects : 50%':'Plant effects : 100%; may reproduce, will drop seed when harvested')+'</small>'+1228'<br><small>'+(1229stage<4?(1230'Mature in about '+Game.sayTime(((100/(M.plotBoost[y][x][0]*(me.ageTick+me.ageTickR/2)))*((me.mature-tile[1])/100)*M.stepT)*30,-1)+' ('+Beautify(Math.ceil((100/(M.plotBoost[y][x][0]*(me.ageTick+me.ageTickR/2)))*((me.mature-tile[1])/100)))+' tick'+(Math.ceil((100/(M.plotBoost[y][x][0]*(me.ageTick+me.ageTickR/2)))*((me.mature-tile[1])/100))==1?'':'s')+')'1231):(1232!me.immortal?(1233'Decays in about '+Game.sayTime(((100/(M.plotBoost[y][x][0]*(me.ageTick+me.ageTickR/2)))*((100-tile[1])/100)*M.stepT)*30,-1)+' ('+Beautify(Math.ceil((100/(M.plotBoost[y][x][0]*(me.ageTick+me.ageTickR/2)))*((100-tile[1])/100)))+' tick'+(Math.ceil((100/(M.plotBoost[y][x][0]*(me.ageTick+me.ageTickR/2)))*((100-tile[1])/100))==1?'':'s')+')'1234):1235'Does not decay'1236)1237)+'</small>'+1238//'<small><br>'+M.plotBoost[y][x]+'</small>'+1239(M.plotBoost[y][x]!=[1,1,1]?('<small>'+1240(M.plotBoost[y][x][0]!=1?'<br>Aging multiplier : '+Beautify(M.plotBoost[y][x][0]*100)+'%':'')+1241(M.plotBoost[y][x][1]!=1?'<br>Effect multiplier : '+Beautify(M.plotBoost[y][x][1]*100)+'%':'')+1242(M.plotBoost[y][x][2]!=1?'<br>Weeds/fungus repellent : '+Beautify(100-M.plotBoost[y][x][2]*100)+'%':'')+1243'</small>'1244):'')+1245'</div>'+1246'<div class="line"></div>'+1247//'<div style="text-align:center;">Click to harvest'+(M.seedSelected>=0?', planting <b>'+M.plantsById[M.seedSelected].name+'</b><br>for <span class="price'+(M.canPlant(me)?'':' disabled')+'">'+Beautify(Math.round(M.getCost(M.plantsById[M.seedSelected])))+'</span> in its place':'')+'.</div>'+1248'<div style="text-align:center;">Click to '+(stage==4?'harvest':'unearth')+'.</div>'+1249'<div class="line"></div>'+1250M.getPlantDesc(me)+1251'</div>';1252return str;1253}1254};1255}12561257M.refillTooltip=function(){1258return '<div style="padding:8px;width:300px;font-size:11px;text-align:center;">Click to refill your soil timer and trigger <b>1</b> plant growth tick with <b>x3</b> spread and mutation rate for <span class="price lump">1 sugar lump</span>.'+1259(Game.canRefillLump()?'<br><small>(can be done once every '+Game.sayTime((Game.getLumpRefillMax()/1000)*Game.fps,-1)+')</small>':('<br><small class="red">(usable again in '+Game.sayTime((Game.getLumpRefillRemaining()/1000+1)*Game.fps,-1)+')</small>'))+1260'</div>';1261};12621263M.buildPanel=function()1264{1265if (!l('gardenSeeds')) return false;1266var str='';1267for (var i in M.plants)1268{1269var me=M.plants[i];1270var icon=[0,me.icon];1271str+='<div id="gardenSeed-'+me.id+'" class="gardenSeed'+(M.seedSelected==me.id?' on':'')+' locked" '+Game.getDynamicTooltip('Game.ObjectsById['+M.parent.id+'].minigame.seedTooltip('+me.id+')','this')+'>';1272str+='<div id="gardenSeedIcon-'+me.id+'" class="gardenSeedIcon shadowFilter" style="background-position:'+(-icon[0]*48)+'px '+(-icon[1]*48)+'px;"></div>';1273str+='</div>';1274}1275l('gardenSeeds').innerHTML=str;12761277for (var i in M.plants)1278{1279var me=M.plants[i];1280me.l=l('gardenSeed-'+me.id);1281AddEvent(me.l,'click',function(me){return function()1282{1283if (/* !M.freeze && */Game.keys[16] && Game.keys[17])//shift & ctrl1284{1285//harvest all mature of type1286M.harvestAll(me,1);1287return false;1288}1289if (!me.plantable && !Game.sesame) return false;1290if (M.seedSelected==me.id){M.seedSelected=-1;}1291else {M.seedSelected=me.id;PlaySound('snd/toneTick.mp3');}1292for (var i in M.plants)1293{1294var it=M.plants[i];1295if (it.id==M.seedSelected){it.l.classList.add('on');}1296else {it.l.classList.remove('on');}1297}1298}}(me));1299AddEvent(me.l,'mouseover',M.hideCursor);1300AddEvent(me.l,'mouseout',M.showCursor);1301if (me.unlocked) me.l.classList.remove('locked');1302}13031304var str='';1305for (var i in M.tools)1306{1307var me=M.tools[i];1308var icon=[me.icon,35];1309str+='<div id="gardenTool-'+me.id+'" style="margin:8px;" class="gardenSeed'+((me.isOn && me.isOn())?' on':'')+''+((!me.isDisplayed || me.isDisplayed())?'':' locked')+'" '+Game.getDynamicTooltip('Game.ObjectsById['+M.parent.id+'].minigame.toolTooltip('+me.id+')','this')+'>';1310str+='<div id="gardenToolIcon-'+me.id+'" class="gardenSeedIcon shadowFilter" style="background-position:'+(-icon[0]*48)+'px '+(-icon[1]*48)+'px;"></div>';1311str+='</div>';1312}1313l('gardenTools').innerHTML=str;13141315for (var i in M.tools)1316{1317var me=M.tools[i];1318AddEvent(l('gardenTool-'+me.id),'click',me.func);1319AddEvent(l('gardenTool-'+me.id),'mouseover',M.hideCursor);1320AddEvent(l('gardenTool-'+me.id),'mouseout',M.showCursor);1321}13221323var str='';1324for (var i in M.soils)1325{1326var me=M.soils[i];1327var icon=[me.icon,34];1328str+='<div id="gardenSoil-'+me.id+'" class="gardenSeed gardenSoil disabled'+(M.soil==me.id?' on':'')+'" '+Game.getDynamicTooltip('Game.ObjectsById['+M.parent.id+'].minigame.soilTooltip('+me.id+')','this')+'>';1329str+='<div id="gardenSoilIcon-'+me.id+'" class="gardenSeedIcon shadowFilter" style="background-position:'+(-icon[0]*48)+'px '+(-icon[1]*48)+'px;"></div>';1330str+='</div>';1331}1332l('gardenSoils').innerHTML=str;13331334for (var i in M.soils)1335{1336var me=M.soils[i];1337AddEvent(l('gardenSoil-'+me.id),'click',function(me){return function(){1338if (M.freeze || M.soil==me.id || M.nextSoil>Date.now() || M.parent.amount<me.req){return false;}1339PlaySound('snd/toneTick.mp3');1340M.nextSoil=Date.now()+(Game.Has('Turbo-charged soil')?1:(1000*60*10));1341M.toCompute=true;M.soil=me.id;M.computeStepT();1342for (var i in M.soils){var it=M.soils[i];if (it.id==M.soil){l('gardenSoil-'+it.id).classList.add('on');}else{l('gardenSoil-'+it.id).classList.remove('on');}}1343}}(me));1344AddEvent(l('gardenSoil-'+me.id),'mouseover',M.hideCursor);1345AddEvent(l('gardenSoil-'+me.id),'mouseout',M.showCursor);1346}13471348M.cursorL=l('gardenCursor');1349}1350M.buildPlot=function()1351{1352M.toRebuild=false;1353if (!l('gardenPlot')) return false;1354if (!l('gardenTile-0-0'))1355{1356var str='';1357for (var y=0;y<6;y++)1358{1359for (var x=0;x<6;x++)1360{1361str+='<div id="gardenTile-'+x+'-'+y+'" class="gardenTile" style="left:'+(x*M.tileSize)+'px;top:'+(y*M.tileSize)+'px;display:none;" '+Game.getDynamicTooltip('Game.ObjectsById['+M.parent.id+'].minigame.tileTooltip('+x+','+y+')','this')+'>';1362str+='<div id="gardenTileIcon-'+x+'-'+y+'" class="gardenTileIcon" style="display:none;"></div>';1363str+='</div>';1364}1365}1366l('gardenPlot').innerHTML=str;13671368for (var y=0;y<6;y++)1369{1370for (var x=0;x<6;x++)1371{1372AddEvent(l('gardenTile-'+x+'-'+y),'click',function(x,y){return function()1373{1374M.clickTile(x,y);1375}}(x,y));1376}1377}1378}1379var plants=0;1380for (var y=0;y<6;y++)1381{1382for (var x=0;x<6;x++)1383{1384var tile=M.plot[y][x];1385var tileL=l('gardenTile-'+x+'-'+y);1386var iconL=l('gardenTileIcon-'+x+'-'+y);1387var me=0;1388if (tile[0]>0)1389{1390plants++;1391me=M.plantsById[tile[0]-1];1392var stage=0;1393if (tile[1]>=me.mature) stage=4;1394else if (tile[1]>=me.mature*0.666) stage=3;1395else if (tile[1]>=me.mature*0.333) stage=2;1396else stage=1;1397var dying=((tile[1]+Math.ceil(me.ageTick+me.ageTickR))>=100?1:0);1398var icon=[stage,me.icon];1399iconL.style.opacity=(dying?0.5:1);1400iconL.style.backgroundPosition=(-icon[0]*48)+'px '+(-icon[1]*48)+'px';1401iconL.style.display='block';1402//iconL.innerHTML=M.plotBoost[y][x];1403}1404else iconL.style.display='none';1405if (M.isTileUnlocked(x,y)) tileL.style.display='block';1406else tileL.style.display='none';1407}1408}1409if (plants>=6*6) Game.Win('In the garden of Eden (baby)');1410}14111412M.clickTile=function(x,y)1413{1414//if (M.freeze) return false;1415var outcome=M.useTool(M.seedSelected,x,y);1416M.toCompute=true;1417if (outcome && !Game.keys[16])//shift1418{1419M.seedSelected=-1;1420for (var i in M.plants)1421{1422var it=M.plants[i];1423if (it.id==M.seedSelected) {l('gardenSeed-'+it.id).classList.add('on');}1424else {l('gardenSeed-'+it.id).classList.remove('on');}1425}1426}1427//PlaySound('snd/tick.mp3');1428}14291430M.useTool=function(what,x,y)1431{1432var harvested=M.harvest(x,y,1);1433if (harvested)1434{1435Game.SparkleAt(Game.mouseX,Game.mouseY);1436PlaySound('snd/harvest'+choose(['1','2','3'])+'.mp3',1,0.2);1437}1438else1439{1440if (what>=0 && M.canPlant(M.plantsById[what]))1441{1442M.plot[y][x]=[what+1,0];1443M.toRebuild=true;1444Game.Spend(M.getCost(M.plantsById[what]));1445Game.SparkleAt(Game.mouseX,Game.mouseY);1446PlaySound('snd/tillb'+choose(['1','2','3'])+'.mp3',1,0.2);1447return true;1448}1449}1450return false;1451}14521453M.getTile=function(x,y)1454{1455if (x<0 || x>5 || y<0 || y>5 || !M.isTileUnlocked(x,y)) return [0,0];1456return M.plot[y][x];1457}14581459M.plotLimits=[1460[2,2,4,4],1461[2,2,5,4],1462[2,2,5,5],1463[1,2,5,5],1464[1,1,5,5],1465[1,1,6,5],1466[1,1,6,6],1467[0,1,6,6],1468[0,0,6,6],1469];1470M.isTileUnlocked=function(x,y)1471{1472var level=M.parent.level;1473level=Math.max(1,Math.min(M.plotLimits.length,level))-1;1474var limits=M.plotLimits[level];1475if (x>=limits[0] && x<limits[2] && y>=limits[1] && y<limits[3]) return true; else return false;1476}14771478M.computeStepT=function()1479{1480if (Game.Has('Turbo-charged soil')) M.stepT=1;1481else M.stepT=M.soilsById[M.soil].tick*60;1482}14831484M.convertTimes=0;1485M.askConvert=function()1486{1487if (M.plantsUnlockedN<M.plantsN) return false;1488Game.Prompt('<h3>Sacrifice garden</h3><div class="block">Do you REALLY want to sacrifice your garden to the sugar hornets?<br><small>You will be left with an empty plot and only the Baker\'s wheat seed unlocked.<br>In return, you will gain <b>10 sugar lumps</b>.</small></div>',[['Yes!','Game.ClosePrompt();Game.ObjectsById['+M.parent.id+'].minigame.convert();'],'No']);1489}1490M.convert=function()1491{1492if (M.plantsUnlockedN<M.plantsN) return false;1493M.harvestAll();1494for (var i in M.plants){M.lockSeed(M.plants[i]);}1495M.unlockSeed(M.plants['bakerWheat']);14961497Game.gainLumps(10);1498Game.Notify('Sacrifice!','You\'ve sacrificed your garden to the sugar hornets, destroying your crops and your knowledge of seeds.<br>In the remains, you find <b>10 sugar lumps</b>.',[29,14],12);14991500Game.Win('Seedless to nay');1501M.convertTimes++;1502M.computeMatures();1503PlaySound('snd/spellFail.mp3',0.75);1504}15051506M.harvestAll=function(type,mature,mortal)1507{1508var harvested=0;1509for (var i=0;i<2;i++)//we do it twice to take care of whatever spawns on kill1510{1511for (var y=0;y<6;y++)1512{1513for (var x=0;x<6;x++)1514{1515if (M.plot[y][x][0]>=1)1516{1517var doIt=true;1518var tile=M.plot[y][x];1519var me=M.plantsById[tile[0]-1];1520if (type && me!=type) doIt=false;1521if (mortal && me.immortal) doIt=false;1522if (mature && tile[1]<me.mature) doIt=false;15231524if (doIt) harvested+=M.harvest(x,y)?1:0;1525}1526}1527}1528}1529if (harvested>0) setTimeout(function(){PlaySound('snd/harvest1.mp3',1,0.2);},50);1530if (harvested>2) setTimeout(function(){PlaySound('snd/harvest2.mp3',1,0.2);},150);1531if (harvested>6) setTimeout(function(){PlaySound('snd/harvest3.mp3',1,0.2);},250);1532}1533M.harvest=function(x,y,manual)1534{1535var tile=M.plot[y][x];1536if (tile[0]>=1)1537{1538M.toCompute=true;1539var me=M.plantsById[tile[0]-1];1540var age=tile[1];1541if (me.onHarvest) me.onHarvest(x,y,age);1542if (tile[1]>=me.mature)1543{1544if (M.unlockSeed(me)) Game.Popup('('+me.name+')<br>Unlocked '+me.name+' seed.',Game.mouseX,Game.mouseY);1545M.harvests++;1546M.harvestsTotal++;1547if (M.harvestsTotal>=100) Game.Win('Botany enthusiast');1548if (M.harvestsTotal>=1000) Game.Win('Green, aching thumb');1549}15501551M.plot[y][x]=[0,0];1552if (me.onKill) me.onKill(x,y,age);1553M.toRebuild=true;1554return true;1555}1556return false;1557}15581559M.unlockSeed=function(me)1560{1561if (me.unlocked) return false;1562me.unlocked=1;1563if (me.l) me.l.classList.remove('locked');1564M.getUnlockedN();1565return true;1566}1567M.lockSeed=function(me)1568{1569if (me.locked) return false;1570me.unlocked=0;1571if (me.l) me.l.classList.add('locked');1572M.getUnlockedN();1573return true;1574}15751576var str='';1577str+='<style>'+1578'#gardenBG{background:url(img/shadedBorders.png),url(img/BGgarden.jpg);background-size:100% 100%,auto;position:absolute;left:0px;right:0px;top:0px;bottom:16px;}'+1579'#gardenContent{position:relative;box-sizing:border-box;padding:4px 24px;height:'+(6*M.tileSize+16+48+48)+'px;}'+1580'.gardenFrozen{box-shadow:0px 0px 16px rgba(255,255,255,1) inset,0px 0px 48px 24px rgba(200,255,225,0.5) inset;}'+1581'#gardenPanel{text-align:center;margin:0px;padding:0px;position:absolute;left:4px;top:4px;bottom:4px;right:65%;overflow-y:auto;overflow-x:hidden;box-shadow:8px 0px 8px rgba(0,0,0,0.5);}'+1582'#gardenSeeds{}'+1583'#gardenField{text-align:center;position:absolute;right:0px;top:0px;bottom:0px;overflow-x:auto;overflow:hidden;}'+//width:65%;1584'#gardenPlot{position:relative;margin:8px auto;}'+1585'.gardenTile{cursor:pointer;width:'+M.tileSize+'px;height:'+M.tileSize+'px;position:absolute;}'+1586//'.gardenTile:before{transform:translate(0,0);pointer-events:none;content:\'\';display:block;position:absolute;left:0px;top:0px;right:0px;bottom:0px;margin:6px;border-radius:12px;background:rgba(0,0,0,0.1);box-shadow:0px 0px 4px rgba(255,255,255,0.2),-4px 4px 4px 2px rgba(0,0,0,0.2) inset;}'+1587//'.gardenTile:hover:before{margin:2px;animation:wobble 0.5s;}'+1588'.gardenTile:before{transform:translate(0,0);opacity:0.65;transition:opacity 0.2s;pointer-events:none;content:\'\';display:block;position:absolute;left:0px;top:0px;right:0px;bottom:0px;margin:0px;background:url(img/gardenPlots.png);}'+1589'.gardenTile:nth-child(4n+1):before{background-position:40px 0px;}'+1590'.gardenTile:nth-child(4n+2):before{background-position:80px 0px;}'+1591'.gardenTile:nth-child(4n+3):before{background-position:120px 0px;}'+1592'.gardenTile:hover:before{opacity:1;animation:wobble 0.5s;}'+1593'.noFancy .gardenTile:hover:before{opacity:1;animation:none;}'+1594'.gardenTileIcon{transform:translate(0,0);pointer-events:none;transform-origin:50% 40px;width:48px;height:48px;position:absolute;left:-'+((48-M.tileSize)/2)+'px;top:-'+((48-M.tileSize)/2+8)+'px;background:url(img/gardenPlants.png?v='+Game.version+');}'+1595'.gardenTile:hover .gardenTileIcon{animation:pucker 0.3s;}'+1596'.noFancy .gardenTile:hover .gardenTileIcon{animation:none;}'+1597'#gardenDrag{pointer-events:none;position:absolute;left:0px;top:0px;right:0px;bottom:0px;overflow:hidden;z-index:1000000001;}'+1598'#gardenCursor{transition:transform 0.1s;display:none;pointer-events:none;width:48px;height:48px;position:absolute;background:url(img/gardenPlants.png?v='+Game.version+');}'+1599'.gardenSeed{cursor:pointer;display:inline-block;width:40px;height:40px;position:relative;}'+1600'.gardenSeed.locked{display:none;}'+1601'.gardenSeedIcon{pointer-events:none;transform:translate(0,0);display:inline-block;position:absolute;left:-4px;top:-4px;width:48px;height:48px;background:url(img/gardenPlants.png?v='+Game.version+');}'+1602'.gardenSeed:hover .gardenSeedIcon{animation:bounce 0.8s;z-index:1000000001;}'+1603'.gardenSeed:active .gardenSeedIcon{animation:pucker 0.2s;}'+1604'.noFancy .gardenSeed:hover .gardenSeedIcon,.noFancy .gardenSeed:active .gardenSeedIcon{animation:none;}'+1605'.gardenPanelLabel{font-size:12px;width:100%;padding:2px;margin-top:4px;margin-bottom:-4px;}'+'.gardenSeedTiny{transform:scale(0.5,0.5);margin:-20px -16px;display:inline-block;width:48px;height:48px;background:url(img/gardenPlants.png?v='+Game.version+');}'+1606'.gardenSeed.on:before{pointer-events:none;content:\'\';display:block;position:absolute;left:0px;top:0px;right:0px;bottom:0px;margin:-2px;border-radius:12px;transform:rotate(45deg);background:rgba(0,0,0,0.2);box-shadow:0px 0px 8px rgba(255,255,255,0.75);}'+16071608'.gardenGrowthIndicator{background:#000;box-shadow:0px 0px 0px 1px #fff,0px 0px 0px 2px #000,2px 2px 2px 2px rgba(0,0,0,0.5);position:absolute;top:0px;width:1px;height:6px;z-index:100;}'+1609'.noFancy .gardenGrowthIndicator{background:#fff;border:1px solid #000;margin-top:-1px;margin-left:-1px;}'+16101611'#gardenSoils{}'+1612'.gardenSoil.disabled{filter:brightness(10%);}'+1613'.noFilters .gardenSoil.disabled{opacity:0.2;}'+16141615'#gardenInfo{position:relative;display:inline-block;margin:8px auto 0px auto;padding:8px 16px;padding-left:32px;text-align:left;font-size:11px;color:rgba(255,255,255,0.75);text-shadow:-1px 1px 0px #000;background:rgba(0,0,0,0.75);border-radius:16px;}'+16161617'</style>';1618str+='<div id="gardenBG"></div>';1619str+='<div id="gardenContent">';1620str+='<div id="gardenDrag"><div id="gardenCursor" class="shadowFilter"></div></div>';16211622str+='<div id="gardenPanel" class="framed">';1623str+='<div class="title gardenPanelLabel">Tools</div><div class="line"></div>';1624str+='<div id="gardenTools"></div>';1625str+='<div id="gardenSeedsUnlocked" class="title gardenPanelLabel">Seeds</div><div class="line"></div>';1626str+='<div id="gardenSeeds"></div>';1627str+='</div>';1628str+='<div id="gardenField">';1629str+='<div style="pointer-events:none;opacity:0.75;position:absolute;left:0px;right:0px;top:8px;" id="gardenPlotSize"></div>';1630str+='<div id="gardenPlot" class="shadowFilter" style="width:'+(6*M.tileSize)+'px;height:'+(6*M.tileSize)+'px;"></div>';1631str+='<div style="margin-top:0px;" id="gardenSoils"></div>';1632str+='<div id="gardenInfo">';1633str+='<div '+Game.getDynamicTooltip('Game.ObjectsById['+M.parent.id+'].minigame.refillTooltip','this')+' id="gardenLumpRefill" class="usesIcon shadowFilter lumpRefill" style="display:none;left:-8px;top:-6px;background-position:'+(-29*48)+'px '+(-14*48)+'px;"></div>';1634str+='<div id="gardenNextTick">Initializing...</div>';1635str+='<div id="gardenStats"></div>';1636str+='</div>';1637str+='</div>';16381639str+='</div>';1640div.innerHTML=str;1641M.buildPlot();1642M.buildPanel();16431644M.lumpRefill=l('gardenLumpRefill');1645AddEvent(M.lumpRefill,'click',function(){1646Game.refillLump(1,function(){1647M.loopsMult=3;1648M.nextSoil=Date.now();1649//M.nextFreeze=Date.now();1650M.nextStep=Date.now();1651PlaySound('snd/pop'+Math.floor(Math.random()*3+1)+'.mp3',0.75);1652});1653});1654AddEvent(l('gardenSeedsUnlocked'),'click',function()1655{1656if (Game.sesame)1657{1658if (Game.keys[16] && Game.keys[17])//ctrl & shift, fill garden with random plants1659{1660for (var y=0;y<6;y++)1661{1662for (var x=0;x<6;x++)1663{1664M.plot[y][x]=[choose(M.plantsById).id+1,Math.floor(Math.random()*100)];1665}1666}1667M.toRebuild=true;1668M.toCompute=true;1669}1670else//unlock/lock all seeds1671{1672var locked=0;1673for (var i in M.plants)1674{1675if (!M.plants[i].unlocked) locked++;1676}1677if (locked>0){for (var i in M.plants){M.unlockSeed(M.plants[i]);}}1678else{for (var i in M.plants){M.lockSeed(M.plants[i]);}}1679M.unlockSeed(M.plants['bakerWheat']);1680}1681}1682});16831684M.reset();16851686//M.parent.switchMinigame(1);1687}1688M.onResize=function()1689{1690var width=l('gardenContent').offsetWidth;1691var panelW=Math.min(Math.max(width*0.40,320),width-6*M.tileSize)-8;1692var fieldW=Math.max(Math.min(width*0.60,width-panelW),6*M.tileSize)-8;1693l('gardenField').style.width=fieldW+'px';1694l('gardenPanel').style.width=panelW+'px';1695}1696M.onLevel=function(level)1697{1698M.buildPlot();1699}1700M.onRuinTheFun=function()1701{1702for (var i in M.plants){M.unlockSeed(M.plants[i]);}1703}1704M.save=function()1705{1706//output cannot use ",", ";" or "|"1707var str=''+1708parseFloat(M.nextStep)+':'+1709parseInt(M.soil)+':'+1710parseFloat(M.nextSoil)+':'+1711parseInt(M.freeze)+':'+1712parseInt(M.harvests)+':'+1713parseInt(M.harvestsTotal)+':'+1714parseInt(M.parent.onMinigame?'1':'0')+':'+1715parseFloat(M.convertTimes)+':'+1716parseFloat(M.nextFreeze)+':'+1717' ';1718for (var i in M.plants)1719{1720str+=''+(M.plants[i].unlocked?'1':'0');1721}1722str+=' ';1723for (var y=0;y<6;y++)1724{1725for (var x=0;x<6;x++)1726{1727str+=parseInt(M.plot[y][x][0])+':'+parseInt(M.plot[y][x][1])+':';1728}1729}1730return str;1731}1732M.load=function(str)1733{1734//interpret str; called after .init1735//note : not actually called in the Game's load; see "minigameSave" in main.js1736if (!str) return false;1737var i=0;1738var spl=str.split(' ');1739var spl2=spl[i++].split(':');1740var i2=0;1741M.nextStep=parseFloat(spl2[i2++]||M.nextStep);1742M.soil=parseInt(spl2[i2++]||M.soil);1743M.nextSoil=parseFloat(spl2[i2++]||M.nextSoil);1744M.freeze=parseInt(spl2[i2++]||M.freeze)?1:0;1745M.harvests=parseInt(spl2[i2++]||0);1746M.harvestsTotal=parseInt(spl2[i2++]||0);1747var on=parseInt(spl2[i2++]||0);if (on && Game.ascensionMode!=1) M.parent.switchMinigame(1);1748M.convertTimes=parseFloat(spl2[i2++]||M.convertTimes);1749M.nextFreeze=parseFloat(spl2[i2++]||M.nextFreeze);1750var seeds=spl[i++]||'';1751if (seeds)1752{1753var n=0;1754for (var ii in M.plants)1755{1756if (seeds.charAt(n)=='1') M.plants[ii].unlocked=1; else M.plants[ii].unlocked=0;1757n++;1758}1759}1760M.plants['bakerWheat'].unlocked=1;17611762var plot=spl[i++]||0;1763if (plot)1764{1765plot=plot.split(':');1766var n=0;1767for (var y=0;y<6;y++)1768{1769for (var x=0;x<6;x++)1770{1771M.plot[y][x]=[parseInt(plot[n]),parseInt(plot[n+1])];1772n+=2;1773}1774}1775}17761777M.getUnlockedN();1778M.computeStepT();17791780M.buildPlot();1781M.buildPanel();17821783M.computeBoostPlot();1784M.toCompute=true;1785}1786M.reset=function(hard)1787{1788M.soil=0;1789if (M.seedSelected>-1) M.plantsById[M.seedSelected].l.classList.remove('on');1790M.seedSelected=-1;17911792M.nextStep=Date.now();1793M.nextSoil=Date.now();1794M.nextFreeze=Date.now();1795for (var y=0;y<6;y++)1796{1797for (var x=0;x<6;x++)1798{1799M.plot[y][x]=[0,0];1800}1801}18021803M.harvests=0;1804if (hard)1805{1806M.convertTimes=0;1807M.harvestsTotal=0;1808for (var i in M.plants)1809{1810M.plants[i].unlocked=0;1811}1812}18131814M.plants['bakerWheat'].unlocked=1;18151816M.loopsMult=1;18171818M.getUnlockedN();1819M.computeStepT();18201821M.computeMatures();18221823M.buildPlot();1824M.buildPanel();1825M.toCompute=true;18261827setTimeout(function(M){return function(){M.onResize();}}(M),10);1828}1829M.logic=function()1830{1831//run each frame1832var now=Date.now();18331834if (!M.freeze)1835{1836M.nextStep=Math.min(M.nextStep,now+(M.stepT)*1000);1837if (now>=M.nextStep)1838{1839M.computeStepT();1840M.nextStep=now+M.stepT*1000;18411842M.computeBoostPlot();1843M.computeMatures();18441845var weedMult=M.soilsById[M.soil].weedMult;18461847var loops=1;1848if (M.soilsById[M.soil].key=='woodchips') loops=3;1849loops*=M.loopsMult;1850M.loopsMult=1;18511852for (var y=0;y<6;y++)1853{1854for (var x=0;x<6;x++)1855{1856if (M.isTileUnlocked(x,y))1857{1858var tile=M.plot[y][x];1859var me=M.plantsById[tile[0]-1];1860if (tile[0]>0)1861{1862//age1863tile[1]+=randomFloor((me.ageTick+me.ageTickR*Math.random())*M.plotBoost[y][x][0]);1864tile[1]=Math.max(tile[1],0);1865if (me.immortal) tile[1]=Math.min(me.mature+1,tile[1]);1866else if (tile[1]>=100)1867{1868//die of old age1869M.plot[y][x]=[0,0];1870if (me.onDie) me.onDie(x,y);1871if (M.soilsById[M.soil].key=='pebbles' && Math.random()<0.35)1872{1873if (M.unlockSeed(me)) Game.Popup('Unlocked '+me.name+' seed.',Game.mouseX,Game.mouseY);1874}1875}1876else if (!me.noContam)1877{1878//other plant contamination1879//only occurs in cardinal directions1880//immortal plants and plants with noContam are immune18811882var list=[];1883for (var i in M.plantContam)1884{1885if (Math.random()<M.plantContam[i] && (!M.plants[i].weed || Math.random()<weedMult)) list.push(i);1886}1887var contam=choose(list);18881889if (contam && me.key!=contam)1890{1891if ((!M.plants[contam].weed && !M.plants[contam].fungus) || Math.random()<M.plotBoost[y][x][2])1892{1893var any=0;1894var neighs={};//all surrounding plants1895var neighsM={};//all surrounding mature plants1896for (var i in M.plants){neighs[i]=0;}1897for (var i in M.plants){neighsM[i]=0;}1898var neigh=M.getTile(x,y-1);if (neigh[0]>0){var age=neigh[1];neigh=M.plantsById[neigh[0]-1];any++;neighs[neigh.key]++;if (age>=neigh.mature){neighsM[neigh.key]++;}}1899var neigh=M.getTile(x,y+1);if (neigh[0]>0){var age=neigh[1];neigh=M.plantsById[neigh[0]-1];any++;neighs[neigh.key]++;if (age>=neigh.mature){neighsM[neigh.key]++;}}1900var neigh=M.getTile(x-1,y);if (neigh[0]>0){var age=neigh[1];neigh=M.plantsById[neigh[0]-1];any++;neighs[neigh.key]++;if (age>=neigh.mature){neighsM[neigh.key]++;}}1901var neigh=M.getTile(x+1,y);if (neigh[0]>0){var age=neigh[1];neigh=M.plantsById[neigh[0]-1];any++;neighs[neigh.key]++;if (age>=neigh.mature){neighsM[neigh.key]++;}}19021903if (neighsM[contam]>=1) M.plot[y][x]=[M.plants[contam].id+1,0];1904}1905}1906}1907}1908else1909{1910//plant spreading and mutation1911//happens on all 8 tiles around this one1912for (var loop=0;loop<loops;loop++)1913{1914var any=0;1915var neighs={};//all surrounding plants1916var neighsM={};//all surrounding mature plants1917for (var i in M.plants){neighs[i]=0;}1918for (var i in M.plants){neighsM[i]=0;}1919var neigh=M.getTile(x,y-1);if (neigh[0]>0){var age=neigh[1];neigh=M.plantsById[neigh[0]-1];any++;neighs[neigh.key]++;if (age>=neigh.mature){neighsM[neigh.key]++;}}1920var neigh=M.getTile(x,y+1);if (neigh[0]>0){var age=neigh[1];neigh=M.plantsById[neigh[0]-1];any++;neighs[neigh.key]++;if (age>=neigh.mature){neighsM[neigh.key]++;}}1921var neigh=M.getTile(x-1,y);if (neigh[0]>0){var age=neigh[1];neigh=M.plantsById[neigh[0]-1];any++;neighs[neigh.key]++;if (age>=neigh.mature){neighsM[neigh.key]++;}}1922var neigh=M.getTile(x+1,y);if (neigh[0]>0){var age=neigh[1];neigh=M.plantsById[neigh[0]-1];any++;neighs[neigh.key]++;if (age>=neigh.mature){neighsM[neigh.key]++;}}1923var neigh=M.getTile(x-1,y-1);if (neigh[0]>0){var age=neigh[1];neigh=M.plantsById[neigh[0]-1];any++;neighs[neigh.key]++;if (age>=neigh.mature){neighsM[neigh.key]++;}}1924var neigh=M.getTile(x-1,y+1);if (neigh[0]>0){var age=neigh[1];neigh=M.plantsById[neigh[0]-1];any++;neighs[neigh.key]++;if (age>=neigh.mature){neighsM[neigh.key]++;}}1925var neigh=M.getTile(x+1,y-1);if (neigh[0]>0){var age=neigh[1];neigh=M.plantsById[neigh[0]-1];any++;neighs[neigh.key]++;if (age>=neigh.mature){neighsM[neigh.key]++;}}1926var neigh=M.getTile(x+1,y+1);if (neigh[0]>0){var age=neigh[1];neigh=M.plantsById[neigh[0]-1];any++;neighs[neigh.key]++;if (age>=neigh.mature){neighsM[neigh.key]++;}}1927if (any>0)1928{1929var muts=M.getMuts(neighs,neighsM);19301931var list=[];1932for (var ii=0;ii<muts.length;ii++)1933{1934if (Math.random()<muts[ii][1] && (!M.plants[muts[ii][0]].weed || Math.random()<weedMult) && ((!M.plants[muts[ii][0]].weed && !M.plants[muts[ii][0]].fungus) || Math.random()<M.plotBoost[y][x][2])) list.push(muts[ii][0]);1935}1936if (list.length>0) M.plot[y][x]=[M.plants[choose(list)].id+1,0];1937}1938else if (loop==0)1939{1940//weeds in empty tiles (no other plants must be nearby)1941var chance=0.002*weedMult*M.plotBoost[y][x][2];1942if (Math.random()<chance) M.plot[y][x]=[M.plants['meddleweed'].id+1,0];1943}1944}1945}1946}1947}1948}1949M.toRebuild=true;1950M.toCompute=true;1951}1952}1953if (M.toRebuild) M.buildPlot();1954if (M.toCompute) M.computeEffs();19551956if (Game.keys[27])//esc1957{1958if (M.seedSelected>-1) M.plantsById[M.seedSelected].l.classList.remove('on');1959M.seedSelected=-1;1960}1961}1962M.draw=function()1963{1964//run each draw frame19651966if (M.cursorL)1967{1968if (!M.cursor || M.seedSelected<0)1969{1970M.cursorL.style.display='none';1971}1972else1973{1974var box=l('gardenDrag').getBoundingClientRect();1975var x=Game.mouseX-box.left-24;1976var y=Game.mouseY-box.top;1977var seed=M.plantsById[M.seedSelected];1978var icon=[0,seed.icon];1979M.cursorL.style.transform='translate('+(x)+'px,'+(y)+'px)';1980M.cursorL.style.backgroundPosition=(-icon[0]*48)+'px '+(-icon[1]*48)+'px';1981M.cursorL.style.display='block';1982}1983}1984if (Game.drawT%10==0)1985{1986M.lumpRefill.style.display='block';1987if (M.freeze) l('gardenNextTick').innerHTML='Garden is frozen. Unfreeze to resume.';1988else l('gardenNextTick').innerHTML='Next tick in '+Game.sayTime((M.nextStep-Date.now())/1000*30+30,-1)+'';1989l('gardenStats').innerHTML='Mature plants harvested : '+Beautify(M.harvests)+' (total : '+Beautify(M.harvestsTotal)+')';1990if (M.parent.level<M.plotLimits.length) l('gardenPlotSize').innerHTML='<small>Plot size : '+Math.max(1,Math.min(M.plotLimits.length,M.parent.level))+'/'+M.plotLimits.length+'<br>(Upgrades with farm level)</small>';1991else l('gardenPlotSize').innerHTML='';1992l('gardenSeedsUnlocked').innerHTML='Seeds<small> ('+M.plantsUnlockedN+'/'+M.plantsN+')</small>';1993for (var i in M.soils)1994{1995var me=M.soils[i];1996if (M.parent.amount<me.req) l('gardenSoil-'+me.id).classList.add('disabled');1997else l('gardenSoil-'+me.id).classList.remove('disabled');1998}1999}2000}2001M.init(l('rowSpecial'+M.parent.id));2002}2003var M=0;200420052006