diff options
Diffstat (limited to 'minigameGarden.js')
| -rw-r--r-- | minigameGarden.js | 2018 |
1 files changed, 2018 insertions, 0 deletions
diff --git a/minigameGarden.js b/minigameGarden.js new file mode 100644 index 0000000..6f377c6 --- /dev/null +++ b/minigameGarden.js @@ -0,0 +1,2018 @@ +var M={}; +M.parent=Game.Objects['Farm']; +M.parent.minigame=M; +M.launch=function() +{ + var M=this; + M.name=M.parent.minigameName; + M.init=function(div) + { + //populate div with html and initialize values + + /* + plants age from 0 to 100 + at one point in its lifespan, the plant becomes mature + plants have 4 life stages once planted : bud, sprout, bloom, mature + a plant may age faster by having a higher .ageTick + if a plant has .ageTickR, a random number between 0 and that amount is added to .ageTick + a plant may mature faster by having a lower .mature + a plant's effects depend on how mature it is + a plant can only reproduce when mature + */ + M.plants={ + 'bakerWheat':{ + name:'Baker\'s wheat', + icon:0, + cost:1, + costM:30, + ageTick:7, + ageTickR:2, + mature:35, + children:['bakerWheat','thumbcorn','cronerice','bakeberry','clover','goldenClover','chocoroot','tidygrass'], + effsStr:'<div class="green">• +1% CpS</div>', + q:'A plentiful crop whose hardy grain is used to make flour for pastries.', + onHarvest:function(x,y,age) + { + if (age>=this.mature) M.dropUpgrade('Wheat slims',0.001); + }, + }, + 'thumbcorn':{ + name:'Thumbcorn', + icon:1, + cost:5, + costM:100, + ageTick:6, + ageTickR:2, + mature:20, + children:['bakerWheat','thumbcorn','cronerice','gildmillet','glovemorel'], + effsStr:'<div class="green">• +2% cookies per click</div>', + q:'A strangely-shaped variant of corn. The amount of strands that can sprout from one seed is usually in the single digits.', + }, + 'cronerice':{ + name:'Cronerice', + icon:2, + cost:15, + costM:250, + ageTick:0.4, + ageTickR:0.7, + mature:55, + children:['thumbcorn','gildmillet','elderwort','wardlichen'], + effsStr:'<div class="green">• +3% grandma CpS</div>', + q:'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.', + }, + 'gildmillet':{ + name:'Gildmillet', + icon:3, + cost:15, + costM:1500, + ageTick:2, + ageTickR:1.5, + mature:40, + children:['clover','goldenClover','shimmerlily'], + effsStr:'<div class="green">• +1% golden cookie gains</div><div class="green">• +0.1% golden cookie effect duration</div>', + q:'An ancient staple crop, famed for its golden sheen. Was once used to bake birthday cakes for kings and queens of old.', + }, + 'clover':{ + name:'Ordinary clover', + icon:4, + cost:25, + costM:77777, + ageTick:1, + ageTickR:1.5, + mature:35, + children:['goldenClover','greenRot','shimmerlily'], + effsStr:'<div class="green">• +1% golden cookie frequency</div>', + q:'<i>Trifolium repens</i>, a fairly mundane variety of clover with a tendency to produce four leaves. Such instances are considered lucky by some.', + }, + 'goldenClover':{ + name:'Golden clover', + icon:5, + cost:125, + costM:777777777777, + ageTick:4, + ageTickR:12, + mature:50, + children:[], + effsStr:'<div class="green">• +3% golden cookie frequency</div>', + q:'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.', + }, + 'shimmerlily':{ + name:'Shimmerlily', + icon:6, + cost:60, + costM:777777, + ageTick:5, + ageTickR:6, + mature:70, + children:['elderwort','whiskerbloom','chimerose','cheapcap'], + effsStr:'<div class="green">• +1% golden cookie gains</div><div class="green">• +1% golden cookie frequency</div><div class="green">• +1% random drops</div>', + q:'These little flowers are easiest to find at dawn, as the sunlight refracting in dew drops draws attention to their pure-white petals.', + }, + 'elderwort':{ + name:'Elderwort', + icon:7, + cost:60*3, + costM:100000000, + ageTick:0.3, + ageTickR:0.5, + mature:90, + immortal:1, + noContam:true, + detailsStr:'Immortal', + children:['everdaisy','ichorpuff','shriekbulb'], + effsStr:'<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>', + q:'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.', + onHarvest:function(x,y,age) + { + if (age>=this.mature) M.dropUpgrade('Elderwort biscuits',0.01); + }, + }, + 'bakeberry':{ + name:'Bakeberry', + icon:8, + cost:45, + costM:100000000, + ageTick:1, + ageTickR:1, + mature:50, + children:['queenbeet'], + effsStr:'<div class="green">• +1% CpS</div><div class="green">• harvest when mature for +30 minutes of CpS (max. 3% of bank)</div>', + q:'A favorite among cooks, this large berry has a crunchy brown exterior and a creamy red center. Excellent in pies or chicken stews.', + onHarvest:function(x,y,age) + { + if (age>=this.mature) + { + var moni=Math.min(Game.cookies*0.03,Game.cookiesPs*60*30); + if (moni!=0) + { + Game.Earn(moni); + Game.Popup('(Bakeberry)<br>+'+Beautify(moni)+' cookies!',Game.mouseX,Game.mouseY); + } + M.dropUpgrade('Bakeberry cookies',0.015); + } + }, + }, + 'chocoroot':{ + name:'Chocoroot', + icon:9, + cost:15, + costM:100000, + ageTick:4, + ageTickR:0, + mature:25, + detailsStr:'Predictable growth', + children:['whiteChocoroot','drowsyfern','queenbeet'], + effsStr:'<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>', + q:'A tangly bramble coated in a sticky, sweet substance. Unknown genetic ancestry. Children often pick these from fields as-is as a snack.', + onHarvest:function(x,y,age) + { + if (age>=this.mature) + { + var moni=Math.min(Game.cookies*0.03,Game.cookiesPs*60*3); + if (moni!=0) + { + Game.Earn(moni); + Game.Popup('(Chocoroot)<br>+'+Beautify(moni)+' cookies!',Game.mouseX,Game.mouseY); + } + } + }, + }, + 'whiteChocoroot':{ + name:'White chocoroot', + icon:10, + cost:15, + costM:100000, + ageTick:4, + ageTickR:0, + mature:25, + detailsStr:'Predictable growth', + children:['whiskerbloom','tidygrass'], + effsStr:'<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>', + q:'A pale, even sweeter variant of the chocoroot. Often impedes travelers with its twisty branches.', + onHarvest:function(x,y,age) + { + if (age>=this.mature) + { + var moni=Math.min(Game.cookies*0.03,Game.cookiesPs*60*3); + if (moni!=0) + { + Game.Earn(moni); + Game.Popup('(White chocoroot)<br>+'+Beautify(moni)+' cookies!',Game.mouseX,Game.mouseY); + } + } + }, + }, + + 'whiteMildew':{ + name:'White mildew', + fungus:true, + icon:26, + cost:20, + costM:9999, + ageTick:8, + ageTickR:12, + mature:70, + detailsStr:'Spreads easily', + children:['brownMold','whiteChocoroot','wardlichen','greenRot'], + effsStr:'<div class="green">• +1% CpS</div><div class="gray">• may spread as brown mold</div>', + q:'A common rot that infests shady plots of earth. Grows in little creamy capsules. Smells sweet, but sadly wilts quickly.', + }, + 'brownMold':{ + name:'Brown mold', + fungus:true, + icon:27, + cost:20, + costM:9999, + ageTick:8, + ageTickR:12, + mature:70, + detailsStr:'Spreads easily', + children:['whiteMildew','chocoroot','keenmoss','wrinklegill'], + effsStr:'<div class="red">• -1% CpS</div><div class="gray">• may spread as white mildew</div>', + q:'A common rot that infests shady plots of earth. Grows in odd reddish clumps. Smells bitter, but thankfully wilts quickly.', + }, + + 'meddleweed':{ + name:'Meddleweed', + weed:true, + icon:29, + cost:1, + costM:10, + ageTick:10, + ageTickR:6, + mature:50, + contam:0.05, + detailsStr:'Grows in empty tiles, spreads easily', + children:['meddleweed','brownMold','crumbspore'], + effsStr:'<div class="red">• useless</div><div class="red">• may overtake nearby plants</div><div class="gray">• may sometimes drop spores when uprooted</div>', + q:'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.', + onKill:function(x,y,age) + { + if (Math.random()<0.2*(age/100)) M.plot[y][x]=[M.plants[choose(['brownMold','crumbspore'])].id+1,0]; + }, + }, + + 'whiskerbloom':{ + name:'Whiskerbloom', + icon:11, + cost:20, + costM:1000000, + ageTick:2, + ageTickR:2, + mature:60, + children:['chimerose','nursetulip'], + effsStr:'<div class="green">• +0.2% effects from milk</div>', + q:'Squeezing the translucent pods makes them excrete a milky liquid, while producing a faint squeak akin to a cat\'s meow.', + }, + 'chimerose':{ + name:'Chimerose', + icon:12, + cost:15, + costM:242424, + ageTick:1, + ageTickR:1.5, + mature:30, + children:['chimerose'], + effsStr:'<div class="green">• +1% reindeer gains</div><div class="green">• +1% reindeer frequency</div>', + q:'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.', + }, + 'nursetulip':{ + name:'Nursetulip', + icon:13, + cost:40, + costM:1000000000, + ageTick:0.5, + ageTickR:2, + mature:60, + children:[], + effsStr:'<div class="green">• surrounding plants (3x3) are 20% more efficient</div><div class="red">• -2% CpS</div>', + q:'This flower grows an intricate root network that distributes nutrients throughout the surrounding soil. The reason for this seemingly altruistic behavior is still unknown.', + }, + 'drowsyfern':{ + name:'Drowsyfern', + icon:14, + cost:90, + costM:100000, + ageTick:0.05, + ageTickR:0.1, + mature:30, + children:[], + effsStr:'<div class="green">• +3% CpS</div><div class="red">• -5% cookies per click</div><div class="red">• -10% golden cookie frequency</div>', + q:'Traditionally used to brew a tea that guarantees a good night of sleep.', + onHarvest:function(x,y,age) + { + if (age>=this.mature) M.dropUpgrade('Fern tea',0.01); + }, + }, + 'wardlichen':{ + name:'Wardlichen', + icon:15, + cost:10, + costM:10000, + ageTick:5, + ageTickR:4, + mature:65, + children:['wardlichen'], + effsStr:'<div class="gray">• 2% less wrath cookies</div><div class="gray">• wrinklers spawn 15% slower</div>', + q:'The metallic stench that emanates from this organism has been known to keep insects and slugs away.', + }, + 'keenmoss':{ + name:'Keenmoss', + icon:16, + cost:50, + costM:1000000, + ageTick:4, + ageTickR:5, + mature:65, + children:['drowsyfern','wardlichen','keenmoss'], + effsStr:'<div class="green">• +3% random drops</div>', + q:'Fuzzy to the touch and of a vibrant green. In plant symbolism, keenmoss is associated with good luck for finding lost objects.', + }, + 'queenbeet':{ + name:'Queenbeet', + icon:17, + cost:60*1.5, + costM:1000000000, + ageTick:1, + ageTickR:0.4, + mature:80, + noContam:true, + children:['duketater','queenbeetLump','shriekbulb'], + effsStr:'<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>', + q:'A delicious taproot used to prepare high-grade white sugar. Entire countries once went to war over these.', + onHarvest:function(x,y,age) + { + if (age>=this.mature) + { + var moni=Math.min(Game.cookies*0.04,Game.cookiesPs*60*60); + if (moni!=0) + { + Game.Earn(moni); + Game.Popup('(Queenbeet)<br>+'+Beautify(moni)+' cookies!',Game.mouseX,Game.mouseY); + } + } + }, + }, + 'queenbeetLump':{ + name:'Juicy queenbeet', + icon:18, + plantable:false, + cost:60*2, + costM:1000000000000, + ageTick:0.04, + ageTickR:0.08, + mature:85, + noContam:true, + children:[], + effsStr:'<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>', + q:'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.', + onHarvest:function(x,y,age) + { + if (age>=this.mature) + { + Game.gainLumps(1); + popup='(Juicy queenbeet)<br>Sweet!<div style="font-size:65%;">Found 1 sugar lump!</div>'; + } + }, + }, + 'duketater':{ + name:'Duketater', + icon:19, + cost:60*8, + costM:1000000000000, + ageTick:0.4, + ageTickR:0.1, + mature:95, + noContam:true, + children:['shriekbulb'], + effsStr:'<div class="green">• harvest when mature for +2 hours of CpS (max. 8% of bank)</div>', + q:'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.', + onHarvest:function(x,y,age) + { + if (age>=this.mature) + { + var moni=Math.min(Game.cookies*0.08,Game.cookiesPs*60*60*2); + if (moni!=0) + { + Game.Earn(moni); + Game.Popup('(Duketater)<br>+'+Beautify(moni)+' cookies!',Game.mouseX,Game.mouseY); + } + M.dropUpgrade('Duketater cookies',0.005); + } + }, + }, + 'crumbspore':{ + name:'Crumbspore', + fungus:true, + icon:20, + cost:10, + costM:999, + ageTick:3, + ageTickR:3, + mature:65, + contam:0.03, + noContam:true, + detailsStr:'Spreads easily', + children:['crumbspore','glovemorel','cheapcap','doughshroom','wrinklegill','ichorpuff'], + effsStr:'<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>', + q:'An archaic mold that spreads its spores to the surrounding dirt through simple pod explosion.', + onDie:function(x,y) + { + var moni=Math.min(Game.cookies*0.01,Game.cookiesPs*60)*Math.random(); + if (moni!=0) + { + Game.Earn(moni); + Game.Popup('(Crumbspore)<br>+'+Beautify(moni)+' cookies!',Game.mouseX,Game.mouseY); + } + }, + }, + 'doughshroom':{ + name:'Doughshroom', + fungus:true, + icon:24, + cost:100, + costM:100000000, + ageTick:1, + ageTickR:2, + mature:85, + contam:0.03, + noContam:true, + detailsStr:'Spreads easily', + children:['crumbspore','doughshroom','foolBolete','shriekbulb'], + effsStr:'<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>', + q:'Jammed full of warm spores; some forest walkers often describe the smell as similar to passing by a bakery.', + onDie:function(x,y) + { + var moni=Math.min(Game.cookies*0.03,Game.cookiesPs*60*5)*Math.random(); + if (moni!=0) + { + Game.Earn(moni); + Game.Popup('(Doughshroom)<br>+'+Beautify(moni)+' cookies!',Game.mouseX,Game.mouseY); + } + }, + }, + 'glovemorel':{ + name:'Glovemorel', + fungus:true, + icon:21, + cost:30, + costM:10000, + ageTick:3, + ageTickR:18, + mature:80, + children:[], + effsStr:'<div class="green">• +4% cookies per click</div><div class="green">• +1% cursor CpS</div><div class="red">• -1% CpS</div>', + q:'Touching its waxy skin reveals that the interior is hollow and uncomfortably squishy.', + }, + 'cheapcap':{ + name:'Cheapcap', + fungus:true, + icon:22, + cost:40, + costM:100000, + ageTick:6, + ageTickR:16, + mature:40, + children:[], + effsStr:'<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>', + q:'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.', + }, + 'foolBolete':{ + name:'Fool\'s bolete', + fungus:true, + icon:23, + cost:15, + costM:10000, + ageTick:5, + ageTickR:25, + mature:50, + children:[], + effsStr:'<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>', + q:'Named for its ability to fool mushroom pickers. The fool\'s bolete is not actually poisonous, it\'s just extremely bland.', + }, + 'wrinklegill':{ + name:'Wrinklegill', + fungus:true, + icon:25, + cost:20, + costM:1000000, + ageTick:1, + ageTickR:3, + mature:65, + children:['elderwort','shriekbulb'], + effsStr:'<div class="gray">• wrinklers spawn 2% faster</div><div class="gray">• wrinklers eat 1% more</div>', + q:'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.', + }, + 'greenRot':{ + name:'Green rot', + fungus:true, + icon:28, + cost:60, + costM:1000000, + ageTick:12, + ageTickR:13, + mature:65, + children:['keenmoss','foolBolete'], + effsStr:'<div class="green">• +0.5% golden cookie duration</div><div class="green">• +1% golden cookie frequency</div><div class="green">• +1% random drops</div>', + q:'This short-lived mold is also known as "emerald pebbles", and is considered by some as a pseudo-gem that symbolizes good fortune.', + onHarvest:function(x,y,age) + { + if (age>=this.mature) M.dropUpgrade('Green yeast digestives',0.005); + }, + }, + 'shriekbulb':{ + name:'Shriekbulb', + icon:30, + cost:60, + costM:4444444444444, + ageTick:3, + ageTickR:1, + mature:60, + noContam:true, + detailsStr:'The unfortunate result of some plant combinations', + children:['shriekbulb'], + effsStr:'<div class="red">• -2% CpS</div><div class="red">• surrounding plants (3x3) are 5% less efficient</div>', + q:'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.', + }, + 'tidygrass':{ + name:'Tidygrass', + icon:31, + cost:90, + costM:100000000000000, + ageTick:0.5, + ageTickR:0, + mature:40, + children:['everdaisy'], + effsStr:'<div class="green">• surrounding tiles (5x5) develop no weeds or fungus</div>', + q:'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.', + }, + 'everdaisy':{ + name:'Everdaisy', + icon:32, + cost:180, + costM:100000000000000000000, + ageTick:0.3, + ageTickR:0, + mature:75, + noContam:true, + immortal:1, + detailsStr:'Immortal', + children:[], + effsStr:'<div class="green">• surrounding tiles (3x3) develop no weeds or fungus</div><div class="green">• immortal</div>', + q:'While promoted by some as a superfood owing to its association with longevity and intriguing geometry, this elusive flower is actually mildly toxic.', + }, + 'ichorpuff':{ + name:'Ichorpuff', + fungus:true, + icon:33, + cost:120, + costM:987654321, + ageTick:1, + ageTickR:1.5, + mature:35, + children:[], + effsStr:'<div class="green">• surrounding plants (3x3) age half as fast</div><div class="red">• surrounding plants (3x3) are half as efficient</div>', + q:'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.', + onHarvest:function(x,y,age) + { + if (age>=this.mature) M.dropUpgrade('Ichor syrup',0.005); + }, + }, + }; + M.plantsById=[];var n=0; + for (var i in M.plants) + { + M.plants[i].unlocked=0; + M.plants[i].id=n; + M.plants[i].key=i; + M.plants[i].matureBase=M.plants[i].mature; + M.plantsById[n]=M.plants[i]; + if (typeof M.plants[i].plantable==='undefined') {M.plants[i].plantable=true;} + n++; + } + M.plantsN=M.plantsById.length; + M.plantsUnlockedN=0; + M.getUnlockedN=function() + { + M.plantsUnlockedN=0; + for (var i in M.plants){if (M.plants[i].unlocked) M.plantsUnlockedN++;} + if (M.plantsUnlockedN>=M.plantsN) + { + Game.Win('Keeper of the conservatory'); + l('gardenTool-3').classList.remove('locked'); + } + else l('gardenTool-3').classList.add('locked'); + + return M.plantsUnlockedN; + } + + M.dropUpgrade=function(upgrade,rate) + { + if (!Game.Has(upgrade) && Math.random()<=rate*Game.dropRateMult()*(Game.HasAchiev('Seedless to nay')?1.05:1)) + { + Game.Unlock(upgrade); + } + } + + M.computeMatures=function() + { + var mult=1; + if (Game.HasAchiev('Seedless to nay')) mult=0.95; + for (var i in M.plants) + { + M.plants[i].mature=M.plants[i].matureBase*mult; + } + } + + M.plantContam={}; + for (var i in M.plants) + { + if (M.plants[i].contam) M.plantContam[M.plants[i].key]=M.plants[i].contam; + } + + M.getMuts=function(neighs,neighsM) + { + //get possible mutations given a list of neighbors + //note : neighs stands for neighbors, not horsey noises + var muts=[]; + + if (neighsM['bakerWheat']>=2) muts.push(['bakerWheat',0.2],['thumbcorn',0.05],['bakeberry',0.001]); + if (neighsM['bakerWheat']>=1 && neighsM['thumbcorn']>=1) muts.push(['cronerice',0.01]); + if (neighsM['thumbcorn']>=2) muts.push(['thumbcorn',0.1],['bakerWheat',0.05]); + if (neighsM['cronerice']>=1 && neighsM['thumbcorn']>=1) muts.push(['gildmillet',0.03]); + if (neighsM['cronerice']>=2) muts.push(['thumbcorn',0.02]); + if (neighsM['bakerWheat']>=1 && neighsM['gildmillet']>=1) muts.push(['clover',0.03],['goldenClover',0.0007]); + if (neighsM['clover']>=1 && neighsM['gildmillet']>=1) muts.push(['shimmerlily',0.02]); + if (neighsM['clover']>=2 && neighs['clover']<5) muts.push(['clover',0.007],['goldenClover',0.0001]); + if (neighsM['clover']>=4) muts.push(['goldenClover',0.0007]); + if (neighsM['shimmerlily']>=1 && neighsM['cronerice']>=1) muts.push(['elderwort',0.01]); + if (neighsM['wrinklegill']>=1 && neighsM['cronerice']>=1) muts.push(['elderwort',0.002]); + if (neighsM['bakerWheat']>=1 && neighs['brownMold']>=1) muts.push(['chocoroot',0.1]); + if (neighsM['chocoroot']>=1 && neighs['whiteMildew']>=1) muts.push(['whiteChocoroot',0.1]); + if (neighsM['whiteMildew']>=1 && neighs['brownMold']<=1) muts.push(['brownMold',0.5]); + if (neighsM['brownMold']>=1 && neighs['whiteMildew']<=1) muts.push(['whiteMildew',0.5]); + if (neighsM['meddleweed']>=1 && neighs['meddleweed']<=3) muts.push(['meddleweed',0.15]); + + if (neighsM['shimmerlily']>=1 && neighsM['whiteChocoroot']>=1) muts.push(['whiskerbloom',0.01]); + if (neighsM['shimmerlily']>=1 && neighsM['whiskerbloom']>=1) muts.push(['chimerose',0.05]); + if (neighsM['chimerose']>=2) muts.push(['chimerose',0.005]); + if (neighsM['whiskerbloom']>=2) muts.push(['nursetulip',0.05]); + if (neighsM['chocoroot']>=1 && neighsM['keenmoss']>=1) muts.push(['drowsyfern',0.005]); + if ((neighsM['cronerice']>=1 && neighsM['keenmoss']>=1) || (neighsM['cronerice']>=1 && neighsM['whiteMildew']>=1)) muts.push(['wardlichen',0.005]); + if (neighsM['wardlichen']>=1 && neighs['wardlichen']<2) muts.push(['wardlichen',0.05]); + if (neighsM['greenRot']>=1 && neighsM['brownMold']>=1) muts.push(['keenmoss',0.1]); + if (neighsM['keenmoss']>=1 && neighs['keenmoss']<2) muts.push(['keenmoss',0.05]); + if (neighsM['chocoroot']>=1 && neighsM['bakeberry']>=1) muts.push(['queenbeet',0.01]); + if (neighsM['queenbeet']>=8) muts.push(['queenbeetLump',0.001]); + if (neighsM['queenbeet']>=2) muts.push(['duketater',0.001]); + + if (neighsM['crumbspore']>=1 && neighs['crumbspore']<=1) muts.push(['crumbspore',0.07]); + if (neighsM['crumbspore']>=1 && neighsM['thumbcorn']>=1) muts.push(['glovemorel',0.02]); + if (neighsM['crumbspore']>=1 && neighsM['shimmerlily']>=1) muts.push(['cheapcap',0.04]); + if (neighsM['doughshroom']>=1 && neighsM['greenRot']>=1) muts.push(['foolBolete',0.04]); + if (neighsM['crumbspore']>=2) muts.push(['doughshroom',0.005]); + if (neighsM['doughshroom']>=1 && neighs['doughshroom']<=1) muts.push(['doughshroom',0.07]); + if (neighsM['doughshroom']>=2) muts.push(['crumbspore',0.005]); + if (neighsM['crumbspore']>=1 && neighsM['brownMold']>=1) muts.push(['wrinklegill',0.06]); + if (neighsM['whiteMildew']>=1 && neighsM['clover']>=1) muts.push(['greenRot',0.05]); + + if (neighsM['wrinklegill']>=1 && neighsM['elderwort']>=1) muts.push(['shriekbulb',0.001]); + if (neighsM['elderwort']>=5) muts.push(['shriekbulb',0.001]); + if (neighs['duketater']>=3) muts.push(['shriekbulb',0.005]); + if (neighs['doughshroom']>=4) muts.push(['shriekbulb',0.002]); + if (neighsM['queenbeet']>=5) muts.push(['shriekbulb',0.001]); + if (neighs['shriekbulb']>=1 && neighs['shriekbulb']<2) muts.push(['shriekbulb',0.005]); + + if (neighsM['bakerWheat']>=1 && neighsM['whiteChocoroot']>=1) muts.push(['tidygrass',0.002]); + if (neighsM['tidygrass']>=3 && neighsM['elderwort']>=3) muts.push(['everdaisy',0.002]); + if (neighsM['elderwort']>=1 && neighsM['crumbspore']>=1) muts.push(['ichorpuff',0.002]); + + return muts; + } + + M.computeBoostPlot=function() + { + //some plants apply effects to surrounding tiles + //this function computes those effects by creating a grid in which those effects stack + for (var y=0;y<6;y++) + { + for (var x=0;x<6;x++) + { + //age mult, power mult, weed mult + M.plotBoost[y][x]=[1,1,1]; + } + } + + var effectOn=function(X,Y,s,mult) + { + for (var y=Math.max(0,Y-s);y<Math.min(6,Y+s+1);y++) + { + for (var x=Math.max(0,X-s);x<Math.min(6,X+s+1);x++) + { + if (X==x && Y==y) {} + else + { + for (var i=0;i<mult.length;i++) + { + M.plotBoost[y][x][i]*=mult[i]; + } + } + } + } + } + for (var y=0;y<6;y++) + { + for (var x=0;x<6;x++) + { + var tile=M.plot[y][x]; + if (tile[0]>0) + { + var me=M.plantsById[tile[0]-1]; + var name=me.key; + var stage=0; + if (tile[1]>=me.mature) stage=4; + else if (tile[1]>=me.mature*0.666) stage=3; + else if (tile[1]>=me.mature*0.333) stage=2; + else stage=1; + + var soilMult=M.soilsById[M.soil].effMult; + var mult=soilMult; + + if (stage==1) mult*=0.1; + else if (stage==2) mult*=0.25; + else if (stage==3) mult*=0.5; + else mult*=1; + + //age mult, power mult, weed mult + /*if (name=='elderwort') effectOn(x,y,1,[1+0.03*mult,1,1]); + else if (name=='queenbeetLump') effectOn(x,y,1,[1,1-0.2*mult,1]); + else if (name=='nursetulip') effectOn(x,y,1,[1,1+0.2*mult,1]); + else if (name=='shriekbulb') effectOn(x,y,1,[1,1-0.05*mult,1]); + else if (name=='tidygrass') effectOn(x,y,2,[1,1,0]); + else if (name=='everdaisy') effectOn(x,y,1,[1,1,0]); + else if (name=='ichorpuff') effectOn(x,y,1,[1-0.5*mult,1-0.5*mult,1]);*/ + + var ageMult=1; + var powerMult=1; + var weedMult=1; + var range=0; + + if (name=='elderwort') {ageMult=1.03;range=1;} + else if (name=='queenbeetLump') {powerMult=0.8;range=1;} + else if (name=='nursetulip') {powerMult=1.2;range=1;} + else if (name=='shriekbulb') {powerMult=0.95;range=1;} + else if (name=='tidygrass') {weedMult=0;range=2;} + else if (name=='everdaisy') {weedMult=0;range=1;} + else if (name=='ichorpuff') {ageMult=0.5;powerMult=0.5;range=1;} + + //by god i hope these are right + if (ageMult>=1) ageMult=(ageMult-1)*mult+1; else if (mult>=1) ageMult=1/((1/ageMult)*mult); else ageMult=1-(1-ageMult)*mult; + if (powerMult>=1) powerMult=(powerMult-1)*mult+1; else if (mult>=1) powerMult=1/((1/powerMult)*mult); else powerMult=1-(1-powerMult)*mult; + + if (range>0) effectOn(x,y,range,[ageMult,powerMult,weedMult]); + } + } + } + } + + M.computeEffs=function() + { + M.toCompute=false; + var effs={ + cps:1, + click:1, + cursorCps:1, + grandmaCps:1, + goldenCookieGain:1, + goldenCookieFreq:1, + goldenCookieDur:1, + goldenCookieEffDur:1, + wrathCookieGain:1, + wrathCookieFreq:1, + wrathCookieDur:1, + wrathCookieEffDur:1, + reindeerGain:1, + reindeerFreq:1, + reindeerDur:1, + itemDrops:1, + milk:1, + wrinklerSpawn:1, + wrinklerEat:1, + upgradeCost:1, + buildingCost:1, + }; + + if (!M.freeze) + { + var soilMult=M.soilsById[M.soil].effMult; + + for (var y=0;y<6;y++) + { + for (var x=0;x<6;x++) + { + var tile=M.plot[y][x]; + if (tile[0]>0) + { + var me=M.plantsById[tile[0]-1]; + var name=me.key; + var stage=0; + if (tile[1]>=me.mature) stage=4; + else if (tile[1]>=me.mature*0.666) stage=3; + else if (tile[1]>=me.mature*0.333) stage=2; + else stage=1; + + var mult=soilMult; + + if (stage==1) mult*=0.1; + else if (stage==2) mult*=0.25; + else if (stage==3) mult*=0.5; + else mult*=1; + + mult*=M.plotBoost[y][x][1]; + + if (name=='bakerWheat') effs.cps+=0.01*mult; + else if (name=='thumbcorn') effs.click+=0.02*mult; + else if (name=='cronerice') effs.grandmaCps+=0.03*mult; + else if (name=='gildmillet') {effs.goldenCookieGain+=0.01*mult;effs.goldenCookieEffDur+=0.001*mult;} + else if (name=='clover') effs.goldenCookieFreq+=0.01*mult; + else if (name=='goldenClover') effs.goldenCookieFreq+=0.03*mult; + else if (name=='shimmerlily') {effs.goldenCookieGain+=0.01*mult;effs.goldenCookieFreq+=0.01*mult;effs.itemDrops+=0.01*mult;} + else if (name=='elderwort') {effs.wrathCookieGain+=0.01*mult;effs.wrathCookieFreq+=0.01*mult;effs.grandmaCps+=0.01*mult;} + else if (name=='bakeberry') effs.cps+=0.01*mult; + else if (name=='chocoroot') effs.cps+=0.01*mult; + else if (name=='whiteChocoroot') effs.goldenCookieGain+=0.01*mult; + + else if (name=='whiteMildew') effs.cps+=0.01*mult; + else if (name=='brownMold') effs.cps*=1-0.01*mult; + + else if (name=='meddleweed') {} + + else if (name=='whiskerbloom') effs.milk+=0.002*mult; + else if (name=='chimerose') {effs.reindeerGain+=0.01*mult;effs.reindeerFreq+=0.01*mult;} + + else if (name=='nursetulip') {effs.cps*=1-0.02*mult;} + else if (name=='drowsyfern') {effs.cps+=0.03*mult;effs.click*=1-0.05*mult;effs.goldenCookieFreq*=1-0.1*mult;} + else if (name=='wardlichen') {effs.wrinklerSpawn*=1-0.15*mult;effs.wrathCookieFreq*=1-0.02*mult;} + else if (name=='keenmoss') {effs.itemDrops+=0.03*mult;} + else if (name=='queenbeet') {effs.goldenCookieEffDur+=0.003*mult;effs.cps*=1-0.02*mult;} + else if (name=='queenbeetLump') {effs.cps*=1-0.1*mult;} + else if (name=='glovemorel') {effs.click+=0.04*mult;effs.cursorCps+=0.01*mult;effs.cps*=1-0.01*mult;} + else if (name=='cheapcap') {effs.upgradeCost*=1-0.002*mult;effs.buildingCost*=1-0.002*mult;} + else 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;} + else if (name=='wrinklegill') {effs.wrinklerSpawn+=0.02*mult;effs.wrinklerEat+=0.01*mult;} + else if (name=='greenRot') {effs.goldenCookieDur+=0.005*mult;effs.goldenCookieFreq+=0.01*mult;effs.itemDrops+=0.01*mult;} + else if (name=='shriekbulb') {effs.cps*=1-0.02*mult;} + } + } + } + } + M.effs=effs; + Game.recalculateGains=1; + } + + + M.soils={ + 'dirt':{ + name:'Dirt', + icon:0, + tick:5, + effMult:1, + weedMult:1, + req:0, + effsStr:'<div class="gray">• tick every <b>5 minutes</b></div>', + q:'Simple, regular old dirt that you\'d find in nature.', + }, + 'fertilizer':{ + name:'Fertilizer', + icon:1, + tick:3, + effMult:0.75, + weedMult:1.2, + req:50, + effsStr:'<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>', + q:'Soil with a healthy helping of fresh manure. Plants grow faster but are less efficient.', + }, + 'clay':{ + name:'Clay', + icon:2, + tick:15, + effMult:1.25, + weedMult:1, + req:100, + effsStr:'<div class="gray">• tick every <b>15 minutes</b></div><div class="green">• passive plant effects <b>+25%</b></div>', + q:'Rich soil with very good water retention. Plants grow slower but are more efficient.', + }, + 'pebbles':{ + name:'Pebbles', + icon:3, + tick:5, + effMult:0.25, + weedMult:0.1, + req:200, + effsStr:'<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>', + q:'Dry soil made of small rocks tightly packed together. Not very conducive 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.', + }, + 'woodchips':{ + name:'Wood chips', + icon:4, + tick:5, + effMult:0.25, + weedMult:0.1, + req:300, + effsStr:'<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>', + q:'Soil made of bits and pieces of bark and sawdust. Helpful for young sprouts to develop, not so much for mature plants.', + }, + }; + M.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++;} + + + M.tools={ + 'info':{ + name:'Garden information', + icon:3, + desc:'-', + descFunc:function() + { + var str=''; + if (M.freeze) str='Your garden is frozen, providing no effects.'; + else + { + var effs={ + cps:{n:'CpS'}, + click:{n:'cookies/click'}, + cursorCps:{n:'cursor CpS'}, + grandmaCps:{n:'grandma CpS'}, + goldenCookieGain:{n:'golden cookie gains'}, + goldenCookieFreq:{n:'golden cookie frequency'}, + goldenCookieDur:{n:'golden cookie duration'}, + goldenCookieEffDur:{n:'golden cookie effect duration'}, + wrathCookieGain:{n:'wrath cookie gains'}, + wrathCookieFreq:{n:'wrath cookie frequency'}, + wrathCookieDur:{n:'wrath cookie duration'}, + wrathCookieEffDur:{n:'wrath cookie effect duration'}, + reindeerGain:{n:'reindeer gains'}, + reindeerFreq:{n:'reindeer cookie frequency'}, + reindeerDur:{n:'reindeer cookie duration'}, + itemDrops:{n:'random drops'}, + milk:{n:'milk effects'}, + wrinklerSpawn:{n:'wrinkler spawn rate'}, + wrinklerEat:{n:'wrinkler appetite'}, + upgradeCost:{n:'upgrade costs',rev:true}, + buildingCost:{n:'building costs',rev:true}, + }; + + var effStr=''; + for (var i in M.effs) + { + if (M.effs[i]!=1 && effs[i]) + { + var amount=(M.effs[i]-1)*100; + effStr+='<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>'; + } + } + if (effStr=='') effStr='<div style="font-size:10px;margin-left:64px;"><b>None.</b></div>'; + str+='<div>Combined effects of all your plants :</div>'+effStr; + } + str+='<div class="line"></div>'; + str+='<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>'; + return str; + }, + func:function(){}, + }, + 'harvestAll':{ + name:'Harvest all', + icon:0, + descFunc: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.');}, + func:function(){ + PlaySound('snd/toneTick.mp3'); + /*if (M.freeze){return false;}*/ + if (Game.keys[16] && Game.keys[17]) M.harvestAll(0,1,1);//ctrl & shift, harvest only mature non-immortal plants + else M.harvestAll(); + }, + }, + 'freeze':{ + name:'Freeze', + icon:1, + descFunc:function() + { + return '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> + }, + func:function(){ + //if (!M.freeze && M.nextFreeze>Date.now()) return false; + PlaySound('snd/toneTick.mp3'); + M.freeze=(M.freeze?0:1); + if (M.freeze) + { + M.computeEffs(); + PlaySound('snd/freezeGarden.mp3'); + this.classList.add('on'); + l('gardenContent').classList.add('gardenFrozen'); + + + for (var y=0;y<6;y++) + { + for (var x=0;x<6;x++) + { + var tile=M.plot[y][x]; + if (tile[0]>0) + { + var me=M.plantsById[tile[0]-1]; + var age=tile[1]; + if (me.key=='cheapcap' && Math.random()<0.15) + { + M.plot[y][x]=[0,0]; + if (me.onKill) me.onKill(x,y,age); + M.toRebuild=true; + } + } + } + } + } + else + { + //M.nextFreeze=Date.now()+(Game.Has('Turbo-charged soil')?1:(1000*60*10)); + M.computeEffs(); + this.classList.remove('on'); + l('gardenContent').classList.remove('gardenFrozen'); + } + }, + isOn:function(){if (M.freeze){l('gardenContent').classList.add('gardenFrozen');}else{l('gardenContent').classList.remove('gardenFrozen');}return M.freeze;}, + }, + 'convert':{ + name:'Sacrifice garden', + icon:2, + desc:'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.', + func:function(){PlaySound('snd/toneTick.mp3');M.askConvert();}, + isDisplayed:function(){if (M.plantsUnlockedN>=M.plantsN) return true; else return false;}, + }, + }; + M.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++;} + + + M.plot=[]; + for (var y=0;y<6;y++) + { + M.plot[y]=[]; + for (var x=0;x<6;x++) + { + M.plot[y][x]=[0,0]; + } + } + M.plotBoost=[]; + for (var y=0;y<6;y++) + { + M.plotBoost[y]=[]; + for (var x=0;x<6;x++) + { + //age mult, power mult, weed mult + M.plotBoost[y][x]=[1,1,1]; + } + } + + M.tileSize=40; + + M.seedSelected=-1; + + M.soil=0; + M.nextSoil=0;//timestamp for when soil will be ready to change again + + M.stepT=1;//in seconds + M.nextStep=0;//timestamp for next step tick + + M.harvests=0; + M.harvestsTotal=0; + + M.loopsMult=1; + + M.toRebuild=false; + M.toCompute=false; + + M.freeze=0; + M.nextFreeze=0;//timestamp for when we can freeze again; unused, but still stored + + M.getCost=function(me) + { + if (Game.Has('Turbo-charged soil')) return 0; + return Math.max(me.costM,Game.cookiesPs*me.cost*60)*(Game.HasAchiev('Seedless to nay')?0.95:1); + } + + M.getPlantDesc=function(me) + { + var children=''; + if (me.children.length>0) + { + children+='<div class="shadowFilter" style="display:inline-block;">'; + for (var i in me.children) + { + if (!M.plants[me.children[i]]) console.log('No plant named '+me.children[i]); + else + { + var it=M.plants[me.children[i]]; + if (it.unlocked) children+='<div class="gardenSeedTiny" style="background-position:'+(-0*48)+'px '+(-it.icon*48)+'px;"></div>'; + else 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>'; + } + } + children+='</div>'; + } + + return '<div class="description">'+ + (!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>'):'')+ + '<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>'+ + (me.weed?'<div style="margin:6px 0px;font-size:11px;"><b>Is a weed</b></div>':'')+ + (me.fungus?'<div style="margin:6px 0px;font-size:11px;"><b>Is a fungus</b></div>':'')+ + (me.detailsStr?('<div style="margin:6px 0px;font-size:11px;"><b>Details :</b> '+me.detailsStr+'</div>'):'')+ + (children!=''?('<div style="margin:6px 0px;font-size:11px;"><b>Possible mutations :</b> '+children+'</div>'):'')+ + '<div class="line"></div>'+ + '<div style="margin:6px 0px;"><b>Effects :</b></div>'+ + '<div style="font-size:11px;font-weight:bold;">'+me.effsStr+'</div>'+ + (me.q?('<q>'+me.q+'</q>'):'')+ + '</div>'; + } + M.canPlant=function(me) + { + if (Game.cookies>=M.getCost(me)) return true; else return false; + } + + M.cursor=1; + M.hideCursor=function() + { + M.cursor=0; + } + M.showCursor=function() + { + M.cursor=1; + } + + M.soilTooltip=function(id) + { + return function(){ + var me=M.soilsById[id]; + var str='<div style="padding:8px 4px;min-width:350px;">'+ + (M.parent.amount<me.req?( + '<div style="text-align:center;">Soil unlocked at '+me.req+' farms.</div>' + ):('<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>'+ + '<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>'+ + '<div class="line"></div>'+ + '<div class="description">'+ + '<div style="margin:6px 0px;"><b>Effects :</b></div>'+ + '<div style="font-size:11px;font-weight:bold;">'+me.effsStr+'</div>'+ + (me.q?('<q>'+me.q+'</q>'):'')+ + '</div>'))+ + '</div>'; + return str; + }; + } + M.seedTooltip=function(id) + { + return function(){ + var me=M.plantsById[id]; + var str='<div style="padding:8px 4px;min-width:400px;">'+ + '<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>'+ + '<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>'+ + '<div style="background:url(img/turnInto.png);width:20px;height:22px;position:absolute;left:28px;top:24px;z-index:1000;"></div>'+ + (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>'):'')+ + '<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>'+ + '<div class="line"></div>'+ + M.getPlantDesc(me)+ + '</div>'; + return str; + }; + } + M.toolTooltip=function(id) + { + return function(){ + var me=M.toolsById[id]; + var icon=[me.icon,35]; + var str='<div style="padding:8px 4px;min-width:350px;">'+ + '<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>'+ + '<div><div class="name">'+me.name+'</div></div>'+ + '<div class="line"></div>'+ + '<div class="description">'+ + (me.descFunc?me.descFunc():me.desc)+ + '</div>'+ + '</div>'; + return str; + }; + } + M.tileTooltip=function(x,y) + { + return function(){ + if (Game.keys[16]) return ''; + var tile=M.plot[y][x]; + if (tile[0]==0) + { + var me=(M.seedSelected>=0)?M.plantsById[M.seedSelected]:0; + var str='<div style="padding:8px 4px;min-width:350px;text-align:center;">'+ + '<div class="name">Empty tile</div>'+'<div class="line"></div><div class="description">'+ + 'This tile of soil is empty.<br>Pick a seed and plant something!'+ + (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><br><small>(Holding the shift key pressed will also hide tooltips.)</small>':'')+ + (M.plotBoost[y][x]!=[1,1,1]?('<small>'+ + (M.plotBoost[y][x][0]!=1?'<br>Aging multiplier : '+Beautify(M.plotBoost[y][x][0]*100)+'%':'')+ + (M.plotBoost[y][x][1]!=1?'<br>Effect multiplier : '+Beautify(M.plotBoost[y][x][1]*100)+'%':'')+ + (M.plotBoost[y][x][2]!=1?'<br>Weeds/fungus repellent : '+Beautify(100-M.plotBoost[y][x][2]*100)+'%':'')+ + '</small>' + ):'')+ + '</div>'+ + '</div>'; + return str; + } + else + { + var me=M.plantsById[tile[0]-1]; + var stage=0; + if (tile[1]>=me.mature) stage=4; + else if (tile[1]>=me.mature*0.666) stage=3; + else if (tile[1]>=me.mature*0.333) stage=2; + else stage=1; + var icon=[stage,me.icon]; + var str='<div style="padding:8px 4px;min-width:350px;">'+ + '<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>'+ + '<div class="name">'+me.name+'</div><div><small>This plant is growing here.</small></div>'+ + '<div class="line"></div>'+ + '<div style="text-align:center;">'+ + '<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%)">'+ + '<div class="gardenGrowthIndicator" style="left:'+Math.floor((tile[1]/100)*256)+'px;"></div>'+ + '<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>'+ + '<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>'+ + '<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>'+ + '<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>'+ + '</div><br>'+ + '<b>Stage :</b> '+['bud','sprout','bloom','mature'][stage-1]+'<br>'+ + '<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>'+ + '<br><small>'+( + stage<4?( + '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')+')' + ):( + !me.immortal?( + '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')+')' + ): + 'Does not decay' + ) + )+'</small>'+ + //'<small><br>'+M.plotBoost[y][x]+'</small>'+ + (M.plotBoost[y][x]!=[1,1,1]?('<small>'+ + (M.plotBoost[y][x][0]!=1?'<br>Aging multiplier : '+Beautify(M.plotBoost[y][x][0]*100)+'%':'')+ + (M.plotBoost[y][x][1]!=1?'<br>Effect multiplier : '+Beautify(M.plotBoost[y][x][1]*100)+'%':'')+ + (M.plotBoost[y][x][2]!=1?'<br>Weeds/fungus repellent : '+Beautify(100-M.plotBoost[y][x][2]*100)+'%':'')+ + '</small>' + ):'')+ + '</div>'+ + '<div class="line"></div>'+ + //'<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>'+ + '<div style="text-align:center;">Click to '+(stage==4?'harvest':'unearth')+'.</div>'+ + '<div class="line"></div>'+ + M.getPlantDesc(me)+ + '</div>'; + return str; + } + }; + } + + M.refillTooltip=function(){ + return '<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>.'+ + (Game.canRefillLump()?'<br><small>(can be done once every '+Game.sayTime(Game.getLumpRefillMax(),-1)+')</small>':('<br><small class="red">(usable again in '+Game.sayTime(Game.getLumpRefillRemaining()+Game.fps,-1)+')</small>'))+ + '</div>'; + }; + + M.buildPanel=function() + { + if (!l('gardenSeeds')) return false; + var str=''; + for (var i in M.plants) + { + var me=M.plants[i]; + var icon=[0,me.icon]; + str+='<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')+'>'; + str+='<div id="gardenSeedIcon-'+me.id+'" class="gardenSeedIcon shadowFilter" style="background-position:'+(-icon[0]*48)+'px '+(-icon[1]*48)+'px;"></div>'; + str+='</div>'; + } + l('gardenSeeds').innerHTML=str; + + for (var i in M.plants) + { + var me=M.plants[i]; + me.l=l('gardenSeed-'+me.id); + AddEvent(me.l,'click',function(me){return function() + { + if (/* !M.freeze && */Game.keys[16] && Game.keys[17])//shift & ctrl + { + //harvest all mature of type + M.harvestAll(me,1); + return false; + } + if (!me.plantable && !Game.sesame) return false; + if (M.seedSelected==me.id){M.seedSelected=-1;} + else {M.seedSelected=me.id;PlaySound('snd/toneTick.mp3');} + for (var i in M.plants) + { + var it=M.plants[i]; + if (it.id==M.seedSelected){it.l.classList.add('on');} + else {it.l.classList.remove('on');} + } + }}(me)); + AddEvent(me.l,'mouseover',M.hideCursor); + AddEvent(me.l,'mouseout',M.showCursor); + if (me.unlocked) me.l.classList.remove('locked'); + } + + var str=''; + for (var i in M.tools) + { + var me=M.tools[i]; + var icon=[me.icon,35]; + str+='<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')+'>'; + str+='<div id="gardenToolIcon-'+me.id+'" class="gardenSeedIcon shadowFilter" style="background-position:'+(-icon[0]*48)+'px '+(-icon[1]*48)+'px;"></div>'; + str+='</div>'; + } + l('gardenTools').innerHTML=str; + + for (var i in M.tools) + { + var me=M.tools[i]; + AddEvent(l('gardenTool-'+me.id),'click',me.func); + AddEvent(l('gardenTool-'+me.id),'mouseover',M.hideCursor); + AddEvent(l('gardenTool-'+me.id),'mouseout',M.showCursor); + } + + var str=''; + for (var i in M.soils) + { + var me=M.soils[i]; + var icon=[me.icon,34]; + str+='<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')+'>'; + str+='<div id="gardenSoilIcon-'+me.id+'" class="gardenSeedIcon shadowFilter" style="background-position:'+(-icon[0]*48)+'px '+(-icon[1]*48)+'px;"></div>'; + str+='</div>'; + } + l('gardenSoils').innerHTML=str; + + for (var i in M.soils) + { + var me=M.soils[i]; + AddEvent(l('gardenSoil-'+me.id),'click',function(me){return function(){ + if (M.freeze || M.soil==me.id || M.nextSoil>Date.now() || M.parent.amount<me.req){return false;} + PlaySound('snd/toneTick.mp3'); + M.nextSoil=Date.now()+(Game.Has('Turbo-charged soil')?1:(1000*60*10)); + M.toCompute=true;M.soil=me.id;M.computeStepT(); + for (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');}} + }}(me)); + AddEvent(l('gardenSoil-'+me.id),'mouseover',M.hideCursor); + AddEvent(l('gardenSoil-'+me.id),'mouseout',M.showCursor); + } + + M.cursorL=l('gardenCursor'); + } + M.buildPlot=function() + { + M.toRebuild=false; + if (!l('gardenPlot')) return false; + if (!l('gardenTile-0-0')) + { + var str=''; + for (var y=0;y<6;y++) + { + for (var x=0;x<6;x++) + { + str+='<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')+'>'; + str+='<div id="gardenTileIcon-'+x+'-'+y+'" class="gardenTileIcon" style="display:none;"></div>'; + str+='</div>'; + } + } + l('gardenPlot').innerHTML=str; + + for (var y=0;y<6;y++) + { + for (var x=0;x<6;x++) + { + AddEvent(l('gardenTile-'+x+'-'+y),'click',function(x,y){return function() + { + M.clickTile(x,y); + }}(x,y)); + } + } + } + var plants=0; + for (var y=0;y<6;y++) + { + for (var x=0;x<6;x++) + { + var tile=M.plot[y][x]; + var tileL=l('gardenTile-'+x+'-'+y); + var iconL=l('gardenTileIcon-'+x+'-'+y); + var me=0; + if (tile[0]>0) + { + plants++; + me=M.plantsById[tile[0]-1]; + var stage=0; + if (tile[1]>=me.mature) stage=4; + else if (tile[1]>=me.mature*0.666) stage=3; + else if (tile[1]>=me.mature*0.333) stage=2; + else stage=1; + var dying=((tile[1]+Math.ceil(me.ageTick+me.ageTickR))>=100?1:0); + var icon=[stage,me.icon]; + iconL.style.opacity=(dying?0.5:1); + iconL.style.backgroundPosition=(-icon[0]*48)+'px '+(-icon[1]*48)+'px'; + iconL.style.display='block'; + //iconL.innerHTML=M.plotBoost[y][x]; + } + else iconL.style.display='none'; + if (M.isTileUnlocked(x,y)) tileL.style.display='block'; + else tileL.style.display='none'; + } + } + if (plants>=6*6) Game.Win('In the garden of Eden (baby)'); + } + + M.clickTile=function(x,y) + { + //if (M.freeze) return false; + var outcome=M.useTool(M.seedSelected,x,y); + M.toCompute=true; + if (outcome && !Game.keys[16])//shift + { + M.seedSelected=-1; + for (var i in M.plants) + { + var it=M.plants[i]; + if (it.id==M.seedSelected) {l('gardenSeed-'+it.id).classList.add('on');} + else {l('gardenSeed-'+it.id).classList.remove('on');} + } + } + //PlaySound('snd/tick.mp3'); + } + + M.useTool=function(what,x,y) + { + var harvested=M.harvest(x,y,1); + if (harvested) + { + Game.SparkleAt(Game.mouseX,Game.mouseY); + PlaySound('snd/harvest'+choose(['1','2','3'])+'.mp3',1,0.2); + } + else + { + if (what>=0 && M.canPlant(M.plantsById[what])) + { + M.plot[y][x]=[what+1,0]; + M.toRebuild=true; + Game.Spend(M.getCost(M.plantsById[what])); + Game.SparkleAt(Game.mouseX,Game.mouseY); + PlaySound('snd/tillb'+choose(['1','2','3'])+'.mp3',1,0.2); + return true; + } + } + return false; + } + + M.getTile=function(x,y) + { + if (x<0 || x>5 || y<0 || y>5 || !M.isTileUnlocked(x,y)) return [0,0]; + return M.plot[y][x]; + } + + M.plotLimits=[ + [2,2,4,4], + [2,2,5,4], + [2,2,5,5], + [1,2,5,5], + [1,1,5,5], + [1,1,6,5], + [1,1,6,6], + [0,1,6,6], + [0,0,6,6], + ]; + M.isTileUnlocked=function(x,y) + { + var level=M.parent.level; + level=Math.max(1,Math.min(M.plotLimits.length,level))-1; + var limits=M.plotLimits[level]; + if (x>=limits[0] && x<limits[2] && y>=limits[1] && y<limits[3]) return true; else return false; + } + + M.computeStepT=function() + { + if (Game.Has('Turbo-charged soil')) M.stepT=1; + else M.stepT=M.soilsById[M.soil].tick*60; + } + + M.convertTimes=0; + M.askConvert=function() + { + if (M.plantsUnlockedN<M.plantsN) return false; + Game.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']); + } + M.convert=function() + { + if (M.plantsUnlockedN<M.plantsN) return false; + M.harvestAll(); + for (var i in M.plants){M.lockSeed(M.plants[i]);} + M.unlockSeed(M.plants['bakerWheat']); + + Game.gainLumps(10); + Game.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); + + Game.Win('Seedless to nay'); + M.convertTimes++; + M.computeMatures(); + PlaySound('snd/spellFail.mp3',0.75); + } + + M.harvestAll=function(type,mature,mortal) + { + var harvested=0; + for (var i=0;i<2;i++)//we do it twice to take care of whatever spawns on kill + { + for (var y=0;y<6;y++) + { + for (var x=0;x<6;x++) + { + if (M.plot[y][x][0]>=1) + { + var doIt=true; + var tile=M.plot[y][x]; + var me=M.plantsById[tile[0]-1]; + if (type && me!=type) doIt=false; + if (mortal && me.immortal) doIt=false; + if (mature && tile[1]<me.mature) doIt=false; + + if (doIt) harvested+=M.harvest(x,y)?1:0; + } + } + } + } + if (harvested>0) setTimeout(function(){PlaySound('snd/harvest1.mp3',1,0.2);},50); + if (harvested>2) setTimeout(function(){PlaySound('snd/harvest2.mp3',1,0.2);},150); + if (harvested>6) setTimeout(function(){PlaySound('snd/harvest3.mp3',1,0.2);},250); + } + M.harvest=function(x,y,manual) + { + var tile=M.plot[y][x]; + if (tile[0]>=1) + { + M.toCompute=true; + var me=M.plantsById[tile[0]-1]; + var age=tile[1]; + if (me.onHarvest) me.onHarvest(x,y,age); + if (tile[1]>=me.mature) + { + if (M.unlockSeed(me)) Game.Popup('('+me.name+')<br>Unlocked '+me.name+' seed.',Game.mouseX,Game.mouseY); + M.harvests++; + M.harvestsTotal++; + if (M.harvestsTotal>=100) Game.Win('Botany enthusiast'); + if (M.harvestsTotal>=1000) Game.Win('Green, aching thumb'); + } + + M.plot[y][x]=[0,0]; + if (me.onKill) me.onKill(x,y,age); + M.toRebuild=true; + return true; + } + return false; + } + + M.unlockSeed=function(me) + { + if (me.unlocked) return false; + me.unlocked=1; + if (me.l) me.l.classList.remove('locked'); + M.getUnlockedN(); + return true; + } + M.lockSeed=function(me) + { + if (me.locked) return false; + me.unlocked=0; + if (me.l) me.l.classList.add('locked'); + M.getUnlockedN(); + return true; + } + + var str=''; + str+='<style>'+ + '#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;}'+ + '#gardenContent{position:relative;box-sizing:border-box;padding:4px 24px;height:'+(6*M.tileSize+16+48+48)+'px;}'+ + '.gardenFrozen{box-shadow:0px 0px 16px rgba(255,255,255,1) inset,0px 0px 48px 24px rgba(200,255,225,0.5) inset;}'+ + '#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);}'+ + '#gardenSeeds{}'+ + '#gardenField{text-align:center;position:absolute;right:0px;top:0px;bottom:0px;overflow-x:auto;overflow:hidden;}'+//width:65%; + '#gardenPlot{position:relative;margin:8px auto;}'+ + '.gardenTile{cursor:pointer;width:'+M.tileSize+'px;height:'+M.tileSize+'px;position:absolute;}'+ + //'.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;}'+ + //'.gardenTile:hover:before{margin:2px;animation:wobble 0.5s;}'+ + '.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);}'+ + '.gardenTile:nth-child(4n+1):before{background-position:40px 0px;}'+ + '.gardenTile:nth-child(4n+2):before{background-position:80px 0px;}'+ + '.gardenTile:nth-child(4n+3):before{background-position:120px 0px;}'+ + '.gardenTile:hover:before{opacity:1;animation:wobble 0.5s;}'+ + '.noFancy .gardenTile:hover:before{opacity:1;animation:none;}'+ + '.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+');}'+ + '.gardenTile:hover .gardenTileIcon{animation:pucker 0.3s;}'+ + '.noFancy .gardenTile:hover .gardenTileIcon{animation:none;}'+ + '#gardenDrag{pointer-events:none;position:absolute;left:0px;top:0px;right:0px;bottom:0px;overflow:hidden;z-index:1000000001;}'+ + '#gardenCursor{transition:transform 0.1s;display:none;pointer-events:none;width:48px;height:48px;position:absolute;background:url(img/gardenPlants.png?v='+Game.version+');}'+ + '.gardenSeed{cursor:pointer;display:inline-block;width:40px;height:40px;position:relative;}'+ + '.gardenSeed.locked{display:none;}'+ + '.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+');}'+ + '.gardenSeed:hover .gardenSeedIcon{animation:bounce 0.8s;z-index:1000000001;}'+ + '.gardenSeed:active .gardenSeedIcon{animation:pucker 0.2s;}'+ + '.noFancy .gardenSeed:hover .gardenSeedIcon,.noFancy .gardenSeed:active .gardenSeedIcon{animation:none;}'+ + '.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+');}'+ + '.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);}'+ + + '.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;}'+ + '.noFancy .gardenGrowthIndicator{background:#fff;border:1px solid #000;margin-top:-1px;margin-left:-1px;}'+ + + '#gardenSoils{}'+ + '.gardenSoil.disabled{filter:brightness(10%);}'+ + '.noFilters .gardenSoil.disabled{opacity:0.2;}'+ + + '#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;}'+ + + '</style>'; + str+='<div id="gardenBG"></div>'; + str+='<div id="gardenContent">'; + str+='<div id="gardenDrag"><div id="gardenCursor" class="shadowFilter"></div></div>'; + + str+='<div id="gardenPanel" class="framed">'; + str+='<div class="title gardenPanelLabel">Tools</div><div class="line"></div>'; + str+='<div id="gardenTools"></div>'; + str+='<div id="gardenSeedsUnlocked" class="title gardenPanelLabel">Seeds</div><div class="line"></div>'; + str+='<div id="gardenSeeds"></div>'; + str+='</div>'; + str+='<div id="gardenField">'; + str+='<div style="pointer-events:none;opacity:0.75;position:absolute;left:0px;right:0px;top:8px;" id="gardenPlotSize"></div>'; + str+='<div id="gardenPlot" class="shadowFilter" style="width:'+(6*M.tileSize)+'px;height:'+(6*M.tileSize)+'px;"></div>'; + str+='<div style="margin-top:0px;" id="gardenSoils"></div>'; + str+='<div id="gardenInfo">'; + str+='<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>'; + str+='<div id="gardenNextTick">Initializing...</div>'; + str+='<div id="gardenStats"></div>'; + str+='</div>'; + str+='</div>'; + + str+='</div>'; + div.innerHTML=str; + M.buildPlot(); + M.buildPanel(); + + M.lumpRefill=l('gardenLumpRefill'); + AddEvent(M.lumpRefill,'click',function(){ + Game.refillLump(1,function(){ + M.loopsMult=3; + M.nextSoil=Date.now(); + //M.nextFreeze=Date.now(); + M.nextStep=Date.now(); + PlaySound('snd/pop'+Math.floor(Math.random()*3+1)+'.mp3',0.75); + }); + }); + AddEvent(l('gardenSeedsUnlocked'),'click',function() + { + if (Game.sesame) + { + if (Game.keys[16] && Game.keys[17])//ctrl & shift, fill garden with random plants + { + for (var y=0;y<6;y++) + { + for (var x=0;x<6;x++) + { + M.plot[y][x]=[choose(M.plantsById).id+1,Math.floor(Math.random()*100)]; + } + } + M.toRebuild=true; + M.toCompute=true; + } + else//unlock/lock all seeds + { + var locked=0; + for (var i in M.plants) + { + if (!M.plants[i].unlocked) locked++; + } + if (locked>0){for (var i in M.plants){M.unlockSeed(M.plants[i]);}} + else{for (var i in M.plants){M.lockSeed(M.plants[i]);}} + M.unlockSeed(M.plants['bakerWheat']); + } + } + }); + + M.reset(); + + //M.parent.switchMinigame(1); + } + M.onResize=function() + { + var width=l('gardenContent').offsetWidth; + var panelW=Math.min(Math.max(width*0.40,320),width-6*M.tileSize)-8; + var fieldW=Math.max(Math.min(width*0.60,width-panelW),6*M.tileSize)-8; + l('gardenField').style.width=fieldW+'px'; + l('gardenPanel').style.width=panelW+'px'; + } + M.onLevel=function(level) + { + M.buildPlot(); + } + M.onRuinTheFun=function() + { + for (var i in M.plants){M.unlockSeed(M.plants[i]);} + } + M.save=function() + { + //output cannot use ",", ";" or "|" + var str=''+ + parseFloat(M.nextStep)+':'+ + parseInt(M.soil)+':'+ + parseFloat(M.nextSoil)+':'+ + parseInt(M.freeze)+':'+ + parseInt(M.harvests)+':'+ + parseInt(M.harvestsTotal)+':'+ + parseInt(M.parent.onMinigame?'1':'0')+':'+ + parseFloat(M.convertTimes)+':'+ + parseFloat(M.nextFreeze)+':'+ + ' '; + for (var i in M.plants) + { + str+=''+(M.plants[i].unlocked?'1':'0'); + } + str+=' '; + for (var y=0;y<6;y++) + { + for (var x=0;x<6;x++) + { + str+=parseInt(M.plot[y][x][0])+':'+parseInt(M.plot[y][x][1])+':'; + } + } + return str; + } + M.load=function(str) + { + //interpret str; called after .init + //note : not actually called in the Game's load; see "minigameSave" in main.js + if (!str) return false; + var i=0; + var spl=str.split(' '); + var spl2=spl[i++].split(':'); + var i2=0; + M.nextStep=parseFloat(spl2[i2++]||M.nextStep); + M.soil=parseInt(spl2[i2++]||M.soil); + M.nextSoil=parseFloat(spl2[i2++]||M.nextSoil); + M.freeze=parseInt(spl2[i2++]||M.freeze)?1:0; + M.harvests=parseInt(spl2[i2++]||0); + M.harvestsTotal=parseInt(spl2[i2++]||0); + var on=parseInt(spl2[i2++]||0);if (on && Game.ascensionMode!=1) M.parent.switchMinigame(1); + M.convertTimes=parseFloat(spl2[i2++]||M.convertTimes); + M.nextFreeze=parseFloat(spl2[i2++]||M.nextFreeze); + var seeds=spl[i++]||''; + if (seeds) + { + var n=0; + for (var ii in M.plants) + { + if (seeds.charAt(n)=='1') M.plants[ii].unlocked=1; else M.plants[ii].unlocked=0; + n++; + } + } + M.plants['bakerWheat'].unlocked=1; + + var plot=spl[i++]||0; + if (plot) + { + plot=plot.split(':'); + var n=0; + for (var y=0;y<6;y++) + { + for (var x=0;x<6;x++) + { + M.plot[y][x]=[parseInt(plot[n]),parseInt(plot[n+1])]; + n+=2; + } + } + } + + M.getUnlockedN(); + M.computeStepT(); + + M.buildPlot(); + M.buildPanel(); + + M.computeBoostPlot(); + M.toCompute=true; + } + M.reset=function(hard) + { + M.soil=0; + if (M.seedSelected>-1) M.plantsById[M.seedSelected].l.classList.remove('on'); + M.seedSelected=-1; + + M.nextStep=Date.now(); + M.nextSoil=Date.now(); + M.nextFreeze=Date.now(); + for (var y=0;y<6;y++) + { + for (var x=0;x<6;x++) + { + M.plot[y][x]=[0,0]; + } + } + + M.harvests=0; + if (hard) + { + M.convertTimes=0; + M.harvestsTotal=0; + for (var i in M.plants) + { + M.plants[i].unlocked=0; + } + } + + M.plants['bakerWheat'].unlocked=1; + + M.loopsMult=1; + + M.getUnlockedN(); + M.computeStepT(); + + M.computeMatures(); + + M.buildPlot(); + M.buildPanel(); + M.computeEffs(); + M.toCompute=true; + + setTimeout(function(M){return function(){M.onResize();}}(M),10); + } + M.logic=function() + { + //run each frame + var now=Date.now(); + + if (!M.freeze) + { + M.nextStep=Math.min(M.nextStep,now+(M.stepT)*1000); + if (now>=M.nextStep) + { + M.computeStepT(); + M.nextStep=now+M.stepT*1000; + + M.computeBoostPlot(); + M.computeMatures(); + + var weedMult=M.soilsById[M.soil].weedMult; + + var loops=1; + if (M.soilsById[M.soil].key=='woodchips') loops=3; + loops*=M.loopsMult; + M.loopsMult=1; + + for (var y=0;y<6;y++) + { + for (var x=0;x<6;x++) + { + if (M.isTileUnlocked(x,y)) + { + var tile=M.plot[y][x]; + var me=M.plantsById[tile[0]-1]; + if (tile[0]>0) + { + //age + tile[1]+=randomFloor((me.ageTick+me.ageTickR*Math.random())*M.plotBoost[y][x][0]); + tile[1]=Math.max(tile[1],0); + if (me.immortal) tile[1]=Math.min(me.mature+1,tile[1]); + else if (tile[1]>=100) + { + //die of old age + M.plot[y][x]=[0,0]; + if (me.onDie) me.onDie(x,y); + if (M.soilsById[M.soil].key=='pebbles' && Math.random()<0.35) + { + if (M.unlockSeed(me)) Game.Popup('Unlocked '+me.name+' seed.',Game.mouseX,Game.mouseY); + } + } + else if (!me.noContam) + { + //other plant contamination + //only occurs in cardinal directions + //immortal plants and plants with noContam are immune + + var list=[]; + for (var i in M.plantContam) + { + if (Math.random()<M.plantContam[i] && (!M.plants[i].weed || Math.random()<weedMult)) list.push(i); + } + var contam=choose(list); + + if (contam && me.key!=contam) + { + if ((!M.plants[contam].weed && !M.plants[contam].fungus) || Math.random()<M.plotBoost[y][x][2]) + { + var any=0; + var neighs={};//all surrounding plants + var neighsM={};//all surrounding mature plants + for (var i in M.plants){neighs[i]=0;} + for (var i in M.plants){neighsM[i]=0;} + var 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]++;}} + var 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]++;}} + var 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]++;}} + var 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]++;}} + + if (neighsM[contam]>=1) M.plot[y][x]=[M.plants[contam].id+1,0]; + } + } + } + } + else + { + //plant spreading and mutation + //happens on all 8 tiles around this one + for (var loop=0;loop<loops;loop++) + { + var any=0; + var neighs={};//all surrounding plants + var neighsM={};//all surrounding mature plants + for (var i in M.plants){neighs[i]=0;} + for (var i in M.plants){neighsM[i]=0;} + var 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]++;}} + var 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]++;}} + var 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]++;}} + var 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]++;}} + var 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]++;}} + var 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]++;}} + var 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]++;}} + var 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]++;}} + if (any>0) + { + var muts=M.getMuts(neighs,neighsM); + + var list=[]; + for (var ii=0;ii<muts.length;ii++) + { + if (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]); + } + if (list.length>0) M.plot[y][x]=[M.plants[choose(list)].id+1,0]; + } + else if (loop==0) + { + //weeds in empty tiles (no other plants must be nearby) + var chance=0.002*weedMult*M.plotBoost[y][x][2]; + if (Math.random()<chance) M.plot[y][x]=[M.plants['meddleweed'].id+1,0]; + } + } + } + } + } + } + M.toRebuild=true; + M.toCompute=true; + } + } + if (M.toRebuild) M.buildPlot(); + if (M.toCompute) M.computeEffs(); + + if (Game.keys[27])//esc + { + if (M.seedSelected>-1) M.plantsById[M.seedSelected].l.classList.remove('on'); + M.seedSelected=-1; + } + } + M.draw=function() + { + //run each draw frame + + if (M.cursorL) + { + if (!M.cursor || M.seedSelected<0) + { + M.cursorL.style.display='none'; + } + else + { + var box=l('gardenDrag').getBoundingClientRect(); + var x=Game.mouseX-box.left-24; + var y=Game.mouseY-box.top; + var seed=M.plantsById[M.seedSelected]; + var icon=[0,seed.icon]; + M.cursorL.style.transform='translate('+(x)+'px,'+(y)+'px)'; + M.cursorL.style.backgroundPosition=(-icon[0]*48)+'px '+(-icon[1]*48)+'px'; + M.cursorL.style.display='block'; + } + } + if (Game.drawT%10==0) + { + M.lumpRefill.style.display='block'; + if (M.freeze) l('gardenNextTick').innerHTML='Garden is frozen. Unfreeze to resume.'; + else l('gardenNextTick').innerHTML='Next tick in '+Game.sayTime((M.nextStep-Date.now())/1000*30+30,-1)+''; + l('gardenStats').innerHTML='Mature plants harvested : '+Beautify(M.harvests)+' (total : '+Beautify(M.harvestsTotal)+')'; + if (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>'; + else l('gardenPlotSize').innerHTML=''; + l('gardenSeedsUnlocked').innerHTML='Seeds<small> ('+M.plantsUnlockedN+'/'+M.plantsN+')</small>'; + for (var i in M.soils) + { + var me=M.soils[i]; + if (M.parent.amount<me.req) l('gardenSoil-'+me.id).classList.add('disabled'); + else l('gardenSoil-'+me.id).classList.remove('disabled'); + } + } + } + M.init(l('rowSpecial'+M.parent.id)); +} +var M=0;
\ No newline at end of file |