cookieclicker/minigameGrimoire.js

515 lines
22 KiB
JavaScript

var M={};
M.parent=Game.Objects['Wizard tower'];
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
M.spells={
'conjure baked goods':{
name:loc("Conjure Baked Goods"),
desc:loc("Summon half an hour worth of your CpS, capped at %1% of your cookies owned.",15),
failDesc:loc("Trigger a %1-minute clot and lose %1 minutes of CpS.",15),
icon:[21,11],
costMin:2,
costPercent:0.4,
win:function()
{
var val=Math.max(7,Math.min(Game.cookies*0.15,Game.cookiesPs*60*30));
Game.Earn(val);
Game.Notify(loc("Conjure Baked Goods")+(EN?'!':''),loc("You magic <b>%1</b> out of thin air.",loc("%1 cookie",LBeautify(val))),[21,11],6);
Game.Popup('<div style="font-size:80%;">'+loc("+%1!",loc("%1 cookie",LBeautify(val)))+'</div>',Game.mouseX,Game.mouseY);
},
fail:function()
{
var buff=Game.gainBuff('clot',60*15,0.5);
var val=Math.min(Game.cookies*0.15,Game.cookiesPs*60*15)+13;
val=Math.min(Game.cookies,val);
Game.Spend(val);
Game.Notify(buff.name,buff.desc,buff.icon,6);
Game.Popup('<div style="font-size:80%;">'+loc("Backfire!")+'<br>'+loc("Summoning failed!")+' '+loc("Lost %1!",loc("%1 cookie",LBeautify(val)))+'</div>',Game.mouseX,Game.mouseY);
},
},
'hand of fate':{
name:loc("Force the Hand of Fate"),
desc:loc("Summon a random golden cookie. Each existing golden cookie makes this spell +%1% more likely to backfire.",15),
failDesc:loc("Summon an unlucky wrath cookie."),
icon:[22,11],
costMin:10,
costPercent:0.6,
failFunc:function(fail)
{
return fail+0.15*Game.shimmerTypes['golden'].n;
},
win:function()
{
var newShimmer=new Game.shimmer('golden',{noWrath:true});
var choices=[];
choices.push('frenzy','multiply cookies');
if (!Game.hasBuff('Dragonflight')) choices.push('click frenzy');
if (Math.random()<0.1) choices.push('cookie storm','cookie storm','blab');
if (Game.BuildingsOwned>=10 && Math.random()<0.25) choices.push('building special');
//if (Math.random()<0.2) choices.push('clot','cursed finger','ruin cookies');
if (Math.random()<0.15) choices=['cookie storm drop'];
if (Math.random()<0.0001) choices.push('free sugar lump');
newShimmer.force=choose(choices);
if (newShimmer.force=='cookie storm drop')
{
newShimmer.sizeMult=Math.random()*0.75+0.25;
}
Game.Popup('<div style="font-size:80%;">'+loc("Promising fate!")+'</div>',Game.mouseX,Game.mouseY);
},
fail:function()
{
var newShimmer=new Game.shimmer('golden',{wrath:true});
var choices=[];
choices.push('clot','ruin cookies');
if (Math.random()<0.1) choices.push('cursed finger','blood frenzy');
if (Math.random()<0.003) choices.push('free sugar lump');
if (Math.random()<0.1) choices=['blab'];
newShimmer.force=choose(choices);
Game.Popup('<div style="font-size:80%;">'+loc("Backfire!")+'<br>'+loc("Sinister fate!")+'</div>',Game.mouseX,Game.mouseY);
},
},
'stretch time':{
name:loc("Stretch Time"),
desc:loc("All active buffs gain %1% more time (up to %2 more minutes).",[10,5]),
failDesc:loc("All active buffs are shortened by %1% (up to %2 minutes shorter).",[20,10]),
icon:[23,11],
costMin:8,
costPercent:0.2,
win:function()
{
var changed=0;
for (var i in Game.buffs)
{
var me=Game.buffs[i];
var gain=Math.min(Game.fps*60*5,me.maxTime*0.1);
me.maxTime+=gain;
me.time+=gain;
changed++;
}
if (changed==0){Game.Popup('<div style="font-size:80%;">'+loc("No buffs to alter!")+'</div>',Game.mouseX,Game.mouseY);return -1;}
Game.Popup('<div style="font-size:80%;">'+loc("Zap! Buffs lengthened.")+'</div>',Game.mouseX,Game.mouseY);
},
fail:function()
{
var changed=0;
for (var i in Game.buffs)
{
var me=Game.buffs[i];
var loss=Math.min(Game.fps*60*10,me.time*0.2);
me.time-=loss;
me.time=Math.max(me.time,0);
changed++;
}
if (changed==0){Game.Popup('<div style="font-size:80%;">'+loc("No buffs to alter!")+'</div>',Game.mouseX,Game.mouseY);return -1;}
Game.Popup('<div style="font-size:80%;">'+loc("Backfire!")+'<br>'+loc("Fizz! Buffs shortened.")+'</div>',Game.mouseX,Game.mouseY);
},
},
'spontaneous edifice':{
name:loc("Spontaneous Edifice"),
desc:loc("The spell picks a random building you could afford if you had twice your current cookies, and gives it to you for free. The building selected must be under %1, and cannot be your most-built one (unless it is your only one).",400),
failDesc:loc("Lose a random building."),
icon:[24,11],
costMin:20,
costPercent:0.75,
win:function()
{
var buildings=[];
var max=0;
var n=0;
for (var i in Game.Objects)
{
if (Game.Objects[i].amount>max) max=Game.Objects[i].amount;
if (Game.Objects[i].amount>0) n++;
}
for (var i in Game.Objects)
{if ((Game.Objects[i].amount<max || n==1) && Game.Objects[i].getPrice()<=Game.cookies*2 && Game.Objects[i].amount<400) buildings.push(Game.Objects[i]);}
if (buildings.length==0){Game.Popup('<div style="font-size:80%;">'+loc("No buildings to improve!")+'</div>',Game.mouseX,Game.mouseY);return -1;}
var building=choose(buildings);
building.buyFree(1);
Game.Popup('<div style="font-size:80%;">'+loc("A new %1<br>bursts out of the ground.",building.single)+'</div>',Game.mouseX,Game.mouseY);
},
fail:function()
{
if (Game.BuildingsOwned==0){Game.Popup('<div style="font-size:80%;">'+loc("Backfired, but no buildings to destroy!")+'</div>',Game.mouseX,Game.mouseY);return -1;}
var buildings=[];
for (var i in Game.Objects)
{if (Game.Objects[i].amount>0) buildings.push(Game.Objects[i]);}
var building=choose(buildings);
building.sacrifice(1);
Game.Popup('<div style="font-size:80%;">'+loc("Backfire!")+'<br>'+loc("One of your %1<br>disappears in a puff of smoke.",building.plural)+'</div>',Game.mouseX,Game.mouseY);
},
},
'haggler\'s charm':{
name:loc("Haggler's Charm"),
desc:loc("Upgrades are %1% cheaper for 1 minute.",2),
failDesc:loc("Upgrades are %1% more expensive for an hour.",2)+(EN?'<q>What\'s that spell? Loadsamoney!</q>':''),
icon:[25,11],
costMin:10,
costPercent:0.1,
win:function()
{
Game.killBuff('Haggler\'s misery');
var buff=Game.gainBuff('haggler luck',60,2);
Game.Popup('<div style="font-size:80%;">'+loc("Upgrades are cheaper!")+'</div>',Game.mouseX,Game.mouseY);
},
fail:function()
{
Game.killBuff('Haggler\'s luck');
var buff=Game.gainBuff('haggler misery',60*60,2);
Game.Popup('<div style="font-size:80%;">'+loc("Backfire!")+'<br>'+loc("Upgrades are pricier!")+'</div>',Game.mouseX,Game.mouseY);
},
},
'summon crafty pixies':{
name:loc("Summon Crafty Pixies"),
desc:loc("Buildings are %1% cheaper for 1 minute.",2),
failDesc:loc("Buildings are %1% more expensive for an hour.",2),
icon:[26,11],
costMin:10,
costPercent:0.2,
win:function()
{
Game.killBuff('Nasty goblins');
var buff=Game.gainBuff('pixie luck',60,2);
Game.Popup('<div style="font-size:80%;">'+loc("Crafty pixies")+'<br>'+loc("Buildings are cheaper!")+'</div>',Game.mouseX,Game.mouseY);
},
fail:function()
{
Game.killBuff('Crafty pixies');
var buff=Game.gainBuff('pixie misery',60*60,2);
Game.Popup('<div style="font-size:80%;">'+loc("Backfire!")+'<br>'+loc("Nasty goblins")+'<br>'+loc("Buildings are pricier!")+'</div>',Game.mouseX,Game.mouseY);
},
},
'gambler\'s fever dream':{
name:loc("Gambler's Fever Dream"),
desc:loc("Cast a random spell at half the magic cost, with twice the chance of backfiring."),
icon:[27,11],
costMin:3,
costPercent:0.05,
win:function()
{
var spells=[];
var selfCost=M.getSpellCost(M.spells['gambler\'s fever dream']);
for (var i in M.spells)
{if (i!='gambler\'s fever dream' && (M.magic-selfCost)>=M.getSpellCost(M.spells[i])*0.5) spells.push(M.spells[i]);}
if (spells.length==0){Game.Popup('<div style="font-size:80%;">'+loc("No eligible spells!")+'</div>',Game.mouseX,Game.mouseY);return -1;}
var spell=choose(spells);
var cost=M.getSpellCost(spell)*0.5;
setTimeout(function(spell,cost,seed){return function(){
if (Game.seed!=seed) return false;
var out=M.castSpell(spell,{cost:cost,failChanceMax:0.5,passthrough:true});
if (!out)
{
M.magic+=selfCost;
setTimeout(function(){
Game.Popup('<div style="font-size:80%;">'+loc("That's too bad!<br>Magic refunded.")+'</div>',Game.mouseX,Game.mouseY);
},1500);
}
}}(spell,cost,Game.seed),1000);
Game.Popup('<div style="font-size:80%;">'+loc("Casting %1<br>for %2 magic...",[spell.name,Beautify(cost)])+'</div>',Game.mouseX,Game.mouseY);
},
},
'resurrect abomination':{
name:loc("Resurrect Abomination"),
desc:loc("Instantly summon a wrinkler if conditions are fulfilled."),
failDesc:loc("Pop one of your wrinklers."),
icon:[28,11],
costMin:20,
costPercent:0.1,
win:function()
{
var out=Game.SpawnWrinkler();
if (!out){Game.Popup('<div style="font-size:80%;">'+loc("Unable to spawn a wrinkler!")+'</div>',Game.mouseX,Game.mouseY);return -1;}
Game.Popup('<div style="font-size:80%;">'+loc("Rise, my precious!")+'</div>',Game.mouseX,Game.mouseY);
},
fail:function()
{
var out=Game.PopRandomWrinkler();
if (!out){Game.Popup('<div style="font-size:80%;">'+loc("Backfire!")+'<br>'+loc("But no wrinkler was harmed.")+'</div>',Game.mouseX,Game.mouseY);return -1;}
Game.Popup('<div style="font-size:80%;">'+loc("Backfire!")+'<br>'+loc("So long, ugly...")+'</div>',Game.mouseX,Game.mouseY);
},
},
'diminish ineptitude':{
name:loc("Diminish Ineptitude"),
desc:loc("Spells backfire %1 times less for the next %2 minutes.",[10,5]),
failDesc:loc("Spells backfire %1 times more for the next %2 minutes.",[5,10]),
icon:[29,11],
costMin:5,
costPercent:0.2,
win:function()
{
Game.killBuff('Magic inept');
var buff=Game.gainBuff('magic adept',5*60,10);
Game.Popup('<div style="font-size:80%;">'+loc("Ineptitude diminished!")+'</div>',Game.mouseX,Game.mouseY);
},
fail:function()
{
Game.killBuff('Magic adept');
var buff=Game.gainBuff('magic inept',10*60,5);
Game.Popup('<div style="font-size:80%;">'+loc("Backfire!")+'<br>'+loc("Ineptitude magnified!")+'</div>',Game.mouseX,Game.mouseY);
},
},
};
M.spellsById=[];var n=0;
for (var i in M.spells){M.spells[i].id=n;M.spellsById[n]=M.spells[i];n++;}
M.computeMagicM=function()
{
var towers=Math.max(M.parent.amount,1);
var lvl=Math.max(M.parent.level,1);
M.magicM=Math.floor(4+Math.pow(towers,0.6)+Math.log((towers+(lvl-1)*10)/15+1)*15);
//old formula :
/*
M.magicM=8+Math.min(M.parent.amount,M.parent.level*5)+Math.ceil(M.parent.amount/10);
if (M.magicM>200)
{
//diminishing returns starting at 200, being 5% as fast by 400
var x=M.magicM;
var top=x-200;
top/=200;
var top2=top;
top*=(1-top/2);
if (top2>=1) top=0.5;
top=top*0.95+top2*0.05;
top*=200;
x=top+200;
M.magicM=x;
}
*/
M.magic=Math.min(M.magicM,M.magic);
}
M.getFailChance=function(spell)
{
var failChance=0.15;
if (Game.hasBuff('Magic adept')) failChance*=0.1;
if (Game.hasBuff('Magic inept')) failChance*=5;
failChance*=1+0.1*Game.auraMult('Supreme Intellect');
if (spell.failFunc) failChance=spell.failFunc(failChance);
return failChance;
}
M.castSpell=function(spell,obj)
{
var obj=obj||{};
var out=0;
var cost=0;
var fail=false;
if (typeof obj.cost!=='undefined') cost=obj.cost; else cost=M.getSpellCost(spell);
if (M.magic<cost) return false;
var failChance=M.getFailChance(spell);
if (typeof obj.failChanceSet!=='undefined') failChance=obj.failChanceSet;
if (typeof obj.failChanceAdd!=='undefined') failChance+=obj.failChanceAdd;
if (typeof obj.failChanceMult!=='undefined') failChance*=obj.failChanceMult;
if (typeof obj.failChanceMax!=='undefined') failChance=Math.max(failChance,obj.failChanceMax);
Math.seedrandom(Game.seed+'/'+M.spellsCastTotal);
if (!spell.fail || Math.random()<(1-failChance)) {out=spell.win();} else {fail=true;out=spell.fail();}
Math.seedrandom();
if (out!=-1)
{
if (!spell.passthrough && !obj.passthrough)
{
M.spellsCast++;
M.spellsCastTotal++;
if (M.spellsCastTotal>=9) Game.Win('Bibbidi-bobbidi-boo');
if (M.spellsCastTotal>=99) Game.Win('I\'m the wiz');
if (M.spellsCastTotal>=999) Game.Win('A wizard is you');
}
M.magic-=cost;
M.magic=Math.max(0,M.magic);
var rect=l('grimoireSpell'+spell.id).getBounds();
Game.SparkleAt((rect.left+rect.right)/2,(rect.top+rect.bottom)/2-24);
if (fail) PlaySound('snd/spellFail.mp3',0.75); else PlaySound('snd/spell.mp3',0.75);
return true;
}
PlaySound('snd/spellFail.mp3',0.75);
return false;
}
M.getSpellCost=function(spell)
{
var out=spell.costMin;
if (spell.costPercent) out+=M.magicM*spell.costPercent;
out*=1-0.1*Game.auraMult('Supreme Intellect');
return Math.floor(out);
}
M.getSpellCostBreakdown=function(spell)
{
var str='';
if (spell.costPercent) str+=loc("%1 magic",Beautify(spell.costMin))+' '+loc("+%1% of max magic",Beautify(Math.ceil(spell.costPercent*100)));
else str+=loc("%1 magic",Beautify(spell.costMin));
return str;
}
M.spellTooltip=function(id)
{
return function(){
var me=M.spellsById[id];
me.icon=me.icon||[28,12];
var cost=Beautify(M.getSpellCost(me));
var costBreakdown=M.getSpellCostBreakdown(me);
if (cost!=costBreakdown) costBreakdown=' <small>('+costBreakdown+')</small>'; else costBreakdown='';
var backfire=M.getFailChance(me);
var str='<div style="padding:8px 4px;min-width:350px;" id="tooltipSpell">'+
'<div class="icon" style="float:left;margin-left:-8px;margin-top:-8px;background-position:'+(-me.icon[0]*48)+'px '+(-me.icon[1]*48)+'px;"></div>'+
'<div class="name">'+me.name+'</div>'+
'<div>'+loc("Magic cost:")+' <b style="color:#'+(cost<=M.magic?'6f6':'f66')+';">'+cost+'</b>'+costBreakdown+'</div>'+
(me.fail?('<div><small>'+loc("Chance to backfire:")+' <b style="color:#f66">'+Math.ceil(100*backfire)+'%</b></small></div>'):'')+
'<div class="line"></div><div class="description"><b>'+loc("Effect:")+'</b> <span class="green">'+(me.descFunc?me.descFunc():me.desc)+'</span>'+(me.failDesc?('<div style="height:8px;"></div><b>'+loc("Backfire:")+'</b> <span class="red">'+me.failDesc+'</span>'):'')+'</div></div>';
return str;
};
}
M.dragonBoostTooltip=function()
{
return '<div style="width:280px;padding:8px;text-align:center;" id="tooltipDragonBoost"><b>'+loc("Supreme Intellect")+'</b><div class="line"></div>'+loc("Grimoire spells are %1% cheaper but fail %1% more.",10*Game.auraMult('Supreme Intellect'))+'</div>';
}
var str='';
str+='<style>'+
'#grimoireBG{background:url('+Game.resPath+'img/shadedBorders.png),url('+Game.resPath+'img/BGgrimoire.jpg);background-size:100% 100%,auto;position:absolute;left:0px;right:0px;top:0px;bottom:16px;}'+
'#grimoireContent{position:relative;box-sizing:border-box;padding:4px 24px;}'+
'#grimoireBar{max-width:95%;margin:4px auto;height:16px;}'+
'#grimoireBarFull{transform:scale(1,2);transform-origin:50% 0;height:50%;}'+
'#grimoireBarText{transform:scale(1,0.8);width:100%;position:absolute;left:0px;top:0px;text-align:center;color:#fff;text-shadow:-1px 1px #000,0px 0px 4px #000,0px 0px 6px #000;margin-top:2px;}'+
'#grimoireSpells{text-align:center;width:100%;padding:8px;box-sizing:border-box;}'+
'.grimoireIcon{pointer-events:none;margin:2px 6px 0px 6px;width:48px;height:48px;opacity:0.8;position:relative;}'+
'.grimoirePrice{pointer-events:none;}'+
'.grimoireSpell{box-shadow:4px 4px 4px #000;cursor:pointer;position:relative;color:#f33;opacity:0.8;text-shadow:0px 0px 4px #000,0px 0px 6px #000;font-weight:bold;font-size:12px;display:inline-block;width:60px;height:74px;background:url('+Game.resPath+'img/spellBG.png);}'+
'.grimoireSpell.ready{color:rgba(255,255,255,0.8);opacity:1;}'+
'.grimoireSpell.ready:hover{color:#fff;}'+
'.grimoireSpell:hover{box-shadow:6px 6px 6px 2px #000;z-index:1000000001;top:-1px;}'+
'.grimoireSpell:active{top:1px;}'+
'.grimoireSpell.ready .grimoireIcon{opacity:1;}'+
'.grimoireSpell:hover{background-position:0px -74px;} .grimoireSpell:active{background-position:0px 74px;}'+
'.grimoireSpell:nth-child(4n+1){background-position:-60px 0px;} .grimoireSpell:nth-child(4n+1):hover{background-position:-60px -74px;} .grimoireSpell:nth-child(4n+1):active{background-position:-60px 74px;}'+
'.grimoireSpell:nth-child(4n+2){background-position:-120px 0px;} .grimoireSpell:nth-child(4n+2):hover{background-position:-120px -74px;} .grimoireSpell:nth-child(4n+2):active{background-position:-120px 74px;}'+
'.grimoireSpell:nth-child(4n+3){background-position:-180px 0px;} .grimoireSpell:nth-child(4n+3):hover{background-position:-180px -74px;} .grimoireSpell:nth-child(4n+3):active{background-position:-180px 74px;}'+
'.grimoireSpell:hover .grimoireIcon{top:-1px;}'+
'.grimoireSpell.ready:hover .grimoireIcon{animation-name:bounce;animation-iteration-count:infinite;animation-duration:0.8s;}'+
'.noFancy .grimoireSpell.ready:hover .grimoireIcon{animation:none;}'+
'#grimoireInfo{text-align:center;font-size:11px;margin-top:12px;color:rgba(255,255,255,0.75);text-shadow:-1px 1px 0px #000;}'+
'</style>';
str+='<div id="grimoireBG"></div>';
str+='<div id="grimoireContent">';
str+='<div id="grimoireSpells">';//did you know adding class="shadowFilter" to this cancels the "z-index:1000000001" that displays the selected spell above the tooltip? stacking orders are silly https://philipwalton.com/articles/what-no-one-told-you-about-z-index/
for (var i in M.spells)
{
var me=M.spells[i];
var icon=me.icon||[28,12];
str+='<div class="grimoireSpell titleFont" id="grimoireSpell'+me.id+'" '+Game.getDynamicTooltip('Game.ObjectsById['+M.parent.id+'].minigame.spellTooltip('+me.id+')','this')+'><div class="usesIcon shadowFilter grimoireIcon" style="background-position:'+(-icon[0]*48)+'px '+(-icon[1]*48)+'px;"></div><div class="grimoirePrice" id="grimoirePrice'+me.id+'">-</div></div>';
}
str+='</div>';
var icon=[29,14];
str+='<div id="grimoireBar" class="smallFramed meterContainer" style="width:1px;"><div '+Game.getDynamicTooltip('Game.ObjectsById['+M.parent.id+'].minigame.refillTooltip','this')+' id="grimoireLumpRefill" class="usesIcon shadowFilter lumpRefill" style="left:-40px;top:-17px;background-position:'+(-icon[0]*48)+'px '+(-icon[1]*48)+'px;"></div><div id="grimoireBarFull" class="meter filling" style="width:1px;"></div><div id="grimoireBarText" class="titleFont"></div><div '+Game.getTooltip('<div style="padding:8px;width:300px;font-size:11px;text-align:center;">'+loc("This is your magic meter. Each spell costs magic to use.<div class=\"line\"></div>Your maximum amount of magic varies depending on your amount of <b>Wizard towers</b>, and their level.<div class=\"line\"></div>Magic refills over time. The lower your magic meter, the slower it refills.")+'</div>')+' style="position:absolute;left:0px;top:0px;right:0px;bottom:0px;"></div></div>';
str+='<div id="grimoireInfo"></div>';
str+='</div>';
div.innerHTML=str;
M.magicBarL=l('grimoireBar');
M.magicBarFullL=l('grimoireBarFull');
M.magicBarTextL=l('grimoireBarText');
M.lumpRefill=l('grimoireLumpRefill');
M.infoL=l('grimoireInfo');
for (var i in M.spells)
{
var me=M.spells[i];
AddEvent(l('grimoireSpell'+me.id),'click',function(spell){return function(){PlaySound('snd/tick.mp3');M.castSpell(spell);}}(me));
}
M.refillTooltip=function(){
return '<div style="padding:8px;width:300px;font-size:11px;text-align:center;" id="tooltipRefill">'+loc("Click to refill <b>%1 units</b> of your magic meter for %2.",[100,'<span class="price lump">'+loc("%1 sugar lump",LBeautify(1))+'</span>'])+
(Game.canRefillLump()?'<br><small>('+loc("can be done once every %1",Game.sayTime(Game.getLumpRefillMax(),-1))+')</small>':('<br><small class="red">('+loc("usable again in %1",Game.sayTime(Game.getLumpRefillRemaining()+Game.fps,-1))+')</small>'))+
'</div>';
};
AddEvent(M.lumpRefill,'click',function(){
if (M.magic<M.magicM)
{Game.refillLump(1,function(){
M.magic+=100;
M.magic=Math.min(M.magic,M.magicM);
PlaySound('snd/pop'+Math.floor(Math.random()*3+1)+'.mp3',0.75);
});}
});
M.computeMagicM();
M.magic=M.magicM;
M.spellsCast=0;
M.spellsCastTotal=0;
//M.parent.switchMinigame(1);
}
M.save=function()
{
//output cannot use ",", ";" or "|"
var str=''+
parseFloat(M.magic)+' '+
parseInt(Math.floor(M.spellsCast))+' '+
parseInt(Math.floor(M.spellsCastTotal))+
' '+parseInt(M.parent.onMinigame?'1':'0')
;
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(' ');
M.computeMagicM();
M.magic=parseFloat(spl[i++]||M.magicM);
M.spellsCast=parseInt(spl[i++]||0);
M.spellsCastTotal=parseInt(spl[i++]||0);
var on=parseInt(spl[i++]||0);if (on && Game.ascensionMode!=1) M.parent.switchMinigame(1);
}
M.reset=function()
{
M.computeMagicM();
M.magic=M.magicM;
M.spellsCast=0;
}
M.logic=function()
{
//run each frame
if (Game.T%5==0) {M.computeMagicM();}
M.magicPS=Math.max(0.002,Math.pow(M.magic/Math.max(M.magicM,100),0.5))*0.002;
M.magic+=M.magicPS;
M.magic=Math.min(M.magic,M.magicM);
if (Game.T%5==0)
{
for (var i in M.spells)
{
var me=M.spells[i];
var cost=M.getSpellCost(me);
l('grimoirePrice'+me.id).innerHTML=Beautify(cost);
if (M.magic<cost) l('grimoireSpell'+me.id).className='grimoireSpell titleFont';
else l('grimoireSpell'+me.id).className='grimoireSpell titleFont ready';
}
}
}
M.draw=function()
{
//run each draw frame
if (Game.drawT%5==0)
{
M.magicBarTextL.innerHTML=Math.min(Math.floor(M.magicM),Beautify(M.magic))+'/'+Beautify(Math.floor(M.magicM))+(M.magic<M.magicM?(' ('+loc("+%1/s",Beautify((M.magicPS||0)*Game.fps,2))+')'):'');
M.magicBarFullL.style.width=((M.magic/M.magicM)*100)+'%';
M.magicBarL.style.width=(M.magicM*3)+'px';
M.infoL.innerHTML=loc("Spells cast: %1 (total: %2)",[Beautify(M.spellsCast),Beautify(M.spellsCastTotal)]);
}
M.magicBarFullL.style.backgroundPosition=(-Game.T*0.5)+'px';
}
M.init(l('rowSpecial'+M.parent.id));
}
var M=0;