Path: blob/main/projects/cookie-clicker/minigameMarket.js
4626 views
var M={};1M.parent=Game.Objects['Bank'];2M.parent.minigame=M;3M.launch=function()4{5var M=this;6M.name=M.parent.minigameName;7M.init=function(div)8{9//populate div with html and initialize values1011M.goods={12'Farm':{13name:'Cereals',14symbol:'CRL',15company:'Old Mills',16desc:'<b>Old Mills</b> is a trusted staple of the grain industry. Finding their roots in humble pioneer farms centuries ago and honing their know-how ever since, the Old Mills organic crops have reached a standard of quality that even yours struggle to equal.',17},18'Mine':{19name:'Chocolate',20symbol:'CHC',21company:'Cocoa Excavations',22desc:'<b>Cocoa Excavations</b> is an international chocolate mining venture whose extraction sites always seem, somehow, to pop up in war-torn countries. Their high-grade chocolate is renowned the world over and has even been marketed, to some success, as suitable gems for engagement rings.',23},24'Factory':{25name:'Butter',26symbol:'BTR',27company:'Bovine Industries',28desc:'<b>Bovine Industries</b> is a formerly-agricultural conglomerate that now deals in mechanized dairy mass production. Whistleblowers have drawn attention to the way the milk cows employed by this company are treated, describing it as "not quite cruel or anything, but definitely unusual".',29},30'Bank':{31name:'Sugar',32symbol:'SUG',33company:'Candy Trust',34desc:'The <b>Candy Trust</b> is a corporate banking group backed by, and specialized in, the trade of high-grade sugar. The origin of said sugar is legally protected by an armada of lawyers, though some suspect they secretly scrape it off of the bank bills coming in before processing it.',35},36'Temple':{37name:'Nuts',38symbol:'NUT',39company:'Hazel Monastery',40desc:'Hidden between hills and fog somewhere, the secretive <b>Hazel Monastery</b> has, for centuries, maintained nut crops of the highest quality. The monastery nuts are carefully tended to, harvested and shelled by its monks, who are all required to take a vow of nut allergy as a lifelong test of piety.',41},42'Wizard tower':{43name:'Salt',44symbol:'SLT',45company:'Wacky Reagants',46desc:'Salt is a versatile substance, with properties both mundane and mystical. This is why the bearded crackpots at <b>Wacky Reagants</b> have perfected the art of turning magic powder into salt, which is then sold to anyone promising to put it to good use - whether it be warding off banshees and ghouls or seasoning a Sunday roast.',47},48'Shipment':{49name:'Vanilla',50symbol:'VNL',51company:'Cosmic Exports',52desc:'After the news broke of vanilla not being native to Earth, <b>Cosmic Exports</b> was the first company to discover its true origin planet - and has struck an exclusive deal with its tentacled inhabitants to ship its valuable, unadulterated beans all over the local quadrant.',53},54'Alchemy lab':{55name:'Eggs',56symbol:'EGG',57company:'Organic Gnostics',58desc:'At <b>Organic Gnostics</b>, an egg is seen as a promise. A promise of life and nourishment, of infinite potential, of calcium and protein. An egg can become many things... especially when you\'re properly funded and don\'t believe there\'s room in science for rules or ethics.',59},60'Portal':{61name:'Cinnamon',62symbol:'CNM',63company:'Dimensional Exchange',64desc:'The <b>Dimensional Exchange</b> employs a vast team of ragtag daredevils to dive into dangerous underworlds in search of strange native spices. Chief among those is cinnamon, a powder so delicious its true nature can only be unspeakably abominable.',65},66'Time machine':{67name:'Cream',68symbol:'CRM',69company:'Precision Aging',70desc:'Once specialized in cosmetics for the elderly, the eggheads at <b>Precision Aging</b> have repurposed their timeshift technology and developed a process allowing them to accelerate, slow down, and even reverse the various phase changes of milk. Their flagship offering, whole cream, is said to be within 0.002% of theoretical ripening optimums.',71},72'Antimatter condenser':{73name:'Jam',74symbol:'JAM',75company:'Pectin Research',76desc:'<b>Pectin Research</b> is a military-backed laboratory initially created with the aim of enhancing and miniaturizing army rations, but now open for public bulk trading. It has recently made forays in the field of highly-concentrated fruit jams, available in a variety of flavors.',77},78'Prism':{79name:'White chocolate',80symbol:'WCH',81company:'Dazzle Corp Ltd.',82desc:'What was once two college kids messing around with mirrors in their dad\'s garage is now a world-famous megacorporation. <b>Dazzle Corp</b>\'s groundbreaking experiments in photonic annealing have led to the creation years ago of a new kind of matter, once derided as impossible by physicists and cooks alike: white chocolate.',83},84'Chancemaker':{85name:'Honey',86symbol:'HNY',87company:'Prosperity Hive',88desc:'The folks at <b>Prosperity Hive</b> deal in honey, and it\'s always worked for them. With a work culture so relaxed you\'re almost tempted to ditch the cookie business and join them, these people have little in common with the proverbial busy bee - though their rates do sting quite a bit.',89},90'Fractal engine':{91name:'Cookies',92symbol:'CKI',93company:'Selfmade Bakeries',94desc:'Interesting. It appears there\'s still a company out there trying to sell cookies even with your stranglehold on the market. No matter - you figure <b>Selfmade Bakeries</b>\' largely inferior product will make decent fodder for the mouse traps in your factories.',95},96'Javascript console':{97name:'Recipes',98symbol:'RCP',99company:'Figments Associated',100desc:'In a post-material world, the market of ideas is where value is created. <b>Figments Associated</b> understands that, and is the prime designer (and patenter) of baking recipes, ingredient nomenclature, custom cooking procedures, and other kitchen processes.',101},102'Idleverse':{103name:'Subsidiaries',104symbol:'SBD',105company:'Polyvalent Acquisitions',106desc:'Avoid the uncouth nastiness of mass layoffs and hostile takeovers by delegating the purchase, management, and eventual dissolution of other companies to the boys at <b>Polyvalent Acquisitions</b>. Let \'em deal with it!',107},108};109M.goodsById=[];var n=0;110for (var i in M.goods){var it=M.goods[i];it.id=n;it.hidden=false;it.active=false;it.last=0;it.building=Game.Objects[i];it.stock=0;it.mode=0;it.dur=0;it.val=1;it.vals=[it.val];it.d=0;M.goodsById[n]=it;it.icon=[it.building.iconColumn,33];n++;}111112M.goodTooltip=function(id)113{114return function(){115var me=M.goodsById[id];116var delta=M.goodDelta(id);117var val=M.getGoodPrice(me)118icon=me.icon||[0,0];119var str='<div style="padding:8px 4px;min-width:350px;">'+120'<div class="icon" style="float:left;margin-left:-8px;margin-top:-8px;background-position:'+(-icon[0]*48)+'px '+(-icon[1]*48)+'px;"></div>'+121'<div class="name">'+me.name+' <span style="font-size:12px;opacity:0.8;">(from <span style="font-variant:small-caps;">'+me.company+'</span>)</span> <span class="bankSymbol">'+me.symbol+' <span class="bankSymbolNum'+(delta>=0?' bankSymbolUp':delta<0?' bankSymbolDown':'')+'">'+(delta+''+(delta==Math.floor(delta)?'.00':(delta*10)==Math.floor(delta*10)?'0':'')+'%')+'</span></span></div>'+122'<div class="line"></div><div class="description">'+123'<q>'+me.desc+'</q>'+124'<div class="line"></div><div style="font-size:11px;">• <div class="icon" style="pointer-events:none;display:inline-block;transform:scale(0.5);margin:-16px -18px -16px -14px;vertical-align:middle;background-position:'+(-icon[0]*48)+'px '+(-icon[1]*48)+'px;"></div> '+me.name+': currently worth <b>$'+Beautify(val,2)+'</b> per unit.<br>• You currently own <div class="icon" style="pointer-events:none;display:inline-block;transform:scale(0.5);margin:-16px -18px -16px -14px;vertical-align:middle;background-position:'+(-icon[0]*48)+'px '+(-icon[1]*48)+'px;"></div> <b>'+Beautify(me.stock)+'</b>x '+me.name+' (worth <b>$'+Beautify(val*me.stock,2)+'</b>).<br>• Your warehouses can store up to <div class="icon" style="pointer-events:none;display:inline-block;transform:scale(0.5);margin:-16px -18px -16px -14px;vertical-align:middle;background-position:'+(-icon[0]*48)+'px '+(-icon[1]*48)+'px;"></div> <b>'+Beautify(M.getGoodMaxStock(me))+'</b>x '+me.name+'.<br>• You may increase your storage space by upgrading your offices and by buying more <div class="icon" style="pointer-events:none;display:inline-block;transform:scale(0.5);margin:-16px -18px -16px -14px;vertical-align:middle;background-position:'+(-me.building.iconColumn*48)+'px '+(0*48)+'px;"></div> '+me.building.plural+'. You also get 10 extra storage space per '+me.building.single+' level (currently: <b>+'+(me.building.level*10)+'</b>).<br>• The average worth of this stock and how high it can peak depends on the building it is tied to, along with the level of your <div class="icon" style="pointer-events:none;display:inline-block;transform:scale(0.5);margin:-16px -18px -16px -14px;vertical-align:middle;background-position:'+(-15*48)+'px '+(0*48)+'px;"></div> banks.</div>'+125'<div style="font-size:11px;opacity:0.5;margin-top:3px;">Shift-click the hide button to toggle all other stocks.</div>'+126'</div></div>';127return str;128};129}130M.tradeTooltip=function(id,n)131{132return function(){133var me=M.goodsById[id];134var icon=me.icon||[0,0];135var val=M.getGoodPrice(me)136var cost=Game.cookiesPsRawHighest*val;137var buyOrSell=n>0;138var overhead=1;139var stock=me.stock;140var maxStock=M.getGoodMaxStock(me);141if (buyOrSell) overhead*=1+0.01*(20*Math.pow(0.95,M.brokers));142cost*=overhead;143if (n==10000) n=Math.floor(Game.cookies/cost);144else if (n==-10000) n=me.stock;145n=Math.abs(n);146if (buyOrSell) n=Math.min(n,maxStock-stock);147if (!buyOrSell) n=Math.min(n,stock);148var str='<div style="padding:8px 4px;min-width:128px;text-align:center;font-size:11px;">'+149'<div style="font-size:9px;opacity:0.6;">Stock: <b'+((!buyOrSell && stock==0)?' class="red"':'')+'>'+Beautify(stock)+'</b>/<b'+((buyOrSell && stock>=maxStock)?' class="red"':'')+'>'+Beautify(maxStock)+'</b></div>'+150'<div class="line"></div>'+151'<div>'+(buyOrSell?'Buy':'Sell')+' <b>'+Beautify(n)+'</b>x <div class="icon" style="pointer-events:none;display:inline-block;transform:scale(0.5);margin:-16px -18px -16px -14px;vertical-align:middle;background-position:'+(-me.icon[0]*48)+'px '+(-me.icon[1]*48)+'px;"></div> '+me.name+'</div>'+152'<div>for <b>$'+Beautify(val,2)+'</b> each</div>'+153(overhead>1?('<div style="font-size:9px;opacity:0.6;">(+<b>'+Beautify((overhead-1)*100,2)+'%</b> overhead)</div>'):'')+154'<div class="line"></div>'+155'<div style="font-size:9px;opacity:0.6;font-weight:bold;">'+(buyOrSell?'you spend':'you earn')+':</div>'+156'<div><b class="hasTinyCookie '+(n<=0?'gray':(Game.cookies>=cost*n || !buyOrSell)?'green':'red')+'">'+Beautify(cost*n)+'</b></div>'+157(n>0?('<div style="font-size:9px;opacity:0.6;font-weight:bold;">($'+Beautify(val*overhead*n,2)+')</div>'+158'<div style="font-size:9px;opacity:0.6;font-weight:bold;">('+Game.sayTime(val*overhead*n*Game.fps,-1)+' of CpS)</div>'):'')+159(((me.last==1 && !buyOrSell) || (me.last==2 && buyOrSell))?'<div class="line"></div><div class="red">You cannot buy and sell this stock in the same tick.</div>':'')+160'</div>';161return str;162};163}164165M.goodDelta=function(id,back)//if back is 0 we get the current step; else get current step -back166{167var back=back||0;168var me=M.goodsById[id];169var val=0;170if (me.vals.length>=(2+back))171{172val=me.vals[0+back]/me.vals[1+back]-1;173}174val=Math.floor(val*10000)/100;175return val;176}177178M.getGoodMaxStock=function(good)179{180var bonus=0;181if (M.officeLevel>0) bonus+=25;182if (M.officeLevel>1) bonus+=50;183if (M.officeLevel>2) bonus+=75;184if (M.officeLevel>3) bonus+=100;185return Math.ceil(good.building.highest*(M.officeLevel>4?1.5:1)+bonus+good.building.level*10);186}187M.getGoodPrice=function(good)188{189return good.val;190}191M.buyGood=function(id,n)192{193var me=M.goodsById[id];194var costInS=M.getGoodPrice(me);195var cost=Game.cookiesPsRawHighest*costInS;196var overhead=1+0.01*(20*Math.pow(0.95,M.brokers));197cost*=overhead;198if (n==10000) n=Math.floor(Game.cookies/cost);199n=Math.min(n,M.getGoodMaxStock(me)-me.stock);200if (n>0 && me.last!=2 && Game.cookies>=cost*n && me.stock+n<=M.getGoodMaxStock(me))201{202if (costInS*overhead*n>=86400) Game.Win('Buy buy buy');203M.profit-=costInS*overhead*n;204Game.Spend(cost*n);205me.stock+=n;206var min=10000;207for (var i=0;i<M.goodsById.length;i++)208{209var it=M.goodsById[i];210min=Math.min(min,it.stock);211if (it.stock>=1000) Game.Win('Full warehouses');212}213if (min>=100) Game.Win('Rookie numbers');214if (min>=500) Game.Win('No nobility in poverty');215me.last=1;216PlaySound('snd/cashOut.mp3',0.4);217return true;218}219return false;220}221M.sellGood=function(id,n)222{223var me=M.goodsById[id];224if (n==10000) n=me.stock;225n=Math.min(n,me.stock);226if (n>0 && me.last!=1 && me.stock>0)227{228var costInS=M.getGoodPrice(me);229if (costInS*n>=86400) Game.Win('Make my day');230M.profit+=costInS*n;231if (M.profit>0) Game.Win('Initial public offering');232if (M.profit>=10000000) Game.Win('Liquid assets');233if (M.profit>=31536000) Game.Win('Gaseous assets');234//Game.Earn(Game.cookiesPsRawHighest*costInS*n);235Game.cookies+=Game.cookiesPsRawHighest*costInS*n;236Game.cookiesEarned=Math.max(Game.cookies,Game.cookiesEarned);237me.stock-=n;238me.last=2;239PlaySound('snd/cashIn.mp3',0.4);240return true;241}242return false;243}244M.getRestingVal=function(id)245{246return 10+10*id+(Game.Objects['Bank'].level-1);247}248249M.updateGoodStyle=function(id)250{251var me=M.goodsById[id];252if (me.active)253{254me.l.style.display='inline-block';255if (!me.hidden)256{257me.viewHideL.innerHTML='Hide';258me.l.classList.remove('bankHidden');259me.graphIconL.style.display='block';260}261else262{263me.viewHideL.innerHTML='View';264me.l.classList.add('bankHidden');265me.graphIconL.style.display='none';266}267}268else269{270me.l.style.display='none';271me.graphIconL.style.display='none';272}273}274275M.officeLevel=0;276M.offices=[277{name:'Credit garage',icon:[0,33],cost:[100,2],desc:'This is your starting office.<br>Upgrading will grant you:<br><b><!--• +1 opportunity slot<br>-->• +25 warehouse space for all goods</b>'},278{name:'Tiny bank',icon:[9,33],cost:[200,4],desc:'This is your office.<br>Upgrading will grant you:<br><b>• +1 loan slot<br>• +50 warehouse space for all goods</b>'},279{name:'Loaning company',icon:[10,33],cost:[350,8],desc:'This is your office.<br>Upgrading will grant you:<br><!--<b>• +1 opportunity slot<br>-->• +75 warehouse space for all goods</b>'},280{name:'Finance headquarters',icon:[11,33],cost:[500,10],desc:'This is your office.<br>Upgrading will grant you:<br><b>• +1 loan slot<br>• +100 warehouse space for all goods</b>'},281{name:'International exchange',icon:[12,33],cost:[700,12],desc:'This is your office.<br>Upgrading will grant you:<br><b>• +1 loan slot<br><!--• +1 opportunity slot<br>-->• +50% base warehouse space for all goods</b>'},282{name:'Palace of Greed',icon:[18,33],cost:0,desc:'This is your office.<br>It is fully upgraded. Its lavish interiors, spanning across innumerable floors, are host to many a decadent party, owing to your nigh-unfathomable wealth.'},283];284285M.officeTooltip=function()286{287return function(){288var me=M.offices[M.officeLevel];289var icon=me.icon||[0,0];290var str='<div style="padding:8px 4px;min-width:350px;">'+291'<div class="icon" style="float:left;margin-left:-8px;margin-top:-8px;background-position:'+(-icon[0]*48)+'px '+(-icon[1]*48)+'px;"></div>'+292'<div class="name">'+me.name+' <span style="font-size:11px;opacity:0.6;">[Level '+(M.officeLevel+1)+' offices]</span></div>'+293'<div class="line"></div><div class="description" style="font-size:11px;">'+294me.desc+295'</div>'+296(me.cost?('<div class="line"></div><div style="font-size:11px;padding-left:24px;position:relative;">'+297'<div id="bankOfficeIcon" class="icon" style="position:absolute;left:0px;top:6px;pointer-events:none;display:inline-block;transform:scale(0.5);margin:-16px -18px -16px -14px;vertical-align:middle;background-position:'+(-11*48)+'px '+(-0*48)+'px;"></div>'+298'Upgrading will cost you <b class="'+(Game.Objects['Cursor'].amount>=me.cost[0]?'green':'red')+'">'+me.cost[0]+' cursors</b>.<br>'+299'Upgrading requires <b class="'+(Game.Objects['Cursor'].level>=me.cost[1]?'green':'red')+'">level '+me.cost[1]+' cursors</b>.'+300'</div>'):'')+301'</div>';302return str;303};304}305306M.brokers=0;307308M.getMaxBrokers=function(){return Math.ceil(Game.Objects['Grandma'].highest/10+Game.Objects['Grandma'].level);}309M.getBrokerPrice=function(){return Game.cookiesPsRawHighest*60*20;}310M.brokersTooltip=function()311{312return function(){313var icon=[1,33];314var str='<div style="padding:8px 4px;min-width:350px;">'+315'<div class="icon" style="float:left;margin-left:-8px;margin-top:-8px;background-position:'+(-icon[0]*48)+'px '+(-icon[1]*48)+'px;"></div>'+316'<div class="name">Stockbrokers <span style="font-size:11px;opacity:0.6;">(you have '+Beautify(M.brokers)+')</span></div>'+317'<div class="line"></div><div class="description" style="font-size:11px;">'+318'A nice broker to trade more cookies.<br>'+319'• Buying goods normally incurs overhead costs of <b>20% extra</b>. Each broker you hire reduces that cost by <b>5%</b>.<br>'+320'• Current overhead costs thanks to your '+Beautify(M.brokers)+' broker'+(M.brokers==1?'':'s')+': <b>+'+Beautify(20*Math.pow(0.95,M.brokers),2)+'%</b><br>'+321'• Buying a broker costs <b class="hasTinyCookie '+(Game.cookies>=M.getBrokerPrice()?'green':'red')+'">20 minutes</b> of CpS (that\'s $1200).<br>'+322'• Maximum number of brokers you can own: <b class="'+(M.brokers<M.getMaxBrokers()?'green':'red')+'">'+Beautify(M.getMaxBrokers())+'</b> (the highest amount of grandmas you\'ve owned this run, divided by 10, plus your grandma level)<br>'+323'<q>Brokers are Wall Street-class grandmas versed in the ways of finance. Stockbroker grandmas work hard and play hard, and will fight telephone in hand to get your clients the best possible deals - with a sizeable profit margin for you, of course.</q>'+324'<div class="line"></div><div style="font-size:11px;text-align:center;">'+325'Hiring a new broker will cost you <b class="hasTinyCookie '+(Game.cookies>=M.getBrokerPrice()?'green':'red')+'">'+Beautify(M.getBrokerPrice())+' cookies</b>.'+326'</div>'+327'</div>'+328'</div>';329return str;330};331}332333M.loanTypes=[334//name, mult, duration, payback mult, duration, downpayment (as % of bank), quote335['a modest loan',1.5,60*2,0.25,60*4,0.2,'Buy that vintage car you\'ve always wanted. Just pay us back.'],336['a pawnshop loan',2,0.67,0.1,40,0.4,'Bad credit? No problem. It\'s your money, and you need it now.'],337['a retirement loan',1.2,60*24*2,0.8,60*24*5,0.5,'Finance your next house, boat, spouse, etc. You\'ve earned it.'],338];339M.loanTooltip=function(id)340{341return function(){342var loan=M.loanTypes[id-1];343var str='<div style="padding:8px 4px;min-width:350px;">'+344'<div class="name">Take out '+loan[0]+'</div>'+345'<div class="line"></div><div class="description" style="font-size:11px;">'+346'By taking this loan, you will get <b class="green">+'+Math.round((loan[1]-1)*100)+'%</b> CpS for the next <b>'+Game.sayTime(60*loan[2]*Game.fps)+'</b>.<br>'+347'However, you will get <b class="red">'+Math.round((loan[3]-1)*100)+'%</b> CpS for the next <b>'+Game.sayTime(60*loan[4]*Game.fps)+'</b> after that.<br>'+348'You must also pay an immediate downpayment of <b class="hasTinyCookie red">'+Beautify(Game.cookies*loan[5])+'</b> (<b>'+(loan[5]*100)+'%</b> of your current bank).<br>'+349'<q>'+loan[6]+'</q>'+350'</div>';351return str;352};353}354M.takeLoan=function(id,interest)355{356var loan=M.loanTypes[id-1];357if (!interest)358{359if (Game.hasBuff('Loan '+id) || Game.hasBuff('Loan '+id+' (interest)')) return false;360Game.Spend(Game.cookies*loan[5]);361Game.gainBuff('loan '+id,loan[2]*60,loan[1]);362}363else364{365Game.gainBuff('loan '+id+' interest',loan[4]*60,loan[3]);366Game.Notify('Loan over','Your loan has expired, and you must now repay the interest.',[1,33]);367}368return true;369}370Game.takeLoan=M.takeLoan;371372M.getOppSlots=function()373{374var slots=0;375if (M.officeLevel>0) slots++;376if (M.officeLevel>2) slots++;377if (M.officeLevel>4) slots++;378return slots;379}380381//note : opportunity system to be added later maybe382383M.oppTooltip=function()384{385return function(){386var str='<div style="padding:8px 4px;min-width:350px;">'+387'<div class="name">Generate opportunity</div>'+388'<div class="line"></div><div class="description" style="font-size:11px;">'+389'Pressing this button gives you up to 3 possible actions to choose from, depending on your office level.<br>These actions will let you manipulate the stock market to some degree, though some are riskier than others.<br>You may only generate an opportunity once an hour, though this can be refreshed with a sugar lump.'+390'</div>';391return str;392};393}394395M.refillTooltip=function(){396return '<div style="padding:8px;width:300px;font-size:11px;text-align:center;">Click to refill your opportunity timer (and give a quick burst to your economy) for <span class="price lump">1 sugar lump</span>.'+397(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>'))+398'</div>';399};400401402var str='';403str+='<style>'+404'#bankBG{background:url(img/shadedBorders.png),url(img/BGmarket.jpg);background-size:100% 100%,auto;position:absolute;left:0px;right:0px;top:0px;bottom:16px;}'+405'#bankContent{position:relative;box-sizing:border-box;padding:4px;text-align:center;}'+406407'.bankGood{margin:2px;display:inline-block;width:156px;text-align:center;position:relative;left:0px;top:0px;right:0px;box-sizing:border-box;box-shadow:0px 0px 0px 1px rgba(255,255,255,0.1), 2px 2px 4px rgba(0,0,0,0.5) inset;background:rgba(0,0,0,0.9);color:rgba(255,255,255,0.7);}'+408'.bankHidden{opacity:0.75;background:transparent;box-shadow:none;}'+409'.bankButton{cursor:pointer;opacity:0.8;color:#94cd50;font-weight:bold;font-size:10px;border:1px solid #999;border-color:#94cd50 #1b7a2f #1b7a2f #94cd50;padding:2px 6px;margin:0px 1px 1px 0px;display:inline-block;}'+410'.bankButtonBuy{color:#a358ff;border-color:#a358ff #3a52bc #3a52bc #a358ff;}'+411'.bankButtonSell{color:#94cd50;border-color:#94cd50 #1b7a2f #1b7a2f #94cd50;}'+412//'.bankButtonLess{color:#e25142;border-color:#e25142 #9a1225 #9a1225 #e25142;}'+413'.bankButton:hover{opacity:1;}'+414'.bankButton:active{color:#fff;}'+415'.bankButtonOff{color:#999;border-color:#999 #666 #666 #999;opacity:0.6;}'+416'.bankSymbol{font-weight:bold;font-size:10px;display:inline-block;padding:2px 4px;background:#333;text-shadow:0px 1px #000;}'+417'.bankSymbolNum{font-weight:normal;}'+418'.bankSymbolNum:after{content:\'=\';}'+419'.bankSymbolUp{color:#73f21e;}'+420'.bankSymbolUp:after{content:\'\u25b2\';}'+421'.bankSymbolDown{color:#f21e3c;}'+422'.bankSymbolDown:after{content:\'\u25bc\';}'+423'#bankGraphBox{background:#fff;position:relative;z-index:5;overflow:hidden;height:300px;}'+424'.bankGraphIcon{position:absolute;right:-24px;top:-24px;z-index:10;transform:scale(0);transition:transform 0.3s;}'+425'.bankViewHide{position:absolute;z-index:10;padding:4px;top:-2px;right:0px;}'+426'.bankSimpleButton{font-weight:bold;font-size:10px;cursor:pointer;text-decoration:underline;color:rgba(255,255,255,0.9);text-shadow:0px 1px #000;}'+427'.bankSimpleButton:active{opacity:0.5;}'+428'.bankSimpleButton:hover{color:#fff;}'+429'</style>';430431str+='<div id="bankBG"></div>';432str+='<div id="bankContent">';433434str+='<div id="bankHeader" style="z-index:10;position:relative;">'+435'<div>'+436'<div style="padding:1px 4px;font-size:10px;color:rgba(255,255,255,0.5);">Profits: <span id="bankBalance">$0</span>. All prices are in <b style="color:#fff;">$</b>econds of your highest raw cookies per second. <span id="bankNextTick"></span></div>'+437'<div id="bankOffice" style="display:inline-block;padding:0px 4px;" '+Game.getDynamicTooltip('Game.ObjectsById['+M.parent.id+'].minigame.officeTooltip()','this')+'><div id="bankOfficeIcon" class="icon" style="pointer-events:none;display:inline-block;transform:scale(0.5);margin:-16px -18px -12px -14px;vertical-align:middle;background-position:'+(-0*48)+'px '+(-33*48)+'px;"></div><span id="bankOfficeName" class="bankSymbol" style="width:128px;"></span><div class="bankButton bankButtonBuy bankButtonOff" id="bankOfficeUpgrade">-</div></div>'+438'<div id="bankBrokers" style="display:inline-block;padding:0px 4px;" '+Game.getDynamicTooltip('Game.ObjectsById['+M.parent.id+'].minigame.brokersTooltip()','this')+'><div id="bankBrokersIcon" class="icon" style="pointer-events:none;display:inline-block;transform:scale(0.5);margin:-16px -18px -12px -14px;vertical-align:middle;background-position:'+(-1*48)+'px '+(-33*48)+'px;"></div><span id="bankBrokersText" class="bankSymbol" style="width:96px;">no brokers</span><div class="bankButton bankButtonBuy bankButtonOff" id="bankBrokersBuy">Hire</div></div>'+439'<div style="display:inline-block;padding:0px 4px;"><div id="bankLoan1" style="display:none;" class="bankButton bankButtonSell bankButtonOff" '+Game.getDynamicTooltip('Game.ObjectsById['+M.parent.id+'].minigame.loanTooltip(1)','this')+'>1st loan</div><div id="bankLoan2" style="display:none;" class="bankButton bankButtonSell bankButtonOff" '+Game.getDynamicTooltip('Game.ObjectsById['+M.parent.id+'].minigame.loanTooltip(2)','this')+'>2nd loan</div><div id="bankLoan3" style="display:none;" class="bankButton bankButtonSell bankButtonOff" '+Game.getDynamicTooltip('Game.ObjectsById['+M.parent.id+'].minigame.loanTooltip(3)','this')+'>3rd loan</div></div>'+440/*'<div style="display:inline-block;padding:0px 4px;"><div id="bankOpp" class="bankButton bankButtonBuy bankButtonOff" '+Game.getDynamicTooltip('Game.ObjectsById['+M.parent.id+'].minigame.oppTooltip()','this')+'>Generate opportunity</div> <div class="bankSymbol" style="position:relative;font-size:10px;color:rgba(255,255,255,0.6);padding-left:16px;"><div '+Game.getDynamicTooltip('Game.ObjectsById['+M.parent.id+'].minigame.refillTooltip','this')+' id="bankLumpRefill" class="usesIcon shadowFilter lumpRefill" style="left:-18px;top:-18px;background-position:'+(-29*48)+'px '+(-14*48)+'px;"></div>refresh</div></div>'+*/441'</div>';442443for (var i=0;i<M.goodsById.length;i++)444{445var me=M.goodsById[i];446str+='<div class="bankGood" id="bankGood-'+me.id+'">'+447'<div '+Game.getDynamicTooltip('Game.ObjectsById['+M.parent.id+'].minigame.goodTooltip('+me.id+')','this')+'>'+448'<div class="icon" style="z-index:20;pointer-events:none;position:absolute;left:0px;top:0px;transform:scale(0.5);margin:-16px -16px;background-position:'+(-me.icon[0]*48)+'px '+(-me.icon[1]*48)+'px;"></div>'+449'<div class="bankSymbol" style="margin:1px 0px;display:block;padding:2px 0px;width:100%;overflow:hidden;white-space:nowrap;">'+me.symbol+' <span id="bankGood-'+me.id+'-sym" class="bankSymbolNum">-.--%</span></div>'+450'<div class="bankViewHide bankSimpleButton" id="bankGood-'+me.id+'-viewHide">Hide</div>'+451'<div class="bankSymbol" style="margin:1px 0px;display:block;font-size:10px;width:100%;background:linear-gradient(to right,transparent,#333,#333,transparent);padding:2px 0px;overflow:hidden;white-space:nowrap;">value: <span style="font-weight:bold;color:#fff;" id="bankGood-'+me.id+'-val">-</span></div>'+452'<div class="bankSymbol" style="margin:1px 0px;display:block;font-size:10px;width:100%;background:linear-gradient(to right,transparent,#333,#333,transparent);padding:2px 0px;overflow:hidden;white-space:nowrap;" id="bankGood-'+me.id+'-stockBox">stock: <span style="font-weight:bold;" id="bankGood-'+me.id+'-stock">-</span><span style="font-weight:bold;" id="bankGood-'+me.id+'-stockMax">/-</span></div>'+453'</div>'+454'<div style="position:relative;white-space:nowrap;">'+455'<div style="padding:3px 2px;width:22px;" class="bankSymbol">Buy</div>'+456'<div class="bankButton bankButtonBuy" id="bankGood-'+me.id+'_1" '+Game.getDynamicTooltip('Game.ObjectsById['+M.parent.id+'].minigame.tradeTooltip('+me.id+',1)','this')+'>1</div>'+457'<div class="bankButton bankButtonBuy" id="bankGood-'+me.id+'_10" '+Game.getDynamicTooltip('Game.ObjectsById['+M.parent.id+'].minigame.tradeTooltip('+me.id+',10)','this')+'>10</div>'+458'<div class="bankButton bankButtonBuy" id="bankGood-'+me.id+'_100" '+Game.getDynamicTooltip('Game.ObjectsById['+M.parent.id+'].minigame.tradeTooltip('+me.id+',100)','this')+'>100</div>'+459'<div style="width:28px;" class="bankButton bankButtonBuy" id="bankGood-'+me.id+'_Max" '+Game.getDynamicTooltip('Game.ObjectsById['+M.parent.id+'].minigame.tradeTooltip('+me.id+',10000)','this')+'>Max</div>'+460'<br>'+461'<div style="padding:3px 2px;width:22px;" class="bankSymbol">Sell</div>'+462'<div class="bankButton bankButtonSell" id="bankGood-'+me.id+'_-1" '+Game.getDynamicTooltip('Game.ObjectsById['+M.parent.id+'].minigame.tradeTooltip('+me.id+',-1)','this')+'>1</div>'+463'<div class="bankButton bankButtonSell" id="bankGood-'+me.id+'_-10" '+Game.getDynamicTooltip('Game.ObjectsById['+M.parent.id+'].minigame.tradeTooltip('+me.id+',-10)','this')+'>10</div>'+464'<div class="bankButton bankButtonSell" id="bankGood-'+me.id+'_-100" '+Game.getDynamicTooltip('Game.ObjectsById['+M.parent.id+'].minigame.tradeTooltip('+me.id+',-100)','this')+'>100</div>'+465'<div style="width:28px;" class="bankButton bankButtonSell" id="bankGood-'+me.id+'_-All" '+Game.getDynamicTooltip('Game.ObjectsById['+M.parent.id+'].minigame.tradeTooltip('+me.id+',-10000)','this')+'>All</div>'+466'</div>'+467'</div>';468}469str+='</div>';470str+='<div id="bankGraphBox"></div>';471472str+='</div>';473div.innerHTML=str;474475476477var str='';478str+='<div style="position:absolute;left:2px;top:2px;z-index:10;">'+479'<div id="bankGraphLines" class="bankSimpleButton" style="background:rgba(0,0,0,0.5);padding:2px;border-radius:4px;">Line style</div>'+480'<div id="bankGraphCols" class="bankSimpleButton" style="background:rgba(0,0,0,0.5);padding:2px;border-radius:4px;">Color mode</div>'+481(Game.sesame?'<div id="bankCheatSpeed" class="bankSimpleButton" style="background:rgba(0,0,0,0.5);padding:2px;border-radius:4px;">Toggle speed</div>':'')+482'</div>'+483'<div style="font-family:Arial Black;font-weight:40px;letter-spacing:2px;opacity:0.15;font-weight:bold;position:absolute;left:6px;bottom:6px;z-index:10;pointer-events:none;">DOUGH JONES INDEX</div>';484for (var i=0;i<M.goodsById.length;i++)485{486var me=M.goodsById[i];487str+='<div id="bankGood-'+me.id+'-graphIcon" class="icon bankGraphIcon" style="pointer-events:none;transform:scale(0.5);background-position:'+(-me.icon[0]*48)+'px '+(-me.icon[1]*48)+'px;"></div>';488}489l('bankGraphBox').innerHTML=str;490491var div=document.createElement('canvas');492div.id='bankGraph';493div.style.marginLeft='-14px';494div.width=64;495div.height=64;496l('bankGraphBox').appendChild(div);497M.graph=div;498M.graphCtx=M.graph.getContext('2d',{alpha:false});499500AddEvent(l('bankGraphLines'),'click',function(e){501if (M.graphLines==0) M.graphLines=1;502else M.graphLines=0;503M.toRedraw=2;504PlaySound('snd/tick.mp3');505});506AddEvent(l('bankGraphCols'),'click',function(e){507if (M.graphCols==0) M.graphCols=1;508else M.graphCols=0;509M.setCols();510M.toRedraw=2;511PlaySound('snd/tick.mp3');512});513if (l('bankCheatSpeed'))514{515AddEvent(l('bankCheatSpeed'),'click',function(e){516if (M.secondsPerTick==60) M.secondsPerTick=1/10;517else M.secondsPerTick=60;518M.toRedraw=2;519PlaySound('snd/tick.mp3');520});521}522523AddEvent(l('bankOfficeUpgrade'),'click',function(e){524var me=M.offices[M.officeLevel];525if (me.cost && Game.Objects['Cursor'].amount>=me.cost[0] && Game.Objects['Cursor'].level>=me.cost[1])526{527Game.Objects['Cursor'].sacrifice(me.cost[0]);528M.officeLevel+=1;529if (M.officeLevel>=M.offices.length-1) Game.Win('Pyramid scheme');530PlaySound('snd/cashIn2.mp3',0.6);531Game.SparkleOn(e.target);532}533});534AddEvent(l('bankBrokersBuy'),'click',function(e){535if (M.brokers<M.getMaxBrokers() && Game.cookies>=M.getBrokerPrice())536{537Game.Spend(M.getBrokerPrice());538M.brokers+=1;539PlaySound('snd/cashIn2.mp3',0.6);540Game.SparkleOn(e.target);541}542});543544AddEvent(l('bankLoan1'),'click',function(e){545if (M.takeLoan(1)) {PlaySound('snd/cashIn2.mp3',0.6);Game.SparkleOn(e.target);}546});547AddEvent(l('bankLoan2'),'click',function(e){548if (M.takeLoan(2)) {PlaySound('snd/cashIn2.mp3',0.6);Game.SparkleOn(e.target);}549});550AddEvent(l('bankLoan3'),'click',function(e){551if (M.takeLoan(3)) {PlaySound('snd/cashIn2.mp3',0.6);Game.SparkleOn(e.target);}552});553554for (var i=0;i<M.goodsById.length;i++)555{556var me=M.goodsById[i];557me.l=l('bankGood-'+me.id);558me.symbolNumL=l('bankGood-'+me.id+'-sym');559me.valL=l('bankGood-'+me.id+'-val');560me.stockBoxL=l('bankGood-'+me.id+'-stockBox');561me.stockL=l('bankGood-'+me.id+'-stock');562me.stockMaxL=l('bankGood-'+me.id+'-stockMax');563me.viewHideL=l('bankGood-'+me.id+'-viewHide');564me.graphIconL=l('bankGood-'+me.id+'-graphIcon');565566AddEvent(l('bankGood-'+i),'mouseover',function(i){return function(e){567if (M.hoverOnGood!=i) {M.hoverOnGood=i;M.toRedraw=2;}568}}(i));569AddEvent(l('bankGood-'+i),'mouseout',function(i){return function(e){570if (M.hoverOnGood==i) {M.hoverOnGood=-1;M.toRedraw=2;}571}}(i));572573AddEvent(l('bankGood-'+i+'-viewHide'),'click',function(i){return function(e){574if (Game.keys[16])//solo with shift-click575{576var mode=M.goodsById[i].hidden;577for (var ii=0;ii<M.goodsById.length;ii++)578{579if (ii==i) M.goodsById[ii].hidden=!mode;580else if (!mode) M.goodsById[ii].hidden=false;581else M.goodsById[ii].hidden=true;582M.updateGoodStyle(ii);583}584}585else586{587if (M.goodsById[i].hidden) M.goodsById[i].hidden=false;588else M.goodsById[i].hidden=true;589M.updateGoodStyle(i);590}591M.checkGraphScale();592M.toRedraw=2;593PlaySound('snd/tick.mp3');594}}(i));595596AddEvent(l('bankGood-'+i+'_1'),'click',function(i){return function(e){597if (M.buyGood(i,1)) Game.SparkleOn(e.target);598}}(i));599AddEvent(l('bankGood-'+i+'_-1'),'click',function(i){return function(e){600if (M.sellGood(i,1)) Game.SparkleOn(e.target);601}}(i));602AddEvent(l('bankGood-'+i+'_10'),'click',function(i){return function(e){603if (M.buyGood(i,10)) Game.SparkleOn(e.target);604}}(i));605AddEvent(l('bankGood-'+i+'_-10'),'click',function(i){return function(e){606if (M.sellGood(i,10)) Game.SparkleOn(e.target);607}}(i));608AddEvent(l('bankGood-'+i+'_100'),'click',function(i){return function(e){609if (M.buyGood(i,100)) Game.SparkleOn(e.target);610}}(i));611AddEvent(l('bankGood-'+i+'_-100'),'click',function(i){return function(e){612if (M.sellGood(i,100)) Game.SparkleOn(e.target);613}}(i));614AddEvent(l('bankGood-'+i+'_Max'),'click',function(i){return function(e){615if (M.buyGood(i,10000)) Game.SparkleOn(e.target);616}}(i));617AddEvent(l('bankGood-'+i+'_-All'),'click',function(i){return function(e){618if (M.sellGood(i,10000)) Game.SparkleOn(e.target);619}}(i));620}621622623624AddEvent(M.graph,'mousemove',function(e){625//get which graph line the mouse is over626var x=e.layerX;627var y=e.layerY;628var width=M.graph.width;629var height=M.graph.height;630var span=Math.max(4,Math.ceil(width/65));//6;631var isOnLine=-1;632var rows=Math.ceil(width/span);633bankGraphMouseDetect:634for (var i=M.goodsById.length-1;i>=0;i--)635{636var id=i;637var me=M.goodsById[id];638if (me.hidden || !me.active) continue;639for (var iR=0;iR<rows;iR++)640{641if (me.vals.length>=(2+iR))642{643var min=Math.max(me.vals[0+iR],me.vals[1+iR]);644var max=Math.abs((me.vals[0+iR]-me.vals[1+iR]));645if (x>=width-span*iR-span-2 && x<=width-span*iR+2 && y>=height-min*M.graphScale-6 && y<=height-min*M.graphScale+Math.max(3,max*M.graphScale)+6)646{647isOnLine=i;648Game.tooltip.draw(0,'<div style="width:128px;font-size:10px;text-align:center;"><div class="icon" style="pointer-events:none;display:inline-block;transform:scale(0.5);margin:-16px -18px -16px -14px;vertical-align:middle;background-position:'+(-me.icon[0]*48)+'px '+(-me.icon[1]*48)+'px;"></div> <b>'+me.name+'</b><br>valued at <b>$'+Beautify(me.vals[0+iR],2)+'</b><br>'+Game.sayTime((iR+1)*M.secondsPerTick*Game.fps)+' ago</div>','top');649break bankGraphMouseDetect;650}651}652}653}654if (isOnLine!=M.hoverOnGood)655{656M.hoverOnGood=isOnLine;657if (M.hoverOnGood!=-1)658{659M.graph.style.cursor='pointer';660}661else662{663M.graph.style.cursor='auto';664Game.tooltip.shouldHide=1;665}666M.toRedraw=2;667}668});669AddEvent(M.graph,'mouseout',function(e){670M.graph.style.cursor='auto';671if (M.hoverOnGood!=-1) {M.hoverOnGood=-1;M.toRedraw=2;}672Game.tooltip.shouldHide=1;673});674675M.reset();676}677M.onResize=function()678{679M.graph.width=l('bankContent').offsetWidth-22;680M.graph.height=300;//l('bankContent').offsetHeight;681var ctx=M.graphCtx;682ctx.fillStyle='#fff';683ctx.fillRect(0,0,M.graph.width,M.graph.height);684M.checkGraphScale();685M.toRedraw=2;686}687M.save=function()688{689//output cannot use ",", ";" or "|"690var str=''+691parseInt(M.officeLevel)+':'+692parseInt(M.brokers)+':'+693parseInt(M.graphLines)+':'+694parseFloat(M.profit)+':'+695parseInt(M.graphCols)+':'+696' ';697for (var iG=0;iG<M.goodsById.length;iG++)698{699var it=M.goodsById[iG];700str+=parseInt(it.val*100)+':'+parseInt(it.mode)+':'+parseInt(it.d*100)+':'+parseInt(it.dur)+':'+parseInt(it.stock)+':'+parseInt(it.hidden?1:0)+':'+parseInt(it.last)+'!';701}702str+=' '+parseInt(M.parent.onMinigame?'1':'0');703return str;704}705M.load=function(str)706{707//interpret str; called after .init708//note : not actually called in the Game's load; see "minigameSave" in main.js709if (!str) return false;710var i=0;711var spl=str.split(' ');712var spl2=spl[i++].split(':');713var i2=0;714M.officeLevel=parseInt(spl2[i2++]||M.officeLevel);715M.brokers=parseInt(spl2[i2++]||M.brokers);716M.graphLines=parseInt(spl2[i2++]||M.graphLines);717M.profit=parseFloat(spl2[i2++]||0);718M.graphCols=parseInt(spl2[i2++]||M.graphCols);M.setCols();719M.tickT=0;720721var goods=spl[i++].split('!');722for (var iG=0;iG<M.goodsById.length;iG++)723{724if (!goods[iG]) continue;725var it=M.goodsById[iG];726var itData=goods[iG].split(':');727it.val=parseInt(itData[0])/100;728it.mode=parseInt(itData[1]);729it.d=parseInt(itData[2])/100;730it.vals=[it.val,it.val-it.d];731it.dur=parseInt(itData[3]);732it.stock=parseInt(itData[4]);733it.hidden=parseInt(itData[5])?true:false;734it.active=false;735it.last=parseInt(itData[6]||0);736if (it.building.highest>0) it.active=true;737if (it.l) M.updateGoodStyle(it.id);738}739M.onResize();740741var on=parseInt(spl[i++]||0);if (on && Game.ascensionMode!=1) M.parent.switchMinigame(1);742}743M.reset=function(hard)744{745M.tickT=0;746M.toRedraw=0;747M.officeLevel=0;748M.brokers=0;749750if (hard) {M.graphLines=1;M.graphCols=0;}M.setCols();751M.hoverOnGood=-1;752M.ticks=0;753M.lastTickDrawn=0;754M.profit=0;755756for (var i=0;i<M.goodsById.length;i++)757{758var it=M.goodsById[i];759it.stock=0;760it.mode=choose([0,1,1,2,2,3,4,5]);761it.dur=Math.floor(10+Math.random()*990);762it.val=M.getRestingVal(it.id);763it.d=Math.random()*0.2-0.1;764it.vals=[it.val,it.val-it.d];765it.hidden=true;766it.active=false;767it.last=0;//0 : didn't buy or sell this tick; 1 : bought this tick; 2 : sold this tick768if (it.l) M.updateGoodStyle(it.id);769}770M.onResize();771for (var i=0;i<15;i++)772{773M.tick();774}775}776777M.profit=0;778779M.ticks=0;780M.lastTickDrawn=0;781M.secondsPerTick=60;//1 tick every minute782M.tick=function()783{784for (var i=0;i<M.goodsById.length;i++)785{786var me=M.goodsById[i];787me.last=0;788789me.d*=0.97;790791if (me.mode==0) {me.d*=0.95;me.d+=0.05*(Math.random()-0.5);}792else if (me.mode==1) {me.d*=0.99;me.d+=0.05*(Math.random()-0.1);}793else if (me.mode==2) {me.d*=0.99;me.d-=0.05*(Math.random()-0.1);}794else if (me.mode==3) {me.d+=0.15*(Math.random()-0.1);me.val+=Math.random();}795else if (me.mode==4) {me.d-=0.15*(Math.random()-0.1);me.val-=Math.random();}796else if (me.mode==5) me.d+=0.3*(Math.random()-0.5);797798me.val+=(M.getRestingVal(me.id)-me.val)*0.02;799me.val+=(Math.random()-0.5)*0.4;800me.d+=0.1*(Math.random()-0.5);801if (Math.random()<0.1) me.val+=(Math.random()-0.5)*3;802if (Math.random()<0.1) me.d+=(Math.random()-0.5)*0.3;803if (me.mode==5)804{805if (Math.random()<0.5) me.val+=(Math.random()-0.5)*10;806if (Math.random()<0.2) me.d=(Math.random()-0.5)*2;807}808if (me.mode==3 && Math.random()<0.3) {me.d+=(Math.random()-0.5)*0.1;me.val+=(Math.random()-0.7)*10;}809if (me.mode==3 && Math.random()<0.03) {me.mode=4;}810if (me.mode==4 && Math.random()<0.3) {me.d+=(Math.random()-0.5)*0.1;me.val+=(Math.random()-0.3)*10;}811812if (me.val>(100+(Game.Objects['Bank'].level-1)*3) && me.d>0) me.d*=0.9;813814me.val+=me.d;815/*if (me.val<=0 && me.d<0)816{817me.d*=0.75;818if (me.mode==4 && Math.random()<0.05) me.mode=2;819}820if (me.val<2) me.val+=(2-me.val)*0.1;821me.val=Math.max(me.val,0.01);*/822/*var cutoff=5;823var minvalue=1;824if (me.val<=cutoff)825{826var s=Math.max(0,me.val)/cutoff;827me.val=((2*minvalue-cutoff)*s+(2*cutoff-3*minvalue))*s*s+minvalue;//low soft-cap between 1 and 5828}*/829if (me.val<5) me.val+=(5-me.val)*0.5;830if (me.val<5 && me.d<0) me.d*=0.95;831me.val=Math.max(me.val,1);832833me.vals.unshift(me.val);834if (me.vals.length>65) me.vals.pop();835836me.dur--;837//if (Math.random()<1/me.dur)838if (me.dur<=0)839{840me.dur=Math.floor(10+Math.random()*990);841if (Math.random()<0.7 && (me.mode==3 || me.mode==4)) me.mode=5;842else me.mode=choose([0,1,1,2,2,3,4,5]);843}844}845M.checkGraphScale();846M.toRedraw=Math.max(M.toRedraw,1);847M.ticks++;848}849850M.tickT=0;851M.logic=function()852{853//run each frame854855M.tickT++;856if (M.tickT>=Game.fps*M.secondsPerTick)857{858M.tickT=0;859M.tick();860}861862if (Game.T%10==0)863{864var doResize=false;865for (var i=0;i<M.goodsById.length;i++)866{867var me=M.goodsById[i];868869if (!me.active && me.building.highest>0) {me.active=true;me.hidden=false;M.toRedraw=2;if (me.l){M.updateGoodStyle(me.id);doResize=true;}}870}871if (doResize) M.onResize();872}873}874M.hoverOnGood=-1;875M.graphScale=10;//how many units 1 vertical pixel represents876M.graphLines=1;877M.graphCols=0;878M.checkGraphScale=function()879{880//check if the height of the graph and the highest good value881//if the scale is too narrow to accommodate all goods, zoom out882//if the scale is too wide, zoom back in (but with a higher margin)883//this is done in increments of 50884var currentSize=M.graph.height;885if (!currentSize) return false;886var maxVal=0;887for (var i=0;i<M.goodsById.length;i++)888{889var me=M.goodsById[i];890if (me.hidden) continue;891//if (me.id==0) me.vals[0]=50+50*Math.sin(Date.now()*0.0002+me.id);892for (var ii=0;ii<me.vals.length;ii++)893{894maxVal=Math.max(maxVal,me.vals[ii]);895}896}897var neededSize=Math.max(maxVal,10)+10;898var newScale=(Math.max(1,currentSize/neededSize));899var dif=(currentSize/M.graphScale)/neededSize;900var dif=(currentSize/M.graphScale)-neededSize;901if (M.graphScale!=newScale && dif>5 || dif<-5)902{903M.graphScale=newScale;904M.toRedraw=2;905}906}907M.colBases=[908{bg:'#fff',line1:'#eee',line2:'#ccc',low:'#ce2549',high:'#79c600',highlight:'#000'},909{bg:'#1f2836',line1:'#273545',line2:'#384b61',low:'#3153a3',high:'#c4971a',highlight:'#a6abad'},910];911M.setCols=function()912{913if (!M.colBases[M.graphCols]) M.graphCols=0;914M.cols=M.colBases[M.graphCols];915if (l('bankGraphBox'))916{917l('bankGraphBox').style.backgroundColor=M.cols.bg;918l('bankGraphBox').style.color=M.cols.highlight;919}920if (M.graph) M.graph.style.backgroundColor=M.cols.bg;921}922M.setCols();923M.drawGraph=function(full)924{925/*926what this does :927scroll the graph left by (span)928draw more graph data to the right929if (full), do a full redraw instead930*/931var ctx=M.graphCtx;932var width=M.graph.width;933var span=Math.max(4,Math.ceil(width/65));//6;934var height=M.graph.height;935ctx.globalAlpha=1;936if (!full) ctx.drawImage(M.graph,-span,0);937ctx.fillStyle=M.cols.bg;938if (full) ctx.fillRect(0,0,width,height);939else ctx.fillRect(width-span,0,span,height);940ctx.lineWidth=2;941ctx.globalAlpha=1;942943var rows=(full?Math.ceil(width/span):1);944945for (var i=0;i<height/M.graphScale;i+=2)//horizontal lines (1 every 2 units)946{947if (i%10!=0) ctx.fillStyle=M.cols.line1; else ctx.fillStyle=M.cols.line2;948ctx.fillRect(width-span*rows,height-Math.floor(i*M.graphScale),span*rows,1);949}950for (var iR=0;iR<rows;iR++)//vertical lines (1 every 10 ticks)951{952if ((iR-M.ticks)%10!=0) continue;953if ((iR-M.ticks)%60!=0) ctx.fillStyle=M.cols.line1; else ctx.fillStyle=M.cols.line2;954ctx.fillRect(width-span*iR-1,0,1,height);955}956for (var i=0;i<M.goodsById.length+1;i++)957{958//some trickery going on here to always display the M.hoverOnGood bars above the others959var id=i;960if (i==M.goodsById.length) id=M.hoverOnGood;961else if (i==M.hoverOnGood) continue;962if (id==-1) continue;963var me=M.goodsById[id];964if (me.hidden || !me.active) continue;965for (var iR=0;iR<rows;iR++)966{967if (me.vals.length>=(2+iR))968{969var delta=M.goodDelta(me.id,iR);970971if (M.graphLines==0)972{973var min=Math.max(me.vals[0+iR],me.vals[1+iR]);974var max=Math.abs((me.vals[0+iR]-me.vals[1+iR]));975var min2=Math.abs(Math.sin((M.ticks-iR)*11+id*137))*max*2;976var max2=min2+Math.abs(Math.sin((M.ticks-iR)*13+id*139))*max*2;977if (M.hoverOnGood==id)978{979ctx.fillStyle=M.cols.highlight;980ctx.fillRect(width-span*iR-span-1,Math.floor(height-min*M.graphScale)-1,span+1,Math.max(3,Math.ceil(max*M.graphScale))+2);981}982ctx.fillStyle=delta>0?M.cols.high:M.cols.low;983ctx.fillRect(width-span*iR-span,Math.floor(height-min*M.graphScale),span-1,Math.max(3,Math.ceil(max*M.graphScale)));984ctx.fillRect(width-span*iR-span/2-1,Math.floor(height-(min+min2)*M.graphScale),1,Math.max(3,Math.ceil((max+max2)*M.graphScale)));985}986else987{988if (M.hoverOnGood==id)989{990ctx.lineWidth=4;991ctx.strokeStyle=M.cols.highlight;992ctx.beginPath();993ctx.moveTo(width-span*iR-span-1,Math.floor(height-me.vals[1+iR]*M.graphScale)+0.5);994ctx.lineTo(width-span*iR-1,Math.floor(height-me.vals[0+iR]*M.graphScale)+0.5);995ctx.stroke();996ctx.lineWidth=2;997}998ctx.strokeStyle=delta>0?M.cols.high:M.cols.low;999ctx.beginPath();1000ctx.moveTo(width-span*iR-span-1,Math.floor(height-me.vals[1+iR]*M.graphScale)+0.5);1001ctx.lineTo(width-span*iR-1,Math.floor(height-me.vals[0+iR]*M.graphScale)+0.5);1002ctx.stroke();1003}1004}1005}1006}1007}1008M.draw=function()1009{1010//run each draw frame10111012if (Game.drawT%2==0 && M.toRedraw>0 && M.graph && M.graphCtx)1013{1014if (M.lastTickDrawn<M.ticks-1) M.toRedraw=2;1015M.lastTickDrawn=M.ticks;1016M.drawGraph(M.toRedraw==2?true:false);10171018for (var i=0;i<M.goodsById.length;i++)1019{1020var me=M.goodsById[i];1021var val=M.goodDelta(me.id);1022me.symbolNumL.innerHTML=val+''+(val==Math.floor(val)?'.00':(val*10)==Math.floor(val*10)?'0':'')+'%'/*+', '+['stable','slow rise','slow fall','fast rise','fast fall','chaotic'][me.mode]*/;1023if (val>=0) {me.symbolNumL.classList.add('bankSymbolUp');me.symbolNumL.classList.remove('bankSymbolDown');}1024else if (val<0) {me.symbolNumL.classList.remove('bankSymbolUp');me.symbolNumL.classList.add('bankSymbolDown');}1025else {me.symbolNumL.classList.remove('bankSymbolUp');me.symbolNumL.classList.remove('bankSymbolDown');}10261027me.valL.innerHTML='$'+Beautify(me.val,2);1028me.stockL.innerHTML=Beautify(me.stock);1029//if (me.stock>0) me.stockL.style.color='#fff';1030//else me.stockL.style.removeProperty('color');1031if (me.stock>0) me.stockBoxL.classList.add('green');1032else me.stockBoxL.classList.remove('green');1033me.stockMaxL.innerHTML='/'+Beautify(M.getGoodMaxStock(me));10341035me.graphIconL.style.transform='translate(-8px,'+Math.floor((M.graph.height-me.vals[0]*M.graphScale))+'px) scale(0.5)';1036}1037M.toRedraw=0;1038}1039if (Game.drawT%10==0)1040{1041var office=M.offices[M.officeLevel];1042l('bankOfficeIcon').style.backgroundPosition=(-office.icon[0]*48)+'px '+(-office.icon[1]*48)+'px';1043l('bankOfficeName').innerHTML=office.name;1044l('bankOfficeUpgrade').innerHTML='Upgrade ('+office.cost[0]+' cursors)';1045if (!office.cost) l('bankOfficeUpgrade').style.display='none';1046else1047{1048l('bankOfficeUpgrade').style.removeProperty('display');1049if (Game.Objects['Cursor'].amount>=office.cost[0] && Game.Objects['Cursor'].level>=office.cost[1]) l('bankOfficeUpgrade').classList.remove('bankButtonOff');1050else l('bankOfficeUpgrade').classList.add('bankButtonOff');1051}1052l('bankBrokersText').innerHTML=M.brokers==0?'no brokers':M.brokers==1?'1 broker':(M.brokers+' brokers');1053if (M.brokers<M.getMaxBrokers() && Game.cookies>=M.getBrokerPrice()) l('bankBrokersBuy').classList.remove('bankButtonOff');1054else l('bankBrokersBuy').classList.add('bankButtonOff');10551056if (M.officeLevel<=1) l('bankLoan1').style.display='none';1057else l('bankLoan1').style.removeProperty('display');1058if (M.officeLevel<=3) l('bankLoan2').style.display='none';1059else l('bankLoan2').style.removeProperty('display');1060if (M.officeLevel<=4) l('bankLoan3').style.display='none';1061else l('bankLoan3').style.removeProperty('display');10621063for (var id=1;id<4;id++)1064{1065if (Game.hasBuff('Loan '+id) || Game.hasBuff('Loan '+id+' (interest)')) l('bankLoan'+id).classList.add('bankButtonOff');1066else l('bankLoan'+id).classList.remove('bankButtonOff');1067}10681069var it=l('bankBalance');1070it.innerHTML=(M.profit<0?'-':'')+'$'+Beautify(Math.abs(M.profit),2);1071if (M.profit>0) {it.classList.add('bankSymbolUp');it.classList.remove('bankSymbolDown');}1072else if (M.profit<0) {it.classList.add('bankSymbolDown');it.classList.remove('bankSymbolUp');}10731074l('bankNextTick').innerHTML='Next tick in '+Game.sayTime((Game.fps*M.secondsPerTick)-M.tickT+30,-1)+'.';1075}1076}1077M.init(l('rowSpecial'+M.parent.id));1078}1079var M=0;10801081