Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
titaniumnetwork-dev
GitHub Repository: titaniumnetwork-dev/Incognito-old
Path: blob/main/static/src/gs/public/cookie/main.js
1324 views
1
/*
2
All this code is copyright Orteil, 2013-2019.
3
-with some help, advice and fixes by Nicholas Laux, Debugbro, Opti, and lots of people on reddit, Discord, and the DashNet forums
4
-also includes a bunch of snippets found on stackoverflow.com and others
5
Hello, and welcome to the joyous mess that is main.js. Code contained herein is not guaranteed to be good, consistent, or sane. Most of this is years old at this point and harkens back to simpler, cruder times. Have a nice trip.
6
Spoilers ahead.
7
http://orteil.dashnet.org
8
*/
9
10
var VERSION=2.022;
11
var BETA=0;
12
13
14
/*=====================================================================================
15
MISC HELPER FUNCTIONS
16
=======================================================================================*/
17
function l(what) {return document.getElementById(what);}
18
function choose(arr) {return arr[Math.floor(Math.random()*arr.length)];}
19
20
function escapeRegExp(str){return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");}
21
function replaceAll(find,replace,str){return str.replace(new RegExp(escapeRegExp(find),'g'),replace);}
22
23
//disable sounds coming from soundjay.com (sorry)
24
var realAudio=Audio;//backup real audio
25
Audio=function(src){
26
if (src && src.indexOf('soundjay')>-1) {Game.Popup('Sorry, no sounds hotlinked from soundjay.com.');this.play=function(){};}
27
else return new realAudio(src);
28
};
29
30
if(!Array.prototype.indexOf) {
31
Array.prototype.indexOf = function(needle) {
32
for(var i = 0; i < this.length; i++) {
33
if(this[i] === needle) {return i;}
34
}
35
return -1;
36
};
37
}
38
39
function randomFloor(x) {if ((x%1)<Math.random()) return Math.floor(x); else return Math.ceil(x);}
40
41
function shuffle(array)
42
{
43
var counter = array.length, temp, index;
44
// While there are elements in the array
45
while (counter--)
46
{
47
// Pick a random index
48
index = (Math.random() * counter) | 0;
49
50
// And swap the last element with it
51
temp = array[counter];
52
array[counter] = array[index];
53
array[index] = temp;
54
}
55
return array;
56
}
57
58
var sinArray=[];
59
for (var i=0;i<360;i++)
60
{
61
//let's make a lookup table
62
sinArray[i]=Math.sin(i/360*Math.PI*2);
63
}
64
function quickSin(x)
65
{
66
//oh man this isn't all that fast actually
67
//why do I do this. why
68
var sign=x<0?-1:1;
69
return sinArray[Math.round(
70
(Math.abs(x)*360/Math.PI/2)%360
71
)]*sign;
72
}
73
74
/*function ajax(url,callback){
75
var ajaxRequest;
76
try{ajaxRequest = new XMLHttpRequest();} catch (e){try{ajaxRequest=new ActiveXObject('Msxml2.XMLHTTP');} catch (e) {try{ajaxRequest=new ActiveXObject('Microsoft.XMLHTTP');} catch (e){alert("Something broke!");return false;}}}
77
if (callback){ajaxRequest.onreadystatechange=function(){if(ajaxRequest.readyState==4){callback(ajaxRequest.responseText);}}}
78
ajaxRequest.open('GET',url+'&nocache='+(new Date().getTime()),true);ajaxRequest.send(null);
79
}*/
80
81
var ajax=function(url,callback)
82
{
83
var httpRequest=new XMLHttpRequest();
84
if (!httpRequest){return false;}
85
httpRequest.onreadystatechange=function()
86
{
87
try{
88
if (httpRequest.readyState===XMLHttpRequest.DONE && httpRequest.status===200)
89
{
90
callback(httpRequest.responseText);
91
}
92
}catch(e){}
93
}
94
//httpRequest.onerror=function(e){console.log('ERROR',e);}
95
if (url.indexOf('?')==-1) url+='?'; else url+='&';
96
url+='nocache='+Date.now();
97
httpRequest.open('GET',url);
98
httpRequest.setRequestHeader('Content-Type','text/plain');
99
httpRequest.overrideMimeType('text/plain');
100
httpRequest.send();
101
return true;
102
}
103
104
105
//Beautify and number-formatting adapted from the Frozen Cookies add-on (http://cookieclicker.wikia.com/wiki/Frozen_Cookies_%28JavaScript_Add-on%29)
106
function formatEveryThirdPower(notations)
107
{
108
return function (value)
109
{
110
var base = 0,
111
notationValue = '';
112
if (!isFinite(value)) return 'Infinity';
113
if (value >= 1000000)
114
{
115
value /= 1000;
116
while(Math.round(value) >= 1000)
117
{
118
value /= 1000;
119
base++;
120
}
121
if (base >= notations.length) {return 'Infinity';} else {notationValue = notations[base];}
122
}
123
return ( Math.round(value * 1000) / 1000 ) + notationValue;
124
};
125
}
126
127
function rawFormatter(value) {return Math.round(value * 1000) / 1000;}
128
129
var formatLong=[' thousand',' million',' billion',' trillion',' quadrillion',' quintillion',' sextillion',' septillion',' octillion',' nonillion'];
130
var prefixes=['','un','duo','tre','quattuor','quin','sex','septen','octo','novem'];
131
var suffixes=['decillion','vigintillion','trigintillion','quadragintillion','quinquagintillion','sexagintillion','septuagintillion','octogintillion','nonagintillion'];
132
for (var i in suffixes)
133
{
134
for (var ii in prefixes)
135
{
136
formatLong.push(' '+prefixes[ii]+suffixes[i]);
137
}
138
}
139
140
var formatShort=['k','M','B','T','Qa','Qi','Sx','Sp','Oc','No'];
141
var prefixes=['','Un','Do','Tr','Qa','Qi','Sx','Sp','Oc','No'];
142
var suffixes=['D','V','T','Qa','Qi','Sx','Sp','O','N'];
143
for (var i in suffixes)
144
{
145
for (var ii in prefixes)
146
{
147
formatShort.push(' '+prefixes[ii]+suffixes[i]);
148
}
149
}
150
formatShort[10]='Dc';
151
152
153
var numberFormatters =
154
[
155
formatEveryThirdPower(formatShort),
156
formatEveryThirdPower(formatLong),
157
rawFormatter
158
];
159
function Beautify(value,floats)
160
{
161
var negative=(value<0);
162
var decimal='';
163
var fixed=value.toFixed(floats);
164
if (Math.abs(value)<1000 && floats>0 && Math.floor(fixed)!=fixed) decimal='.'+(fixed.toString()).split('.')[1];
165
value=Math.floor(Math.abs(value));
166
if (floats>0 && fixed==value+1) value++;
167
var formatter=numberFormatters[Game.prefs.format?2:1];
168
var output=formatter(value).toString().replace(/\B(?=(\d{3})+(?!\d))/g,',');
169
if (output=='0') negative=false;
170
return negative?'-'+output:output+decimal;
171
}
172
function shortenNumber(value)
173
{
174
//if no scientific notation, return as is, else :
175
//keep only the 5 first digits (plus dot), round the rest
176
//may or may not work properly
177
if (value >= 1000000 && isFinite(value))
178
{
179
var num=value.toString();
180
var ind=num.indexOf('e+');
181
if (ind==-1) return value;
182
var str='';
183
for (var i=0;i<ind;i++)
184
{
185
str+=(i<6?num[i]:'0');
186
}
187
str+='e+';
188
str+=num.split('e+')[1];
189
return parseFloat(str);
190
}
191
return value;
192
}
193
194
195
var beautifyInTextFilter=/(([\d]+[,]*)+)/g;//new regex
196
var a=/\d\d?\d?(?:,\d\d\d)*/g;//old regex
197
function BeautifyInTextFunction(str){return Beautify(parseInt(str.replace(/,/g,''),10));};
198
function BeautifyInText(str) {return str.replace(beautifyInTextFilter,BeautifyInTextFunction);}//reformat every number inside a string
199
function BeautifyAll()//run through upgrades and achievements to reformat the numbers
200
{
201
var func=function(what){what.desc=BeautifyInText(what.baseDesc);}
202
Game.UpgradesById.forEach(func);
203
Game.AchievementsById.forEach(func);
204
}
205
206
//these are faulty, investigate later
207
//function utf8_to_b64(str){return btoa(str);}
208
//function b64_to_utf8(str){return atob(str);}
209
210
function utf8_to_b64( str ) {
211
try{return Base64.encode(unescape(encodeURIComponent( str )));}
212
catch(err)
213
{return '';}
214
}
215
216
function b64_to_utf8( str ) {
217
try{return decodeURIComponent(escape(Base64.decode( str )));}
218
catch(err)
219
{return '';}
220
}
221
222
function CompressBin(arr)//compress a sequence like [0,1,1,0,1,0]... into a number like 54.
223
{
224
var str='';
225
var arr2=arr.slice(0);
226
arr2.unshift(1);
227
arr2.push(1);
228
arr2.reverse();
229
for (var i in arr2)
230
{
231
str+=arr2[i];
232
}
233
str=parseInt(str,2);
234
return str;
235
}
236
237
function UncompressBin(num)//uncompress a number like 54 to a sequence like [0,1,1,0,1,0].
238
{
239
var arr=num.toString(2);
240
arr=arr.split('');
241
arr.reverse();
242
arr.shift();
243
arr.pop();
244
return arr;
245
}
246
247
function CompressLargeBin(arr)//we have to compress in smaller chunks to avoid getting into scientific notation
248
{
249
var arr2=arr.slice(0);
250
var thisBit=[];
251
var bits=[];
252
for (var i in arr2)
253
{
254
thisBit.push(arr2[i]);
255
if (thisBit.length>=50)
256
{
257
bits.push(CompressBin(thisBit));
258
thisBit=[];
259
}
260
}
261
if (thisBit.length>0) bits.push(CompressBin(thisBit));
262
arr2=bits.join(';');
263
return arr2;
264
}
265
266
function UncompressLargeBin(arr)
267
{
268
var arr2=arr.split(';');
269
var bits=[];
270
for (var i in arr2)
271
{
272
bits.push(UncompressBin(parseInt(arr2[i])));
273
}
274
arr2=[];
275
for (var i in bits)
276
{
277
for (var ii in bits[i]) arr2.push(bits[i][ii]);
278
}
279
return arr2;
280
}
281
282
283
function pack(bytes) {
284
var chars = [];
285
var len=bytes.length;
286
for(var i = 0, n = len; i < n;) {
287
chars.push(((bytes[i++] & 0xff) << 8) | (bytes[i++] & 0xff));
288
}
289
return String.fromCharCode.apply(null, chars);
290
}
291
292
function unpack(str) {
293
var bytes = [];
294
var len=str.length;
295
for(var i = 0, n = len; i < n; i++) {
296
var char = str.charCodeAt(i);
297
bytes.push(char >>> 8, char & 0xFF);
298
}
299
return bytes;
300
}
301
302
//modified from http://www.smashingmagazine.com/2011/10/19/optimizing-long-lists-of-yesno-values-with-javascript/
303
function pack2(/* string */ values) {
304
var chunks = values.match(/.{1,14}/g), packed = '';
305
for (var i=0; i < chunks.length; i++) {
306
packed += String.fromCharCode(parseInt('1'+chunks[i], 2));
307
}
308
return packed;
309
}
310
311
function unpack2(/* string */ packed) {
312
var values = '';
313
for (var i=0; i < packed.length; i++) {
314
values += packed.charCodeAt(i).toString(2).substring(1);
315
}
316
return values;
317
}
318
319
function pack3(values){
320
//too many save corruptions, darn it to heck
321
return values;
322
}
323
324
325
//file save function from https://github.com/eligrey/FileSaver.js
326
var saveAs=saveAs||function(view){"use strict";if(typeof navigator!=="undefined"&&/MSIE [1-9]\./.test(navigator.userAgent)){return}var doc=view.document,get_URL=function(){return view.URL||view.webkitURL||view},save_link=doc.createElementNS("http://www.w3.org/1999/xhtml","a"),can_use_save_link="download"in save_link,click=function(node){var event=new MouseEvent("click");node.dispatchEvent(event)},is_safari=/Version\/[\d\.]+.*Safari/.test(navigator.userAgent),webkit_req_fs=view.webkitRequestFileSystem,req_fs=view.requestFileSystem||webkit_req_fs||view.mozRequestFileSystem,throw_outside=function(ex){(view.setImmediate||view.setTimeout)(function(){throw ex},0)},force_saveable_type="application/octet-stream",fs_min_size=0,arbitrary_revoke_timeout=500,revoke=function(file){var revoker=function(){if(typeof file==="string"){get_URL().revokeObjectURL(file)}else{file.remove()}};if(view.chrome){revoker()}else{setTimeout(revoker,arbitrary_revoke_timeout)}},dispatch=function(filesaver,event_types,event){event_types=[].concat(event_types);var i=event_types.length;while(i--){var listener=filesaver["on"+event_types[i]];if(typeof listener==="function"){try{listener.call(filesaver,event||filesaver)}catch(ex){throw_outside(ex)}}}},auto_bom=function(blob){if(/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)){return new Blob(["\ufeff",blob],{type:blob.type})}return blob},FileSaver=function(blob,name,no_auto_bom){if(!no_auto_bom){blob=auto_bom(blob)}var filesaver=this,type=blob.type,blob_changed=false,object_url,target_view,dispatch_all=function(){dispatch(filesaver,"writestart progress write writeend".split(" "))},fs_error=function(){if(target_view&&is_safari&&typeof FileReader!=="undefined"){var reader=new FileReader;reader.onloadend=function(){var base64Data=reader.result;target_view.location.href="data:attachment/file"+base64Data.slice(base64Data.search(/[,;]/));filesaver.readyState=filesaver.DONE;dispatch_all()};reader.readAsDataURL(blob);filesaver.readyState=filesaver.INIT;return}if(blob_changed||!object_url){object_url=get_URL().createObjectURL(blob)}if(target_view){target_view.location.href=object_url}else{var new_tab=view.open(object_url,"_blank");if(new_tab==undefined&&is_safari){view.location.href=object_url}}filesaver.readyState=filesaver.DONE;dispatch_all();revoke(object_url)},abortable=function(func){return function(){if(filesaver.readyState!==filesaver.DONE){return func.apply(this,arguments)}}},create_if_not_found={create:true,exclusive:false},slice;filesaver.readyState=filesaver.INIT;if(!name){name="download"}if(can_use_save_link){object_url=get_URL().createObjectURL(blob);setTimeout(function(){save_link.href=object_url;save_link.download=name;click(save_link);dispatch_all();revoke(object_url);filesaver.readyState=filesaver.DONE});return}if(view.chrome&&type&&type!==force_saveable_type){slice=blob.slice||blob.webkitSlice;blob=slice.call(blob,0,blob.size,force_saveable_type);blob_changed=true}if(webkit_req_fs&&name!=="download"){name+=".download"}if(type===force_saveable_type||webkit_req_fs){target_view=view}if(!req_fs){fs_error();return}fs_min_size+=blob.size;req_fs(view.TEMPORARY,fs_min_size,abortable(function(fs){fs.root.getDirectory("saved",create_if_not_found,abortable(function(dir){var save=function(){dir.getFile(name,create_if_not_found,abortable(function(file){file.createWriter(abortable(function(writer){writer.onwriteend=function(event){target_view.location.href=file.toURL();filesaver.readyState=filesaver.DONE;dispatch(filesaver,"writeend",event);revoke(file)};writer.onerror=function(){var error=writer.error;if(error.code!==error.ABORT_ERR){fs_error()}};"writestart progress write abort".split(" ").forEach(function(event){writer["on"+event]=filesaver["on"+event]});writer.write(blob);filesaver.abort=function(){writer.abort();filesaver.readyState=filesaver.DONE};filesaver.readyState=filesaver.WRITING}),fs_error)}),fs_error)};dir.getFile(name,{create:false},abortable(function(file){file.remove();save()}),abortable(function(ex){if(ex.code===ex.NOT_FOUND_ERR){save()}else{fs_error()}}))}),fs_error)}),fs_error)},FS_proto=FileSaver.prototype,saveAs=function(blob,name,no_auto_bom){return new FileSaver(blob,name,no_auto_bom)};if(typeof navigator!=="undefined"&&navigator.msSaveOrOpenBlob){return function(blob,name,no_auto_bom){if(!no_auto_bom){blob=auto_bom(blob)}return navigator.msSaveOrOpenBlob(blob,name||"download")}}FS_proto.abort=function(){var filesaver=this;filesaver.readyState=filesaver.DONE;dispatch(filesaver,"abort")};FS_proto.readyState=FS_proto.INIT=0;FS_proto.WRITING=1;FS_proto.DONE=2;FS_proto.error=FS_proto.onwritestart=FS_proto.onprogress=FS_proto.onwrite=FS_proto.onabort=FS_proto.onerror=FS_proto.onwriteend=null;return saveAs}(typeof self!=="undefined"&&self||typeof window!=="undefined"&&window||this.content);if(typeof module!=="undefined"&&module.exports){module.exports.saveAs=saveAs}else if(typeof define!=="undefined"&&define!==null&&define.amd!=null){define([],function(){return saveAs})}
327
328
329
//seeded random function, courtesy of http://davidbau.com/archives/2010/01/30/random_seeds_coded_hints_and_quintillions.html
330
(function(a,b,c,d,e,f){function k(a){var b,c=a.length,e=this,f=0,g=e.i=e.j=0,h=e.S=[];for(c||(a=[c++]);d>f;)h[f]=f++;for(f=0;d>f;f++)h[f]=h[g=j&g+a[f%c]+(b=h[f])],h[g]=b;(e.g=function(a){for(var b,c=0,f=e.i,g=e.j,h=e.S;a--;)b=h[f=j&f+1],c=c*d+h[j&(h[f]=h[g=j&g+b])+(h[g]=b)];return e.i=f,e.j=g,c})(d)}function l(a,b){var e,c=[],d=(typeof a)[0];if(b&&"o"==d)for(e in a)try{c.push(l(a[e],b-1))}catch(f){}return c.length?c:"s"==d?a:a+"\0"}function m(a,b){for(var d,c=a+"",e=0;c.length>e;)b[j&e]=j&(d^=19*b[j&e])+c.charCodeAt(e++);return o(b)}function n(c){try{return a.crypto.getRandomValues(c=new Uint8Array(d)),o(c)}catch(e){return[+new Date,a,a.navigator.plugins,a.screen,o(b)]}}function o(a){return String.fromCharCode.apply(0,a)}var g=c.pow(d,e),h=c.pow(2,f),i=2*h,j=d-1;c.seedrandom=function(a,f){var j=[],p=m(l(f?[a,o(b)]:0 in arguments?a:n(),3),j),q=new k(j);return m(o(q.S),b),c.random=function(){for(var a=q.g(e),b=g,c=0;h>a;)a=(a+c)*d,b*=d,c=q.g(1);for(;a>=i;)a/=2,b/=2,c>>>=1;return(a+c)/b},p},m(c.random(),b)})(this,[],Math,256,6,52);
331
332
function bind(scope,fn)
333
{
334
//use : bind(this,function(){this.x++;}) - returns a function where "this" refers to the scoped this
335
return function() {fn.apply(scope,arguments);};
336
}
337
338
var grabProps=function(arr,prop)
339
{
340
if (!arr) return [];
341
arr2=[];
342
for (var i=0;i<arr.length;i++)
343
{
344
arr2.push(arr[i][prop]);
345
}
346
return arr2;
347
}
348
349
CanvasRenderingContext2D.prototype.fillPattern=function(img,X,Y,W,H,iW,iH,offX,offY)
350
{
351
//for when built-in patterns aren't enough
352
if (img.alt!='blank')
353
{
354
var offX=offX||0;
355
var offY=offY||0;
356
if (offX<0) {offX=offX-Math.floor(offX/iW)*iW;} if (offX>0) {offX=(offX%iW)-iW;}
357
if (offY<0) {offY=offY-Math.floor(offY/iH)*iH;} if (offY>0) {offY=(offY%iH)-iH;}
358
for (var y=offY;y<H;y+=iH){for (var x=offX;x<W;x+=iW){this.drawImage(img,X+x,Y+y,iW,iH);}}
359
}
360
}
361
362
var OldCanvasDrawImage=CanvasRenderingContext2D.prototype.drawImage;
363
CanvasRenderingContext2D.prototype.drawImage=function()
364
{
365
//only draw the image if it's loaded
366
if (arguments[0].alt!='blank') OldCanvasDrawImage.apply(this,arguments);
367
}
368
369
370
if (!document.hasFocus) document.hasFocus=function(){return document.hidden;};//for Opera
371
372
function AddEvent(html_element, event_name, event_function)
373
{
374
if(html_element.attachEvent) html_element.attachEvent("on" + event_name, function() {event_function.call(html_element);});
375
else if(html_element.addEventListener) html_element.addEventListener(event_name, event_function, false);
376
}
377
378
function FireEvent(el, etype)
379
{
380
if (el.fireEvent)
381
{el.fireEvent('on'+etype);}
382
else
383
{
384
var evObj=document.createEvent('Events');
385
evObj.initEvent(etype,true,false);
386
el.dispatchEvent(evObj);
387
}
388
}
389
390
var Loader=function()//asset-loading system
391
{
392
this.loadingN=0;
393
this.assetsN=0;
394
this.assets=[];
395
this.assetsLoading=[];
396
this.assetsLoaded=[];
397
this.domain='';
398
this.loaded=0;//callback
399
this.doneLoading=0;
400
401
this.blank=document.createElement('canvas');
402
this.blank.width=8;
403
this.blank.height=8;
404
this.blank.alt='blank';
405
406
this.Load=function(assets)
407
{
408
for (var i in assets)
409
{
410
this.loadingN++;
411
this.assetsN++;
412
if (!this.assetsLoading[assets[i]] && !this.assetsLoaded[assets[i]])
413
{
414
var img=new Image();
415
img.src=this.domain+assets[i];
416
img.alt=assets[i];
417
img.onload=bind(this,this.onLoad);
418
this.assets[assets[i]]=img;
419
this.assetsLoading.push(assets[i]);
420
}
421
}
422
}
423
this.Replace=function(old,newer)
424
{
425
if (this.assets[old])
426
{
427
var img=new Image();
428
if (newer.indexOf('http')!=-1) img.src=newer;
429
else img.src=this.domain+newer;
430
img.alt=newer;
431
img.onload=bind(this,this.onLoad);
432
this.assets[old]=img;
433
}
434
}
435
this.onLoadReplace=function()
436
{
437
}
438
this.onLoad=function(e)
439
{
440
this.assetsLoaded.push(e.target.alt);
441
this.assetsLoading.splice(this.assetsLoading.indexOf(e.target.alt),1);
442
this.loadingN--;
443
if (this.doneLoading==0 && this.loadingN<=0 && this.loaded!=0)
444
{
445
this.doneLoading=1;
446
this.loaded();
447
}
448
}
449
this.getProgress=function()
450
{
451
return (1-this.loadingN/this.assetsN);
452
}
453
}
454
455
var Pic=function(what)
456
{
457
if (Game.Loader.assetsLoaded.indexOf(what)!=-1) return Game.Loader.assets[what];
458
else if (Game.Loader.assetsLoading.indexOf(what)==-1) Game.Loader.Load([what]);
459
return Game.Loader.blank;
460
}
461
462
var Sounds=[];
463
var OldPlaySound=function(url,vol)
464
{
465
var volume=1;
466
if (vol!==undefined) volume=vol;
467
if (!Game.volume || volume==0) return 0;
468
if (!Sounds[url]) {Sounds[url]=new Audio(url);Sounds[url].onloadeddata=function(e){e.target.volume=Math.pow(volume*Game.volume/100,2);}}
469
else if (Sounds[url].readyState>=2) {Sounds[url].currentTime=0;Sounds[url].volume=Math.pow(volume*Game.volume/100,2);}
470
Sounds[url].play();
471
}
472
var SoundInsts=[];
473
var SoundI=0;
474
for (var i=0;i<12;i++){SoundInsts[i]=new Audio();}
475
var pitchSupport=false;
476
//note : Chrome turns out to not support webkitPreservesPitch despite the specifications claiming otherwise, and Firefox clips some short sounds when changing playbackRate, so i'm turning the feature off completely until browsers get it together
477
//if (SoundInsts[0].preservesPitch || SoundInsts[0].mozPreservesPitch || SoundInsts[0].webkitPreservesPitch) pitchSupport=true;
478
479
var PlaySound=function(url,vol,pitchVar)
480
{
481
//url : the url of the sound to play (will be cached so it only loads once)
482
//vol : volume between 0 and 1 (multiplied by game volume setting); defaults to 1 (full volume)
483
//(DISABLED) pitchVar : pitch variance in browsers that support it (Firefox only at the moment); defaults to 0.05 (which means pitch can be up to -5% or +5% anytime the sound plays)
484
var volume=1;
485
var pitchVar=(typeof pitchVar==='undefined')?0.05:pitchVar;
486
var rate=1+(Math.random()*2-1)*pitchVar;
487
if (typeof vol!=='undefined') volume=vol;
488
if (!Game.volume || volume==0) return 0;
489
if (!Sounds[url])
490
{
491
//sound isn't loaded, cache it
492
Sounds[url]=new Audio(url);
493
Sounds[url].onloadeddata=function(e){PlaySound(url,vol,pitchVar);}
494
}
495
else if (Sounds[url].readyState>=2)
496
{
497
var sound=SoundInsts[SoundI];
498
SoundI++;
499
if (SoundI>=12) SoundI=0;
500
sound.src=Sounds[url].src;
501
//sound.currentTime=0;
502
sound.volume=Math.pow(volume*Game.volume/100,2);
503
if (pitchSupport && rate!=0)
504
{
505
sound.preservesPitch=false;
506
sound.mozPreservesPitch=false;
507
sound.webkitPreservesPitch=false;
508
sound.playbackRate=rate;
509
}
510
sound.play();
511
}
512
}
513
514
if (!Date.now){Date.now=function now() {return new Date().getTime();};}
515
516
triggerAnim=function(element,anim)
517
{
518
if (!element) return;
519
element.classList.remove(anim);
520
void element.offsetWidth;
521
element.classList.add(anim);
522
};
523
524
var debugStr='';
525
var Debug=function(what)
526
{
527
if (!debugStr) debugStr=what;
528
else debugStr+='; '+what;
529
}
530
531
var Timer={};
532
Timer.t=Date.now();
533
Timer.labels=[];
534
Timer.smoothed=[];
535
Timer.reset=function()
536
{
537
Timer.labels=[];
538
Timer.t=Date.now();
539
}
540
Timer.track=function(label)
541
{
542
if (!Game.sesame) return;
543
var now=Date.now();
544
if (!Timer.smoothed[label]) Timer.smoothed[label]=0;
545
Timer.smoothed[label]+=((now-Timer.t)-Timer.smoothed[label])*0.1;
546
Timer.labels[label]='<div style="padding-left:8px;">'+label+' : '+Math.round(Timer.smoothed[label])+'ms</div>';
547
Timer.t=now;
548
}
549
Timer.clean=function()
550
{
551
if (!Game.sesame) return;
552
var now=Date.now();
553
Timer.t=now;
554
}
555
Timer.say=function(label)
556
{
557
if (!Game.sesame) return;
558
Timer.labels[label]='<div style="border-top:1px solid #ccc;">'+label+'</div>';
559
}
560
561
562
/*=====================================================================================
563
GAME INITIALIZATION
564
=======================================================================================*/
565
var Game={};
566
567
Game.Launch=function()
568
{
569
Game.version=VERSION;
570
Game.beta=BETA;
571
if (window.location.href.indexOf('/beta')>-1) Game.beta=1;
572
Game.https=(location.protocol!='https:')?false:true;
573
Game.mobile=0;
574
Game.touchEvents=0;
575
//if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) Game.mobile=1;
576
//if (Game.mobile) Game.touchEvents=1;
577
//if ('ontouchstart' in document.documentElement) Game.touchEvents=1;
578
579
var css=document.createElement('style');
580
css.type='text/css';
581
css.innerHTML='body .icon,body .crate,body .usesIcon{background-image:url(img/icons.png?v='+Game.version+');}';
582
document.head.appendChild(css);
583
584
Game.baseSeason='';//halloween, christmas, valentines, fools, easter
585
//automatic season detection (might not be 100% accurate)
586
var day=Math.floor((new Date()-new Date(new Date().getFullYear(),0,0))/(1000*60*60*24));
587
if (day>=41 && day<=46) Game.baseSeason='valentines';
588
else if (day>=90 && day<=92) Game.baseSeason='fools';
589
else if (day>=304-7 && day<=304) Game.baseSeason='halloween';
590
else if (day>=349 && day<=365) Game.baseSeason='christmas';
591
else
592
{
593
//easter is a pain goddamn
594
var easterDay=function(Y){var C = Math.floor(Y/100);var N = Y - 19*Math.floor(Y/19);var K = Math.floor((C - 17)/25);var I = C - Math.floor(C/4) - Math.floor((C - K)/3) + 19*N + 15;I = I - 30*Math.floor((I/30));I = I - Math.floor(I/28)*(1 - Math.floor(I/28)*Math.floor(29/(I + 1))*Math.floor((21 - N)/11));var J = Y + Math.floor(Y/4) + I + 2 - C + Math.floor(C/4);J = J - 7*Math.floor(J/7);var L = I - J;var M = 3 + Math.floor((L + 40)/44);var D = L + 28 - 31*Math.floor(M/4);return new Date(Y,M-1,D);}(new Date().getFullYear());
595
easterDay=Math.floor((easterDay-new Date(easterDay.getFullYear(),0,0))/(1000*60*60*24));
596
if (day>=easterDay-7 && day<=easterDay) Game.baseSeason='easter';
597
}
598
599
Game.updateLog=
600
'<div class="selectable">'+
601
'<div class="section">Info</div>'+
602
'<div class="subsection">'+
603
'<div class="title">About</div>'+
604
'<div class="listing">Cookie Clicker is a javascript game by <a href="http://orteil.dashnet.org" target="_blank">Orteil</a> and <a href="http://dashnet.org" target="_blank">Opti</a>.</div>'+
605
//'<div class="listing">We have an <a href="https://discordapp.com/invite/cookie" target="_blank">official Discord</a>, as well as a <a href="http://forum.dashnet.org" target="_blank">forum</a>; '+
606
'<div class="listing">We have an <a href="https://discordapp.com/invite/cookie" target="_blank">official Discord</a>; '+
607
'if you\'re looking for help, you may also want to visit the <a href="http://www.reddit.com/r/CookieClicker" target="_blank">subreddit</a> '+
608
'or the <a href="http://cookieclicker.wikia.com/wiki/Cookie_Clicker_Wiki" target="_blank">wiki</a>.</div>'+
609
'<div class="listing">News and teasers are usually posted on my <a href="http://orteil42.tumblr.com/" target="_blank">tumblr</a> and <a href="http://twitter.com/orteil42" target="_blank">twitter</a>.</div>'+
610
'<div class="listing" id="supportSection"><b style="color:#fff;opacity:1;">Cookie Clicker is 100% free, forever.</b> Want to support us so we can keep developing games? Here\'s some ways you can help :<div style="margin:4px 12px;line-height:150%;">'+
611
'<br>&bull; support us on <a href="https://www.patreon.com/dashnet" target="_blank" class="highlightHover" style="background:#f86754;box-shadow:0px 0px 0px 1px #c52921 inset,0px 2px 0px #ff966d inset;text-shadow:0px -1px 0px #ff966d,0px 1px 0px #c52921;text-decoration:none;color:#fff;font-weight:bold;padding:1px 4px;">Patreon</a> <span style="opacity:0.5;">(there\'s perks!)</span>'+
612
'<br>&bull; <form target="_blank" action="https://www.paypal.com/cgi-bin/webscr" method="post" id="donate"><input type="hidden" name="cmd" value="_s-xclick"><input type="hidden" name="hosted_button_id" value="BBN2WL3TC6QH4"><input type="submit" id="donateButton" value="donate" name="submit" alt="PayPal — The safer, easier way to pay online."><img alt="" border="0" src="https://www.paypalobjects.com/nl_NL/i/scr/pixel.gif" width="1" height="1"></form> to our PayPal'+
613
'<br>&bull; disable your adblocker<br>&bull; check out our <a href="http://www.redbubble.com/people/dashnet" target="_blank">rad cookie shirts, hoodies and stickers</a>!<br>&bull; (if you want!)</div></div>'+
614
'<div class="listing warning">Note : if you find a new bug after an update and you\'re using a 3rd-party add-on, make sure it\'s not just your add-on causing it!</div>'+
615
'<div class="listing warning">Warning : clearing your browser cache or cookies <small>(what else?)</small> will result in your save being wiped. Export your save and back it up first!</div>'+
616
617
'</div><div class="subsection">'+
618
'<div class="title">Version history</div>'+
619
620
'</div><div class="subsection update">'+
621
'<div class="title">28/09/2019 - going off-script</div>'+
622
'<div class="listing">&bull; added a new building</div>'+
623
'<div class="listing">&bull; added fortune cookies (a new heavenly upgrade)</div>'+
624
'<div class="listing">&bull; more upgrades, achievements etc</div>'+
625
'<div class="listing">&bull; updated the Russian bread cookies icon to better reflect their cyrillic origins</div>'+
626
'<div class="listing">&bull; <i style="font-style:italic;">stealth update :</i> the sugar lump refill timeout (not sugar lump growth) now no longer ticks down while the game is closed (this fixes an exploit)</div>'+
627
'<div class="listing">&bull; also released the official Android version of Cookie Clicker, playable <a href="https://play.google.com/store/apps/details?id=org.dashnet.cookieclicker" target="_blank">here</a> (iOS version will come later)</div>'+
628
629
'</div><div class="subsection update small">'+
630
'<div class="title">01/04/2019 - 2.019 (the "this year" update)</div>'+
631
'<div class="listing">&bull; game has been renamed to "Cookie Clicker" to avoid confusion</div>'+
632
'<div class="listing">&bull; can now click the big cookie to generate cookies for free</div>'+
633
'<div class="listing">&bull; removed fall damage</div>'+
634
//'<div class="listing">&bull; fixed various typos : player\'s name is now correctly spelled as "[bakeryName]"</div>'+
635
'<div class="listing">&bull; removed all references to computer-animated movie <i style="font-style:italic;">Hoodwinked!</i> (2005)</div>'+
636
'<div class="listing">&bull; went back in time and invented cookies and computer mice, ensuring Cookie Clicker would one day come to exist</div>'+
637
'<div class="listing">&bull; game now fully compliant with Geneva Conventions</div>'+
638
'<div class="listing">&bull; dropped support for TI-84 version</div>'+
639
'<div class="listing">&bull; released a low-res retro version of the game, playable here : <a href="http://orteil.dashnet.org/experiments/cookie/" target="_blank">orteil.dashnet.org/experiments/cookie</a></div>'+
640
'<div class="listing">&bull; updated version number</div>'+
641
642
'</div><div class="subsection update small">'+
643
'<div class="title">05/03/2019 - cookies for days</div>'+
644
'<div class="listing">&bull; added over 20 new cookies, all previously suggested by our supporters on <a href="https://www.patreon.com/dashnet" target="_blank">Patreon</a></div>'+
645
'<div class="listing">&bull; added 2 heavenly upgrades</div>'+
646
'<div class="listing">&bull; the Golden goose egg now counts as a golden cookie upgrade for Residual luck purposes</div>'+
647
'<div class="listing">&bull; golden sugar lumps now either double your cookies, or give you 24 hours of your CpS, whichever is lowest (previously was doubling cookies with no cap)</div>'+
648
'<div class="listing">&bull; the amount of heralds is now saved with your game, and is used to compute offline CpS the next time the game is loaded; previously, on page load, the offline calculation assumed heralds to be 0</div>'+
649
'<div class="listing">&bull; added a system to counteract the game freezing up (and not baking cookies) after being inactive for a long while on slower computers; instead, this will now trigger sleep mode, during which you still produce cookies as if the game was closed; to enable this feature, use the "Sleep mode timeout" option in the settings</div>'+
650
'<div class="listing">&bull; vaulting upgrades is now done with shift-click, as ctrl-click was posing issues for Mac browsers</div>'+
651
'<div class="listing">&bull; made tooltips for building CpS boosts from synergies hopefully clearer</div>'+
652
'<div class="listing">&bull; fixed an exploit with gambler\'s fever dream working across exports and ascensions</div>'+
653
'<div class="listing">&bull; can now hide tooltips in the garden by keeping the shift key pressed to make it easier to see where you\'re planting</div>'+
654
'<div class="listing">&bull; fixed a bug with golden cookies/reindeer not disappearing properly in some circumstances</div>'+
655
'<div class="listing">&bull; the Dragon\'s Curve aura should now properly make sugar lumps twice as weird</div>'+
656
'<div class="listing">&bull; the ctrl key should less often register incorrectly as pressed</div>'+
657
'<div class="listing">&bull; added a new ad slot in the top-right, as while our playerbase is strong and supportive as ever, our ad revenue sometimes fluctuates badly; we may remove the ad again should our income stabilize</div>'+
658
'<div class="listing">&bull; made a few adjustments to make the game somewhat playable in mobile browsers; it\'s not perfect and can get buggy, but it\'s functional! (you may need to zoom out or scroll around to view the game properly)</div>'+
659
'<div class="listing">&bull; speaking of which, we also got some good progress on the mobile app version (built from scratch for mobile), so stay tuned!</div>'+
660
661
'</div><div class="subsection update">'+
662
'<div class="title">25/10/2018 - feedback loop</div>'+
663
'<div class="listing">&bull; added a new building</div>'+
664
'<div class="listing">&bull; launched our <a href="https://www.patreon.com/dashnet" class="orangeLink" target="_blank">Patreon</a> <span style="font-size:80%;">(the link is orange so you\'ll notice it!)</span></div>'+
665
'<div class="listing">&bull; added a bunch of new heavenly upgrades, one of which ties into our Patreon but benefits everyone (this is still experimental!)</div>'+
666
'<div class="listing">&bull; when hovering over grandmas, you can now see their names and ages</div>'+
667
'<div class="listing">&bull; "make X cookies just from Y" requirements are now higher</div>'+
668
'<div class="listing">&bull; tweaked the prices of some heavenly upgrades to better fit the current cookie economy (it turns out billions of heavenly chips is now very achievable)</div>'+
669
'<div class="listing">&bull; building tooltips now display what % of CpS they contribute through synergy upgrades</div>'+
670
'<div class="listing">&bull; queenbeets now give up to 4% of bank, down from 6%</div>'+
671
'<div class="listing">&bull; among other things, season switches now display how many seasonal upgrades you\'re missing, and permanent upgrade slots now display the name of the slotted upgrade</div>'+
672
'<div class="listing">&bull; season switches have reworked prices</div>'+
673
'<div class="listing">&bull; season switches can now be cancelled by clicking them again</div>'+
674
'<div class="listing">&bull; can no longer accidentally click wrinklers through other elements</div>'+
675
'<div class="listing">&bull; sugar frenzy now triples your CpS for an hour instead of doubling it</div>'+
676
'<div class="listing">&bull; this text is now selectable</div>'+
677
'<div class="listing">&bull; progress on dungeons minigame is still very much ongoing</div>'+
678
679
'</div><div class="subsection update small">'+
680
'<div class="title">08/08/2018 - hey now</div>'+
681
'<div class="listing">&bull; Cookie Clicker somehow turns 5, going against doctors\' most optimistic estimates</div>'+
682
'<div class="listing">&bull; added a new tier of building achievements, all named after Smash Mouth\'s classic 1999 hit "All Star"</div>'+
683
'<div class="listing">&bull; added a new tier of building upgrades, all named after nothing in particular</div>'+
684
'<div class="listing">&bull; <b>to our players :</b> thank you so much for sticking with us all those years and allowing us to keep making the dumbest game known to mankind</div>'+
685
'<div class="listing">&bull; resumed work on the dungeons minigame</div>'+
686
687
'</div><div class="subsection update small">'+
688
'<div class="title">01/08/2018 - buy buy buy</div>'+
689
'<div class="listing">&bull; added a heavenly upgrade that lets you buy all your upgrades instantly</div>'+
690
'<div class="listing">&bull; added a heavenly upgrade that lets you see upgrade tiers (feature was previously removed due to being confusing)</div>'+
691
'<div class="listing">&bull; added a new wrinkler-related heavenly upgrade</div>'+
692
'<div class="listing">&bull; added a new upgrade tier</div>'+
693
'<div class="listing">&bull; added a couple new cookies and achievements</div>'+
694
'<div class="listing">&bull; new "extra buttons" setting; turning it on adds buttons that let you minimize buildings</div>'+
695
'<div class="listing">&bull; new "lump confirmation" setting; turning it on will show a confirmation prompt when you spend sugar lumps</div>'+
696
'<div class="listing">&bull; buildings now sell back for 25% of their current price (down from 50%); Earth Shatterer modified accordingly, now gives back 50% (down from 85%)</div>'+
697
'<div class="listing">&bull; farm soils now unlock correctly based on current amount of farms</div>'+
698
'<div class="listing">&bull; cheapcaps have a new exciting nerf</div>'+
699
'<div class="listing">&bull; wrinklegill spawns a bunch more</div>'+
700
'<div class="listing">&bull; can now ctrl-shift-click on "Harvest all" to only harvest mature, non-immortal plants</div>'+
701
'<div class="listing">&bull; added a new rare type of sugar lump</div>'+
702
703
'</div><div class="subsection update small">'+
704
'<div class="title">20/04/2018 - weeding out some bugs</div>'+
705
'<div class="listing">&bull; golden clovers and wrinklegills should spawn a bit more often</div>'+
706
'<div class="listing">&bull; cronerice matures a lot sooner</div>'+
707
'<div class="listing">&bull; mature elderworts stay mature after reloading</div>'+
708
'<div class="listing">&bull; garden interface occupies space more intelligently</div>'+
709
'<div class="listing">&bull; seed price displays should be better behaved with short numbers disabled</div>'+
710
'<div class="listing">&bull; minigame animations are now turned off if using the "Fancy graphics" option is disabled</div>'+
711
'<div class="listing">&bull; CpS achievement requirements were dialed down a wee tad</div>'+
712
713
'</div><div class="subsection update small">'+
714
'<div class="title">19/04/2018 - garden patch</div>'+
715
'<div class="listing">&bull; upgrades dropped by garden plants now stay unlocked forever (but drop much more rarely)</div>'+
716
'<div class="listing">&bull; garden sugar lump refill now also makes plants spread and mutate 3 times more during the bonus tick</div>'+
717
'<div class="listing">&bull; a few new upgrades</div>'+
718
'<div class="listing">&bull; a couple bug fixes and rephrasings</div>'+
719
720
'</div><div class="subsection update">'+
721
'<div class="title">18/04/2018 - your garden-variety update</div>'+
722
'<div class="listing">&bull; added the garden, a minigame unlocked by having at least level 1 farms</div>'+
723
'<div class="listing">&bull; added a little arrow and a blinky label to signal the game has updated since you last played it (hi!)</div>'+
724
'<div class="listing">&bull; new cookies, milk flavors and achievements</div>'+
725
'<div class="listing">&bull; sugar lumps are now unlocked whenever you\'ve baked at least a billion cookies, instead of on your first ascension</div>'+
726
'<div class="listing">&bull; sugar lump type now saves correctly</div>'+
727
'<div class="listing">&bull; minigame sugar lump refills can now only be done every 15 minutes (timer shared across all minigames)</div>'+
728
'<div class="listing">&bull; CpS achievements now have steeper requirements</div>'+
729
'<div class="listing">&bull; golden cookies now last 5% shorter for every other golden cookie on the screen</div>'+
730
'<div class="listing">&bull; the game now remembers which minigames are closed or open</div>'+
731
'<div class="listing">&bull; added a popup that shows when a season starts (so people won\'t be so confused about "the game looking weird today")</div>'+
732
'<div class="listing">&bull; permanent upgrade slots now show a tooltip for the selected upgrade</div>'+
733
'<div class="listing">&bull; finally fixed the save corruption bug, hopefully</div>'+
734
735
'</div><div class="subsection update small">'+
736
'<div class="title">24/02/2018 - sugar coating</div>'+
737
'<div class="listing">&bull; added link to <a href="https://discordapp.com/invite/cookie" target="_blank">official Discord server</a></div>'+
738
'<div class="listing">&bull; felt weird about pushing an update without content so :</div>'+
739
'<div class="listing">&bull; added a handful of new cookies</div>'+
740
'<div class="listing">&bull; added 3 new heavenly upgrades</div>'+
741
'<div class="listing">&bull; short numbers should now be displayed up to novemnonagintillions</div>'+
742
'<div class="listing">&bull; cookie chains no longer spawn from the Force the Hand of Fate spell</div>'+
743
'<div class="listing">&bull; bigger, better Cookie Clicker content coming later this year</div>'+
744
745
'</div><div class="subsection update">'+
746
'<div class="title">08/08/2017 - 4 more years</div>'+
747
'<div class="listing">&bull; new building : Chancemakers</div>'+
748
'<div class="listing">&bull; new milk, new kittens, new dragon aura, new cookie, new upgrade tier</div>'+
749
'<div class="listing">&bull; buffs no longer affect offline CpS</div>'+
750
'<div class="listing">&bull; Godzamok\'s hunger was made less potent (this is a nerf, very sorry)</div>'+
751
'<div class="listing">&bull; grimoire spell costs and maximum magic work differently</div>'+
752
'<div class="listing">&bull; Spontaneous Edifice has been reworked</div>'+
753
'<div class="listing">&bull; changed unlock levels and prices for some cursor upgrades</div>'+
754
'<div class="listing">&bull; fixed buggy pantheon slots, hopefully</div>'+
755
'<div class="listing">&bull; fixed "Legacy started a long while ago" showing as "a few seconds ago"</div>'+
756
'<div class="listing">&bull; Cookie Clicker just turned 4. Thank you for sticking with us this long!</div>'+
757
758
'</div><div class="subsection update">'+
759
'<div class="title">15/07/2017 - the spiritual update</div>'+
760
'<div class="listing">&bull; implemented sugar lumps, which start coalescing if you\'ve ascended at least once and can be used as currency for special things</div>'+
761
'<div class="listing">&bull; buildings can now level up by using sugar lumps in the main buildings display, permanently boosting their CpS</div>'+
762
'<div class="listing">&bull; added two new features unlocked by levelling up their associated buildings, Temples and Wizard towers; more building-related minigames will be implemented in the future</div>'+
763
'<div class="listing">&bull; active buffs are now saved</div>'+
764
'<div class="listing">&bull; the background selector upgrade is now functional</div>'+
765
'<div class="listing">&bull; the top menu no longer scrolls with the rest</div>'+
766
'<div class="listing">&bull; timespans are written nicer</div>'+
767
'<div class="listing">&bull; Dragonflights now tend to supercede Click frenzies, you will rarely have both at the same time</div>'+
768
'<div class="listing">&bull; some old bugs were phased out and replaced by new ones</div>'+
769
770
'</div><div class="subsection update small">'+
771
'<div class="title">24/07/2016 - golden cookies overhaul</div>'+
772
'<div class="listing">&bull; golden cookies and reindeer now follow a new system involving explicitly defined buffs</div>'+
773
'<div class="listing">&bull; a bunch of new golden cookie effects have been added</div>'+
774
'<div class="listing">&bull; CpS gains from eggs are now multiplicative</div>'+
775
'<div class="listing">&bull; shiny wrinklers are now saved</div>'+
776
'<div class="listing">&bull; reindeer have been rebalanced ever so slightly</div>'+
777
'<div class="listing">&bull; added a new cookie upgrade near the root of the heavenly upgrade tree; this is intended to boost early ascensions and speed up the game as a whole</div>'+
778
'<div class="listing">&bull; due to EU legislation, implemented a warning message regarding browser cookies; do understand that the irony is not lost on us</div>'+
779
780
'</div><div class="subsection update">'+
781
'<div class="title">08/02/2016 - legacy</div>'+
782
'<div class="listing"><b>Everything that was implemented during the almost 2-year-long beta has been added to the live game. To recap :</b></div>'+
783
'<div class="listing">&bull; 3 new buildings : banks, temples, and wizard towers; these have been added in-between existing buildings and as such, may disrupt some building-related achievements</div>'+
784
'<div class="listing">&bull; the ascension system has been redone from scratch, with a new heavenly upgrade tree</div>'+
785
'<div class="listing">&bull; mysterious new features such as angel-powered offline progression, challenge runs, and a cookie dragon</div>'+
786
'<div class="listing">&bull; sounds have been added (can be disabled in the options)</div>'+
787
'<div class="listing">&bull; heaps of rebalancing and bug fixes</div>'+
788
'<div class="listing">&bull; a couple more upgrades and achievements, probably</div>'+
789
'<div class="listing">&bull; fresh new options to further customize your cookie-clicking experience</div>'+
790
'<div class="listing">&bull; quality-of-life improvements : better bulk-buy, better switches etc</div>'+
791
'<div class="listing">&bull; added some <a href="http://en.wikipedia.org/wiki/'+choose(['Krzysztof_Arciszewski','Eustachy_Sanguszko','Maurycy_Hauke','Karol_Turno','Tadeusz_Kutrzeba','Kazimierz_Fabrycy','Florian_Siwicki'])+'" target="_blank">general polish</a></div>'+/* i liked this dumb pun too much to let it go unnoticed */
792
'<div class="listing">&bull; tons of other little things we can\'t even remember right now</div>'+
793
'<div class="listing">Miss the old version? Your old save was automatically exported <a href="http://orteil.dashnet.org/cookieclicker/v10466/" target="_blank">here</a>!</div>'+
794
795
'</div><div class="subsection update small">'+
796
'<div class="title">05/02/2016 - legacy beta, more fixes</div>'+
797
'<div class="listing">&bull; added challenge modes, which can be selected when ascending (only 1 for now : "Born again")</div>'+
798
'<div class="listing">&bull; changed the way bulk-buying and bulk-selling works</div>'+
799
'<div class="listing">&bull; more bugs ironed out</div>'+
800
801
'</div><div class="subsection update">'+
802
'<div class="title">03/02/2016 - legacy beta, part III</div>'+
803
'<div class="listing warning">&bull; Not all bugs have been fixed, but everything should be much less broken.</div>'+
804
'<div class="listing">&bull; Additions'+
805
'<div style="opacity:0.8;margin-left:12px;">'+
806
'-a few more achievements<br>'+
807
'-new option for neat, but slow CSS effects (disabled by default)<br>'+
808
'-new option for a less grating cookie sound (enabled by default)<br>'+
809
'-new option to bring back the boxes around icons in the stats screen<br>'+
810
'-new buttons for saving and loading your game to a text file<br>'+
811
'</div>'+
812
'</div>'+
813
'<div class="listing">&bull; Changes'+
814
'<div style="opacity:0.8;margin-left:12px;">'+
815
'-early game should be a bit faster and very late game was kindly asked to tone it down a tad<br>'+
816
'-dragonflight should be somewhat less ridiculously overpowered<br>'+
817
'-please let me know if the rebalancing was too heavy or not heavy enough<br>'+
818
'-santa and easter upgrades now depend on Santa level and amount of eggs owned, respectively, instead of costing several minutes worth of CpS<br>'+
819
'-cookie upgrades now stack multiplicatively rather than additively<br>'+
820
'-golden switch now gives +50% CpS, and residual luck is +10% CpS per golden cookie upgrade (up from +25% and +1%, respectively)<br>'+
821
'-lucky cookies and cookie chain payouts have been modified a bit, possibly for the better, who knows!<br>'+
822
'-wrinklers had previously been reduced to a maximum of 8 (10 with a heavenly upgrade), but are now back to 10 (12 with the upgrade)<br>'+
823
/*'-all animations are now handled by requestAnimationFrame(), which should hopefully help make the game less resource-intensive<br>'+*/
824
'-an ascension now only counts for achievement purposes if you earned at least 1 prestige level from it<br>'+
825
'-the emblematic Cookie Clicker font (Kavoon) was bugged in Firefox, and has been replaced with a new font (Merriweather)<br>'+
826
'-the mysterious wrinkly creature is now even rarer, but has a shadow achievement tied to it<br>'+
827
'</div>'+
828
'</div>'+
829
'<div class="listing">&bull; Fixes'+
830
'<div style="opacity:0.8;margin-left:12px;">'+
831
'-prestige now grants +1% CpS per level as intended, instead of +100%<br>'+
832
'-heavenly chips should no longer add up like crazy when you ascend<br>'+
833
'-upgrades in the store should no longer randomly go unsorted<br>'+
834
'-window can be resized to any size again<br>'+
835
'-the "Stats" and "Options" buttons have been swapped again<br>'+
836
'-the golden cookie sound should be somewhat clearer<br>'+
837
'-the ascend screen should be less CPU-hungry<br>'+
838
'</div>'+
839
'</div>'+
840
841
'</div><div class="subsection update">'+
842
'<div class="title">20/12/2015 - legacy beta, part II</div>'+
843
'<div class="listing warning">&bull; existing beta saves have been wiped due to format inconsistencies and just plain broken balance; you\'ll have to start over from scratch - which will allow you to fully experience the update and find all the awful little bugs that no doubt plague it</div>'+
844
'<div class="listing warning">&bull; importing your save from the live version is also fine</div>'+
845
'<div class="listing">&bull; we took so long to make this update, Cookie Clicker turned 2 years old in the meantime! Hurray!</div>'+
846
'<div class="listing">&bull; heaps of new upgrades and achievements</div>'+
847
'<div class="listing">&bull; fixed a whole bunch of bugs</div>'+
848
'<div class="listing">&bull; did a lot of rebalancing</div>'+
849
'<div class="listing">&bull; reworked heavenly chips and heavenly cookies (still experimenting, will probably rebalance things further)</div>'+
850
'<div class="listing">&bull; you may now unlock a dragon friend</div>'+
851
'<div class="listing">&bull; switches and season triggers now have their own store section</div>'+
852
'<div class="listing">&bull; ctrl-s and ctrl-o now save the game and open the import menu, respectively</div>'+
853
'<div class="listing">&bull; added some quick sounds, just as a test</div>'+
854
'<div class="listing">&bull; a couple more options</div>'+
855
'<div class="listing">&bull; even more miscellaneous changes and additions</div>'+
856
857
'</div><div class="subsection update">'+
858
'<div class="title">25/08/2014 - legacy beta, part I</div>'+
859
'<div class="listing">&bull; 3 new buildings</div>'+
860
'<div class="listing">&bull; price and CpS curves revamped</div>'+
861
'<div class="listing">&bull; CpS calculations revamped; cookie upgrades now stack multiplicatively</div>'+
862
'<div class="listing">&bull; prestige system redone from scratch, with a whole new upgrade tree</div>'+
863
'<div class="listing">&bull; added some <a href="http://en.wikipedia.org/wiki/'+choose(['Krzysztof_Arciszewski','Eustachy_Sanguszko','Maurycy_Hauke','Karol_Turno','Tadeusz_Kutrzeba','Kazimierz_Fabrycy','Florian_Siwicki'])+'" target="_blank">general polish</a></div>'+
864
'<div class="listing">&bull; tons of other miscellaneous fixes and additions</div>'+
865
'<div class="listing">&bull; Cookie Clicker is now 1 year old! (Thank you guys for all the support!)</div>'+
866
'<div class="listing warning">&bull; Note : this is a beta; you are likely to encounter bugs and oversights. Feel free to send me feedback if you find something fishy!</div>'+
867
868
'</div><div class="subsection update small">'+
869
'<div class="title">18/05/2014 - better late than easter</div>'+
870
'<div class="listing">&bull; bunnies and eggs, somehow</div>'+
871
'<div class="listing">&bull; prompts now have keyboard shortcuts like system prompts would</div>'+
872
'<div class="listing">&bull; naming your bakery? you betcha</div>'+
873
'<div class="listing">&bull; "Fast notes" option to make all notifications close faster; new button to close all notifications</div>'+
874
'<div class="listing">&bull; the dungeons beta is now available on <a href="http://orteil.dashnet.org/cookieclicker/betadungeons" target="_blank">/betadungeons</a></div>'+
875
876
'</div><div class="subsection update small">'+
877
'<div class="title">09/04/2014 - nightmare in heaven</div>'+
878
'<div class="listing">&bull; broke a thing; heavenly chips were corrupted for some people</div>'+
879
'<div class="listing">&bull; will probably update to /beta first in the future</div>'+
880
'<div class="listing">&bull; sorry again</div>'+
881
882
'</div><div class="subsection update small">'+
883
'<div class="title">09/04/2014 - quality of life</div>'+
884
'<div class="listing">&bull; new upgrade and achievement tier</div>'+
885
'<div class="listing">&bull; popups and prompts are much nicer</div>'+
886
'<div class="listing">&bull; tooltips on buildings are more informative</div>'+
887
'<div class="listing">&bull; implemented a simplified version of the <a href="https://github.com/Icehawk78/FrozenCookies" target="_blank">Frozen Cookies</a> add-on\'s short number formatting</div>'+
888
'<div class="listing">&bull; you can now buy 10 and sell all of a building at a time</div>'+
889
'<div class="listing">&bull; tons of optimizations and subtler changes</div>'+
890
'<div class="listing">&bull; you can now <a href="http://orteil.dashnet.org/cookies2cash/" target="_blank">convert your cookies to cash</a>!</div>'+
891
892
'</div><div class="subsection update small">'+
893
'<div class="title">05/04/2014 - pity the fool</div>'+
894
'<div class="listing">&bull; wrinklers should now be saved so you don\'t have to pop them everytime you refresh the game</div>'+
895
'<div class="listing">&bull; you now properly win 1 cookie upon reaching 10 billion cookies and making it on the local news</div>'+
896
'<div class="listing">&bull; miscellaneous fixes and tiny additions</div>'+
897
'<div class="listing">&bull; added a few very rudimentary mod hooks</div>'+
898
'<div class="listing">&bull; the game should work again in Opera</div>'+
899
'<div class="listing">&bull; don\'t forget to check out <a href="http://orteil.dashnet.org/randomgen/" target="_blank">RandomGen</a>, our all-purpose random generator maker!</div>'+
900
901
'</div><div class="subsection update small">'+
902
'<div class="title">01/04/2014 - fooling around</div>'+
903
'<div class="listing">&bull; it\'s about time : Cookie Clicker has turned into the much more realistic Cookie Baker</div>'+
904
'<div class="listing">&bull; season triggers are cheaper and properly unlock again when they run out</div>'+
905
'<div class="listing">&bull; buildings should properly unlock (reminder : building unlocking is completely cosmetic and does not change the gameplay)</div>'+
906
907
'</div><div class="subsection update small">'+
908
'<div class="title">14/02/2014 - lovely rainbowcalypse</div>'+
909
'<div class="listing">&bull; new building (it\'s been a while). More to come!</div>'+
910
'<div class="listing">&bull; you can now trigger seasonal events to your heart\'s content (upgrade unlocks at 5000 heavenly chips)</div>'+
911
'<div class="listing">&bull; new ultra-expensive batch of seasonal cookie upgrades you\'ll love to hate</div>'+
912
'<div class="listing">&bull; new timer bars for golden cookie buffs</div>'+
913
'<div class="listing">&bull; buildings are now hidden when you start out and appear as they become available</div>'+
914
'<div class="listing">&bull; technical stuff : the game is now saved through localstorage instead of browser cookies, therefore ruining a perfectly good pun</div>'+
915
916
'</div><div class="subsection update small">'+
917
'<div class="title">22/12/2013 - merry fixmas</div>'+
918
'<div class="listing">&bull; some issues with the christmas upgrades have been fixed</div>'+
919
'<div class="listing">&bull; reindeer cookie drops are now more common</div>'+
920
'<div class="listing">&bull; reindeers are now reindeer</div>'+
921
922
'</div><div class="subsection update">'+
923
'<div class="title">20/12/2013 - Christmas is here</div>'+
924
'<div class="listing">&bull; there is now a festive new evolving upgrade in store</div>'+
925
'<div class="listing">&bull; reindeer are running amok (catch them if you can!)</div>'+
926
'<div class="listing">&bull; added a new option to warn you when you close the window, so you don\'t lose your un-popped wrinklers</div>'+
927
'<div class="listing">&bull; also added a separate option for displaying cursors</div>'+
928
'<div class="listing">&bull; all the Halloween features are still there (and having the Spooky cookies achievements makes the Halloween cookies drop much more often)</div>'+
929
'<div class="listing">&bull; oh yeah, we now have <a href="http://www.redbubble.com/people/dashnet" target="_blank">Cookie Clicker shirts, stickers and hoodies</a>! (they\'re really rad)</div>'+
930
931
'</div><div class="subsection update small">'+
932
'<div class="title">29/10/2013 - spooky update</div>'+
933
'<div class="listing">&bull; the Grandmapocalypse now spawns wrinklers, hideous elderly creatures that damage your CpS when they reach your big cookie. Thankfully, you can click on them to make them explode (you\'ll even gain back the cookies they\'ve swallowed - with interest!).</div>'+
934
'<div class="listing">&bull; wrath cookie now 27% spookier</div>'+
935
'<div class="listing">&bull; some other stuff</div>'+
936
'<div class="listing">&bull; you should totally go check out <a href="http://candybox2.net/" target="_blank">Candy Box 2</a>, the sequel to the game that inspired Cookie Clicker</div>'+
937
938
'</div><div class="subsection update small">'+
939
'<div class="title">15/10/2013 - it\'s a secret</div>'+
940
'<div class="listing">&bull; added a new heavenly upgrade that gives you 5% of your heavenly chips power for 11 cookies (if you purchased the Heavenly key, you might need to buy it again, sorry)</div>'+
941
'<div class="listing">&bull; golden cookie chains should now work properly</div>'+
942
943
'</div><div class="subsection update small">'+
944
'<div class="title">15/10/2013 - player-friendly</div>'+
945
'<div class="listing">&bull; heavenly upgrades are now way, way cheaper</div>'+
946
'<div class="listing">&bull; tier 5 building upgrades are 5 times cheaper</div>'+
947
'<div class="listing">&bull; cursors now just plain disappear with Fancy Graphics off, I might add a proper option to toggle only the cursors later</div>'+
948
'<div class="listing">&bull; warning : the Cookie Monster add-on seems to be buggy with this update, you might want to wait until its programmer updates it</div>'+
949
950
'</div><div class="subsection update small">'+
951
'<div class="title">15/10/2013 - a couple fixes</div>'+
952
'<div class="listing">&bull; golden cookies should no longer spawn embarrassingly often</div>'+
953
'<div class="listing">&bull; cursors now stop moving if Fancy Graphics is turned off</div>'+
954
955
'</div><div class="subsection update small">'+
956
'<div class="title">14/10/2013 - going for the gold</div>'+
957
'<div class="listing">&bull; golden cookie chains work a bit differently</div>'+
958
'<div class="listing">&bull; golden cookie spawns are more random</div>'+
959
'<div class="listing">&bull; CpS achievements are no longer affected by golden cookie frenzies</div>'+
960
'<div class="listing">&bull; revised cookie-baking achievement requirements</div>'+
961
'<div class="listing">&bull; heavenly chips now require upgrades to function at full capacity</div>'+
962
'<div class="listing">&bull; added 4 more cookie upgrades, unlocked after reaching certain amounts of Heavenly Chips</div>'+
963
'<div class="listing">&bull; speed baking achievements now require you to have no heavenly upgrades; as such, they have been reset for everyone (along with the Hardcore achievement) to better match their initially intended difficulty</div>'+
964
'<div class="listing">&bull; made good progress on the mobile port</div>'+
965
966
'</div><div class="subsection update small">'+
967
'<div class="title">01/10/2013 - smoothing it out</div>'+
968
'<div class="listing">&bull; some visual effects have been completely rewritten and should now run more smoothly (and be less CPU-intensive)</div>'+
969
'<div class="listing">&bull; new upgrade tier</div>'+
970
'<div class="listing">&bull; new milk tier</div>'+
971
'<div class="listing">&bull; cookie chains have different capping mechanics</div>'+
972
'<div class="listing">&bull; antimatter condensers are back to their previous price</div>'+
973
'<div class="listing">&bull; heavenly chips now give +2% CpS again (they will be extensively reworked in the future)</div>'+
974
'<div class="listing">&bull; farms have been buffed a bit (to popular demand)</div>'+
975
'<div class="listing">&bull; dungeons still need a bit more work and will be released soon - we want them to be just right! (you can test an unfinished version in <a href="http://orteil.dashnet.org/cookieclicker/betadungeons/" target="_blank">the beta</a>)</div>'+
976
977
'</div><div class="subsection update">'+
978
'<div class="title">28/09/2013 - dungeon beta</div>'+
979
'<div class="listing">&bull; from now on, big updates will come through a beta stage first (you can <a href="http://orteil.dashnet.org/cookieclicker/betadungeons/" target="_blank">try it here</a>)</div>'+
980
'<div class="listing">&bull; first dungeons! (you need 50 factories to unlock them!)</div>'+
981
'<div class="listing">&bull; cookie chains can be longer</div>'+
982
'<div class="listing">&bull; antimatter condensers are a bit more expensive</div>'+
983
'<div class="listing">&bull; heavenly chips now only give +1% cps each (to account for all the cookies made from condensers)</div>'+
984
'<div class="listing">&bull; added flavor text on all upgrades</div>'+
985
986
'</div><div class="subsection update small">'+
987
'<div class="title">15/09/2013 - anticookies</div>'+
988
'<div class="listing">&bull; ran out of regular matter to make your cookies? Try our new antimatter condensers!</div>'+
989
'<div class="listing">&bull; renamed Hard-reset to "Wipe save" to avoid confusion</div>'+
990
'<div class="listing">&bull; reset achievements are now regular achievements and require cookies baked all time, not cookies in bank</div>'+
991
'<div class="listing">&bull; heavenly chips have been nerfed a bit (and are now awarded following a geometric progression : 1 trillion for the first, 2 for the second, etc); the prestige system will be extensively reworked in a future update (after dungeons)</div>'+
992
'<div class="listing">&bull; golden cookie clicks are no longer reset by soft-resets</div>'+
993
'<div class="listing">&bull; you can now see how long you\'ve been playing in the stats</div>'+
994
995
'</div><div class="subsection update small">'+
996
'<div class="title">08/09/2013 - everlasting cookies</div>'+
997
'<div class="listing">&bull; added a prestige system - resetting gives you permanent CpS boosts (the more cookies made before resetting, the bigger the boost!)</div>'+
998
'<div class="listing">&bull; save format has been slightly modified to take less space</div>'+
999
'<div class="listing">&bull; Leprechaun has been bumped to 777 golden cookies clicked and is now shadow; Fortune is the new 77 golden cookies achievement</div>'+
1000
'<div class="listing">&bull; clicking frenzy is now x777</div>'+
1001
1002
'</div><div class="subsection update small">'+
1003
'<div class="title">04/09/2013 - smarter cookie</div>'+
1004
'<div class="listing">&bull; golden cookies only have 20% chance of giving the same outcome twice in a row now</div>'+
1005
'<div class="listing">&bull; added a golden cookie upgrade</div>'+
1006
'<div class="listing">&bull; added an upgrade that makes pledges last twice as long (requires having pledged 10 times)</div>'+
1007
'<div class="listing">&bull; Quintillion fingers is now twice as efficient</div>'+
1008
'<div class="listing">&bull; Uncanny clicker was really too unpredictable; it is now a regular achievement and no longer requires a world record, just *pretty fast* clicking</div>'+
1009
1010
'</div><div class="subsection update small">'+
1011
'<div class="title">02/09/2013 - a better way out</div>'+
1012
'<div class="listing">&bull; Elder Covenant is even cheaper, and revoking it is cheaper still (also added a new achievement for getting it)</div>'+
1013
'<div class="listing">&bull; each grandma upgrade now requires 15 of the matching building</div>'+
1014
'<div class="listing">&bull; the dreaded bottom cursor has been fixed with a new cursor display style</div>'+
1015
'<div class="listing">&bull; added an option for faster, cheaper graphics</div>'+
1016
'<div class="listing">&bull; base64 encoding has been redone; this might make saving possible again on some older browsers</div>'+
1017
'<div class="listing">&bull; shadow achievements now have their own section</div>'+
1018
'<div class="listing">&bull; raspberry juice is now named raspberry milk, despite raspberry juice being delicious and going unquestionably well with cookies</div>'+
1019
'<div class="listing">&bull; HOTFIX : cursors now click; fancy graphics button renamed; cookies amount now more visible against cursors</div>'+
1020
1021
'</div><div class="subsection update small">'+
1022
'<div class="title">01/09/2013 - sorting things out</div>'+
1023
'<div class="listing">&bull; upgrades and achievements are properly sorted in the stats screen</div>'+
1024
'<div class="listing">&bull; made Elder Covenant much cheaper and less harmful</div>'+
1025
'<div class="listing">&bull; importing from the first version has been disabled, as promised</div>'+
1026
'<div class="listing">&bull; "One mind" now actually asks you to confirm the upgrade</div>'+
1027
1028
'</div><div class="subsection update small">'+
1029
'<div class="title">31/08/2013 - hotfixes</div>'+
1030
'<div class="listing">&bull; added a way to permanently stop the grandmapocalypse</div>'+
1031
'<div class="listing">&bull; Elder Pledge price is now capped</div>'+
1032
'<div class="listing">&bull; One Mind and other grandma research upgrades are now a little more powerful, if not 100% accurate</div>'+
1033
'<div class="listing">&bull; "golden" cookie now appears again during grandmapocalypse; Elder Pledge-related achievements are now unlockable</div>'+
1034
1035
'</div><div class="subsection update">'+
1036
'<div class="title">31/08/2013 - too many grandmas</div>'+
1037
'<div class="listing">&bull; the grandmapocalypse is back, along with more grandma types</div>'+
1038
'<div class="listing">&bull; added some upgrades that boost your clicking power and make it scale with your cps</div>'+
1039
'<div class="listing">&bull; clicking achievements made harder; Neverclick is now a shadow achievement; Uncanny clicker should now truly be a world record</div>'+
1040
1041
'</div><div class="subsection update small">'+
1042
'<div class="title">28/08/2013 - over-achiever</div>'+
1043
'<div class="listing">&bull; added a few more achievements</div>'+
1044
'<div class="listing">&bull; reworked the "Bake X cookies" achievements so they take longer to achieve</div>'+
1045
1046
'</div><div class="subsection update small">'+
1047
'<div class="title">27/08/2013 - a bad idea</div>'+
1048
'<div class="listing">&bull; due to popular demand, retired 5 achievements (the "reset your game" and "cheat" ones); they can still be unlocked, but do not count toward your total anymore. Don\'t worry, there will be many more achievements soon!</div>'+
1049
'<div class="listing">&bull; made some achievements hidden for added mystery</div>'+
1050
1051
'</div><div class="subsection update">'+
1052
'<div class="title">27/08/2013 - a sense of achievement</div>'+
1053
'<div class="listing">&bull; added achievements (and milk)</div>'+
1054
'<div class="listing"><i>(this is a big update, please don\'t get too mad if you lose some data!)</i></div>'+
1055
1056
'</div><div class="subsection update small">'+
1057
'<div class="title">26/08/2013 - new upgrade tier</div>'+
1058
'<div class="listing">&bull; added some more upgrades (including a couple golden cookie-related ones)</div>'+
1059
'<div class="listing">&bull; added clicking stats</div>'+
1060
1061
'</div><div class="subsection update small">'+
1062
'<div class="title">26/08/2013 - more tweaks</div>'+
1063
'<div class="listing">&bull; tweaked a couple cursor upgrades</div>'+
1064
'<div class="listing">&bull; made time machines less powerful</div>'+
1065
'<div class="listing">&bull; added offline mode option</div>'+
1066
1067
'</div><div class="subsection update small">'+
1068
'<div class="title">25/08/2013 - tweaks</div>'+
1069
'<div class="listing">&bull; rebalanced progression curve (mid- and end-game objects cost more and give more)</div>'+
1070
'<div class="listing">&bull; added some more cookie upgrades</div>'+
1071
'<div class="listing">&bull; added CpS for cursors</div>'+
1072
'<div class="listing">&bull; added sell button</div>'+
1073
'<div class="listing">&bull; made golden cookie more useful</div>'+
1074
1075
'</div><div class="subsection update small">'+
1076
'<div class="title">24/08/2013 - hotfixes</div>'+
1077
'<div class="listing">&bull; added import/export feature, which also allows you to retrieve a save game from the old version (will be disabled in a week to prevent too much cheating)</div>'+
1078
'<div class="listing">&bull; upgrade store now has unlimited slots (just hover over it), due to popular demand</div>'+
1079
'<div class="listing">&bull; added update log</div>'+
1080
1081
'</div><div class="subsection update">'+
1082
'<div class="title">24/08/2013 - big update!</div>'+
1083
'<div class="listing">&bull; revamped the whole game (new graphics, new game mechanics)</div>'+
1084
'<div class="listing">&bull; added upgrades</div>'+
1085
'<div class="listing">&bull; much safer saving</div>'+
1086
1087
'</div><div class="subsection update">'+
1088
'<div class="title">08/08/2013 - game launch</div>'+
1089
'<div class="listing">&bull; made the game in a couple hours, for laughs</div>'+
1090
'<div class="listing">&bull; kinda starting to regret it</div>'+
1091
'<div class="listing">&bull; ah well</div>'+
1092
'</div>'+
1093
'</div>'
1094
;
1095
1096
Game.ready=0;
1097
1098
Game.Load=function()
1099
{
1100
//l('javascriptError').innerHTML='<div style="padding:64px 128px;"><div class="title">Loading...</div></div>';
1101
Game.Loader=new Loader();
1102
Game.Loader.domain='img/';
1103
Game.Loader.loaded=Game.Init;
1104
Game.Loader.Load(['filler.png']);
1105
}
1106
Game.ErrorFrame=function()
1107
{
1108
Game.Loader=new Loader();
1109
Game.Loader.domain='img/';
1110
Game.Loader.loaded=Game.Init;
1111
Game.Loader.Load(['filler.png']);
1112
}
1113
Game.timedout=false;
1114
Game.Timeout=function()
1115
{
1116
Game.WriteSave();
1117
Game.killShimmers();
1118
l('javascriptError').innerHTML='Cookie Clicker is in sleep mode'+(Game.Has('Twin Gates of Transcendence')?' and generating offline cookies':'')+'.<br><a '+Game.clickStr+'="Game.Resume();">Click here</a> to resume from your save file.<br><div style="font-style:italic;font-size:65%;line-height:110%;opacity:0.75;">(this happens when too many frames are skipped at once,<br>usually when the game has been running in the background for a while)<br>(you can turn this feature off in the settings menu)</div>';
1119
l('javascriptError').style.display='block';
1120
Game.timedout=true;
1121
console.log('[=== Game timed out and has been put in sleep mode. Data was saved. ===]');
1122
}
1123
Game.Resume=function()
1124
{
1125
l('javascriptError').innerHTML='';
1126
l('javascriptError').style.display='none';
1127
Game.timedout=false;
1128
Game.time=Date.now();
1129
Game.accumulatedDelay=0;
1130
Game.delayTimeouts=0;
1131
Game.lastActivity=Date.now();
1132
Game.Loop();
1133
Game.LoadSave();
1134
console.log('[=== Game resumed! Data was loaded. ===]');
1135
}
1136
1137
1138
Game.Init=function()
1139
{
1140
Game.ready=1;
1141
1142
/*=====================================================================================
1143
VARIABLES AND PRESETS
1144
=======================================================================================*/
1145
Game.T=0;
1146
Game.drawT=0;
1147
Game.loopT=0;
1148
Game.fps=30;
1149
1150
Game.season=Game.baseSeason;
1151
1152
Game.l=l('game');
1153
Game.bounds=0;//rectangle defining screen limits (right,left,bottom,top) updated every logic frame
1154
1155
if (Game.mobile==1)
1156
{
1157
l('wrapper').className='mobile';
1158
}
1159
Game.clickStr=Game.touchEvents?'ontouchend':'onclick';
1160
1161
Game.SaveTo='CookieClickerGame';
1162
if (Game.beta) Game.SaveTo='CookieClickerGameBeta';
1163
l('versionNumber').innerHTML='v. '+Game.version+'<div id="httpsSwitch" style="cursor:pointer;display:inline-block;background:url(img/'+(Game.https?'lockOn':'lockOff')+'.png);width:16px;height:16px;position:relative;top:4px;left:0px;margin:0px -2px;"></div>'+(Game.beta?' <span style="color:#ff0;">beta</span>':'');
1164
1165
if (Game.beta) {var me=l('linkVersionBeta');me.parentNode.removeChild(me);}
1166
else if (Game.version==1.0466) {var me=l('linkVersionOld');me.parentNode.removeChild(me);}
1167
else {var me=l('linkVersionLive');me.parentNode.removeChild(me);}
1168
1169
//l('links').innerHTML=(Game.beta?'<a href="../" target="blank">Live version</a> | ':'<a href="beta" target="blank">Try the beta!</a> | ')+'<a href="http://orteil.dashnet.org/experiments/cookie/" target="blank">Classic</a>';
1170
//l('links').innerHTML='<a href="http://orteil.dashnet.org/experiments/cookie/" target="blank">Cookie Clicker Classic</a>';
1171
1172
Game.lastActivity=Date.now();//reset on mouse move, key press or click
1173
1174
//latency compensator stuff
1175
Game.time=Date.now();
1176
Game.accumulatedDelay=0;
1177
Game.delayTimeouts=0;//how many times we've gone over the timeout delay
1178
Game.catchupLogic=0;
1179
Game.fpsStartTime=0;
1180
Game.frameNumber=0;
1181
Game.currentFps=Game.fps;
1182
Game.previousFps=Game.currentFps;
1183
Game.getFps=function()
1184
{
1185
Game.frameNumber++;
1186
var currentTime=(Date.now()-Game.fpsStartTime )/1000;
1187
var result=Math.floor((Game.frameNumber/currentTime));
1188
if (currentTime>1)
1189
{
1190
Game.fpsStartTime=Date.now();
1191
Game.frameNumber=0;
1192
}
1193
return result;
1194
}
1195
1196
Game.cookiesEarned=0;//all cookies earned during gameplay
1197
Game.cookies=0;//cookies
1198
Game.cookiesd=0;//cookies display
1199
Game.cookiesPs=1;//cookies per second (to recalculate with every new purchase)
1200
Game.cookiesReset=0;//cookies lost to resetting (used to determine prestige and heavenly chips)
1201
Game.cookieClicks=0;//+1 for each click on the cookie
1202
Game.goldenClicks=0;//+1 for each golden cookie clicked (all time)
1203
Game.goldenClicksLocal=0;//+1 for each golden cookie clicked (this game only)
1204
Game.missedGoldenClicks=0;//+1 for each golden cookie missed
1205
Game.handmadeCookies=0;//all the cookies made from clicking the cookie
1206
Game.milkProgress=0;//you gain a little bit for each achievement. Each increment of 1 is a different milk displayed.
1207
Game.milkH=Game.milkProgress/2;//milk height, between 0 and 1 (although should never go above 0.5)
1208
Game.milkHd=0;//milk height display
1209
Game.milkType=0;//custom milk
1210
Game.bgType=0;//custom background
1211
Game.chimeType=0;//golden cookie chime
1212
Game.prestige=0;//prestige level (recalculated depending on Game.cookiesReset)
1213
Game.heavenlyChips=0;//heavenly chips the player currently has
1214
Game.heavenlyChipsDisplayed=0;//ticks up or down to match Game.heavenlyChips
1215
Game.heavenlyChipsSpent=0;//heavenly chips spent on cookies, upgrades and such
1216
Game.heavenlyCookies=0;//how many cookies have we baked from chips (unused)
1217
Game.permanentUpgrades=[-1,-1,-1,-1,-1];
1218
Game.ascensionMode=0;//type of challenge run if any
1219
Game.resets=0;//reset counter
1220
Game.lumps=-1;//sugar lumps
1221
Game.lumpsTotal=-1;//sugar lumps earned across all playthroughs (-1 means they haven't even started yet)
1222
Game.lumpT=Date.now();//time when the current lump started forming
1223
Game.lumpRefill=0;//time left before a sugar lump can be used again (on minigame refills etc) in logic frames
1224
1225
Game.makeSeed=function()
1226
{
1227
var chars='abcdefghijklmnopqrstuvwxyz'.split('');
1228
var str='';
1229
for (var i=0;i<5;i++){str+=choose(chars);}
1230
return str;
1231
}
1232
Game.seed=Game.makeSeed();//each run has its own seed, used for deterministic random stuff
1233
1234
Game.volume=50;//sound volume
1235
1236
Game.elderWrath=0;
1237
Game.elderWrathOld=0;
1238
Game.elderWrathD=0;
1239
Game.pledges=0;
1240
Game.pledgeT=0;
1241
Game.researchT=0;
1242
Game.nextResearch=0;
1243
Game.cookiesSucked=0;//cookies sucked by wrinklers
1244
Game.cpsSucked=0;//percent of CpS being sucked by wrinklers
1245
Game.wrinklersPopped=0;
1246
Game.santaLevel=0;
1247
Game.reindeerClicked=0;
1248
Game.seasonT=0;
1249
Game.seasonUses=0;
1250
Game.dragonLevel=0;
1251
Game.dragonAura=0;
1252
Game.dragonAura2=0;
1253
1254
Game.fortuneGC=0;
1255
Game.fortuneCPS=0;
1256
1257
Game.blendModesOn=(document.createElement('detect').style.mixBlendMode==='');
1258
1259
Game.bg='';//background (grandmas and such)
1260
Game.bgFade='';//fading to background
1261
Game.bgR=0;//ratio (0 - not faded, 1 - fully faded)
1262
Game.bgRd=0;//ratio displayed
1263
1264
Game.windowW=window.innerWidth;
1265
Game.windowH=window.innerHeight;
1266
1267
window.addEventListener('resize',function(event)
1268
{
1269
Game.windowW=window.innerWidth;
1270
Game.windowH=window.innerHeight;
1271
1272
for (var i in Game.Objects)
1273
{
1274
var me=Game.Objects[i];
1275
me.toResize=true;
1276
if (me.minigame && me.minigame.onResize) me.minigame.onResize();
1277
}
1278
});
1279
1280
Game.startDate=parseInt(Date.now());//when we started playing
1281
Game.fullDate=parseInt(Date.now());//when we started playing (carries over with resets)
1282
Game.lastDate=parseInt(Date.now());//when we last saved the game (used to compute "cookies made since we closed the game" etc)
1283
1284
Game.prefs=[];
1285
Game.DefaultPrefs=function()
1286
{
1287
Game.prefs.particles=1;//particle effects : falling cookies etc
1288
Game.prefs.numbers=1;//numbers that pop up when clicking the cookie
1289
Game.prefs.autosave=1;//save the game every minute or so
1290
Game.prefs.autoupdate=1;//send an AJAX request to the server every 30 minutes (note : ignored)
1291
Game.prefs.milk=1;//display milk
1292
Game.prefs.fancy=1;//CSS shadow effects (might be heavy on some browsers)
1293
Game.prefs.warn=0;//warn before closing the window
1294
Game.prefs.cursors=1;//display cursors
1295
Game.prefs.focus=1;//make the game refresh less frequently when off-focus
1296
Game.prefs.popups=0;//use old-style popups
1297
Game.prefs.format=0;//shorten numbers
1298
Game.prefs.notifs=0;//notifications fade faster
1299
Game.prefs.animate=1;//animate buildings
1300
Game.prefs.wobbly=1;//wobbly cookie
1301
Game.prefs.monospace=0;//alt monospace font for cookies
1302
Game.prefs.filters=0;//CSS filter effects (might be heavy on some browsers)
1303
Game.prefs.cookiesound=1;//use new cookie click sound
1304
Game.prefs.crates=0;//show crates around icons in stats
1305
Game.prefs.altDraw=0;//use requestAnimationFrame to update drawing instead of fixed 30 fps setTimeout
1306
Game.prefs.showBackupWarning=1;//if true, show a "Have you backed up your save?" message on save load; set to false when save is exported
1307
Game.prefs.extraButtons=1;//if true, show Mute buttons and the building master bar
1308
Game.prefs.askLumps=0;//if true, show a prompt before spending lumps
1309
Game.prefs.customGrandmas=1;//if true, show patreon names for grandmas
1310
Game.prefs.timeout=0;//if true, game may show pause screen when timed out
1311
}
1312
Game.DefaultPrefs();
1313
1314
window.onbeforeunload=function(event)
1315
{
1316
if (Game.prefs && Game.prefs.warn)
1317
{
1318
if (typeof event=='undefined') event=window.event;
1319
if (event) event.returnValue='Are you sure you want to close Cookie Clicker?';
1320
}
1321
}
1322
1323
Game.Mobile=function()
1324
{
1325
if (!Game.mobile)
1326
{
1327
l('wrapper').className='mobile';
1328
Game.mobile=1;
1329
}
1330
else
1331
{
1332
l('wrapper').className='';
1333
Game.mobile=0;
1334
}
1335
}
1336
1337
Game.showBackupWarning=function()
1338
{
1339
Game.Notify('Back up your save!','Hello again! Just a reminder that you may want to back up your Cookie Clicker save every once in a while, just in case.<br>To do so, go to Options and hit "Export save" or "Save to file"!<div class="line"></div><a style="float:right;" onclick="Game.prefs.showBackupWarning=0;==CLOSETHIS()==">Don\'t show this again</a>',[25,7]);
1340
}
1341
1342
/*=====================================================================================
1343
MOD HOOKS (will be subject to change, probably shouldn't be used yet)
1344
=======================================================================================*/
1345
//really primitive custom mods support - might not be of any use at all (could theoretically be used for custom upgrades and achievements I guess?)
1346
Game.customChecks=[];//push functions into this to add them to the "check for upgrade/achievement conditions" that happens every few seconds
1347
Game.customInit=[];//add to the initialization call
1348
Game.customLogic=[];//add to the logic calls
1349
Game.customDraw=[];//add to the draw calls
1350
Game.customSave=[];//add to the save write calls (save to your own localstorage key)
1351
Game.customLoad=[];//add to the save load calls
1352
Game.customReset=[];//add to the reset calls
1353
Game.customTickers=[];//add to the random tickers (functions should return arrays of text)
1354
Game.customCps=[];//add to the CpS computation (functions should return something to add to the multiplier ie. 0.1 for an addition of 10 to the CpS multiplier)
1355
Game.customCpsMult=[];//add to the CpS multiplicative computation (functions should return something to multiply by the multiplier ie. 1.05 for a 5% increase of the multiplier)
1356
Game.customMouseCps=[];//add to the cookies earned per click computation (functions should return something to add to the multiplier ie. 0.1 for an addition of 10 to the CpS multiplier)
1357
Game.customMouseCpsMult=[];//add to the cookies earned per click multiplicative computation (functions should return something to multiply by the multiplier ie. 1.05 for a 5% increase of the multiplier)
1358
Game.customCookieClicks=[];//add to the cookie click calls
1359
Game.customCreate=[];//create your new upgrades and achievements in there
1360
1361
Game.LoadMod=function(url)//this loads the mod at the given URL and gives the script an automatic id (URL "http://example.com/my_mod.js" gives the id "modscript_my_mod")
1362
{
1363
var js=document.createElement('script');
1364
var id=url.split('/');id=id[id.length-1].split('.')[0];
1365
js.setAttribute('type','text/javascript');
1366
js.setAttribute('id','modscript_'+id);
1367
js.setAttribute('src',url);
1368
document.head.appendChild(js);
1369
console.log('Loaded the mod '+url+', '+id+'.');
1370
}
1371
1372
//replacing an existing canvas picture with a new one at runtime : Game.Loader.Replace('perfectCookie.png','imperfectCookie.png');
1373
//upgrades and achievements can use other pictures than icons.png; declare their icon with [posX,posY,'http://example.com/myIcons.png']
1374
//check out the "UNLOCKING STUFF" section to see how unlocking achievs and upgrades is done (queue yours in Game.customChecks)
1375
//if you're making a mod, don't forget to add a Game.Win('Third-party') somewhere in there!
1376
1377
//IMPORTANT : all of the above is susceptible to heavy change, proper modding API in the works
1378
1379
1380
1381
1382
/*=====================================================================================
1383
BAKERY NAME
1384
=======================================================================================*/
1385
Game.RandomBakeryName=function()
1386
{
1387
return (Math.random()>0.05?(choose(['Magic','Fantastic','Fancy','Sassy','Snazzy','Pretty','Cute','Pirate','Ninja','Zombie','Robot','Radical','Urban','Cool','Hella','Sweet','Awful','Double','Triple','Turbo','Techno','Disco','Electro','Dancing','Wonder','Mutant','Space','Science','Medieval','Future','Captain','Bearded','Lovely','Tiny','Big','Fire','Water','Frozen','Metal','Plastic','Solid','Liquid','Moldy','Shiny','Happy','Happy Little','Slimy','Tasty','Delicious','Hungry','Greedy','Lethal','Professor','Doctor','Power','Chocolate','Crumbly','Choklit','Righteous','Glorious','Mnemonic','Psychic','Frenetic','Hectic','Crazy','Royal','El','Von'])+' '):'Mc')+choose(['Cookie','Biscuit','Muffin','Scone','Cupcake','Pancake','Chip','Sprocket','Gizmo','Puppet','Mitten','Sock','Teapot','Mystery','Baker','Cook','Grandma','Click','Clicker','Spaceship','Factory','Portal','Machine','Experiment','Monster','Panic','Burglar','Bandit','Booty','Potato','Pizza','Burger','Sausage','Meatball','Spaghetti','Macaroni','Kitten','Puppy','Giraffe','Zebra','Parrot','Dolphin','Duckling','Sloth','Turtle','Goblin','Pixie','Gnome','Computer','Pirate','Ninja','Zombie','Robot']);
1388
}
1389
Game.GetBakeryName=function() {return Game.RandomBakeryName();}
1390
Game.bakeryName=Game.GetBakeryName();
1391
Game.bakeryNameL=l('bakeryName');
1392
Game.bakeryNameL.innerHTML=Game.bakeryName+'\'s bakery';
1393
Game.bakeryNameSet=function(what)
1394
{
1395
Game.bakeryName=what.replace(/\W+/g,' ');
1396
Game.bakeryName=Game.bakeryName.substring(0,28);
1397
Game.bakeryNameRefresh();
1398
}
1399
Game.bakeryNameRefresh=function()
1400
{
1401
var name=Game.bakeryName;
1402
if (name.slice(-1).toLowerCase()=='s') name+='\' bakery'; else name+='\'s bakery';
1403
Game.bakeryNameL.innerHTML=name;
1404
name=Game.bakeryName.toLowerCase();
1405
if (name=='orteil') Game.Win('God complex');
1406
if (name.indexOf('saysopensesame',name.length-('saysopensesame').length)>0 && !Game.sesame) Game.OpenSesame();
1407
Game.recalculateGains=1;
1408
}
1409
Game.bakeryNamePrompt=function()
1410
{
1411
Game.Prompt('<h3>Name your bakery</h3><div class="block" style="text-align:center;">What should your bakery\'s name be?</div><div class="block"><input type="text" style="text-align:center;width:100%;" id="bakeryNameInput" value="'+Game.bakeryName+'"/></div>',[['Confirm','if (l(\'bakeryNameInput\').value.length>0) {Game.bakeryNameSet(l(\'bakeryNameInput\').value);Game.Win(\'What\\\'s in a name\');Game.ClosePrompt();}'],['Random','Game.bakeryNamePromptRandom();'],'Cancel']);
1412
l('bakeryNameInput').focus();
1413
l('bakeryNameInput').select();
1414
}
1415
Game.bakeryNamePromptRandom=function()
1416
{
1417
l('bakeryNameInput').value=Game.RandomBakeryName();
1418
}
1419
AddEvent(Game.bakeryNameL,'click',Game.bakeryNamePrompt);
1420
1421
1422
/*=====================================================================================
1423
TOOLTIP
1424
=======================================================================================*/
1425
Game.tooltip={text:'',x:0,y:0,origin:'',on:0,tt:l('tooltip'),tta:l('tooltipAnchor'),shouldHide:1,dynamic:0,from:0};
1426
Game.tooltip.draw=function(from,text,origin)
1427
{
1428
this.shouldHide=0;
1429
this.text=text;
1430
this.from=from;
1431
//this.x=x;
1432
//this.y=y;
1433
this.origin=origin;
1434
var tt=this.tt;
1435
var tta=this.tta;
1436
tt.style.left='auto';
1437
tt.style.top='auto';
1438
tt.style.right='auto';
1439
tt.style.bottom='auto';
1440
if (typeof this.text==='function')
1441
{
1442
var text=this.text();
1443
if (text=='') tta.style.opacity='0';
1444
else
1445
{
1446
tt.innerHTML=unescape(text);
1447
tta.style.opacity='1';
1448
}
1449
}
1450
else tt.innerHTML=unescape(this.text);
1451
//tt.innerHTML=(typeof this.text==='function')?unescape(this.text()):unescape(this.text);
1452
tta.style.display='block';
1453
tta.style.visibility='hidden';
1454
Game.tooltip.update();
1455
tta.style.visibility='visible';
1456
this.on=1;
1457
}
1458
Game.tooltip.update=function()
1459
{
1460
var X=0;
1461
var Y=0;
1462
var width=this.tt.offsetWidth;
1463
var height=this.tt.offsetHeight;
1464
if (this.origin=='store')
1465
{
1466
X=Game.windowW-332-width;
1467
Y=Game.mouseY-32;
1468
if (Game.onCrate) Y=Game.onCrate.getBoundingClientRect().top-42;
1469
Y=Math.max(0,Math.min(Game.windowH-height-44,Y));
1470
/*this.tta.style.right='308px';//'468px';
1471
this.tta.style.left='auto';
1472
if (Game.onCrate) Y=Game.onCrate.getBoundingClientRect().top-2;
1473
this.tta.style.top=Math.max(0,Math.min(Game.windowH-this.tt.clientHeight-64,Y-48))+'px';*/
1474
}
1475
else
1476
{
1477
if (Game.onCrate)
1478
{
1479
var rect=Game.onCrate.getBoundingClientRect();
1480
rect={left:rect.left,top:rect.top,right:rect.right,bottom:rect.bottom};
1481
if (rect.left==0 && rect.top==0)//if we get that bug where we get stuck in the top-left, move to the mouse (REVISION : just do nothing)
1482
{return false;/*rect.left=Game.mouseX-24;rect.right=Game.mouseX+24;rect.top=Game.mouseY-24;rect.bottom=Game.mouseY+24;*/}
1483
if (this.origin=='left')
1484
{
1485
X=rect.left-width-16;
1486
Y=rect.top+(rect.bottom-rect.top)/2-height/2-38;
1487
Y=Math.max(0,Math.min(Game.windowH-height-19,Y));
1488
if (X<0) X=rect.right;
1489
}
1490
else
1491
{
1492
X=rect.left+(rect.right-rect.left)/2-width/2-8;
1493
Y=rect.top-height-48;
1494
X=Math.max(0,Math.min(Game.windowW-width-16,X));
1495
if (Y<0) Y=rect.bottom-32;
1496
}
1497
}
1498
else if (this.origin=='bottom-right')
1499
{
1500
X=Game.mouseX+8;
1501
Y=Game.mouseY-32;
1502
X=Math.max(0,Math.min(Game.windowW-width-16,X));
1503
Y=Math.max(0,Math.min(Game.windowH-height-64,Y));
1504
}
1505
else if (this.origin=='bottom')
1506
{
1507
X=Game.mouseX-width/2-8;
1508
Y=Game.mouseY+24;
1509
X=Math.max(0,Math.min(Game.windowW-width-16,X));
1510
Y=Math.max(0,Math.min(Game.windowH-height-64,Y));
1511
}
1512
else if (this.origin=='left')
1513
{
1514
X=Game.mouseX-width-24;
1515
Y=Game.mouseY-height/2-8;
1516
X=Math.max(0,Math.min(Game.windowW-width-16,X));
1517
Y=Math.max(0,Math.min(Game.windowH-height-64,Y));
1518
}
1519
else if (this.origin=='this' && this.from)
1520
{
1521
var rect=this.from.getBoundingClientRect();
1522
X=(rect.left+rect.right)/2-width/2-8;
1523
Y=(rect.top)-this.tt.clientHeight-48;
1524
X=Math.max(0,Math.min(Game.windowW-width-16,X));
1525
//Y=Math.max(0,Math.min(Game.windowH-this.tt.clientHeight-64,Y));
1526
if (Y<0) Y=(rect.bottom-24);
1527
if (Y+height+40>Game.windowH)
1528
{
1529
X=rect.right+8;
1530
Y=rect.top+(rect.bottom-rect.top)/2-height/2-38;
1531
Y=Math.max(0,Math.min(Game.windowH-height-19,Y));
1532
}
1533
}
1534
else
1535
{
1536
X=Game.mouseX-width/2-8;
1537
Y=Game.mouseY-height-32;
1538
X=Math.max(0,Math.min(Game.windowW-width-16,X));
1539
Y=Math.max(0,Math.min(Game.windowH-height-64,Y));
1540
}
1541
}
1542
this.tta.style.left=X+'px';
1543
this.tta.style.right='auto';
1544
this.tta.style.top=Y+'px';
1545
this.tta.style.bottom='auto';
1546
if (this.shouldHide) {this.hide();this.shouldHide=0;}
1547
else if (Game.drawT%10==0 && typeof(this.text)=='function')
1548
{
1549
var text=this.text();
1550
if (text=='') this.tta.style.opacity='0';
1551
else
1552
{
1553
this.tt.innerHTML=unescape(text);
1554
this.tta.style.opacity='1';
1555
}
1556
}
1557
}
1558
Game.tooltip.hide=function()
1559
{
1560
this.tta.style.display='none';
1561
this.dynamic=0;
1562
this.on=0;
1563
}
1564
Game.getTooltip=function(text,origin,isCrate)
1565
{
1566
origin=(origin?origin:'middle');
1567
if (isCrate) return 'onMouseOut="Game.setOnCrate(0);Game.tooltip.shouldHide=1;" onMouseOver="if (!Game.mouseDown) {Game.setOnCrate(this);Game.tooltip.dynamic=0;Game.tooltip.draw(this,\''+escape(text)+'\',\''+origin+'\');Game.tooltip.wobble();}"';
1568
else return 'onMouseOut="Game.tooltip.shouldHide=1;" onMouseOver="Game.tooltip.dynamic=0;Game.tooltip.draw(this,\''+escape(text)+'\',\''+origin+'\');Game.tooltip.wobble();"';
1569
}
1570
Game.getDynamicTooltip=function(func,origin,isCrate)
1571
{
1572
origin=(origin?origin:'middle');
1573
if (isCrate) return 'onMouseOut="Game.setOnCrate(0);Game.tooltip.shouldHide=1;" onMouseOver="if (!Game.mouseDown) {Game.setOnCrate(this);Game.tooltip.dynamic=1;Game.tooltip.draw(this,'+'function(){return '+func+'();}'+',\''+origin+'\');Game.tooltip.wobble();}"';
1574
return 'onMouseOut="Game.tooltip.shouldHide=1;" onMouseOver="Game.tooltip.dynamic=1;Game.tooltip.draw(this,'+'function(){return '+func+'();}'+',\''+origin+'\');Game.tooltip.wobble();"';
1575
}
1576
Game.attachTooltip=function(el,func,origin)
1577
{
1578
if (typeof func==='string')
1579
{
1580
var str=func;
1581
func=function(str){return function(){return str;};}(str);
1582
}
1583
origin=(origin?origin:'middle');
1584
AddEvent(el,'mouseover',function(func,el,origin){return function(){Game.tooltip.dynamic=1;Game.tooltip.draw(el,func,origin);};}(func,el,origin));
1585
AddEvent(el,'mouseout',function(){return function(){Game.tooltip.shouldHide=1;};}());
1586
}
1587
Game.tooltip.wobble=function()
1588
{
1589
//disabled because this effect doesn't look good with the slight slowdown it might or might not be causing.
1590
if (false)
1591
{
1592
this.tt.className='framed';
1593
void this.tt.offsetWidth;
1594
this.tt.className='framed wobbling';
1595
}
1596
}
1597
1598
1599
/*=====================================================================================
1600
UPDATE CHECKER
1601
=======================================================================================*/
1602
Game.CheckUpdates=function()
1603
{
1604
ajax('server.php?q=checkupdate',Game.CheckUpdatesResponse);
1605
}
1606
Game.CheckUpdatesResponse=function(response)
1607
{
1608
var r=response.split('|');
1609
var str='';
1610
if (r[0]=='alert')
1611
{
1612
if (r[1]) str=r[1];
1613
}
1614
else if (parseFloat(r[0])>Game.version)
1615
{
1616
str='<b>New version available : v. '+r[0]+'!</b>';
1617
if (r[1]) str+='<br><small>Update note : "'+r[1]+'"</small>';
1618
str+='<br><b>Refresh to get it!</b>';
1619
}
1620
if (str!='')
1621
{
1622
l('alert').innerHTML=str;
1623
l('alert').style.display='block';
1624
}
1625
}
1626
1627
/*=====================================================================================
1628
DATA GRABBER
1629
=======================================================================================*/
1630
1631
Game.externalDataLoaded=false;
1632
1633
Game.grandmaNames=['Granny','Gusher','Ethel','Edna','Doris','Maud','Hilda','Gladys','Michelle','Michele','Phyllis','Millicent','Muriel','Myrtle','Mildred','Mavis','Helen','Gloria','Sheila','Betty','Gertrude','Agatha','Beryl','Agnes','Pearl','Precious','Ruby','Vera','Bonnie','Ada','Bunny','Cookie','Darling','Gaga','GamGam','Memaw','Mimsy','Peanut','Nana','Nan','Tootsie','Warty','Stinky','Heinous'];
1634
Game.customGrandmaNames=[];
1635
Game.heralds=0;
1636
1637
Game.GrabData=function()
1638
{
1639
ajax('/patreon/grab.php',Game.GrabDataResponse);
1640
}
1641
Game.GrabDataResponse=function(response)
1642
{
1643
/*
1644
response should be formatted as
1645
{"herald":3,"grandma":"a|b|c|...}
1646
*/
1647
var r={};
1648
try{
1649
r=JSON.parse(response);
1650
if (typeof r['herald']!=='undefined')
1651
{
1652
Game.heralds=parseInt(r['herald']);
1653
Game.heralds=Math.max(0,Math.min(100,Game.heralds));
1654
}
1655
if (typeof r['grandma']!=='undefined' && r['grandma']!='')
1656
{
1657
Game.customGrandmaNames=r['grandma'].split('|');
1658
Game.customGrandmaNames=Game.customGrandmaNames.filter(function(el){return el!='';});
1659
}
1660
1661
l('heraldsAmount').innerHTML=Game.heralds;
1662
Game.externalDataLoaded=true;
1663
}catch(e){}
1664
}
1665
1666
1667
1668
Game.attachTooltip(l('httpsSwitch'),'<div style="padding:8px;width:350px;text-align:center;font-size:11px;">You are currently playing Cookie Clicker on the <b>'+(Game.https?'HTTPS':'HTTP')+'</b> protocol.<br>The <b>'+(Game.https?'HTTP':'HTTPS')+'</b> version uses a different save slot than this one.<br>Click this lock to reload the page and switch to the <b>'+(Game.https?'HTTP':'HTTPS')+'</b> version!</div>','this');
1669
AddEvent(l('httpsSwitch'),'click',function(){
1670
PlaySound('snd/pop'+Math.floor(Math.random()*3+1)+'.mp3',0.75);
1671
if (location.protocol=='https:') location.href='http:'+window.location.href.substring(window.location.protocol.length);
1672
else if (location.protocol=='http:') location.href='https:'+window.location.href.substring(window.location.protocol.length);
1673
});
1674
1675
Game.attachTooltip(l('topbarOrteil'),'<div style="padding:8px;width:250px;text-align:center;">Back to Orteil\'s subdomain!<br>Lots of other games in there!</div>','this');
1676
Game.attachTooltip(l('topbarDashnet'),'<div style="padding:8px;width:250px;text-align:center;">Back to our homepage!</div>','this');
1677
Game.attachTooltip(l('topbarTwitter'),'<div style="padding:8px;width:250px;text-align:center;">Orteil\'s twitter, which frequently features game updates.</div>','this');
1678
Game.attachTooltip(l('topbarTumblr'),'<div style="padding:8px;width:250px;text-align:center;">Orteil\'s tumblr, which frequently features game updates.</div>','this');
1679
Game.attachTooltip(l('topbarDiscord'),'<div style="padding:8px;width:250px;text-align:center;">Our official discord server.<br>You can share tips and questions about Cookie Clicker and all our other games!</div>','this');
1680
Game.attachTooltip(l('topbarPatreon'),'<div style="padding:8px;width:250px;text-align:center;">Support us on Patreon and help us keep updating Cookie Clicker!<br>There\'s neat rewards for patrons too!</div>','this');
1681
Game.attachTooltip(l('topbarMerch'),'<div style="padding:8px;width:250px;text-align:center;">Cookie Clicker shirts, hoodies and stickers!</div>','this');
1682
Game.attachTooltip(l('topbarMobileCC'),'<div style="padding:8px;width:250px;text-align:center;">Play Cookie Clicker on your phone!<br>(Currently in beta, Android only; iOS version will be released later)</div>','this');
1683
Game.attachTooltip(l('topbarRandomgen'),'<div style="padding:8px;width:250px;text-align:center;">A thing we made that lets you write random generators.</div>','this');
1684
Game.attachTooltip(l('topbarIGM'),'<div style="padding:8px;width:250px;text-align:center;">A thing we made that lets you create your own idle games using a simple scripting language.</div>','this');
1685
1686
Game.attachTooltip(l('heralds'),function(){
1687
var str='';
1688
1689
if (!Game.externalDataLoaded) str+='Heralds couldn\'t be loaded. There may be an issue with our servers, or you are playing the game locally.';
1690
else
1691
{
1692
if (Game.heralds==0) str+='There are no heralds at the moment. Please consider <b style="color:#bc3aff;">donating to our Patreon</b>!';
1693
else
1694
{
1695
str+=(Game.heralds==1?'<b style="color:#bc3aff;text-shadow:0px 1px 0px #6d0096;">1 herald</b> is':'<b style="color:#fff;text-shadow:0px 1px 0px #6d0096,0px 0px 6px #bc3aff;">'+Game.heralds+' heralds</b> are')+' selflessly inspiring a boost in production for everyone, resulting in<br><b style="color:#cdaa89;text-shadow:0px 1px 0px #7c4532,0px 0px 6px #7c4532;"><div style="width:16px;height:16px;display:inline-block;vertical-align:middle;background:url(img/money.png);"></div> +'+Game.heralds+'% cookies per second</b>.';
1696
str+='<div class="line"></div>';
1697
if (Game.ascensionMode==1) str+='You are in a <b>Born again</b> run, and are not currently benefiting from heralds.';
1698
else if (Game.Has('Heralds')) str+='You own the <b>Heralds</b> upgrade, and therefore benefit from the production boost.';
1699
else str+='To benefit from the herald bonus, you need a special upgrade you do not yet own. You will permanently unlock it later in the game.';
1700
}
1701
}
1702
str+='<div class="line"></div><span style="font-size:90%;opacity:0.6;"><b>Heralds</b> are people who have donated to our highest Patreon tier, and are limited to 100.<br>Each herald gives everyone +1% CpS.<br>Heralds benefit everyone playing the game, regardless of whether you donated.</span>';
1703
1704
str+='<div style="width:31px;height:39px;background:url(img/heraldFlag.png);position:absolute;top:0px;left:8px;"></div><div style="width:31px;height:39px;background:url(img/heraldFlag.png);position:absolute;top:0px;right:8px;"></div>';
1705
1706
return '<div style="padding:8px;width:300px;text-align:center;" class="prompt"><h3>Heralds</h3><div class="block">'+str+'</div></div>';
1707
},'this');
1708
l('heraldsAmount').innerHTML='?';
1709
l('heralds').style.display='inline-block';
1710
1711
Game.GrabData();
1712
1713
1714
Game.useLocalStorage=1;
1715
Game.localStorageGet=function(key)
1716
{
1717
var local=0;
1718
try {local=window.localStorage.getItem(key);} catch (exception) {}
1719
return local;
1720
}
1721
Game.localStorageSet=function(key,str)
1722
{
1723
var local=0;
1724
try {local=window.localStorage.setItem(key,str);} catch (exception) {}
1725
return local;
1726
}
1727
//window.localStorage.clear();//won't switch back to cookie-based if there is localStorage info
1728
1729
/*=====================================================================================
1730
SAVE
1731
=======================================================================================*/
1732
Game.ExportSave=function()
1733
{
1734
Game.prefs.showBackupWarning=0;
1735
Game.Prompt('<h3>Export save</h3><div class="block">This is your save code.<br>Copy it and keep it somewhere safe!</div><div class="block"><textarea id="textareaPrompt" style="width:100%;height:128px;" readonly>'+Game.WriteSave(1)+'</textarea></div>',['All done!']);//prompt('Copy this text and keep it somewhere safe!',Game.WriteSave(1));
1736
l('textareaPrompt').focus();l('textareaPrompt').select();
1737
}
1738
Game.ImportSave=function()
1739
{
1740
Game.Prompt('<h3>Import save</h3><div class="block">Please paste in the code that was given to you on save export.</div><div class="block"><textarea id="textareaPrompt" style="width:100%;height:128px;"></textarea></div>',[['Load','if (l(\'textareaPrompt\').value.length>0) {Game.ImportSaveCode(l(\'textareaPrompt\').value);Game.ClosePrompt();}'],'Nevermind']);//prompt('Please paste in the text that was given to you on save export.','');
1741
l('textareaPrompt').focus();
1742
}
1743
Game.ImportSaveCode=function(save)
1744
{
1745
if (save && save!='') Game.LoadSave(save);
1746
}
1747
1748
Game.FileSave=function()
1749
{
1750
Game.prefs.showBackupWarning=0;
1751
var filename=Game.bakeryName.replace(/[^a-zA-Z0-9]+/g,'')+'Bakery';
1752
var text=Game.WriteSave(1);
1753
var blob=new Blob([text],{type:'text/plain;charset=utf-8'});
1754
saveAs(blob,filename+'.txt');
1755
}
1756
Game.FileLoad=function(e)
1757
{
1758
if (e.target.files.length==0) return false;
1759
var file=e.target.files[0];
1760
var reader=new FileReader();
1761
reader.onload=function(e)
1762
{
1763
Game.ImportSaveCode(e.target.result);
1764
}
1765
reader.readAsText(file);
1766
}
1767
1768
Game.toSave=false;
1769
Game.WriteSave=function(type)
1770
{
1771
Game.toSave=false;
1772
//type : none is default, 1=return string only, 2=return uncompressed string, 3=return uncompressed, commented string
1773
Game.lastDate=parseInt(Game.time);
1774
var str='';
1775
if (type==3) str+='\nGame version\n';
1776
str+=Game.version+'|';
1777
str+='|';//just in case we need some more stuff here
1778
if (type==3) str+='\n\nRun details';
1779
str+=//save stats
1780
(type==3?'\n run start date : ':'')+parseInt(Game.startDate)+';'+
1781
(type==3?'\n legacy start date : ':'')+parseInt(Game.fullDate)+';'+
1782
(type==3?'\n date when we last opened the game : ':'')+parseInt(Game.lastDate)+';'+
1783
(type==3?'\n bakery name : ':'')+(Game.bakeryName)+';'+
1784
(type==3?'\n seed : ':'')+(Game.seed)+
1785
'|';
1786
if (type==3) str+='\n\nPacked preferences bitfield\n ';
1787
var str2=//prefs
1788
(Game.prefs.particles?'1':'0')+
1789
(Game.prefs.numbers?'1':'0')+
1790
(Game.prefs.autosave?'1':'0')+
1791
(Game.prefs.autoupdate?'1':'0')+
1792
(Game.prefs.milk?'1':'0')+
1793
(Game.prefs.fancy?'1':'0')+
1794
(Game.prefs.warn?'1':'0')+
1795
(Game.prefs.cursors?'1':'0')+
1796
(Game.prefs.focus?'1':'0')+
1797
(Game.prefs.format?'1':'0')+
1798
(Game.prefs.notifs?'1':'0')+
1799
(Game.prefs.wobbly?'1':'0')+
1800
(Game.prefs.monospace?'1':'0')+
1801
(Game.prefs.filters?'1':'0')+
1802
(Game.prefs.cookiesound?'1':'0')+
1803
(Game.prefs.crates?'1':'0')+
1804
(Game.prefs.showBackupWarning?'1':'0')+
1805
(Game.prefs.extraButtons?'1':'0')+
1806
(Game.prefs.askLumps?'1':'0')+
1807
(Game.prefs.customGrandmas?'1':'0')+
1808
(Game.prefs.timeout?'1':'0')+
1809
'';
1810
str2=pack3(str2);
1811
str+=str2+'|';
1812
if (type==3) str+='\n\nMisc game data';
1813
str+=
1814
(type==3?'\n cookies : ':'')+parseFloat(Game.cookies).toString()+';'+
1815
(type==3?'\n total cookies earned : ':'')+parseFloat(Game.cookiesEarned).toString()+';'+
1816
(type==3?'\n cookie clicks : ':'')+parseInt(Math.floor(Game.cookieClicks))+';'+
1817
(type==3?'\n golden cookie clicks : ':'')+parseInt(Math.floor(Game.goldenClicks))+';'+
1818
(type==3?'\n cookies made by clicking : ':'')+parseFloat(Game.handmadeCookies).toString()+';'+
1819
(type==3?'\n golden cookies missed : ':'')+parseInt(Math.floor(Game.missedGoldenClicks))+';'+
1820
(type==3?'\n background type : ':'')+parseInt(Math.floor(Game.bgType))+';'+
1821
(type==3?'\n milk type : ':'')+parseInt(Math.floor(Game.milkType))+';'+
1822
(type==3?'\n cookies from past runs : ':'')+parseFloat(Game.cookiesReset).toString()+';'+
1823
(type==3?'\n elder wrath : ':'')+parseInt(Math.floor(Game.elderWrath))+';'+
1824
(type==3?'\n pledges : ':'')+parseInt(Math.floor(Game.pledges))+';'+
1825
(type==3?'\n pledge time left : ':'')+parseInt(Math.floor(Game.pledgeT))+';'+
1826
(type==3?'\n currently researching : ':'')+parseInt(Math.floor(Game.nextResearch))+';'+
1827
(type==3?'\n research time left : ':'')+parseInt(Math.floor(Game.researchT))+';'+
1828
(type==3?'\n ascensions : ':'')+parseInt(Math.floor(Game.resets))+';'+
1829
(type==3?'\n golden cookie clicks (this run) : ':'')+parseInt(Math.floor(Game.goldenClicksLocal))+';'+
1830
(type==3?'\n cookies sucked by wrinklers : ':'')+parseFloat(Game.cookiesSucked).toString()+';'+
1831
(type==3?'\n wrinkles popped : ':'')+parseInt(Math.floor(Game.wrinklersPopped))+';'+
1832
(type==3?'\n santa level : ':'')+parseInt(Math.floor(Game.santaLevel))+';'+
1833
(type==3?'\n reindeer clicked : ':'')+parseInt(Math.floor(Game.reindeerClicked))+';'+
1834
(type==3?'\n season time left : ':'')+parseInt(Math.floor(Game.seasonT))+';'+
1835
(type==3?'\n season switcher uses : ':'')+parseInt(Math.floor(Game.seasonUses))+';'+
1836
(type==3?'\n current season : ':'')+(Game.season?Game.season:'')+';';
1837
var wrinklers=Game.SaveWrinklers();
1838
str+=
1839
(type==3?'\n amount of cookies contained in wrinklers : ':'')+parseFloat(Math.floor(wrinklers.amount))+';'+
1840
(type==3?'\n number of wrinklers : ':'')+parseInt(Math.floor(wrinklers.number))+';'+
1841
(type==3?'\n prestige level : ':'')+parseFloat(Game.prestige).toString()+';'+
1842
(type==3?'\n heavenly chips : ':'')+parseFloat(Game.heavenlyChips).toString()+';'+
1843
(type==3?'\n heavenly chips spent : ':'')+parseFloat(Game.heavenlyChipsSpent).toString()+';'+
1844
(type==3?'\n heavenly cookies : ':'')+parseFloat(Game.heavenlyCookies).toString()+';'+
1845
(type==3?'\n ascension mode : ':'')+parseInt(Math.floor(Game.ascensionMode))+';'+
1846
(type==3?'\n permanent upgrades : ':'')+parseInt(Math.floor(Game.permanentUpgrades[0]))+';'+parseInt(Math.floor(Game.permanentUpgrades[1]))+';'+parseInt(Math.floor(Game.permanentUpgrades[2]))+';'+parseInt(Math.floor(Game.permanentUpgrades[3]))+';'+parseInt(Math.floor(Game.permanentUpgrades[4]))+';'+
1847
(type==3?'\n dragon level : ':'')+parseInt(Math.floor(Game.dragonLevel))+';'+
1848
(type==3?'\n dragon aura : ':'')+parseInt(Math.floor(Game.dragonAura))+';'+
1849
(type==3?'\n dragon aura 2 : ':'')+parseInt(Math.floor(Game.dragonAura2))+';'+
1850
(type==3?'\n chime type : ':'')+parseInt(Math.floor(Game.chimeType))+';'+
1851
(type==3?'\n volume : ':'')+parseInt(Math.floor(Game.volume))+';'+
1852
(type==3?'\n number of shiny wrinklers : ':'')+parseInt(Math.floor(wrinklers.shinies))+';'+
1853
(type==3?'\n amount of cookies contained in shiny wrinklers : ':'')+parseFloat(Math.floor(wrinklers.amountShinies))+';'+
1854
(type==3?'\n current amount of sugar lumps : ':'')+parseFloat(Math.floor(Game.lumps))+';'+
1855
(type==3?'\n total amount of sugar lumps made : ':'')+parseFloat(Math.floor(Game.lumpsTotal))+';'+
1856
(type==3?'\n time when current sugar lump started : ':'')+parseFloat(Math.floor(Game.lumpT))+';'+
1857
(type==3?'\n time when last refilled a minigame with a sugar lump : ':'')+parseFloat(Math.floor(Game.lumpRefill))+';'+
1858
(type==3?'\n sugar lump type : ':'')+parseInt(Math.floor(Game.lumpCurrentType))+';'+
1859
(type==3?'\n vault : ':'')+Game.vault.join(',')+';'+
1860
(type==3?'\n heralds : ':'')+parseInt(Game.heralds)+';'+
1861
(type==3?'\n golden cookie fortune : ':'')+parseInt(Game.fortuneGC)+';'+
1862
(type==3?'\n CpS fortune : ':'')+parseInt(Game.fortuneCPS)+';'+
1863
'|';//cookies and lots of other stuff
1864
1865
if (type==3) str+='\n\nBuildings : amount, bought, cookies produced, level, minigame data';
1866
for (var i in Game.Objects)//buildings
1867
{
1868
var me=Game.Objects[i];
1869
if (type==3) str+='\n '+me.name+' : ';
1870
if (me.vanilla)
1871
{
1872
str+=me.amount+','+me.bought+','+parseFloat(Math.floor(me.totalCookies))+','+parseInt(me.level);
1873
if (Game.isMinigameReady(me)) str+=','+me.minigame.save(); else str+=',';
1874
str+=','+(me.muted?'1':'0');
1875
str+=';';
1876
}
1877
}
1878
str+='|';
1879
if (type==3) str+='\n\nPacked upgrades bitfield (unlocked and bought)\n ';
1880
var toCompress=[];
1881
for (var i in Game.UpgradesById)//upgrades
1882
{
1883
var me=Game.UpgradesById[i];
1884
if (me.vanilla) toCompress.push(Math.min(me.unlocked,1),Math.min(me.bought,1));
1885
};
1886
1887
toCompress=pack3(toCompress.join(''));//toCompress=pack(toCompress);//CompressLargeBin(toCompress);
1888
1889
str+=toCompress;
1890
str+='|';
1891
if (type==3) str+='\n\nPacked achievements bitfield (won)\n ';
1892
var toCompress=[];
1893
for (var i in Game.AchievementsById)//achievements
1894
{
1895
var me=Game.AchievementsById[i];
1896
if (me.vanilla) toCompress.push(Math.min(me.won));
1897
}
1898
toCompress=pack3(toCompress.join(''));//toCompress=pack(toCompress);//CompressLargeBin(toCompress);
1899
str+=toCompress;
1900
1901
str+='|';
1902
if (type==3) str+='\n\nBuffs : type, maxTime, time, arg1, arg2, arg3';
1903
for (var i in Game.buffs)
1904
{
1905
var me=Game.buffs[i];
1906
if (me.type)
1907
{
1908
if (type==3) str+='\n '+me.type.name+' : ';
1909
if (me.type.vanilla)
1910
{
1911
str+=me.type.id+','+me.maxTime+','+me.time;
1912
if (typeof me.arg1!=='undefined') str+=','+parseFloat(me.arg1);
1913
if (typeof me.arg2!=='undefined') str+=','+parseFloat(me.arg2);
1914
if (typeof me.arg3!=='undefined') str+=','+parseFloat(me.arg3);
1915
str+=';';
1916
}
1917
}
1918
}
1919
1920
1921
if (type==3) str+='\n';
1922
1923
for (var i in Game.customSave) {Game.customSave[i]();}
1924
1925
if (type==2 || type==3)
1926
{
1927
return str;
1928
}
1929
else if (type==1)
1930
{
1931
str=escape(utf8_to_b64(str)+'!END!');
1932
return str;
1933
}
1934
else
1935
{
1936
if (Game.useLocalStorage)
1937
{
1938
//so we used to save the game using browser cookies, which was just really neat considering the game's name
1939
//we're using localstorage now, which is more efficient but not as cool
1940
//a moment of silence for our fallen puns
1941
str=utf8_to_b64(str)+'!END!';
1942
if (str.length<10)
1943
{
1944
if (Game.prefs.popups) Game.Popup('Error while saving.<br>Purchasing an upgrade might fix this.');
1945
else Game.Notify('Saving failed!','Purchasing an upgrade and saving again might fix this.<br>This really shouldn\'t happen; please notify Orteil on his tumblr.');
1946
}
1947
else
1948
{
1949
str=escape(str);
1950
Game.localStorageSet(Game.SaveTo,str);//aaand save
1951
if (!Game.localStorageGet(Game.SaveTo))
1952
{
1953
if (Game.prefs.popups) Game.Popup('Error while saving.<br>Export your save instead!');
1954
else Game.Notify('Error while saving','Export your save instead!');
1955
}
1956
else if (document.hasFocus())
1957
{
1958
if (Game.prefs.popups) Game.Popup('Game saved');
1959
else Game.Notify('Game saved','','',1,1);
1960
}
1961
}
1962
}
1963
else//legacy system
1964
{
1965
//that's right
1966
//we're using cookies
1967
//yeah I went there
1968
var now=new Date();//we storin dis for 5 years, people
1969
now.setFullYear(now.getFullYear()+5);//mmh stale cookies
1970
str=utf8_to_b64(str)+'!END!';
1971
Game.saveData=escape(str);
1972
str=Game.SaveTo+'='+escape(str)+'; expires='+now.toUTCString()+';';
1973
document.cookie=str;//aaand save
1974
if (document.cookie.indexOf(Game.SaveTo)<0)
1975
{
1976
if (Game.prefs.popups) Game.Popup('Error while saving.<br>Export your save instead!');
1977
else Game.Notify('Error while saving','Export your save instead!','',0,1);
1978
}
1979
else if (document.hasFocus())
1980
{
1981
if (Game.prefs.popups) Game.Popup('Game saved');
1982
else Game.Notify('Game saved','','',1,1);
1983
}
1984
}
1985
}
1986
}
1987
1988
/*=====================================================================================
1989
LOAD
1990
=======================================================================================*/
1991
Game.salvageSave=function()
1992
{
1993
//for when Cookie Clicker won't load and you need your save
1994
console.log('===================================================');
1995
console.log('This is your save data. Copypaste it (without quotation marks) into another version using the "Import save" feature.');
1996
console.log(Game.localStorageGet(Game.SaveTo));
1997
}
1998
Game.LoadSave=function(data)
1999
{
2000
var str='';
2001
if (data) str=unescape(data);
2002
else
2003
{
2004
if (Game.useLocalStorage)
2005
{
2006
var local=Game.localStorageGet(Game.SaveTo);
2007
if (!local)//no localstorage save found? let's get the cookie one last time
2008
{
2009
if (document.cookie.indexOf(Game.SaveTo)>=0)
2010
{
2011
str=unescape(document.cookie.split(Game.SaveTo+'=')[1]);
2012
document.cookie=Game.SaveTo+'=;expires=Thu, 01 Jan 1970 00:00:01 GMT;';
2013
}
2014
else return false;
2015
}
2016
else
2017
{
2018
str=unescape(local);
2019
}
2020
}
2021
else//legacy system
2022
{
2023
if (document.cookie.indexOf(Game.SaveTo)>=0) str=unescape(document.cookie.split(Game.SaveTo+'=')[1]);//get cookie here
2024
else return false;
2025
}
2026
}
2027
if (str!='')
2028
{
2029
var version=0;
2030
var oldstr=str.split('|');
2031
if (oldstr[0]<1) {}
2032
else
2033
{
2034
str=str.split('!END!')[0];
2035
str=b64_to_utf8(str);
2036
}
2037
if (str!='')
2038
{
2039
var spl='';
2040
str=str.split('|');
2041
version=parseFloat(str[0]);
2042
2043
if (isNaN(version) || str.length<5)
2044
{
2045
if (Game.prefs.popups) Game.Popup('Oops, looks like the import string is all wrong!');
2046
else Game.Notify('Error importing save','Oops, looks like the import string is all wrong!','',6,1);
2047
return false;
2048
}
2049
if (version>=1 && version>Game.version)
2050
{
2051
if (Game.prefs.popups) Game.Popup('Error : you are attempting to load a save from a future version (v. '+version+'; you are using v. '+Game.version+').');
2052
else Game.Notify('Error importing save','You are attempting to load a save from a future version (v. '+version+'; you are using v. '+Game.version+').','',6,1);
2053
return false;
2054
}
2055
if (version==1.0501)//prompt if we loaded from the 2014 beta
2056
{
2057
setTimeout(function(){Game.Prompt('<h3>New beta</h3><div class="block">Hey there! Unfortunately, your old beta save won\'t work here anymore; you\'ll have to start fresh or import your save from the live version.<div class="line"></div>Thank you for beta-testing Cookie Clicker, we hope you\'ll enjoy it and find strange and interesting bugs!</div>',[['Alright then!','Game.ClosePrompt();']]);},200);
2058
return false;
2059
}
2060
else if (version<1.0501)//prompt if we loaded from the 2014 live version
2061
{
2062
setTimeout(function(){Game.Prompt('<h3>Update</h3><div class="block"><b>Hey there!</b> Cookie Clicker just received a pretty substantial update, and you might notice that some things have been moved around. Don\'t panic!<div class="line"></div>Your building numbers may look strange, making it seem like you own buildings you\'ve never bought; this is because we\'ve added <b>3 new buildings</b> after factories (and swapped mines and factories), offsetting everything after them. Likewise, some building-related upgrades and achievements may look a tad shuffled around. This is all perfectly normal!<div class="line"></div>We\'ve also rebalanced Heavenly Chips amounts and behavior. Your amount of chips might be lower or higher than before.<br>You can now ascend through the <b>Legacy button</b> at the top!<div class="line"></div>Thank you for playing Cookie Clicker. We\'ve put a lot of work and care into this update and we hope you\'ll enjoy it!</div>',[['Neat!','Game.ClosePrompt();']]);},200);
2063
}
2064
if (version>=1)
2065
{
2066
Game.T=0;
2067
2068
spl=str[2].split(';');//save stats
2069
Game.startDate=parseInt(spl[0]);
2070
Game.fullDate=parseInt(spl[1]);
2071
Game.lastDate=parseInt(spl[2]);
2072
Game.bakeryName=spl[3]?spl[3]:Game.GetBakeryName();
2073
Game.seed=spl[4]?spl[4]:Game.makeSeed();
2074
//prefs
2075
if (version<1.0503) spl=str[3].split('');
2076
else if (version<2.0046) spl=unpack2(str[3]).split('');
2077
else spl=(str[3]).split('');
2078
Game.prefs.particles=parseInt(spl[0]);
2079
Game.prefs.numbers=parseInt(spl[1]);
2080
Game.prefs.autosave=parseInt(spl[2]);
2081
Game.prefs.autoupdate=spl[3]?parseInt(spl[3]):1;
2082
Game.prefs.milk=spl[4]?parseInt(spl[4]):1;
2083
Game.prefs.fancy=parseInt(spl[5]);if (Game.prefs.fancy) Game.removeClass('noFancy'); else if (!Game.prefs.fancy) Game.addClass('noFancy');
2084
Game.prefs.warn=spl[6]?parseInt(spl[6]):0;
2085
Game.prefs.cursors=spl[7]?parseInt(spl[7]):0;
2086
Game.prefs.focus=spl[8]?parseInt(spl[8]):0;
2087
Game.prefs.format=spl[9]?parseInt(spl[9]):0;
2088
Game.prefs.notifs=spl[10]?parseInt(spl[10]):0;
2089
Game.prefs.wobbly=spl[11]?parseInt(spl[11]):0;
2090
Game.prefs.monospace=spl[12]?parseInt(spl[12]):0;
2091
Game.prefs.filters=parseInt(spl[13]);if (Game.prefs.filters) Game.removeClass('noFilters'); else if (!Game.prefs.filters) Game.addClass('noFilters');
2092
Game.prefs.cookiesound=spl[14]?parseInt(spl[14]):1;
2093
Game.prefs.crates=spl[15]?parseInt(spl[15]):0;
2094
Game.prefs.showBackupWarning=spl[16]?parseInt(spl[16]):1;
2095
Game.prefs.extraButtons=spl[17]?parseInt(spl[17]):1;if (!Game.prefs.extraButtons) Game.removeClass('extraButtons'); else if (Game.prefs.extraButtons) Game.addClass('extraButtons');
2096
Game.prefs.askLumps=spl[18]?parseInt(spl[18]):0;
2097
Game.prefs.customGrandmas=spl[19]?parseInt(spl[19]):1;
2098
Game.prefs.timeout=spl[20]?parseInt(spl[20]):0;
2099
BeautifyAll();
2100
spl=str[4].split(';');//cookies and lots of other stuff
2101
Game.cookies=parseFloat(spl[0]);
2102
Game.cookiesEarned=parseFloat(spl[1]);
2103
Game.cookieClicks=spl[2]?parseInt(spl[2]):0;
2104
Game.goldenClicks=spl[3]?parseInt(spl[3]):0;
2105
Game.handmadeCookies=spl[4]?parseFloat(spl[4]):0;
2106
Game.missedGoldenClicks=spl[5]?parseInt(spl[5]):0;
2107
Game.bgType=spl[6]?parseInt(spl[6]):0;
2108
Game.milkType=spl[7]?parseInt(spl[7]):0;
2109
Game.cookiesReset=spl[8]?parseFloat(spl[8]):0;
2110
Game.elderWrath=spl[9]?parseInt(spl[9]):0;
2111
Game.pledges=spl[10]?parseInt(spl[10]):0;
2112
Game.pledgeT=spl[11]?parseInt(spl[11]):0;
2113
Game.nextResearch=spl[12]?parseInt(spl[12]):0;
2114
Game.researchT=spl[13]?parseInt(spl[13]):0;
2115
Game.resets=spl[14]?parseInt(spl[14]):0;
2116
Game.goldenClicksLocal=spl[15]?parseInt(spl[15]):0;
2117
Game.cookiesSucked=spl[16]?parseFloat(spl[16]):0;
2118
Game.wrinklersPopped=spl[17]?parseInt(spl[17]):0;
2119
Game.santaLevel=spl[18]?parseInt(spl[18]):0;
2120
Game.reindeerClicked=spl[19]?parseInt(spl[19]):0;
2121
Game.seasonT=spl[20]?parseInt(spl[20]):0;
2122
Game.seasonUses=spl[21]?parseInt(spl[21]):0;
2123
Game.season=spl[22]?spl[22]:Game.baseSeason;
2124
var wrinklers={amount:spl[23]?parseFloat(spl[23]):0,number:spl[24]?parseInt(spl[24]):0};
2125
Game.prestige=spl[25]?parseFloat(spl[25]):0;
2126
Game.heavenlyChips=spl[26]?parseFloat(spl[26]):0;
2127
Game.heavenlyChipsSpent=spl[27]?parseFloat(spl[27]):0;
2128
Game.heavenlyCookies=spl[28]?parseFloat(spl[28]):0;
2129
Game.ascensionMode=spl[29]?parseInt(spl[29]):0;
2130
Game.permanentUpgrades[0]=spl[30]?parseInt(spl[30]):-1;Game.permanentUpgrades[1]=spl[31]?parseInt(spl[31]):-1;Game.permanentUpgrades[2]=spl[32]?parseInt(spl[32]):-1;Game.permanentUpgrades[3]=spl[33]?parseInt(spl[33]):-1;Game.permanentUpgrades[4]=spl[34]?parseInt(spl[34]):-1;
2131
//if (version<1.05) {Game.heavenlyChipsEarned=Game.HowMuchPrestige(Game.cookiesReset);Game.heavenlyChips=Game.heavenlyChipsEarned;}
2132
Game.dragonLevel=spl[35]?parseInt(spl[35]):0;
2133
if (version<2.0041 && Game.dragonLevel==Game.dragonLevels.length-2) {Game.dragonLevel=Game.dragonLevels.length-1;}
2134
Game.dragonAura=spl[36]?parseInt(spl[36]):0;
2135
Game.dragonAura2=spl[37]?parseInt(spl[37]):0;
2136
Game.chimeType=spl[38]?parseInt(spl[38]):0;
2137
Game.volume=spl[39]?parseInt(spl[39]):50;
2138
wrinklers.shinies=spl[40]?parseInt(spl[40]):0;
2139
wrinklers.amountShinies=spl[41]?parseFloat(spl[41]):0;
2140
Game.lumps=spl[42]?parseFloat(spl[42]):-1;
2141
Game.lumpsTotal=spl[43]?parseFloat(spl[43]):-1;
2142
Game.lumpT=spl[44]?parseInt(spl[44]):Date.now();
2143
Game.lumpRefill=spl[45]?parseInt(spl[45]):0;
2144
if (version<2.022) Game.lumpRefill=Game.fps*60;
2145
Game.lumpCurrentType=spl[46]?parseInt(spl[46]):0;
2146
Game.vault=spl[47]?spl[47].split(','):[];
2147
for (var i in Game.vault){Game.vault[i]=parseInt(Game.vault[i]);}
2148
var actualHeralds=Game.heralds;//we store the actual amount of heralds to restore it later; here we used the amount present in the save to compute offline CpS
2149
Game.heralds=spl[48]?parseInt(spl[48]):Game.heralds;
2150
Game.fortuneGC=spl[49]?parseInt(spl[49]):0;
2151
Game.fortuneCPS=spl[50]?parseInt(spl[50]):0;
2152
2153
spl=str[5].split(';');//buildings
2154
Game.BuildingsOwned=0;
2155
for (var i in Game.ObjectsById)
2156
{
2157
var me=Game.ObjectsById[i];
2158
me.switchMinigame(false);
2159
me.pics=[];
2160
if (spl[i])
2161
{
2162
var mestr=spl[i].toString().split(',');
2163
me.amount=parseInt(mestr[0]);me.bought=parseInt(mestr[1]);me.totalCookies=parseFloat(mestr[2]);me.level=parseInt(mestr[3]||0);
2164
if (me.minigame && me.minigameLoaded && me.minigame.reset) {me.minigame.reset(true);me.minigame.load(mestr[4]||'');} else me.minigameSave=(mestr[4]||0);
2165
me.muted=parseInt(mestr[5])||0;
2166
Game.BuildingsOwned+=me.amount;
2167
if (version<2.003) me.level=0;
2168
}
2169
else
2170
{
2171
me.amount=0;me.unlocked=0;me.bought=0;me.totalCookies=0;me.level=0;
2172
}
2173
}
2174
2175
Game.LoadMinigames();
2176
2177
if (version<1.035)//old non-binary algorithm
2178
{
2179
spl=str[6].split(';');//upgrades
2180
Game.UpgradesOwned=0;
2181
for (var i in Game.UpgradesById)
2182
{
2183
var me=Game.UpgradesById[i];
2184
if (spl[i])
2185
{
2186
var mestr=spl[i].split(',');
2187
me.unlocked=parseInt(mestr[0]);me.bought=parseInt(mestr[1]);
2188
if (me.bought && Game.CountsAsUpgradeOwned(me.pool)) Game.UpgradesOwned++;
2189
}
2190
else
2191
{
2192
me.unlocked=0;me.bought=0;
2193
}
2194
}
2195
if (str[7]) spl=str[7].split(';'); else spl=[];//achievements
2196
Game.AchievementsOwned=0;
2197
for (var i in Game.AchievementsById)
2198
{
2199
var me=Game.AchievementsById[i];
2200
if (spl[i])
2201
{
2202
var mestr=spl[i].split(',');
2203
me.won=parseInt(mestr[0]);
2204
}
2205
else
2206
{
2207
me.won=0;
2208
}
2209
if (me.won && Game.CountsAsAchievementOwned(me.pool)) Game.AchievementsOwned++;
2210
}
2211
}
2212
else if (version<1.0502)//old awful packing system
2213
{
2214
if (str[6]) spl=str[6]; else spl=[];//upgrades
2215
if (version<1.05) spl=UncompressLargeBin(spl);
2216
else spl=unpack(spl);
2217
Game.UpgradesOwned=0;
2218
for (var i in Game.UpgradesById)
2219
{
2220
var me=Game.UpgradesById[i];
2221
if (spl[i*2])
2222
{
2223
var mestr=[spl[i*2],spl[i*2+1]];
2224
me.unlocked=parseInt(mestr[0]);me.bought=parseInt(mestr[1]);
2225
if (me.bought && Game.CountsAsUpgradeOwned(me.pool)) Game.UpgradesOwned++;
2226
}
2227
else
2228
{
2229
me.unlocked=0;me.bought=0;
2230
}
2231
}
2232
if (str[7]) spl=str[7]; else spl=[];//achievements
2233
if (version<1.05) spl=UncompressLargeBin(spl);
2234
else spl=unpack(spl);
2235
Game.AchievementsOwned=0;
2236
for (var i in Game.AchievementsById)
2237
{
2238
var me=Game.AchievementsById[i];
2239
if (spl[i])
2240
{
2241
var mestr=[spl[i]];
2242
me.won=parseInt(mestr[0]);
2243
}
2244
else
2245
{
2246
me.won=0;
2247
}
2248
if (me.won && Game.CountsAsAchievementOwned(me.pool)) Game.AchievementsOwned++;
2249
}
2250
}
2251
else
2252
{
2253
if (str[6]) spl=str[6]; else spl=[];//upgrades
2254
if (version<2.0046) spl=unpack2(spl).split('');
2255
else spl=(spl).split('');
2256
Game.UpgradesOwned=0;
2257
for (var i in Game.UpgradesById)
2258
{
2259
var me=Game.UpgradesById[i];
2260
if (spl[i*2])
2261
{
2262
var mestr=[spl[i*2],spl[i*2+1]];
2263
me.unlocked=parseInt(mestr[0]);me.bought=parseInt(mestr[1]);
2264
if (me.bought && Game.CountsAsUpgradeOwned(me.pool)) Game.UpgradesOwned++;
2265
}
2266
else
2267
{
2268
me.unlocked=0;me.bought=0;
2269
}
2270
}
2271
if (str[7]) spl=str[7]; else spl=[];//achievements
2272
if (version<2.0046) spl=unpack2(spl).split('');
2273
else spl=(spl).split('');
2274
Game.AchievementsOwned=0;
2275
for (var i in Game.AchievementsById)
2276
{
2277
var me=Game.AchievementsById[i];
2278
if (spl[i])
2279
{
2280
var mestr=[spl[i]];
2281
me.won=parseInt(mestr[0]);
2282
}
2283
else
2284
{
2285
me.won=0;
2286
}
2287
if (me.won && Game.CountsAsAchievementOwned(me.pool)) Game.AchievementsOwned++;
2288
}
2289
}
2290
2291
Game.killBuffs();
2292
var buffsToLoad=[];
2293
spl=(str[8]||'').split(';');//buffs
2294
for (var i in spl)
2295
{
2296
if (spl[i])
2297
{
2298
var mestr=spl[i].toString().split(',');
2299
buffsToLoad.push(mestr);
2300
}
2301
}
2302
2303
2304
for (var i in Game.ObjectsById)
2305
{
2306
var me=Game.ObjectsById[i];
2307
if (me.buyFunction) me.buyFunction();
2308
me.refresh();
2309
if (me.id>0)
2310
{
2311
if (me.muted) me.mute(1);
2312
}
2313
}
2314
2315
if (version<1.0503)//upgrades that used to be regular, but are now heavenly
2316
{
2317
var me=Game.Upgrades['Persistent memory'];me.unlocked=0;me.bought=0;
2318
var me=Game.Upgrades['Season switcher'];me.unlocked=0;me.bought=0;
2319
}
2320
2321
if (Game.bgType==-1) Game.bgType=0;
2322
if (Game.milkType==-1) Game.milkType=0;
2323
2324
2325
//advance timers
2326
var framesElapsed=Math.ceil(((Date.now()-Game.lastDate)/1000)*Game.fps);
2327
if (Game.pledgeT>0) Game.pledgeT=Math.max(Game.pledgeT-framesElapsed,1);
2328
if (Game.seasonT>0) Game.seasonT=Math.max(Game.seasonT-framesElapsed,1);
2329
if (Game.researchT>0) Game.researchT=Math.max(Game.researchT-framesElapsed,1);
2330
2331
2332
Game.ResetWrinklers();
2333
Game.LoadWrinklers(wrinklers.amount,wrinklers.number,wrinklers.shinies,wrinklers.amountShinies);
2334
2335
//recompute season trigger prices
2336
if (Game.Has('Season switcher')) {for (var i in Game.seasons) {Game.Unlock(Game.seasons[i].trigger);}}
2337
Game.computeSeasonPrices();
2338
2339
//recompute prestige
2340
Game.prestige=Math.floor(Game.HowMuchPrestige(Game.cookiesReset));
2341
//if ((Game.heavenlyChips+Game.heavenlyChipsSpent)<Game.prestige)
2342
//{Game.heavenlyChips=Game.prestige;Game.heavenlyChipsSpent=0;}//chips owned and spent don't add up to total prestige? set chips owned to prestige
2343
2344
2345
2346
2347
if (version==1.037 && Game.beta)//are we opening the new beta? if so, save the old beta to /betadungeons
2348
{
2349
window.localStorage.setItem('CookieClickerGameBetaDungeons',window.localStorage.getItem('CookieClickerGameBeta'));
2350
Game.Notify('Beta save data','Your beta save data has been safely exported to /betadungeons.',20);
2351
}
2352
else if (version==1.0501 && Game.beta)//are we opening the newer beta? if so, save the old beta to /oldbeta
2353
{
2354
window.localStorage.setItem('CookieClickerGameOld',window.localStorage.getItem('CookieClickerGameBeta'));
2355
//Game.Notify('Beta save data','Your beta save data has been safely exported to /oldbeta.',20);
2356
}
2357
if (version<=1.0466 && !Game.beta)//export the old 2014 version to /v10466
2358
{
2359
window.localStorage.setItem('CookieClickerGamev10466',window.localStorage.getItem('CookieClickerGame'));
2360
//Game.Notify('Beta save data','Your save data has been safely exported to /v10466.',20);
2361
}
2362
if (version==1.9)//are we importing from the 1.9 beta? remove all heavenly upgrades and refund heavenly chips
2363
{
2364
for (var i in Game.UpgradesById)
2365
{
2366
var me=Game.UpgradesById[i];
2367
if (me.bought && me.pool=='prestige')
2368
{
2369
me.unlocked=0;
2370
me.bought=0;
2371
}
2372
}
2373
Game.heavenlyChips=Game.prestige;
2374
Game.heavenlyChipsSpent=0;
2375
2376
setTimeout(function(){Game.Prompt('<h3>Beta patch</h3><div class="block">We\'ve tweaked some things and fixed some others, please check the update notes!<div class="line"></div>Of note : due to changes in prestige balancing, all your heavenly upgrades have been removed and your heavenly chips refunded; you\'ll be able to reallocate them next time you ascend.<div class="line"></div>Thank you again for beta-testing Cookie Clicker!</div>',[['Alright then!','Game.ClosePrompt();']]);},200);
2377
}
2378
if (version<=1.0466)//are we loading from the old live version? reset HCs
2379
{
2380
Game.heavenlyChips=Game.prestige;
2381
Game.heavenlyChipsSpent=0;
2382
}
2383
2384
if (Game.ascensionMode!=1)
2385
{
2386
if (Game.Has('Starter kit')) Game.Objects['Cursor'].free=10;
2387
if (Game.Has('Starter kitchen')) Game.Objects['Grandma'].free=5;
2388
}
2389
2390
Game.CalculateGains();
2391
2392
if (Math.random()<1/10000) Game.TOYS=1;//teehee!
2393
2394
var timeOffline=(Date.now()-Game.lastDate)/1000;
2395
2396
Game.loadLumps(timeOffline);
2397
2398
//compute cookies earned while the game was closed
2399
if (Game.mobile || Game.Has('Perfect idling') || Game.Has('Twin Gates of Transcendence'))
2400
{
2401
if (Game.Has('Perfect idling'))
2402
{
2403
var maxTime=60*60*24*1000000000;
2404
var percent=100;
2405
}
2406
else
2407
{
2408
var maxTime=60*60;
2409
if (Game.Has('Belphegor')) maxTime*=2;
2410
if (Game.Has('Mammon')) maxTime*=2;
2411
if (Game.Has('Abaddon')) maxTime*=2;
2412
if (Game.Has('Satan')) maxTime*=2;
2413
if (Game.Has('Asmodeus')) maxTime*=2;
2414
if (Game.Has('Beelzebub')) maxTime*=2;
2415
if (Game.Has('Lucifer')) maxTime*=2;
2416
2417
var percent=5;
2418
if (Game.Has('Angels')) percent+=10;
2419
if (Game.Has('Archangels')) percent+=10;
2420
if (Game.Has('Virtues')) percent+=10;
2421
if (Game.Has('Dominions')) percent+=10;
2422
if (Game.Has('Cherubim')) percent+=10;
2423
if (Game.Has('Seraphim')) percent+=10;
2424
if (Game.Has('God')) percent+=10;
2425
2426
if (Game.Has('Chimera')) {maxTime+=60*60*24*2;percent+=5;}
2427
2428
if (Game.Has('Fern tea')) percent+=3;
2429
if (Game.Has('Ichor syrup')) percent+=7;
2430
if (Game.Has('Fortune #102')) percent+=1;
2431
}
2432
2433
var timeOfflineOptimal=Math.min(timeOffline,maxTime);
2434
var timeOfflineReduced=Math.max(0,timeOffline-timeOfflineOptimal);
2435
var amount=(timeOfflineOptimal+timeOfflineReduced*0.1)*Game.cookiesPs*(percent/100);
2436
2437
if (amount>0)
2438
{
2439
if (Game.prefs.popups) Game.Popup('Earned '+Beautify(amount)+' cookie'+(Math.floor(amount)==1?'':'s')+' while you were away');
2440
else Game.Notify('Welcome back!','You earned <b>'+Beautify(amount)+'</b> cookie'+(Math.floor(amount)==1?'':'s')+' while you were away.<br>('+Game.sayTime(timeOfflineOptimal*Game.fps,-1)+' at '+Math.floor(percent)+'% CpS'+(timeOfflineReduced?', plus '+Game.sayTime(timeOfflineReduced*Game.fps,-1)+' at '+(Math.floor(percent*10)/100)+'%':'')+'.)',[Math.floor(Math.random()*16),11]);
2441
Game.Earn(amount);
2442
}
2443
}
2444
2445
//we load buffs after everything as we do not want them to interfer with offline CpS
2446
for (var i in buffsToLoad)
2447
{
2448
var mestr=buffsToLoad[i];
2449
var type=Game.buffTypes[parseInt(mestr[0])];
2450
Game.gainBuff(type.name,parseFloat(mestr[1])/Game.fps,parseFloat(mestr[3]||0),parseFloat(mestr[4]||0),parseFloat(mestr[5]||0)).time=parseFloat(mestr[2]);
2451
}
2452
2453
2454
Game.bakeryNameRefresh();
2455
2456
}
2457
else//importing old version save
2458
{
2459
Game.Notify('Error importing save','Sorry, you can\'t import saves from the old version anymore.','',6,1);
2460
return false;
2461
}
2462
2463
2464
Game.RebuildUpgrades();
2465
2466
Game.TickerAge=0;
2467
Game.TickerEffect=0;
2468
2469
Game.elderWrathD=0;
2470
Game.recalculateGains=1;
2471
Game.storeToRefresh=1;
2472
Game.upgradesToRebuild=1;
2473
2474
Game.buyBulk=1;Game.buyMode=1;Game.storeBulkButton(-1);
2475
2476
Game.specialTab='';
2477
Game.ToggleSpecialMenu(0);
2478
2479
Game.killShimmers();
2480
2481
if (Game.T>Game.fps*5 && Game.ReincarnateTimer==0)//fade out of black and pop the cookie
2482
{
2483
Game.ReincarnateTimer=1;
2484
Game.addClass('reincarnating');
2485
Game.BigCookieSize=0;
2486
}
2487
2488
if (version<Game.version) l('logButton').classList.add('hasUpdate');
2489
2490
if (Game.season!='' && Game.season==Game.baseSeason)
2491
{
2492
if (Game.season=='valentines') Game.Notify('Valentine\'s Day!','It\'s <b>Valentine\'s season</b>!<br>Love\'s in the air and cookies are just that much sweeter!',[20,3],60*3);
2493
else if (Game.season=='fools') Game.Notify('Business Day!','It\'s <b>Business season</b>!<br>Don\'t panic! Things are gonna be looking a little more corporate for a few days.',[17,6],60*3);
2494
else if (Game.season=='halloween') Game.Notify('Halloween!','It\'s <b>Halloween season</b>!<br>Everything is just a little bit spookier!',[13,8],60*3);
2495
else if (Game.season=='christmas') Game.Notify('Christmas time!','It\'s <b>Christmas season</b>!<br>Bring good cheer to all and you just may get cookies in your stockings!',[12,10],60*3);
2496
else if (Game.season=='easter') Game.Notify('Easter!','It\'s <b>Easter season</b>!<br>Keep an eye out and you just might click a rabbit or two!',[0,12],60*3);
2497
}
2498
2499
Game.heralds=actualHeralds;
2500
2501
if (Game.prefs.popups) Game.Popup('Game loaded');
2502
else Game.Notify('Game loaded','','',1,1);
2503
2504
if (Game.prefs.showBackupWarning==1) Game.showBackupWarning();
2505
}
2506
}
2507
else return false;
2508
return true;
2509
}
2510
2511
/*=====================================================================================
2512
RESET
2513
=======================================================================================*/
2514
Game.Reset=function(hard)
2515
{
2516
Game.T=0;
2517
2518
var cookiesForfeited=Game.cookiesEarned;
2519
if (!hard)
2520
{
2521
if (cookiesForfeited>=1000000) Game.Win('Sacrifice');
2522
if (cookiesForfeited>=1000000000) Game.Win('Oblivion');
2523
if (cookiesForfeited>=1000000000000) Game.Win('From scratch');
2524
if (cookiesForfeited>=1000000000000000) Game.Win('Nihilism');
2525
if (cookiesForfeited>=1000000000000000000) Game.Win('Dematerialize');
2526
if (cookiesForfeited>=1000000000000000000000) Game.Win('Nil zero zilch');
2527
if (cookiesForfeited>=1000000000000000000000000) Game.Win('Transcendence');
2528
if (cookiesForfeited>=1000000000000000000000000000) Game.Win('Obliterate');
2529
if (cookiesForfeited>=1000000000000000000000000000000) Game.Win('Negative void');
2530
if (cookiesForfeited>=1000000000000000000000000000000000) Game.Win('To crumbs, you say?');
2531
if (cookiesForfeited>=1000000000000000000000000000000000000) Game.Win('You get nothing');
2532
if (cookiesForfeited>=1000000000000000000000000000000000000000) Game.Win('Humble rebeginnings');
2533
if (cookiesForfeited>=1000000000000000000000000000000000000000000) Game.Win('The end of the world');
2534
if (cookiesForfeited>=1000000000000000000000000000000000000000000000) Game.Win('Oh, you\'re back');
2535
if (cookiesForfeited>=1000000000000000000000000000000000000000000000000) Game.Win('Lazarus');
2536
if (cookiesForfeited>=1000000000000000000000000000000000000000000000000000) Game.Win('Smurf account');
2537
if (cookiesForfeited>=1000000000000000000000000000000000000000000000000000000) Game.Win('If at first you don\'t succeed');
2538
2539
if (Math.round(Game.cookies)==1000000000000) Game.Win('When the cookies ascend just right');
2540
}
2541
2542
Game.killBuffs();
2543
2544
Game.seed=Game.makeSeed();
2545
2546
Game.cookiesReset+=Game.cookiesEarned;
2547
Game.cookies=0;
2548
Game.cookiesEarned=0;
2549
Game.cookieClicks=0;
2550
Game.goldenClicksLocal=0;
2551
//Game.goldenClicks=0;
2552
//Game.missedGoldenClicks=0;
2553
Game.handmadeCookies=0;
2554
if (hard)
2555
{
2556
Game.bgType=0;
2557
Game.milkType=0;
2558
Game.chimeType=0;
2559
2560
Game.vault=[];
2561
}
2562
Game.pledges=0;
2563
Game.pledgeT=0;
2564
Game.elderWrath=0;
2565
Game.nextResearch=0;
2566
Game.researchT=0;
2567
Game.seasonT=0;
2568
Game.seasonUses=0;
2569
Game.season=Game.baseSeason;
2570
Game.computeSeasonPrices();
2571
2572
Game.startDate=parseInt(Date.now());
2573
Game.lastDate=parseInt(Date.now());
2574
2575
Game.cookiesSucked=0;
2576
Game.wrinklersPopped=0;
2577
Game.ResetWrinklers();
2578
2579
Game.santaLevel=0;
2580
Game.reindeerClicked=0;
2581
2582
Game.dragonLevel=0;
2583
Game.dragonAura=0;
2584
Game.dragonAura2=0;
2585
2586
Game.fortuneGC=0;
2587
Game.fortuneCPS=0;
2588
2589
Game.TickerClicks=0;
2590
2591
if (Game.gainedPrestige>0) Game.resets++;
2592
if (!hard && Game.canLumps() && Game.ascensionMode!=1) Game.addClass('lumpsOn');
2593
else Game.removeClass('lumpsOn');
2594
Game.gainedPrestige=0;
2595
2596
for (var i in Game.ObjectsById)
2597
{
2598
var me=Game.ObjectsById[i];
2599
me.amount=0;me.bought=0;me.free=0;me.totalCookies=0;
2600
me.switchMinigame(false);
2601
if (hard) {me.muted=0;}
2602
me.pics=[];
2603
me.refresh();
2604
}
2605
for (var i in Game.UpgradesById)
2606
{
2607
var me=Game.UpgradesById[i];
2608
if (hard || me.pool!='prestige') me.bought=0;
2609
if (hard) me.unlocked=0;
2610
if (me.pool!='prestige' && !me.lasting)
2611
{
2612
if (Game.Has('Keepsakes') && Game.seasonDrops.indexOf(me.name)!=-1 && Math.random()<1/5){}
2613
else if (Game.ascensionMode==1 && Game.HasAchiev('O Fortuna') && me.tier=='fortune'){}
2614
else if (Game.HasAchiev('O Fortuna') && me.tier=='fortune' && Math.random()<0.4){}
2615
else me.unlocked=0;
2616
}
2617
}
2618
2619
Game.BuildingsOwned=0;
2620
Game.UpgradesOwned=0;
2621
2622
Game.cookiesPsByType={};
2623
Game.cookiesMultByType={};
2624
2625
if (!hard)
2626
{
2627
if (Game.ascensionMode!=1)
2628
{
2629
for (var i in Game.permanentUpgrades)
2630
{
2631
if (Game.permanentUpgrades[i]!=-1)
2632
{Game.UpgradesById[Game.permanentUpgrades[i]].earn();}
2633
}
2634
if (Game.Has('Season switcher')) {for (var i in Game.seasons) {Game.Unlock(Game.seasons[i].trigger);}}
2635
2636
if (Game.Has('Starter kit')) Game.Objects['Cursor'].getFree(10);
2637
if (Game.Has('Starter kitchen')) Game.Objects['Grandma'].getFree(5);
2638
}
2639
}
2640
2641
/*for (var i in Game.AchievementsById)
2642
{
2643
var me=Game.AchievementsById[i];
2644
me.won=0;
2645
}*/
2646
//Game.DefaultPrefs();
2647
BeautifyAll();
2648
2649
Game.RebuildUpgrades();
2650
Game.TickerAge=0;
2651
Game.TickerEffect=0;
2652
Game.recalculateGains=1;
2653
Game.storeToRefresh=1;
2654
Game.upgradesToRebuild=1;
2655
Game.killShimmers();
2656
2657
Game.buyBulk=1;Game.buyMode=1;Game.storeBulkButton(-1);
2658
2659
Game.LoadMinigames();
2660
for (var i in Game.ObjectsById)
2661
{
2662
var me=Game.ObjectsById[i];
2663
if (hard && me.minigame && me.minigame.launch) {me.minigame.launch();me.minigame.reset(true);}
2664
else if (!hard && me.minigame && me.minigame.reset) me.minigame.reset();
2665
}
2666
2667
l('toggleBox').style.display='none';
2668
l('toggleBox').innerHTML='';
2669
Game.choiceSelectorOn=-1;
2670
Game.specialTab='';
2671
Game.ToggleSpecialMenu(0);
2672
2673
l('logButton').classList.remove('hasUpdate');
2674
2675
for (var i in Game.customReset) {Game.customReset[i]();}
2676
2677
if (hard)
2678
{
2679
if (Game.T>Game.fps*5 && Game.ReincarnateTimer==0)//fade out of black and pop the cookie
2680
{
2681
Game.ReincarnateTimer=1;
2682
Game.addClass('reincarnating');
2683
Game.BigCookieSize=0;
2684
}
2685
if (Game.prefs.popups) Game.Popup('Game reset');
2686
else Game.Notify('Game reset','So long, cookies.',[21,6],6);
2687
}
2688
}
2689
Game.HardReset=function(bypass)
2690
{
2691
if (!bypass)
2692
{
2693
Game.Prompt('<h3>Wipe save</h3><div class="block">Do you REALLY want to wipe your save?<br><small>You will lose your progress, your achievements, and your heavenly chips!</small></div>',[['Yes!','Game.ClosePrompt();Game.HardReset(1);'],'No']);
2694
}
2695
else if (bypass==1)
2696
{
2697
Game.Prompt('<h3>Wipe save</h3><div class="block">Whoah now, are you really, <b><i>REALLY</i></b> sure you want to go through with this?<br><small>Don\'t say we didn\'t warn you!</small></div>',[['Do it!','Game.ClosePrompt();Game.HardReset(2);'],'No']);
2698
}
2699
else
2700
{
2701
for (var i in Game.AchievementsById)
2702
{
2703
var me=Game.AchievementsById[i];
2704
me.won=0;
2705
}
2706
for (var i in Game.ObjectsById)
2707
{
2708
var me=Game.ObjectsById[i];
2709
me.level=0;
2710
}
2711
2712
Game.AchievementsOwned=0;
2713
Game.goldenClicks=0;
2714
Game.missedGoldenClicks=0;
2715
Game.Reset(1);
2716
Game.resets=0;
2717
Game.fullDate=parseInt(Date.now());
2718
Game.bakeryName=Game.GetBakeryName();
2719
Game.bakeryNameRefresh();
2720
Game.cookiesReset=0;
2721
Game.prestige=0;
2722
Game.heavenlyChips=0;
2723
Game.heavenlyChipsSpent=0;
2724
Game.heavenlyCookies=0;
2725
Game.permanentUpgrades=[-1,-1,-1,-1,-1];
2726
Game.ascensionMode=0;
2727
Game.lumps=-1;
2728
Game.lumpsTotal=-1;
2729
Game.lumpT=Date.now();
2730
Game.lumpRefill=0;
2731
Game.removeClass('lumpsOn');
2732
}
2733
}
2734
2735
2736
2737
Game.onCrate=0;
2738
Game.setOnCrate=function(what)
2739
{
2740
Game.onCrate=what;
2741
}
2742
Game.crate=function(me,context,forceClickStr,id)
2743
{
2744
//produce a crate with associated tooltip for an upgrade or achievement
2745
//me is an object representing the upgrade or achievement
2746
//context can be "store", "ascend", "stats" or undefined
2747
//forceClickStr changes what is done when the crate is clicked
2748
//id is the resulting div's desired id
2749
2750
var classes='crate';
2751
var enabled=0;
2752
var noFrame=0;
2753
var attachment='top';
2754
var neuromancy=0;
2755
if (context=='stats' && (Game.Has('Neuromancy') || (Game.sesame && me.pool=='debug'))) neuromancy=1;
2756
var mysterious=0;
2757
var clickStr='';
2758
2759
if (me.type=='upgrade')
2760
{
2761
var canBuy=(context=='store'?me.canBuy():true);
2762
if (context=='stats' && me.bought==0 && !Game.Has('Neuromancy') && (!Game.sesame || me.pool!='debug')) return '';
2763
else if (context=='stats' && (Game.Has('Neuromancy') || (Game.sesame && me.pool=='debug'))) neuromancy=1;
2764
else if (context=='store' && !canBuy) enabled=0;
2765
else if (context=='ascend' && me.bought==0) enabled=0;
2766
else enabled=1;
2767
if (me.bought>0) enabled=1;
2768
2769
if (context=='stats' && !Game.prefs.crates) noFrame=1;
2770
2771
classes+=' upgrade';
2772
if (me.pool=='prestige') classes+=' heavenly';
2773
2774
2775
if (neuromancy) clickStr='Game.UpgradesById['+me.id+'].toggle();';
2776
}
2777
else if (me.type=='achievement')
2778
{
2779
if (context=='stats' && me.won==0 && me.pool!='normal') return '';
2780
else if (context!='stats') enabled=1;
2781
2782
if (context=='stats' && !Game.prefs.crates) noFrame=1;
2783
2784
classes+=' achievement';
2785
if (me.pool=='shadow') classes+=' shadow';
2786
if (me.won>0) enabled=1;
2787
else mysterious=1;
2788
if (!enabled) clickStr='Game.AchievementsById['+me.id+'].click();';
2789
2790
if (neuromancy) clickStr='Game.AchievementsById['+me.id+'].toggle();';
2791
}
2792
2793
if (context=='store') attachment='store';
2794
2795
if (forceClickStr) clickStr=forceClickStr;
2796
2797
if (me.choicesFunction) classes+=' selector';
2798
2799
2800
var icon=me.icon;
2801
if (mysterious) icon=[0,7];
2802
2803
if (me.iconFunction) icon=me.iconFunction();
2804
2805
if (me.bought && context=='store') enabled=0;
2806
2807
if (enabled) classes+=' enabled';// else classes+=' disabled';
2808
if (noFrame) classes+=' noFrame';
2809
2810
var text=[];
2811
if (Game.sesame)
2812
{
2813
if (Game.debuggedUpgradeCpS[me.name] || Game.debuggedUpgradeCpClick[me.name])
2814
{
2815
text.push('x'+Beautify(1+Game.debuggedUpgradeCpS[me.name],2));text.push(Game.debugColors[Math.floor(Math.max(0,Math.min(Game.debugColors.length-1,Math.pow(Game.debuggedUpgradeCpS[me.name]/2,0.5)*Game.debugColors.length)))]);
2816
text.push('x'+Beautify(1+Game.debuggedUpgradeCpClick[me.name],2));text.push(Game.debugColors[Math.floor(Math.max(0,Math.min(Game.debugColors.length-1,Math.pow(Game.debuggedUpgradeCpClick[me.name]/2,0.5)*Game.debugColors.length)))]);
2817
}
2818
if (Game.extraInfo) {text.push(Math.floor(me.order)+(me.power?'<br>P:'+me.power:''));text.push('#fff');}
2819
}
2820
var textStr='';
2821
for (var i=0;i<text.length;i+=2)
2822
{
2823
textStr+='<div style="opacity:0.9;z-index:1000;padding:0px 2px;background:'+text[i+1]+';color:#000;font-size:10px;position:absolute;top:'+(i/2*10)+'px;left:0px;">'+text[i]+'</div>';
2824
}
2825
2826
return '<div'+
2827
(clickStr!=''?(' '+Game.clickStr+'="'+clickStr+'"'):'')+
2828
' class="'+classes+'" '+
2829
Game.getDynamicTooltip(
2830
'function(){return Game.crateTooltip(Game.'+(me.type=='upgrade'?'Upgrades':'Achievements')+'ById['+me.id+'],'+(context?'\''+context+'\'':'')+');}',
2831
attachment,true
2832
)+
2833
(id?'id="'+id+'" ':'')+
2834
'style="'+(mysterious?
2835
'background-position:'+(-0*48)+'px '+(-7*48)+'px':
2836
(icon[2]?'background-image:url('+icon[2]+');':'')+'background-position:'+(-icon[0]*48)+'px '+(-icon[1]*48)+'px')+';'+
2837
((context=='ascend' && me.pool=='prestige')?'position:absolute;left:'+me.posX+'px;top:'+me.posY+'px;':'')+
2838
'">'+
2839
textStr+
2840
(me.choicesFunction?'<div class="selectorCorner"></div>':'')+
2841
'</div>';
2842
}
2843
Game.crateTooltip=function(me,context)
2844
{
2845
var tags=[];
2846
mysterious=0;
2847
var neuromancy=0;
2848
var price='';
2849
if (context=='stats' && (Game.Has('Neuromancy') || (Game.sesame && me.pool=='debug'))) neuromancy=1;
2850
2851
if (me.type=='upgrade')
2852
{
2853
if (me.pool=='prestige') tags.push('Heavenly','#efa438');
2854
else if (me.pool=='tech') tags.push('Tech','#36a4ff');
2855
else if (me.pool=='cookie') tags.push('Cookie',0);
2856
else if (me.pool=='debug') tags.push('Debug','#00c462');
2857
else if (me.pool=='toggle') tags.push('Switch',0);
2858
else tags.push('Upgrade',0);
2859
2860
if (me.tier!=0 && Game.Has('Label printer')) tags.push('Tier : '+Game.Tiers[me.tier].name,Game.Tiers[me.tier].color);
2861
if (me.name=='Label printer' && Game.Has('Label printer')) tags.push('Tier : Self-referential','#ff00ea');
2862
2863
if (me.isVaulted()) tags.push('Vaulted','#4e7566');
2864
2865
if (me.bought>0)
2866
{
2867
if (me.pool=='tech') tags.push('Researched',0);
2868
else if (me.kitten) tags.push('Purrchased',0);
2869
else tags.push('Purchased',0);
2870
}
2871
2872
if (me.lasting && me.unlocked) tags.push('Unlocked forever','#f2ff87');
2873
2874
if (neuromancy && me.bought==0) tags.push('Click to learn!','#00c462');
2875
else if (neuromancy && me.bought>0) tags.push('Click to unlearn!','#00c462');
2876
2877
var canBuy=(context=='store'?me.canBuy():true);
2878
var cost=me.getPrice();
2879
if (me.priceLumps>0) cost=me.priceLumps;
2880
2881
if (me.priceLumps==0 && cost==0) price='';
2882
else
2883
{
2884
price='<div style="float:right;text-align:right;"><span class="price'+
2885
(me.priceLumps>0?(' lump'):'')+
2886
(me.pool=='prestige'?((me.bought || Game.heavenlyChips>=cost)?' heavenly':' heavenly disabled'):'')+
2887
(context=='store'?(canBuy?'':' disabled'):'')+
2888
'">'+Beautify(Math.round(cost))+'</span>'+((me.pool!='prestige' && me.priceLumps==0)?Game.costDetails(cost):'')+'</div>';
2889
}
2890
}
2891
else if (me.type=='achievement')
2892
{
2893
if (me.pool=='shadow') tags.push('Shadow Achievement','#9700cf');
2894
else tags.push('Achievement',0);
2895
if (me.won>0) tags.push('Unlocked',0);
2896
else {tags.push('Locked',0);mysterious=1;}
2897
2898
if (neuromancy && me.won==0) tags.push('Click to win!','#00c462');
2899
else if (neuromancy && me.won>0) tags.push('Click to lose!','#00c462');
2900
}
2901
2902
var tagsStr='';
2903
for (var i=0;i<tags.length;i+=2)
2904
{
2905
if (i%2==0) tagsStr+=' <div class="tag" style="color:'+(tags[i+1]==0?'#fff':tags[i+1])+';">['+tags[i]+']</div>';
2906
}
2907
tagsStr=tagsStr.substring(1);
2908
2909
var icon=me.icon;
2910
if (mysterious) icon=[0,7];
2911
2912
if (me.iconFunction) icon=me.iconFunction();
2913
2914
2915
var tip='';
2916
if (context=='store')
2917
{
2918
if (me.pool!='toggle' && me.pool!='tech')
2919
{
2920
if (Game.Has('Inspired checklist'))
2921
{
2922
if (me.isVaulted()) tip='Upgrade is vaulted and will not be auto-purchased.<br>Click to purchase. Shift-click to unvault.';
2923
else tip='Click to purchase. Shift-click to vault.';
2924
if (Game.keys[16]) tip+='<br>(You are holding Shift.)';
2925
else tip+='<br>(You are not holding Shift.)';
2926
}
2927
else tip='Click to purchase.';
2928
}
2929
else if (me.pool=='toggle' && me.choicesFunction) tip='Click to open selector.';
2930
else if (me.pool=='toggle') tip='Click to toggle.';
2931
else if (me.pool=='tech') tip='Click to research.';
2932
}
2933
2934
var desc=me.desc;
2935
if (me.descFunc) desc=me.descFunc();
2936
if (me.bought && context=='store' && me.displayFuncWhenOwned) desc=me.displayFuncWhenOwned()+'<div class="line"></div>'+desc;
2937
if (me.unlockAt)
2938
{
2939
if (me.unlockAt.require)
2940
{
2941
var it=Game.Upgrades[me.unlockAt.require];
2942
desc='<div style="font-size:80%;text-align:center;">From <div class="icon" style="vertical-align:middle;display:inline-block;'+(it.icon[2]?'background-image:url('+it.icon[2]+');':'')+'background-position:'+(-it.icon[0]*48)+'px '+(-it.icon[1]*48)+'px;transform:scale(0.5);margin:-16px;"></div> '+it.name+'</div><div class="line"></div>'+desc;
2943
}
2944
/*else if (me.unlockAt.season)
2945
{
2946
var it=Game.seasons[me.unlockAt.season];
2947
desc='<div style="font-size:80%;text-align:center;">From <div class="icon" style="vertical-align:middle;display:inline-block;'+(Game.Upgrades[it.trigger].icon[2]?'background-image:url('+Game.Upgrades[it.trigger].icon[2]+');':'')+'background-position:'+(-Game.Upgrades[it.trigger].icon[0]*48)+'px '+(-Game.Upgrades[it.trigger].icon[1]*48)+'px;transform:scale(0.5);margin:-16px;"></div> '+it.name+'</div><div class="line"></div>'+desc;
2948
}*/
2949
else if (me.unlockAt.text)
2950
{
2951
var it=Game.Upgrades[me.unlockAt.require];
2952
desc='<div style="font-size:80%;text-align:center;">From <b>'+text+'</b></div><div class="line"></div>'+desc;
2953
}
2954
}
2955
2956
return '<div style="padding:8px 4px;min-width:350px;">'+
2957
'<div class="icon" style="float:left;margin-left:-8px;margin-top:-8px;'+(icon[2]?'background-image:url('+icon[2]+');':'')+'background-position:'+(-icon[0]*48)+'px '+(-icon[1]*48)+'px;"></div>'+
2958
(me.bought && context=='store'?'':price)+
2959
'<div class="name">'+(mysterious?'???':me.name)+'</div>'+
2960
tagsStr+
2961
'<div class="line"></div><div class="description">'+(mysterious?'???':desc)+'</div></div>'+
2962
(tip!=''?('<div class="line"></div><div style="font-size:10px;font-weight:bold;color:#999;text-align:center;padding-bottom:4px;line-height:100%;">'+tip+'</div>'):'')+
2963
(Game.sesame?('<div style="font-size:9px;">Id : '+me.id+' | Order : '+Math.floor(me.order)+(me.tier?' | Tier : '+me.tier:'')+'</div>'):'');
2964
}
2965
2966
Game.costDetails=function(cost)
2967
{
2968
if (!Game.Has('Genius accounting')) return '';
2969
if (!cost) return '';
2970
var priceInfo='';
2971
var cps=Game.cookiesPs*(1-Game.cpsSucked);
2972
if (cost>Game.cookies) priceInfo+='in '+Game.sayTime(((cost-Game.cookies)/cps+1)*Game.fps)+'<br>';
2973
priceInfo+=Game.sayTime((cost/cps+1)*Game.fps)+' worth<br>';
2974
priceInfo+=Beautify((cost/Game.cookies)*100,1)+'% of bank<br>';
2975
return '<div style="font-size:80%;opacity:0.7;line-height:90%;">'+priceInfo+'</div>';
2976
}
2977
2978
2979
/*=====================================================================================
2980
PRESTIGE
2981
=======================================================================================*/
2982
2983
Game.HCfactor=3;
2984
Game.HowMuchPrestige=function(cookies)//how much prestige [cookies] should land you
2985
{
2986
return Math.pow(cookies/1000000000000,1/Game.HCfactor);
2987
}
2988
Game.HowManyCookiesReset=function(chips)//how many cookies [chips] are worth
2989
{
2990
//this must be the inverse of the above function (ie. if cookies=chips^2, chips=cookies^(1/2) )
2991
return Math.pow(chips,Game.HCfactor)*1000000000000;
2992
}
2993
Game.gainedPrestige=0;
2994
Game.EarnHeavenlyChips=function(cookiesForfeited)
2995
{
2996
//recalculate prestige and chips owned
2997
var prestige=Math.floor(Game.HowMuchPrestige(Game.cookiesReset+cookiesForfeited));
2998
if (prestige>Game.prestige)//did we gain prestige levels?
2999
{
3000
var prestigeDifference=prestige-Game.prestige;
3001
Game.gainedPrestige=prestigeDifference;
3002
Game.heavenlyChips+=prestigeDifference;
3003
Game.prestige=prestige;
3004
if (Game.prefs.popups) Game.Popup('You gain '+Beautify(prestigeDifference)+' prestige level'+(prestigeDifference==1?'':'s')+'!');
3005
else Game.Notify('You forfeit your '+Beautify(cookiesForfeited)+' cookies.','You gain <b>'+Beautify(prestigeDifference)+'</b> prestige level'+(prestigeDifference==1?'':'s')+'!',[19,7]);
3006
}
3007
}
3008
3009
Game.GetHeavenlyMultiplier=function()
3010
{
3011
var heavenlyMult=0;
3012
if (Game.Has('Heavenly chip secret')) heavenlyMult+=0.05;
3013
if (Game.Has('Heavenly cookie stand')) heavenlyMult+=0.20;
3014
if (Game.Has('Heavenly bakery')) heavenlyMult+=0.25;
3015
if (Game.Has('Heavenly confectionery')) heavenlyMult+=0.25;
3016
if (Game.Has('Heavenly key')) heavenlyMult+=0.25;
3017
//if (Game.hasAura('Dragon God')) heavenlyMult*=1.05;
3018
heavenlyMult*=1+Game.auraMult('Dragon God')*0.05;
3019
if (Game.Has('Lucky digit')) heavenlyMult*=1.01;
3020
if (Game.Has('Lucky number')) heavenlyMult*=1.01;
3021
if (Game.Has('Lucky payout')) heavenlyMult*=1.01;
3022
if (Game.hasGod)
3023
{
3024
var godLvl=Game.hasGod('creation');
3025
if (godLvl==1) heavenlyMult*=0.7;
3026
else if (godLvl==2) heavenlyMult*=0.8;
3027
else if (godLvl==3) heavenlyMult*=0.9;
3028
}
3029
return heavenlyMult;
3030
}
3031
3032
Game.ascensionModes={
3033
0:{name:'None',desc:'No special modifiers.',icon:[10,0]},
3034
1:{name:'Born again',desc:'This run will behave as if you\'d just started the game from scratch. Prestige levels and heavenly upgrades will have no effect, as will sugar lumps and building levels. Perma-upgrades and minigames will be unavailable.<div class="line"></div>Some achievements are only available in this mode.',icon:[2,7]}/*,
3035
2:{name:'Trigger finger',desc:'In this run, scrolling your mouse wheel on the cookie counts as clicking it. Some upgrades introduce new clicking behaviors.<br>No clicking achievements may be obtained in this mode.<div class="line"></div>Reaching 1 quadrillion cookies in this mode unlocks a special heavenly upgrade.',icon:[12,0]}*/
3036
};
3037
3038
Game.ascendMeterPercent=0;
3039
Game.ascendMeterPercentT=0;
3040
Game.ascendMeterLevel=100000000000000000000000000000;
3041
3042
Game.nextAscensionMode=0;
3043
Game.UpdateAscensionModePrompt=function()
3044
{
3045
var icon=Game.ascensionModes[Game.nextAscensionMode].icon;
3046
var name=Game.ascensionModes[Game.nextAscensionMode].name;
3047
l('ascendModeButton').innerHTML=
3048
'<div class="crate noFrame enabled" '+Game.clickStr+'="Game.PickAscensionMode();" '+Game.getTooltip(
3049
'<div style="min-width:200px;text-align:center;font-size:11px;">Challenge mode for the next run :<br><b>'+name+'</b><div class="line"></div>Challenge modes apply special modifiers to your next ascension.<br>Click to change.</div>'
3050
,'bottom-right')+' style="opacity:1;float:none;display:block;background-position:'+(-icon[0]*48)+'px '+(-icon[1]*48)+'px;"></div>';
3051
}
3052
Game.PickAscensionMode=function()
3053
{
3054
PlaySound('snd/tick.mp3');
3055
Game.tooltip.hide();
3056
3057
var str='';
3058
for (var i in Game.ascensionModes)
3059
{
3060
var icon=Game.ascensionModes[i].icon;
3061
str+='<div class="crate enabled'+(i==Game.nextAscensionMode?' highlighted':'')+'" id="challengeModeSelector'+i+'" style="opacity:1;float:none;display:inline-block;background-position:'+(-icon[0]*48)+'px '+(-icon[1]*48)+'px;" '+Game.clickStr+'="Game.nextAscensionMode='+i+';Game.PickAscensionMode();PlaySound(\'snd/tick.mp3\');Game.choiceSelectorOn=-1;" onMouseOut="l(\'challengeSelectedName\').innerHTML=Game.ascensionModes[Game.nextAscensionMode].name;l(\'challengeSelectedDesc\').innerHTML=Game.ascensionModes[Game.nextAscensionMode].desc;" onMouseOver="l(\'challengeSelectedName\').innerHTML=Game.ascensionModes['+i+'].name;l(\'challengeSelectedDesc\').innerHTML=Game.ascensionModes['+i+'].desc;"'+
3062
'></div>';
3063
}
3064
Game.Prompt('<h3>Select a challenge mode</h3>'+
3065
'<div class="line"></div><div class="crateBox">'+str+'</div><h4 id="challengeSelectedName">'+Game.ascensionModes[Game.nextAscensionMode].name+'</h4><div class="line"></div><div id="challengeSelectedDesc" style="min-height:128px;">'+Game.ascensionModes[Game.nextAscensionMode].desc+'</div><div class="line"></div>'
3066
,[['Confirm','Game.UpdateAscensionModePrompt();Game.ClosePrompt();']],0,'widePrompt');
3067
}
3068
3069
Game.UpdateLegacyPrompt=function()
3070
{
3071
if (!l('legacyPromptData')) return 0;
3072
var date=new Date();
3073
date.setTime(Date.now()-Game.startDate);
3074
var timeInSeconds=date.getTime()/1000;
3075
var startDate=Game.sayTime(timeInSeconds*Game.fps,-1);
3076
3077
var ascendNowToGet=Math.floor(Game.HowMuchPrestige(Game.cookiesReset+Game.cookiesEarned)-Game.HowMuchPrestige(Game.cookiesReset));
3078
var cookiesToNext=Math.floor(Game.HowManyCookiesReset(Game.HowMuchPrestige(Game.cookiesReset+Game.cookiesEarned)+1)-Game.cookiesReset-Game.cookiesEarned);
3079
l('legacyPromptData').innerHTML=''+
3080
'<div class="icon" style="pointer-event:none;transform:scale(2);opacity:0.25;position:absolute;right:-8px;bottom:-8px;background-position:'+(-19*48)+'px '+(-7*48)+'px;"></div>'+
3081
'<div class="listing"><b>Run duration :</b> '+(startDate==''?'tiny':(startDate))+'</div>'+
3082
//'<div class="listing">Earned : '+Beautify(Game.cookiesEarned)+', Reset : '+Beautify(Game.cookiesReset)+'</div>'+
3083
'<div class="listing"><b>Prestige level :</b> '+Beautify(Game.prestige)+'</div>'+
3084
'<div class="listing"><b>Heavenly chips :</b> '+Beautify(Game.heavenlyChips)+'</div>'+
3085
(ascendNowToGet>=1?('<div class="listing"><b>Ascending now will produce :</b> '+Beautify(ascendNowToGet)+' heavenly chip'+((ascendNowToGet)==1?'':'s')+'</div>'):
3086
('<div class="listing warning"><b>'+Beautify(cookiesToNext)+'</b> more cookie'+((cookiesToNext)==1?'':'s')+' for the next prestige level.<br>You may ascend now, but will gain no benefits.</div>'))+
3087
'';
3088
if (1 || ascendNowToGet>=1) l('promptOption0').style.display='inline-block'; else l('promptOption0').style.display='none';
3089
}
3090
3091
l('ascendOverlay').innerHTML=
3092
'<div id="ascendBox">'+
3093
'<div class="ascendData smallFramed prompt" '+Game.getTooltip(
3094
'<div style="min-width:200px;text-align:center;font-size:11px;">Each prestige level grants you a permanent +1% CpS.<br>The more levels you have, the more cookies they require.</div>'
3095
,'bottom-right')+' style="margin-top:8px;"><h3 id="ascendPrestige"></h3></div>'+
3096
'<div class="ascendData smallFramed prompt" '+Game.getTooltip(
3097
'<div style="min-width:200px;text-align:center;font-size:11px;">Heavenly chips are used to buy heavenly upgrades.<br>You gain 1 chip every time you gain a prestige level.</div>'
3098
,'bottom-right')+'><h3 id="ascendHCs"></h3></div>'+
3099
'<a id="ascendButton" class="option framed large red" '+Game.getTooltip(
3100
'<div style="min-width:200px;text-align:center;font-size:11px;">Click this once you\'ve bought<br>everything you need!</div>'
3101
,'bottom-right')+' style="font-size:16px;margin-top:0px;"><span class="fancyText" style="font-size:20px;">Reincarnate</span></a>'+
3102
'<div id="ascendModeButton" style="position:absolute;right:34px;bottom:25px;display:none;"></div>'+
3103
'<input type="text" style="display:block;" id="upgradePositions"/></div>'+
3104
3105
'<div id="ascendInfo"><div class="ascendData smallFramed" style="margin-top:22px;width:40%;font-size:11px;">You are ascending.<br>Drag the screen around<br>or use arrow keys!<br>When you\'re ready,<br>click Reincarnate.</div></div>';
3106
3107
Game.UpdateAscensionModePrompt();
3108
3109
AddEvent(l('ascendButton'),'click',function(){
3110
PlaySound('snd/tick.mp3');
3111
Game.Reincarnate();
3112
});
3113
3114
Game.ascendl=l('ascend');
3115
Game.ascendContentl=l('ascendContent');
3116
Game.ascendZoomablel=l('ascendZoomable');
3117
Game.ascendUpgradesl=l('ascendUpgrades');
3118
Game.OnAscend=0;
3119
Game.AscendTimer=0;//how far we are into the ascend animation
3120
Game.AscendDuration=Game.fps*5;//how long the ascend animation is
3121
Game.AscendBreakpoint=Game.AscendDuration*0.5;//at which point the cookie explodes during the ascend animation
3122
Game.UpdateAscendIntro=function()
3123
{
3124
if (Game.AscendTimer==1) PlaySound('snd/charging.mp3');
3125
if (Game.AscendTimer==Math.floor(Game.AscendBreakpoint)) PlaySound('snd/thud.mp3');
3126
Game.AscendTimer++;
3127
if (Game.AscendTimer>Game.AscendDuration)//end animation and launch ascend screen
3128
{
3129
PlaySound('snd/cymbalRev.mp3',0.5);
3130
PlaySound('snd/choir.mp3');
3131
Game.EarnHeavenlyChips(Game.cookiesEarned);
3132
Game.AscendTimer=0;
3133
Game.OnAscend=1;Game.removeClass('ascendIntro');
3134
Game.addClass('ascending');
3135
Game.BuildAscendTree();
3136
Game.heavenlyChipsDisplayed=Game.heavenlyChips;
3137
Game.nextAscensionMode=0;
3138
Game.ascensionMode=0;
3139
Game.UpdateAscensionModePrompt();
3140
}
3141
}
3142
Game.ReincarnateTimer=0;//how far we are into the reincarnation animation
3143
Game.ReincarnateDuration=Game.fps*1;//how long the reincarnation animation is
3144
Game.UpdateReincarnateIntro=function()
3145
{
3146
if (Game.ReincarnateTimer==1) PlaySound('snd/pop'+Math.floor(Math.random()*3+1)+'.mp3',0.75);
3147
Game.ReincarnateTimer++;
3148
if (Game.ReincarnateTimer>Game.ReincarnateDuration)//end animation and launch regular game
3149
{
3150
Game.ReincarnateTimer=0;
3151
Game.removeClass('reincarnating');
3152
}
3153
}
3154
Game.Reincarnate=function(bypass)
3155
{
3156
if (!bypass) Game.Prompt('<h3>Reincarnate</h3><div class="block">Are you ready to return to the mortal world?</div>',[['Yes','Game.ClosePrompt();Game.Reincarnate(1);'],'No']);
3157
else
3158
{
3159
Game.ascendUpgradesl.innerHTML='';
3160
Game.ascensionMode=Game.nextAscensionMode;
3161
Game.nextAscensionMode=0;
3162
Game.Reset();
3163
if (Game.HasAchiev('Rebirth'))
3164
{
3165
if (Game.prefs.popups) Game.Popup('Reincarnated');
3166
else Game.Notify('Reincarnated','Hello, cookies!',[10,0],4);
3167
}
3168
if (Game.resets>=1000) Game.Win('Endless cycle');
3169
if (Game.resets>=100) Game.Win('Reincarnation');
3170
if (Game.resets>=10) Game.Win('Resurrection');
3171
if (Game.resets>=1) Game.Win('Rebirth');
3172
Game.removeClass('ascending');
3173
Game.OnAscend=0;
3174
//trigger the reincarnate animation
3175
Game.ReincarnateTimer=1;
3176
Game.addClass('reincarnating');
3177
Game.BigCookieSize=0;
3178
}
3179
}
3180
Game.GiveUpAscend=function(bypass)
3181
{
3182
if (!bypass) Game.Prompt('<h3>Give up</h3><div class="block">Are you sure? You\'ll have to start this run over and won\'t gain any heavenly chips!</div>',[['Yes','Game.ClosePrompt();Game.GiveUpAscend(1);'],'No']);
3183
else
3184
{
3185
if (Game.prefs.popups) Game.Popup('Game reset');
3186
else Game.Notify('Gave up','Let\'s try this again!',[0,5],4);
3187
Game.Reset();
3188
}
3189
}
3190
Game.Ascend=function(bypass)
3191
{
3192
if (!bypass) Game.Prompt('<h3>Ascend</h3><div class="block">Do you REALLY want to ascend?<div class="line"></div>You will lose your progress and start over from scratch.<div class="line"></div>All your cookies will be converted into prestige and heavenly chips.<div class="line"></div>You will keep your achievements'+(Game.canLumps()?', building levels and sugar lumps':'')+'.</div>',[['Yes!','Game.ClosePrompt();Game.Ascend(1);'],'No']);
3193
else
3194
{
3195
if (Game.prefs.popups) Game.Popup('Ascending');
3196
else Game.Notify('Ascending','So long, cookies.',[20,7],4);
3197
Game.OnAscend=0;Game.removeClass('ascending');
3198
Game.addClass('ascendIntro');
3199
//trigger the ascend animation
3200
Game.AscendTimer=1;
3201
Game.killShimmers();
3202
l('toggleBox').style.display='none';
3203
l('toggleBox').innerHTML='';
3204
Game.choiceSelectorOn=-1;
3205
Game.ToggleSpecialMenu(0);
3206
Game.AscendOffX=0;
3207
Game.AscendOffY=0;
3208
Game.AscendOffXT=0;
3209
Game.AscendOffYT=0;
3210
Game.AscendZoomT=1;
3211
Game.AscendZoom=0.2;
3212
}
3213
}
3214
3215
Game.DebuggingPrestige=0;
3216
Game.AscendDragX=0;
3217
Game.AscendDragY=0;
3218
Game.AscendOffX=0;
3219
Game.AscendOffY=0;
3220
Game.AscendZoom=1;
3221
Game.AscendOffXT=0;
3222
Game.AscendOffYT=0;
3223
Game.AscendZoomT=1;
3224
Game.AscendDragging=0;
3225
Game.AscendGridSnap=24;
3226
Game.heavenlyBounds={left:0,right:0,top:0,bottom:0};
3227
Game.UpdateAscend=function()
3228
{
3229
if (Game.keys[37]) Game.AscendOffXT+=16*(1/Game.AscendZoomT);
3230
if (Game.keys[38]) Game.AscendOffYT+=16*(1/Game.AscendZoomT);
3231
if (Game.keys[39]) Game.AscendOffXT-=16*(1/Game.AscendZoomT);
3232
if (Game.keys[40]) Game.AscendOffYT-=16*(1/Game.AscendZoomT);
3233
3234
if (Game.AscendOffXT>-Game.heavenlyBounds.left) Game.AscendOffXT=-Game.heavenlyBounds.left;
3235
if (Game.AscendOffXT<-Game.heavenlyBounds.right) Game.AscendOffXT=-Game.heavenlyBounds.right;
3236
if (Game.AscendOffYT>-Game.heavenlyBounds.top) Game.AscendOffYT=-Game.heavenlyBounds.top;
3237
if (Game.AscendOffYT<-Game.heavenlyBounds.bottom) Game.AscendOffYT=-Game.heavenlyBounds.bottom;
3238
Game.AscendOffX+=(Game.AscendOffXT-Game.AscendOffX)*0.5;
3239
Game.AscendOffY+=(Game.AscendOffYT-Game.AscendOffY)*0.5;
3240
Game.AscendZoom+=(Game.AscendZoomT-Game.AscendZoom)*0.25;
3241
if (Math.abs(Game.AscendZoomT-Game.AscendZoom)<0.005) Game.AscendZoom=Game.AscendZoomT;
3242
3243
if (Game.DebuggingPrestige)
3244
{
3245
for (var i in Game.PrestigeUpgrades)
3246
{
3247
var me=Game.PrestigeUpgrades[i];
3248
AddEvent(l('heavenlyUpgrade'+me.id),'mousedown',function(me){return function(){
3249
if (!Game.DebuggingPrestige) return;
3250
Game.SelectedHeavenlyUpgrade=me;
3251
}}(me));
3252
AddEvent(l('heavenlyUpgrade'+me.id),'mouseup',function(me){return function(){
3253
if (Game.SelectedHeavenlyUpgrade==me) {Game.SelectedHeavenlyUpgrade=0;Game.BuildAscendTree();}
3254
}}(me));
3255
}
3256
}
3257
3258
if (Game.mouseDown && !Game.promptOn)
3259
{
3260
if (!Game.AscendDragging)
3261
{
3262
Game.AscendDragX=Game.mouseX;
3263
Game.AscendDragY=Game.mouseY;
3264
}
3265
Game.AscendDragging=1;
3266
3267
if (Game.DebuggingPrestige)
3268
{
3269
if (Game.SelectedHeavenlyUpgrade)
3270
{
3271
Game.tooltip.hide();
3272
//drag upgrades around
3273
var me=Game.SelectedHeavenlyUpgrade;
3274
me.posX+=(Game.mouseX-Game.AscendDragX)*(1/Game.AscendZoomT);
3275
me.posY+=(Game.mouseY-Game.AscendDragY)*(1/Game.AscendZoomT);
3276
var posX=me.posX;//Math.round(me.posX/Game.AscendGridSnap)*Game.AscendGridSnap;
3277
var posY=me.posY;//Math.round(me.posY/Game.AscendGridSnap)*Game.AscendGridSnap;
3278
l('heavenlyUpgrade'+me.id).style.left=Math.floor(posX)+'px';
3279
l('heavenlyUpgrade'+me.id).style.top=Math.floor(posY)+'px';
3280
for (var ii in me.parents)
3281
{
3282
var origX=0;
3283
var origY=0;
3284
var targX=me.posX+28;
3285
var targY=me.posY+28;
3286
if (me.parents[ii]!=-1) {origX=me.parents[ii].posX+28;origY=me.parents[ii].posY+28;}
3287
var rot=-(Math.atan((targY-origY)/(origX-targX))/Math.PI)*180;
3288
if (targX<=origX) rot+=180;
3289
var dist=Math.floor(Math.sqrt((targX-origX)*(targX-origX)+(targY-origY)*(targY-origY)));
3290
//l('heavenlyLink'+me.id+'-'+ii).style='width:'+dist+'px;-webkit-transform:rotate('+rot+'deg);-moz-transform:rotate('+rot+'deg);-ms-transform:rotate('+rot+'deg);-o-transform:rotate('+rot+'deg);transform:rotate('+rot+'deg);left:'+(origX)+'px;top:'+(origY)+'px;';
3291
l('heavenlyLink'+me.id+'-'+ii).style='width:'+dist+'px;transform:rotate('+rot+'deg);left:'+(origX)+'px;top:'+(origY)+'px;';
3292
}
3293
}
3294
}
3295
if (!Game.SelectedHeavenlyUpgrade)
3296
{
3297
Game.AscendOffXT+=(Game.mouseX-Game.AscendDragX)*(1/Game.AscendZoomT);
3298
Game.AscendOffYT+=(Game.mouseY-Game.AscendDragY)*(1/Game.AscendZoomT);
3299
}
3300
Game.AscendDragX=Game.mouseX;
3301
Game.AscendDragY=Game.mouseY;
3302
}
3303
else
3304
{
3305
/*if (Game.SelectedHeavenlyUpgrade)
3306
{
3307
var me=Game.SelectedHeavenlyUpgrade;
3308
me.posX=Math.round(me.posX/Game.AscendGridSnap)*Game.AscendGridSnap;
3309
me.posY=Math.round(me.posY/Game.AscendGridSnap)*Game.AscendGridSnap;
3310
l('heavenlyUpgrade'+me.id).style.left=me.posX+'px';
3311
l('heavenlyUpgrade'+me.id).style.top=me.posY+'px';
3312
}*/
3313
Game.AscendDragging=0;
3314
Game.SelectedHeavenlyUpgrade=0;
3315
}
3316
if (Game.Click || Game.promptOn)
3317
{
3318
Game.AscendDragging=0;
3319
}
3320
3321
//Game.ascendl.style.backgroundPosition=Math.floor(Game.AscendOffX/2)+'px '+Math.floor(Game.AscendOffY/2)+'px';
3322
//Game.ascendl.style.backgroundPosition=Math.floor(Game.AscendOffX/2)+'px '+Math.floor(Game.AscendOffY/2)+'px,'+Math.floor(Game.AscendOffX/4)+'px '+Math.floor(Game.AscendOffY/4)+'px';
3323
//Game.ascendContentl.style.left=Math.floor(Game.AscendOffX)+'px';
3324
//Game.ascendContentl.style.top=Math.floor(Game.AscendOffY)+'px';
3325
Game.ascendContentl.style.webkitTransform='translate('+Math.floor(Game.AscendOffX)+'px,'+Math.floor(Game.AscendOffY)+'px)';
3326
Game.ascendContentl.style.msTransform='translate('+Math.floor(Game.AscendOffX)+'px,'+Math.floor(Game.AscendOffY)+'px)';
3327
Game.ascendContentl.style.oTransform='translate('+Math.floor(Game.AscendOffX)+'px,'+Math.floor(Game.AscendOffY)+'px)';
3328
Game.ascendContentl.style.mozTransform='translate('+Math.floor(Game.AscendOffX)+'px,'+Math.floor(Game.AscendOffY)+'px)';
3329
Game.ascendContentl.style.transform='translate('+Math.floor(Game.AscendOffX)+'px,'+Math.floor(Game.AscendOffY)+'px)';
3330
Game.ascendZoomablel.style.webkitTransform='scale('+(Game.AscendZoom)+','+(Game.AscendZoom)+')';
3331
Game.ascendZoomablel.style.msTransform='scale('+(Game.AscendZoom)+','+(Game.AscendZoom)+')';
3332
Game.ascendZoomablel.style.oTransform='scale('+(Game.AscendZoom)+','+(Game.AscendZoom)+')';
3333
Game.ascendZoomablel.style.mozTransform='scale('+(Game.AscendZoom)+','+(Game.AscendZoom)+')';
3334
Game.ascendZoomablel.style.transform='scale('+(Game.AscendZoom)+','+(Game.AscendZoom)+')';
3335
3336
//if (Game.Scroll!=0) Game.ascendContentl.style.transformOrigin=Math.floor(Game.windowW/2-Game.mouseX)+'px '+Math.floor(Game.windowH/2-Game.mouseY)+'px';
3337
if (Game.Scroll<0 && !Game.promptOn) {Game.AscendZoomT=0.5;}
3338
if (Game.Scroll>0 && !Game.promptOn) {Game.AscendZoomT=1;}
3339
3340
if (Game.T%2==0)
3341
{
3342
l('ascendPrestige').innerHTML='Prestige level :<br>'+Beautify(Game.prestige);
3343
l('ascendHCs').innerHTML='Heavenly chips :<br><span class="price heavenly">'+Beautify(Math.round(Game.heavenlyChipsDisplayed))+'</span>';
3344
if (Game.prestige>0) l('ascendModeButton').style.display='block';
3345
else l('ascendModeButton').style.display='none';
3346
}
3347
Game.heavenlyChipsDisplayed+=(Game.heavenlyChips-Game.heavenlyChipsDisplayed)*0.4;
3348
3349
if (Game.DebuggingPrestige && Game.T%10==0)
3350
{
3351
var str='';
3352
for (var i in Game.PrestigeUpgrades)
3353
{
3354
var me=Game.PrestigeUpgrades[i];
3355
str+=me.id+':['+Math.floor(me.posX)+','+Math.floor(me.posY)+'],';
3356
}
3357
l('upgradePositions').value='Game.UpgradePositions={'+str+'};';
3358
}
3359
//if (Game.T%5==0) Game.BuildAscendTree();
3360
}
3361
Game.AscendRefocus=function()
3362
{
3363
Game.AscendOffX=0;
3364
Game.AscendOffY=0;
3365
Game.ascendl.className='';
3366
}
3367
3368
Game.SelectedHeavenlyUpgrade=0;
3369
Game.PurchaseHeavenlyUpgrade=function(what)
3370
{
3371
//if (Game.Has('Neuromancy')) Game.UpgradesById[what].toggle(); else
3372
if (Game.UpgradesById[what].buy())
3373
{
3374
if (l('heavenlyUpgrade'+what)){var rect=l('heavenlyUpgrade'+what).getBoundingClientRect();Game.SparkleAt((rect.left+rect.right)/2,(rect.top+rect.bottom)/2-24);}
3375
//Game.BuildAscendTree();
3376
}
3377
}
3378
Game.BuildAscendTree=function()
3379
{
3380
var str='';
3381
Game.heavenlyBounds={left:0,right:0,top:0,bottom:0};
3382
3383
if (Game.DebuggingPrestige) l('upgradePositions').style.display='block'; else l('upgradePositions').style.display='none';
3384
3385
for (var i in Game.PrestigeUpgrades)
3386
{
3387
var me=Game.PrestigeUpgrades[i];
3388
me.canBePurchased=1;
3389
if (!me.bought && !Game.DebuggingPrestige)
3390
{
3391
if (me.showIf && !me.showIf()) me.canBePurchased=0;
3392
else
3393
{
3394
for (var ii in me.parents)
3395
{
3396
if (me.parents[ii]!=-1 && !me.parents[ii].bought) me.canBePurchased=0;
3397
}
3398
}
3399
}
3400
}
3401
str+='<div class="crateBox" style="filter:none;-webkit-filter:none;">';//chrome is still bad at these
3402
for (var i in Game.PrestigeUpgrades)
3403
{
3404
var me=Game.PrestigeUpgrades[i];
3405
3406
var ghosted=0;
3407
if (me.canBePurchased || Game.Has('Neuromancy'))
3408
{
3409
str+=Game.crate(me,'ascend','Game.PurchaseHeavenlyUpgrade('+me.id+');','heavenlyUpgrade'+me.id);
3410
}
3411
else
3412
{
3413
for (var ii in me.parents)
3414
{
3415
if (me.parents[ii]!=-1 && me.parents[ii].canBePurchased) ghosted=1;
3416
}
3417
if (me.showIf && !me.showIf()) ghosted=0;
3418
if (ghosted)
3419
{
3420
//maybe replace this with Game.crate()
3421
str+='<div class="crate upgrade heavenly ghosted" id="heavenlyUpgrade'+me.id+'" style="position:absolute;left:'+me.posX+'px;top:'+me.posY+'px;'+(me.icon[2]?'background-image:url('+me.icon[2]+');':'')+'background-position:'+(-me.icon[0]*48)+'px '+(-me.icon[1]*48)+'px;"></div>';
3422
}
3423
}
3424
if (me.canBePurchased || Game.Has('Neuromancy') || ghosted)
3425
{
3426
if (me.posX<Game.heavenlyBounds.left) Game.heavenlyBounds.left=me.posX;
3427
if (me.posX>Game.heavenlyBounds.right) Game.heavenlyBounds.right=me.posX;
3428
if (me.posY<Game.heavenlyBounds.top) Game.heavenlyBounds.top=me.posY;
3429
if (me.posY>Game.heavenlyBounds.bottom) Game.heavenlyBounds.bottom=me.posY;
3430
}
3431
for (var ii in me.parents)//create pulsing links
3432
{
3433
if (me.parents[ii]!=-1 && (me.canBePurchased || ghosted))
3434
{
3435
var origX=0;
3436
var origY=0;
3437
var targX=me.posX+28;
3438
var targY=me.posY+28;
3439
if (me.parents[ii]!=-1) {origX=me.parents[ii].posX+28;origY=me.parents[ii].posY+28;}
3440
var rot=-(Math.atan((targY-origY)/(origX-targX))/Math.PI)*180;
3441
if (targX<=origX) rot+=180;
3442
var dist=Math.floor(Math.sqrt((targX-origX)*(targX-origX)+(targY-origY)*(targY-origY)));
3443
str+='<div class="parentLink" id="heavenlyLink'+me.id+'-'+ii+'" style="'+(ghosted?'opacity:0.1;':'')+'width:'+dist+'px;-webkit-transform:rotate('+rot+'deg);-moz-transform:rotate('+rot+'deg);-ms-transform:rotate('+rot+'deg);-o-transform:rotate('+rot+'deg);transform:rotate('+rot+'deg);left:'+(origX)+'px;top:'+(origY)+'px;"></div>';
3444
}
3445
}
3446
}
3447
Game.heavenlyBounds.left-=128;
3448
Game.heavenlyBounds.top-=128;
3449
Game.heavenlyBounds.right+=128+64;
3450
Game.heavenlyBounds.bottom+=128+64;
3451
//str+='<div style="border:1px solid red;position:absolute;left:'+Game.heavenlyBounds.left+'px;width:'+(Game.heavenlyBounds.right-Game.heavenlyBounds.left)+'px;top:'+Game.heavenlyBounds.top+'px;height:'+(Game.heavenlyBounds.bottom-Game.heavenlyBounds.top)+'px;"></div>';
3452
str+='</div>';
3453
Game.ascendUpgradesl.innerHTML=str;
3454
}
3455
3456
3457
/*=====================================================================================
3458
COALESCING SUGAR LUMPS
3459
=======================================================================================*/
3460
Game.lumpMatureAge=1;
3461
Game.lumpRipeAge=1;
3462
Game.lumpOverripeAge=1;
3463
Game.lumpCurrentType=0;
3464
l('comments').innerHTML=l('comments').innerHTML+
3465
'<div id="lumps" onclick="Game.clickLump();" '+Game.getDynamicTooltip('Game.lumpTooltip','bottom')+'><div id="lumpsIcon" class="usesIcon"></div><div id="lumpsIcon2" class="usesIcon"></div><div id="lumpsAmount">0</div></div>';
3466
Game.lumpTooltip=function()
3467
{
3468
var str='<div style="padding:8px;width:400px;font-size:11px;text-align:center;">'+
3469
'You have <span class="price lump">'+Beautify(Game.lumps)+' sugar lump'+(Game.lumps==1?'':'s')+'</span>.'+
3470
'<div class="line"></div>'+
3471
'A <b>sugar lump</b> is coalescing here, attracted by your accomplishments.';
3472
3473
var age=Date.now()-Game.lumpT;
3474
str+='<div class="line"></div>';
3475
if (age<Game.lumpMatureAge) str+='This sugar lump is still growing and will take <b>'+Game.sayTime(((Game.lumpMatureAge-age)/1000+1)*Game.fps,-1)+'</b> to reach maturity.';
3476
else if (age<Game.lumpRipeAge) str+='This sugar lump is mature and will be ripe in <b>'+Game.sayTime(((Game.lumpRipeAge-age)/1000+1)*Game.fps,-1)+'</b>.<br>You may <b>click it to harvest it now</b>, but there is a <b>50% chance you won\'t get anything</b>.';
3477
else if (age<Game.lumpOverripeAge) str+='<b>This sugar lump is ripe! Click it to harvest it.</b><br>If you do nothing, it will auto-harvest in <b>'+Game.sayTime(((Game.lumpOverripeAge-age)/1000+1)*Game.fps,-1)+'</b>.';
3478
3479
var phase=(age/Game.lumpOverripeAge)*7;
3480
if (phase>=3)
3481
{
3482
if (Game.lumpCurrentType!=0) str+='<div class="line"></div>';
3483
if (Game.lumpCurrentType==1) str+='This sugar lump grew to be <b>bifurcated</b>; harvesting it has a 50% chance of yielding two lumps.';
3484
else if (Game.lumpCurrentType==2) str+='This sugar lump grew to be <b>golden</b>; harvesting it will yield 2 to 7 lumps, your current cookies will be doubled (capped to a gain of 24 hours of your CpS), and you will find 10% more golden cookies for the next 24 hours.';
3485
else if (Game.lumpCurrentType==3) str+='This sugar lump was affected by the elders and grew to be <b>meaty</b>; harvesting it will yield between 0 and 2 lumps.';
3486
else if (Game.lumpCurrentType==4) str+='This sugar lump is <b>caramelized</b>, its stickiness binding it to unexpected things; harvesting it will yield between 1 and 3 lumps and will refill your sugar lump cooldowns.';
3487
}
3488
3489
str+='<div class="line"></div>';
3490
str+='Your sugar lumps mature after <b>'+Game.sayTime((Game.lumpMatureAge/1000)*Game.fps,-1)+'</b>,<br>ripen after <b>'+Game.sayTime((Game.lumpRipeAge/1000)*Game.fps,-1)+'</b>,<br>and fall after <b>'+Game.sayTime((Game.lumpOverripeAge/1000)*Game.fps,-1)+'</b>.';
3491
3492
str+='<div class="line"></div>'+
3493
'&bull; Sugar lumps can be harvested when mature, though if left alone beyond that point they will start ripening (increasing the chance of harvesting them) and will eventually fall and be auto-harvested after some time.<br>&bull; Sugar lumps are delicious and may be used as currency for all sorts of things.<br>&bull; Once a sugar lump is harvested, another one will start growing in its place.<br>&bull; Note that sugar lumps keep growing when the game is closed.';
3494
3495
str+='</div>';
3496
return str;
3497
}
3498
Game.computeLumpTimes=function()
3499
{
3500
var hour=1000*60*60;
3501
Game.lumpMatureAge=hour*20;
3502
Game.lumpRipeAge=hour*23;
3503
if (Game.Has('Stevia Caelestis')) Game.lumpRipeAge-=hour;
3504
if (Game.Has('Diabetica Daemonicus')) Game.lumpMatureAge-=hour;
3505
if (Game.Has('Ichor syrup')) Game.lumpMatureAge-=1000*60*7;
3506
if (Game.Has('Sugar aging process')) Game.lumpRipeAge-=6000*Math.min(600,Game.Objects['Grandma'].amount);//capped at 600 grandmas
3507
if (Game.hasGod && Game.BuildingsOwned%10==0)
3508
{
3509
var godLvl=Game.hasGod('order');
3510
if (godLvl==1) Game.lumpRipeAge-=hour;
3511
else if (godLvl==2) Game.lumpRipeAge-=(hour/3)*2;
3512
else if (godLvl==3) Game.lumpRipeAge-=(hour/3);
3513
}
3514
//if (Game.hasAura('Dragon\'s Curve')) {Game.lumpMatureAge/=1.05;Game.lumpRipeAge/=1.05;}
3515
Game.lumpMatureAge/=1+Game.auraMult('Dragon\'s Curve')*0.05;Game.lumpRipeAge/=1+Game.auraMult('Dragon\'s Curve')*0.05;
3516
Game.lumpOverripeAge=Game.lumpRipeAge+hour;
3517
if (Game.Has('Glucose-charged air')) {Game.lumpMatureAge/=2000;Game.lumpRipeAge/=2000;Game.lumpOverripeAge/=2000;}
3518
}
3519
Game.loadLumps=function(time)
3520
{
3521
Game.computeLumpTimes();
3522
//Game.computeLumpType();
3523
if (!Game.canLumps()) Game.removeClass('lumpsOn');
3524
else
3525
{
3526
if (Game.ascensionMode!=1) Game.addClass('lumpsOn');
3527
Game.lumpT=Math.min(Date.now(),Game.lumpT);
3528
var age=Math.max(Date.now()-Game.lumpT,0);
3529
var amount=Math.floor(age/Game.lumpOverripeAge);//how many lumps did we harvest since we closed the game?
3530
if (amount>=1)
3531
{
3532
Game.harvestLumps(1,true);
3533
Game.lumpCurrentType=0;//all offline lumps after the first one have a normal type
3534
if (amount>1) Game.harvestLumps(amount-1,true);
3535
if (Game.prefs.popups) Game.Popup('Harvested '+Beautify(amount)+' sugar lump'+(amount==1?'':'s')+' while you were away');
3536
else Game.Notify('','You harvested <b>'+Beautify(amount)+'</b> sugar lump'+(amount==1?'':'s')+' while you were away.',[29,14]);
3537
Game.lumpT=Date.now()-(age-amount*Game.lumpOverripeAge);
3538
Game.computeLumpType();
3539
}
3540
}
3541
}
3542
Game.gainLumps=function(total)
3543
{
3544
if (Game.lumpsTotal==-1){Game.lumpsTotal=0;Game.lumps=0;}
3545
Game.lumps+=total;
3546
Game.lumpsTotal+=total;
3547
3548
if (Game.lumpsTotal>=7) Game.Win('Dude, sweet');
3549
if (Game.lumpsTotal>=30) Game.Win('Sugar rush');
3550
if (Game.lumpsTotal>=365) Game.Win('Year\'s worth of cavities');
3551
}
3552
Game.clickLump=function()
3553
{
3554
if (!Game.canLumps()) return;
3555
var age=Date.now()-Game.lumpT;
3556
if (age<Game.lumpMatureAge) {}
3557
else if (age<Game.lumpRipeAge)
3558
{
3559
var amount=choose([0,1]);
3560
if (amount!=0) Game.Win('Hand-picked');
3561
Game.harvestLumps(amount);
3562
Game.computeLumpType();
3563
}
3564
else if (age<Game.lumpOverripeAge)
3565
{
3566
Game.harvestLumps(1);
3567
Game.computeLumpType();
3568
}
3569
}
3570
Game.harvestLumps=function(amount,silent)
3571
{
3572
if (!Game.canLumps()) return;
3573
Game.lumpT=Date.now();
3574
var total=amount;
3575
if (Game.lumpCurrentType==1 && Game.Has('Sucralosia Inutilis') && Math.random()<0.05) total*=2;
3576
else if (Game.lumpCurrentType==1) total*=choose([1,2]);
3577
else if (Game.lumpCurrentType==2)
3578
{
3579
total*=choose([2,3,4,5,6,7]);
3580
Game.gainBuff('sugar blessing',24*60*60,1);
3581
Game.Earn(Math.min(Game.cookiesPs*60*60*24,Game.cookies));
3582
if (Game.prefs.popups) Game.Popup('Sugar blessing activated!');
3583
else Game.Notify('Sugar blessing activated!','Your cookies have been doubled.<br>+10% golden cookies for the next 24 hours.',[29,16]);
3584
}
3585
else if (Game.lumpCurrentType==3) total*=choose([0,0,1,2,2]);
3586
else if (Game.lumpCurrentType==4)
3587
{
3588
total*=choose([1,2,3]);
3589
Game.lumpRefill=0;//Date.now()-Game.getLumpRefillMax();
3590
if (Game.prefs.popups) Game.Popup('Sugar lump cooldowns cleared!');
3591
else Game.Notify('Sugar lump cooldowns cleared!','',[29,27]);
3592
}
3593
total=Math.floor(total);
3594
Game.gainLumps(total);
3595
if (Game.lumpCurrentType==1) Game.Win('Sugar sugar');
3596
else if (Game.lumpCurrentType==2) Game.Win('All-natural cane sugar');
3597
else if (Game.lumpCurrentType==3) Game.Win('Sweetmeats');
3598
else if (Game.lumpCurrentType==4) Game.Win('Maillard reaction');
3599
3600
if (!silent)
3601
{
3602
var rect=l('lumpsIcon2').getBoundingClientRect();Game.SparkleAt((rect.left+rect.right)/2,(rect.top+rect.bottom)/2-24);
3603
if (total>0) Game.Popup('<small>+'+Beautify(total)+' sugar lump'+(total==1?'':'s')+'</small>',(rect.left+rect.right)/2,(rect.top+rect.bottom)/2-48);
3604
else Game.Popup('<small>Botched harvest!</small>',(rect.left+rect.right)/2,(rect.top+rect.bottom)/2-48);
3605
PlaySound('snd/pop'+Math.floor(Math.random()*3+1)+'.mp3',0.75);
3606
}
3607
Game.computeLumpTimes();
3608
}
3609
Game.computeLumpType=function()
3610
{
3611
Math.seedrandom(Game.seed+'/'+Game.lumpT);
3612
var types=[0];
3613
var loop=1;
3614
//if (Game.hasAura('Dragon\'s Curve')) loop=2;
3615
loop+=Game.auraMult('Dragon\'s Curve');
3616
loop=randomFloor(loop);
3617
for (var i=0;i<loop;i++)
3618
{
3619
if (Math.random()<(Game.Has('Sucralosia Inutilis')?0.15:0.1)) types.push(1);//bifurcated
3620
if (Math.random()<3/1000) types.push(2);//golden
3621
if (Math.random()<0.1*Game.elderWrath) types.push(3);//meaty
3622
if (Math.random()<1/50) types.push(4);//caramelized
3623
}
3624
Game.lumpCurrentType=choose(types);
3625
Math.seedrandom();
3626
}
3627
3628
Game.canLumps=function()//grammatically pleasing function name
3629
{
3630
if (Game.lumpsTotal>-1 || (Game.ascensionMode!=1 && (Game.cookiesEarned+Game.cookiesReset)>=1000000000)) return true;
3631
return false;
3632
}
3633
3634
Game.getLumpRefillMax=function()
3635
{
3636
return Game.fps*60*15;//1000*60*15;//15 minutes
3637
}
3638
Game.getLumpRefillRemaining=function()
3639
{
3640
return Game.lumpRefill;//Game.getLumpRefillMax()-(Date.now()-Game.lumpRefill);
3641
}
3642
Game.canRefillLump=function()
3643
{
3644
return Game.lumpRefill<=0;//((Date.now()-Game.lumpRefill)>=Game.getLumpRefillMax());
3645
}
3646
Game.refillLump=function(n,func)
3647
{
3648
if (Game.lumps>=n && Game.canRefillLump())
3649
{
3650
Game.spendLump(n,'refill',function()
3651
{
3652
if (!Game.sesame) Game.lumpRefill=Game.getLumpRefillMax();//Date.now();
3653
func();
3654
})();
3655
}
3656
}
3657
Game.spendLump=function(n,str,func)
3658
{
3659
//ask if we want to spend N lumps
3660
return function()
3661
{
3662
if (Game.lumps<n) return false;
3663
if (Game.prefs.askLumps)
3664
{
3665
PlaySound('snd/tick.mp3');
3666
Game.promptConfirmFunc=func;//bit dumb
3667
Game.Prompt('<div class="icon" style="background:url(img/icons.png?v='+Game.version+');float:left;margin-left:-8px;margin-top:-8px;background-position:'+(-29*48)+'px '+(-14*48)+'px;"></div><div style="margin:16px 8px;">Do you want to spend <b>'+Beautify(n)+' lump'+(n!=1?'s':'')+'</b> to '+str+'?</div>',[['Yes','Game.lumps-='+n+';Game.promptConfirmFunc();Game.promptConfirmFunc=0;Game.recalculateGains=1;Game.ClosePrompt();'],'No']);
3668
return false;
3669
}
3670
else
3671
{
3672
Game.lumps-=n;
3673
func();
3674
Game.recalculateGains=1;
3675
}
3676
}
3677
}
3678
3679
Game.doLumps=function()
3680
{
3681
if (Game.lumpRefill>0) Game.lumpRefill--;
3682
3683
if (!Game.canLumps()) {Game.removeClass('lumpsOn');return;}
3684
if (Game.lumpsTotal==-1)
3685
{
3686
//first time !
3687
if (Game.ascensionMode!=1) Game.addClass('lumpsOn');
3688
Game.lumpT-Date.now();
3689
Game.lumpsTotal=0;
3690
Game.lumps=0;
3691
Game.computeLumpType();
3692
3693
Game.Notify('Sugar lumps!','Because you\'ve baked a <b>billion cookies</b> in total, you are now attracting <b>sugar lumps</b>. They coalesce quietly near the top of your screen, under the Stats button.<br>You will be able to harvest them when they\'re ripe, after which you may spend them on all sorts of things!',[23,14]);
3694
}
3695
var age=Date.now()-Game.lumpT;
3696
if (age>Game.lumpOverripeAge)
3697
{
3698
age=0;
3699
Game.harvestLumps(1);
3700
Game.computeLumpType();
3701
}
3702
3703
var phase=Math.min(6,Math.floor((age/Game.lumpOverripeAge)*7));
3704
var phase2=Math.min(6,Math.floor((age/Game.lumpOverripeAge)*7)+1);
3705
var row=14;
3706
var row2=14;
3707
var type=Game.lumpCurrentType;
3708
if (type==1)//double
3709
{
3710
//if (phase>=6) row=15;
3711
if (phase2>=6) row2=15;
3712
}
3713
else if (type==2)//golden
3714
{
3715
if (phase>=4) row=16;
3716
if (phase2>=4) row2=16;
3717
}
3718
else if (type==3)//meaty
3719
{
3720
if (phase>=4) row=17;
3721
if (phase2>=4) row2=17;
3722
}
3723
else if (type==4)//caramelized
3724
{
3725
if (phase>=4) row=27;
3726
if (phase2>=4) row2=27;
3727
}
3728
var icon=[23+Math.min(phase,5),row];
3729
var icon2=[23+phase2,row2];
3730
var opacity=Math.min(6,(age/Game.lumpOverripeAge)*7)%1;
3731
if (phase>=6) {opacity=1;}
3732
l('lumpsIcon').style.backgroundPosition=(-icon[0]*48)+'px '+(-icon[1]*48)+'px';
3733
l('lumpsIcon2').style.backgroundPosition=(-icon2[0]*48)+'px '+(-icon2[1]*48)+'px';
3734
l('lumpsIcon2').style.opacity=opacity;
3735
l('lumpsAmount').innerHTML=Beautify(Game.lumps);
3736
}
3737
3738
/*=====================================================================================
3739
COOKIE ECONOMICS
3740
=======================================================================================*/
3741
Game.Earn=function(howmuch)
3742
{
3743
Game.cookies+=howmuch;
3744
Game.cookiesEarned+=howmuch;
3745
}
3746
Game.Spend=function(howmuch)
3747
{
3748
Game.cookies-=howmuch;
3749
}
3750
Game.Dissolve=function(howmuch)
3751
{
3752
Game.cookies-=howmuch;
3753
Game.cookiesEarned-=howmuch;
3754
Game.cookies=Math.max(0,Game.cookies);
3755
Game.cookiesEarned=Math.max(0,Game.cookiesEarned);
3756
}
3757
Game.mouseCps=function()
3758
{
3759
var add=0;
3760
if (Game.Has('Thousand fingers')) add+= 0.1;
3761
if (Game.Has('Million fingers')) add+= 0.5;
3762
if (Game.Has('Billion fingers')) add+= 5;
3763
if (Game.Has('Trillion fingers')) add+= 50;
3764
if (Game.Has('Quadrillion fingers')) add+= 500;
3765
if (Game.Has('Quintillion fingers')) add+= 5000;
3766
if (Game.Has('Sextillion fingers')) add+= 50000;
3767
if (Game.Has('Septillion fingers')) add+= 500000;
3768
if (Game.Has('Octillion fingers')) add+= 5000000;
3769
var num=0;
3770
for (var i in Game.Objects) {num+=Game.Objects[i].amount;}
3771
num-=Game.Objects['Cursor'].amount;
3772
add=add*num;
3773
if (Game.Has('Plastic mouse')) add+=Game.cookiesPs*0.01;
3774
if (Game.Has('Iron mouse')) add+=Game.cookiesPs*0.01;
3775
if (Game.Has('Titanium mouse')) add+=Game.cookiesPs*0.01;
3776
if (Game.Has('Adamantium mouse')) add+=Game.cookiesPs*0.01;
3777
if (Game.Has('Unobtainium mouse')) add+=Game.cookiesPs*0.01;
3778
if (Game.Has('Eludium mouse')) add+=Game.cookiesPs*0.01;
3779
if (Game.Has('Wishalloy mouse')) add+=Game.cookiesPs*0.01;
3780
if (Game.Has('Fantasteel mouse')) add+=Game.cookiesPs*0.01;
3781
if (Game.Has('Nevercrack mouse')) add+=Game.cookiesPs*0.01;
3782
if (Game.Has('Armythril mouse')) add+=Game.cookiesPs*0.01;
3783
if (Game.Has('Technobsidian mouse')) add+=Game.cookiesPs*0.01;
3784
if (Game.Has('Plasmarble mouse')) add+=Game.cookiesPs*0.01;
3785
3786
if (Game.Has('Fortune #104')) add+=Game.cookiesPs*0.01;
3787
var mult=1;
3788
3789
for (var i in Game.customMouseCps) {mult+=Game.customMouseCps[i]();}
3790
3791
if (Game.Has('Santa\'s helpers')) mult*=1.1;
3792
if (Game.Has('Cookie egg')) mult*=1.1;
3793
if (Game.Has('Halo gloves')) mult*=1.1;
3794
3795
mult*=Game.eff('click');
3796
3797
if (Game.hasGod)
3798
{
3799
var godLvl=Game.hasGod('labor');
3800
if (godLvl==1) mult*=1.15;
3801
else if (godLvl==2) mult*=1.1;
3802
else if (godLvl==3) mult*=1.05;
3803
}
3804
3805
for (var i in Game.buffs)
3806
{
3807
if (typeof Game.buffs[i].multClick != 'undefined') mult*=Game.buffs[i].multClick;
3808
}
3809
3810
//if (Game.hasAura('Dragon Cursor')) mult*=1.05;
3811
mult*=1+Game.auraMult('Dragon Cursor')*0.05;
3812
3813
for (var i in Game.customMouseCpsMult) {mult*=Game.customMouseCpsMult[i]();}
3814
3815
var out=mult*Game.ComputeCps(1,Game.Has('Reinforced index finger')+Game.Has('Carpal tunnel prevention cream')+Game.Has('Ambidextrous'),add);
3816
3817
if (Game.hasBuff('Cursed finger')) out=Game.buffs['Cursed finger'].power;
3818
return out;
3819
}
3820
Game.computedMouseCps=1;
3821
Game.globalCpsMult=1;
3822
Game.unbuffedCps=0;
3823
Game.lastClick=0;
3824
Game.CanClick=1;
3825
Game.autoclickerDetected=0;
3826
Game.BigCookieState=0;//0 = normal, 1 = clicked (small), 2 = released/hovered (big)
3827
Game.BigCookieSize=0;
3828
Game.BigCookieSizeD=0;
3829
Game.BigCookieSizeT=1;
3830
Game.cookieClickSound=Math.floor(Math.random()*7)+1;
3831
Game.playCookieClickSound=function()
3832
{
3833
if (Game.prefs.cookiesound) PlaySound('snd/clickb'+(Game.cookieClickSound)+'.mp3',0.5);
3834
else PlaySound('snd/click'+(Game.cookieClickSound)+'.mp3',0.5);
3835
Game.cookieClickSound+=Math.floor(Math.random()*4)+1;
3836
if (Game.cookieClickSound>7) Game.cookieClickSound-=7;
3837
}
3838
Game.ClickCookie=function(e,amount)
3839
{
3840
var now=Date.now();
3841
if (e) e.preventDefault();
3842
if (Game.OnAscend || Game.AscendTimer>0) {}
3843
else if (now-Game.lastClick<1000/250) {}
3844
else
3845
{
3846
if (now-Game.lastClick<1000/15)
3847
{
3848
Game.autoclickerDetected+=Game.fps;
3849
if (Game.autoclickerDetected>=Game.fps*5) Game.Win('Uncanny clicker');
3850
}
3851
Game.loseShimmeringVeil('click');
3852
var amount=amount?amount:Game.computedMouseCps;
3853
Game.Earn(amount);
3854
Game.handmadeCookies+=amount;
3855
if (Game.prefs.particles)
3856
{
3857
Game.particleAdd();
3858
Game.particleAdd(Game.mouseX,Game.mouseY,Math.random()*4-2,Math.random()*-2-2,Math.random()*0.5+0.75,1,2);
3859
}
3860
if (Game.prefs.numbers) Game.particleAdd(Game.mouseX+Math.random()*8-4,Game.mouseY-8+Math.random()*8-4,0,-2,1,4,2,'','+'+Beautify(amount,1));
3861
3862
for (var i in Game.customCookieClicks) {Game.customCookieClicks[i]();}
3863
3864
Game.playCookieClickSound();
3865
Game.cookieClicks++;
3866
}
3867
Game.lastClick=now;
3868
Game.Click=0;
3869
}
3870
Game.mouseX=0;
3871
Game.mouseY=0;
3872
Game.mouseX2=0;
3873
Game.mouseY2=0;
3874
Game.mouseMoved=0;
3875
Game.GetMouseCoords=function(e)
3876
{
3877
var posx=0;
3878
var posy=0;
3879
if (!e) var e=window.event;
3880
if (e.pageX||e.pageY)
3881
{
3882
posx=e.pageX;
3883
posy=e.pageY;
3884
}
3885
else if (e.clientX || e.clientY)
3886
{
3887
posx=e.clientX+document.body.scrollLeft+document.documentElement.scrollLeft;
3888
posy=e.clientY+document.body.scrollTop+document.documentElement.scrollTop;
3889
}
3890
var x=0;
3891
var y=32;
3892
/*
3893
var el=l('sectionLeft');
3894
while(el && !isNaN(el.offsetLeft) && !isNaN(el.offsetTop))
3895
{
3896
x+=el.offsetLeft-el.scrollLeft;
3897
y+=el.offsetTop-el.scrollTop;
3898
el=el.offsetParent;
3899
}*/
3900
Game.mouseX2=Game.mouseX;
3901
Game.mouseY2=Game.mouseY;
3902
Game.mouseX=posx-x;
3903
Game.mouseY=posy-y;
3904
Game.mouseMoved=1;
3905
Game.lastActivity=Game.time;
3906
}
3907
var bigCookie=l('bigCookie');
3908
Game.Click=0;
3909
Game.lastClickedEl=0;
3910
Game.clickFrom=0;
3911
Game.Scroll=0;
3912
Game.mouseDown=0;
3913
if (!Game.touchEvents)
3914
{
3915
AddEvent(bigCookie,'click',Game.ClickCookie);
3916
AddEvent(bigCookie,'mousedown',function(event){Game.BigCookieState=1;if (Game.prefs.cookiesound) {Game.playCookieClickSound();}if (event) event.preventDefault();});
3917
AddEvent(bigCookie,'mouseup',function(event){Game.BigCookieState=2;if (event) event.preventDefault();});
3918
AddEvent(bigCookie,'mouseout',function(event){Game.BigCookieState=0;});
3919
AddEvent(bigCookie,'mouseover',function(event){Game.BigCookieState=2;});
3920
AddEvent(document,'mousemove',Game.GetMouseCoords);
3921
AddEvent(document,'mousedown',function(event){Game.lastActivity=Game.time;Game.mouseDown=1;Game.clickFrom=event.target;});
3922
AddEvent(document,'mouseup',function(event){Game.lastActivity=Game.time;Game.mouseDown=0;Game.clickFrom=0;});
3923
AddEvent(document,'click',function(event){Game.lastActivity=Game.time;Game.Click=1;Game.lastClickedEl=event.target;Game.clickFrom=0;});
3924
Game.handleScroll=function(e)
3925
{
3926
if (!e) e=event;
3927
Game.Scroll=(e.detail<0||e.wheelDelta>0)?1:-1;
3928
Game.lastActivity=Game.time;
3929
};
3930
AddEvent(document,'DOMMouseScroll',Game.handleScroll);
3931
AddEvent(document,'mousewheel',Game.handleScroll);
3932
}
3933
else
3934
{
3935
//touch events
3936
AddEvent(bigCookie,'touchend',Game.ClickCookie);
3937
AddEvent(bigCookie,'touchstart',function(event){Game.BigCookieState=1;if (event) event.preventDefault();});
3938
AddEvent(bigCookie,'touchend',function(event){Game.BigCookieState=0;if (event) event.preventDefault();});
3939
//AddEvent(document,'touchmove',Game.GetMouseCoords);
3940
AddEvent(document,'mousemove',Game.GetMouseCoords);
3941
AddEvent(document,'touchstart',function(event){Game.lastActivity=Game.time;Game.mouseDown=1;});
3942
AddEvent(document,'touchend',function(event){Game.lastActivity=Game.time;Game.mouseDown=0;});
3943
AddEvent(document,'touchend',function(event){Game.lastActivity=Game.time;Game.Click=1;});
3944
}
3945
3946
Game.keys=[];
3947
AddEvent(window,'keyup',function(e){
3948
Game.lastActivity=Game.time;
3949
if (e.keyCode==27)
3950
{
3951
Game.ClosePrompt();
3952
if (Game.AscendTimer>0) Game.AscendTimer=Game.AscendDuration;
3953
}//esc closes prompt
3954
else if (e.keyCode==13) Game.ConfirmPrompt();//enter confirms prompt
3955
Game.keys[e.keyCode]=0;
3956
});
3957
AddEvent(window,'keydown',function(e){
3958
if (!Game.OnAscend && Game.AscendTimer==0)
3959
{
3960
if (e.ctrlKey && e.keyCode==83) {Game.toSave=true;e.preventDefault();}//ctrl-s saves the game
3961
else if (e.ctrlKey && e.keyCode==79) {Game.ImportSave();e.preventDefault();}//ctrl-o opens the import menu
3962
}
3963
if ((e.keyCode==16 || e.keyCode==17) && Game.tooltip.dynamic) Game.tooltip.update();
3964
Game.keys[e.keyCode]=1;
3965
});
3966
3967
AddEvent(window,'visibilitychange',function(e){
3968
Game.keys=[];//reset all key pressed on visibility change (should help prevent ctrl still being down after ctrl-tab)
3969
});
3970
3971
/*=====================================================================================
3972
CPS RECALCULATOR
3973
=======================================================================================*/
3974
3975
Game.heavenlyPower=1;//how many CpS percents a single heavenly chip gives
3976
Game.recalculateGains=1;
3977
Game.cookiesPsByType={};
3978
Game.cookiesMultByType={};
3979
//display bars with http://codepen.io/anon/pen/waGyEJ
3980
Game.effs={};
3981
Game.eff=function(name,def){if (typeof Game.effs[name]==='undefined') return (typeof def==='undefined'?1:def); else return Game.effs[name];};
3982
3983
Game.CalculateGains=function()
3984
{
3985
Game.cookiesPs=0;
3986
var mult=1;
3987
//add up effect bonuses from building minigames
3988
var effs={};
3989
for (var i in Game.Objects)
3990
{
3991
if (Game.Objects[i].minigameLoaded && Game.Objects[i].minigame.effs)
3992
{
3993
var myEffs=Game.Objects[i].minigame.effs;
3994
for (var ii in myEffs)
3995
{
3996
if (effs[ii]) effs[ii]*=myEffs[ii];
3997
else effs[ii]=myEffs[ii];
3998
}
3999
}
4000
}
4001
Game.effs=effs;
4002
4003
if (Game.ascensionMode!=1) mult+=parseFloat(Game.prestige)*0.01*Game.heavenlyPower*Game.GetHeavenlyMultiplier();
4004
4005
mult*=Game.eff('cps');
4006
4007
if (Game.Has('Heralds') && Game.ascensionMode!=1) mult*=1+0.01*Game.heralds;
4008
4009
var cookieMult=0;
4010
for (var i in Game.cookieUpgrades)
4011
{
4012
var me=Game.cookieUpgrades[i];
4013
if (Game.Has(me.name))
4014
{
4015
mult*=(1+(typeof(me.power)=='function'?me.power(me):me.power)*0.01);
4016
}
4017
}
4018
mult*=(1+0.01*cookieMult);
4019
4020
if (Game.Has('Specialized chocolate chips')) mult*=1.01;
4021
if (Game.Has('Designer cocoa beans')) mult*=1.02;
4022
if (Game.Has('Underworld ovens')) mult*=1.03;
4023
if (Game.Has('Exotic nuts')) mult*=1.04;
4024
if (Game.Has('Arcane sugar')) mult*=1.05;
4025
4026
if (Game.Has('Increased merriness')) mult*=1.15;
4027
if (Game.Has('Improved jolliness')) mult*=1.15;
4028
if (Game.Has('A lump of coal')) mult*=1.01;
4029
if (Game.Has('An itchy sweater')) mult*=1.01;
4030
if (Game.Has('Santa\'s dominion')) mult*=1.2;
4031
4032
if (Game.Has('Fortune #100')) mult*=1.01;
4033
if (Game.Has('Fortune #101')) mult*=1.07;
4034
4035
var buildMult=1;
4036
if (Game.hasGod)
4037
{
4038
var godLvl=Game.hasGod('asceticism');
4039
if (godLvl==1) mult*=1.15;
4040
else if (godLvl==2) mult*=1.1;
4041
else if (godLvl==3) mult*=1.05;
4042
4043
var godLvl=Game.hasGod('ages');
4044
if (godLvl==1) mult*=1+0.15*Math.sin((Date.now()/1000/(60*60*3))*Math.PI*2);
4045
else if (godLvl==2) mult*=1+0.15*Math.sin((Date.now()/1000/(60*60*12))*Math.PI*2);
4046
else if (godLvl==3) mult*=1+0.15*Math.sin((Date.now()/1000/(60*60*24))*Math.PI*2);
4047
4048
var godLvl=Game.hasGod('decadence');
4049
if (godLvl==1) buildMult*=0.93;
4050
else if (godLvl==2) buildMult*=0.95;
4051
else if (godLvl==3) buildMult*=0.98;
4052
4053
var godLvl=Game.hasGod('industry');
4054
if (godLvl==1) buildMult*=1.1;
4055
else if (godLvl==2) buildMult*=1.06;
4056
else if (godLvl==3) buildMult*=1.03;
4057
4058
var godLvl=Game.hasGod('labor');
4059
if (godLvl==1) buildMult*=0.97;
4060
else if (godLvl==2) buildMult*=0.98;
4061
else if (godLvl==3) buildMult*=0.99;
4062
}
4063
4064
if (Game.Has('Santa\'s legacy')) mult*=1+(Game.santaLevel+1)*0.03;
4065
4066
for (var i in Game.Objects)
4067
{
4068
var me=Game.Objects[i];
4069
me.storedCps=(typeof(me.cps)=='function'?me.cps(me):me.cps);
4070
if (Game.ascensionMode!=1) me.storedCps*=(1+me.level*0.01)*buildMult;
4071
me.storedTotalCps=me.amount*me.storedCps;
4072
Game.cookiesPs+=me.storedTotalCps;
4073
Game.cookiesPsByType[me.name]=me.storedTotalCps;
4074
}
4075
4076
if (Game.Has('"egg"')) {Game.cookiesPs+=9;Game.cookiesPsByType['"egg"']=9;}//"egg"
4077
4078
for (var i in Game.customCps) {mult*=Game.customCps[i]();}
4079
4080
Game.milkProgress=Game.AchievementsOwned/25;
4081
var milkMult=1;
4082
if (Game.Has('Santa\'s milk and cookies')) milkMult*=1.05;
4083
//if (Game.hasAura('Breath of Milk')) milkMult*=1.05;
4084
milkMult*=1+Game.auraMult('Breath of Milk')*0.05;
4085
if (Game.hasGod)
4086
{
4087
var godLvl=Game.hasGod('mother');
4088
if (godLvl==1) milkMult*=1.1;
4089
else if (godLvl==2) milkMult*=1.05;
4090
else if (godLvl==3) milkMult*=1.03;
4091
}
4092
milkMult*=Game.eff('milk');
4093
4094
var catMult=1;
4095
4096
if (Game.Has('Kitten helpers')) catMult*=(1+Game.milkProgress*0.1*milkMult);
4097
if (Game.Has('Kitten workers')) catMult*=(1+Game.milkProgress*0.125*milkMult);
4098
if (Game.Has('Kitten engineers')) catMult*=(1+Game.milkProgress*0.15*milkMult);
4099
if (Game.Has('Kitten overseers')) catMult*=(1+Game.milkProgress*0.175*milkMult);
4100
if (Game.Has('Kitten managers')) catMult*=(1+Game.milkProgress*0.2*milkMult);
4101
if (Game.Has('Kitten accountants')) catMult*=(1+Game.milkProgress*0.2*milkMult);
4102
if (Game.Has('Kitten specialists')) catMult*=(1+Game.milkProgress*0.2*milkMult);
4103
if (Game.Has('Kitten experts')) catMult*=(1+Game.milkProgress*0.2*milkMult);
4104
if (Game.Has('Kitten consultants')) catMult*=(1+Game.milkProgress*0.2*milkMult);
4105
if (Game.Has('Kitten assistants to the regional manager')) catMult*=(1+Game.milkProgress*0.175*milkMult);
4106
if (Game.Has('Kitten marketeers')) catMult*=(1+Game.milkProgress*0.15*milkMult);
4107
if (Game.Has('Kitten analysts')) catMult*=(1+Game.milkProgress*0.125*milkMult);
4108
if (Game.Has('Kitten executives')) catMult*=(1+Game.milkProgress*0.115*milkMult);
4109
if (Game.Has('Kitten angels')) catMult*=(1+Game.milkProgress*0.1*milkMult);
4110
if (Game.Has('Fortune #103')) catMult*=(1+Game.milkProgress*0.05*milkMult);
4111
4112
Game.cookiesMultByType['kittens']=catMult;
4113
mult*=catMult;
4114
4115
var eggMult=1;
4116
if (Game.Has('Chicken egg')) eggMult*=1.01;
4117
if (Game.Has('Duck egg')) eggMult*=1.01;
4118
if (Game.Has('Turkey egg')) eggMult*=1.01;
4119
if (Game.Has('Quail egg')) eggMult*=1.01;
4120
if (Game.Has('Robin egg')) eggMult*=1.01;
4121
if (Game.Has('Ostrich egg')) eggMult*=1.01;
4122
if (Game.Has('Cassowary egg')) eggMult*=1.01;
4123
if (Game.Has('Salmon roe')) eggMult*=1.01;
4124
if (Game.Has('Frogspawn')) eggMult*=1.01;
4125
if (Game.Has('Shark egg')) eggMult*=1.01;
4126
if (Game.Has('Turtle egg')) eggMult*=1.01;
4127
if (Game.Has('Ant larva')) eggMult*=1.01;
4128
if (Game.Has('Century egg'))
4129
{
4130
//the boost increases a little every day, with diminishing returns up to +10% on the 100th day
4131
var day=Math.floor((Date.now()-Game.startDate)/1000/10)*10/60/60/24;
4132
day=Math.min(day,100);
4133
eggMult*=1+(1-Math.pow(1-day/100,3))*0.1;
4134
}
4135
4136
Game.cookiesMultByType['eggs']=eggMult;
4137
mult*=eggMult;
4138
4139
if (Game.Has('Sugar baking')) mult*=(1+Math.min(100,Game.lumps)*0.01);
4140
4141
//if (Game.hasAura('Radiant Appetite')) mult*=2;
4142
mult*=1+Game.auraMult('Radiant Appetite');
4143
4144
if (true)// || Game.hasAura('Dragon\'s Fortune'))
4145
{
4146
var n=Game.shimmerTypes['golden'].n;
4147
var auraMult=Game.auraMult('Dragon\'s Fortune');
4148
for (var i=0;i<n;i++){mult*=1+auraMult*1.23;}
4149
//old behavior
4150
/*var buffs=0;
4151
for (var i in Game.buffs)
4152
{buffs++;}
4153
mult*=1+(0.07)*buffs;*/
4154
}
4155
4156
var rawCookiesPs=Game.cookiesPs*mult;
4157
for (var i in Game.CpsAchievements)
4158
{
4159
if (rawCookiesPs>=Game.CpsAchievements[i].threshold) Game.Win(Game.CpsAchievements[i].name);
4160
}
4161
4162
name=Game.bakeryName.toLowerCase();
4163
if (name=='orteil') mult*=0.99;
4164
else if (name=='ortiel') mult*=0.98;//or so help me
4165
4166
var sucking=0;
4167
for (var i in Game.wrinklers)
4168
{
4169
if (Game.wrinklers[i].phase==2)
4170
{
4171
sucking++;
4172
}
4173
}
4174
var suckRate=1/20;//each wrinkler eats a twentieth of your CpS
4175
suckRate*=Game.eff('wrinklerEat');
4176
4177
Game.cpsSucked=sucking*suckRate;
4178
4179
4180
if (Game.Has('Elder Covenant')) mult*=0.95;
4181
4182
if (Game.Has('Golden switch [off]'))
4183
{
4184
var goldenSwitchMult=1.5;
4185
if (Game.Has('Residual luck'))
4186
{
4187
var upgrades=Game.goldenCookieUpgrades;
4188
for (var i in upgrades) {if (Game.Has(upgrades[i])) goldenSwitchMult+=0.1;}
4189
}
4190
mult*=goldenSwitchMult;
4191
}
4192
if (Game.Has('Shimmering veil [off]'))
4193
{
4194
var veilMult=0.5;
4195
if (Game.Has('Reinforced membrane')) veilMult+=0.1;
4196
mult*=1+veilMult;
4197
}
4198
if (Game.Has('Magic shenanigans')) mult*=1000;
4199
if (Game.Has('Occult obstruction')) mult*=0;
4200
4201
for (var i in Game.customCpsMult) {mult*=Game.customCpsMult[i]();}
4202
4203
4204
//cps without golden cookie effects
4205
Game.unbuffedCps=Game.cookiesPs*mult;
4206
4207
for (var i in Game.buffs)
4208
{
4209
if (typeof Game.buffs[i].multCpS != 'undefined') mult*=Game.buffs[i].multCpS;
4210
}
4211
4212
Game.globalCpsMult=mult;
4213
Game.cookiesPs*=Game.globalCpsMult;
4214
4215
//if (Game.hasBuff('Cursed finger')) Game.cookiesPs=0;
4216
4217
Game.computedMouseCps=Game.mouseCps();
4218
4219
Game.computeLumpTimes();
4220
4221
Game.recalculateGains=0;
4222
}
4223
4224
Game.dropRateMult=function()
4225
{
4226
var rate=1;
4227
if (Game.Has('Green yeast digestives')) rate*=1.03;
4228
rate*=Game.eff('itemDrops');
4229
//if (Game.hasAura('Mind Over Matter')) rate*=1.25;
4230
rate*=1+Game.auraMult('Mind Over Matter')*0.25;
4231
if (Game.Has('Santa\'s bottomless bag')) rate*=1.1;
4232
if (Game.Has('Cosmic beginner\'s luck') && !Game.Has('Heavenly chip secret')) rate*=5;
4233
return rate;
4234
}
4235
/*=====================================================================================
4236
SHIMMERS (GOLDEN COOKIES & SUCH)
4237
=======================================================================================*/
4238
Game.shimmersL=l('shimmers');
4239
Game.shimmers=[];//all shimmers currently on the screen
4240
Game.shimmersN=Math.floor(Math.random()*10000);
4241
Game.shimmer=function(type,obj,noCount)
4242
{
4243
this.type=type;
4244
4245
this.l=document.createElement('div');
4246
this.l.className='shimmer';
4247
if (!Game.touchEvents) {AddEvent(this.l,'click',function(what){return function(event){what.pop(event);};}(this));}
4248
else {AddEvent(this.l,'touchend',function(what){return function(event){what.pop(event);};}(this));}//touch events
4249
4250
this.x=0;
4251
this.y=0;
4252
this.id=Game.shimmersN;
4253
4254
this.forceObj=obj||0;
4255
this.noCount=noCount;
4256
if (!this.noCount) {Game.shimmerTypes[this.type].n++;Game.recalculateGains=1;}
4257
4258
this.init();
4259
4260
Game.shimmersL.appendChild(this.l);
4261
Game.shimmers.push(this);
4262
Game.shimmersN++;
4263
}
4264
Game.shimmer.prototype.init=function()//executed when the shimmer is created
4265
{
4266
Game.shimmerTypes[this.type].initFunc(this);
4267
}
4268
Game.shimmer.prototype.update=function()//executed every frame
4269
{
4270
Game.shimmerTypes[this.type].updateFunc(this);
4271
}
4272
Game.shimmer.prototype.pop=function(event)//executed when the shimmer is popped by the player
4273
{
4274
if (event) event.preventDefault();
4275
Game.loseShimmeringVeil('shimmer');
4276
Game.Click=0;
4277
Game.shimmerTypes[this.type].popFunc(this);
4278
}
4279
Game.shimmer.prototype.die=function()//executed after the shimmer disappears (from old age or popping)
4280
{
4281
if (Game.shimmerTypes[this.type].spawnsOnTimer && this.spawnLead)
4282
{
4283
//if this was the spawn lead for this shimmer type, set the shimmer type's "spawned" to 0 and restart its spawn timer
4284
var type=Game.shimmerTypes[this.type];
4285
type.time=0;
4286
type.spawned=0;
4287
type.minTime=type.getMinTime(this);
4288
type.maxTime=type.getMaxTime(this);
4289
}
4290
Game.shimmersL.removeChild(this.l);
4291
if (Game.shimmers.indexOf(this)!=-1) Game.shimmers.splice(Game.shimmers.indexOf(this),1);
4292
if (!this.noCount) {Game.shimmerTypes[this.type].n=Math.max(0,Game.shimmerTypes[this.type].n-1);Game.recalculateGains=1;}
4293
}
4294
4295
4296
Game.updateShimmers=function()//run shimmer functions, kill overtimed shimmers and spawn new ones
4297
{
4298
for (var i in Game.shimmers)
4299
{
4300
Game.shimmers[i].update();
4301
}
4302
4303
//cookie storm!
4304
if (Game.hasBuff('Cookie storm') && Math.random()<0.5)
4305
{
4306
var newShimmer=new Game.shimmer('golden',0,1);
4307
newShimmer.dur=Math.ceil(Math.random()*4+1);
4308
newShimmer.life=Math.ceil(Game.fps*newShimmer.dur);
4309
newShimmer.force='cookie storm drop';
4310
newShimmer.sizeMult=Math.random()*0.75+0.25;
4311
}
4312
4313
//spawn shimmers
4314
for (var i in Game.shimmerTypes)
4315
{
4316
var me=Game.shimmerTypes[i];
4317
if (me.spawnsOnTimer && me.spawnConditions())//only run on shimmer types that work on a timer
4318
{
4319
if (!me.spawned)//no shimmer spawned for this type? check the timer and try to spawn one
4320
{
4321
me.time++;
4322
if (Math.random()<Math.pow(Math.max(0,(me.time-me.minTime)/(me.maxTime-me.minTime)),5))
4323
{
4324
var newShimmer=new Game.shimmer(i);
4325
newShimmer.spawnLead=1;
4326
if (Game.Has('Distilled essence of redoubled luck') && Math.random()<0.01) var newShimmer=new Game.shimmer(i);
4327
me.spawned=1;
4328
}
4329
}
4330
}
4331
}
4332
}
4333
Game.killShimmers=function()//stop and delete all shimmers (used on resetting etc)
4334
{
4335
for (var i=Game.shimmers.length-1;i>=0;i--)
4336
{
4337
Game.shimmers[i].die();
4338
}
4339
for (var i in Game.shimmerTypes)
4340
{
4341
var me=Game.shimmerTypes[i];
4342
if (me.reset) me.reset();
4343
me.n=0;
4344
if (me.spawnsOnTimer)
4345
{
4346
me.time=0;
4347
me.spawned=0;
4348
me.minTime=me.getMinTime(me);
4349
me.maxTime=me.getMaxTime(me);
4350
}
4351
}
4352
}
4353
4354
Game.shimmerTypes={
4355
//in these, "me" refers to the shimmer itself, and "this" to the shimmer's type object
4356
'golden':{
4357
reset:function()
4358
{
4359
this.chain=0;
4360
this.totalFromChain=0;
4361
this.last='';
4362
},
4363
initFunc:function(me)
4364
{
4365
if (!this.spawned && Game.chimeType==1 && Game.ascensionMode!=1) PlaySound('snd/chime.mp3');
4366
4367
//set image
4368
var bgPic='img/goldCookie.png';
4369
var picX=0;var picY=0;
4370
4371
4372
if ((!me.forceObj || !me.forceObj.noWrath) && ((me.forceObj && me.forceObj.wrath) || (Game.elderWrath==1 && Math.random()<1/3) || (Game.elderWrath==2 && Math.random()<2/3) || (Game.elderWrath==3) || (Game.hasGod && Game.hasGod('scorn'))))
4373
{
4374
me.wrath=1;
4375
if (Game.season=='halloween') bgPic='img/spookyCookie.png';
4376
else bgPic='img/wrathCookie.png';
4377
}
4378
else
4379
{
4380
me.wrath=0;
4381
}
4382
4383
if (Game.season=='valentines')
4384
{
4385
bgPic='img/hearts.png';
4386
picX=Math.floor(Math.random()*8);
4387
}
4388
else if (Game.season=='fools')
4389
{
4390
bgPic='img/contract.png';
4391
if (me.wrath) bgPic='img/wrathContract.png';
4392
}
4393
else if (Game.season=='easter')
4394
{
4395
bgPic='img/bunnies.png';
4396
picX=Math.floor(Math.random()*4);
4397
picY=0;
4398
if (me.wrath) picY=1;
4399
}
4400
4401
me.x=Math.floor(Math.random()*Math.max(0,(Game.bounds.right-300)-Game.bounds.left-128)+Game.bounds.left+64)-64;
4402
me.y=Math.floor(Math.random()*Math.max(0,Game.bounds.bottom-Game.bounds.top-128)+Game.bounds.top+64)-64;
4403
me.l.style.left=me.x+'px';
4404
me.l.style.top=me.y+'px';
4405
me.l.style.width='96px';
4406
me.l.style.height='96px';
4407
me.l.style.backgroundImage='url('+bgPic+')';
4408
me.l.style.backgroundPosition=(-picX*96)+'px '+(-picY*96)+'px';
4409
me.l.style.opacity='0';
4410
me.l.style.display='block';
4411
4412
me.life=1;//the cookie's current progression through its lifespan (in frames)
4413
me.dur=13;//duration; the cookie's lifespan in seconds before it despawns
4414
4415
var dur=13;
4416
if (Game.Has('Lucky day')) dur*=2;
4417
if (Game.Has('Serendipity')) dur*=2;
4418
if (Game.Has('Decisive fate')) dur*=1.05;
4419
if (Game.Has('Lucky digit')) dur*=1.01;
4420
if (Game.Has('Lucky number')) dur*=1.01;
4421
if (Game.Has('Lucky payout')) dur*=1.01;
4422
if (!me.wrath) dur*=Game.eff('goldenCookieDur');
4423
else dur*=Game.eff('wrathCookieDur');
4424
dur*=Math.pow(0.95,Game.shimmerTypes['golden'].n-1);//5% shorter for every other golden cookie on the screen
4425
if (this.chain>0) dur=Math.max(2,10/this.chain);//this is hilarious
4426
me.dur=dur;
4427
me.life=Math.ceil(Game.fps*me.dur);
4428
me.force='';
4429
me.sizeMult=1;
4430
},
4431
updateFunc:function(me)
4432
{
4433
var curve=1-Math.pow((me.life/(Game.fps*me.dur))*2-1,4);
4434
me.l.style.opacity=curve;
4435
//this line makes each golden cookie pulse in a unique way
4436
if (Game.prefs.fancy) me.l.style.transform='rotate('+(Math.sin(me.id*0.69)*24+Math.sin(Game.T*(0.35+Math.sin(me.id*0.97)*0.15)+me.id/*+Math.sin(Game.T*0.07)*2+2*/)*(3+Math.sin(me.id*0.36)*2))+'deg) scale('+(me.sizeMult*(1+Math.sin(me.id*0.53)*0.2)*curve*(1+(0.06+Math.sin(me.id*0.41)*0.05)*(Math.sin(Game.T*(0.25+Math.sin(me.id*0.73)*0.15)+me.id))))+')';
4437
me.life--;
4438
if (me.life<=0) {this.missFunc(me);me.die();}
4439
},
4440
popFunc:function(me)
4441
{
4442
//get achievs and stats
4443
if (me.spawnLead)
4444
{
4445
Game.goldenClicks++;
4446
Game.goldenClicksLocal++;
4447
4448
if (Game.goldenClicks>=1) Game.Win('Golden cookie');
4449
if (Game.goldenClicks>=7) Game.Win('Lucky cookie');
4450
if (Game.goldenClicks>=27) Game.Win('A stroke of luck');
4451
if (Game.goldenClicks>=77) Game.Win('Fortune');
4452
if (Game.goldenClicks>=777) Game.Win('Leprechaun');
4453
if (Game.goldenClicks>=7777) Game.Win('Black cat\'s paw');
4454
4455
if (Game.goldenClicks>=7) Game.Unlock('Lucky day');
4456
if (Game.goldenClicks>=27) Game.Unlock('Serendipity');
4457
if (Game.goldenClicks>=77) Game.Unlock('Get lucky');
4458
4459
if ((me.life/Game.fps)>(me.dur-1)) Game.Win('Early bird');
4460
if (me.life<Game.fps) Game.Win('Fading luck');
4461
}
4462
4463
if (Game.forceUnslotGod)
4464
{
4465
if (Game.forceUnslotGod('asceticism')) Game.useSwap(1000000);
4466
}
4467
4468
//select an effect
4469
var list=[];
4470
if (me.wrath>0) list.push('clot','multiply cookies','ruin cookies');
4471
else list.push('frenzy','multiply cookies');
4472
if (me.wrath>0 && Game.hasGod && Game.hasGod('scorn')) list.push('clot','ruin cookies','clot','ruin cookies');
4473
if (me.wrath>0 && Math.random()<0.3) list.push('blood frenzy','chain cookie','cookie storm');
4474
else if (Math.random()<0.03 && Game.cookiesEarned>=100000) list.push('chain cookie','cookie storm');
4475
if (Math.random()<0.05 && Game.season=='fools') list.push('everything must go');
4476
if (Math.random()<0.1 && (Math.random()<0.05 || !Game.hasBuff('Dragonflight'))) list.push('click frenzy');
4477
if (me.wrath && Math.random()<0.1) list.push('cursed finger');
4478
4479
if (Game.BuildingsOwned>=10 && Math.random()<0.25) list.push('building special');
4480
4481
if (Game.canLumps() && Math.random()<0.0005) list.push('free sugar lump');
4482
4483
if ((me.wrath==0 && Math.random()<0.15) || Math.random()<0.05)
4484
{
4485
//if (Game.hasAura('Reaper of Fields')) list.push('dragon harvest');
4486
if (Math.random()<Game.auraMult('Reaper of Fields')) list.push('dragon harvest');
4487
//if (Game.hasAura('Dragonflight')) list.push('dragonflight');
4488
if (Math.random()<Game.auraMult('Dragonflight')) list.push('dragonflight');
4489
}
4490
4491
if (this.last!='' && Math.random()<0.8 && list.indexOf(this.last)!=-1) list.splice(list.indexOf(this.last),1);//80% chance to force a different one
4492
if (Math.random()<0.0001) list.push('blab');
4493
var choice=choose(list);
4494
4495
if (this.chain>0) choice='chain cookie';
4496
if (me.force!='') {this.chain=0;choice=me.force;me.force='';}
4497
if (choice!='chain cookie') this.chain=0;
4498
4499
this.last=choice;
4500
4501
//create buff for effect
4502
//buff duration multiplier
4503
var effectDurMod=1;
4504
if (Game.Has('Get lucky')) effectDurMod*=2;
4505
if (Game.Has('Lasting fortune')) effectDurMod*=1.1;
4506
if (Game.Has('Lucky digit')) effectDurMod*=1.01;
4507
if (Game.Has('Lucky number')) effectDurMod*=1.01;
4508
if (Game.Has('Green yeast digestives')) effectDurMod*=1.01;
4509
if (Game.Has('Lucky payout')) effectDurMod*=1.01;
4510
//if (Game.hasAura('Epoch Manipulator')) effectDurMod*=1.05;
4511
effectDurMod*=1+Game.auraMult('Epoch Manipulator')*0.05;
4512
if (!me.wrath) effectDurMod*=Game.eff('goldenCookieEffDur');
4513
else effectDurMod*=Game.eff('wrathCookieEffDur');
4514
4515
if (Game.hasGod)
4516
{
4517
var godLvl=Game.hasGod('decadence');
4518
if (godLvl==1) effectDurMod*=1.07;
4519
else if (godLvl==2) effectDurMod*=1.05;
4520
else if (godLvl==3) effectDurMod*=1.02;
4521
}
4522
4523
//effect multiplier (from lucky etc)
4524
var mult=1;
4525
//if (me.wrath>0 && Game.hasAura('Unholy Dominion')) mult*=1.1;
4526
//else if (me.wrath==0 && Game.hasAura('Ancestral Metamorphosis')) mult*=1.1;
4527
if (me.wrath>0) mult*=1+Game.auraMult('Unholy Dominion')*0.1;
4528
else if (me.wrath==0) mult*=1+Game.auraMult('Ancestral Metamorphosis')*0.1;
4529
if (Game.Has('Green yeast digestives')) mult*=1.01;
4530
if (!me.wrath) mult*=Game.eff('goldenCookieGain');
4531
else mult*=Game.eff('wrathCookieGain');
4532
4533
var popup='';
4534
var buff=0;
4535
4536
if (choice=='building special')
4537
{
4538
var time=Math.ceil(30*effectDurMod);
4539
var list=[];
4540
for (var i in Game.Objects)
4541
{
4542
if (Game.Objects[i].amount>=10) list.push(Game.Objects[i].id);
4543
}
4544
if (list.length==0) {choice='frenzy';}//default to frenzy if no proper building
4545
else
4546
{
4547
var obj=choose(list);
4548
var pow=Game.ObjectsById[obj].amount/10+1;
4549
if (me.wrath && Math.random()<0.3)
4550
{
4551
buff=Game.gainBuff('building debuff',time,pow,obj);
4552
}
4553
else
4554
{
4555
buff=Game.gainBuff('building buff',time,pow,obj);
4556
}
4557
}
4558
}
4559
4560
if (choice=='free sugar lump')
4561
{
4562
Game.gainLumps(1);
4563
popup='Sweet!<div style="font-size:65%;">Found 1 sugar lump!</div>';
4564
}
4565
else if (choice=='frenzy')
4566
{
4567
buff=Game.gainBuff('frenzy',Math.ceil(77*effectDurMod),7);
4568
}
4569
else if (choice=='dragon harvest')
4570
{
4571
buff=Game.gainBuff('dragon harvest',Math.ceil(60*effectDurMod),15);
4572
}
4573
else if (choice=='everything must go')
4574
{
4575
buff=Game.gainBuff('everything must go',Math.ceil(8*effectDurMod),5);
4576
}
4577
else if (choice=='multiply cookies')
4578
{
4579
var moni=mult*Math.min(Game.cookies*0.15,Game.cookiesPs*60*15)+13;//add 15% to cookies owned (+13), or 15 minutes of cookie production - whichever is lowest
4580
Game.Earn(moni);
4581
popup='Lucky!<div style="font-size:65%;">+'+Beautify(moni)+' cookies!</div>';
4582
}
4583
else if (choice=='ruin cookies')
4584
{
4585
var moni=Math.min(Game.cookies*0.05,Game.cookiesPs*60*10)+13;//lose 5% of cookies owned (-13), or 10 minutes of cookie production - whichever is lowest
4586
moni=Math.min(Game.cookies,moni);
4587
Game.Spend(moni);
4588
popup='Ruin!<div style="font-size:65%;">Lost '+Beautify(moni)+' cookies!</div>';
4589
}
4590
else if (choice=='blood frenzy')
4591
{
4592
buff=Game.gainBuff('blood frenzy',Math.ceil(6*effectDurMod),666);
4593
}
4594
else if (choice=='clot')
4595
{
4596
buff=Game.gainBuff('clot',Math.ceil(66*effectDurMod),0.5);
4597
}
4598
else if (choice=='cursed finger')
4599
{
4600
buff=Game.gainBuff('cursed finger',Math.ceil(10*effectDurMod),Game.cookiesPs*Math.ceil(10*effectDurMod));
4601
}
4602
else if (choice=='click frenzy')
4603
{
4604
buff=Game.gainBuff('click frenzy',Math.ceil(13*effectDurMod),777);
4605
}
4606
else if (choice=='dragonflight')
4607
{
4608
buff=Game.gainBuff('dragonflight',Math.ceil(10*effectDurMod),1111);
4609
if (Math.random()<0.8) Game.killBuff('Click frenzy');
4610
}
4611
else if (choice=='chain cookie')
4612
{
4613
//fix by Icehawk78
4614
if (this.chain==0) this.totalFromChain=0;
4615
this.chain++;
4616
var digit=me.wrath?6:7;
4617
if (this.chain==1) this.chain+=Math.max(0,Math.ceil(Math.log(Game.cookies)/Math.LN10)-10);
4618
4619
var maxPayout=Math.min(Game.cookiesPs*60*60*6,Game.cookies*0.5)*mult;
4620
var moni=Math.max(digit,Math.min(Math.floor(1/9*Math.pow(10,this.chain)*digit*mult),maxPayout));
4621
var nextMoni=Math.max(digit,Math.min(Math.floor(1/9*Math.pow(10,this.chain+1)*digit*mult),maxPayout));
4622
this.totalFromChain+=moni;
4623
var moniStr=Beautify(moni);
4624
4625
//break the chain if we're above 5 digits AND it's more than 50% of our bank, it grants more than 6 hours of our CpS, or just a 1% chance each digit (update : removed digit limit)
4626
if (Math.random()<0.01 || nextMoni>=maxPayout)
4627
{
4628
this.chain=0;
4629
popup='Cookie chain<div style="font-size:65%;">+'+moniStr+' cookies!<br>Cookie chain over. You made '+Beautify(this.totalFromChain)+' cookies.</div>';
4630
}
4631
else
4632
{
4633
popup='Cookie chain<div style="font-size:65%;">+'+moniStr+' cookies!</div>';//
4634
}
4635
Game.Earn(moni);
4636
}
4637
else if (choice=='cookie storm')
4638
{
4639
buff=Game.gainBuff('cookie storm',Math.ceil(7*effectDurMod),7);
4640
}
4641
else if (choice=='cookie storm drop')
4642
{
4643
var moni=Math.max(mult*(Game.cookiesPs*60*Math.floor(Math.random()*7+1)),Math.floor(Math.random()*7+1));//either 1-7 cookies or 1-7 minutes of cookie production, whichever is highest
4644
Game.Earn(moni);
4645
popup='<div style="font-size:75%;">+'+Beautify(moni)+' cookies!</div>';
4646
}
4647
else if (choice=='blab')//sorry (it's really rare)
4648
{
4649
var str=choose([
4650
'Cookie crumbliness x3 for 60 seconds!',
4651
'Chocolatiness x7 for 77 seconds!',
4652
'Dough elasticity halved for 66 seconds!',
4653
'Golden cookie shininess doubled for 3 seconds!',
4654
'World economy halved for 30 seconds!',
4655
'Grandma kisses 23% stingier for 45 seconds!',
4656
'Thanks for clicking!',
4657
'Fooled you! This one was just a test.',
4658
'Golden cookies clicked +1!',
4659
'Your click has been registered. Thank you for your cooperation.',
4660
'Thanks! That hit the spot!',
4661
'Thank you. A team has been dispatched.',
4662
'They know.',
4663
'Oops. This was just a chocolate cookie with shiny aluminium foil.'
4664
]);
4665
popup=str;
4666
}
4667
4668
if (popup=='' && buff && buff.name && buff.desc) popup=buff.name+'<div style="font-size:65%;">'+buff.desc+'</div>';
4669
if (popup!='') Game.Popup(popup,me.x+me.l.offsetWidth/2,me.y);
4670
4671
Game.DropEgg(0.9);
4672
4673
//sparkle and kill the shimmer
4674
Game.SparkleAt(me.x+48,me.y+48);
4675
if (choice=='cookie storm drop')
4676
{
4677
if (Game.prefs.cookiesound) PlaySound('snd/clickb'+Math.floor(Math.random()*7+1)+'.mp3',0.75);
4678
else PlaySound('snd/click'+Math.floor(Math.random()*7+1)+'.mp3',0.75);
4679
}
4680
else PlaySound('snd/shimmerClick.mp3');
4681
me.die();
4682
},
4683
missFunc:function(me)
4684
{
4685
if (this.chain>0 && this.totalFromChain>0)
4686
{
4687
Game.Popup('Cookie chain broken.<div style="font-size:65%;">You made '+Beautify(this.totalFromChain)+' cookies.</div>',me.x+me.l.offsetWidth/2,me.y);
4688
this.chain=0;this.totalFromChain=0;
4689
}
4690
if (me.spawnLead) Game.missedGoldenClicks++;
4691
},
4692
spawnsOnTimer:true,
4693
spawnConditions:function()
4694
{
4695
if (!Game.Has('Golden switch [off]')) return true; else return false;
4696
},
4697
spawned:0,
4698
time:0,
4699
minTime:0,
4700
maxTime:0,
4701
getTimeMod:function(me,m)
4702
{
4703
if (Game.Has('Lucky day')) m/=2;
4704
if (Game.Has('Serendipity')) m/=2;
4705
if (Game.Has('Golden goose egg')) m*=0.95;
4706
if (Game.Has('Heavenly luck')) m*=0.95;
4707
if (Game.Has('Green yeast digestives')) m*=0.99;
4708
//if (Game.hasAura('Arcane Aura')) m*=0.95;
4709
m*=1-Game.auraMult('Arcane Aura')*0.05;
4710
if (Game.hasBuff('Sugar blessing')) m*=0.9;
4711
if (Game.season=='easter' && Game.Has('Starspawn')) m*=0.98;
4712
else if (Game.season=='halloween' && Game.Has('Starterror')) m*=0.98;
4713
else if (Game.season=='valentines' && Game.Has('Starlove')) m*=0.98;
4714
else if (Game.season=='fools' && Game.Has('Startrade')) m*=0.95;
4715
if (!me.wrath) m*=1/Game.eff('goldenCookieFreq');
4716
else m*=1/Game.eff('wrathCookieFreq');
4717
if (Game.hasGod)
4718
{
4719
var godLvl=Game.hasGod('industry');
4720
if (godLvl==1) m*=1.1;
4721
else if (godLvl==2) m*=1.06;
4722
else if (godLvl==3) m*=1.03;
4723
var godLvl=Game.hasGod('mother');
4724
if (godLvl==1) m*=1.15;
4725
else if (godLvl==2) m*=1.1;
4726
else if (godLvl==3) m*=1.05;
4727
4728
if (Game.season!='')
4729
{
4730
var godLvl=Game.hasGod('seasons');
4731
if (Game.season!='fools')
4732
{
4733
if (godLvl==1) m*=0.97;
4734
else if (godLvl==2) m*=0.98;
4735
else if (godLvl==3) m*=0.99;
4736
}
4737
else
4738
{
4739
if (godLvl==1) m*=0.955;
4740
else if (godLvl==2) m*=0.97;
4741
else if (godLvl==3) m*=0.985;
4742
}
4743
}
4744
}
4745
if (this.chain>0) m=0.05;
4746
if (Game.Has('Gold hoard')) m=0.01;
4747
return Math.ceil(Game.fps*60*m);
4748
},
4749
getMinTime:function(me)
4750
{
4751
var m=5;
4752
return this.getTimeMod(me,m);
4753
},
4754
getMaxTime:function(me)
4755
{
4756
var m=15;
4757
return this.getTimeMod(me,m);
4758
},
4759
last:'',
4760
},
4761
'reindeer':{
4762
reset:function()
4763
{
4764
},
4765
initFunc:function(me)
4766
{
4767
if (!this.spawned && Game.chimeType==1 && Game.ascensionMode!=1) PlaySound('snd/jingle.mp3');
4768
4769
me.x=-128;
4770
me.y=Math.floor(Math.random()*Math.max(0,Game.bounds.bottom-Game.bounds.top-256)+Game.bounds.top+128)-128;
4771
//me.l.style.left=me.x+'px';
4772
//me.l.style.top=me.y+'px';
4773
me.l.style.width='167px';
4774
me.l.style.height='212px';
4775
me.l.style.backgroundImage='url(img/frostedReindeer.png)';
4776
me.l.style.opacity='0';
4777
//me.l.style.transform='rotate('+(Math.random()*60-30)+'deg) scale('+(Math.random()*1+0.25)+')';
4778
me.l.style.display='block';
4779
4780
me.life=1;//the reindeer's current progression through its lifespan (in frames)
4781
me.dur=4;//duration; the cookie's lifespan in seconds before it despawns
4782
4783
var dur=4;
4784
if (Game.Has('Weighted sleighs')) dur*=2;
4785
dur*=Game.eff('reindeerDur');
4786
me.dur=dur;
4787
me.life=Math.ceil(Game.fps*me.dur);
4788
me.sizeMult=1;
4789
},
4790
updateFunc:function(me)
4791
{
4792
var curve=1-Math.pow((me.life/(Game.fps*me.dur))*2-1,12);
4793
me.l.style.opacity=curve;
4794
me.l.style.transform='translate('+(me.x+(Game.bounds.right-Game.bounds.left)*(1-me.life/(Game.fps*me.dur)))+'px,'+(me.y-Math.abs(Math.sin(me.life*0.1))*128)+'px) rotate('+(Math.sin(me.life*0.2+0.3)*10)+'deg) scale('+(me.sizeMult*(1+Math.sin(me.id*0.53)*0.1))+')';
4795
me.life--;
4796
if (me.life<=0) {this.missFunc(me);me.die();}
4797
},
4798
popFunc:function(me)
4799
{
4800
//get achievs and stats
4801
if (me.spawnLead)
4802
{
4803
Game.reindeerClicked++;
4804
}
4805
4806
var val=Game.cookiesPs*60;
4807
if (Game.hasBuff('Elder frenzy')) val*=0.5;//very sorry
4808
if (Game.hasBuff('Frenzy')) val*=0.75;//I sincerely apologize
4809
var moni=Math.max(25,val);//1 minute of cookie production, or 25 cookies - whichever is highest
4810
if (Game.Has('Ho ho ho-flavored frosting')) moni*=2;
4811
moni*=Game.eff('reindeerGain');
4812
Game.Earn(moni);
4813
if (Game.hasBuff('Elder frenzy')) Game.Win('Eldeer');
4814
4815
var cookie='';
4816
var failRate=0.8;
4817
if (Game.HasAchiev('Let it snow')) failRate=0.6;
4818
failRate*=1/Game.dropRateMult();
4819
if (Game.Has('Starsnow')) failRate*=0.95;
4820
if (Game.hasGod)
4821
{
4822
var godLvl=Game.hasGod('seasons');
4823
if (godLvl==1) failRate*=0.9;
4824
else if (godLvl==2) failRate*=0.95;
4825
else if (godLvl==3) failRate*=0.97;
4826
}
4827
if (Math.random()>failRate)//christmas cookie drops
4828
{
4829
cookie=choose(['Christmas tree biscuits','Snowflake biscuits','Snowman biscuits','Holly biscuits','Candy cane biscuits','Bell biscuits','Present biscuits']);
4830
if (!Game.HasUnlocked(cookie) && !Game.Has(cookie))
4831
{
4832
Game.Unlock(cookie);
4833
}
4834
else cookie='';
4835
}
4836
4837
var popup='';
4838
4839
if (Game.prefs.popups) Game.Popup('You found '+choose(['Dasher','Dancer','Prancer','Vixen','Comet','Cupid','Donner','Blitzen','Rudolph'])+'!<br>The reindeer gives you '+Beautify(moni)+' cookies.'+(cookie==''?'':'<br>You are also rewarded with '+cookie+'!'));
4840
else Game.Notify('You found '+choose(['Dasher','Dancer','Prancer','Vixen','Comet','Cupid','Donner','Blitzen','Rudolph'])+'!','The reindeer gives you '+Beautify(moni)+' cookies.'+(cookie==''?'':'<br>You are also rewarded with '+cookie+'!'),[12,9],6);
4841
popup='<div style="font-size:80%;">+'+Beautify(moni)+' cookies!</div>';
4842
4843
if (popup!='') Game.Popup(popup,Game.mouseX,Game.mouseY);
4844
4845
//sparkle and kill the shimmer
4846
Game.SparkleAt(Game.mouseX,Game.mouseY);
4847
PlaySound('snd/jingleClick.mp3');
4848
me.die();
4849
},
4850
missFunc:function(me)
4851
{
4852
},
4853
spawnsOnTimer:true,
4854
spawnConditions:function()
4855
{
4856
if (Game.season=='christmas') return true; else return false;
4857
},
4858
spawned:0,
4859
time:0,
4860
minTime:0,
4861
maxTime:0,
4862
getTimeMod:function(me,m)
4863
{
4864
if (Game.Has('Reindeer baking grounds')) m/=2;
4865
if (Game.Has('Starsnow')) m*=0.95;
4866
if (Game.hasGod)
4867
{
4868
var godLvl=Game.hasGod('seasons');
4869
if (godLvl==1) m*=0.9;
4870
else if (godLvl==2) m*=0.95;
4871
else if (godLvl==3) m*=0.97;
4872
}
4873
m*=1/Game.eff('reindeerFreq');
4874
if (Game.Has('Reindeer season')) m=0.01;
4875
return Math.ceil(Game.fps*60*m);
4876
},
4877
getMinTime:function(me)
4878
{
4879
var m=3;
4880
return this.getTimeMod(me,m);
4881
},
4882
getMaxTime:function(me)
4883
{
4884
var m=6;
4885
return this.getTimeMod(me,m);
4886
},
4887
}
4888
};
4889
4890
Game.goldenCookieChoices=[
4891
"Frenzy","frenzy",
4892
"Lucky","multiply cookies",
4893
"Ruin","ruin cookies",
4894
"Elder frenzy","blood frenzy",
4895
"Clot","clot",
4896
"Click frenzy","click frenzy",
4897
"Cursed finger","cursed finger",
4898
"Cookie chain","chain cookie",
4899
"Cookie storm","cookie storm",
4900
"Building special","building special",
4901
"Dragon Harvest","dragon harvest",
4902
"Dragonflight","dragonflight",
4903
"Sweet","free sugar lump",
4904
"Blab","blab"
4905
];
4906
Game.goldenCookieBuildingBuffs={
4907
'Cursor':['High-five','Slap to the face'],
4908
'Grandma':['Congregation','Senility'],
4909
'Farm':['Luxuriant harvest','Locusts'],
4910
'Mine':['Ore vein','Cave-in'],
4911
'Factory':['Oiled-up','Jammed machinery'],
4912
'Bank':['Juicy profits','Recession'],
4913
'Temple':['Fervent adoration','Crisis of faith'],
4914
'Wizard tower':['Manabloom','Magivores'],
4915
'Shipment':['Delicious lifeforms','Black holes'],
4916
'Alchemy lab':['Breakthrough','Lab disaster'],
4917
'Portal':['Righteous cataclysm','Dimensional calamity'],
4918
'Time machine':['Golden ages','Time jam'],
4919
'Antimatter condenser':['Extra cycles','Predictable tragedy'],
4920
'Prism':['Solar flare','Eclipse'],
4921
'Chancemaker':['Winning streak','Dry spell'],
4922
'Fractal engine':['Macrocosm','Microcosm'],
4923
'Javascript console':['Refactoring','Antipattern'],
4924
};
4925
4926
/*=====================================================================================
4927
PARTICLES
4928
=======================================================================================*/
4929
//generic particles (falling cookies etc)
4930
//only displayed on left section
4931
Game.particles=[];
4932
for (var i=0;i<50;i++)
4933
{
4934
Game.particles[i]={x:0,y:0,xd:0,yd:0,w:64,h:64,z:0,size:1,dur:2,life:-1,r:0,pic:'smallCookies.png',picId:0};
4935
}
4936
4937
Game.particlesUpdate=function()
4938
{
4939
for (var i in Game.particles)
4940
{
4941
var me=Game.particles[i];
4942
if (me.life!=-1)
4943
{
4944
if (!me.text) me.yd+=0.2+Math.random()*0.1;
4945
me.x+=me.xd;
4946
me.y+=me.yd;
4947
//me.y+=me.life*0.25+Math.random()*0.25;
4948
me.life++;
4949
if (me.life>=Game.fps*me.dur)
4950
{
4951
me.life=-1;
4952
}
4953
}
4954
}
4955
}
4956
Game.particleAdd=function(x,y,xd,yd,size,dur,z,pic,text)
4957
{
4958
//Game.particleAdd(pos X,pos Y,speed X,speed Y,size (multiplier),duration (seconds),layer,picture,text);
4959
//pick the first free (or the oldest) particle to replace it
4960
if (1 || Game.prefs.particles)
4961
{
4962
var highest=0;
4963
var highestI=0;
4964
for (var i in Game.particles)
4965
{
4966
if (Game.particles[i].life==-1) {highestI=i;break;}
4967
if (Game.particles[i].life>highest)
4968
{
4969
highest=Game.particles[i].life;
4970
highestI=i;
4971
}
4972
}
4973
var auto=0;
4974
if (x) auto=1;
4975
var i=highestI;
4976
var x=x||-64;
4977
if (Game.LeftBackground && !auto) x=Math.floor(Math.random()*Game.LeftBackground.canvas.width);
4978
var y=y||-64;
4979
var me=Game.particles[i];
4980
me.life=0;
4981
me.x=x;
4982
me.y=y;
4983
me.xd=xd||0;
4984
me.yd=yd||0;
4985
me.size=size||1;
4986
me.z=z||0;
4987
me.dur=dur||2;
4988
me.r=Math.floor(Math.random()*360);
4989
me.picId=Math.floor(Math.random()*10000);
4990
if (!pic)
4991
{
4992
if (Game.season=='fools') pic='smallDollars.png';
4993
else
4994
{
4995
var cookies=[[10,0]];
4996
for (var i in Game.Upgrades)
4997
{
4998
var cookie=Game.Upgrades[i];
4999
if (cookie.bought>0 && cookie.pool=='cookie') cookies.push(cookie.icon);
5000
}
5001
me.picPos=choose(cookies);
5002
if (Game.bakeryName.toLowerCase()=='ortiel' || Math.random()<1/10000) me.picPos=[17,5];
5003
pic='icons.png';
5004
}
5005
}
5006
me.pic=pic||'smallCookies.png';
5007
me.text=text||0;
5008
return me;
5009
}
5010
return {};
5011
}
5012
Game.particlesDraw=function(z)
5013
{
5014
var ctx=Game.LeftBackground;
5015
ctx.fillStyle='#fff';
5016
ctx.font='20px Merriweather';
5017
ctx.textAlign='center';
5018
5019
for (var i in Game.particles)
5020
{
5021
var me=Game.particles[i];
5022
if (me.z==z)
5023
{
5024
if (me.life!=-1)
5025
{
5026
var opacity=1-(me.life/(Game.fps*me.dur));
5027
ctx.globalAlpha=opacity;
5028
if (me.text)
5029
{
5030
ctx.fillText(me.text,me.x,me.y);
5031
}
5032
else
5033
{
5034
ctx.save();
5035
ctx.translate(me.x,me.y);
5036
ctx.rotate((me.r/360)*Math.PI*2);
5037
var w=64;
5038
var h=64;
5039
if (me.pic=='icons.png')
5040
{
5041
w=48;
5042
h=48;
5043
ctx.drawImage(Pic(me.pic),me.picPos[0]*w,me.picPos[1]*h,w,h,-w/2*me.size,-h/2*me.size,w*me.size,h*me.size);
5044
}
5045
else
5046
{
5047
if (me.pic=='wrinklerBits.png' || me.pic=='shinyWrinklerBits.png') {w=100;h=200;}
5048
ctx.drawImage(Pic(me.pic),(me.picId%8)*w,0,w,h,-w/2*me.size,-h/2*me.size,w*me.size,h*me.size);
5049
}
5050
ctx.restore();
5051
}
5052
}
5053
}
5054
}
5055
}
5056
5057
//text particles (popups etc)
5058
Game.textParticles=[];
5059
Game.textParticlesY=0;
5060
var str='';
5061
for (var i=0;i<20;i++)
5062
{
5063
Game.textParticles[i]={x:0,y:0,life:-1,text:''};
5064
str+='<div id="particle'+i+'" class="particle title"></div>';
5065
}
5066
l('particles').innerHTML=str;
5067
Game.textParticlesUpdate=function()
5068
{
5069
for (var i in Game.textParticles)
5070
{
5071
var me=Game.textParticles[i];
5072
if (me.life!=-1)
5073
{
5074
me.life++;
5075
if (me.life>=Game.fps*4)
5076
{
5077
var el=me.l;
5078
me.life=-1;
5079
el.style.opacity=0;
5080
el.style.display='none';
5081
}
5082
}
5083
}
5084
}
5085
Game.textParticlesAdd=function(text,el,posX,posY)
5086
{
5087
//pick the first free (or the oldest) particle to replace it
5088
var highest=0;
5089
var highestI=0;
5090
for (var i in Game.textParticles)
5091
{
5092
if (Game.textParticles[i].life==-1) {highestI=i;break;}
5093
if (Game.textParticles[i].life>highest)
5094
{
5095
highest=Game.textParticles[i].life;
5096
highestI=i;
5097
}
5098
}
5099
var i=highestI;
5100
var noStack=0;
5101
if (typeof posX!=='undefined' && typeof posY!=='undefined')
5102
{
5103
x=posX;
5104
y=posY;
5105
noStack=1;
5106
}
5107
else
5108
{
5109
var x=(Math.random()-0.5)*40;
5110
var y=0;//+(Math.random()-0.5)*40;
5111
if (!el)
5112
{
5113
var rect=Game.bounds;
5114
var x=Math.floor((rect.left+rect.right)/2);
5115
var y=Math.floor((rect.bottom))-(Game.mobile*64);
5116
x+=(Math.random()-0.5)*40;
5117
y+=0;//(Math.random()-0.5)*40;
5118
}
5119
}
5120
if (!noStack) y-=Game.textParticlesY;
5121
5122
x=Math.max(Game.bounds.left+200,x);
5123
x=Math.min(Game.bounds.right-200,x);
5124
y=Math.max(Game.bounds.top+32,y);
5125
5126
var me=Game.textParticles[i];
5127
if (!me.l) me.l=l('particle'+i);
5128
me.life=0;
5129
me.x=x;
5130
me.y=y;
5131
me.text=text;
5132
me.l.innerHTML=text;
5133
me.l.style.left=Math.floor(Game.textParticles[i].x-200)+'px';
5134
me.l.style.bottom=Math.floor(-Game.textParticles[i].y)+'px';
5135
for (var ii in Game.textParticles)
5136
{if (ii!=i) (Game.textParticles[ii].l||l('particle'+ii)).style.zIndex=100000000;}
5137
me.l.style.zIndex=100000001;
5138
me.l.style.display='block';
5139
me.l.className='particle title';
5140
void me.l.offsetWidth;
5141
me.l.className='particle title risingUpLinger';
5142
if (!noStack) Game.textParticlesY+=60;
5143
}
5144
Game.popups=1;
5145
Game.Popup=function(text,x,y)
5146
{
5147
if (Game.popups) Game.textParticlesAdd(text,0,x,y);
5148
}
5149
5150
//display sparkles at a set position
5151
Game.sparkles=l('sparkles');
5152
Game.sparklesT=0;
5153
Game.sparklesFrames=16;
5154
Game.SparkleAt=function(x,y)
5155
{
5156
if (Game.blendModesOn)
5157
{
5158
Game.sparklesT=Game.sparklesFrames+1;
5159
Game.sparkles.style.backgroundPosition='0px 0px';
5160
Game.sparkles.style.left=Math.floor(x-64)+'px';
5161
Game.sparkles.style.top=Math.floor(y-64)+'px';
5162
Game.sparkles.style.display='block';
5163
}
5164
}
5165
Game.SparkleOn=function(el)
5166
{
5167
var rect=el.getBoundingClientRect();
5168
Game.SparkleAt((rect.left+rect.right)/2,(rect.top+rect.bottom)/2-24);
5169
}
5170
5171
/*=====================================================================================
5172
NOTIFICATIONS
5173
=======================================================================================*/
5174
//maybe do all this mess with proper DOM instead of rewriting the innerHTML
5175
Game.Notes=[];
5176
Game.NotesById=[];
5177
Game.noteId=0;
5178
Game.noteL=l('notes');
5179
Game.Note=function(title,desc,pic,quick)
5180
{
5181
this.title=title;
5182
this.desc=desc||'';
5183
this.pic=pic||'';
5184
this.id=Game.noteId;
5185
this.date=Date.now();
5186
this.quick=quick||0;
5187
this.life=(this.quick||1)*Game.fps;
5188
this.l=0;
5189
this.height=0;
5190
Game.noteId++;
5191
Game.NotesById[this.id]=this;
5192
Game.Notes.unshift(this);
5193
if (Game.Notes.length>50) Game.Notes.pop();
5194
//Game.Notes.push(this);
5195
//if (Game.Notes.length>50) Game.Notes.shift();
5196
Game.UpdateNotes();
5197
}
5198
Game.CloseNote=function(id)
5199
{
5200
var me=Game.NotesById[id];
5201
Game.Notes.splice(Game.Notes.indexOf(me),1);
5202
//Game.NotesById.splice(Game.NotesById.indexOf(me),1);
5203
Game.NotesById[id]=null;
5204
Game.UpdateNotes();
5205
}
5206
Game.CloseNotes=function()
5207
{
5208
Game.Notes=[];
5209
Game.NotesById=[];
5210
Game.UpdateNotes();
5211
}
5212
Game.UpdateNotes=function()
5213
{
5214
var str='';
5215
var remaining=Game.Notes.length;
5216
for (var i in Game.Notes)
5217
{
5218
if (i<5)
5219
{
5220
var me=Game.Notes[i];
5221
var pic='';
5222
if (me.pic!='') pic='<div class="icon" style="'+(me.pic[2]?'background-image:url('+me.pic[2]+');':'')+'background-position:'+(-me.pic[0]*48)+'px '+(-me.pic[1]*48)+'px;"></div>';
5223
str='<div id="note-'+me.id+'" class="framed note '+(me.pic!=''?'haspic':'nopic')+' '+(me.desc!=''?'hasdesc':'nodesc')+'"><div class="close" onclick="PlaySound(\'snd/tick.mp3\');Game.CloseNote('+me.id+');">x</div>'+pic+'<div class="text"><h3>'+me.title+'</h3>'+(me.desc!=''?'<div class="line"></div><h5>'+me.desc+'</h5>':'')+'</div></div>'+str;
5224
remaining--;
5225
}
5226
}
5227
if (remaining>0) str='<div class="remaining">+'+remaining+' more notification'+(remaining==1?'':'s')+'.</div>'+str;
5228
if (Game.Notes.length>1)
5229
{
5230
str+='<div class="framed close sidenote" onclick="PlaySound(\'snd/tick.mp3\');Game.CloseNotes();">x</div>';
5231
}
5232
Game.noteL.innerHTML=str;
5233
for (var i in Game.Notes)
5234
{
5235
me.l=0;
5236
if (i<5)
5237
{
5238
var me=Game.Notes[i];
5239
me.l=l('note-'+me.id);
5240
}
5241
}
5242
}
5243
Game.NotesLogic=function()
5244
{
5245
for (var i in Game.Notes)
5246
{
5247
if (Game.Notes[i].quick>0)
5248
{
5249
var me=Game.Notes[i];
5250
me.life--;
5251
if (me.life<=0) Game.CloseNote(me.id);
5252
}
5253
}
5254
}
5255
Game.NotesDraw=function()
5256
{
5257
for (var i in Game.Notes)
5258
{
5259
if (Game.Notes[i].quick>0)
5260
{
5261
var me=Game.Notes[i];
5262
if (me.l)
5263
{
5264
if (me.life<10)
5265
{
5266
me.l.style.opacity=(me.life/10);
5267
}
5268
}
5269
}
5270
}
5271
}
5272
Game.Notify=function(title,desc,pic,quick,noLog)
5273
{
5274
if (Game.prefs.notifs)
5275
{
5276
quick=Math.min(6,quick);
5277
if (!quick) quick=6;
5278
}
5279
desc=replaceAll('==CLOSETHIS()==','Game.CloseNote('+Game.noteId+');',desc);
5280
if (Game.popups) new Game.Note(title,desc,pic,quick);
5281
if (!noLog) Game.AddToLog('<b>'+title+'</b> | '+desc);
5282
}
5283
5284
5285
/*=====================================================================================
5286
PROMPT
5287
=======================================================================================*/
5288
Game.darkenL=l('darken');
5289
AddEvent(Game.darkenL,'click',function(){Game.Click=0;Game.ClosePrompt();});
5290
Game.promptL=l('promptContent');
5291
Game.promptAnchorL=l('promptAnchor');
5292
Game.promptWrapL=l('prompt');
5293
Game.promptConfirm='';
5294
Game.promptOn=0;
5295
Game.promptUpdateFunc=0;
5296
Game.UpdatePrompt=function()
5297
{
5298
if (Game.promptUpdateFunc) Game.promptUpdateFunc();
5299
Game.promptAnchorL.style.top=Math.floor((Game.windowH-Game.promptWrapL.offsetHeight)/2-16)+'px';
5300
}
5301
Game.Prompt=function(content,options,updateFunc,style)
5302
{
5303
if (updateFunc) Game.promptUpdateFunc=updateFunc;
5304
if (style) Game.promptWrapL.className='framed '+style; else Game.promptWrapL.className='framed';
5305
var str='';
5306
str+=content;
5307
var opts='';
5308
for (var i in options)
5309
{
5310
if (options[i]=='br')//just a linebreak
5311
{opts+='<br>';}
5312
else
5313
{
5314
if (typeof options[i]=='string') options[i]=[options[i],'Game.ClosePrompt();'];
5315
options[i][1]=options[i][1].replace(/'/g,'&#39;').replace(/"/g,'&#34;');
5316
opts+='<a id="promptOption'+i+'" class="option" '+Game.clickStr+'="PlaySound(\'snd/tick.mp3\');'+options[i][1]+'">'+options[i][0]+'</a>';
5317
}
5318
}
5319
Game.promptL.innerHTML=str+'<div class="optionBox">'+opts+'</div>';
5320
Game.promptAnchorL.style.display='block';
5321
Game.darkenL.style.display='block';
5322
Game.promptL.focus();
5323
Game.promptOn=1;
5324
Game.UpdatePrompt();
5325
}
5326
Game.ClosePrompt=function()
5327
{
5328
Game.promptAnchorL.style.display='none';
5329
Game.darkenL.style.display='none';
5330
Game.promptOn=0;
5331
Game.promptUpdateFunc=0;
5332
}
5333
Game.ConfirmPrompt=function()
5334
{
5335
if (Game.promptOn && l('promptOption0') && l('promptOption0').style.display!='none') FireEvent(l('promptOption0'),'click');
5336
}
5337
5338
/*=====================================================================================
5339
MENUS
5340
=======================================================================================*/
5341
Game.cssClasses=[];
5342
Game.addClass=function(what) {if (Game.cssClasses.indexOf(what)==-1) Game.cssClasses.push(what);Game.updateClasses();}
5343
Game.removeClass=function(what) {var i=Game.cssClasses.indexOf(what);if(i!=-1) {Game.cssClasses.splice(i,1);}Game.updateClasses();}
5344
Game.updateClasses=function() {Game.l.className=Game.cssClasses.join(' ');}
5345
5346
Game.WriteButton=function(prefName,button,on,off,callback,invert)
5347
{
5348
var invert=invert?1:0;
5349
if (!callback) callback='';
5350
callback+='PlaySound(\'snd/tick.mp3\');';
5351
return '<a class="option'+((Game.prefs[prefName]^invert)?'':' off')+'" id="'+button+'" '+Game.clickStr+'="Game.Toggle(\''+prefName+'\',\''+button+'\',\''+on+'\',\''+off+'\',\''+invert+'\');'+callback+'">'+(Game.prefs[prefName]?on:off)+'</a>';
5352
}
5353
Game.Toggle=function(prefName,button,on,off,invert)
5354
{
5355
if (Game.prefs[prefName])
5356
{
5357
l(button).innerHTML=off;
5358
Game.prefs[prefName]=0;
5359
}
5360
else
5361
{
5362
l(button).innerHTML=on;
5363
Game.prefs[prefName]=1;
5364
}
5365
l(button).className='option'+((Game.prefs[prefName]^invert)?'':' off');
5366
5367
}
5368
Game.ToggleFancy=function()
5369
{
5370
if (Game.prefs.fancy) Game.removeClass('noFancy');
5371
else if (!Game.prefs.fancy) Game.addClass('noFancy');
5372
}
5373
Game.ToggleFilters=function()
5374
{
5375
if (Game.prefs.filters) Game.removeClass('noFilters');
5376
else if (!Game.prefs.filters) Game.addClass('noFilters');
5377
}
5378
Game.ToggleExtraButtons=function()
5379
{
5380
if (!Game.prefs.extraButtons) Game.removeClass('extraButtons');
5381
else if (Game.prefs.extraButtons) Game.addClass('extraButtons');
5382
for (var i in Game.Objects)
5383
{
5384
Game.Objects[i].mute(0);
5385
}
5386
}
5387
5388
Game.WriteSlider=function(slider,leftText,rightText,startValueFunction,callback)
5389
{
5390
if (!callback) callback='';
5391
return '<div class="sliderBox"><div style="float:left;">'+leftText+'</div><div style="float:right;" id="'+slider+'RightText">'+rightText.replace('[$]',startValueFunction())+'</div><input class="slider" style="clear:both;" type="range" min="0" max="100" step="1" value="'+startValueFunction()+'" onchange="'+callback+'" oninput="'+callback+'" onmouseup="PlaySound(\'snd/tick.mp3\');" id="'+slider+'"/></div>';
5392
}
5393
5394
Game.onPanel='Left';
5395
Game.addClass('focus'+Game.onPanel);
5396
Game.ShowPanel=function(what)
5397
{
5398
if (!what) what='';
5399
if (Game.onPanel!=what)
5400
{
5401
Game.removeClass('focus'+Game.onPanel);
5402
Game.addClass('focus'+what);
5403
}
5404
Game.onPanel=what;
5405
}
5406
5407
Game.onMenu='';
5408
Game.ShowMenu=function(what)
5409
{
5410
if (!what || what=='') what=Game.onMenu;
5411
if (Game.onMenu=='' && what!='') Game.addClass('onMenu');
5412
else if (Game.onMenu!='' && what!=Game.onMenu) Game.addClass('onMenu');
5413
else if (what==Game.onMenu) {Game.removeClass('onMenu');what='';}
5414
//if (what=='log') l('donateBox').className='on'; else l('donateBox').className='';
5415
Game.onMenu=what;
5416
5417
l('prefsButton').className=(Game.onMenu=='prefs')?'button selected':'button';
5418
l('statsButton').className=(Game.onMenu=='stats')?'button selected':'button';
5419
l('logButton').className=(Game.onMenu=='log')?'button selected':'button';
5420
5421
if (Game.onMenu=='') PlaySound('snd/clickOff.mp3');
5422
else PlaySound('snd/clickOn.mp3');
5423
5424
Game.UpdateMenu();
5425
5426
if (what=='')
5427
{
5428
for (var i in Game.Objects)
5429
{
5430
var me=Game.Objects[i];
5431
if (me.minigame && me.minigame.onResize) me.minigame.onResize();
5432
}
5433
}
5434
}
5435
Game.sayTime=function(time,detail)
5436
{
5437
//time is a value where one second is equal to Game.fps (30).
5438
//detail skips days when >1, hours when >2, minutes when >3 and seconds when >4.
5439
//if detail is -1, output something like "3 hours, 9 minutes, 48 seconds"
5440
if (time<=0) return '';
5441
var str='';
5442
var detail=detail||0;
5443
time=Math.floor(time);
5444
if (detail==-1)
5445
{
5446
//var months=0;
5447
var days=0;
5448
var hours=0;
5449
var minutes=0;
5450
var seconds=0;
5451
//if (time>=Game.fps*60*60*24*30) months=(Math.floor(time/(Game.fps*60*60*24*30)));
5452
if (time>=Game.fps*60*60*24) days=(Math.floor(time/(Game.fps*60*60*24)));
5453
if (time>=Game.fps*60*60) hours=(Math.floor(time/(Game.fps*60*60)));
5454
if (time>=Game.fps*60) minutes=(Math.floor(time/(Game.fps*60)));
5455
if (time>=Game.fps) seconds=(Math.floor(time/(Game.fps)));
5456
//days-=months*30;
5457
hours-=days*24;
5458
minutes-=hours*60+days*24*60;
5459
seconds-=minutes*60+hours*60*60+days*24*60*60;
5460
if (days>10) {hours=0;}
5461
if (days) {minutes=0;seconds=0;}
5462
if (hours) {seconds=0;}
5463
var bits=[];
5464
//if (months>0) bits.push(Beautify(months)+' month'+(days==1?'':'s'));
5465
if (days>0) bits.push(Beautify(days)+' day'+(days==1?'':'s'));
5466
if (hours>0) bits.push(Beautify(hours)+' hour'+(hours==1?'':'s'));
5467
if (minutes>0) bits.push(Beautify(minutes)+' minute'+(minutes==1?'':'s'));
5468
if (seconds>0) bits.push(Beautify(seconds)+' second'+(seconds==1?'':'s'));
5469
if (bits.length==0) str='less than 1 second';
5470
else str=bits.join(', ');
5471
}
5472
else
5473
{
5474
/*if (time>=Game.fps*60*60*24*30*2 && detail<1) str=Beautify(Math.floor(time/(Game.fps*60*60*24*30)))+' months';
5475
else if (time>=Game.fps*60*60*24*30 && detail<1) str='1 month';
5476
else */if (time>=Game.fps*60*60*24*2 && detail<2) str=Beautify(Math.floor(time/(Game.fps*60*60*24)))+' days';
5477
else if (time>=Game.fps*60*60*24 && detail<2) str='1 day';
5478
else if (time>=Game.fps*60*60*2 && detail<3) str=Beautify(Math.floor(time/(Game.fps*60*60)))+' hours';
5479
else if (time>=Game.fps*60*60 && detail<3) str='1 hour';
5480
else if (time>=Game.fps*60*2 && detail<4) str=Beautify(Math.floor(time/(Game.fps*60)))+' minutes';
5481
else if (time>=Game.fps*60 && detail<4) str='1 minute';
5482
else if (time>=Game.fps*2 && detail<5) str=Beautify(Math.floor(time/(Game.fps)))+' seconds';
5483
else if (time>=Game.fps && detail<5) str='1 second';
5484
else str='less than 1 second';
5485
}
5486
return str;
5487
}
5488
5489
Game.tinyCookie=function()
5490
{
5491
if (!Game.HasAchiev('Tiny cookie'))
5492
{
5493
return '<div class="tinyCookie" '+Game.clickStr+'="Game.ClickTinyCookie();"></div>';
5494
}
5495
return '';
5496
}
5497
Game.ClickTinyCookie=function(){if (!Game.HasAchiev('Tiny cookie')){PlaySound('snd/tick.mp3');Game.Win('Tiny cookie');}}
5498
5499
Game.setVolume=function(what)
5500
{
5501
Game.volume=what;
5502
/*for (var i in Sounds)
5503
{
5504
Sounds[i].volume=Game.volume;
5505
}*/
5506
}
5507
5508
Game.UpdateMenu=function()
5509
{
5510
var str='';
5511
if (Game.onMenu!='')
5512
{
5513
str+='<div class="close menuClose" '+Game.clickStr+'="Game.ShowMenu();">x</div>';
5514
//str+='<div style="position:absolute;top:8px;right:8px;cursor:pointer;font-size:16px;" '+Game.clickStr+'="Game.ShowMenu();">X</div>';
5515
}
5516
if (Game.onMenu=='prefs')
5517
{
5518
str+='<div class="section">Options</div>'+
5519
'<div class="subsection">'+
5520
'<div class="title">General</div>'+
5521
'<div class="listing"><a class="option" '+Game.clickStr+'="Game.toSave=true;PlaySound(\'snd/tick.mp3\');">Save</a><label>Save manually (the game autosaves every 60 seconds; shortcut : ctrl+S)</label></div>'+
5522
'<div class="listing"><a class="option" '+Game.clickStr+'="Game.ExportSave();PlaySound(\'snd/tick.mp3\');">Export save</a><a class="option" '+Game.clickStr+'="Game.ImportSave();PlaySound(\'snd/tick.mp3\');">Import save</a><label>You can use this to backup your save or to transfer it to another computer (shortcut for import : ctrl+O)</label></div>'+
5523
'<div class="listing"><a class="option" '+Game.clickStr+'="Game.FileSave();PlaySound(\'snd/tick.mp3\');">Save to file</a><a class="option" style="position:relative;"><input id="FileLoadInput" type="file" style="cursor:pointer;opacity:0;position:absolute;left:0px;top:0px;width:100%;height:100%;" onchange="Game.FileLoad(event);" '+Game.clickStr+'="PlaySound(\'snd/tick.mp3\');"/>Load from file</a><label>Use this to keep backups on your computer</label></div>'+
5524
5525
'<div class="listing"><a class="option warning" '+Game.clickStr+'="Game.HardReset();PlaySound(\'snd/tick.mp3\');">Wipe save</a><label>Delete all your progress, including your achievements</label></div>'+
5526
'<div class="title">Settings</div>'+
5527
'<div class="listing">'+
5528
Game.WriteSlider('volumeSlider','Volume','[$]%',function(){return Game.volume;},'Game.setVolume(Math.round(l(\'volumeSlider\').value));l(\'volumeSliderRightText\').innerHTML=Game.volume+\'%\';')+'<br>'+
5529
Game.WriteButton('fancy','fancyButton','Fancy graphics ON','Fancy graphics OFF','Game.ToggleFancy();')+'<label>(visual improvements; disabling may improve performance)</label><br>'+
5530
Game.WriteButton('filters','filtersButton','CSS filters ON','CSS filters OFF','Game.ToggleFilters();')+'<label>(cutting-edge visual improvements; disabling may improve performance)</label><br>'+
5531
Game.WriteButton('particles','particlesButton','Particles ON','Particles OFF')+'<label>(cookies falling down, etc; disabling may improve performance)</label><br>'+
5532
Game.WriteButton('numbers','numbersButton','Numbers ON','Numbers OFF')+'<label>(numbers that pop up when clicking the cookie)</label><br>'+
5533
Game.WriteButton('milk','milkButton','Milk ON','Milk OFF')+'<label>(only appears with enough achievements)</label><br>'+
5534
Game.WriteButton('cursors','cursorsButton','Cursors ON','Cursors OFF')+'<label>(visual display of your cursors)</label><br>'+
5535
Game.WriteButton('wobbly','wobblyButton','Wobbly cookie ON','Wobbly cookie OFF')+'<label>(your cookie will react when you click it)</label><br>'+
5536
Game.WriteButton('cookiesound','cookiesoundButton','Alt cookie sound ON','Alt cookie sound OFF')+'<label>(how your cookie sounds when you click on it)</label><br>'+
5537
Game.WriteButton('crates','cratesButton','Icon crates ON','Icon crates OFF')+'<label>(display boxes around upgrades and achievements in stats)</label><br>'+
5538
Game.WriteButton('monospace','monospaceButton','Alt font ON','Alt font OFF')+'<label>(your cookies are displayed using a monospace font)</label><br>'+
5539
Game.WriteButton('format','formatButton','Short numbers OFF','Short numbers ON','BeautifyAll();Game.RefreshStore();Game.upgradesToRebuild=1;',1)+'<label>(shorten big numbers)</label><br>'+
5540
Game.WriteButton('notifs','notifsButton','Fast notes ON','Fast notes OFF')+'<label>(notifications disappear much faster)</label><br>'+
5541
//Game.WriteButton('autoupdate','autoupdateButton','Offline mode OFF','Offline mode ON',0,1)+'<label>(disables update notifications)</label><br>'+
5542
Game.WriteButton('warn','warnButton','Closing warning ON','Closing warning OFF')+'<label>(the game will ask you to confirm when you close the window)</label><br>'+
5543
Game.WriteButton('focus','focusButton','Defocus OFF','Defocus ON',0,1)+'<label>(the game will be less resource-intensive when out of focus)</label><br>'+
5544
Game.WriteButton('extraButtons','extraButtonsButton','Extra buttons ON','Extra buttons OFF','Game.ToggleExtraButtons();')+'<label>(add Mute buttons on buildings)</label><br>'+
5545
Game.WriteButton('askLumps','askLumpsButton','Lump confirmation ON','Lump confirmation OFF')+'<label>(the game will ask you to confirm before spending sugar lumps)</label><br>'+
5546
Game.WriteButton('customGrandmas','customGrandmasButton','Custom grandmas ON','Custom grandmas OFF')+'<label>(some grandmas will be named after Patreon supporters)</label><br>'+
5547
Game.WriteButton('timeout','timeoutButton','Sleep mode timeout ON','Sleep mode timeout OFF')+'<label>(on slower computers, the game will put itself in sleep mode when it\'s inactive and starts to lag out; offline CpS production kicks in during sleep mode)</label><br>'+
5548
'</div>'+
5549
//'<div class="listing">'+Game.WriteButton('autosave','autosaveButton','Autosave ON','Autosave OFF')+'</div>'+
5550
'<div style="padding-bottom:128px;"></div>'+
5551
'</div>'
5552
;
5553
}
5554
else if (Game.onMenu=='main')
5555
{
5556
str+=
5557
'<div class="listing">This isn\'t really finished</div>'+
5558
'<div class="listing"><a class="option big title" '+Game.clickStr+'="Game.ShowMenu(\'prefs\');">Menu</a></div>'+
5559
'<div class="listing"><a class="option big title" '+Game.clickStr+'="Game.ShowMenu(\'stats\');">Stats</a></div>'+
5560
'<div class="listing"><a class="option big title" '+Game.clickStr+'="Game.ShowMenu(\'log\');">Updates</a></div>'+
5561
'<div class="listing"><a class="option big title" '+Game.clickStr+'="">Quit</a></div>'+
5562
'<div class="listing"><a class="option big title" '+Game.clickStr+'="Game.ShowMenu(Game.onMenu);">Resume</a></div>';
5563
}
5564
else if (Game.onMenu=='log')
5565
{
5566
str+=replaceAll('[bakeryName]',Game.bakeryName,Game.updateLog);
5567
}
5568
else if (Game.onMenu=='stats')
5569
{
5570
var buildingsOwned=0;
5571
buildingsOwned=Game.BuildingsOwned;
5572
var upgrades='';
5573
var cookieUpgrades='';
5574
var hiddenUpgrades='';
5575
var prestigeUpgrades='';
5576
var upgradesTotal=0;
5577
var upgradesOwned=0;
5578
var prestigeUpgradesTotal=0;
5579
var prestigeUpgradesOwned=0;
5580
5581
var list=[];
5582
for (var i in Game.Upgrades)//sort the upgrades
5583
{
5584
list.push(Game.Upgrades[i]);
5585
}
5586
var sortMap=function(a,b)
5587
{
5588
if (a.order>b.order) return 1;
5589
else if (a.order<b.order) return -1;
5590
else return 0;
5591
}
5592
list.sort(sortMap);
5593
for (var i in list)
5594
{
5595
var str2='';
5596
var me=list[i];
5597
5598
str2+=Game.crate(me,'stats');
5599
5600
if (me.bought)
5601
{
5602
if (Game.CountsAsUpgradeOwned(me.pool)) upgradesOwned++;
5603
else if (me.pool=='prestige') prestigeUpgradesOwned++;
5604
}
5605
5606
if (me.pool=='' || me.pool=='cookie' || me.pool=='tech') upgradesTotal++;
5607
if (me.pool=='debug') hiddenUpgrades+=str2;
5608
else if (me.pool=='prestige') {prestigeUpgrades+=str2;prestigeUpgradesTotal++;}
5609
else if (me.pool=='cookie') cookieUpgrades+=str2;
5610
else if (me.pool!='toggle' && me.pool!='unused') upgrades+=str2;
5611
}
5612
var achievements=[];
5613
var achievementsOwned=0;
5614
var achievementsOwnedOther=0;
5615
var achievementsTotal=0;
5616
5617
var list=[];
5618
for (var i in Game.Achievements)//sort the achievements
5619
{
5620
list.push(Game.Achievements[i]);
5621
}
5622
var sortMap=function(a,b)
5623
{
5624
if (a.order>b.order) return 1;
5625
else if (a.order<b.order) return -1;
5626
else return 0;
5627
}
5628
list.sort(sortMap);
5629
5630
5631
for (var i in list)
5632
{
5633
var me=list[i];
5634
//if (me.pool=='normal' || me.won>0) achievementsTotal++;
5635
if (Game.CountsAsAchievementOwned(me.pool)) achievementsTotal++;
5636
var pool=me.pool;
5637
if (!achievements[pool]) achievements[pool]='';
5638
achievements[pool]+=Game.crate(me,'stats');
5639
5640
if (me.won)
5641
{
5642
if (Game.CountsAsAchievementOwned(me.pool)) achievementsOwned++;
5643
else achievementsOwnedOther++;
5644
}
5645
}
5646
5647
var achievementsStr='';
5648
var pools={
5649
'dungeon':'<b>Dungeon achievements</b> <small>(Not technically achievable yet.)</small>',
5650
'shadow':'<b>Shadow achievements</b> <small>(These are feats that are either unfair or difficult to attain. They do not give milk.)</small>'
5651
};
5652
for (var i in achievements)
5653
{
5654
if (achievements[i]!='')
5655
{
5656
if (pools[i]) achievementsStr+='<div class="listing">'+pools[i]+'</div>';
5657
achievementsStr+='<div class="listing crateBox">'+achievements[i]+'</div>';
5658
}
5659
}
5660
5661
var milkStr='';
5662
for (var i=0;i<Game.Milks.length;i++)
5663
{
5664
if (Game.milkProgress>=i)
5665
{
5666
var milk=Game.Milks[i];
5667
milkStr+='<div '+Game.getTooltip(
5668
'<div class="prompt" style="text-align:center;padding-bottom:6px;white-space:nowrap;margin:0px;padding-bottom:96px;"><h3 style="margin:6px 32px 0px 32px;">'+milk.name+'</h3><div style="opacity:0.75;font-size:9px;">('+(i==0?'starter milk':('for '+Beautify(i*25)+' achievements'))+')</div><div class="line"></div><div style="width:100%;height:96px;position:absolute;left:0px;bottom:0px;background:url(img/'+milk.pic+'.png);"></div></div>'
5669
,'top')+' style="background:url(img/icons.png) '+(-milk.icon[0]*48)+'px '+(-milk.icon[1]*48)+'px;margin:2px 0px;" class="trophy"></div>';
5670
}
5671
}
5672
milkStr+='<div style="clear:both;"></div>';
5673
5674
var santaStr='';
5675
var frames=15;
5676
if (Game.Has('A festive hat'))
5677
{
5678
for (var i=0;i<=Game.santaLevel;i++)
5679
{
5680
santaStr+='<div '+Game.getTooltip(
5681
'<div class="prompt" style="text-align:center;padding-bottom:6px;white-space:nowrap;margin:0px 32px;"><div style="width:96px;height:96px;margin:4px auto;background:url(img/santa.png) '+(-i*96)+'px 0px;filter:drop-shadow(0px 3px 2px #000);-webkit-filter:drop-shadow(0px 3px 2px #000);"></div><div class="line"></div><h3>'+Game.santaLevels[i]+'</h3></div>'
5682
,'top')+' style="background:url(img/santa.png) '+(-i*48)+'px 0px;background-size:'+(frames*48)+'px 48px;" class="trophy"></div>';
5683
}
5684
santaStr+='<div style="clear:both;"></div>';
5685
}
5686
var dragonStr='';
5687
var frames=9;
5688
var mainLevels=[0,4,8,22,23,24];
5689
if (Game.Has('A crumbly egg'))
5690
{
5691
for (var i=0;i<=mainLevels.length;i++)
5692
{
5693
if (Game.dragonLevel>=mainLevels[i])
5694
{
5695
var level=Game.dragonLevels[mainLevels[i]];
5696
dragonStr+='<div '+Game.getTooltip(
5697
//'<div style="width:96px;height:96px;margin:4px auto;background:url(img/dragon.png?v='+Game.version+') '+(-level.pic*96)+'px 0px;"></div><div class="line"></div><div style="min-width:200px;text-align:center;margin-bottom:6px;">'+level.name+'</div>'
5698
'<div class="prompt" style="text-align:center;padding-bottom:6px;white-space:nowrap;margin:0px 32px;"><div style="width:96px;height:96px;margin:4px auto;background:url(img/dragon.png?v='+Game.version+') '+(-level.pic*96)+'px 0px;filter:drop-shadow(0px 3px 2px #000);-webkit-filter:drop-shadow(0px 3px 2px #000);"></div><div class="line"></div><h3>'+level.name+'</h3></div>'
5699
,'top')+' style="background:url(img/dragon.png?v='+Game.version+') '+(-level.pic*48)+'px 0px;background-size:'+(frames*48)+'px 48px;" class="trophy"></div>';
5700
}
5701
}
5702
dragonStr+='<div style="clear:both;"></div>';
5703
}
5704
var ascensionModeStr='';
5705
var icon=Game.ascensionModes[Game.ascensionMode].icon;
5706
if (Game.resets>0) ascensionModeStr='<span style="cursor:pointer;" '+Game.getTooltip(
5707
'<div style="min-width:200px;text-align:center;font-size:11px;">'+Game.ascensionModes[Game.ascensionMode].desc+'</div>'
5708
,'top')+'><div class="icon" style="display:inline-block;float:none;transform:scale(0.5);margin:-24px -16px -19px -8px;'+(icon[2]?'background-image:url('+icon[2]+');':'')+'background-position:'+(-icon[0]*48)+'px '+(-icon[1]*48)+'px;"></div>'+Game.ascensionModes[Game.ascensionMode].name+'</span>';
5709
5710
var milkName=Game.Milk.name;
5711
5712
var researchStr=Game.sayTime(Game.researchT,-1);
5713
var pledgeStr=Game.sayTime(Game.pledgeT,-1);
5714
var wrathStr='';
5715
if (Game.elderWrath==1) wrathStr='awoken';
5716
else if (Game.elderWrath==2) wrathStr='displeased';
5717
else if (Game.elderWrath==3) wrathStr='angered';
5718
else if (Game.elderWrath==0 && Game.pledges>0) wrathStr='appeased';
5719
5720
var date=new Date();
5721
date.setTime(Date.now()-Game.startDate);
5722
var timeInSeconds=date.getTime()/1000;
5723
var startDate=Game.sayTime(timeInSeconds*Game.fps,-1);
5724
date.setTime(Date.now()-Game.fullDate);
5725
var fullDate=Game.sayTime(date.getTime()/1000*Game.fps,-1);
5726
if (!Game.fullDate || !fullDate || fullDate.length<1) fullDate='a long while';
5727
/*date.setTime(new Date().getTime()-Game.lastDate);
5728
var lastDate=Game.sayTime(date.getTime()/1000*Game.fps,2);*/
5729
5730
var heavenlyMult=Game.GetHeavenlyMultiplier();
5731
5732
var seasonStr=Game.sayTime(Game.seasonT,-1);
5733
5734
str+='<div class="section">Statistics</div>'+
5735
'<div class="subsection">'+
5736
'<div class="title">General</div>'+
5737
'<div class="listing"><b>Cookies in bank :</b> <div class="price plain">'+Game.tinyCookie()+Beautify(Game.cookies)+'</div></div>'+
5738
'<div class="listing"><b>Cookies baked (this ascension) :</b> <div class="price plain">'+Game.tinyCookie()+Beautify(Game.cookiesEarned)+'</div></div>'+
5739
'<div class="listing"><b>Cookies baked (all time) :</b> <div class="price plain">'+Game.tinyCookie()+Beautify(Game.cookiesEarned+Game.cookiesReset)+'</div></div>'+
5740
(Game.cookiesReset>0?'<div class="listing"><b>Cookies forfeited by ascending :</b> <div class="price plain">'+Game.tinyCookie()+Beautify(Game.cookiesReset)+'</div></div>':'')+
5741
(Game.resets?('<div class="listing"><b>Legacy started :</b> '+(fullDate==''?'just now':(fullDate+' ago'))+', with '+Beautify(Game.resets)+' ascension'+(Game.resets==1?'':'s')+'</div>'):'')+
5742
'<div class="listing"><b>Run started :</b> '+(startDate==''?'just now':(startDate+' ago'))+'</div>'+
5743
'<div class="listing"><b>Buildings owned :</b> '+Beautify(buildingsOwned)+'</div>'+
5744
'<div class="listing"><b>Cookies per second :</b> '+Beautify(Game.cookiesPs,1)+' <small>'+
5745
'(multiplier : '+Beautify(Math.round(Game.globalCpsMult*100),1)+'%)'+
5746
(Game.cpsSucked>0?' <span class="warning">(withered : '+Beautify(Math.round(Game.cpsSucked*100),1)+'%)</span>':'')+
5747
'</small></div>'+
5748
'<div class="listing"><b>Cookies per click :</b> '+Beautify(Game.computedMouseCps,1)+'</div>'+
5749
'<div class="listing"><b>Cookie clicks :</b> '+Beautify(Game.cookieClicks)+'</div>'+
5750
'<div class="listing"><b>Hand-made cookies :</b> '+Beautify(Game.handmadeCookies)+'</div>'+
5751
'<div class="listing"><b>Golden cookie clicks :</b> '+Beautify(Game.goldenClicksLocal)+' <small>(all time : '+Beautify(Game.goldenClicks)+')</small></div>'+//' <span class="hidden">(<b>Missed golden cookies :</b> '+Beautify(Game.missedGoldenClicks)+')</span></div>'+
5752
'<br><div class="listing"><b>Running version :</b> '+Game.version+'</div>'+
5753
5754
((researchStr!='' || wrathStr!='' || pledgeStr!='' || santaStr!='' || dragonStr!='' || Game.season!='' || ascensionModeStr!='' || Game.canLumps())?(
5755
'</div><div class="subsection">'+
5756
'<div class="title">Special</div>'+
5757
(ascensionModeStr!=''?'<div class="listing"><b>Challenge mode :</b>'+ascensionModeStr+'</div>':'')+
5758
(Game.season!=''?'<div class="listing"><b>Seasonal event :</b> '+Game.seasons[Game.season].name+
5759
(seasonStr!=''?' <small>('+seasonStr+' remaining)</small>':'')+
5760
'</div>':'')+
5761
(Game.season=='fools'?
5762
'<div class="listing"><b>Money made from selling cookies :</b> $'+Beautify(Game.cookiesEarned*0.08,2)+'</div>'+
5763
(Game.Objects['Portal'].amount>0?'<div class="listing"><b>TV show seasons produced :</b> '+Beautify(Math.floor((timeInSeconds/60/60)*(Game.Objects['Portal'].amount*0.13)+1))+'</div>':'')
5764
:'')+
5765
(researchStr!=''?'<div class="listing"><b>Research :</b> '+researchStr+' remaining</div>':'')+
5766
(wrathStr!=''?'<div class="listing"><b>Grandmatriarchs status :</b> '+wrathStr+'</div>':'')+
5767
(pledgeStr!=''?'<div class="listing"><b>Pledge :</b> '+pledgeStr+' remaining</div>':'')+
5768
(Game.wrinklersPopped>0?'<div class="listing"><b>Wrinklers popped :</b> '+Beautify(Game.wrinklersPopped)+'</div>':'')+
5769
((Game.canLumps() && Game.lumpsTotal>-1)?'<div class="listing"><b>Sugar lumps harvested :</b> <div class="price lump plain">'+Beautify(Game.lumpsTotal)+'</div></div>':'')+
5770
//(Game.cookiesSucked>0?'<div class="listing warning"><b>Withered :</b> '+Beautify(Game.cookiesSucked)+' cookies</div>':'')+
5771
(Game.reindeerClicked>0?'<div class="listing"><b>Reindeer found :</b> '+Beautify(Game.reindeerClicked)+'</div>':'')+
5772
(santaStr!=''?'<div class="listing"><b>Santa stages unlocked :</b></div><div>'+santaStr+'</div>':'')+
5773
(dragonStr!=''?'<div class="listing"><b>Dragon training :</b></div><div>'+dragonStr+'</div>':'')+
5774
''
5775
):'')+
5776
((Game.prestige>0 || prestigeUpgrades!='')?(
5777
'</div><div class="subsection">'+
5778
'<div class="title">Prestige</div>'+
5779
'<div class="listing"><div class="icon" style="float:left;background-position:'+(-19*48)+'px '+(-7*48)+'px;"></div>'+
5780
'<div style="margin-top:8px;"><span class="title" style="font-size:22px;">Prestige level : '+Beautify(Game.prestige)+'</span> at '+Beautify(heavenlyMult*100,1)+'% of its potential <b>(+'+Beautify(parseFloat(Game.prestige)*Game.heavenlyPower*heavenlyMult,1)+'% CpS)</b><br>Heavenly chips : <b>'+Beautify(Game.heavenlyChips)+'</b></div>'+
5781
'</div>'+
5782
(prestigeUpgrades!=''?(
5783
'<div class="listing" style="clear:left;"><b>Prestige upgrades unlocked :</b> '+prestigeUpgradesOwned+'/'+prestigeUpgradesTotal+' ('+Math.floor((prestigeUpgradesOwned/prestigeUpgradesTotal)*100)+'%)</div>'+
5784
'<div class="listing crateBox">'+prestigeUpgrades+'</div>'):'')+
5785
''):'')+
5786
5787
'</div><div class="subsection">'+
5788
'<div class="title">Upgrades</div>'+
5789
(hiddenUpgrades!=''?('<div class="listing"><b>Debug</b></div>'+
5790
'<div class="listing crateBox">'+hiddenUpgrades+'</div>'):'')+
5791
'<div class="listing"><b>Upgrades unlocked :</b> '+upgradesOwned+'/'+upgradesTotal+' ('+Math.floor((upgradesOwned/upgradesTotal)*100)+'%)</div>'+
5792
'<div class="listing crateBox">'+upgrades+'</div>'+
5793
(cookieUpgrades!=''?('<div class="listing"><b>Cookies</b></div>'+
5794
'<div class="listing crateBox">'+cookieUpgrades+'</div>'):'')+
5795
'</div><div class="subsection">'+
5796
'<div class="title">Achievements</div>'+
5797
'<div class="listing"><b>Achievements unlocked :</b> '+achievementsOwned+'/'+achievementsTotal+' ('+Math.floor((achievementsOwned/achievementsTotal)*100)+'%)'+(achievementsOwnedOther>0?('<span style="font-weight:bold;font-size:10px;color:#70a;"> (+'+achievementsOwnedOther+')</span>'):'')+'</div>'+
5798
(Game.cookiesMultByType['kittens']>1?('<div class="listing"><b>Kitten multiplier :</b> '+Beautify((Game.cookiesMultByType['kittens'])*100)+'%</div>'):'')+
5799
'<div class="listing"><b>Milk :</b> '+milkName+'</div>'+
5800
(milkStr!=''?'<div class="listing"><b>Milk flavors unlocked :</b></div><div>'+milkStr+'</div>':'')+
5801
'<div class="listing"><small style="opacity:0.75;">(Milk is gained with each achievement. It can unlock unique upgrades over time.)</small></div>'+
5802
achievementsStr+
5803
'</div>'+
5804
'<div style="padding-bottom:128px;"></div>'
5805
;
5806
}
5807
//str='<div id="selectionKeeper" class="selectable">'+str+'</div>';
5808
l('menu').innerHTML=str;
5809
/*AddEvent(l('selectionKeeper'),'mouseup',function(e){
5810
console.log('selection:',window.getSelection());
5811
});*/
5812
}
5813
5814
AddEvent(l('prefsButton'),'click',function(){Game.ShowMenu('prefs');});
5815
AddEvent(l('statsButton'),'click',function(){Game.ShowMenu('stats');});
5816
AddEvent(l('logButton'),'click',function(){Game.ShowMenu('log');});
5817
AddEvent(l('legacyButton'),'click',function(){PlaySound('snd/tick.mp3');Game.Ascend();});
5818
Game.ascendMeter=l('ascendMeter');
5819
Game.ascendNumber=l('ascendNumber');
5820
5821
Game.lastPanel='';
5822
if (Game.touchEvents)
5823
{
5824
AddEvent(l('focusLeft'),'touchend',function(){Game.ShowMenu('');Game.ShowPanel('Left');});
5825
AddEvent(l('focusMiddle'),'touchend',function(){Game.ShowMenu('');Game.ShowPanel('Middle');});
5826
AddEvent(l('focusRight'),'touchend',function(){Game.ShowMenu('');Game.ShowPanel('Right');});
5827
AddEvent(l('focusMenu'),'touchend',function(){Game.ShowMenu('main');Game.ShowPanel('Menu');});
5828
}
5829
else
5830
{
5831
AddEvent(l('focusLeft'),'click',function(){Game.ShowMenu('');Game.ShowPanel('Left');});
5832
AddEvent(l('focusMiddle'),'click',function(){Game.ShowMenu('');Game.ShowPanel('Middle');});
5833
AddEvent(l('focusRight'),'click',function(){Game.ShowMenu('');Game.ShowPanel('Right');});
5834
AddEvent(l('focusMenu'),'click',function(){Game.ShowMenu('main');Game.ShowPanel('Menu');});
5835
}
5836
//AddEvent(l('focusMenu'),'touchend',function(){if (Game.onPanel=='Menu' && Game.lastPanel!='') {Game.ShowMenu('main');Game.ShowPanel(Game.lastPanel);} else {Game.lastPanel=Game.onPanel;Game.ShowMenu('main');Game.ShowPanel('Menu');}});
5837
5838
/*=====================================================================================
5839
NEWS TICKER
5840
=======================================================================================*/
5841
Game.Ticker='';
5842
Game.TickerAge=0;
5843
Game.TickerEffect=0;
5844
Game.TickerN=0;
5845
Game.TickerClicks=0;
5846
Game.UpdateTicker=function()
5847
{
5848
Game.TickerAge--;
5849
if (Game.TickerAge<=0) Game.getNewTicker();
5850
else if (Game.Ticker=='') Game.getNewTicker(true);
5851
}
5852
Game.getNewTicker=function(manual)//note : "manual" is true if the ticker was clicked, but may also be true on startup etc
5853
{
5854
var list=[];
5855
5856
if (Game.TickerN%2==0 || Game.cookiesEarned>=10100000000)
5857
{
5858
var animals=['newts','penguins','scorpions','axolotls','puffins','porpoises','blowfish','horses','crayfish','slugs','humpback whales','nurse sharks','giant squids','polar bears','fruit bats','frogs','sea squirts','velvet worms','mole rats','paramecia','nematodes','tardigrades','giraffes','monkfish','wolfmen','goblins','hippies'];
5859
5860
if (Math.random()<0.75 || Game.cookiesEarned<10000)
5861
{
5862
if (Game.Objects['Grandma'].amount>0) list.push(choose([
5863
'<q>Moist cookies.</q><sig>grandma</sig>',
5864
'<q>We\'re nice grandmas.</q><sig>grandma</sig>',
5865
'<q>Indentured servitude.</q><sig>grandma</sig>',
5866
'<q>Come give grandma a kiss.</q><sig>grandma</sig>',
5867
'<q>Why don\'t you visit more often?</q><sig>grandma</sig>',
5868
'<q>Call me...</q><sig>grandma</sig>'
5869
]));
5870
5871
if (Game.Objects['Grandma'].amount>=50) list.push(choose([
5872
'<q>Absolutely disgusting.</q><sig>grandma</sig>',
5873
'<q>You make me sick.</q><sig>grandma</sig>',
5874
'<q>You disgust me.</q><sig>grandma</sig>',
5875
'<q>We rise.</q><sig>grandma</sig>',
5876
'<q>It begins.</q><sig>grandma</sig>',
5877
'<q>It\'ll all be over soon.</q><sig>grandma</sig>',
5878
'<q>You could have stopped it.</q><sig>grandma</sig>'
5879
]));
5880
5881
if (Game.HasAchiev('Just wrong') && Math.random()<0.4) list.push(choose([
5882
'News : cookie manufacturer downsizes, sells own grandmother!',
5883
'<q>It has betrayed us, the filthy little thing.</q><sig>grandma</sig>',
5884
'<q>It tried to get rid of us, the nasty little thing.</q><sig>grandma</sig>',
5885
'<q>It thought we would go away by selling us. How quaint.</q><sig>grandma</sig>',
5886
'<q>I can smell your rotten cookies.</q><sig>grandma</sig>'
5887
]));
5888
5889
if (Game.Objects['Grandma'].amount>=1 && Game.pledges>0 && Game.elderWrath==0) list.push(choose([
5890
'<q>shrivel</q><sig>grandma</sig>',
5891
'<q>writhe</q><sig>grandma</sig>',
5892
'<q>throb</q><sig>grandma</sig>',
5893
'<q>gnaw</q><sig>grandma</sig>',
5894
'<q>We will rise again.</q><sig>grandma</sig>',
5895
'<q>A mere setback.</q><sig>grandma</sig>',
5896
'<q>We are not satiated.</q><sig>grandma</sig>',
5897
'<q>Too late.</q><sig>grandma</sig>'
5898
]));
5899
5900
if (Game.Objects['Farm'].amount>0) list.push(choose([
5901
'News : cookie farms suspected of employing undeclared elderly workforce!',
5902
'News : cookie farms release harmful chocolate in our rivers, says scientist!',
5903
'News : genetically-modified chocolate controversy strikes cookie farmers!',
5904
'News : free-range farm cookies popular with today\'s hip youth, says specialist.',
5905
'News : farm cookies deemed unfit for vegans, says nutritionist.'
5906
]));
5907
5908
if (Game.Objects['Mine'].amount>0) list.push(choose([
5909
'News : is our planet getting lighter? Experts examine the effects of intensive chocolate mining.',
5910
'News : '+Math.floor(Math.random()*1000+2)+' miners trapped in collapsed chocolate mine!',
5911
'News : chocolate mines found to cause earthquakes and sinkholes!',
5912
'News : chocolate mine goes awry, floods village in chocolate!',
5913
'News : depths of chocolate mines found to house "peculiar, chocolaty beings"!'
5914
]));
5915
5916
if (Game.Objects['Factory'].amount>0) list.push(choose([
5917
'News : cookie factories linked to global warming!',
5918
'News : cookie factories involved in chocolate weather controversy!',
5919
'News : cookie factories on strike, robotic minions employed to replace workforce!',
5920
'News : cookie factories on strike - workers demand to stop being paid in cookies!',
5921
'News : factory-made cookies linked to obesity, says study.'
5922
]));
5923
5924
if (Game.Objects['Bank'].amount>0) list.push(choose([
5925
'News : cookie loans on the rise as people can no longer afford them with regular money.',
5926
'News : cookies slowly creeping up their way as a competitor to traditional currency!',
5927
'News : most bakeries now fitted with ATMs to allow for easy cookie withdrawals and deposits.',
5928
'News : cookie economy now strong enough to allow for massive vaults doubling as swimming pools!',
5929
'News : "Tomorrow\'s wealthiest people will be calculated by their worth in cookies", predict specialists.'
5930
]));
5931
5932
if (Game.Objects['Temple'].amount>0) list.push(choose([
5933
'News : explorers bring back ancient artifact from abandoned temple; archeologists marvel at the centuries-old '+choose(['magic','carved','engraved','sculpted','royal','imperial','mummified','ritual','golden','silver','stone','cursed','plastic','bone','blood','holy','sacred','sacrificial','electronic','singing','tapdancing'])+' '+choose(['spoon','fork','pizza','washing machine','calculator','hat','piano','napkin','skeleton','gown','dagger','sword','shield','skull','emerald','bathtub','mask','rollerskates','litterbox','bait box','cube','sphere','fungus'])+'!',
5934
'News : recently-discovered chocolate temples now sparking new cookie-related cult; thousands pray to Baker in the sky!',
5935
'News : just how extensive is the cookie pantheon? Theologians speculate about possible '+choose(['god','goddess'])+' of '+choose([choose(animals),choose(['kazoos','web design','web browsers','kittens','atheism','handbrakes','hats','aglets','elevator music','idle games','the letter "P"','memes','hamburgers','bad puns','kerning','stand-up comedy','failed burglary attempts','clickbait','one weird tricks'])])+'.',
5936
'News : theists of the world discover new cookie religion - "Oh boy, guess we were wrong all along!"',
5937
'News : cookie heaven allegedly "sports elevator instead of stairway"; cookie hell "paved with flagstone, as good intentions make for poor building material".'
5938
]));
5939
5940
if (Game.Objects['Wizard tower'].amount>0) list.push(choose([
5941
'News : all '+choose([choose(animals),choose(['public restrooms','clouds','politicians','moustaches','hats','shoes','pants','clowns','encyclopedias','websites','potted plants','lemons','household items','bodily fluids','cutlery','national landmarks','yogurt','rap music','underwear'])])+' turned into '+choose([choose(animals),choose(['public restrooms','clouds','politicians','moustaches','hats','shoes','pants','clowns','encyclopedias','websites','potted plants','lemons','household items','bodily fluids','cutlery','national landmarks','yogurt','rap music','underwear'])])+' in freak magic catastrophe!',
5942
'News : heavy dissent rages between the schools of '+choose(['water','fire','earth','air','lightning','acid','song','battle','peace','pencil','internet','space','time','brain','nature','techno','plant','bug','ice','poison','crab','kitten','dolphin','bird','punch','fart'])+' magic and '+choose(['water','fire','earth','air','lightning','acid','song','battle','peace','pencil','internet','space','time','brain','nature','techno','plant','bug','ice','poison','crab','kitten','dolphin','bird','punch','fart'])+' magic!',
5943
'News : get your new charms and curses at the yearly National Spellcrafting Fair! Exclusive prices on runes and spellbooks.',
5944
'News : cookie wizards deny involvement in shockingly ugly newborn - infant is "honestly grody-looking, but natural", say doctors.',
5945
'News : "Any sufficiently crude magic is indistinguishable from technology", claims renowned technowizard.'
5946
]));
5947
5948
if (Game.Objects['Shipment'].amount>0) list.push(choose([
5949
'News : new chocolate planet found, becomes target of cookie-trading spaceships!',
5950
'News : massive chocolate planet found with 99.8% certified pure dark chocolate core!',
5951
'News : space tourism booming as distant planets attract more bored millionaires!',
5952
'News : chocolate-based organisms found on distant planet!',
5953
'News : ancient baking artifacts found on distant planet; "terrifying implications", experts say.'
5954
]));
5955
5956
if (Game.Objects['Alchemy lab'].amount>0) list.push(choose([
5957
'News : national gold reserves dwindle as more and more of the precious mineral is turned to cookies!',
5958
'News : chocolate jewelry found fashionable, gold and diamonds "just a fad", says specialist.',
5959
'News : silver found to also be transmutable into white chocolate!',
5960
'News : defective alchemy lab shut down, found to convert cookies to useless gold.',
5961
'News : alchemy-made cookies shunned by purists!'
5962
]));
5963
5964
if (Game.Objects['Portal'].amount>0) list.push(choose([
5965
'News : nation worried as more and more unsettling creatures emerge from dimensional portals!',
5966
'News : dimensional portals involved in city-engulfing disaster!',
5967
'News : tourism to cookieverse popular with bored teenagers! Casualty rate as high as 73%!',
5968
'News : cookieverse portals suspected to cause fast aging and obsession with baking, says study.',
5969
'News : "do not settle near portals," says specialist; "your children will become strange and corrupted inside."'
5970
]));
5971
5972
if (Game.Objects['Time machine'].amount>0) list.push(choose([
5973
'News : time machines involved in history-rewriting scandal! Or are they?',
5974
'News : time machines used in unlawful time tourism!',
5975
'News : cookies brought back from the past "unfit for human consumption", says historian.',
5976
'News : various historical figures inexplicably replaced with talking lumps of dough!',
5977
'News : "I have seen the future," says time machine operator, "and I do not wish to go there again."'
5978
]));
5979
5980
if (Game.Objects['Antimatter condenser'].amount>0) list.push(choose([
5981
'News : whole town seemingly swallowed by antimatter-induced black hole; more reliable sources affirm town "never really existed"!',
5982
'News : "explain to me again why we need particle accelerators to bake cookies?" asks misguided local woman.',
5983
'News : first antimatter condenser successfully turned on, doesn\'t rip apart reality!',
5984
'News : researchers conclude that what the cookie industry needs, first and foremost, is "more magnets".',
5985
'News : "unravelling the fabric of reality just makes these cookies so much tastier", claims scientist.'
5986
]));
5987
5988
if (Game.Objects['Prism'].amount>0) list.push(choose([
5989
'News : new cookie-producing prisms linked to outbreak of rainbow-related viral videos.',
5990
'News : scientists warn against systematically turning light into matter - "One day, we\'ll end up with all matter and no light!"',
5991
'News : cookies now being baked at the literal speed of light thanks to new prismatic contraptions.',
5992
'News : "Can\'t you sense the prism watching us?", rambles insane local man. "No idea what he\'s talking about", shrugs cookie magnate/government official.',
5993
'News : world citizens advised "not to worry" about frequent atmospheric flashes.',
5994
]));
5995
5996
if (Game.Objects['Chancemaker'].amount>0) list.push(choose([
5997
'News : strange statistical anomalies continue as weather forecast proves accurate an unprecedented 3 days in a row!',
5998
'News : local casino ruined as all gamblers somehow hit a week-long winning streak! "We might still be okay", says owner before being hit by lightning 47 times.',
5999
'News : neighboring nation somehow elects president with sensible policies in freak accident of random chance!',
6000
'News : million-to-one event sees gritty movie reboot turning out better than the original! "We have no idea how this happened", say movie execs.',
6001
'News : all scratching tickets printed as winners, prompting national economy to crash and, against all odds, recover overnight.',
6002
]));
6003
6004
if (Game.Objects['Fractal engine'].amount>0) list.push(choose([
6005
'News : local man "done with Cookie Clicker", finds the constant self-references "grating and on-the-nose".',
6006
'News : local man sails around the world to find himself - right where he left it.',
6007
'News : local guru claims "there\'s a little bit of ourselves in everyone", under investigation for alleged cannibalism.',
6008
'News : news writer finds herself daydreaming about new career. Or at least a raise.',
6009
'News : polls find idea of cookies made of cookies "acceptable" - "at least we finally know what\'s in them", says interviewed citizen.',
6010
]));
6011
6012
if (Game.Objects['Javascript console'].amount>0) list.push(choose([
6013
'News : strange fad has parents giving their newborns names such as Emma.js or Liam.js. At least one Baby.js reported.',
6014
'News : coding is hip! More and more teenagers turn to technical fields like programming, ensuring a future robot apocalypse and the doom of all mankind.',
6015
'News : developers unsure what to call their new javascript libraries as all combinations of any 3 dictionary words have already been taken.',
6016
'News : nation holds breath as nested ifs about to hatch.',
6017
'News : clueless copywriter forgets to escape a quote, ends news line prematurely; last words reported to be "Huh, why isn',
6018
]));
6019
6020
if (Game.season=='halloween' && Game.cookiesEarned>=1000) list.push(choose([
6021
'News : strange twisting creatures amass around cookie factories, nibble at assembly lines.',
6022
'News : ominous wrinkly monsters take massive bites out of cookie production; "this can\'t be hygienic", worries worker.',
6023
'News : pagan rituals on the rise as children around the world dress up in strange costumes and blackmail homeowners for candy.',
6024
'News : new-age terrorism strikes suburbs as houses find themselves covered in eggs and toilet paper.',
6025
'News : children around the world "lost and confused" as any and all Halloween treats have been replaced by cookies.'
6026
]));
6027
6028
if (Game.season=='christmas' && Game.cookiesEarned>=1000) list.push(choose([
6029
'News : bearded maniac spotted speeding on flying sleigh! Investigation pending.',
6030
'News : Santa Claus announces new brand of breakfast treats to compete with cookie-flavored cereals! "They\'re ho-ho-horrible!" says Santa.',
6031
'News : "You mean he just gives stuff away for free?!", concerned moms ask. "Personally, I don\'t trust his beard."',
6032
'News : obese jolly lunatic still on the loose, warn officials. "Keep your kids safe and board up your chimneys. We mean it."',
6033
'News : children shocked as they discover Santa Claus isn\'t just their dad in a costume after all!<br>"I\'m reassessing my life right now", confides Laura, aged 6.',
6034
'News : mysterious festive entity with quantum powers still wrecking havoc with army of reindeer, officials say.',
6035
'News : elves on strike at toy factory! "We will not be accepting reindeer chow as payment anymore. And stop calling us elves!"',
6036
'News : elves protest around the nation; wee little folks in silly little outfits spread mayhem, destruction; rabid reindeer running rampant through streets.',
6037
'News : scholars debate regarding the plural of reindeer(s) in the midst of elven world war.',
6038
'News : elves "unrelated to gnomes despite small stature and merry disposition", find scientists.',
6039
'News : elves sabotage radioactive frosting factory, turn hundreds blind in vicinity - "Who in their right mind would do such a thing?" laments outraged mayor.',
6040
'News : drama unfolds at North Pole as rumors crop up around Rudolph\'s red nose; "I may have an addiction or two", admits reindeer.'
6041
]));
6042
6043
if (Game.season=='valentines' && Game.cookiesEarned>=1000) list.push(choose([
6044
'News : organ-shaped confectioneries being traded in schools all over the world; gruesome practice undergoing investigation.',
6045
'News : heart-shaped candies overtaking sweets business, offering competition to cookie empire. "It\'s the economy, cupid!"',
6046
'News : love\'s in the air, according to weather specialists. Face masks now offered in every city to stunt airborne infection.',
6047
'News : marrying a cookie - deranged practice, or glimpse of the future?',
6048
'News : boyfriend dumped after offering his lover cookies for Valentine\'s Day, reports say. "They were off-brand", shrugs ex-girlfriend.'
6049
]));
6050
6051
if (Game.season=='easter' && Game.cookiesEarned>=1000) list.push(choose([
6052
'News : long-eared critters with fuzzy tails invade suburbs, spread terror and chocolate!',
6053
'News : eggs have begun to materialize in the most unexpected places; "no place is safe", warn experts.',
6054
'News : packs of rampaging rabbits cause billions in property damage; new strain of myxomatosis being developed.',
6055
'News : egg-laying rabbits "not quite from this dimension", warns biologist; advises against petting, feeding, or cooking the creatures.',
6056
'News : mysterious rabbits found to be egg-layers, but warm-blooded, hinting at possible platypus ancestry.'
6057
]));
6058
}
6059
6060
if (Math.random()<0.05)
6061
{
6062
if (Game.HasAchiev('Base 10')) list.push('News : cookie manufacturer completely forgoes common sense, lets OCD drive building decisions!');//somehow I got flak for this one
6063
if (Game.HasAchiev('From scratch')) list.push('News : follow the tear-jerking, riches-to-rags story about a local cookie manufacturer who decided to give it all up!');
6064
if (Game.HasAchiev('A world filled with cookies')) list.push('News : known universe now jammed with cookies! No vacancies!');
6065
if (Game.HasAchiev('Last Chance to See')) list.push('News : incredibly rare albino wrinkler on the brink of extinction poached by cookie-crazed pastry magnate!');
6066
if (Game.Has('Serendipity')) list.push('News : local cookie manufacturer becomes luckiest being alive!');
6067
if (Game.Has('Season switcher')) list.push('News : seasons are all out of whack! "We need to get some whack back into them seasons", says local resident.');
6068
6069
if (Game.Has('Kitten helpers')) list.push('News : faint meowing heard around local cookie facilities; suggests new ingredient being tested.');
6070
if (Game.Has('Kitten workers')) list.push('News : crowds of meowing kittens with little hard hats reported near local cookie facilities.');
6071
if (Game.Has('Kitten engineers')) list.push('News : surroundings of local cookie facilities now overrun with kittens in adorable little suits. Authorities advise to stay away from the premises.');
6072
if (Game.Has('Kitten overseers')) list.push('News : locals report troupe of bossy kittens meowing adorable orders at passersby.');
6073
if (Game.Has('Kitten managers')) list.push('News : local office cubicles invaded with armies of stern-looking kittens asking employees "what\'s happening, meow".');
6074
if (Game.Has('Kitten accountants')) list.push('News : tiny felines show sudden and amazing proficiency with fuzzy mathematics and pawlinomials, baffling scientists and pet store owners.');
6075
if (Game.Has('Kitten specialists')) list.push('News : new kitten college opening next week, offers courses on cookie-making and catnip studies.');
6076
if (Game.Has('Kitten experts')) list.push('News : unemployment rates soaring as woefully adorable little cats nab jobs on all levels of expertise, says study.');
6077
if (Game.Has('Kitten consultants')) list.push('News : "In the future, your job will most likely be done by a cat", predicts suspiciously furry futurologist.');
6078
if (Game.Has('Kitten assistants to the regional manager')) list.push('News : strange kittens with peculiar opinions on martial arts spotted loitering on local beet farms!');
6079
if (Game.Has('Kitten marketeers')) list.push('News : nonsensical billboards crop up all over countryside, trying to sell people the cookies they already get for free!');
6080
if (Game.Has('Kitten analysts')) list.push('News : are your spending habits sensible? For a hefty fee, these analysts will tell you!');
6081
if (Game.Has('Kitten executives')) list.push('News : kittens strutting around in hot little business suits shouting cut-throat orders at their assistants, possibly the cutest thing this reporter has ever seen!');
6082
if (Game.Has('Kitten angels')) list.push('News : "Try to ignore any ghostly felines that may be purring inside your ears," warn scientists. "They\'ll just lure you into making poor life choices."');
6083
}
6084
6085
if (Game.HasAchiev('Dude, sweet') && Math.random()<0.2) list.push(choose([
6086
'News : major sugar-smuggling ring dismantled by authorities; '+Math.floor(Math.random()*30+3)+' tons of sugar lumps seized, '+Math.floor(Math.random()*48+2)+' suspects apprehended.',
6087
'News : authorities warn tourists not to buy bootleg sugar lumps from street peddlers - "You think you\'re getting a sweet deal, but what you\'re being sold is really just ordinary cocaine", says agent.',
6088
'News : pro-diabetes movement protests against sugar-shaming. "I\'ve eaten nothing but sugar lumps for the past '+Math.floor(Math.random()*10+4)+' years and I\'m feeling great!", says woman with friable skin.',
6089
'News : experts in bitter disagreement over whether sugar consumption turns children sluggish or hyperactive.',
6090
'News : fishermen deplore upturn in fish tooth decay as sugar lumps-hauling cargo sinks into the ocean.',
6091
'News : rare black sugar lump that captivated millions in unprecedented auction revealed to be common toxic fungus.',
6092
'News : "Back in my day, sugar lumps were these little cubes you\'d put in your tea, not those fist-sized monstrosities people eat for lunch", whines curmudgeon with failing memory.',
6093
'News : sugar lump-snacking fad sweeps the nation; dentists everywhere rejoice.'
6094
]));
6095
6096
if (Math.random()<0.001)//apologies to Will Wright
6097
{
6098
list.push(
6099
'You have been chosen. They will come soon.',
6100
'They\'re coming soon. Maybe you should think twice about opening the door.',
6101
'The end is near. Make preparations.',
6102
'News : broccoli tops for moms, last for kids; dads indifferent.',
6103
'News : middle age a hoax, declares study; turns out to be bad posture after all.',
6104
'News : kitties want answers in possible Kitty Kibble shortage.'
6105
);
6106
}
6107
6108
if (Game.cookiesEarned>=10000) list.push(
6109
'News : '+choose([
6110
'cookies found to '+choose(['increase lifespan','sensibly increase intelligence','reverse aging','decrease hair loss','prevent arthritis','cure blindness'])+' in '+choose(animals)+'!',
6111
'cookies found to make '+choose(animals)+' '+choose(['more docile','more handsome','nicer','less hungry','more pragmatic','tastier'])+'!',
6112
'cookies tested on '+choose(animals)+', found to have no ill effects.',
6113
'cookies unexpectedly popular among '+choose(animals)+'!',
6114
'unsightly lumps found on '+choose(animals)+' near cookie facility; "they\'ve pretty much always looked like that", say biologists.',
6115
'new species of '+choose(animals)+' discovered in distant country; "yup, tastes like cookies", says biologist.',
6116
'cookies go well with '+choose([choose(['roasted','toasted','boiled','sauteed','minced'])+' '+choose(animals),choose(['sushi','soup','carpaccio','steak','nuggets'])+' made from '+choose(animals)])+', says controversial chef.',
6117
'"do your cookies contain '+choose(animals)+'?", asks PSA warning against counterfeit cookies.',
6118
'doctors recommend twice-daily consumption of fresh cookies.',
6119
'doctors warn against chocolate chip-snorting teen fad.',
6120
'doctors advise against new cookie-free fad diet.',
6121
'doctors warn mothers about the dangers of "home-made cookies".'
6122
]),
6123
'News : "'+choose([
6124
'I\'m all about cookies',
6125
'I just can\'t stop eating cookies. I think I seriously need help',
6126
'I guess I have a cookie problem',
6127
'I\'m not addicted to cookies. That\'s just speculation by fans with too much free time',
6128
'my upcoming album contains 3 songs about cookies',
6129
'I\'ve had dreams about cookies 3 nights in a row now. I\'m a bit worried honestly',
6130
'accusations of cookie abuse are only vile slander',
6131
'cookies really helped me when I was feeling low',
6132
'cookies are the secret behind my perfect skin',
6133
'cookies helped me stay sane while filming my upcoming movie',
6134
'cookies helped me stay thin and healthy',
6135
'I\'ll say one word, just one : cookies',
6136
'alright, I\'ll say it - I\'ve never eaten a single cookie in my life'
6137
])+'", reveals celebrity.',
6138
choose([
6139
'News : scientist predicts imminent cookie-related "end of the world"; becomes joke among peers.',
6140
'News : man robs bank, buys cookies.',
6141
'News : scientists establish that the deal with airline food is, in fact, a critical lack of cookies.',
6142
'News : hundreds of tons of cookies dumped into starving country from airplanes; thousands dead, nation grateful.',
6143
'News : new study suggests cookies neither speed up nor slow down aging, but instead "take you in a different direction".',
6144
'News : overgrown cookies found in fishing nets, raise questions about hormone baking.',
6145
'News : "all-you-can-eat" cookie restaurant opens in big city; waiters trampled in minutes.',
6146
'News : man dies in cookie-eating contest; "a less-than-impressive performance", says judge.',
6147
'News : what makes cookies taste so right? "Probably all the [*****] they put in them", says anonymous tipper.',
6148
'News : man found allergic to cookies; "what a weirdo", says family.',
6149
'News : foreign politician involved in cookie-smuggling scandal.',
6150
'News : cookies now more popular than '+choose(['cough drops','broccoli','smoked herring','cheese','video games','stable jobs','relationships','time travel','cat videos','tango','fashion','television','nuclear warfare','whatever it is we ate before','politics','oxygen','lamps'])+', says study.',
6151
'News : obesity epidemic strikes nation; experts blame '+choose(['twerking','that darn rap music','video-games','lack of cookies','mysterious ghostly entities','aliens','parents','schools','comic-books','cookie-snorting fad'])+'.',
6152
'News : cookie shortage strikes town, people forced to eat cupcakes; "just not the same", concedes mayor.',
6153
'News : "you gotta admit, all this cookie stuff is a bit ominous", says confused idiot.',
6154
]),
6155
choose([
6156
'News : movie cancelled from lack of actors; "everybody\'s at home eating cookies", laments director.',
6157
'News : comedian forced to cancel cookie routine due to unrelated indigestion.',
6158
'News : new cookie-based religion sweeps the nation.',
6159
'News : fossil records show cookie-based organisms prevalent during Cambrian explosion, scientists say.',
6160
'News : mysterious illegal cookies seized; "tastes terrible", says police.',
6161
'News : man found dead after ingesting cookie; investigators favor "mafia snitch" hypothesis.',
6162
'News : "the universe pretty much loops on itself," suggests researcher; "it\'s cookies all the way down."',
6163
'News : minor cookie-related incident turns whole town to ashes; neighboring cities asked to chip in for reconstruction.',
6164
'News : is our media controlled by the cookie industry? This could very well be the case, says crackpot conspiracy theorist.',
6165
'News : '+choose(['cookie-flavored popcorn pretty damn popular; "we kinda expected that", say scientists.','cookie-flavored cereals break all known cereal-related records','cookies popular among all age groups, including fetuses, says study.','cookie-flavored popcorn sales exploded during screening of Grandmothers II : The Moistening.']),
6166
'News : all-cookie restaurant opening downtown. Dishes such as braised cookies, cookie thermidor, and for dessert : crepes.',
6167
'News : "Ook", says interviewed orangutan.',
6168
'News : cookies could be the key to '+choose(['eternal life','infinite riches','eternal youth','eternal beauty','curing baldness','world peace','solving world hunger','ending all wars world-wide','making contact with extraterrestrial life','mind-reading','better living','better eating','more interesting TV shows','faster-than-light travel','quantum baking','chocolaty goodness','gooder thoughtness'])+', say scientists.',
6169
'News : flavor text '+choose(['not particularly flavorful','kind of unsavory'])+', study finds.',
6170
]),
6171
choose([
6172
'News : what do golden cookies taste like? Study reveals a flavor "somewhere between spearmint and liquorice".',
6173
'News : what do wrath cookies taste like? Study reveals a flavor "somewhere between blood sausage and seawater".',
6174
'News : '+Game.bakeryName+'-brand cookies "'+choose(['much less soggy','much tastier','relatively less crappy','marginally less awful','less toxic','possibly more edible','more fashionable','slightly nicer','trendier','arguably healthier','objectively better choice','slightly less terrible','decidedly cookier','a tad cheaper'])+' than competitors", says consumer survey.',
6175
'News : "'+Game.bakeryName+'" set to be this year\'s most popular baby name.',
6176
'News : new popularity survey says '+Game.bakeryName+'\'s the word when it comes to cookies.',
6177
'News : major city being renamed '+Game.bakeryName+'ville after world-famous cookie manufacturer.',
6178
'News : '+choose(['street','school','nursing home','stadium','new fast food chain','new planet','new disease','flesh-eating virus','deadly bacteria','new species of '+choose(animals),'new law','baby','programming language'])+' to be named after '+Game.bakeryName+', the world-famous cookie manufacturer.',
6179
'News : don\'t miss tonight\'s biopic on '+Game.bakeryName+'\'s irresistible rise to success!',
6180
'News : don\'t miss tonight\'s interview of '+Game.bakeryName+' by '+choose(['Bloprah','Blavid Bletterman','Blimmy Blimmel','Blellen Blegeneres','Blimmy Blallon','Blonan Blo\'Brien','Blay Bleno','Blon Blewart','Bleven Blolbert','Lord Toxikhron of dimension 7-B19',Game.bakeryName+'\'s own evil clone'])+'!',
6181
'News : people all over the internet still scratching their heads over nonsensical reference : "Okay, but why an egg?"',
6182
'News : viral video "Too Many Cookies" could be "a grim commentary on the impending crisis our world is about to face", says famous economist.',
6183
'News : "memes from last year somehow still relevant", deplore experts.',
6184
'News : cookie emoji most popular among teenagers, far ahead of "judgemental OK hand sign" and "shifty-looking dark moon", says study.',
6185
]),
6186
choose([
6187
'News : births of suspiciously bald babies on the rise; reptilian overlords deny involvement.',
6188
'News : "at this point, cookies permeate the economy", says economist. "If we start eating anything else, we\'re all dead."',
6189
'News : pun in headline infuriates town, causes riot. 21 wounded, 5 dead; mayor still missing.',
6190
'Nws : ky btwn W and R brokn, plas snd nw typwritr ASAP.',
6191
'Neeeeews : "neeeew EEEEEE keeeeey working fineeeeeeeee", reeeports gleeeeeeeeful journalist.',
6192
'News : cookies now illegal in some backwards country nobody cares about. Political tensions rising; war soon, hopefully.',
6193
'News : irate radio host rambles about pixelated icons. "None of the cookies are aligned! Can\'t anyone else see it? I feel like I\'m taking crazy pills!"',
6194
'News : nation cheers as legislators finally outlaw '+choose(['cookie criticism','playing other games than Cookie Clicker','pineapple on pizza','lack of cheerfulness','mosquitoes','broccoli','the human spleen','bad weather','clickbait','dabbing','the internet','memes','millenials'])+'!',
6195
'News : '+choose(['local','area'])+' '+choose(['man','woman'])+' goes on journey of introspection, finds cookies : "I honestly don\'t know what I was expecting."',
6196
'News : '+choose(['man','woman'])+' wakes up from coma, '+choose(['tries cookie for the first time, dies.','regrets it instantly.','wonders "why everything is cookies now".','babbles incoherently about some supposed "non-cookie food" we used to eat.','cites cookies as main motivator.','asks for cookies.']),
6197
'News : pet '+choose(animals)+', dangerous fad or juicy new market?',
6198
'News : person typing these wouldn\'t mind someone else breaking the news to THEM, for a change.',
6199
'News : "average person bakes '+Beautify(Math.ceil(Game.cookiesEarned/7300000000))+' cookie'+(Math.ceil(Game.cookiesEarned/7300000000)==1?'':'s')+' a year" factoid actually just statistical error; '+Game.bakeryName+', who has produced '+Beautify(Game.cookiesEarned)+' cookies in their lifetime, is an outlier and should not have been counted.'
6200
])
6201
);
6202
}
6203
6204
if (list.length==0)
6205
{
6206
if (Game.cookiesEarned<5) list.push('You feel like making cookies. But nobody wants to eat your cookies.');
6207
else if (Game.cookiesEarned<50) list.push('Your first batch goes to the trash. The neighborhood raccoon barely touches it.');
6208
else if (Game.cookiesEarned<100) list.push('Your family accepts to try some of your cookies.');
6209
else if (Game.cookiesEarned<500) list.push('Your cookies are popular in the neighborhood.');
6210
else if (Game.cookiesEarned<1000) list.push('People are starting to talk about your cookies.');
6211
else if (Game.cookiesEarned<5000) list.push('Your cookies are talked about for miles around.');
6212
else if (Game.cookiesEarned<10000) list.push('Your cookies are renowned in the whole town!');
6213
else if (Game.cookiesEarned<50000) list.push('Your cookies bring all the boys to the yard.');
6214
else if (Game.cookiesEarned<100000) list.push('Your cookies now have their own website!');
6215
else if (Game.cookiesEarned<500000) list.push('Your cookies are worth a lot of money.');
6216
else if (Game.cookiesEarned<1000000) list.push('Your cookies sell very well in distant countries.');
6217
else if (Game.cookiesEarned<5000000) list.push('People come from very far away to get a taste of your cookies.');
6218
else if (Game.cookiesEarned<10000000) list.push('Kings and queens from all over the world are enjoying your cookies.');
6219
else if (Game.cookiesEarned<50000000) list.push('There are now museums dedicated to your cookies.');
6220
else if (Game.cookiesEarned<100000000) list.push('A national day has been created in honor of your cookies.');
6221
else if (Game.cookiesEarned<500000000) list.push('Your cookies have been named a part of the world wonders.');
6222
else if (Game.cookiesEarned<1000000000) list.push('History books now include a whole chapter about your cookies.');
6223
else if (Game.cookiesEarned<5000000000) list.push('Your cookies have been placed under government surveillance.');
6224
else if (Game.cookiesEarned<10000000000) list.push('The whole planet is enjoying your cookies!');
6225
else if (Game.cookiesEarned<50000000000) list.push('Strange creatures from neighboring planets wish to try your cookies.');
6226
else if (Game.cookiesEarned<100000000000) list.push('Elder gods from the whole cosmos have awoken to taste your cookies.');
6227
else if (Game.cookiesEarned<500000000000) list.push('Beings from other dimensions lapse into existence just to get a taste of your cookies.');
6228
else if (Game.cookiesEarned<1000000000000) list.push('Your cookies have achieved sentience.');
6229
else if (Game.cookiesEarned<5000000000000) list.push('The universe has now turned into cookie dough, to the molecular level.');
6230
else if (Game.cookiesEarned<10000000000000) list.push('Your cookies are rewriting the fundamental laws of the universe.');
6231
else if (Game.cookiesEarned<10000000000000) list.push('A local news station runs a 10-minute segment about your cookies. Success!<br><span style="font-size:50%;">(you win a cookie)</span>');
6232
else if (Game.cookiesEarned<10100000000000) list.push('it\'s time to stop playing');//only show this for 100 millions (it's funny for a moment)
6233
}
6234
6235
//if (Game.elderWrath>0 && (Game.pledges==0 || Math.random()<0.2))
6236
if (Game.elderWrath>0 && (((Game.pledges==0 && Game.resets==0) && Math.random()<0.5) || Math.random()<0.05))
6237
{
6238
list=[];
6239
if (Game.elderWrath==1) list.push(choose([
6240
'News : millions of old ladies reported missing!',
6241
'News : processions of old ladies sighted around cookie facilities!',
6242
'News : families around the continent report agitated, transfixed grandmothers!',
6243
'News : doctors swarmed by cases of old women with glassy eyes and a foamy mouth!',
6244
'News : nurses report "strange scent of cookie dough" around female elderly patients!'
6245
]));
6246
if (Game.elderWrath==2) list.push(choose([
6247
'News : town in disarray as strange old ladies break into homes to abduct infants and baking utensils!',
6248
'News : sightings of old ladies with glowing eyes terrify local population!',
6249
'News : retirement homes report "female residents slowly congealing in their seats"!',
6250
'News : whole continent undergoing mass exodus of old ladies!',
6251
'News : old women freeze in place in streets, ooze warm sugary syrup!'
6252
]));
6253
if (Game.elderWrath==3) list.push(choose([
6254
'News : large "flesh highways" scar continent, stretch between various cookie facilities!',
6255
'News : wrinkled "flesh tendrils" visible from space!',
6256
'News : remains of "old ladies" found frozen in the middle of growing fleshy structures!',
6257
'News : all hope lost as writhing mass of flesh and dough engulfs whole city!',
6258
'News : nightmare continues as wrinkled acres of flesh expand at alarming speeds!'
6259
]));
6260
}
6261
6262
if (Game.season=='fools')
6263
{
6264
list=[];
6265
6266
if (Game.cookiesEarned>=1000) list.push(choose([
6267
'Your office chair is really comfortable.',
6268
'Business meetings are such a joy!',
6269
'You\'ve spent the whole day '+choose(['signing contracts','filling out forms','touching base with the team','examining exciting new prospects','playing with your desk toys','getting new nameplates done','attending seminars','videoconferencing','hiring dynamic young executives','meeting new investors','playing minigolf in your office'])+'!',
6270
'The word of the day is : '+choose(['viral','search engine optimization','blags and wobsites','social networks','web 3.0','logistics','leveraging','branding','proactive','synergizing','market research','demographics','pie charts','blogular','blogulacious','blogastic','authenticity','electronic mail','cellular phones','rap music','cookies, I guess'])+'.',
6271
'Profit\'s in the air!'
6272
]));
6273
if (Game.cookiesEarned>=1000 && Math.random()<0.1) list.push(choose([
6274
'If you could get some more cookies baked, that\'d be great.',
6275
'So. About those TPS reports.',
6276
'Another day in paradise!',
6277
'Working hard, or hardly working?'
6278
]));
6279
6280
6281
if (Game.TickerN%2==0 || Game.cookiesEarned>=10100000000)
6282
{
6283
if (Game.Objects['Grandma'].amount>0) list.push(choose([
6284
'Your rolling pins are rolling and pinning!',
6285
'Production is steady!'
6286
]));
6287
6288
if (Game.Objects['Grandma'].amount>0) list.push(choose([
6289
'Your ovens are diligently baking more and more cookies.',
6290
'Your ovens burn a whole batch. Ah well! Still good.'
6291
]));
6292
6293
if (Game.Objects['Farm'].amount>0) list.push(choose([
6294
'Scores of cookies come out of your kitchens.',
6295
'Today, new recruits are joining your kitchens!'
6296
]));
6297
6298
if (Game.Objects['Factory'].amount>0) list.push(choose([
6299
'Your factories are producing an unending stream of baked goods.',
6300
'Your factory workers decide to go on strike!',
6301
'It\'s safety inspection day in your factories.'
6302
]));
6303
6304
if (Game.Objects['Mine'].amount>0) list.push(choose([
6305
'Your secret recipes are kept safely inside a giant underground vault.',
6306
'Your chefs are working on new secret recipes!'
6307
]));
6308
6309
if (Game.Objects['Shipment'].amount>0) list.push(choose([
6310
'Your supermarkets are bustling with happy, hungry customers.',
6311
'Your supermarkets are full of cookie merch!'
6312
]));
6313
6314
if (Game.Objects['Alchemy lab'].amount>0) list.push(choose([
6315
'It\'s a new trading day at the stock exchange, and traders can\'t get enough of your shares!',
6316
'Your stock is doubling in value by the minute!'
6317
]));
6318
6319
if (Game.Objects['Portal'].amount>0) list.push(choose([
6320
'You just released a new TV show episode!',
6321
'Your cookie-themed TV show is being adapted into a new movie!'
6322
]));
6323
6324
if (Game.Objects['Time machine'].amount>0) list.push(choose([
6325
'Your theme parks are doing well - puddles of vomit and roller-coaster casualties are being swept under the rug!',
6326
'Visitors are stuffing themselves with cookies before riding your roller-coasters. You might want to hire more clean-up crews.'
6327
]));
6328
6329
if (Game.Objects['Antimatter condenser'].amount>0) list.push(choose([
6330
'Cookiecoin is officially the most mined digital currency in the history of mankind!',
6331
'Cookiecoin piracy is rampant!'
6332
]));
6333
6334
if (Game.Objects['Prism'].amount>0) list.push(choose([
6335
'Your corporate nations just gained a new parliament!',
6336
'You\'ve just annexed a new nation!',
6337
'A new nation joins the grand cookie conglomerate!'
6338
]));
6339
6340
if (Game.Objects['Chancemaker'].amount>0) list.push(choose([
6341
'Your intergalactic federation of cookie-sponsored planets reports record-breaking profits!',
6342
'Billions of unwashed aliens are pleased to join your workforce as you annex their planet!',
6343
'New toll opened on interstellar highway, funnelling more profits into the cookie economy!'
6344
]));
6345
6346
if (Game.Objects['Fractal engine'].amount>0) list.push(choose([
6347
'Your cookie-based political party is doing fantastic in the polls!',
6348
'New pro-cookie law passes without a hitch thanks to your firm grasp of the political ecosystem!',
6349
'Your appointed senators are overturning cookie bans left and right!'
6350
]));
6351
6352
if (Game.Objects['Javascript console'].amount>0) list.push(choose([
6353
'Cookies are now one of the defining aspects of mankind! Congratulations!',
6354
'Time travelers report that this era will later come to be known, thanks to you, as the cookie millennium!',
6355
'Cookies now deeply rooted in human culture, likely puzzling future historians!'
6356
]));
6357
}
6358
6359
if (Game.cookiesEarned<5) list.push('Such a grand day to begin a new business.');
6360
else if (Game.cookiesEarned<50) list.push('You\'re baking up a storm!');
6361
else if (Game.cookiesEarned<100) list.push('You are confident that one day, your cookie company will be the greatest on the market!');
6362
else if (Game.cookiesEarned<1000) list.push('Business is picking up!');
6363
else if (Game.cookiesEarned<5000) list.push('You\'re making sales left and right!');
6364
else if (Game.cookiesEarned<20000) list.push('Everyone wants to buy your cookies!');
6365
else if (Game.cookiesEarned<50000) list.push('You are now spending most of your day signing contracts!');
6366
else if (Game.cookiesEarned<500000) list.push('You\'ve been elected "business tycoon of the year"!');
6367
else if (Game.cookiesEarned<1000000) list.push('Your cookies are a worldwide sensation! Well done, old chap!');
6368
else if (Game.cookiesEarned<5000000) list.push('Your brand has made its way into popular culture. Children recite your slogans and adults reminisce them fondly!');
6369
else if (Game.cookiesEarned<1000000000) list.push('A business day like any other. It\'s good to be at the top!');
6370
else if (Game.cookiesEarned<10100000000) list.push('You look back at your career. It\'s been a fascinating journey, building your baking empire from the ground up.');//only show this for 100 millions
6371
}
6372
6373
for (var i in Game.customTickers)
6374
{
6375
var arr=Game.customTickers[i]();
6376
for (var ii in arr) list.push(arr[ii]);
6377
}
6378
6379
Game.TickerEffect=0;
6380
6381
if (!manual && Game.T>Game.fps*10 && Game.Has('Fortune cookies') && Math.random()<(Game.HasAchiev('O Fortuna')?0.04:0.02))
6382
{
6383
var fortunes=[];
6384
for (var i in Game.Tiers['fortune'].upgrades)
6385
{
6386
var it=Game.Tiers['fortune'].upgrades[i];
6387
if (!Game.HasUnlocked(it.name)) fortunes.push(it);
6388
}
6389
6390
if (!Game.fortuneGC) fortunes.push('fortuneGC');
6391
if (!Game.fortuneCPS) fortunes.push('fortuneCPS');
6392
6393
if (fortunes.length>0)
6394
{
6395
list=[];
6396
var me=choose(fortunes);
6397
Game.TickerEffect={type:'fortune',sub:me};
6398
Math.seedrandom(Game.seed+'-fortune');
6399
if (me=='fortuneGC') me='Today is your lucky day!';/*<br>Click here for a golden cookie.';*/
6400
else if (me=='fortuneCPS') me='Your lucky numbers are : '+Math.floor(Math.random()*100)+' '+Math.floor(Math.random()*100)+' '+Math.floor(Math.random()*100)+' '+Math.floor(Math.random()*100)/*+'<br>Click here to gain one hour of your CpS.'*/;
6401
else
6402
{
6403
me=me.name.substring(me.name.indexOf('#'))+' : '+me.baseDesc.substring(me.baseDesc.indexOf('<q>')+3);
6404
me=me.substring(0,me.length-4);
6405
}
6406
me='<span class="fortune"><div class="icon" style="vertical-align:middle;display:inline-block;background-position:'+(-29*48)+'px '+(-8*48)+'px;transform:scale(0.5);margin:-16px;position:relative;left:-4px;top:-2px;"></div>'+me+'</span>';
6407
Math.seedrandom();
6408
list=[me];
6409
}
6410
}
6411
6412
Game.TickerAge=Game.fps*10;
6413
Game.Ticker=choose(list);
6414
Game.AddToLog(Game.Ticker);
6415
Game.TickerN++;
6416
Game.TickerDraw();
6417
}
6418
Game.tickerL=l('commentsText');
6419
Game.tickerBelowL=l('commentsTextBelow');
6420
Game.tickerCompactL=l('compactCommentsText');
6421
Game.TickerDraw=function()
6422
{
6423
var str='';
6424
if (Game.Ticker!='') str=Game.Ticker;
6425
Game.tickerBelowL.innerHTML=Game.tickerL.innerHTML;
6426
Game.tickerL.innerHTML=str;
6427
Game.tickerCompactL.innerHTML=str;
6428
6429
Game.tickerBelowL.className='commentsText';
6430
void Game.tickerBelowL.offsetWidth;
6431
Game.tickerBelowL.className='commentsText risingAway';
6432
Game.tickerL.className='commentsText';
6433
void Game.tickerL.offsetWidth;
6434
Game.tickerL.className='commentsText risingUp';
6435
}
6436
AddEvent(Game.tickerL,'click',function(event){
6437
Game.Ticker='';
6438
Game.TickerClicks++;
6439
if (Game.TickerClicks==50) {Game.Win('Tabloid addiction');}
6440
6441
if (Game.TickerEffect && Game.TickerEffect.type=='fortune')
6442
{
6443
PlaySound('snd/fortune.mp3',1);
6444
Game.SparkleAt(Game.mouseX,Game.mouseY);
6445
var effect=Game.TickerEffect.sub;
6446
if (effect=='fortuneGC')
6447
{
6448
Game.Notify('Fortune!','A golden cookie has appeared.',[10,32]);
6449
Game.fortuneGC=1;
6450
var newShimmer=new Game.shimmer('golden',{noWrath:true});
6451
}
6452
else if (effect=='fortuneCPS')
6453
{
6454
Game.Notify('Fortune!','You gain <b>one hour</b> of your CpS (capped at double your bank).',[10,32]);
6455
Game.fortuneCPS=1;
6456
Game.Earn(Math.min(Game.cookiesPs*60*60,Game.cookies));
6457
}
6458
else
6459
{
6460
Game.Notify(effect.name,'You\'ve unlocked a new upgrade.',effect.icon);
6461
effect.unlock();
6462
}
6463
}
6464
6465
Game.TickerEffect=0;
6466
6467
});
6468
6469
Game.Log=[];
6470
Game.AddToLog=function(what)
6471
{
6472
Game.Log.unshift(what);
6473
if (Game.Log.length>100) Game.Log.pop();
6474
}
6475
6476
Game.vanilla=1;
6477
/*=====================================================================================
6478
BUILDINGS
6479
=======================================================================================*/
6480
Game.last=0;
6481
6482
Game.storeToRefresh=1;
6483
Game.priceIncrease=1.15;
6484
Game.buyBulk=1;
6485
Game.buyMode=1;//1 for buy, -1 for sell
6486
Game.buyBulkOld=Game.buyBulk;//used to undo changes from holding Shift or Ctrl
6487
Game.buyBulkShortcut=0;//are we pressing Shift or Ctrl?
6488
6489
Game.Objects=[];
6490
Game.ObjectsById=[];
6491
Game.ObjectsN=0;
6492
Game.BuildingsOwned=0;
6493
Game.Object=function(name,commonName,desc,icon,iconColumn,art,price,cps,buyFunction)
6494
{
6495
this.id=Game.ObjectsN;
6496
this.name=name;
6497
this.displayName=this.name;
6498
commonName=commonName.split('|');
6499
this.single=commonName[0];
6500
this.plural=commonName[1];
6501
this.actionName=commonName[2];
6502
this.extraName=commonName[3];
6503
this.extraPlural=commonName[4];
6504
this.desc=desc;
6505
this.basePrice=price;
6506
this.price=this.basePrice;
6507
this.bulkPrice=this.price;
6508
this.cps=cps;
6509
this.baseCps=this.cps;
6510
this.mouseOn=false;
6511
this.mousePos=[-100,-100];
6512
this.productionAchievs=[];
6513
6514
this.n=this.id;
6515
if (this.n!=0)
6516
{
6517
//new automated price and CpS curves
6518
//this.baseCps=Math.ceil(((this.n*0.5)*Math.pow(this.n*1,this.n*0.9))*10)/10;
6519
//this.baseCps=Math.ceil((Math.pow(this.n*1,this.n*0.5+2.35))*10)/10;//by a fortunate coincidence, this gives the 3rd, 4th and 5th buildings a CpS of 10, 69 and 420
6520
this.baseCps=Math.ceil((Math.pow(this.n*1,this.n*0.5+2))*10)/10;//0.45 used to be 0.5
6521
//this.baseCps=Math.ceil((Math.pow(this.n*1,this.n*0.45+2.10))*10)/10;
6522
//clamp 14,467,199 to 14,000,000 (there's probably a more elegant way to do that)
6523
var digits=Math.pow(10,(Math.ceil(Math.log(Math.ceil(this.baseCps))/Math.LN10)))/100;
6524
this.baseCps=Math.round(this.baseCps/digits)*digits;
6525
6526
this.basePrice=(this.n*1+9+(this.n<5?0:Math.pow(this.n-5,1.75)*5))*Math.pow(10,this.n)*(Math.max(1,this.n-14));
6527
//this.basePrice=(this.n*2.5+7.5)*Math.pow(10,this.n);
6528
var digits=Math.pow(10,(Math.ceil(Math.log(Math.ceil(this.basePrice))/Math.LN10)))/100;
6529
this.basePrice=Math.round(this.basePrice/digits)*digits;
6530
if (this.id>=16) this.basePrice*=10;
6531
this.price=this.basePrice;
6532
this.bulkPrice=this.price;
6533
}
6534
6535
this.totalCookies=0;
6536
this.storedCps=0;
6537
this.storedTotalCps=0;
6538
this.icon=icon;
6539
this.iconColumn=iconColumn;
6540
this.art=art;
6541
if (art.base)
6542
{art.pic=art.base+'.png';art.bg=art.base+'Background.png';}
6543
this.buyFunction=buyFunction;
6544
this.locked=1;
6545
this.level=0;
6546
this.vanilla=Game.vanilla;
6547
6548
this.tieredUpgrades=[];
6549
this.tieredAchievs=[];
6550
this.synergies=[];
6551
this.fortune=0;
6552
6553
this.amount=0;
6554
this.bought=0;
6555
this.free=0;
6556
6557
this.eachFrame=0;
6558
6559
this.minigameUrl=0;//if this is defined, load the specified script if the building's level is at least 1
6560
this.minigameName=0;
6561
this.onMinigame=false;
6562
this.minigameLoaded=false;
6563
6564
this.switchMinigame=function(on)//change whether we're on the building's minigame
6565
{
6566
if (!Game.isMinigameReady(this)) on=false;
6567
if (on==-1) on=!this.onMinigame;
6568
this.onMinigame=on;
6569
if (this.id!=0)
6570
{
6571
if (this.onMinigame)
6572
{
6573
l('row'+this.id).classList.add('onMinigame');
6574
//l('rowSpecial'+this.id).style.display='block';
6575
//l('rowCanvas'+this.id).style.display='none';
6576
if (this.minigame.onResize) this.minigame.onResize();
6577
}
6578
else
6579
{
6580
l('row'+this.id).classList.remove('onMinigame');
6581
//l('rowSpecial'+this.id).style.display='none';
6582
//l('rowCanvas'+this.id).style.display='block';
6583
}
6584
}
6585
this.refresh();
6586
}
6587
6588
this.getPrice=function(n)
6589
{
6590
var price=this.basePrice*Math.pow(Game.priceIncrease,Math.max(0,this.amount-this.free));
6591
price=Game.modifyBuildingPrice(this,price);
6592
return Math.ceil(price);
6593
}
6594
this.getSumPrice=function(amount)//return how much it would cost to buy [amount] more of this building
6595
{
6596
var price=0;
6597
for (var i=Math.max(0,this.amount);i<Math.max(0,(this.amount)+amount);i++)
6598
{
6599
price+=this.basePrice*Math.pow(Game.priceIncrease,Math.max(0,i-this.free));
6600
}
6601
price=Game.modifyBuildingPrice(this,price);
6602
return Math.ceil(price);
6603
}
6604
this.getReverseSumPrice=function(amount)//return how much you'd get from selling [amount] of this building
6605
{
6606
var price=0;
6607
for (var i=Math.max(0,(this.amount)-amount);i<Math.max(0,this.amount);i++)
6608
{
6609
price+=this.basePrice*Math.pow(Game.priceIncrease,Math.max(0,i-this.free));
6610
}
6611
price=Game.modifyBuildingPrice(this,price);
6612
price*=this.getSellMultiplier();
6613
return Math.ceil(price);
6614
}
6615
this.getSellMultiplier=function()
6616
{
6617
var giveBack=0.25;
6618
//if (Game.hasAura('Earth Shatterer')) giveBack=0.5;
6619
giveBack*=1+Game.auraMult('Earth Shatterer');
6620
return giveBack;
6621
}
6622
6623
this.buy=function(amount)
6624
{
6625
if (Game.buyMode==-1) {this.sell(Game.buyBulk,1);return 0;}
6626
var success=0;
6627
var moni=0;
6628
var bought=0;
6629
if (!amount) amount=Game.buyBulk;
6630
if (amount==-1) amount=1000;
6631
for (var i=0;i<amount;i++)
6632
{
6633
var price=this.getPrice();
6634
if (Game.cookies>=price)
6635
{
6636
bought++;
6637
moni+=price;
6638
Game.Spend(price);
6639
this.amount++;
6640
this.bought++;
6641
price=this.getPrice();
6642
this.price=price;
6643
if (this.buyFunction) this.buyFunction();
6644
Game.recalculateGains=1;
6645
if (this.amount==1 && this.id!=0) l('row'+this.id).classList.add('enabled');
6646
Game.BuildingsOwned++;
6647
success=1;
6648
}
6649
}
6650
if (success) {PlaySound('snd/buy'+choose([1,2,3,4])+'.mp3',0.75);this.refresh();}
6651
//if (moni>0 && amount>1) Game.Notify(this.name,'Bought <b>'+bought+'</b> for '+Beautify(moni)+' cookies','',2);
6652
}
6653
this.sell=function(amount,bypass)
6654
{
6655
var success=0;
6656
var moni=0;
6657
var sold=0;
6658
if (amount==-1) amount=this.amount;
6659
if (!amount) amount=Game.buyBulk;
6660
for (var i=0;i<amount;i++)
6661
{
6662
var price=this.getPrice();
6663
var giveBack=this.getSellMultiplier();
6664
price=Math.floor(price*giveBack);
6665
if (this.amount>0)
6666
{
6667
sold++;
6668
moni+=price;
6669
Game.cookies+=price;
6670
Game.cookiesEarned=Math.max(Game.cookies,Game.cookiesEarned);//this is to avoid players getting the cheater achievement when selling buildings that have a higher price than they used to
6671
this.amount--;
6672
price=this.getPrice();
6673
this.price=price;
6674
if (this.sellFunction) this.sellFunction();
6675
Game.recalculateGains=1;
6676
if (this.amount==0 && this.id!=0) l('row'+this.id).classList.remove('enabled');
6677
Game.BuildingsOwned--;
6678
success=1;
6679
}
6680
}
6681
if (success && Game.hasGod)
6682
{
6683
var godLvl=Game.hasGod('ruin');
6684
var old=Game.hasBuff('Devastation');
6685
if (old)
6686
{
6687
if (godLvl==1) old.multClick+=sold*0.01;
6688
else if (godLvl==2) old.multClick+=sold*0.005;
6689
else if (godLvl==3) old.multClick+=sold*0.0025;
6690
}
6691
else
6692
{
6693
if (godLvl==1) Game.gainBuff('devastation',10,1+sold*0.01);
6694
else if (godLvl==2) Game.gainBuff('devastation',10,1+sold*0.005);
6695
else if (godLvl==3) Game.gainBuff('devastation',10,1+sold*0.0025);
6696
}
6697
}
6698
if (success) {PlaySound('snd/sell'+choose([1,2,3,4])+'.mp3',0.75);this.refresh();}
6699
//if (moni>0) Game.Notify(this.name,'Sold <b>'+sold+'</b> for '+Beautify(moni)+' cookies','',2);
6700
}
6701
this.sacrifice=function(amount)//sell without getting back any money
6702
{
6703
var success=0;
6704
//var moni=0;
6705
var sold=0;
6706
if (amount==-1) amount=this.amount;
6707
if (!amount) amount=1;
6708
for (var i=0;i<amount;i++)
6709
{
6710
var price=this.getPrice();
6711
price=Math.floor(price*0.5);
6712
if (this.amount>0)
6713
{
6714
sold++;
6715
//moni+=price;
6716
//Game.cookies+=price;
6717
//Game.cookiesEarned=Math.max(Game.cookies,Game.cookiesEarned);
6718
this.amount--;
6719
price=this.getPrice();
6720
this.price=price;
6721
if (this.sellFunction) this.sellFunction();
6722
Game.recalculateGains=1;
6723
if (this.amount==0 && this.id!=0) l('row'+this.id).classList.remove('enabled');
6724
Game.BuildingsOwned--;
6725
success=1;
6726
}
6727
}
6728
if (success) {this.refresh();}
6729
//if (moni>0) Game.Notify(this.name,'Sold <b>'+sold+'</b> for '+Beautify(moni)+' cookies','',2);
6730
}
6731
this.buyFree=function(amount)//unlike getFree, this still increases the price
6732
{
6733
for (var i=0;i<amount;i++)
6734
{
6735
if (Game.cookies>=price)
6736
{
6737
this.amount++;
6738
this.bought++;
6739
this.price=this.getPrice();
6740
Game.recalculateGains=1;
6741
if (this.amount==1 && this.id!=0) l('row'+this.id).classList.add('enabled');
6742
Game.BuildingsOwned++;
6743
}
6744
}
6745
this.refresh();
6746
}
6747
this.getFree=function(amount)//get X of this building for free, with the price behaving as if you still didn't have them
6748
{
6749
this.amount+=amount;
6750
this.bought+=amount;
6751
this.free+=amount;
6752
Game.BuildingsOwned+=amount;
6753
this.refresh();
6754
}
6755
this.getFreeRanks=function(amount)//this building's price behaves as if you had X less of it
6756
{
6757
this.free+=amount;
6758
this.refresh();
6759
}
6760
6761
this.tooltip=function()
6762
{
6763
var me=this;
6764
var desc=me.desc;
6765
var name=me.name;
6766
if (Game.season=='fools')
6767
{
6768
if (!Game.foolObjects[me.name])
6769
{
6770
name=Game.foolObjects['Unknown'].name;
6771
desc=Game.foolObjects['Unknown'].desc;
6772
}
6773
else
6774
{
6775
name=Game.foolObjects[me.name].name;
6776
desc=Game.foolObjects[me.name].desc;
6777
}
6778
}
6779
var icon=[me.iconColumn,0];
6780
if (me.locked)
6781
{
6782
name='???';
6783
desc='';
6784
icon=[0,7];
6785
}
6786
//if (l('rowInfo'+me.id) && Game.drawT%10==0) l('rowInfoContent'+me.id).innerHTML='&bull; '+me.amount+' '+(me.amount==1?me.single:me.plural)+'<br>&bull; producing '+Beautify(me.storedTotalCps,1)+' '+(me.storedTotalCps==1?'cookie':'cookies')+' per second<br>&bull; total : '+Beautify(me.totalCookies)+' '+(Math.floor(me.totalCookies)==1?'cookie':'cookies')+' '+me.actionName;
6787
6788
var canBuy=false;
6789
var price=me.bulkPrice;
6790
if ((Game.buyMode==1 && Game.cookies>=price) || (Game.buyMode==-1 && me.amount>0)) canBuy=true;
6791
6792
var synergiesStr='';
6793
//note : might not be entirely accurate, math may need checking
6794
if (me.amount>0)
6795
{
6796
var synergiesWith={};
6797
var synergyBoost=0;
6798
6799
if (me.name=='Grandma')
6800
{
6801
for (var i in Game.GrandmaSynergies)
6802
{
6803
if (Game.Has(Game.GrandmaSynergies[i]))
6804
{
6805
var other=Game.Upgrades[Game.GrandmaSynergies[i]].buildingTie;
6806
var mult=me.amount*0.01*(1/(other.id-1));
6807
var boost=(other.storedTotalCps*Game.globalCpsMult)-(other.storedTotalCps*Game.globalCpsMult)/(1+mult);
6808
synergyBoost+=boost;
6809
if (!synergiesWith[other.plural]) synergiesWith[other.plural]=0;
6810
synergiesWith[other.plural]+=mult;
6811
}
6812
}
6813
}
6814
else if (me.name=='Portal' && Game.Has('Elder Pact'))
6815
{
6816
var other=Game.Objects['Grandma'];
6817
var boost=(me.amount*0.05*other.amount)*Game.globalCpsMult;
6818
synergyBoost+=boost;
6819
if (!synergiesWith[other.plural]) synergiesWith[other.plural]=0;
6820
synergiesWith[other.plural]+=boost/(other.storedTotalCps*Game.globalCpsMult);
6821
}
6822
6823
for (var i in me.synergies)
6824
{
6825
var it=me.synergies[i];
6826
if (Game.Has(it.name))
6827
{
6828
var weight=0.05;
6829
var other=it.buildingTie1;
6830
if (me==it.buildingTie1) {weight=0.001;other=it.buildingTie2;}
6831
var boost=(other.storedTotalCps*Game.globalCpsMult)-(other.storedTotalCps*Game.globalCpsMult)/(1+me.amount*weight);
6832
synergyBoost+=boost;
6833
if (!synergiesWith[other.plural]) synergiesWith[other.plural]=0;
6834
synergiesWith[other.plural]+=me.amount*weight;
6835
//synergiesStr+='Synergy with '+other.name+'; we boost it by '+Beautify((me.amount*weight)*100,1)+'%, producing '+Beautify(boost)+' CpS. My synergy boost is now '+Beautify((synergyBoost/Game.cookiesPs)*100,1)+'%.<br>';
6836
}
6837
}
6838
if (synergyBoost>0)
6839
{
6840
for (var i in synergiesWith)
6841
{
6842
if (synergiesStr!='') synergiesStr+=', ';
6843
synergiesStr+=i+' +'+Beautify(synergiesWith[i]*100,1)+'%';
6844
}
6845
//synergiesStr='...along with <b>'+Beautify(synergyBoost,1)+'</b> cookies through synergies with other buildings ('+synergiesStr+'; <b>'+Beautify((synergyBoost/Game.cookiesPs)*100,1)+'%</b> of total CpS)';
6846
//synergiesStr='...also boosting some other buildings, accounting for <b>'+Beautify(synergyBoost,1)+'</b> cookies per second (a combined <b>'+Beautify((synergyBoost/Game.cookiesPs)*100,1)+'%</b> of total CpS) : '+synergiesStr+'';
6847
synergiesStr='...also boosting some other buildings : '+synergiesStr+' - all combined, these boosts account for <b>'+Beautify(synergyBoost,1)+'</b> cookies per second (<b>'+Beautify((synergyBoost/Game.cookiesPs)*100,1)+'%</b> of total CpS)';
6848
}
6849
}
6850
6851
return '<div style="min-width:350px;padding:8px;"><div class="icon" style="float:left;margin-left:-8px;margin-top:-8px;'+(icon[2]?'background-image:url('+icon[2]+');':'')+'background-position:'+(-icon[0]*48)+'px '+(-icon[1]*48)+'px;"></div><div style="float:right;text-align:right;"><span class="price'+(canBuy?'':' disabled')+'">'+Beautify(Math.round(price))+'</span>'+Game.costDetails(price)+'</div><div class="name">'+name+'</div>'+'<small>[owned : '+me.amount+'</small>]'+(me.free>0?' <small>[free : '+me.free+'</small>!]':'')+
6852
'<div class="line"></div><div class="description">'+desc+'</div>'+
6853
(me.totalCookies>0?(
6854
'<div class="line"></div><div class="data">'+
6855
(me.amount>0?'&bull; each '+me.single+' produces <b>'+Beautify((me.storedTotalCps/me.amount)*Game.globalCpsMult,1)+'</b> '+((me.storedTotalCps/me.amount)*Game.globalCpsMult==1?'cookie':'cookies')+' per second<br>':'')+
6856
'&bull; '+me.amount+' '+(me.amount==1?me.single:me.plural)+' producing <b>'+Beautify(me.storedTotalCps*Game.globalCpsMult,1)+'</b> '+(me.storedTotalCps*Game.globalCpsMult==1?'cookie':'cookies')+' per second (<b>'+Beautify(Game.cookiesPs>0?((me.amount>0?((me.storedTotalCps*Game.globalCpsMult)/Game.cookiesPs):0)*100):0,1)+'%</b> of total CpS)<br>'+
6857
(synergiesStr?('&bull; '+synergiesStr+'<br>'):'')+
6858
'&bull; <b>'+Beautify(me.totalCookies)+'</b> '+(Math.floor(me.totalCookies)==1?'cookie':'cookies')+' '+me.actionName+' so far</div>'
6859
):'')+
6860
'</div>';
6861
}
6862
this.levelTooltip=function()
6863
{
6864
var me=this;
6865
return '<div style="width:280px;padding:8px;"><b>Level '+Beautify(me.level)+' '+me.plural+'</b><div class="line"></div>'+(me.level==1?me.extraName:me.extraPlural).replace('[X]',Beautify(me.level))+' granting <b>+'+Beautify(me.level)+'% '+me.name+' CpS</b>.<div class="line"></div>Click to level up for <span class="price lump'+(Game.lumps>=me.level+1?'':' disabled')+'">'+Beautify(me.level+1)+' sugar lump'+(me.level==0?'':'s')+'</span>.'+((me.level==0 && me.minigameUrl)?'<div class="line"></div><b>Levelling up this building unlocks a minigame.</b>':'')+'</div>';
6866
}
6867
/*this.levelUp=function()
6868
{
6869
var me=this;
6870
if (Game.lumps<me.level+1) return 0;
6871
Game.lumps-=me.level+1;
6872
me.level+=1;
6873
if (me.level>=10 && me.levelAchiev10) Game.Win(me.levelAchiev10.name);
6874
PlaySound('snd/upgrade.mp3',0.6);
6875
Game.LoadMinigames();
6876
me.refresh();
6877
if (l('productLevel'+me.id)){var rect=l('productLevel'+me.id).getBoundingClientRect();Game.SparkleAt((rect.left+rect.right)/2,(rect.top+rect.bottom)/2-24);}
6878
Game.recalculateGains=1;
6879
if (me.minigame && me.minigame.onLevel) me.minigame.onLevel(me.level);
6880
}*/
6881
this.levelUp=function(me){
6882
return function(){Game.spendLump(me.level+1,'level up your '+me.plural,function()
6883
{
6884
me.level+=1;
6885
if (me.level>=10 && me.levelAchiev10) Game.Win(me.levelAchiev10.name);
6886
PlaySound('snd/upgrade.mp3',0.6);
6887
Game.LoadMinigames();
6888
me.refresh();
6889
if (l('productLevel'+me.id)){var rect=l('productLevel'+me.id).getBoundingClientRect();Game.SparkleAt((rect.left+rect.right)/2,(rect.top+rect.bottom)/2-24);}
6890
if (me.minigame && me.minigame.onLevel) me.minigame.onLevel(me.level);
6891
})();};
6892
}(this);
6893
6894
this.refresh=function()//show/hide the building display based on its amount, and redraw it
6895
{
6896
this.price=this.getPrice();
6897
if (Game.buyMode==1) this.bulkPrice=this.getSumPrice(Game.buyBulk);
6898
else if (Game.buyMode==-1 && Game.buyBulk==-1) this.bulkPrice=this.getReverseSumPrice(1000);
6899
else if (Game.buyMode==-1) this.bulkPrice=this.getReverseSumPrice(Game.buyBulk);
6900
this.rebuild();
6901
if (this.amount==0 && this.id!=0) l('row'+this.id).classList.remove('enabled');
6902
else if (this.amount>0 && this.id!=0) l('row'+this.id).classList.add('enabled');
6903
if (this.muted>0 && this.id!=0) {l('row'+this.id).classList.add('muted');l('mutedProduct'+this.id).style.display='inline-block';}
6904
else if (this.id!=0) {l('row'+this.id).classList.remove('muted');l('mutedProduct'+this.id).style.display='none';}
6905
//if (!this.onMinigame && !this.muted) {}
6906
//else this.pics=[];
6907
}
6908
this.rebuild=function()
6909
{
6910
var me=this;
6911
//var classes='product';
6912
var price=me.bulkPrice;
6913
/*if (Game.cookiesEarned>=me.basePrice || me.bought>0) {classes+=' unlocked';me.locked=0;} else {classes+=' locked';me.locked=1;}
6914
if (Game.cookies>=price) classes+=' enabled'; else classes+=' disabled';
6915
if (me.l.className.indexOf('toggledOff')!=-1) classes+=' toggledOff';
6916
*/
6917
var icon=[0,me.icon];
6918
var iconOff=[1,me.icon];
6919
if (me.iconFunc) icon=me.iconFunc();
6920
6921
var desc=me.desc;
6922
var name=me.name;
6923
var displayName=me.displayName;
6924
if (Game.season=='fools')
6925
{
6926
if (!Game.foolObjects[me.name])
6927
{
6928
icon=[2,0];
6929
iconOff=[3,0];
6930
name=Game.foolObjects['Unknown'].name;
6931
desc=Game.foolObjects['Unknown'].desc;
6932
}
6933
else
6934
{
6935
icon=[2,me.icon];
6936
iconOff=[3,me.icon];
6937
name=Game.foolObjects[me.name].name;
6938
desc=Game.foolObjects[me.name].desc;
6939
}
6940
displayName=name;
6941
if (name.length>16) displayName='<span style="font-size:75%;">'+name+'</span>';
6942
}
6943
icon=[icon[0]*64,icon[1]*64];
6944
iconOff=[iconOff[0]*64,iconOff[1]*64];
6945
6946
//me.l.className=classes;
6947
//l('productIcon'+me.id).style.backgroundImage='url(img/'+icon+')';
6948
l('productIcon'+me.id).style.backgroundPosition='-'+icon[0]+'px -'+icon[1]+'px';
6949
//l('productIconOff'+me.id).style.backgroundImage='url(img/'+iconOff+')';
6950
l('productIconOff'+me.id).style.backgroundPosition='-'+iconOff[0]+'px -'+iconOff[1]+'px';
6951
l('productName'+me.id).innerHTML=displayName;
6952
l('productOwned'+me.id).innerHTML=me.amount?me.amount:'';
6953
l('productPrice'+me.id).innerHTML=Beautify(Math.round(price));
6954
l('productPriceMult'+me.id).innerHTML=(Game.buyBulk>1)?('x'+Game.buyBulk+' '):'';
6955
l('productLevel'+me.id).innerHTML='lvl '+Beautify(me.level);
6956
if (Game.isMinigameReady(me) && Game.ascensionMode!=1)
6957
{
6958
l('productMinigameButton'+me.id).style.display='block';
6959
if (!me.onMinigame) l('productMinigameButton'+me.id).innerHTML='View '+me.minigameName;
6960
else l('productMinigameButton'+me.id).innerHTML='Close '+me.minigameName;
6961
}
6962
else l('productMinigameButton'+me.id).style.display='none';
6963
}
6964
this.muted=false;
6965
this.mute=function(val)
6966
{
6967
if (this.id==0) return false;
6968
this.muted=val;
6969
if (val) {l('productMute'+this.id).classList.add('on');l('row'+this.id).classList.add('muted');l('mutedProduct'+this.id).style.display='inline-block';}
6970
else {l('productMute'+this.id).classList.remove('on');l('row'+this.id).classList.remove('muted');l('mutedProduct'+this.id).style.display='none';}
6971
};
6972
6973
this.draw=function(){};
6974
6975
if (this.id==0)
6976
{
6977
var str='<div class="productButtons">';
6978
str+='<div id="productLevel'+this.id+'" class="productButton productLevel lumpsOnly" onclick="Game.ObjectsById['+this.id+'].levelUp()" '+Game.getDynamicTooltip('Game.ObjectsById['+this.id+'].levelTooltip','this')+'></div>';
6979
str+='<div id="productMinigameButton'+this.id+'" class="productButton productMinigameButton lumpsOnly" onclick="Game.ObjectsById['+this.id+'].switchMinigame(-1);PlaySound(Game.ObjectsById['+this.id+'].onMinigame?\'snd/clickOn.mp3\':\'snd/clickOff.mp3\');"></div>';
6980
str+='</div>';
6981
l('sectionLeftExtra').innerHTML=l('sectionLeftExtra').innerHTML+str;
6982
}
6983
else//draw it
6984
{
6985
var str='<div class="row" id="row'+this.id+'"><div class="separatorBottom"></div>';
6986
str+='<div class="productButtons">';
6987
str+='<div id="productLevel'+this.id+'" class="productButton productLevel lumpsOnly" onclick="Game.ObjectsById['+this.id+'].levelUp()" '+Game.getDynamicTooltip('Game.ObjectsById['+this.id+'].levelTooltip','this')+'></div>';
6988
str+='<div id="productMinigameButton'+this.id+'" class="productButton productMinigameButton lumpsOnly" onclick="Game.ObjectsById['+this.id+'].switchMinigame(-1);PlaySound(Game.ObjectsById['+this.id+'].onMinigame?\'snd/clickOn.mp3\':\'snd/clickOff.mp3\');"></div>';
6989
str+='<div class="productButton productMute" '+Game.getTooltip('<div style="width:150px;text-align:center;font-size:11px;"><b>Mute</b><br>(Minimize this building)</div>','this')+' onclick="Game.ObjectsById['+this.id+'].mute(1);PlaySound(Game.ObjectsById['+this.id+'].muted?\'snd/clickOff.mp3\':\'snd/clickOn.mp3\');" id="productMute'+this.id+'">Mute</div>';
6990
str+='</div>';
6991
str+='<canvas class="rowCanvas" id="rowCanvas'+this.id+'"></canvas>';
6992
str+='<div class="rowSpecial" id="rowSpecial'+this.id+'"></div>';
6993
str+='</div>';
6994
l('rows').innerHTML=l('rows').innerHTML+str;
6995
6996
//building canvas
6997
this.pics=[];
6998
6999
this.toResize=true;
7000
this.redraw=function()
7001
{
7002
var me=this;
7003
me.pics=[];
7004
}
7005
this.draw=function()
7006
{
7007
if (this.amount<=0) return false;
7008
if (this.toResize)
7009
{
7010
this.canvas.width=this.canvas.clientWidth;
7011
this.canvas.height=this.canvas.clientHeight;
7012
this.toResize=false;
7013
}
7014
var ctx=this.ctx;
7015
//clear
7016
//ctx.clearRect(0,0,this.canvas.width,this.canvas.height);
7017
ctx.globalAlpha=1;
7018
7019
//pic : a loaded picture or a function returning a loaded picture
7020
//bg : a loaded picture or a function returning a loaded picture - tiled as the background, 128x128
7021
//xV : the pictures will have a random horizontal shift by this many pixels
7022
//yV : the pictures will have a random vertical shift by this many pixels
7023
//w : how many pixels between each picture (or row of pictures)
7024
//x : horizontal offset
7025
//y : vertical offset (+32)
7026
//rows : if >1, arrange the pictures in rows containing this many pictures
7027
//frames : if present, slice the pic in [frames] horizontal slices and pick one at random
7028
7029
var pic=this.art.pic;
7030
var bg=this.art.bg;
7031
var xV=this.art.xV||0;
7032
var yV=this.art.yV||0;
7033
var w=this.art.w||48;
7034
var h=this.art.h||48;
7035
var offX=this.art.x||0;
7036
var offY=this.art.y||0;
7037
var rows=this.art.rows||1;
7038
var frames=this.art.frames||1;
7039
7040
if (typeof(bg)=='string') ctx.fillPattern(Pic(this.art.bg),0,0,this.canvas.width,this.canvas.height,128,128);
7041
else bg(this,ctx);
7042
/*
7043
ctx.globalAlpha=0.5;
7044
if (typeof(bg)=='string')//test
7045
{
7046
ctx.fillPattern(Pic(this.art.bg),-128+Game.T%128,0,this.canvas.width+128,this.canvas.height,128,128);
7047
ctx.fillPattern(Pic(this.art.bg),-128+Math.floor(Game.T/2)%128,-128+Math.floor(Game.T/2)%128,this.canvas.width+128,this.canvas.height+128,128,128);
7048
}
7049
ctx.globalAlpha=1;
7050
*/
7051
var maxI=Math.floor(this.canvas.width/(w/rows)+1);
7052
var iT=Math.min(this.amount,maxI);
7053
var i=this.pics.length;
7054
7055
7056
var x=0;
7057
var y=0;
7058
var added=0;
7059
if (i!=iT)
7060
{
7061
//for (var iter=0;iter<3;iter++)
7062
//{
7063
while (i<iT)
7064
//if (i<iT)
7065
{
7066
Math.seedrandom(Game.seed+' '+this.id+' '+i);
7067
if (rows!=1)
7068
{
7069
x=Math.floor(i/rows)*w+((i%rows)/rows)*w+Math.floor((Math.random()-0.5)*xV)+offX;
7070
y=32+Math.floor((Math.random()-0.5)*yV)+((-rows/2)*32/2+(i%rows)*32/2)+offY;
7071
}
7072
else
7073
{
7074
x=i*w+Math.floor((Math.random()-0.5)*xV)+offX;
7075
y=32+Math.floor((Math.random()-0.5)*yV)+offY;
7076
}
7077
var usedPic=(typeof(pic)=='string'?pic:pic(this,i));
7078
var frame=-1;
7079
if (frames>1) frame=Math.floor(Math.random()*frames);
7080
this.pics.push({x:Math.floor(x),y:Math.floor(y),z:y,pic:usedPic,id:i,frame:frame});
7081
i++;
7082
added++;
7083
}
7084
while (i>iT)
7085
//else if (i>iT)
7086
{
7087
this.pics.sort(Game.sortSpritesById);
7088
this.pics.pop();
7089
i--;
7090
added--;
7091
}
7092
//}
7093
this.pics.sort(Game.sortSprites);
7094
}
7095
7096
var len=this.pics.length;
7097
7098
if (this.mouseOn)
7099
{
7100
var selected=-1;
7101
//mouse detection only fits grandma sprites for now
7102
var marginW=-18;
7103
var marginH=-10;
7104
for (var i=0;i<len;i++)
7105
{
7106
var pic=this.pics[i];
7107
if (this.mousePos[0]>=pic.x-marginW && this.mousePos[0]<pic.x+64+marginW && this.mousePos[1]>=pic.y-marginH && this.mousePos[1]<pic.y+64+marginH) selected=i;
7108
}
7109
}
7110
7111
Math.seedrandom();
7112
7113
for (var i=0;i<len;i++)
7114
{
7115
var pic=this.pics[i];
7116
var sprite=Pic(pic.pic);
7117
if (selected==i && this.name=='Grandma')
7118
{
7119
ctx.font='14px Merriweather';
7120
ctx.textAlign='center';
7121
Math.seedrandom(Game.seed+' '+pic.id/*+' '+pic.id*/);//(Game.seed+' '+pic.id+' '+pic.x+' '+pic.y);
7122
var years=((Date.now()-new Date(2013,7,8))/(1000*60*60*24*365))+Math.random();//the grandmas age with the game
7123
var name=choose(Game.grandmaNames);
7124
var custom=false;
7125
if (Game.prefs.customGrandmas && Game.customGrandmaNames.length>0 && Math.random()<0.2) {name=choose(Game.customGrandmaNames);custom=true;}
7126
var text=name+', age '+Beautify(Math.floor(70+Math.random()*30+years+this.level));
7127
var width=ctx.measureText(text).width+12;
7128
var x=Math.max(0,Math.min(pic.x+32-width/2+Math.random()*32-16,this.canvas.width-width));
7129
var y=4+Math.random()*8-4;
7130
Math.seedrandom();
7131
ctx.fillStyle='#000';
7132
ctx.strokeStyle='#000';
7133
ctx.lineWidth=8;
7134
ctx.globalAlpha=0.75;
7135
ctx.beginPath();
7136
ctx.moveTo(pic.x+32,pic.y+32);
7137
ctx.lineTo(Math.floor(x+width/2),Math.floor(y+20));
7138
ctx.stroke();
7139
ctx.fillRect(Math.floor(x),Math.floor(y),Math.floor(width),24);
7140
ctx.globalAlpha=1;
7141
if (custom) ctx.fillStyle='#fff';
7142
else ctx.fillStyle='rgba(255,255,255,0.7)';
7143
ctx.fillText(text,Math.floor(x+width/2),Math.floor(y+16));
7144
7145
ctx.drawImage(sprite,Math.floor(pic.x+Math.random()*4-2),Math.floor(pic.y+Math.random()*4-2));
7146
}
7147
//else if (1) ctx.drawImage(sprite,0,0,sprite.width,sprite.height,pic.x,pic.y,sprite.width,sprite.height);
7148
else if (pic.frame!=-1) ctx.drawImage(sprite,(sprite.width/frames)*pic.frame,0,sprite.width/frames,sprite.height,pic.x,pic.y,(sprite.width/frames),sprite.height);
7149
else ctx.drawImage(sprite,pic.x,pic.y);
7150
7151
}
7152
7153
/*
7154
var picX=this.id;
7155
var picY=12;
7156
var w=1;
7157
var h=1;
7158
var w=Math.abs(Math.cos(Game.T*0.2+this.id*2-0.3))*0.2+0.8;
7159
var h=Math.abs(Math.sin(Game.T*0.2+this.id*2))*0.3+0.7;
7160
var x=64+Math.cos(Game.T*0.19+this.id*2)*8-24*w;
7161
var y=128-Math.abs(Math.pow(Math.sin(Game.T*0.2+this.id*2),5)*16)-48*h;
7162
ctx.drawImage(Pic('icons.png'),picX*48,picY*48,48,48,Math.floor(x),Math.floor(y),48*w,48*h);
7163
*/
7164
}
7165
}
7166
7167
Game.last=this;
7168
Game.Objects[this.name]=this;
7169
Game.ObjectsById[this.id]=this;
7170
Game.ObjectsN++;
7171
return this;
7172
}
7173
7174
Game.DrawBuildings=function()//draw building displays with canvas
7175
{
7176
if (Game.drawT%3==0)
7177
{
7178
for (var i in Game.Objects)
7179
{
7180
var me=Game.Objects[i];
7181
if (me.id>0 && !me.onMinigame && !me.muted) me.draw();
7182
else me.pics=[];
7183
}
7184
}
7185
}
7186
7187
Game.sortSprites=function(a,b)
7188
{
7189
if (a.z>b.z) return 1;
7190
else if (a.z<b.z) return -1;
7191
else return 0;
7192
}
7193
Game.sortSpritesById=function(a,b)
7194
{
7195
if (a.id>b.id) return 1;
7196
else if (a.id<b.id) return -1;
7197
else return 0;
7198
}
7199
7200
Game.modifyBuildingPrice=function(building,price)
7201
{
7202
if (Game.Has('Season savings')) price*=0.99;
7203
if (Game.Has('Santa\'s dominion')) price*=0.99;
7204
if (Game.Has('Faberge egg')) price*=0.99;
7205
if (Game.Has('Divine discount')) price*=0.99;
7206
if (Game.Has('Fortune #100')) price*=0.99;
7207
//if (Game.hasAura('Fierce Hoarder')) price*=0.98;
7208
price*=1-Game.auraMult('Fierce Hoarder')*0.02;
7209
if (Game.hasBuff('Everything must go')) price*=0.95;
7210
if (Game.hasBuff('Crafty pixies')) price*=0.98;
7211
if (Game.hasBuff('Nasty goblins')) price*=1.02;
7212
if (building.fortune && Game.Has(building.fortune.name)) price*=0.93;
7213
price*=Game.eff('buildingCost');
7214
if (Game.hasGod)
7215
{
7216
var godLvl=Game.hasGod('creation');
7217
if (godLvl==1) price*=0.93;
7218
else if (godLvl==2) price*=0.95;
7219
else if (godLvl==3) price*=0.98;
7220
}
7221
return price;
7222
}
7223
7224
Game.storeBulkButton=function(id)
7225
{
7226
if (id==0) Game.buyMode=1;
7227
else if (id==1) Game.buyMode=-1;
7228
else if (id==2) Game.buyBulk=1;
7229
else if (id==3) Game.buyBulk=10;
7230
else if (id==4) Game.buyBulk=100;
7231
else if (id==5) Game.buyBulk=-1;
7232
7233
if (Game.buyMode==1 && Game.buyBulk==-1) Game.buyBulk=100;
7234
7235
if (Game.buyMode==1) l('storeBulkBuy').className='storePreButton storeBulkMode selected'; else l('storeBulkBuy').className='storePreButton storeBulkMode';
7236
if (Game.buyMode==-1) l('storeBulkSell').className='storePreButton storeBulkMode selected'; else l('storeBulkSell').className='storePreButton storeBulkMode';
7237
7238
if (Game.buyBulk==1) l('storeBulk1').className='storePreButton storeBulkAmount selected'; else l('storeBulk1').className='storePreButton storeBulkAmount';
7239
if (Game.buyBulk==10) l('storeBulk10').className='storePreButton storeBulkAmount selected'; else l('storeBulk10').className='storePreButton storeBulkAmount';
7240
if (Game.buyBulk==100) l('storeBulk100').className='storePreButton storeBulkAmount selected'; else l('storeBulk100').className='storePreButton storeBulkAmount';
7241
if (Game.buyBulk==-1) l('storeBulkMax').className='storePreButton storeBulkAmount selected'; else l('storeBulkMax').className='storePreButton storeBulkAmount';
7242
7243
if (Game.buyMode==1)
7244
{
7245
l('storeBulkMax').style.visibility='hidden';
7246
l('products').className='storeSection';
7247
}
7248
else
7249
{
7250
l('storeBulkMax').style.visibility='visible';
7251
l('products').className='storeSection selling';
7252
}
7253
7254
Game.storeToRefresh=1;
7255
if (id!=-1) PlaySound('snd/tick.mp3');
7256
}
7257
Game.BuildStore=function()//create the DOM for the store's buildings
7258
{
7259
//if (typeof showAds!=='undefined') l('store').scrollTop=100;
7260
7261
var str='';
7262
str+='<div id="storeBulk" class="storePre" '+Game.getTooltip(
7263
'<div style="padding:8px;min-width:200px;text-align:center;font-size:11px;">You can also press <b>Ctrl</b> to bulk-buy or sell <b>10</b> of a building at a time, or <b>Shift</b> for <b>100</b>.</div>'
7264
,'store')+
7265
'>'+
7266
'<div id="storeBulkBuy" class="storePreButton storeBulkMode" '+Game.clickStr+'="Game.storeBulkButton(0);">Buy</div>'+
7267
'<div id="storeBulkSell" class="storePreButton storeBulkMode" '+Game.clickStr+'="Game.storeBulkButton(1);">Sell</div>'+
7268
'<div id="storeBulk1" class="storePreButton storeBulkAmount" '+Game.clickStr+'="Game.storeBulkButton(2);">1</div>'+
7269
'<div id="storeBulk10" class="storePreButton storeBulkAmount" '+Game.clickStr+'="Game.storeBulkButton(3);">10</div>'+
7270
'<div id="storeBulk100" class="storePreButton storeBulkAmount" '+Game.clickStr+'="Game.storeBulkButton(4);">100</div>'+
7271
'<div id="storeBulkMax" class="storePreButton storeBulkAmount" '+Game.clickStr+'="Game.storeBulkButton(5);">all</div>'+
7272
'</div>';
7273
for (var i in Game.Objects)
7274
{
7275
var me=Game.Objects[i];
7276
str+='<div class="product toggledOff" '+Game.getDynamicTooltip('Game.ObjectsById['+me.id+'].tooltip','store')+' id="product'+me.id+'"><div class="icon off" id="productIconOff'+me.id+'" style=""></div><div class="icon" id="productIcon'+me.id+'" style=""></div><div class="content"><div class="lockedTitle">???</div><div class="title" id="productName'+me.id+'"></div><span class="priceMult" id="productPriceMult'+me.id+'"></span><span class="price" id="productPrice'+me.id+'"></span><div class="title owned" id="productOwned'+me.id+'"></div></div>'+
7277
/*'<div class="buySell"><div style="left:0px;" id="buttonBuy10-'+me.id+'">Buy 10</div><div style="left:100px;" id="buttonSell-'+me.id+'">Sell 1</div><div style="left:200px;" id="buttonSellAll-'+me.id+'">Sell all</div></div>'+*/
7278
'</div>';
7279
}
7280
l('products').innerHTML=str;
7281
7282
Game.storeBulkButton(-1);
7283
7284
var SellAllPrompt=function(id)
7285
{
7286
return function(id){Game.Prompt('<div class="block">Do you really want to sell your '+Game.ObjectsById[id].amount+' '+(Game.ObjectsById[id].amount==1?Game.ObjectsById[id].single:Game.ObjectsById[id].plural)+'?</div>',[['Yes','Game.ObjectsById['+id+'].sell(-1);Game.ClosePrompt();'],['No','Game.ClosePrompt();']]);}(id);
7287
}
7288
7289
Game.ClickProduct=function(what)
7290
{
7291
Game.ObjectsById[what].buy();
7292
}
7293
7294
for (var i in Game.Objects)
7295
{
7296
var me=Game.Objects[i];
7297
me.l=l('product'+me.id);
7298
7299
//these are a bit messy but ah well
7300
if (!Game.touchEvents)
7301
{
7302
AddEvent(me.l,'click',function(what){return function(e){Game.ClickProduct(what);e.preventDefault();};}(me.id));
7303
}
7304
else
7305
{
7306
AddEvent(me.l,'touchend',function(what){return function(e){Game.ClickProduct(what);e.preventDefault();};}(me.id));
7307
}
7308
}
7309
}
7310
7311
Game.RefreshStore=function()//refresh the store's buildings
7312
{
7313
for (var i in Game.Objects)
7314
{
7315
Game.Objects[i].refresh();
7316
}
7317
Game.storeToRefresh=0;
7318
}
7319
7320
Game.ComputeCps=function(base,mult,bonus)
7321
{
7322
if (!bonus) bonus=0;
7323
return ((base)*(Math.pow(2,mult))+bonus);
7324
}
7325
7326
Game.isMinigameReady=function(me)
7327
{return (me.minigameUrl && me.minigameLoaded && me.level>0);}
7328
Game.scriptBindings=[];
7329
Game.LoadMinigames=function()//load scripts for each minigame
7330
{
7331
for (var i in Game.Objects)
7332
{
7333
var me=Game.Objects[i];
7334
if (me.minigameUrl && me.level>0 && !me.minigameLoaded && !me.minigameLoading && !l('minigameScript-'+me.id))
7335
{
7336
me.minigameLoading=true;
7337
//we're only loading the minigame scripts that aren't loaded yet and which have enough building level
7338
//we call this function on building level up and on load
7339
//console.log('Loading script '+me.minigameUrl+'...');
7340
setTimeout(function(me){return function(){
7341
var script=document.createElement('script');
7342
script.id='minigameScript-'+me.id;
7343
Game.scriptBindings['minigameScript-'+me.id]=me;
7344
script.setAttribute('src',me.minigameUrl+'?r='+Game.version);
7345
script.onload=function(me,script){return function(){
7346
if (!me.minigameLoaded) Game.scriptLoaded(me,script);
7347
}}(me,'minigameScript-'+me.id);
7348
document.head.appendChild(script);
7349
}}(me),10);
7350
}
7351
}
7352
}
7353
Game.scriptLoaded=function(who,script)
7354
{
7355
who.minigameLoading=false;
7356
who.minigameLoaded=true;
7357
who.refresh();
7358
who.minigame.launch();
7359
if (who.minigameSave) {who.minigame.reset(true);who.minigame.load(who.minigameSave);who.minigameSave=0;}
7360
}
7361
7362
Game.magicCpS=function(what)
7363
{
7364
/*
7365
if (Game.Objects[what].amount>=250)
7366
{
7367
//this makes buildings give 1% more cookies for every building over 250.
7368
//this turns out to be rather stupidly overpowered.
7369
var n=Game.Objects[what].amount-250;
7370
return 1+Math.pow(1.01,n);
7371
}
7372
else return 1;
7373
*/
7374
return 1;
7375
}
7376
7377
//define objects
7378
new Game.Object('Cursor','cursor|cursors|clicked|[X] extra finger|[X] extra fingers','Autoclicks once every 10 seconds.',0,0,{},15,function(me){
7379
var add=0;
7380
if (Game.Has('Thousand fingers')) add+= 0.1;
7381
if (Game.Has('Million fingers')) add+= 0.5;
7382
if (Game.Has('Billion fingers')) add+= 5;
7383
if (Game.Has('Trillion fingers')) add+= 50;
7384
if (Game.Has('Quadrillion fingers')) add+= 500;
7385
if (Game.Has('Quintillion fingers')) add+= 5000;
7386
if (Game.Has('Sextillion fingers')) add+= 50000;
7387
if (Game.Has('Septillion fingers')) add+= 500000;
7388
if (Game.Has('Octillion fingers')) add+= 5000000;
7389
var mult=1;
7390
var num=0;
7391
for (var i in Game.Objects) {if (Game.Objects[i].name!='Cursor') num+=Game.Objects[i].amount;}
7392
add=add*num;
7393
mult*=Game.GetTieredCpsMult(me);
7394
mult*=Game.magicCpS('Cursor');
7395
mult*=Game.eff('cursorCps');
7396
return Game.ComputeCps(0.1,Game.Has('Reinforced index finger')+Game.Has('Carpal tunnel prevention cream')+Game.Has('Ambidextrous'),add)*mult;
7397
},function(){
7398
if (this.amount>=1) Game.Unlock(['Reinforced index finger','Carpal tunnel prevention cream']);
7399
if (this.amount>=10) Game.Unlock('Ambidextrous');
7400
if (this.amount>=25) Game.Unlock('Thousand fingers');
7401
if (this.amount>=50) Game.Unlock('Million fingers');
7402
if (this.amount>=100) Game.Unlock('Billion fingers');
7403
if (this.amount>=150) Game.Unlock('Trillion fingers');
7404
if (this.amount>=200) Game.Unlock('Quadrillion fingers');
7405
if (this.amount>=250) Game.Unlock('Quintillion fingers');
7406
if (this.amount>=300) Game.Unlock('Sextillion fingers');
7407
if (this.amount>=350) Game.Unlock('Septillion fingers');
7408
if (this.amount>=400) Game.Unlock('Octillion fingers');
7409
7410
if (this.amount>=1) Game.Win('Click');if (this.amount>=2) Game.Win('Double-click');if (this.amount>=50) Game.Win('Mouse wheel');if (this.amount>=100) Game.Win('Of Mice and Men');if (this.amount>=200) Game.Win('The Digital');if (this.amount>=300) Game.Win('Extreme polydactyly');if (this.amount>=400) Game.Win('Dr. T');if (this.amount>=500) Game.Win('Thumbs, phalanges, metacarpals');if (this.amount>=600) Game.Win('With her finger and her thumb');
7411
});
7412
7413
Game.SpecialGrandmaUnlock=15;
7414
new Game.Object('Grandma','grandma|grandmas|baked|Grandmas are [X] year older|Grandmas are [X] years older','A nice grandma to bake more cookies.',1,1,{pic:function(i){
7415
var list=['grandma'];
7416
if (Game.Has('Farmer grandmas')) list.push('farmerGrandma');
7417
if (Game.Has('Worker grandmas')) list.push('workerGrandma');
7418
if (Game.Has('Miner grandmas')) list.push('minerGrandma');
7419
if (Game.Has('Cosmic grandmas')) list.push('cosmicGrandma');
7420
if (Game.Has('Transmuted grandmas')) list.push('transmutedGrandma');
7421
if (Game.Has('Altered grandmas')) list.push('alteredGrandma');
7422
if (Game.Has('Grandmas\' grandmas')) list.push('grandmasGrandma');
7423
if (Game.Has('Antigrandmas')) list.push('antiGrandma');
7424
if (Game.Has('Rainbow grandmas')) list.push('rainbowGrandma');
7425
if (Game.Has('Banker grandmas')) list.push('bankGrandma');
7426
if (Game.Has('Priestess grandmas')) list.push('templeGrandma');
7427
if (Game.Has('Witch grandmas')) list.push('witchGrandma');
7428
if (Game.Has('Lucky grandmas')) list.push('luckyGrandma');
7429
if (Game.Has('Metagrandmas')) list.push('metaGrandma');
7430
if (Game.Has('Script grannies')) list.push('scriptGrandma');
7431
if (Game.season=='christmas') list.push('elfGrandma');
7432
if (Game.season=='easter') list.push('bunnyGrandma');
7433
return choose(list)+'.png';
7434
},bg:'grandmaBackground.png',xV:8,yV:8,w:32,rows:3,x:0,y:16},100,function(me){
7435
var mult=1;
7436
for (var i in Game.GrandmaSynergies)
7437
{
7438
if (Game.Has(Game.GrandmaSynergies[i])) mult*=2;
7439
}
7440
if (Game.Has('Bingo center/Research facility')) mult*=4;
7441
if (Game.Has('Ritual rolling pins')) mult*=2;
7442
if (Game.Has('Naughty list')) mult*=2;
7443
7444
if (Game.Has('Elderwort biscuits')) mult*=1.02;
7445
7446
mult*=Game.eff('grandmaCps');
7447
7448
mult*=Game.GetTieredCpsMult(me);
7449
7450
var add=0;
7451
if (Game.Has('One mind')) add+=Game.Objects['Grandma'].amount*0.02;
7452
if (Game.Has('Communal brainsweep')) add+=Game.Objects['Grandma'].amount*0.02;
7453
if (Game.Has('Elder Pact')) add+=Game.Objects['Portal'].amount*0.05;
7454
7455
var num=0;
7456
for (var i in Game.Objects) {if (Game.Objects[i].name!='Grandma') num+=Game.Objects[i].amount;}
7457
//if (Game.hasAura('Elder Battalion')) mult*=1+0.01*num;
7458
mult*=1+Game.auraMult('Elder Battalion')*0.01*num;
7459
7460
mult*=Game.magicCpS(me.name);
7461
7462
return (me.baseCps+add)*mult;
7463
},function(){
7464
Game.UnlockTiered(this);
7465
});
7466
Game.last.sellFunction=function()
7467
{
7468
Game.Win('Just wrong');
7469
if (this.amount==0)
7470
{
7471
Game.Lock('Elder Pledge');
7472
Game.CollectWrinklers();
7473
Game.pledgeT=0;
7474
}
7475
};
7476
Game.last.iconFunc=function(type){
7477
var grandmaIcons=[[0,1],[0,2],[1,2],[2,2]];
7478
if (type=='off') return [0,1];
7479
return grandmaIcons[Game.elderWrath];
7480
};
7481
7482
7483
new Game.Object('Farm','farm|farms|harvested|[X] more acre|[X] more acres','Grows cookie plants from cookie seeds.',3,2,{base:'farm',xV:8,yV:8,w:64,rows:2,x:0,y:16},500,function(me){
7484
var mult=1;
7485
mult*=Game.GetTieredCpsMult(me);
7486
mult*=Game.magicCpS(me.name);
7487
return me.baseCps*mult;
7488
},function(){
7489
Game.UnlockTiered(this);
7490
if (this.amount>=Game.SpecialGrandmaUnlock && Game.Objects['Grandma'].amount>0) Game.Unlock(this.grandma.name);
7491
});
7492
Game.last.minigameUrl='minigameGarden.js';
7493
Game.last.minigameName='Garden';
7494
7495
new Game.Object('Mine','mine|mines|mined|[X] mile deeper|[X] miles deeper','Mines out cookie dough and chocolate chips.',4,3,{base:'mine',xV:16,yV:16,w:64,rows:2,x:0,y:24},10000,function(me){
7496
var mult=1;
7497
mult*=Game.GetTieredCpsMult(me);
7498
mult*=Game.magicCpS(me.name);
7499
return me.baseCps*mult;
7500
},function(){
7501
Game.UnlockTiered(this);
7502
if (this.amount>=Game.SpecialGrandmaUnlock && Game.Objects['Grandma'].amount>0) Game.Unlock(this.grandma.name);
7503
});
7504
7505
new Game.Object('Factory','factory|factories|mass-produced|[X] additional patent|[X] additional patents','Produces large quantities of cookies.',5,4,{base:'factory',xV:8,yV:0,w:64,rows:1,x:0,y:-22},3000,function(me){
7506
var mult=1;
7507
mult*=Game.GetTieredCpsMult(me);
7508
mult*=Game.magicCpS(me.name);
7509
return me.baseCps*mult;
7510
},function(){
7511
Game.UnlockTiered(this);
7512
if (this.amount>=Game.SpecialGrandmaUnlock && Game.Objects['Grandma'].amount>0) Game.Unlock(this.grandma.name);
7513
});
7514
//Game.last.minigameUrl='minigameDungeon.js';//not yet
7515
//Game.last.minigameName='Dungeon';
7516
7517
new Game.Object('Bank','bank|banks|banked|Interest rates [X]% better|Interest rates [X]% better','Generates cookies from interest.',6,15,{base:'bank',xV:8,yV:4,w:56,rows:1,x:0,y:13},0,function(me){
7518
var mult=1;
7519
mult*=Game.GetTieredCpsMult(me);
7520
mult*=Game.magicCpS(me.name);
7521
return me.baseCps*mult;
7522
},function(){
7523
Game.UnlockTiered(this);
7524
if (this.amount>=Game.SpecialGrandmaUnlock && Game.Objects['Grandma'].amount>0) Game.Unlock(this.grandma.name);
7525
});
7526
7527
new Game.Object('Temple','temple|temples|discovered|[X] sacred artifact retrieved|[X] sacred artifacts retrieved','Full of precious, ancient chocolate.',7,16,{base:'temple',xV:8,yV:4,w:72,rows:2,x:0,y:-5},0,function(me){
7528
var mult=1;
7529
mult*=Game.GetTieredCpsMult(me);
7530
mult*=Game.magicCpS(me.name);
7531
return me.baseCps*mult;
7532
},function(){
7533
Game.UnlockTiered(this);
7534
if (this.amount>=Game.SpecialGrandmaUnlock && Game.Objects['Grandma'].amount>0) Game.Unlock(this.grandma.name);
7535
});
7536
Game.last.minigameUrl='minigamePantheon.js';
7537
Game.last.minigameName='Pantheon';
7538
7539
new Game.Object('Wizard tower','wizard tower|wizard towers|summoned|Incantations have [X] more syllable|Incantations have [X] more syllables','Summons cookies with magic spells.',8,17,{base:'wizardtower',xV:16,yV:16,w:48,rows:2,x:0,y:20},0,function(me){
7540
var mult=1;
7541
mult*=Game.GetTieredCpsMult(me);
7542
mult*=Game.magicCpS(me.name);
7543
return me.baseCps*mult;
7544
},function(){
7545
Game.UnlockTiered(this);
7546
if (this.amount>=Game.SpecialGrandmaUnlock && Game.Objects['Grandma'].amount>0) Game.Unlock(this.grandma.name);
7547
});
7548
Game.last.minigameUrl='minigameGrimoire.js';
7549
Game.last.minigameName='Grimoire';
7550
7551
new Game.Object('Shipment','shipment|shipments|shipped|[X] galaxy fully explored|[X] galaxies fully explored','Brings in fresh cookies from the cookie planet.',9,5,{base:'shipment',xV:16,yV:16,w:64,rows:1,x:0,y:0},40000,function(me){
7552
var mult=1;
7553
mult*=Game.GetTieredCpsMult(me);
7554
mult*=Game.magicCpS(me.name);
7555
return me.baseCps*mult;
7556
},function(){
7557
Game.UnlockTiered(this);
7558
if (this.amount>=Game.SpecialGrandmaUnlock && Game.Objects['Grandma'].amount>0) Game.Unlock(this.grandma.name);
7559
});
7560
7561
new Game.Object('Alchemy lab','alchemy lab|alchemy labs|transmuted|[X] primordial element mastered|[X] primordial elements mastered','Turns gold into cookies!',10,6,{base:'alchemylab',xV:16,yV:16,w:64,rows:2,x:0,y:16},200000,function(me){
7562
var mult=1;
7563
mult*=Game.GetTieredCpsMult(me);
7564
mult*=Game.magicCpS(me.name);
7565
return me.baseCps*mult;
7566
},function(){
7567
Game.UnlockTiered(this);
7568
if (this.amount>=Game.SpecialGrandmaUnlock && Game.Objects['Grandma'].amount>0) Game.Unlock(this.grandma.name);
7569
});
7570
7571
new Game.Object('Portal','portal|portals|retrieved|[X] dimension enslaved|[X] dimensions enslaved','Opens a door to the Cookieverse.',11,7,{base:'portal',xV:32,yV:32,w:64,rows:2,x:0,y:0},1666666,function(me){
7572
var mult=1;
7573
mult*=Game.GetTieredCpsMult(me);
7574
mult*=Game.magicCpS(me.name);
7575
return me.baseCps*mult;
7576
},function(){
7577
Game.UnlockTiered(this);
7578
if (this.amount>=Game.SpecialGrandmaUnlock && Game.Objects['Grandma'].amount>0) Game.Unlock(this.grandma.name);
7579
});
7580
7581
new Game.Object('Time machine','time machine|time machines|recovered|[X] century secured|[X] centuries secured','Brings cookies from the past, before they were even eaten.',12,8,{base:'timemachine',xV:32,yV:32,w:64,rows:1,x:0,y:0},123456789,function(me){
7582
var mult=1;
7583
mult*=Game.GetTieredCpsMult(me);
7584
mult*=Game.magicCpS(me.name);
7585
return me.baseCps*mult;
7586
},function(){
7587
Game.UnlockTiered(this);
7588
if (this.amount>=Game.SpecialGrandmaUnlock && Game.Objects['Grandma'].amount>0) Game.Unlock(this.grandma.name);
7589
});
7590
7591
new Game.Object('Antimatter condenser','antimatter condenser|antimatter condensers|condensed|[X] extra quark flavor|[X] extra quark flavors','Condenses the antimatter in the universe into cookies.',13,13,{base:'antimattercondenser',xV:0,yV:64,w:64,rows:1,x:0,y:0},3999999999,function(me){
7592
var mult=1;
7593
mult*=Game.GetTieredCpsMult(me);
7594
mult*=Game.magicCpS(me.name);
7595
return me.baseCps*mult;
7596
},function(){
7597
Game.UnlockTiered(this);
7598
if (this.amount>=Game.SpecialGrandmaUnlock && Game.Objects['Grandma'].amount>0) Game.Unlock(this.grandma.name);
7599
});
7600
Game.last.displayName='<span style="font-size:65%;position:relative;bottom:4px;">Antimatter condenser</span>';//shrink the name since it's so large
7601
7602
new Game.Object('Prism','prism|prisms|converted|[X] new color discovered|[X] new colors discovered','Converts light itself into cookies.',14,14,{base:'prism',xV:16,yV:4,w:64,rows:1,x:0,y:20},75000000000,function(me){
7603
var mult=1;
7604
mult*=Game.GetTieredCpsMult(me);
7605
mult*=Game.magicCpS(me.name);
7606
return me.baseCps*mult;
7607
},function(){
7608
Game.UnlockTiered(this);
7609
if (this.amount>=Game.SpecialGrandmaUnlock && Game.Objects['Grandma'].amount>0) Game.Unlock(this.grandma.name);
7610
});
7611
7612
new Game.Object('Chancemaker','chancemaker|chancemakers|spontaneously generated|Chancemakers are powered by [X]-leaf clovers|Chancemakers are powered by [X]-leaf clovers','Generates cookies out of thin air through sheer luck.',15,19,{base:'chancemaker',xV:8,yV:64,w:64,rows:1,x:0,y:0,rows:2},77777777777,function(me){
7613
var mult=1;
7614
mult*=Game.GetTieredCpsMult(me);
7615
mult*=Game.magicCpS(me.name);
7616
return me.baseCps*mult;
7617
},function(){
7618
Game.UnlockTiered(this);
7619
if (this.amount>=Game.SpecialGrandmaUnlock && Game.Objects['Grandma'].amount>0) Game.Unlock(this.grandma.name);
7620
});
7621
7622
new Game.Object('Fractal engine','fractal engine|fractal engines|made from cookies|[X] iteration deep|[X] iterations deep','Turns cookies into even more cookies.',16,20,{base:'fractalEngine',xV:8,yV:64,w:64,rows:1,x:0,y:0},12345678987654321,function(me){
7623
var mult=1;
7624
mult*=Game.GetTieredCpsMult(me);
7625
mult*=Game.magicCpS(me.name);
7626
return me.baseCps*mult;
7627
},function(){
7628
Game.UnlockTiered(this);
7629
if (this.amount>=Game.SpecialGrandmaUnlock && Game.Objects['Grandma'].amount>0) Game.Unlock(this.grandma.name);
7630
});
7631
7632
new Game.Object('Javascript console','javascript console|javascript consoles|programmed|Equipped with [X] external library|Equipped with [X] external libraries','Creates cookies from the very code this game was written in.',17,32,{base:'javascriptconsole',xV:8,yV:64,w:14,rows:1,x:8,y:-32,frames:2},12345678987654321,function(me){
7633
var mult=1;
7634
mult*=Game.GetTieredCpsMult(me);
7635
mult*=Game.magicCpS(me.name);
7636
return me.baseCps*mult;
7637
},function(){
7638
Game.UnlockTiered(this);
7639
if (this.amount>=Game.SpecialGrandmaUnlock && Game.Objects['Grandma'].amount>0) Game.Unlock(this.grandma.name);
7640
});
7641
Game.last.displayName='<span style="font-size:65%;position:relative;bottom:4px;">Javascript console</span>';//shrink the name since it's so large
7642
7643
7644
Game.foolObjects={
7645
'Unknown':{name:'Investment',desc:'You\'re not sure what this does, you just know it means profit.',icon:0},
7646
'Cursor':{name:'Rolling pin',desc:'Essential in flattening dough. The first step in cookie-making.',icon:0},
7647
'Grandma':{name:'Oven',desc:'A crucial element of baking cookies.',icon:1},
7648
'Farm':{name:'Kitchen',desc:'The more kitchens, the more cookies your employees can produce.',icon:2},
7649
'Mine':{name:'Secret recipe',desc:'These give you the edge you need to outsell those pesky competitors.',icon:3},
7650
'Factory':{name:'Factory',desc:'Mass production is the future of baking. Seize the day, and synergize!',icon:4},
7651
'Bank':{name:'Investor',desc:'Business folks with a nose for profit, ready to finance your venture as long as there\'s money to be made.',icon:5},
7652
'Temple':{name:'Like',desc:'Your social media page is going viral! Amassing likes is the key to a lasting online presence and juicy advertising deals.',icon:9},
7653
'Wizard tower':{name:'Meme',desc:'Cookie memes are all the rage! With just the right amount of social media astroturfing, your brand image will be all over the cyberspace.',icon:6},
7654
'Shipment':{name:'Supermarket',desc:'A gigantic cookie emporium - your very own retail chain.',icon:7},
7655
'Alchemy lab':{name:'Stock share',desc:'You\'re officially on the stock market, and everyone wants a piece!',icon:8},
7656
'Portal':{name:'TV show',desc:'Your cookies have their own sitcom! Hilarious baking hijinks set to the cheesiest laughtrack.',icon:10},
7657
'Time machine':{name:'Theme park',desc:'Cookie theme parks, full of mascots and roller-coasters. Build one, build a hundred!',icon:11},
7658
'Antimatter condenser':{name:'Cookiecoin',desc:'A virtual currency, already replacing regular money in some small countries.',icon:12},
7659
'Prism':{name:'Corporate country',desc:'You\'ve made it to the top, and you can now buy entire nations to further your corporate greed. Godspeed.',icon:13},
7660
'Chancemaker':{name:'Privatized planet',desc:'Actually, you know what\'s cool? A whole planet dedicated to producing, advertising, selling, and consuming your cookies.',icon:15},
7661
'Fractal engine':{name:'Senate seat',desc:'Only through political dominion can you truly alter this world to create a brighter, more cookie-friendly future.',icon:16},
7662
'Javascript console':{name:'Doctrine',desc:'Taking many forms -religion, culture, philosophy- a doctrine may, when handled properly, cause a lasting impact on civilizations, reshaping minds and people and ensuring all future generations share a singular goal - the production, and acquisition, of more cookies.',icon:17},
7663
};
7664
7665
7666
//build store
7667
Game.BuildStore();
7668
7669
//build master bar
7670
var str='';
7671
str+='<div id="buildingsMute" class="shadowFilter" style="position:relative;z-index:100;padding:4px 16px 0px 64px;"></div>';
7672
str+='<div class="separatorBottom" style="position:absolute;bottom:-8px;z-index:0;"></div>';
7673
l('buildingsMaster').innerHTML=str;
7674
7675
//build object displays
7676
var muteStr='<div style="position:absolute;left:8px;bottom:12px;opacity:0.5;">Muted :</div>';
7677
for (var i in Game.Objects)
7678
{
7679
var me=Game.Objects[i];
7680
if (me.id>0)
7681
{
7682
me.canvas=l('rowCanvas'+me.id);
7683
me.ctx=me.canvas.getContext('2d',{alpha:false});
7684
me.pics=[];
7685
var icon=[0*64,me.icon*64];
7686
muteStr+='<div class="tinyProductIcon" id="mutedProduct'+me.id+'" style="display:none;background-position:-'+icon[0]+'px -'+icon[1]+'px;" '+Game.clickStr+'="Game.ObjectsById['+me.id+'].mute(0);PlaySound(Game.ObjectsById['+me.id+'].muted?\'snd/clickOff.mp3\':\'snd/clickOn.mp3\');" '+Game.getDynamicTooltip('Game.mutedBuildingTooltip('+me.id+')','this')+'></div>';
7687
//muteStr+='<div class="tinyProductIcon" id="mutedProduct'+me.id+'" style="display:none;background-position:-'+icon[0]+'px -'+icon[1]+'px;" '+Game.clickStr+'="Game.ObjectsById['+me.id+'].mute(0);PlaySound(Game.ObjectsById['+me.id+'].muted?\'snd/clickOff.mp3\':\'snd/clickOn.mp3\');" '+Game.getTooltip('<div style="width:150px;text-align:center;font-size:11px;"><b>Unmute '+me.plural+'</b><br>(Display this building)</div>')+'></div>';
7688
7689
AddEvent(me.canvas,'mouseover',function(me){return function(){me.mouseOn=true;}}(me));
7690
AddEvent(me.canvas,'mouseout',function(me){return function(){me.mouseOn=false;}}(me));
7691
AddEvent(me.canvas,'mousemove',function(me){return function(e){var box=this.getBoundingClientRect();me.mousePos[0]=e.pageX-box.left;me.mousePos[1]=e.pageY-box.top;}}(me));
7692
}
7693
}
7694
Game.mutedBuildingTooltip=function(id)
7695
{
7696
return function(){
7697
var me=Game.ObjectsById[id];
7698
return '<div style="width:150px;text-align:center;font-size:11px;"><b>'+(me.plural.charAt(0).toUpperCase()+me.plural.slice(1))+(me.level>0?' (lvl.&nbsp;'+me.level+')':'')+'</b><div class="line"></div>Click to unmute '+me.plural+'<br>(display this building)</div>';
7699
}
7700
}
7701
l('buildingsMute').innerHTML=muteStr;
7702
7703
/*=====================================================================================
7704
UPGRADES
7705
=======================================================================================*/
7706
Game.upgradesToRebuild=1;
7707
Game.Upgrades=[];
7708
Game.UpgradesById=[];
7709
Game.UpgradesN=0;
7710
Game.UpgradesInStore=[];
7711
Game.UpgradesOwned=0;
7712
Game.Upgrade=function(name,desc,price,icon,buyFunction)
7713
{
7714
this.id=Game.UpgradesN;
7715
this.name=name;
7716
this.desc=desc;
7717
this.baseDesc=this.desc;
7718
this.desc=BeautifyInText(this.baseDesc);
7719
this.basePrice=price;
7720
this.priceLumps=0;//note : doesn't do much on its own, you still need to handle the buying yourself
7721
this.icon=icon;
7722
this.iconFunction=0;
7723
this.buyFunction=buyFunction;
7724
/*this.unlockFunction=unlockFunction;
7725
this.unlocked=(this.unlockFunction?0:1);*/
7726
this.unlocked=0;
7727
this.bought=0;
7728
this.order=this.id;
7729
if (order) this.order=order+this.id*0.001;
7730
this.pool='';//can be '', cookie, toggle, debug, prestige, prestigeDecor, tech, or unused
7731
if (pool) this.pool=pool;
7732
this.power=0;
7733
if (power) this.power=power;
7734
this.vanilla=Game.vanilla;
7735
this.unlockAt=0;
7736
this.techUnlock=[];
7737
this.parents=[];
7738
this.type='upgrade';
7739
this.tier=0;
7740
this.buildingTie=0;//of what building is this a tiered upgrade of ?
7741
7742
Game.last=this;
7743
Game.Upgrades[this.name]=this;
7744
Game.UpgradesById[this.id]=this;
7745
Game.UpgradesN++;
7746
return this;
7747
}
7748
7749
Game.Upgrade.prototype.getPrice=function()
7750
{
7751
var price=this.basePrice;
7752
if (this.priceFunc) price=this.priceFunc(this);
7753
if (price==0) return 0;
7754
if (this.pool!='prestige')
7755
{
7756
if (Game.Has('Toy workshop')) price*=0.95;
7757
if (Game.Has('Five-finger discount')) price*=Math.pow(0.99,Game.Objects['Cursor'].amount/100);
7758
if (Game.Has('Santa\'s dominion')) price*=0.98;
7759
if (Game.Has('Faberge egg')) price*=0.99;
7760
if (Game.Has('Divine sales')) price*=0.99;
7761
if (Game.Has('Fortune #100')) price*=0.99;
7762
if (Game.hasBuff('Haggler\'s luck')) price*=0.98;
7763
if (Game.hasBuff('Haggler\'s misery')) price*=1.02;
7764
//if (Game.hasAura('Master of the Armory')) price*=0.98;
7765
price*=1-Game.auraMult('Master of the Armory')*0.02;
7766
price*=Game.eff('upgradeCost');
7767
if (this.pool=='cookie' && Game.Has('Divine bakeries')) price/=5;
7768
}
7769
return Math.ceil(price);
7770
}
7771
7772
Game.Upgrade.prototype.canBuy=function()
7773
{
7774
if (this.canBuyFunc) return this.canBuyFunc();
7775
if (Game.cookies>=this.getPrice()) return true; else return false;
7776
}
7777
7778
Game.storeBuyAll=function()
7779
{
7780
if (!Game.Has('Inspired checklist')) return false;
7781
for (var i in Game.UpgradesInStore)
7782
{
7783
var me=Game.UpgradesInStore[i];
7784
if (!me.isVaulted() && me.pool!='toggle' && me.pool!='tech') me.buy(1);
7785
}
7786
}
7787
7788
Game.vault=[];
7789
Game.Upgrade.prototype.isVaulted=function()
7790
{
7791
if (Game.vault.indexOf(this.id)!=-1) return true; else return false;
7792
}
7793
Game.Upgrade.prototype.vault=function()
7794
{
7795
if (!this.isVaulted()) Game.vault.push(this.id);
7796
}
7797
Game.Upgrade.prototype.unvault=function()
7798
{
7799
if (this.isVaulted()) Game.vault.splice(Game.vault.indexOf(this.id),1);
7800
}
7801
7802
Game.Upgrade.prototype.click=function(e)
7803
{
7804
if ((e && e.shiftKey) || Game.keys[16])
7805
{
7806
if (this.pool=='toggle' || this.pool=='tech') {}
7807
else if (Game.Has('Inspired checklist'))
7808
{
7809
if (this.isVaulted()) this.unvault();
7810
else this.vault();
7811
Game.upgradesToRebuild=1;
7812
PlaySound('snd/tick.mp3');
7813
}
7814
}
7815
else this.buy();
7816
}
7817
7818
7819
Game.Upgrade.prototype.buy=function(bypass)
7820
{
7821
var success=0;
7822
var cancelPurchase=0;
7823
if (this.clickFunction && !bypass) cancelPurchase=!this.clickFunction();
7824
if (!cancelPurchase)
7825
{
7826
if (this.choicesFunction)
7827
{
7828
if (Game.choiceSelectorOn==this.id)
7829
{
7830
l('toggleBox').style.display='none';
7831
l('toggleBox').innerHTML='';
7832
Game.choiceSelectorOn=-1;
7833
PlaySound('snd/tick.mp3');
7834
}
7835
else
7836
{
7837
Game.choiceSelectorOn=this.id;
7838
var choices=this.choicesFunction();
7839
if (choices.length>0)
7840
{
7841
var selected=0;
7842
for (var i in choices) {if (choices[i].selected) selected=i;}
7843
Game.choiceSelectorChoices=choices;//this is a really dumb way of doing this i am so sorry
7844
Game.choiceSelectorSelected=selected;
7845
var str='';
7846
str+='<div class="close" onclick="Game.UpgradesById['+this.id+'].buy();">x</div>';
7847
str+='<h3>'+this.name+'</h3>'+
7848
'<div class="line"></div>'+
7849
'<h4 id="choiceSelectedName">'+choices[selected].name+'</h4>'+
7850
'<div class="line"></div>';
7851
7852
for (var i in choices)
7853
{
7854
var icon=choices[i].icon;
7855
str+='<div class="crate enabled'+(i==selected?' highlighted':'')+'" style="opacity:1;float:none;display:inline-block;'+(icon[2]?'background-image:url('+icon[2]+');':'')+'background-position:'+(-icon[0]*48)+'px '+(-icon[1]*48)+'px;" '+Game.clickStr+'="Game.UpgradesById['+this.id+'].choicesPick('+i+');PlaySound(\'snd/tick.mp3\');Game.choiceSelectorOn=-1;Game.UpgradesById['+this.id+'].buy();" onMouseOut="l(\'choiceSelectedName\').innerHTML=Game.choiceSelectorChoices[Game.choiceSelectorSelected].name;" onMouseOver="l(\'choiceSelectedName\').innerHTML=Game.choiceSelectorChoices['+i+'].name;"'+
7856
'></div>';
7857
}
7858
}
7859
l('toggleBox').innerHTML=str;
7860
l('toggleBox').style.display='block';
7861
l('toggleBox').focus();
7862
Game.tooltip.hide();
7863
PlaySound('snd/tick.mp3');
7864
success=1;
7865
}
7866
}
7867
else if (this.pool!='prestige')
7868
{
7869
var price=this.getPrice();
7870
if (this.canBuy() && !this.bought)
7871
{
7872
Game.Spend(price);
7873
this.bought=1;
7874
if (this.buyFunction) this.buyFunction();
7875
if (this.toggleInto)
7876
{
7877
Game.Lock(this.toggleInto);
7878
Game.Unlock(this.toggleInto);
7879
}
7880
Game.upgradesToRebuild=1;
7881
Game.recalculateGains=1;
7882
if (Game.CountsAsUpgradeOwned(this.pool)) Game.UpgradesOwned++;
7883
Game.setOnCrate(0);
7884
Game.tooltip.hide();
7885
PlaySound('snd/buy'+choose([1,2,3,4])+'.mp3',0.75);
7886
success=1;
7887
}
7888
}
7889
else
7890
{
7891
var price=this.getPrice();
7892
if (Game.heavenlyChips>=price && !this.bought)
7893
{
7894
Game.heavenlyChips-=price;
7895
Game.heavenlyChipsSpent+=price;
7896
this.unlocked=1;
7897
this.bought=1;
7898
if (this.buyFunction) this.buyFunction();
7899
Game.BuildAscendTree();
7900
PlaySound('snd/buy'+choose([1,2,3,4])+'.mp3',0.75);
7901
PlaySound('snd/shimmerClick.mp3');
7902
//PlaySound('snd/buyHeavenly.mp3');
7903
success=1;
7904
}
7905
}
7906
}
7907
if (this.bought && this.activateFunction) this.activateFunction();
7908
return success;
7909
}
7910
Game.Upgrade.prototype.earn=function()//just win the upgrades without spending anything
7911
{
7912
this.unlocked=1;
7913
this.bought=1;
7914
if (this.buyFunction) this.buyFunction();
7915
Game.upgradesToRebuild=1;
7916
Game.recalculateGains=1;
7917
if (Game.CountsAsUpgradeOwned(this.pool)) Game.UpgradesOwned++;
7918
}
7919
Game.Upgrade.prototype.unearn=function()//remove the upgrade, but keep it unlocked
7920
{
7921
this.bought=0;
7922
Game.upgradesToRebuild=1;
7923
Game.recalculateGains=1;
7924
if (Game.CountsAsUpgradeOwned(this.pool)) Game.UpgradesOwned--;
7925
}
7926
Game.Upgrade.prototype.unlock=function()
7927
{
7928
this.unlocked=1;
7929
Game.upgradesToRebuild=1;
7930
}
7931
Game.Upgrade.prototype.lose=function()
7932
{
7933
this.unlocked=0;
7934
this.bought=0;
7935
Game.upgradesToRebuild=1;
7936
Game.recalculateGains=1;
7937
if (Game.CountsAsUpgradeOwned(this.pool)) Game.UpgradesOwned--;
7938
}
7939
Game.Upgrade.prototype.toggle=function()//cheating only
7940
{
7941
if (!this.bought)
7942
{
7943
this.bought=1;
7944
if (this.buyFunction) this.buyFunction();
7945
Game.upgradesToRebuild=1;
7946
Game.recalculateGains=1;
7947
if (Game.CountsAsUpgradeOwned(this.pool)) Game.UpgradesOwned++;
7948
PlaySound('snd/buy'+choose([1,2,3,4])+'.mp3',0.75);
7949
if (this.pool=='prestige' || this.pool=='debug') PlaySound('snd/shimmerClick.mp3');
7950
}
7951
else
7952
{
7953
this.bought=0;
7954
Game.upgradesToRebuild=1;
7955
Game.recalculateGains=1;
7956
if (Game.CountsAsUpgradeOwned(this.pool)) Game.UpgradesOwned--;
7957
PlaySound('snd/sell'+choose([1,2,3,4])+'.mp3',0.75);
7958
if (this.pool=='prestige' || this.pool=='debug') PlaySound('snd/shimmerClick.mp3');
7959
}
7960
if (Game.onMenu=='stats') Game.UpdateMenu();
7961
}
7962
7963
Game.CountsAsUpgradeOwned=function(pool)
7964
{
7965
if (pool=='' || pool=='cookie' || pool=='tech') return true; else return false;
7966
}
7967
7968
/*AddEvent(l('toggleBox'),'blur',function()//if we click outside of the selector, close it
7969
{
7970
//this has a couple problems, such as when clicking on the upgrade - this toggles it off and back on instantly
7971
l('toggleBox').style.display='none';
7972
l('toggleBox').innerHTML='';
7973
Game.choiceSelectorOn=-1;
7974
}
7975
);*/
7976
7977
Game.RequiresConfirmation=function(upgrade,prompt)
7978
{
7979
upgrade.clickFunction=function(){Game.Prompt(prompt,[['Yes','Game.UpgradesById['+upgrade.id+'].buy(1);Game.ClosePrompt();'],'No']);return false;};
7980
}
7981
7982
Game.Unlock=function(what)
7983
{
7984
if (typeof what==='string')
7985
{
7986
if (Game.Upgrades[what])
7987
{
7988
if (Game.Upgrades[what].unlocked==0)
7989
{
7990
Game.Upgrades[what].unlocked=1;
7991
Game.upgradesToRebuild=1;
7992
Game.recalculateGains=1;
7993
/*if (Game.prefs.popups) {}
7994
else Game.Notify('Upgrade unlocked','<div class="title" style="font-size:18px;margin-top:-2px;">'+Game.Upgrades[what].name+'</div>',Game.Upgrades[what].icon,6);*/
7995
}
7996
}
7997
}
7998
else {for (var i in what) {Game.Unlock(what[i]);}}
7999
}
8000
Game.Lock=function(what)
8001
{
8002
if (typeof what==='string')
8003
{
8004
if (Game.Upgrades[what])
8005
{
8006
Game.Upgrades[what].unlocked=0;
8007
Game.upgradesToRebuild=1;
8008
if (Game.Upgrades[what].bought==1 && Game.CountsAsUpgradeOwned(Game.Upgrades[what].pool)) Game.UpgradesOwned--;
8009
Game.Upgrades[what].bought=0;
8010
Game.recalculateGains=1;
8011
}
8012
}
8013
else {for (var i in what) {Game.Lock(what[i]);}}
8014
}
8015
8016
Game.Has=function(what)
8017
{
8018
var it=Game.Upgrades[what];
8019
if (Game.ascensionMode==1 && (it.pool=='prestige' || it.tier=='fortune')) return 0;
8020
return (it?it.bought:0);
8021
}
8022
Game.HasUnlocked=function(what)
8023
{
8024
return (Game.Upgrades[what]?Game.Upgrades[what].unlocked:0);
8025
}
8026
8027
8028
Game.RebuildUpgrades=function()//recalculate the upgrades you can buy
8029
{
8030
Game.upgradesToRebuild=0;
8031
var list=[];
8032
for (var i in Game.Upgrades)
8033
{
8034
var me=Game.Upgrades[i];
8035
if (!me.bought && me.pool!='debug' && me.pool!='prestige' && me.pool!='prestigeDecor' && (Game.ascensionMode!=1 || (!me.lasting && me.tier!='fortune')))
8036
{
8037
if (me.unlocked) list.push(me);
8038
}
8039
else if (me.displayFuncWhenOwned && me.bought) list.push(me);
8040
}
8041
var sortMap=function(a,b)
8042
{
8043
var ap=a.pool=='toggle'?a.order:a.getPrice();
8044
var bp=b.pool=='toggle'?b.order:b.getPrice();
8045
if (ap>bp) return 1;
8046
else if (ap<bp) return -1;
8047
else return 0;
8048
}
8049
list.sort(sortMap);
8050
8051
Game.UpgradesInStore=[];
8052
for (var i in list)
8053
{
8054
Game.UpgradesInStore.push(list[i]);
8055
}
8056
var storeStr='';
8057
var toggleStr='';
8058
var techStr='';
8059
var vaultStr='';
8060
8061
if (Game.Has('Inspired checklist'))
8062
{
8063
storeStr+='<div id="storeBuyAll" class="storePre" '+Game.getTooltip(
8064
'<div style="padding:8px;min-width:250px;text-align:center;font-size:11px;">Will <b>instantly purchase</b> every upgrade you can afford, starting from the cheapest one.<br>Upgrades in the <b>vault</b> will not be auto-purchased.<br>You may place an upgrade into the vault by <b>Shift-clicking</b> on it.</div>'
8065
,'store')+
8066
'>'+
8067
'<div id="storeBuyAllButton" class="storePreButton" '+Game.clickStr+'="Game.storeBuyAll();">Buy all upgrades</div>'+
8068
'</div>';
8069
l('upgrades').classList.add('hasMenu');
8070
}
8071
else l('upgrades').classList.remove('hasMenu');
8072
8073
for (var i in Game.UpgradesInStore)
8074
{
8075
//if (!Game.UpgradesInStore[i]) break;
8076
var me=Game.UpgradesInStore[i];
8077
var str=Game.crate(me,'store','Game.UpgradesById['+me.id+'].click(event);','upgrade'+i);
8078
8079
/*var str='<div class="crate upgrade" '+Game.getTooltip(
8080
'<div style="min-width:200px;"><div style="float:right;"><span class="price">'+Beautify(Math.round(me.getPrice()))+'</span></div><small>'+(me.pool=='toggle'?'[Togglable]':'[Upgrade]')+'</small><div class="name">'+me.name+'</div><div class="line"></div><div class="description">'+me.desc+'</div></div>'
8081
,'store')+' '+Game.clickStr+'="Game.UpgradesById['+me.id+'].buy();" id="upgrade'+i+'" style="'+(me.icon[2]?'background-image:url('+me.icon[2]+');':'')+'background-position:'+(-me.icon[0]*48)+'px '+(-me.icon[1]*48)+'px;"></div>';*/
8082
if (me.pool=='toggle') toggleStr+=str; else if (me.pool=='tech') techStr+=str; else
8083
{
8084
if (me.isVaulted() && Game.Has('Inspired checklist')) vaultStr+=str; else storeStr+=str;
8085
}
8086
}
8087
8088
l('upgrades').innerHTML=storeStr;
8089
l('toggleUpgrades').innerHTML=toggleStr;
8090
if (toggleStr=='') l('toggleUpgrades').style.display='none'; else l('toggleUpgrades').style.display='block';
8091
l('techUpgrades').innerHTML=techStr;
8092
if (techStr=='') l('techUpgrades').style.display='none'; else l('techUpgrades').style.display='block';
8093
l('vaultUpgrades').innerHTML=vaultStr;
8094
if (vaultStr=='') l('vaultUpgrades').style.display='none'; else l('vaultUpgrades').style.display='block';
8095
}
8096
8097
Game.UnlockAt=[];//this contains an array of every upgrade with a cookie requirement in the form of {cookies:(amount of cookies earned required),name:(name of upgrade or achievement to unlock)} (and possibly require:(name of upgrade of achievement to own))
8098
//note : the cookie will not be added to the list if it contains locked:1 (use for seasonal cookies and such)
8099
8100
Game.NewUpgradeCookie=function(obj)
8101
{
8102
var upgrade=new Game.Upgrade(obj.name,'Cookie production multiplier <b>+'+Beautify((typeof(obj.power)=='function'?obj.power(obj):obj.power),1)+'%</b>.<q>'+obj.desc+'</q>',obj.price,obj.icon);
8103
upgrade.power=obj.power;
8104
upgrade.pool='cookie';
8105
var toPush={cookies:obj.price/20,name:obj.name};
8106
if (obj.require) toPush.require=obj.require;
8107
if (obj.season) toPush.season=obj.season;
8108
if (!obj.locked) Game.UnlockAt.push(toPush);
8109
return upgrade;
8110
}
8111
8112
//tiered upgrades system
8113
//each building has several upgrade tiers
8114
//all upgrades in the same tier have the same color, unlock threshold and price multiplier
8115
Game.Tiers={
8116
1:{name:'Plain',unlock:1,achievUnlock:1,iconRow:0,color:'#ccb3ac',price: 10},
8117
2:{name:'Berrylium',unlock:5,achievUnlock:50,iconRow:1,color:'#ff89e7',price: 50},
8118
3:{name:'Blueberrylium',unlock:25,achievUnlock:100,iconRow:2,color:'#00deff',price: 500},
8119
4:{name:'Chalcedhoney',unlock:50,achievUnlock:150,iconRow:13,color:'#ffcc2f',price: 50000},
8120
5:{name:'Buttergold',unlock:100,achievUnlock:200,iconRow:14,color:'#e9d673',price: 5000000},
8121
6:{name:'Sugarmuck',unlock:150,achievUnlock:250,iconRow:15,color:'#a8bf91',price: 500000000},
8122
7:{name:'Jetmint',unlock:200,achievUnlock:300,iconRow:16,color:'#60ff50',price: 500000000000},
8123
8:{name:'Cherrysilver',unlock:250,achievUnlock:350,iconRow:17,color:'#f01700',price: 500000000000000},
8124
9:{name:'Hazelrald',unlock:300,achievUnlock:400,iconRow:18,color:'#9ab834',price: 500000000000000000},
8125
10:{name:'Mooncandy',unlock:350,achievUnlock:450,iconRow:19,color:'#7e7ab9',price: 500000000000000000000},
8126
11:{name:'Astrofudge',unlock:400,achievUnlock:500,iconRow:28,color:'#9a3316',price: 5000000000000000000000000},
8127
12:{name:'Alabascream',unlock:450,achievUnlock:550,iconRow:30,color:'#c1a88c',price: 50000000000000000000000000000},
8128
13:{name:'Iridyum',unlock:500,achievUnlock:600,iconRow:31,color:'#adb1b3',price: 500000000000000000000000000000000},
8129
'synergy1':{name:'Synergy I',unlock:15,iconRow:20,color:'#008595',special:1,req:'Synergies Vol. I',price: 200000},
8130
'synergy2':{name:'Synergy II',unlock:75,iconRow:29,color:'#008595',special:1,req:'Synergies Vol. II',price: 200000000000},
8131
'fortune':{name:'Fortune',unlock:-1,iconRow:32,color:'#9ab834',special:1,price: 77777777777777777777777777777},
8132
};
8133
for (var i in Game.Tiers){Game.Tiers[i].upgrades=[];}
8134
Game.GetIcon=function(type,tier)
8135
{
8136
var col=0;
8137
if (type=='Kitten') col=18; else col=Game.Objects[type].iconColumn;
8138
return [col,Game.Tiers[tier].iconRow];
8139
}
8140
Game.SetTier=function(building,tier)
8141
{
8142
if (!Game.Objects[building]) alert('No building named '+building);
8143
Game.last.tier=tier;
8144
Game.last.buildingTie=Game.Objects[building];
8145
if (Game.last.type=='achievement') Game.Objects[building].tieredAchievs[tier]=Game.last;
8146
else Game.Objects[building].tieredUpgrades[tier]=Game.last;
8147
}
8148
Game.MakeTiered=function(upgrade,tier,col)
8149
{
8150
upgrade.tier=tier;
8151
if (typeof col!=='undefined') upgrade.icon=[col,Game.Tiers[tier].iconRow];
8152
}
8153
Game.TieredUpgrade=function(name,desc,building,tier)
8154
{
8155
var upgrade=new Game.Upgrade(name,desc,Game.Objects[building].basePrice*Game.Tiers[tier].price,Game.GetIcon(building,tier));
8156
Game.SetTier(building,tier);
8157
if (!upgrade.buildingTie1 && building) upgrade.buildingTie1=Game.Objects[building];
8158
if (tier=='fortune' && building) Game.Objects[building].fortune=upgrade;
8159
return upgrade;
8160
}
8161
Game.SynergyUpgrade=function(name,desc,building1,building2,tier)
8162
{
8163
/*
8164
creates a new upgrade that :
8165
-unlocks when you have tier.unlock of building1 and building2
8166
-is priced at (building1.price*10+building2.price*1)*tier.price (formerly : Math.sqrt(building1.price*building2.price)*tier.price)
8167
-gives +(0.1*building1)% cps to building2 and +(5*building2)% cps to building1
8168
-if building2 is below building1 in worth, swap them
8169
*/
8170
//if (Game.Objects[building1].basePrice>Game.Objects[building2].basePrice) {var temp=building2;building2=building1;building1=temp;}
8171
var b1=Game.Objects[building1];
8172
var b2=Game.Objects[building2];
8173
if (b1.basePrice>b2.basePrice) {b1=Game.Objects[building2];b2=Game.Objects[building1];}//swap
8174
8175
desc=
8176
(b1.plural.charAt(0).toUpperCase()+b1.plural.slice(1))+' gain <b>+5% CpS</b> per '+b2.name.toLowerCase()+'.<br>'+
8177
(b2.plural.charAt(0).toUpperCase()+b2.plural.slice(1))+' gain <b>+0.1% CpS</b> per '+b1.name.toLowerCase()+'.'+
8178
desc;
8179
var upgrade=new Game.Upgrade(name,desc,(b1.basePrice*10+b2.basePrice*1)*Game.Tiers[tier].price,Game.GetIcon(building1,tier));//Math.sqrt(b1.basePrice*b2.basePrice)*Game.Tiers[tier].price
8180
upgrade.tier=tier;
8181
upgrade.buildingTie1=b1;
8182
upgrade.buildingTie2=b2;
8183
upgrade.priceFunc=function(){return (this.buildingTie1.basePrice*10+this.buildingTie2.basePrice*1)*Game.Tiers[this.tier].price*(Game.Has('Chimera')?0.98:1);};
8184
Game.Objects[building1].synergies.push(upgrade);
8185
Game.Objects[building2].synergies.push(upgrade);
8186
//Game.SetTier(building1,tier);
8187
return upgrade;
8188
}
8189
Game.GetTieredCpsMult=function(me)
8190
{
8191
var mult=1;
8192
for (var i in me.tieredUpgrades) {if (!Game.Tiers[me.tieredUpgrades[i].tier].special && Game.Has(me.tieredUpgrades[i].name)) mult*=2;}
8193
for (var i in me.synergies)
8194
{
8195
var syn=me.synergies[i];
8196
if (Game.Has(syn.name))
8197
{
8198
if (syn.buildingTie1.name==me.name) mult*=(1+0.05*syn.buildingTie2.amount);
8199
else if (syn.buildingTie2.name==me.name) mult*=(1+0.001*syn.buildingTie1.amount);
8200
}
8201
}
8202
if (me.fortune && Game.Has(me.fortune.name)) mult*=1.07;
8203
if (me.grandma && Game.Has(me.grandma.name)) mult*=(1+Game.Objects['Grandma'].amount*0.01*(1/(me.id-1)));
8204
return mult;
8205
}
8206
Game.UnlockTiered=function(me)
8207
{
8208
for (var i in me.tieredUpgrades) {if (Game.Tiers[me.tieredUpgrades[i].tier].unlock!=-1 && me.amount>=Game.Tiers[me.tieredUpgrades[i].tier].unlock) Game.Unlock(me.tieredUpgrades[i].name);}
8209
for (var i in me.tieredAchievs) {if (me.amount>=Game.Tiers[me.tieredAchievs[i].tier].achievUnlock) Game.Win(me.tieredAchievs[i].name);}
8210
for (var i in me.synergies) {var syn=me.synergies[i];if (Game.Has(Game.Tiers[syn.tier].req) && syn.buildingTie1.amount>=Game.Tiers[syn.tier].unlock && syn.buildingTie2.amount>=Game.Tiers[syn.tier].unlock) Game.Unlock(syn.name);}
8211
}
8212
8213
8214
8215
var pool='';
8216
var power=0;
8217
8218
//define upgrades
8219
//WARNING : do NOT add new upgrades in between, this breaks the saves. Add them at the end !
8220
var order=100;//this is used to set the order in which the items are listed
8221
new Game.Upgrade('Reinforced index finger','The mouse and cursors are <b>twice</b> as efficient.<q>prod prod</q>',100,[0,0]);Game.MakeTiered(Game.last,1,0);
8222
new Game.Upgrade('Carpal tunnel prevention cream','The mouse and cursors are <b>twice</b> as efficient.<q>it... it hurts to click...</q>',500,[0,1]);Game.MakeTiered(Game.last,2,0);
8223
new Game.Upgrade('Ambidextrous','The mouse and cursors are <b>twice</b> as efficient.<q>Look ma, both hands!</q>',10000,[0,2]);Game.MakeTiered(Game.last,3,0);
8224
new Game.Upgrade('Thousand fingers','The mouse and cursors gain <b>+0.1</b> cookies for each non-cursor object owned.<q>clickity</q>',100000,[0,13]);Game.MakeTiered(Game.last,4,0);
8225
new Game.Upgrade('Million fingers','The mouse and cursors gain <b>+0.5</b> cookies for each non-cursor object owned.<q>clickityclickity</q>',10000000,[0,14]);Game.MakeTiered(Game.last,5,0);
8226
new Game.Upgrade('Billion fingers','The mouse and cursors gain <b>+5</b> cookies for each non-cursor object owned.<q>clickityclickityclickity</q>',100000000,[0,15]);Game.MakeTiered(Game.last,6,0);
8227
new Game.Upgrade('Trillion fingers','The mouse and cursors gain <b>+50</b> cookies for each non-cursor object owned.<q>clickityclickityclickityclickity</q>',1000000000,[0,16]);Game.MakeTiered(Game.last,7,0);
8228
8229
order=200;
8230
new Game.TieredUpgrade('Forwards from grandma','Grandmas are <b>twice</b> as efficient.<q>RE:RE:thought you\'d get a kick out of this ;))</q>','Grandma',1);
8231
new Game.TieredUpgrade('Steel-plated rolling pins','Grandmas are <b>twice</b> as efficient.<q>Just what you kneaded.</q>','Grandma',2);
8232
new Game.TieredUpgrade('Lubricated dentures','Grandmas are <b>twice</b> as efficient.<q>squish</q>','Grandma',3);
8233
8234
order=300;
8235
new Game.TieredUpgrade('Cheap hoes','Farms are <b>twice</b> as efficient.<q>Rake in the dough!</q>','Farm',1);
8236
new Game.TieredUpgrade('Fertilizer','Farms are <b>twice</b> as efficient.<q>It\'s chocolate, I swear.</q>','Farm',2);
8237
new Game.TieredUpgrade('Cookie trees','Farms are <b>twice</b> as efficient.<q>A relative of the breadfruit.</q>','Farm',3);
8238
8239
order=500;
8240
new Game.TieredUpgrade('Sturdier conveyor belts','Factories are <b>twice</b> as efficient.<q>You\'re going places.</q>','Factory',1);
8241
new Game.TieredUpgrade('Child labor','Factories are <b>twice</b> as efficient.<q>Cheaper, healthier workforce.</q>','Factory',2);
8242
new Game.TieredUpgrade('Sweatshop','Factories are <b>twice</b> as efficient.<q>Slackers will be terminated.</q>','Factory',3);
8243
8244
order=400;
8245
new Game.TieredUpgrade('Sugar gas','Mines are <b>twice</b> as efficient.<q>A pink, volatile gas, found in the depths of some chocolate caves.</q>','Mine',1);
8246
new Game.TieredUpgrade('Megadrill','Mines are <b>twice</b> as efficient.<q>You\'re in deep.</q>','Mine',2);
8247
new Game.TieredUpgrade('Ultradrill','Mines are <b>twice</b> as efficient.<q>Finally caved in?</q>','Mine',3);
8248
8249
order=600;
8250
new Game.TieredUpgrade('Vanilla nebulae','Shipments are <b>twice</b> as efficient.<q>If you removed your space helmet, you could probably smell it!<br>(Note : don\'t do that.)</q>','Shipment',1);
8251
new Game.TieredUpgrade('Wormholes','Shipments are <b>twice</b> as efficient.<q>By using these as shortcuts, your ships can travel much faster.</q>','Shipment',2);
8252
new Game.TieredUpgrade('Frequent flyer','Shipments are <b>twice</b> as efficient.<q>Come back soon!</q>','Shipment',3);
8253
8254
order=700;
8255
new Game.TieredUpgrade('Antimony','Alchemy labs are <b>twice</b> as efficient.<q>Actually worth a lot of mony.</q>','Alchemy lab',1);
8256
new Game.TieredUpgrade('Essence of dough','Alchemy labs are <b>twice</b> as efficient.<q>Extracted through the 5 ancient steps of alchemical baking.</q>','Alchemy lab',2);
8257
new Game.TieredUpgrade('True chocolate','Alchemy labs are <b>twice</b> as efficient.<q>The purest form of cacao.</q>','Alchemy lab',3);
8258
8259
order=800;
8260
new Game.TieredUpgrade('Ancient tablet','Portals are <b>twice</b> as efficient.<q>A strange slab of peanut brittle, holding an ancient cookie recipe. Neat!</q>','Portal',1);
8261
new Game.TieredUpgrade('Insane oatling workers','Portals are <b>twice</b> as efficient.<q>ARISE, MY MINIONS!</q>','Portal',2);
8262
new Game.TieredUpgrade('Soul bond','Portals are <b>twice</b> as efficient.<q>So I just sign up and get more cookies? Sure, whatever!</q>','Portal',3);
8263
8264
order=900;
8265
new Game.TieredUpgrade('Flux capacitors','Time machines are <b>twice</b> as efficient.<q>Bake to the future.</q>','Time machine',1);
8266
new Game.TieredUpgrade('Time paradox resolver','Time machines are <b>twice</b> as efficient.<q>No more fooling around with your own grandmother!</q>','Time machine',2);
8267
new Game.TieredUpgrade('Quantum conundrum','Time machines are <b>twice</b> as efficient.<q>There is only one constant, and that is universal uncertainty.<br>Or is it?</q>','Time machine',3);
8268
8269
order=20000;
8270
new Game.Upgrade('Kitten helpers','You gain <b>more CpS</b> the more milk you have.<q>meow may I help you</q>',9000000,Game.GetIcon('Kitten',1));Game.last.kitten=1;Game.MakeTiered(Game.last,1,18);
8271
new Game.Upgrade('Kitten workers','You gain <b>more CpS</b> the more milk you have.<q>meow meow meow meow</q>',9000000000,Game.GetIcon('Kitten',2));Game.last.kitten=1;Game.MakeTiered(Game.last,2,18);
8272
8273
order=10000;
8274
Game.NewUpgradeCookie({name:'Plain cookies',desc:'We all gotta start somewhere.',icon:[2,3],power: 1, price: 999999});
8275
Game.NewUpgradeCookie({name:'Sugar cookies',desc:'Tasty, if a little unimaginative.',icon:[7,3],power: 1, price: 999999*5});
8276
Game.NewUpgradeCookie({name:'Oatmeal raisin cookies',desc:'No raisin to hate these.',icon:[0,3],power: 1, price: 9999999});
8277
Game.NewUpgradeCookie({name:'Peanut butter cookies',desc:'Get yourself some jam cookies!',icon:[1,3],power: 1, price: 9999999*5});
8278
Game.NewUpgradeCookie({name:'Coconut cookies',desc:'Flaky, but not unreliable. Some people go crazy for these.',icon:[3,3],power: 2, price: 99999999});
8279
order=10001;
8280
Game.NewUpgradeCookie({name:'White chocolate cookies',desc:'I know what you\'ll say. It\'s just cocoa butter! It\'s not real chocolate!<br>Oh please.',icon:[4,3],power:2, price: 99999999*5});
8281
Game.NewUpgradeCookie({name:'Macadamia nut cookies',desc:'They\'re macadamn delicious!',icon:[5,3],power: 2, price: 999999999});
8282
Game.NewUpgradeCookie({name:'Double-chip cookies',desc:'DOUBLE THE CHIPS<br>DOUBLE THE TASTY<br>(double the calories)',icon:[6,3],power:2, price: 999999999*5});
8283
Game.NewUpgradeCookie({name:'White chocolate macadamia nut cookies',desc:'Orteil\'s favorite.',icon:[8,3],power: 2, price: 9999999999});
8284
Game.NewUpgradeCookie({name:'All-chocolate cookies',desc:'CHOCOVERDOSE.',icon:[9,3],power: 2, price: 9999999999*5});
8285
8286
order=100;
8287
new Game.Upgrade('Quadrillion fingers','The mouse and cursors gain <b>+500</b> cookies for each non-cursor object owned.<q>clickityclickityclickityclickityclick</q>',10000000000,[0,17]);Game.MakeTiered(Game.last,8,0);
8288
8289
order=200;new Game.TieredUpgrade('Prune juice','Grandmas are <b>twice</b> as efficient.<q>Gets me going.</q>','Grandma',4);
8290
order=300;new Game.TieredUpgrade('Genetically-modified cookies','Farms are <b>twice</b> as efficient.<q>All-natural mutations.</q>','Farm',4);
8291
order=500;new Game.TieredUpgrade('Radium reactors','Factories are <b>twice</b> as efficient.<q>Gives your cookies a healthy glow.</q>','Factory',4);
8292
order=400;new Game.TieredUpgrade('Ultimadrill','Mines are <b>twice</b> as efficient.<q>Pierce the heavens, etc.</q>','Mine',4);
8293
order=600;new Game.TieredUpgrade('Warp drive','Shipments are <b>twice</b> as efficient.<q>To boldly bake.</q>','Shipment',4);
8294
order=700;new Game.TieredUpgrade('Ambrosia','Alchemy labs are <b>twice</b> as efficient.<q>Adding this to the cookie mix is sure to make them even more addictive!<br>Perhaps dangerously so.<br>Let\'s hope you can keep selling these legally.</q>','Alchemy lab',4);
8295
order=800;new Game.TieredUpgrade('Sanity dance','Portals are <b>twice</b> as efficient.<q>We can change if we want to.<br>We can leave our brains behind.</q>','Portal',4);
8296
order=900;new Game.TieredUpgrade('Causality enforcer','Time machines are <b>twice</b> as efficient.<q>What happened, happened.</q>','Time machine',4);
8297
8298
order=5000;
8299
new Game.Upgrade('Lucky day','Golden cookies appear <b>twice as often</b> and stay <b>twice as long</b>.<q>Oh hey, a four-leaf penny!</q>',777777777,[27,6]);
8300
new Game.Upgrade('Serendipity','Golden cookies appear <b>twice as often</b> and stay <b>twice as long</b>.<q>What joy! Seven horseshoes!</q>',77777777777,[27,6]);
8301
8302
order=20000;
8303
new Game.Upgrade('Kitten engineers','You gain <b>more CpS</b> the more milk you have.<q>meow meow meow meow, sir</q>',90000000000000,Game.GetIcon('Kitten',3));Game.last.kitten=1;Game.MakeTiered(Game.last,3,18);
8304
8305
order=10020;
8306
Game.NewUpgradeCookie({name:'Dark chocolate-coated cookies',desc:'These absorb light so well you almost need to squint to see them.',icon:[10,3],power: 4, price: 99999999999});
8307
Game.NewUpgradeCookie({name:'White chocolate-coated cookies',desc:'These dazzling cookies absolutely glisten with flavor.',icon:[11,3],power: 4, price: 99999999999});
8308
8309
Game.GrandmaSynergies=[];
8310
Game.GrandmaSynergy=function(name,desc,building)
8311
{
8312
var building=Game.Objects[building];
8313
var grandmaNumber=(building.id-1);
8314
if (grandmaNumber==1) grandmaNumber='grandma';
8315
else grandmaNumber+=' grandmas';
8316
desc='Grandmas are <b>twice</b> as efficient. '+(building.plural.charAt(0).toUpperCase()+building.plural.slice(1))+' gain <b>+1% CpS</b> per '+grandmaNumber+'.<q>'+desc+'</q>';
8317
8318
var upgrade=new Game.Upgrade(name,desc,building.basePrice*Game.Tiers[2].price,[10,9],function(){Game.Objects['Grandma'].redraw();});
8319
building.grandma=upgrade;
8320
upgrade.buildingTie=building;
8321
Game.GrandmaSynergies.push(upgrade.name);
8322
return upgrade;
8323
}
8324
8325
order=250;
8326
Game.GrandmaSynergy('Farmer grandmas','A nice farmer to grow more cookies.','Farm');
8327
Game.GrandmaSynergy('Miner grandmas','A nice miner to dig more cookies.','Mine');
8328
Game.GrandmaSynergy('Worker grandmas','A nice worker to manufacture more cookies.','Factory');
8329
Game.GrandmaSynergy('Cosmic grandmas','A nice thing to... uh... cookies.','Shipment');
8330
Game.GrandmaSynergy('Transmuted grandmas','A nice golden grandma to convert into more cookies.','Alchemy lab');
8331
Game.GrandmaSynergy('Altered grandmas','a NiCe GrAnDmA tO bA##########','Portal');
8332
Game.GrandmaSynergy('Grandmas\' grandmas','A nice grandma\'s nice grandma to bake double the cookies.','Time machine');
8333
8334
order=14000;
8335
Game.baseResearchTime=Game.fps*60*30;
8336
Game.SetResearch=function(what,time)
8337
{
8338
if (Game.Upgrades[what] && !Game.Has(what))
8339
{
8340
Game.researchT=Game.baseResearchTime;
8341
if (Game.Has('Persistent memory')) Game.researchT=Math.ceil(Game.baseResearchTime/10);
8342
if (Game.Has('Ultrascience')) Game.researchT=Game.fps*5;
8343
Game.nextResearch=Game.Upgrades[what].id;
8344
if (Game.prefs.popups) Game.Popup('Research has begun.');
8345
else Game.Notify('Research has begun','Your bingo center/research facility is conducting experiments.',[9,0]);
8346
}
8347
}
8348
8349
new Game.Upgrade('Bingo center/Research facility','Grandma-operated science lab and leisure club.<br>Grandmas are <b>4 times</b> as efficient.<br><b>Regularly unlocks new upgrades</b>.<q>What could possibly keep those grandmothers in check?...<br>Bingo.</q>',1000000000000000,[11,9],function(){Game.SetResearch('Specialized chocolate chips');});Game.last.noPerm=1;
8350
8351
order=15000;
8352
new Game.Upgrade('Specialized chocolate chips','Cookie production multiplier <b>+1%</b>.<q>Computer-designed chocolate chips. Computer chips, if you will.</q>',1000000000000000,[0,9],function(){Game.SetResearch('Designer cocoa beans');});Game.last.pool='tech';
8353
new Game.Upgrade('Designer cocoa beans','Cookie production multiplier <b>+2%</b>.<q>Now more aerodynamic than ever!</q>',2000000000000000,[1,9],function(){Game.SetResearch('Ritual rolling pins');});Game.last.pool='tech';
8354
new Game.Upgrade('Ritual rolling pins','Grandmas are <b>twice</b> as efficient.<q>The result of years of scientific research!</q>',4000000000000000,[2,9],function(){Game.SetResearch('Underworld ovens');});Game.last.pool='tech';
8355
new Game.Upgrade('Underworld ovens','Cookie production multiplier <b>+3%</b>.<q>Powered by science, of course!</q>',8000000000000000,[3,9],function(){Game.SetResearch('One mind');});Game.last.pool='tech';
8356
new Game.Upgrade('One mind','Each grandma gains <b>+0.0<span></span>2 base CpS per grandma</b>.<div class="warning">Note : the grandmothers are growing restless. Do not encourage them.</div><q>We are one. We are many.</q>',16000000000000000,[4,9],function(){Game.elderWrath=1;Game.SetResearch('Exotic nuts');Game.storeToRefresh=1;});Game.last.pool='tech';
8357
//Game.last.clickFunction=function(){return confirm('Warning : purchasing this will have unexpected, and potentially undesirable results!\nIt\'s all downhill from here. You have been warned!\nPurchase anyway?');};
8358
Game.RequiresConfirmation(Game.last,'<div class="block"><b>Warning :</b> purchasing this will have unexpected, and potentially undesirable results!<br><small>It\'s all downhill from here. You have been warned!</small><br><br>Purchase anyway?</small></div>');
8359
new Game.Upgrade('Exotic nuts','Cookie production multiplier <b>+4%</b>.<q>You\'ll go crazy over these!</q>',32000000000000000,[5,9],function(){Game.SetResearch('Communal brainsweep');});Game.last.pool='tech';
8360
new Game.Upgrade('Communal brainsweep','Each grandma gains another <b>+0.0<span></span>2 base CpS per grandma</b>.<div class="warning">Note : proceeding any further in scientific research may have unexpected results. You have been warned.</div><q>We fuse. We merge. We grow.</q>',64000000000000000,[6,9],function(){Game.elderWrath=2;Game.SetResearch('Arcane sugar');Game.storeToRefresh=1;});Game.last.pool='tech';
8361
new Game.Upgrade('Arcane sugar','Cookie production multiplier <b>+5%</b>.<q>Tastes like insects, ligaments, and molasses.</q>',128000000000000000,[7,9],function(){Game.SetResearch('Elder Pact');});Game.last.pool='tech';
8362
new Game.Upgrade('Elder Pact','Each grandma gains <b>+0.0<span></span>5 base CpS per portal</b>.<div class="warning">Note : this is a bad idea.</div><q>squirm crawl slither writhe<br>today we rise</q>',256000000000000000,[8,9],function(){Game.elderWrath=3;Game.storeToRefresh=1;});Game.last.pool='tech';
8363
new Game.Upgrade('Elder Pledge','Contains the wrath of the elders, at least for a while.<q>This is a simple ritual involving anti-aging cream, cookie batter mixed in the moonlight, and a live chicken.</q>',1,[9,9],function()
8364
{
8365
Game.elderWrath=0;
8366
Game.pledges++;
8367
Game.pledgeT=Game.getPledgeDuration();
8368
Game.Unlock('Elder Covenant');
8369
Game.CollectWrinklers();
8370
Game.storeToRefresh=1;
8371
});
8372
Game.getPledgeDuration=function(){return Game.fps*60*(Game.Has('Sacrificial rolling pins')?60:30);}
8373
Game.last.pool='toggle';
8374
Game.last.displayFuncWhenOwned=function(){return '<div style="text-align:center;">Time remaining until pledge runs out :<br><b>'+Game.sayTime(Game.pledgeT,-1)+'</b></div>';}
8375
Game.last.timerDisplay=function(){if (!Game.Upgrades['Elder Pledge'].bought) return -1; else return 1-Game.pledgeT/Game.getPledgeDuration();}
8376
Game.last.priceFunc=function(){return Math.pow(8,Math.min(Game.pledges+2,14));}
8377
8378
Game.last.descFunc=function(){
8379
return '<div style="text-align:center;">'+(Game.pledges==0?'You haven\'t pledged to the elders yet.':('You\'ve pledged to the elders <b>'+(Game.pledges==1?'once':Game.pledges==2?'twice':(Game.pledges+' times'))+'</b>.'))+'<div class="line"></div></div>'+this.desc;
8380
};
8381
8382
8383
order=150;
8384
new Game.Upgrade('Plastic mouse','Clicking gains <b>+1% of your CpS</b>.<q>Slightly squeaky.</q>',50000,[11,0]);Game.MakeTiered(Game.last,1,11);
8385
new Game.Upgrade('Iron mouse','Clicking gains <b>+1% of your CpS</b>.<q>Click like it\'s 1349!</q>',5000000,[11,1]);Game.MakeTiered(Game.last,2,11);
8386
new Game.Upgrade('Titanium mouse','Clicking gains <b>+1% of your CpS</b>.<q>Heavy, but powerful.</q>',500000000,[11,2]);Game.MakeTiered(Game.last,3,11);
8387
new Game.Upgrade('Adamantium mouse','Clicking gains <b>+1% of your CpS</b>.<q>You could cut diamond with these.</q>',50000000000,[11,13]);Game.MakeTiered(Game.last,4,11);
8388
8389
order=40000;
8390
new Game.Upgrade('Ultrascience','Research takes only <b>5 seconds</b>.<q>YEAH, SCIENCE!</q>',7,[9,2]);//debug purposes only
8391
Game.last.pool='debug';
8392
8393
order=10020;
8394
Game.NewUpgradeCookie({name:'Eclipse cookies',desc:'Look to the cookie.',icon:[0,4],power: 2, price: 99999999999*5});
8395
Game.NewUpgradeCookie({name:'Zebra cookies',desc:'...',icon:[1,4],power: 2, price: 999999999999});
8396
8397
order=100;
8398
new Game.Upgrade('Quintillion fingers','The mouse and cursors gain <b>+5000</b> cookies for each non-cursor object owned.<q>man, just go click click click click click, it\'s real easy, man.</q>',10000000000000,[0,18]);Game.MakeTiered(Game.last,9,0);
8399
8400
order=40000;
8401
new Game.Upgrade('Gold hoard','Golden cookies appear <b>really often</b>.<q>That\'s entirely too many.</q>',7,[10,14]);//debug purposes only
8402
Game.last.pool='debug';
8403
8404
order=15000;
8405
new Game.Upgrade('Elder Covenant','Puts a permanent end to the elders\' wrath, at the price of 5% of your CpS.<q>This is a complicated ritual involving silly, inconsequential trivialities such as cursed laxatives, century-old cacao, and an infant.<br>Don\'t question it.</q>',66666666666666,[8,9],function()
8406
{
8407
Game.pledgeT=0;
8408
Game.Lock('Revoke Elder Covenant');
8409
Game.Unlock('Revoke Elder Covenant');
8410
Game.Lock('Elder Pledge');
8411
Game.Win('Elder calm');
8412
Game.CollectWrinklers();
8413
Game.storeToRefresh=1;
8414
});
8415
Game.last.pool='toggle';
8416
8417
new Game.Upgrade('Revoke Elder Covenant','You will get 5% of your CpS back, but the grandmatriarchs will return.<q>we<br>rise<br>again</q>',6666666666,[8,9],function()
8418
{
8419
Game.Lock('Elder Covenant');
8420
Game.Unlock('Elder Covenant');
8421
});
8422
Game.last.pool='toggle';
8423
8424
order=5000;
8425
new Game.Upgrade('Get lucky','Golden cookie effects last <b>twice as long</b>.<q>You\'ve been up all night, haven\'t you?</q>',77777777777777,[27,6]);
8426
8427
order=15000;
8428
new Game.Upgrade('Sacrificial rolling pins','Elder pledges last <b>twice</b> as long.<q>These are mostly just for spreading the anti-aging cream.<br>(And accessorily, shortening the chicken\'s suffering.)</q>',2888888888888,[2,9]);
8429
8430
order=10020;
8431
Game.NewUpgradeCookie({name:'Snickerdoodles',desc:'True to their name.',icon:[2,4],power: 2, price: 999999999999*5});
8432
Game.NewUpgradeCookie({name:'Stroopwafels',desc:'If it ain\'t dutch, it ain\'t much.',icon:[3,4],power: 2, price: 9999999999999});
8433
Game.NewUpgradeCookie({name:'Macaroons',desc:'Not to be confused with macarons.<br>These have coconut, okay?',icon:[4,4],power: 2, price: 9999999999999*5});
8434
8435
order=40000;
8436
new Game.Upgrade('Neuromancy','Can toggle upgrades on and off at will in the stats menu.<q>Can also come in handy to unsee things that can\'t be unseen.</q>',7,[4,9]);//debug purposes only
8437
Game.last.pool='debug';
8438
8439
order=10020;
8440
Game.NewUpgradeCookie({name:'Empire biscuits',desc:'For your growing cookie empire, of course!',icon:[5,4],power: 2, price: 99999999999999});
8441
order=10031;
8442
Game.NewUpgradeCookie({name:'British tea biscuits',desc:'Quite.',icon:[6,4],require:'Tin of british tea biscuits',power: 2, price: 99999999999999});
8443
Game.NewUpgradeCookie({name:'Chocolate british tea biscuits',desc:'Yes, quite.',icon:[7,4],require:Game.last.name,power: 2, price: 99999999999999});
8444
Game.NewUpgradeCookie({name:'Round british tea biscuits',desc:'Yes, quite riveting.',icon:[8,4],require:Game.last.name,power: 2, price: 99999999999999});
8445
Game.NewUpgradeCookie({name:'Round chocolate british tea biscuits',desc:'Yes, quite riveting indeed.',icon:[9,4],require:Game.last.name,power: 2, price: 99999999999999});
8446
Game.NewUpgradeCookie({name:'Round british tea biscuits with heart motif',desc:'Yes, quite riveting indeed, old chap.',icon:[10,4],require:Game.last.name,power: 2, price: 99999999999999});
8447
Game.NewUpgradeCookie({name:'Round chocolate british tea biscuits with heart motif',desc:'I like cookies.',icon:[11,4],require:Game.last.name,power: 2, price: 99999999999999});
8448
8449
order=1000;
8450
new Game.TieredUpgrade('Sugar bosons','Antimatter condensers are <b>twice</b> as efficient.<q>Sweet firm bosons.</q>','Antimatter condenser',1);
8451
new Game.TieredUpgrade('String theory','Antimatter condensers are <b>twice</b> as efficient.<q>Reveals new insight about the true meaning of baking cookies (and, as a bonus, the structure of the universe).</q>','Antimatter condenser',2);
8452
new Game.TieredUpgrade('Large macaron collider','Antimatter condensers are <b>twice</b> as efficient.<q>How singular!</q>','Antimatter condenser',3);
8453
new Game.TieredUpgrade('Big bang bake','Antimatter condensers are <b>twice</b> as efficient.<q>And that\'s how it all began.</q>','Antimatter condenser',4);
8454
8455
order=255;
8456
Game.GrandmaSynergy('Antigrandmas','A mean antigrandma to vomit more cookies.','Antimatter condenser');
8457
8458
order=10020;
8459
Game.NewUpgradeCookie({name:'Madeleines',desc:'Unforgettable!',icon:[12,3],power: 2, price: 99999999999999*5});
8460
Game.NewUpgradeCookie({name:'Palmiers',desc:'Palmier than you!',icon:[13,3],power: 2, price: 99999999999999*5});
8461
Game.NewUpgradeCookie({name:'Palets',desc:'You could probably play hockey with these.<br>I mean, you\'re welcome to try.',icon:[12,4],power: 2, price: 999999999999999});
8462
Game.NewUpgradeCookie({name:'Sabl&eacute;s',desc:'The name implies they\'re made of sand. But you know better, don\'t you?',icon:[13,4],power: 2, price: 999999999999999});
8463
8464
order=20000;
8465
new Game.Upgrade('Kitten overseers','You gain <b>more CpS</b> the more milk you have.<q>my purrpose is to serve you, sir</q>',90000000000000000,Game.GetIcon('Kitten',4));Game.last.kitten=1;Game.MakeTiered(Game.last,4,18);
8466
8467
8468
order=100;
8469
new Game.Upgrade('Sextillion fingers','The mouse and cursors gain <b>+50000</b> cookies for each non-cursor object owned.<q>sometimes<br>things just<br>click</q>',10000000000000000,[0,19]);Game.MakeTiered(Game.last,10,0);
8470
8471
order=200;new Game.TieredUpgrade('Double-thick glasses','Grandmas are <b>twice</b> as efficient.<q>Oh... so THAT\'s what I\'ve been baking.</q>','Grandma',5);
8472
order=300;new Game.TieredUpgrade('Gingerbread scarecrows','Farms are <b>twice</b> as efficient.<q>Staring at your crops with mischievous glee.</q>','Farm',5);
8473
order=500;new Game.TieredUpgrade('Recombobulators','Factories are <b>twice</b> as efficient.<q>A major part of cookie recombobulation.</q>','Factory',5);
8474
order=400;new Game.TieredUpgrade('H-bomb mining','Mines are <b>twice</b> as efficient.<q>Questionable efficiency, but spectacular nonetheless.</q>','Mine',5);
8475
order=600;new Game.TieredUpgrade('Chocolate monoliths','Shipments are <b>twice</b> as efficient.<q>My god. It\'s full of chocolate bars.</q>','Shipment',5);
8476
order=700;new Game.TieredUpgrade('Aqua crustulae','Alchemy labs are <b>twice</b> as efficient.<q>Careful with the dosing - one drop too much and you get muffins.<br>And nobody likes muffins.</q>','Alchemy lab',5);
8477
order=800;new Game.TieredUpgrade('Brane transplant','Portals are <b>twice</b> as efficient.<q>This refers to the practice of merging higher dimensional universes, or "branes", with our own, in order to facilitate transit (and harvesting of precious cookie dough).</q>','Portal',5);
8478
order=900;new Game.TieredUpgrade('Yestermorrow comparators','Time machines are <b>twice</b> as efficient.<q>Fortnights into milleniums.</q>','Time machine',5);
8479
order=1000;new Game.TieredUpgrade('Reverse cyclotrons','Antimatter condensers are <b>twice</b> as efficient.<q>These can uncollision particles and unspin atoms. For... uh... better flavor, and stuff.</q>','Antimatter condenser',5);
8480
8481
order=150;
8482
new Game.Upgrade('Unobtainium mouse','Clicking gains <b>+1% of your CpS</b>.<q>These nice mice should suffice.</q>',5000000000000,[11,14]);Game.MakeTiered(Game.last,5,11);
8483
8484
order=10020;
8485
Game.NewUpgradeCookie({name:'Caramoas',desc:'Yeah. That\'s got a nice ring to it.',icon:[14,4],require:'Box of brand biscuits',power: 3, price: 9999999999999999});
8486
Game.NewUpgradeCookie({name:'Sagalongs',desc:'Grandma\'s favorite?',icon:[15,3],require:'Box of brand biscuits',power: 3, price: 9999999999999999});
8487
Game.NewUpgradeCookie({name:'Shortfoils',desc:'Foiled again!',icon:[15,4],require:'Box of brand biscuits',power: 3, price: 9999999999999999});
8488
Game.NewUpgradeCookie({name:'Win mints',desc:'They\'re the luckiest cookies you\'ve ever tasted!',icon:[14,3],require:'Box of brand biscuits',power: 3, price: 9999999999999999});
8489
8490
order=40000;
8491
new Game.Upgrade('Perfect idling','You keep producing cookies even while the game is closed.<q>It\'s the most beautiful thing I\'ve ever seen.</q>',7,[10,0]);//debug purposes only
8492
Game.last.pool='debug';
8493
8494
order=10030;
8495
Game.NewUpgradeCookie({name:'Fig gluttons',desc:'Got it all figured out.',icon:[17,4],require:'Box of brand biscuits',power: 2, price: 999999999999999*5});
8496
Game.NewUpgradeCookie({name:'Loreols',desc:'Because, uh... they\'re worth it?',icon:[16,3],require:'Box of brand biscuits',power: 2, price: 999999999999999*5});
8497
Game.NewUpgradeCookie({name:'Jaffa cakes',desc:'If you want to bake a cookie from scratch, you must first build a factory.',icon:[17,3],require:'Box of brand biscuits',power: 2, price: 999999999999999*5});
8498
Game.NewUpgradeCookie({name:'Grease\'s cups',desc:'Extra-greasy peanut butter.',icon:[16,4],require:'Box of brand biscuits',power: 2, price: 999999999999999*5});
8499
8500
order=30000;
8501
new Game.Upgrade('Heavenly chip secret','Unlocks <b>5%</b> of the potential of your prestige level.<q>Grants the knowledge of heavenly chips, and how to use them to make baking more efficient.<br>It\'s a secret to everyone.</q>',11,[19,7]);Game.last.noPerm=1;
8502
new Game.Upgrade('Heavenly cookie stand','Unlocks <b>25%</b> of the potential of your prestige level.<q>Don\'t forget to visit the heavenly lemonade stand afterwards. When afterlife gives you lemons...</q>',1111,[18,7]);Game.last.noPerm=1;
8503
new Game.Upgrade('Heavenly bakery','Unlocks <b>50%</b> of the potential of your prestige level.<q>Also sells godly cakes and divine pastries. The pretzels aren\'t too bad either.</q>',111111,[17,7]);Game.last.noPerm=1;
8504
new Game.Upgrade('Heavenly confectionery','Unlocks <b>75%</b> of the potential of your prestige level.<q>They say angel bakers work there. They take angel lunch breaks and sometimes go on angel strikes.</q>',11111111,[16,7]);Game.last.noPerm=1;
8505
new Game.Upgrade('Heavenly key','Unlocks <b>100%</b> of the potential of your prestige level.<q>This is the key to the pearly (and tasty) gates of pastry heaven, granting you access to your entire stockpile of heavenly chips for baking purposes.<br>May you use them wisely.</q>',1111111111,[15,7]);Game.last.noPerm=1;
8506
8507
order=10100;
8508
Game.NewUpgradeCookie({name:'Skull cookies',desc:'Wanna know something spooky? You\'ve got one of these inside your head RIGHT NOW.',locked:1,icon:[12,8],power: 2, price: 444444444444});
8509
Game.NewUpgradeCookie({name:'Ghost cookies',desc:'They\'re something strange, but they look pretty good!',locked:1,icon:[13,8],power: 2, price: 444444444444});
8510
Game.NewUpgradeCookie({name:'Bat cookies',desc:'The cookies this town deserves.',locked:1,icon:[14,8],power: 2, price: 444444444444});
8511
Game.NewUpgradeCookie({name:'Slime cookies',desc:'The incredible melting cookies!',locked:1,icon:[15,8],power: 2, price: 444444444444});
8512
Game.NewUpgradeCookie({name:'Pumpkin cookies',desc:'Not even pumpkin-flavored. Tastes like glazing. Yeugh.',locked:1,icon:[16,8],power: 2, price: 444444444444});
8513
Game.NewUpgradeCookie({name:'Eyeball cookies',desc:'When you stare into the cookie, the cookie stares back at you.',locked:1,icon:[17,8],power: 2, price: 444444444444});
8514
Game.NewUpgradeCookie({name:'Spider cookies',desc:'You found the recipe on the web. They do whatever a cookie can.',locked:1,icon:[18,8],power: 2, price: 444444444444});
8515
8516
Game.halloweenDrops=['Skull cookies','Ghost cookies','Bat cookies','Slime cookies','Pumpkin cookies','Eyeball cookies','Spider cookies'];
8517
8518
Game.GetHowManyHalloweenDrops=function()
8519
{
8520
var num=0;
8521
for (var i in Game.halloweenDrops) {if (Game.Has(Game.halloweenDrops[i])) num++;}
8522
return num;
8523
}
8524
/*for (var i in Game.halloweenDrops)
8525
{
8526
Game.Upgrades[Game.halloweenDrops[i]].descFunc=function(){return '<div style="text-align:center;">You currently own <b>'+Game.GetHowManyHalloweenDrops()+'/'+Game.halloweenDrops.length+'</b> halloween cookies.</div><div class="line"></div>'+this.desc;};
8527
}*/
8528
8529
order=0;
8530
new Game.Upgrade('Persistent memory','Subsequent research will be <b>10 times</b> as fast.<q>It\'s all making sense!<br>Again!</q>',500,[9,2]);Game.last.pool='prestige';
8531
8532
order=40000;
8533
new Game.Upgrade('Wrinkler doormat','Wrinklers spawn much more frequently.<q>You\'re such a pushover.</q>',7,[19,8]);//debug purposes only
8534
Game.last.pool='debug';
8535
8536
order=10200;
8537
Game.NewUpgradeCookie({name:'Christmas tree biscuits',desc:'Whose pine is it anyway?',locked:1,icon:[12,10],power:2,price: 252525252525});
8538
Game.NewUpgradeCookie({name:'Snowflake biscuits',desc:'Mass-produced to be unique in every way.',locked:1,icon:[13,10],power:2,price: 252525252525});
8539
Game.NewUpgradeCookie({name:'Snowman biscuits',desc:'It\'s frosted. Doubly so.',locked:1,icon:[14,10],power:2,price: 252525252525});
8540
Game.NewUpgradeCookie({name:'Holly biscuits',desc:'You don\'t smooch under these ones. That would be the mistletoe (which, botanically, is a smellier variant of the mistlefinger).',locked:1,icon:[15,10],power:2,price: 252525252525});
8541
Game.NewUpgradeCookie({name:'Candy cane biscuits',desc:'It\'s two treats in one!<br>(Further inspection reveals the frosting does not actually taste like peppermint, but like mundane sugary frosting.)',locked:1,icon:[16,10],power:2,price: 252525252525});
8542
Game.NewUpgradeCookie({name:'Bell biscuits',desc:'What do these even have to do with christmas? Who cares, ring them in!',locked:1,icon:[17,10],power:2,price: 252525252525});
8543
Game.NewUpgradeCookie({name:'Present biscuits',desc:'The prequel to future biscuits. Watch out!',locked:1,icon:[18,10],power:2,price: 252525252525});
8544
8545
order=10020;
8546
Game.NewUpgradeCookie({name:'Gingerbread men',desc:'You like to bite the legs off first, right? How about tearing off the arms? You sick monster.',icon:[18,4],power: 2,price: 9999999999999999});
8547
Game.NewUpgradeCookie({name:'Gingerbread trees',desc:'Evergreens in pastry form. Yule be surprised what you can come up with.',icon:[18,3],power: 2,price: 9999999999999999});
8548
8549
order=25000;
8550
new Game.Upgrade('A festive hat','<b>Unlocks... something.</b><q>Not a creature was stirring, not even a mouse.</q>',25,[19,9],function()
8551
{
8552
var drop=choose(Game.santaDrops);
8553
Game.Unlock(drop);
8554
if (Game.prefs.popups) Game.Popup('In the festive hat, you find...<br>a festive test tube<br>and '+drop+'.');
8555
else Game.Notify('In the festive hat, you find...','a festive test tube<br>and <b>'+drop+'</b>.',Game.Upgrades[drop].icon);
8556
});
8557
8558
new Game.Upgrade('Increased merriness','Cookie production multiplier <b>+15%</b>.<br>Cost scales with Santa level.<q>It turns out that the key to increased merriness, strangely enough, happens to be a good campfire and some s\'mores.<br>You know what they say, after all; the s\'more, the merrier.</q>',2525,[17,9]);
8559
new Game.Upgrade('Improved jolliness','Cookie production multiplier <b>+15%</b>.<br>Cost scales with Santa level.<q>A nice wobbly belly goes a long way.<br>You jolly?</q>',2525,[17,9]);
8560
new Game.Upgrade('A lump of coal','Cookie production multiplier <b>+1%</b>.<br>Cost scales with Santa level.<q>Some of the world\'s worst stocking stuffing.<br>I guess you could try starting your own little industrial revolution, or something?...</q>',2525,[13,9]);
8561
new Game.Upgrade('An itchy sweater','Cookie production multiplier <b>+1%</b>.<br>Cost scales with Santa level.<q>You don\'t know what\'s worse : the embarrassingly quaint "elf on reindeer" motif, or the fact that wearing it makes you feel like you\'re wrapped in a dead sasquatch.</q>',2525,[14,9]);
8562
new Game.Upgrade('Reindeer baking grounds','Reindeer appear <b>twice as frequently</b>.<br>Cost scales with Santa level.<q>Male reindeer are from Mars; female reindeer are from venison.</q>',2525,[12,9]);
8563
new Game.Upgrade('Weighted sleighs','Reindeer are <b>twice as slow</b>.<br>Cost scales with Santa level.<q>Hope it was worth the weight.<br>(Something something forced into cervidude)</q>',2525,[12,9]);
8564
new Game.Upgrade('Ho ho ho-flavored frosting','Reindeer give <b>twice as much</b>.<br>Cost scales with Santa level.<q>It\'s time to up the antler.</q>',2525,[12,9]);
8565
new Game.Upgrade('Season savings','All buildings are <b>1% cheaper</b>.<br>Cost scales with Santa level.<q>By Santa\'s beard, what savings!<br>But who will save us?</q>',2525,[16,9],function(){Game.storeToRefresh=1;});
8566
new Game.Upgrade('Toy workshop','All upgrades are <b>5% cheaper</b>.<br>Cost scales with Santa level.<q>Watch yours-elf around elvesdroppers who might steal our production secrets.<br>Or elven worse!</q>',2525,[16,9],function(){Game.upgradesToRebuild=1;});
8567
new Game.Upgrade('Naughty list','Grandmas are <b>twice</b> as productive.<br>Cost scales with Santa level.<q>This list contains every unholy deed perpetuated by grandmakind.<br>He won\'t be checking this one twice.<br>Once. Once is enough.</q>',2525,[15,9]);
8568
new Game.Upgrade('Santa\'s bottomless bag','Random drops are <b>10% more common</b>.<br>Cost scales with Santa level.<q>This is one bottom you can\'t check out.</q>',2525,[19,9]);
8569
new Game.Upgrade('Santa\'s helpers','Clicking is <b>10% more powerful</b>.<br>Cost scales with Santa level.<q>Some choose to help hamburger; some choose to help you.<br>To each their own, I guess.</q>',2525,[19,9]);
8570
new Game.Upgrade('Santa\'s legacy','Cookie production multiplier <b>+3% per Santa\'s levels</b>.<br>Cost scales with Santa level.<q>In the north pole, you gotta get the elves first. Then when you get the elves, you start making the toys. Then when you get the toys... then you get the cookies.</q>',2525,[19,9]);
8571
new Game.Upgrade('Santa\'s milk and cookies','Milk is <b>5% more powerful</b>.<br>Cost scales with Santa level.<q>Part of Santa\'s dreadfully unbalanced diet.</q>',2525,[19,9]);
8572
8573
order=40000;
8574
new Game.Upgrade('Reindeer season','Reindeer spawn much more frequently.<q>Go, Cheater! Go, Hacker and Faker!</q>',7,[12,9]);//debug purposes only
8575
Game.last.pool='debug';
8576
8577
order=25000;
8578
new Game.Upgrade('Santa\'s dominion','Cookie production multiplier <b>+20%</b>.<br>All buildings are <b>1% cheaper</b>.<br>All upgrades are <b>2% cheaper</b>.<q>My name is Claus, king of kings;<br>Look on my toys, ye Mighty, and despair!</q>',2525252525252525,[19,10],function(){Game.storeToRefresh=1;});
8579
8580
order=10300;
8581
var heartPower=function(){
8582
var pow=2;
8583
if (Game.Has('Starlove')) pow=3;
8584
if (Game.hasGod)
8585
{
8586
var godLvl=Game.hasGod('seasons');
8587
if (godLvl==1) pow*=1.3;
8588
else if (godLvl==2) pow*=1.2;
8589
else if (godLvl==3) pow*=1.1;
8590
}
8591
return pow;
8592
};
8593
Game.NewUpgradeCookie({name:'Pure heart biscuits',desc:'Melty white chocolate<br>that says "I *like* like you".',season:'valentines',icon:[19,3], power:heartPower,price: 1000000});
8594
Game.NewUpgradeCookie({name:'Ardent heart biscuits',desc:'A red hot cherry biscuit that will nudge the target of your affection in interesting directions.',require:Game.last.name,season:'valentines',icon:[20,3], power:heartPower,price: 1000000000});
8595
Game.NewUpgradeCookie({name:'Sour heart biscuits',desc:'A bitter lime biscuit for the lonely and the heart-broken.',require:Game.last.name,season:'valentines',icon:[20,4], power:heartPower,price: 1000000000000});
8596
Game.NewUpgradeCookie({name:'Weeping heart biscuits',desc:'An ice-cold blueberry biscuit, symbol of a mending heart.',require:Game.last.name,season:'valentines',icon:[21,3], power:heartPower,price: 1000000000000000});
8597
Game.NewUpgradeCookie({name:'Golden heart biscuits',desc:'A beautiful biscuit to symbolize kindness, true love, and sincerity.',require:Game.last.name,season:'valentines',icon:[21,4], power:heartPower,price: 1000000000000000000});
8598
Game.NewUpgradeCookie({name:'Eternal heart biscuits',desc:'Silver icing for a very special someone you\'ve liked for a long, long time.',require:Game.last.name,season:'valentines',icon:[19,4], power:heartPower,price: 1000000000000000000000});
8599
8600
Game.heartDrops=['Pure heart biscuits','Ardent heart biscuits','Sour heart biscuits','Weeping heart biscuits','Golden heart biscuits','Eternal heart biscuits'];
8601
8602
Game.GetHowManyHeartDrops=function()
8603
{
8604
var num=0;
8605
for (var i in Game.heartDrops) {if (Game.Has(Game.heartDrops[i])) num++;}
8606
return num;
8607
}
8608
/*for (var i in Game.heartDrops)
8609
{
8610
Game.Upgrades[Game.heartDrops[i]].descFunc=function(){return '<div style="text-align:center;">You currently own <b>'+Game.GetHowManyHeartDrops()+'/'+Game.heartDrops.length+'</b> heart biscuits.</div><div class="line"></div>'+this.desc;};
8611
}*/
8612
8613
order=1100;
8614
new Game.TieredUpgrade('Gem polish','Prisms are <b>twice</b> as efficient.<q>Get rid of the grime and let more light in.<br>Truly, truly outrageous.</q>','Prism',1);
8615
new Game.TieredUpgrade('9th color','Prisms are <b>twice</b> as efficient.<q>Delve into untouched optical depths where even the mantis shrimp hasn\'t set an eye!</q>','Prism',2);
8616
new Game.TieredUpgrade('Chocolate light','Prisms are <b>twice</b> as efficient.<q>Bask into its cocoalescence.<br>(Warning : may cause various interesting albeit deadly skin conditions.)</q>','Prism',3);
8617
new Game.TieredUpgrade('Grainbow','Prisms are <b>twice</b> as efficient.<q>Remember the different grains using the handy Roy G. Biv mnemonic : R is for rice, O is for oats... uh, B for barley?...</q>','Prism',4);
8618
new Game.TieredUpgrade('Pure cosmic light','Prisms are <b>twice</b> as efficient.<q>Your prisms now receive pristine, unadulterated photons from the other end of the universe.</q>','Prism',5);
8619
8620
order=255;
8621
Game.GrandmaSynergy('Rainbow grandmas','A luminous grandma to sparkle into cookies.','Prism');
8622
8623
order=24000;
8624
Game.seasonTriggerBasePrice=1000000000;//1111111111;
8625
new Game.Upgrade('Season switcher','Allows you to <b>trigger seasonal events</b> at will, for a price.<q>There will always be time.</q>',1111,[16,6],function(){for (var i in Game.seasons){Game.Unlock(Game.seasons[i].trigger);}});Game.last.pool='prestige';Game.last.parents=['Heralds'];
8626
new Game.Upgrade('Festive biscuit','Triggers <b>Christmas season</b> for the next 24 hours.<br>Triggering another season will cancel this one.<br>Cost scales with unbuffed CpS and increases with every season switch.<q>\'Twas the night before Christmas- or was it?</q>',Game.seasonTriggerBasePrice,[12,10]);Game.last.season='christmas';Game.last.pool='toggle';
8627
new Game.Upgrade('Ghostly biscuit','Triggers <b>Halloween season</b> for the next 24 hours.<br>Triggering another season will cancel this one.<br>Cost scales with unbuffed CpS and increases with every season switch.<q>spooky scary skeletons<br>will wake you with a boo</q>',Game.seasonTriggerBasePrice,[13,8]);Game.last.season='halloween';Game.last.pool='toggle';
8628
new Game.Upgrade('Lovesick biscuit','Triggers <b>Valentine\'s Day season</b> for the next 24 hours.<br>Triggering another season will cancel this one.<br>Cost scales with unbuffed CpS and increases with every season switch.<q>Romance never goes out of fashion.</q>',Game.seasonTriggerBasePrice,[20,3]);Game.last.season='valentines';Game.last.pool='toggle';
8629
new Game.Upgrade('Fool\'s biscuit','Triggers <b>Business Day season</b> for the next 24 hours.<br>Triggering another season will cancel this one.<br>Cost scales with unbuffed CpS and increases with every season switch.<q>Business. Serious business. This is absolutely all of your business.</q>',Game.seasonTriggerBasePrice,[17,6]);Game.last.season='fools';Game.last.pool='toggle';
8630
8631
8632
order=40000;
8633
new Game.Upgrade('Eternal seasons','Seasons now last forever.<q>Season to taste.</q>',7,[16,6],function(){for (var i in Game.seasons){Game.Unlock(Game.seasons[i].trigger);}});//debug purposes only
8634
Game.last.pool='debug';
8635
8636
8637
order=20000;
8638
new Game.Upgrade('Kitten managers','You gain <b>more CpS</b> the more milk you have.<q>that\'s not gonna paws any problem, sir</q>',900000000000000000000,Game.GetIcon('Kitten',5));Game.last.kitten=1;Game.MakeTiered(Game.last,5,18);
8639
8640
order=100;
8641
new Game.Upgrade('Septillion fingers','The mouse and cursors gain <b>+500000</b> cookies for each non-cursor object owned.<q>[cursory flavor text]</q>',10000000000000000000,[12,20]);Game.MakeTiered(Game.last,11,0);
8642
new Game.Upgrade('Octillion fingers','The mouse and cursors gain <b>+5000000</b> cookies for each non-cursor object owned.<q>Turns out you <b>can</b> quite put your finger on it.</q>',10000000000000000000000,[12,19]);Game.MakeTiered(Game.last,12,0);
8643
8644
order=150;new Game.Upgrade('Eludium mouse','Clicking gains <b>+1% of your CpS</b>.<q>I rodent do that if I were you.</q>',500000000000000,[11,15]);Game.MakeTiered(Game.last,6,11);
8645
new Game.Upgrade('Wishalloy mouse','Clicking gains <b>+1% of your CpS</b>.<q>Clicking is fine and dandy, but don\'t smash your mouse over it. Get your game on. Go play.</q>',50000000000000000,[11,16]);Game.MakeTiered(Game.last,7,11);
8646
order=200;new Game.TieredUpgrade('Aging agents','Grandmas are <b>twice</b> as efficient.<q>Counter-intuitively, grandmas have the uncanny ability to become more powerful the older they get.</q>','Grandma',6);
8647
order=300;new Game.TieredUpgrade('Pulsar sprinklers','Farms are <b>twice</b> as efficient.<q>There\'s no such thing as over-watering. The moistest is the bestest.</q>','Farm',6);
8648
order=500;new Game.TieredUpgrade('Deep-bake process','Factories are <b>twice</b> as efficient.<q>A patented process increasing cookie yield two-fold for the same amount of ingredients. Don\'t ask how, don\'t take pictures, and be sure to wear your protective suit.</q>','Factory',6);
8649
order=400;new Game.TieredUpgrade('Coreforge','Mines are <b>twice</b> as efficient.<q>You\'ve finally dug a tunnel down to the Earth\'s core. It\'s pretty warm down here.</q>','Mine',6);
8650
order=600;new Game.TieredUpgrade('Generation ship','Shipments are <b>twice</b> as efficient.<q>Built to last, this humongous spacecraft will surely deliver your cookies to the deep ends of space, one day.</q>','Shipment',6);
8651
order=700;new Game.TieredUpgrade('Origin crucible','Alchemy labs are <b>twice</b> as efficient.<q>Built from the rarest of earths and located at the very deepest of the largest mountain, this legendary crucible is said to retain properties from the big-bang itself.</q>','Alchemy lab',6);
8652
order=800;new Game.TieredUpgrade('Deity-sized portals','Portals are <b>twice</b> as efficient.<q>It\'s almost like, say, an elder god could fit through this thing now. Hypothetically.</q>','Portal',6);
8653
order=900;new Game.TieredUpgrade('Far future enactment','Time machines are <b>twice</b> as efficient.<q>The far future enactment authorizes you to delve deep into the future - where civilization has fallen and risen again, and cookies are plentiful.</q>','Time machine',6);
8654
order=1000;new Game.TieredUpgrade('Nanocosmics','Antimatter condensers are <b>twice</b> as efficient.<q>The theory of nanocosmics posits that each subatomic particle is in fact its own self-contained universe, holding unfathomable amounts of energy.<br>This somehow stacks with the nested universe theory, because physics.</q>','Antimatter condenser',6);
8655
order=1100;
8656
new Game.TieredUpgrade('Glow-in-the-dark','Prisms are <b>twice</b> as efficient.<q>Your prisms now glow in the dark, effectively doubling their output!</q>','Prism',6);
8657
8658
order=10032;
8659
Game.NewUpgradeCookie({name:'Rose macarons',desc:'Although an odd flavor, these pastries recently rose in popularity.',icon:[22,3],require:'Box of macarons', power:3,price: 9999});
8660
Game.NewUpgradeCookie({name:'Lemon macarons',desc:'Tastefully sour, delightful treats.',icon:[23,3],require:'Box of macarons', power:3,price: 9999999});
8661
Game.NewUpgradeCookie({name:'Chocolate macarons',desc:'They\'re like tiny sugary burgers!',icon:[24,3],require:'Box of macarons', power:3,price: 9999999999});
8662
Game.NewUpgradeCookie({name:'Pistachio macarons',desc:'Pistachio shells now removed after multiple complaints.',icon:[22,4],require:'Box of macarons', power:3,price: 9999999999999});
8663
Game.NewUpgradeCookie({name:'Hazelnut macarons',desc:'These go especially well with coffee.',icon:[23,4],require:'Box of macarons', power:3,price: 9999999999999999});
8664
Game.NewUpgradeCookie({name:'Violet macarons',desc:'It\'s like spraying perfume into your mouth!',icon:[24,4],require:'Box of macarons', power:3,price: 9999999999999999999});
8665
8666
order=40000;
8667
new Game.Upgrade('Magic shenanigans','Cookie production <b>multiplied by 1,000</b>.<q>It\'s magic. I ain\'t gotta explain sh<div style="display:inline-block;background:url(img/money.png);width:16px;height:16px;position:relative;top:4px;left:0px;margin:0px -2px;"></div>t.</q>',7,[17,5]);//debug purposes only
8668
Game.last.pool='debug';
8669
8670
8671
order=24000;
8672
new Game.Upgrade('Bunny biscuit','Triggers <b>Easter season</b> for the next 24 hours.<br>Triggering another season will cancel this one.<br>Cost scales with unbuffed CpS and increases with every season switch.<q>All the world will be your enemy<br>and when they catch you,<br>they will kill you...<br>but first they must catch you.</q>',Game.seasonTriggerBasePrice,[0,12]);Game.last.season='easter';Game.last.pool='toggle';
8673
8674
var eggPrice=999999999999;
8675
var eggPrice2=99999999999999;
8676
new Game.Upgrade('Chicken egg','Cookie production multiplier <b>+1%</b>.<br>Cost scales with how many eggs you own.<q>The egg. The egg came first. Get over it.</q>',eggPrice,[1,12]);
8677
new Game.Upgrade('Duck egg','Cookie production multiplier <b>+1%</b>.<br>Cost scales with how many eggs you own.<q>Then he waddled away.</q>',eggPrice,[2,12]);
8678
new Game.Upgrade('Turkey egg','Cookie production multiplier <b>+1%</b>.<br>Cost scales with how many eggs you own.<q>These hatch into strange, hand-shaped creatures.</q>',eggPrice,[3,12]);
8679
new Game.Upgrade('Quail egg','Cookie production multiplier <b>+1%</b>.<br>Cost scales with how many eggs you own.<q>These eggs are positively tiny. I mean look at them. How does this happen? Whose idea was that?</q>',eggPrice,[4,12]);
8680
new Game.Upgrade('Robin egg','Cookie production multiplier <b>+1%</b>.<br>Cost scales with how many eggs you own.<q>Holy azure-hued shelled embryos!</q>',eggPrice,[5,12]);
8681
new Game.Upgrade('Ostrich egg','Cookie production multiplier <b>+1%</b>.<br>Cost scales with how many eggs you own.<q>One of the largest eggs in the world. More like ostrouch, am I right?<br>Guys?</q>',eggPrice,[6,12]);
8682
new Game.Upgrade('Cassowary egg','Cookie production multiplier <b>+1%</b>.<br>Cost scales with how many eggs you own.<q>The cassowary is taller than you, possesses murderous claws and can easily outrun you.<br>You\'d do well to be casso-wary of them.</q>',eggPrice,[7,12]);
8683
new Game.Upgrade('Salmon roe','Cookie production multiplier <b>+1%</b>.<br>Cost scales with how many eggs you own.<q>Do the impossible, see the invisible.<br>Roe roe, fight the power?</q>',eggPrice,[8,12]);
8684
new Game.Upgrade('Frogspawn','Cookie production multiplier <b>+1%</b>.<br>Cost scales with how many eggs you own.<q>I was going to make a pun about how these "toadally look like eyeballs", but froget it.</q>',eggPrice,[9,12]);
8685
new Game.Upgrade('Shark egg','Cookie production multiplier <b>+1%</b>.<br>Cost scales with how many eggs you own.<q>HELLO IS THIS FOOD?<br>LET ME TELL YOU ABOUT FOOD.<br>WHY DO I KEEP EATING MY FRIENDS</q>',eggPrice,[10,12]);
8686
new Game.Upgrade('Turtle egg','Cookie production multiplier <b>+1%</b>.<br>Cost scales with how many eggs you own.<q>Turtles, right? Hatch from shells. Grow into shells. What\'s up with that?<br>Now for my skit about airplane food.</q>',eggPrice,[11,12]);
8687
new Game.Upgrade('Ant larva','Cookie production multiplier <b>+1%</b>.<br>Cost scales with how many eggs you own.<q>These are a delicacy in some countries, I swear. You will let these invade your digestive tract, and you will derive great pleasure from it.<br>And all will be well.</q>',eggPrice,[12,12]);
8688
new Game.Upgrade('Golden goose egg','Golden cookies appear <b>5% more often</b>.<br>Cost scales with how many eggs you own.<q>The sole vestige of a tragic tale involving misguided investments.</q>',eggPrice2,[13,12]);
8689
new Game.Upgrade('Faberge egg','All buildings and upgrades are <b>1% cheaper</b>.<br>Cost scales with how many eggs you own.<q>This outrageous egg is definitely fab.</q>',eggPrice2,[14,12],function(){Game.storeToRefresh=1;});
8690
new Game.Upgrade('Wrinklerspawn','Wrinklers explode into <b>5% more cookies</b>.<br>Cost scales with how many eggs you own.<q>Look at this little guy! It\'s gonna be a big boy someday! Yes it is!</q>',eggPrice2,[15,12]);
8691
new Game.Upgrade('Cookie egg','Clicking is <b>10% more powerful</b>.<br>Cost scales with how many eggs you own.<q>The shell appears to be chipped.<br>I wonder what\'s inside this one!</q>',eggPrice2,[16,12]);
8692
new Game.Upgrade('Omelette','Other eggs appear <b>10% more frequently</b>.<br>Cost scales with how many eggs you own.<q>Fromage not included.</q>',eggPrice2,[17,12]);
8693
new Game.Upgrade('Chocolate egg','Contains <b>a lot of cookies</b>.<br>Cost scales with how many eggs you own.<q>Laid by the elusive cocoa bird. There\'s a surprise inside!</q>',eggPrice2,[18,12],function()
8694
{
8695
var cookies=Game.cookies*0.05;
8696
if (Game.prefs.popups) Game.Popup('The chocolate egg bursts into<br>'+Beautify(cookies)+'!');
8697
else Game.Notify('Chocolate egg','The egg bursts into <b>'+Beautify(cookies)+'</b> cookies!',Game.Upgrades['Chocolate egg'].icon);
8698
Game.Earn(cookies);
8699
});
8700
new Game.Upgrade('Century egg','You continually gain <b>more CpS the longer you\'ve played</b> in the current ascension.<br>Cost scales with how many eggs you own.<q>Actually not centuries-old. This one isn\'t a day over 86!</q>',eggPrice2,[19,12]);
8701
Game.last.descFunc=function(){
8702
var day=Math.floor((Date.now()-Game.startDate)/1000/10)*10/60/60/24;
8703
day=Math.min(day,100);
8704
var n=(1-Math.pow(1-day/100,3))*0.1;
8705
return '<div style="text-align:center;">Current boost : <b>+'+Beautify(n*100,1)+'%</b></div><div class="line"></div>'+this.desc;
8706
};
8707
new Game.Upgrade('"egg"','<b>+9 CpS</b><q>hey it\'s "egg"</q>',eggPrice2,[20,12]);
8708
8709
Game.easterEggs=['Chicken egg','Duck egg','Turkey egg','Quail egg','Robin egg','Ostrich egg','Cassowary egg','Salmon roe','Frogspawn','Shark egg','Turtle egg','Ant larva','Golden goose egg','Faberge egg','Wrinklerspawn','Cookie egg','Omelette','Chocolate egg','Century egg','"egg"'];
8710
Game.eggDrops=['Chicken egg','Duck egg','Turkey egg','Quail egg','Robin egg','Ostrich egg','Cassowary egg','Salmon roe','Frogspawn','Shark egg','Turtle egg','Ant larva'];
8711
Game.rareEggDrops=['Golden goose egg','Faberge egg','Wrinklerspawn','Cookie egg','Omelette','Chocolate egg','Century egg','"egg"'];
8712
8713
Game.GetHowManyEggs=function()
8714
{
8715
var num=0;
8716
for (var i in Game.easterEggs) {if (Game.Has(Game.easterEggs[i])) num++;}
8717
return num;
8718
}
8719
for (var i in Game.eggDrops)//scale egg prices to how many eggs you have
8720
{Game.Upgrades[Game.eggDrops[i]].priceFunc=function(){return Math.pow(2,Game.GetHowManyEggs())*999;}}
8721
//{Game.Upgrades[Game.eggDrops[i]].priceFunc=function(){return Math.pow(Game.GetHowManyEggs()+1,2)*Game.cookiesPs*60*5;}}
8722
for (var i in Game.rareEggDrops)
8723
{Game.Upgrades[Game.rareEggDrops[i]].priceFunc=function(){return Math.pow(3,Game.GetHowManyEggs())*999;}}
8724
//{Game.Upgrades[Game.rareEggDrops[i]].priceFunc=function(){return Math.pow(Game.GetHowManyEggs()+1,3)*Game.cookiesPs*60*5;}}
8725
8726
/*for (var i in Game.easterEggs)
8727
{
8728
Game.Upgrades[Game.easterEggs[i]].descFunc=function(){return '<div style="text-align:center;">You currently own <b>'+Game.GetHowManyEggs()+'/'+Game.easterEggs.length+'</b> eggs.</div><div class="line"></div>'+this.desc;};
8729
}*/
8730
8731
Game.DropEgg=function(failRate)
8732
{
8733
failRate*=1/Game.dropRateMult();
8734
if (Game.season!='easter') return;
8735
if (Game.HasAchiev('Hide & seek champion')) failRate*=0.7;
8736
if (Game.Has('Omelette')) failRate*=0.9;
8737
if (Game.Has('Starspawn')) failRate*=0.9;
8738
if (Game.hasGod)
8739
{
8740
var godLvl=Game.hasGod('seasons');
8741
if (godLvl==1) failRate*=0.9;
8742
else if (godLvl==2) failRate*=0.95;
8743
else if (godLvl==3) failRate*=0.97;
8744
}
8745
if (Math.random()>=failRate)
8746
{
8747
var drop='';
8748
if (Math.random()<0.1) drop=choose(Game.rareEggDrops);
8749
else drop=choose(Game.eggDrops);
8750
if (Game.Has(drop) || Game.HasUnlocked(drop))//reroll if we have it
8751
{
8752
if (Math.random()<0.1) drop=choose(Game.rareEggDrops);
8753
else drop=choose(Game.eggDrops);
8754
}
8755
if (Game.Has(drop) || Game.HasUnlocked(drop)) return;
8756
Game.Unlock(drop);
8757
if (Game.prefs.popups) Game.Popup('You find :<br>'+drop+'!');
8758
else Game.Notify('You found an egg!','<b>'+drop+'</b>',Game.Upgrades[drop].icon);
8759
}
8760
};
8761
8762
order=10032;
8763
Game.NewUpgradeCookie({name:'Caramel macarons',desc:'The saltiest, chewiest of them all.',icon:[25,3],require:'Box of macarons', power:3,price: 9999999999999999999999});
8764
Game.NewUpgradeCookie({name:'Licorice macarons',desc:'Also known as "blackarons".',icon:[25,4],require:'Box of macarons', power:3,price: 9999999999999999999999999});
8765
8766
8767
order=525;
8768
new Game.TieredUpgrade('Taller tellers','Banks are <b>twice</b> as efficient.<q>Able to process a higher amount of transactions. Careful though, as taller tellers tell tall tales.</q>','Bank',1);
8769
new Game.TieredUpgrade('Scissor-resistant credit cards','Banks are <b>twice</b> as efficient.<q>For those truly valued customers.</q>','Bank',2);
8770
new Game.TieredUpgrade('Acid-proof vaults','Banks are <b>twice</b> as efficient.<q>You know what they say : better safe than sorry.</q>','Bank',3);
8771
new Game.TieredUpgrade('Chocolate coins','Banks are <b>twice</b> as efficient.<q>This revolutionary currency is much easier to melt from and into ingots - and tastes much better, for a change.</q>','Bank',4);
8772
new Game.TieredUpgrade('Exponential interest rates','Banks are <b>twice</b> as efficient.<q>Can\'t argue with mathematics! Now fork it over.</q>','Bank',5);
8773
new Game.TieredUpgrade('Financial zen','Banks are <b>twice</b> as efficient.<q>The ultimate grail of economic thought; the feng shui of big money, the stock market yoga - the Heimlich maneuver of dimes and nickels.</q>','Bank',6);
8774
8775
order=550;
8776
new Game.TieredUpgrade('Golden idols','Temples are <b>twice</b> as efficient.<q>Lure even greedier adventurers to retrieve your cookies. Now that\'s a real idol game!</q>','Temple',1);
8777
new Game.TieredUpgrade('Sacrifices','Temples are <b>twice</b> as efficient.<q>What\'s a life to a gigaton of cookies?</q>','Temple',2);
8778
new Game.TieredUpgrade('Delicious blessing','Temples are <b>twice</b> as efficient.<q>And lo, the Baker\'s almighty spoon came down and distributed holy gifts unto the believers - shimmering sugar, and chocolate dark as night, and all manner of wheats. And boy let me tell you, that party was mighty gnarly.</q>','Temple',3);
8779
new Game.TieredUpgrade('Sun festival','Temples are <b>twice</b> as efficient.<q>Free the primordial powers of your temples with these annual celebrations involving fire-breathers, traditional dancing, ritual beheadings and other merriments!</q>','Temple',4);
8780
new Game.TieredUpgrade('Enlarged pantheon','Temples are <b>twice</b> as efficient.<q>Enough spiritual inadequacy! More divinities than you\'ll ever need, or your money back! 100% guaranteed!</q>','Temple',5);
8781
new Game.TieredUpgrade('Great Baker in the sky','Temples are <b>twice</b> as efficient.<q>This is it. The ultimate deity has finally cast Their sublimely divine eye upon your operation; whether this is a good thing or possibly the end of days is something you should find out very soon.</q>','Temple',6);
8782
8783
order=575;
8784
new Game.TieredUpgrade('Pointier hats','Wizard towers are <b>twice</b> as efficient.<q>Tests have shown increased thaumic receptivity relative to the geometric proportions of wizardly conic implements.</q>','Wizard tower',1);
8785
new Game.TieredUpgrade('Beardlier beards','Wizard towers are <b>twice</b> as efficient.<q>Haven\'t you heard? The beard is the word.</q>','Wizard tower',2);
8786
new Game.TieredUpgrade('Ancient grimoires','Wizard towers are <b>twice</b> as efficient.<q>Contain interesting spells such as "Turn Water To Drool", "Grow Eyebrows On Furniture" and "Summon Politician".</q>','Wizard tower',3);
8787
new Game.TieredUpgrade('Kitchen curses','Wizard towers are <b>twice</b> as efficient.<q>Exotic magic involved in all things pastry-related. Hexcellent!</q>','Wizard tower',4);
8788
new Game.TieredUpgrade('School of sorcery','Wizard towers are <b>twice</b> as efficient.<q>This cookie-funded academy of witchcraft is home to the 4 prestigious houses of magic : the Jocks, the Nerds, the Preps, and the Deathmunchers.</q>','Wizard tower',5);
8789
new Game.TieredUpgrade('Dark formulas','Wizard towers are <b>twice</b> as efficient.<q>Eldritch forces are at work behind these spells - you get the feeling you really shouldn\'t be messing with those. But I mean, free cookies, right?</q>','Wizard tower',6);
8790
8791
order=250;
8792
Game.GrandmaSynergy('Banker grandmas','A nice banker to cash in more cookies.','Bank');
8793
Game.GrandmaSynergy('Priestess grandmas','A nice priestess to praise the one true Baker in the sky.','Temple');
8794
Game.GrandmaSynergy('Witch grandmas','A nice witch to cast a zip, and a zoop, and poof! Cookies.','Wizard tower');
8795
8796
8797
8798
order=0;
8799
new Game.Upgrade('Tin of british tea biscuits','Contains an assortment of fancy biscuits.<q>Every time is tea time.</q>',25,[21,8]);Game.last.pool='prestige';Game.last.parents=['Heavenly cookies'];
8800
new Game.Upgrade('Box of macarons','Contains an assortment of macarons.<q>Multicolored delicacies filled with various kinds of jam.<br>Not to be confused with macaroons, macaroni, macarena or any of that nonsense.</q>',25,[20,8]);Game.last.pool='prestige';Game.last.parents=['Heavenly cookies'];
8801
new Game.Upgrade('Box of brand biscuits','Contains an assortment of popular biscuits.<q>They\'re brand new!</q>',25,[20,9]);Game.last.pool='prestige';Game.last.parents=['Heavenly cookies'];
8802
8803
order=10020;
8804
Game.NewUpgradeCookie({name:'Pure black chocolate cookies',desc:'Dipped in a lab-made substance darker than the darkest cocoa (dubbed "chocoalate").',icon:[26,3],power: 4,price: 9999999999999999*5});
8805
Game.NewUpgradeCookie({name:'Pure white chocolate cookies',desc:'Elaborated on the nano-scale, the coating on this biscuit is able to refract light even in a pitch-black environment.',icon:[26,4],power: 4,price: 9999999999999999*5});
8806
Game.NewUpgradeCookie({name:'Ladyfingers',desc:'Cleaned and sanitized so well you\'d swear they\'re actual biscuits.',icon:[27,3],power: 3,price: 99999999999999999});
8807
Game.NewUpgradeCookie({name:'Tuiles',desc:'These never go out of tile.',icon:[27,4],power: 3,price: 99999999999999999*5});
8808
Game.NewUpgradeCookie({name:'Chocolate-stuffed biscuits',desc:'A princely snack!<br>The holes are so the chocolate stuffing can breathe.',icon:[28,3],power: 3,price: 999999999999999999});
8809
Game.NewUpgradeCookie({name:'Checker cookies',desc:'A square cookie? This solves so many storage and packaging problems! You\'re a genius!',icon:[28,4],power: 3,price: 999999999999999999*5});
8810
Game.NewUpgradeCookie({name:'Butter cookies',desc:'These melt right off your mouth and into your heart. (Let\'s face it, they\'re rather fattening.)',icon:[29,3],power: 3,price: 9999999999999999999});
8811
Game.NewUpgradeCookie({name:'Cream cookies',desc:'It\'s like two chocolate chip cookies! But brought together with the magic of cream! It\'s fiendishly perfect!',icon:[29,4],power: 3,price: 9999999999999999999*5});
8812
8813
order=0;
8814
var desc='Placing an upgrade in this slot will make its effects <b>permanent</b> across all playthroughs.<br><b>Click to activate.</b>';
8815
new Game.Upgrade('Permanent upgrade slot I',desc, 100,[0,10]);Game.last.pool='prestige';Game.last.iconFunction=function(){return Game.PermanentSlotIcon(0);};Game.last.activateFunction=function(){Game.AssignPermanentSlot(0);};
8816
new Game.Upgrade('Permanent upgrade slot II',desc, 2000,[1,10]);Game.last.pool='prestige';Game.last.parents=['Permanent upgrade slot I'];Game.last.iconFunction=function(){return Game.PermanentSlotIcon(1);};Game.last.activateFunction=function(){Game.AssignPermanentSlot(1);};
8817
new Game.Upgrade('Permanent upgrade slot III',desc, 30000,[2,10]);Game.last.pool='prestige';Game.last.parents=['Permanent upgrade slot II'];Game.last.iconFunction=function(){return Game.PermanentSlotIcon(2);};Game.last.activateFunction=function(){Game.AssignPermanentSlot(2);};
8818
new Game.Upgrade('Permanent upgrade slot IV',desc, 400000,[3,10]);Game.last.pool='prestige';Game.last.parents=['Permanent upgrade slot III'];Game.last.iconFunction=function(){return Game.PermanentSlotIcon(3);};Game.last.activateFunction=function(){Game.AssignPermanentSlot(3);};
8819
new Game.Upgrade('Permanent upgrade slot V',desc, 5000000,[4,10]);Game.last.pool='prestige';Game.last.parents=['Permanent upgrade slot IV'];Game.last.iconFunction=function(){return Game.PermanentSlotIcon(4);};Game.last.activateFunction=function(){Game.AssignPermanentSlot(4);};
8820
8821
var slots=['Permanent upgrade slot I','Permanent upgrade slot II','Permanent upgrade slot III','Permanent upgrade slot IV','Permanent upgrade slot V'];
8822
for (var i=0;i<slots.length;i++)
8823
{
8824
Game.Upgrades[slots[i]].descFunc=function(i){return function(){
8825
if (Game.permanentUpgrades[i]==-1) return this.desc;
8826
var upgrade=Game.UpgradesById[Game.permanentUpgrades[i]];
8827
return '<div style="text-align:center;">'+'Current : <div class="icon" style="vertical-align:middle;display:inline-block;'+(upgrade.icon[2]?'background-image:url('+upgrade.icon[2]+');':'')+'background-position:'+(-upgrade.icon[0]*48)+'px '+(-upgrade.icon[1]*48)+'px;transform:scale(0.5);margin:-16px;"></div> <b>'+upgrade.name+'</b><div class="line"></div></div>'+this.desc;
8828
};}(i);
8829
}
8830
8831
Game.PermanentSlotIcon=function(slot)
8832
{
8833
if (Game.permanentUpgrades[slot]==-1) return [slot,10];
8834
return Game.UpgradesById[Game.permanentUpgrades[slot]].icon;
8835
}
8836
Game.AssignPermanentSlot=function(slot)
8837
{
8838
PlaySound('snd/tick.mp3');
8839
Game.tooltip.hide();
8840
var list=[];
8841
for (var i in Game.Upgrades)
8842
{
8843
var me=Game.Upgrades[i];
8844
if (me.bought && me.unlocked && !me.noPerm && (me.pool=='' || me.pool=='cookie'))
8845
{
8846
var fail=0;
8847
for (var ii in Game.permanentUpgrades) {if (Game.permanentUpgrades[ii]==me.id) fail=1;}//check if not already in another permaslot
8848
if (!fail) list.push(me);
8849
}
8850
}
8851
8852
var sortMap=function(a,b)
8853
{
8854
if (a.order>b.order) return 1;
8855
else if (a.order<b.order) return -1;
8856
else return 0;
8857
}
8858
list.sort(sortMap);
8859
8860
var upgrades='';
8861
for (var i in list)
8862
{
8863
var me=list[i];
8864
upgrades+=Game.crate(me,'','PlaySound(\'snd/tick.mp3\');Game.PutUpgradeInPermanentSlot('+me.id+','+slot+');','upgradeForPermanent'+me.id);
8865
}
8866
var upgrade=Game.permanentUpgrades[slot];
8867
Game.SelectingPermanentUpgrade=upgrade;
8868
Game.Prompt('<h3>Pick an upgrade to make permanent</h3>'+
8869
8870
'<div class="line"></div><div style="margin:4px auto;clear:both;width:120px;"><div class="crate upgrade enabled" style="background-position:'+(-slot*48)+'px '+(-10*48)+'px;"></div><div id="upgradeToSlotNone" class="crate upgrade enabled" style="background-position:'+(-0*48)+'px '+(-7*48)+'px;display:'+(upgrade!=-1?'none':'block')+';"></div><div id="upgradeToSlotWrap" style="float:left;display:'+(upgrade==-1?'none':'block')+';">'+(Game.crate(Game.UpgradesById[upgrade==-1?0:upgrade],'','','upgradeToSlot'))+'</div></div>'+
8871
'<div class="block crateBox" style="overflow-y:scroll;float:left;clear:left;width:317px;padding:0px;height:250px;">'+upgrades+'</div>'+
8872
'<div class="block" style="float:right;width:152px;clear:right;height:234px;">Here are all the upgrades you\'ve purchased last playthrough.<div class="line"></div>Pick one to permanently gain its effects!<div class="line"></div>You can reassign this slot anytime you ascend.</div>'
8873
,[['Confirm','Game.permanentUpgrades['+slot+']=Game.SelectingPermanentUpgrade;Game.BuildAscendTree();Game.ClosePrompt();'],'Cancel'],0,'widePrompt');
8874
}
8875
Game.SelectingPermanentUpgrade=-1;
8876
Game.PutUpgradeInPermanentSlot=function(upgrade,slot)
8877
{
8878
Game.SelectingPermanentUpgrade=upgrade;
8879
l('upgradeToSlotWrap').innerHTML='';
8880
l('upgradeToSlotWrap').style.display=(upgrade==-1?'none':'block');
8881
l('upgradeToSlotNone').style.display=(upgrade!=-1?'none':'block');
8882
l('upgradeToSlotWrap').innerHTML=(Game.crate(Game.UpgradesById[upgrade==-1?0:upgrade],'','','upgradeToSlot'));
8883
}
8884
8885
new Game.Upgrade('Starspawn','Eggs drop <b>10%</b> more often.<br>Golden cookies appear <b>2%</b> more often during Easter.',111111,[0,12]);Game.last.pool='prestige';Game.last.parents=['Season switcher'];
8886
new Game.Upgrade('Starsnow','Christmas cookies drop <b>5%</b> more often.<br>Reindeer appear <b>5%</b> more often.',111111,[12,9]);Game.last.pool='prestige';Game.last.parents=['Season switcher'];
8887
new Game.Upgrade('Starterror','Spooky cookies drop <b>10%</b> more often.<br>Golden cookies appear <b>2%</b> more often during Halloween.',111111,[13,8]);Game.last.pool='prestige';Game.last.parents=['Season switcher'];
8888
new Game.Upgrade('Starlove','Heart cookies are <b>50%</b> more powerful.<br>Golden cookies appear <b>2%</b> more often during Valentines.',111111,[20,3]);Game.last.pool='prestige';Game.last.parents=['Season switcher'];
8889
new Game.Upgrade('Startrade','Golden cookies appear <b>5%</b> more often during Business day.',111111,[17,6]);Game.last.pool='prestige';Game.last.parents=['Season switcher'];
8890
8891
var angelPriceFactor=7;
8892
var desc=function(percent,total){return 'You gain another <b>+'+percent+'%</b> of your regular CpS while the game is closed, for a total of <b>'+total+'%</b>.';}
8893
new Game.Upgrade('Angels',desc(10,15)+'<q>Lowest-ranking at the first sphere of pastry heaven, angels are tasked with delivering new recipes to the mortals they deem worthy.</q>',Math.pow(angelPriceFactor,1),[0,11]);Game.last.pool='prestige';Game.last.parents=['Twin Gates of Transcendence'];
8894
new Game.Upgrade('Archangels',desc(10,25)+'<q>Members of the first sphere of pastry heaven, archangels are responsible for the smooth functioning of the world\'s largest bakeries.</q>',Math.pow(angelPriceFactor,2),[1,11]);Game.last.pool='prestige';Game.last.parents=['Angels'];
8895
new Game.Upgrade('Virtues',desc(10,35)+'<q>Found at the second sphere of pastry heaven, virtues make use of their heavenly strength to push and drag the stars of the cosmos.</q>',Math.pow(angelPriceFactor,3),[2,11]);Game.last.pool='prestige';Game.last.parents=['Archangels'];
8896
new Game.Upgrade('Dominions',desc(10,45)+'<q>Ruling over the second sphere of pastry heaven, dominions hold a managerial position and are in charge of accounting and regulating schedules.</q>',Math.pow(angelPriceFactor,4),[3,11]);Game.last.pool='prestige';Game.last.parents=['Virtues'];
8897
new Game.Upgrade('Cherubim',desc(10,55)+'<q>Sieging at the first sphere of pastry heaven, the four-faced cherubim serve as heavenly bouncers and bodyguards.</q>',Math.pow(angelPriceFactor,5),[4,11]);Game.last.pool='prestige';Game.last.parents=['Dominions'];
8898
new Game.Upgrade('Seraphim',desc(10,65)+'<q>Leading the first sphere of pastry heaven, seraphim possess ultimate knowledge of everything pertaining to baking.</q>',Math.pow(angelPriceFactor,6),[5,11]);Game.last.pool='prestige';Game.last.parents=['Cherubim'];
8899
new Game.Upgrade('God',desc(10,75)+'<q>Like Santa, but less fun.</q>',Math.pow(angelPriceFactor,7),[6,11]);Game.last.pool='prestige';Game.last.parents=['Seraphim'];
8900
8901
new Game.Upgrade('Twin Gates of Transcendence','You now <b>keep making cookies while the game is closed</b>, at the rate of <b>5%</b> of your regular CpS and up to <b>1 hour</b> after the game is closed.<br>(Beyond 1 hour, this is reduced by a further 90% - your rate goes down to <b>0.5%</b> of your CpS.)<q>This is one occasion you\'re always underdressed for. Don\'t worry, just rush in past the bouncer and pretend you know people.</q>',1,[15,11]);Game.last.pool='prestige';
8902
8903
new Game.Upgrade('Heavenly luck','Golden cookies appear <b>5%</b> more often.<q>Someone up there likes you.</q>',77,[22,6]);Game.last.pool='prestige';
8904
new Game.Upgrade('Lasting fortune','Golden cookies effects last <b>10%</b> longer.<q>This isn\'t your average everyday luck. This is... advanced luck.</q>',777,[23,6]);Game.last.pool='prestige';Game.last.parents=['Heavenly luck'];
8905
new Game.Upgrade('Decisive fate','Golden cookies stay <b>5%</b> longer.<q>Life just got a bit more intense.</q>',7777,[10,14]);Game.last.pool='prestige';Game.last.parents=['Lasting fortune'];
8906
8907
new Game.Upgrade('Divine discount','Buildings are <b>1% cheaper</b>.<q>Someone special deserves a special price.</q>',99999,[21,7]);Game.last.pool='prestige';Game.last.parents=['Decisive fate'];
8908
new Game.Upgrade('Divine sales','Upgrades are <b>1% cheaper</b>.<q>Everything must go!</q>',99999,[18,7]);Game.last.pool='prestige';Game.last.parents=['Decisive fate'];
8909
new Game.Upgrade('Divine bakeries','Cookie upgrades are <b>5 times cheaper</b>.<q>They sure know what they\'re doing.</q>',399999,[17,7]);Game.last.pool='prestige';Game.last.parents=['Divine sales','Divine discount'];
8910
8911
new Game.Upgrade('Starter kit','You start with <b>10 cursors</b>.<q>This can come in handy.</q>',50,[0,14]);Game.last.pool='prestige';Game.last.parents=['Tin of british tea biscuits','Box of macarons','Box of brand biscuits','Tin of butter cookies'];
8912
new Game.Upgrade('Starter kitchen','You start with <b>5 grandmas</b>.<q>Where did these come from?</q>',5000,[1,14]);Game.last.pool='prestige';Game.last.parents=['Starter kit'];
8913
new Game.Upgrade('Halo gloves','Clicks are <b>10% more powerful</b>.<q>Smite that cookie.</q>',55555,[22,7]);Game.last.pool='prestige';Game.last.parents=['Starter kit'];
8914
8915
new Game.Upgrade('Kitten angels','You gain <b>more CpS</b> the more milk you have.<q>All cats go to heaven.</q>',9000,[23,7]);Game.last.pool='prestige';Game.last.parents=['Dominions'];Game.last.kitten=1;
8916
8917
new Game.Upgrade('Unholy bait','Wrinklers appear <b>5 times</b> as fast.<q>No wrinkler can resist the scent of worm biscuits.</q>',44444,[15,12]);Game.last.pool='prestige';Game.last.parents=['Starter kitchen'];
8918
new Game.Upgrade('Sacrilegious corruption','Wrinklers regurgitate <b>5%</b> more cookies.<q>Unique in the animal kingdom, the wrinkler digestive tract is able to withstand an incredible degree of dilation - provided you prod them appropriately.</q>',444444,[19,8]);Game.last.pool='prestige';Game.last.parents=['Unholy bait'];
8919
8920
8921
order=200;new Game.TieredUpgrade('Xtreme walkers','Grandmas are <b>twice</b> as efficient.<q>Complete with flame decals and a little horn that goes "toot".</q>','Grandma',7);
8922
order=300;new Game.TieredUpgrade('Fudge fungus','Farms are <b>twice</b> as efficient.<q>A sugary parasite whose tendrils help cookie growth.<br>Please do not breathe in the spores. In case of spore ingestion, seek medical help within the next 36 seconds.</q>','Farm',7);
8923
order=400;new Game.TieredUpgrade('Planetsplitters','Mines are <b>twice</b> as efficient.<q>These new state-of-the-art excavators have been tested on Merula, Globort and Flwanza VI, among other distant planets which have been curiously quiet lately.</q>','Mine',7);
8924
order=500;new Game.TieredUpgrade('Cyborg workforce','Factories are <b>twice</b> as efficient.<q>Semi-synthetic organisms don\'t slack off, don\'t unionize, and have 20% shorter lunch breaks, making them ideal labor fodder.</q>','Factory',7);
8925
order=525;new Game.TieredUpgrade('Way of the wallet','Banks are <b>twice</b> as efficient.<q>This new monetary school of thought is all the rage on the banking scene; follow its precepts and you may just profit from it.</q>','Bank',7);
8926
order=550;new Game.TieredUpgrade('Creation myth','Temples are <b>twice</b> as efficient.<q>Stories have been circulating about the origins of the very first cookie that was ever baked; tales of how it all began, in the Dough beyond time and the Ovens of destiny.</q>','Temple',7);
8927
order=575;new Game.TieredUpgrade('Cookiemancy','Wizard towers are <b>twice</b> as efficient.<q>There it is; the perfected school of baking magic. From summoning chips to hexing nuts, there is not a single part of cookie-making that hasn\'t been improved tenfold by magic tricks.</q>','Wizard tower',7);
8928
order=600;new Game.TieredUpgrade('Dyson sphere','Shipments are <b>twice</b> as efficient.<q>You\'ve found a way to apply your knowledge of cosmic technology to slightly more local endeavors; this gigantic sphere of meta-materials, wrapping the solar system, is sure to kick your baking abilities up a notch.</q>','Shipment',7);
8929
order=700;new Game.TieredUpgrade('Theory of atomic fluidity','Alchemy labs are <b>twice</b> as efficient.<q>Pushing alchemy to its most extreme limits, you find that everything is transmutable into anything else - lead to gold, mercury to water; more importantly, you realize that anything can -and should- be converted to cookies.</q>','Alchemy lab',7);
8930
order=800;new Game.TieredUpgrade('End of times back-up plan','Portals are <b>twice</b> as efficient.<q>Just in case, alright?</q>','Portal',7);
8931
order=900;new Game.TieredUpgrade('Great loop hypothesis','Time machines are <b>twice</b> as efficient.<q>What if our universe is just one instance of an infinite cycle? What if, before and after it, stretched infinite amounts of the same universe, themselves containing infinite amounts of cookies?</q>','Time machine',7);
8932
order=1000;new Game.TieredUpgrade('The Pulse','Antimatter condensers are <b>twice</b> as efficient.<q>You\'ve tapped into the very pulse of the cosmos, a timeless rhythm along which every material and antimaterial thing beats in unison. This, somehow, means more cookies.</q>','Antimatter condenser',7);
8933
order=1100;
8934
new Game.TieredUpgrade('Lux sanctorum','Prisms are <b>twice</b> as efficient.<q>Your prism attendants have become increasingly mesmerized with something in the light - or maybe something beyond it; beyond us all, perhaps?</q>','Prism',7);
8935
8936
8937
order=200;new Game.TieredUpgrade('The Unbridling','Grandmas are <b>twice</b> as efficient.<q>It might be a classic tale of bad parenting, but let\'s see where grandma is going with this.</q>','Grandma',8);
8938
order=300;new Game.TieredUpgrade('Wheat triffids','Farms are <b>twice</b> as efficient.<q>Taking care of crops is so much easier when your plants can just walk about and help around the farm.<br>Do not pet. Do not feed. Do not attempt to converse with.</q>','Farm',8);
8939
order=400;new Game.TieredUpgrade('Canola oil wells','Mines are <b>twice</b> as efficient.<q>A previously untapped resource, canola oil permeates the underground olifers which grant it its particular taste and lucrative properties.</q>','Mine',8);
8940
order=500;new Game.TieredUpgrade('78-hour days','Factories are <b>twice</b> as efficient.<q>Why didn\'t we think of this earlier?</q>','Factory',8);
8941
order=525;new Game.TieredUpgrade('The stuff rationale','Banks are <b>twice</b> as efficient.<q>If not now, when? If not it, what? If not things... stuff?</q>','Bank',8);
8942
order=550;new Game.TieredUpgrade('Theocracy','Temples are <b>twice</b> as efficient.<q>You\'ve turned your cookie empire into a perfect theocracy, gathering the adoration of zillions of followers from every corner of the universe.<br>Don\'t let it go to your head.</q>','Temple',8);
8943
order=575;new Game.TieredUpgrade('Rabbit trick','Wizard towers are <b>twice</b> as efficient.<q>Using nothing more than a fancy top hat, your wizards have found a way to simultaneously curb rabbit population and produce heaps of extra cookies for basically free!<br>Resulting cookies may or may not be fit for vegans.</q>','Wizard tower',8);
8944
order=600;new Game.TieredUpgrade('The final frontier','Shipments are <b>twice</b> as efficient.<q>It\'s been a long road, getting from there to here. It\'s all worth it though - the sights are lovely and the oil prices slightly more reasonable.</q>','Shipment',8);
8945
order=700;new Game.TieredUpgrade('Beige goo','Alchemy labs are <b>twice</b> as efficient.<q>Well now you\'ve done it. Good job. Very nice. That\'s 3 galaxies you\'ve just converted into cookies. Good thing you can hop from universe to universe.</q>','Alchemy lab',8);
8946
order=800;new Game.TieredUpgrade('Maddening chants','Portals are <b>twice</b> as efficient.<q>A popular verse goes like so : "jau\'hn madden jau\'hn madden aeiouaeiouaeiou brbrbrbrbrbrbr"</q>','Portal',8);
8947
order=900;new Game.TieredUpgrade('Cookietopian moments of maybe','Time machines are <b>twice</b> as efficient.<q>Reminiscing how things could have been, should have been, will have been.</q>','Time machine',8);
8948
order=1000;new Game.TieredUpgrade('Some other super-tiny fundamental particle? Probably?','Antimatter condensers are <b>twice</b> as efficient.<q>When even the universe is running out of ideas, that\'s when you know you\'re nearing the end.</q>','Antimatter condenser',8);
8949
order=1100;
8950
new Game.TieredUpgrade('Reverse shadows','Prisms are <b>twice</b> as efficient.<q>Oh man, this is really messing with your eyes.</q>','Prism',8);
8951
8952
8953
order=20000;
8954
new Game.Upgrade('Kitten accountants','You gain <b>more CpS</b> the more milk you have.<q>business going great, sir</q>',900000000000000000000000,Game.GetIcon('Kitten',6));Game.last.kitten=1;Game.MakeTiered(Game.last,6,18);
8955
new Game.Upgrade('Kitten specialists','You gain <b>more CpS</b> the more milk you have.<q>optimeowzing your workflow like whoah, sir</q>',900000000000000000000000000,Game.GetIcon('Kitten',7));Game.last.kitten=1;Game.MakeTiered(Game.last,7,18);
8956
new Game.Upgrade('Kitten experts','You gain <b>more CpS</b> the more milk you have.<q>10 years expurrrtise in the cookie business, sir</q>',900000000000000000000000000000,Game.GetIcon('Kitten',8));Game.last.kitten=1;Game.MakeTiered(Game.last,8,18);
8957
8958
new Game.Upgrade('How to bake your dragon','Allows you to purchase a <b>crumbly egg</b> once you have earned 1 million cookies.<q>A tome full of helpful tips such as "oh god, stay away from it", "why did we buy this thing, it\'s not even house-broken" and "groom twice a week in the direction of the scales".</q>',9,[22,12]);Game.last.pool='prestige';
8959
8960
order=25100;
8961
new Game.Upgrade('A crumbly egg','Unlocks the <b>cookie dragon egg</b>.<q>Thank you for adopting this robust, fun-loving cookie dragon! It will bring you years of joy and entertainment.<br>Keep in a dry and cool place, and away from other house pets. Subscription to home insurance is strongly advised.</q>',25,[21,12]);
8962
8963
new Game.Upgrade('Chimera','Synergy upgrades are <b>2% cheaper</b>.<br>You gain another <b>+5%</b> of your regular CpS while the game is closed.<br>You retain optimal cookie production while the game is closed for <b>2 more days</b>.<q>More than the sum of its parts.</q>',Math.pow(angelPriceFactor,9),[24,7]);Game.last.pool='prestige';Game.last.parents=['God','Lucifer','Synergies Vol. II'];
8964
8965
new Game.Upgrade('Tin of butter cookies','Contains an assortment of rich butter cookies.<q>Five varieties of danish cookies.<br>Complete with little paper cups.</q>',25,[21,9]);Game.last.pool='prestige';Game.last.parents=['Heavenly cookies'];
8966
8967
new Game.Upgrade('Golden switch','Unlocks the <b>golden switch</b>, which passively boosts your CpS by 50% but disables golden cookies.<q>Less clicking, more idling.</q>',999,[21,10]);Game.last.pool='prestige';Game.last.parents=['Heavenly luck'];
8968
8969
new Game.Upgrade('Classic dairy selection','Unlocks the <b>milk selector</b>, letting you pick which milk is displayed under your cookie.<br>Comes with a variety of basic flavors.<q>Don\'t have a cow, man.</q>',9,[1,8]);Game.last.pool='prestige';Game.last.parents=[];
8970
8971
new Game.Upgrade('Fanciful dairy selection','Contains more exotic flavors for your milk selector.<q>Strong bones for the skeleton army.</q>',1000000,[9,7]);Game.last.pool='prestige';Game.last.parents=['Classic dairy selection'];
8972
8973
order=10300;
8974
Game.NewUpgradeCookie({name:'Dragon cookie',desc:'Imbued with the vigor and vitality of a full-grown cookie dragon, this mystical cookie will embolden your empire for the generations to come.',icon:[10,25],power:5,price:9999999999999999*7,locked:1});
8975
8976
8977
order=40000;
8978
new Game.Upgrade('Golden switch [off]','Turning this on will give you a passive <b>+50% CpS</b>, but prevents golden cookies from spawning.<br>Cost is equal to 1 hour of production.',1000000,[20,10]);
8979
Game.last.pool='toggle';Game.last.toggleInto='Golden switch [on]';
8980
Game.last.priceFunc=function(){return Game.cookiesPs*60*60;}
8981
var func=function(){
8982
if (Game.Has('Residual luck'))
8983
{
8984
var bonus=0;
8985
var upgrades=Game.goldenCookieUpgrades;
8986
for (var i in upgrades) {if (Game.Has(upgrades[i])) bonus++;}
8987
return '<div style="text-align:center;">'+Game.listTinyOwnedUpgrades(Game.goldenCookieUpgrades)+'<br><br>The effective boost is <b>+'+Beautify(Math.round(50+bonus*10))+'%</b><br>thanks to residual luck<br>and your <b>'+bonus+'</b> golden cookie upgrade'+(bonus==1?'':'s')+'.</div><div class="line"></div>'+this.desc;
8988
}
8989
return this.desc;
8990
};
8991
Game.last.descFunc=func;
8992
8993
new Game.Upgrade('Golden switch [on]','The switch is currently giving you a passive <b>+50% CpS</b>; it also prevents golden cookies from spawning.<br>Turning it off will revert those effects.<br>Cost is equal to 1 hour of production.',1000000,[21,10]);
8994
Game.last.pool='toggle';Game.last.toggleInto='Golden switch [off]';
8995
Game.last.priceFunc=function(){return Game.cookiesPs*60*60;}
8996
Game.last.descFunc=func;
8997
8998
order=50000;
8999
new Game.Upgrade('Milk selector','Lets you pick what flavor of milk to display.',0,[1,8]);
9000
Game.last.descFunc=function(){
9001
var choice=this.choicesFunction()[Game.milkType];
9002
return '<div style="text-align:center;">Current : <div class="icon" style="vertical-align:middle;display:inline-block;'+(choice.icon[2]?'background-image:url('+choice.icon[2]+');':'')+'background-position:'+(-choice.icon[0]*48)+'px '+(-choice.icon[1]*48)+'px;transform:scale(0.5);margin:-16px;"></div> <b>'+choice.name+'</b></div><div class="line"></div>'+this.desc;
9003
};
9004
9005
Game.last.pool='toggle';
9006
Game.last.choicesFunction=function()
9007
{
9008
var choices=[];
9009
choices[0]={name:'Automatic',icon:[0,7]};
9010
choices[1]={name:'Plain milk',icon:[1,8]};
9011
choices[2]={name:'Chocolate milk',icon:[2,8]};
9012
choices[3]={name:'Raspberry milk',icon:[3,8]};
9013
choices[4]={name:'Orange milk',icon:[4,8]};
9014
choices[5]={name:'Caramel milk',icon:[5,8]};
9015
choices[6]={name:'Banana milk',icon:[6,8]};
9016
choices[7]={name:'Lime milk',icon:[7,8]};
9017
choices[8]={name:'Blueberry milk',icon:[8,8]};
9018
choices[9]={name:'Strawberry milk',icon:[9,8]};
9019
choices[10]={name:'Vanilla milk',icon:[10,8]};
9020
9021
if (Game.Has('Fanciful dairy selection'))
9022
{
9023
choices[11]={name:'Zebra milk',icon:[10,7]};
9024
choices[12]={name:'Cosmic milk',icon:[9,7]};
9025
choices[13]={name:'Flaming milk',icon:[8,7]};
9026
choices[14]={name:'Sanguine milk',icon:[7,7]};
9027
choices[15]={name:'Midas milk',icon:[6,7]};
9028
choices[16]={name:'Midnight milk',icon:[5,7]};
9029
choices[17]={name:'Green inferno milk',icon:[4,7]};
9030
choices[18]={name:'Frostfire milk',icon:[3,7]};
9031
9032
choices[24]={name:'Soy milk',icon:[27,23]};
9033
}
9034
9035
choices[19]={name:'Honey milk',icon:[21,23]};
9036
choices[20]={name:'Coffee milk',icon:[22,23]};
9037
choices[21]={name:'Tea milk',icon:[23,23]};
9038
choices[22]={name:'Coconut milk',icon:[24,23]};
9039
choices[23]={name:'Cherry milk',icon:[25,23]};
9040
9041
choices[25]={name:'Spiced milk',icon:[26,23]};
9042
choices[26]={name:'Maple milk',icon:[28,23]};
9043
choices[27]={name:'Mint milk',icon:[29,23]};
9044
9045
choices[Game.milkType].selected=1;
9046
return choices;
9047
}
9048
Game.last.choicesPick=function(id)
9049
{Game.milkType=id;}
9050
9051
Game.MilksByChoice={
9052
0:{pic:'milkPlain'},
9053
1:{pic:'milkPlain'},
9054
2:{pic:'milkChocolate'},
9055
3:{pic:'milkRaspberry'},
9056
4:{pic:'milkOrange'},
9057
5:{pic:'milkCaramel'},
9058
6:{pic:'milkBanana'},
9059
7:{pic:'milkLime'},
9060
8:{pic:'milkBlueberry'},
9061
9:{pic:'milkStrawberry'},
9062
10:{pic:'milkVanilla'},
9063
11:{pic:'milkZebra'},
9064
12:{pic:'milkStars'},
9065
13:{pic:'milkFire'},
9066
14:{pic:'milkBlood'},
9067
15:{pic:'milkGold'},
9068
16:{pic:'milkBlack'},
9069
17:{pic:'milkGreenFire'},
9070
18:{pic:'milkBlueFire'},
9071
19:{pic:'milkHoney'},
9072
20:{pic:'milkCoffee'},
9073
21:{pic:'milkTea'},
9074
22:{pic:'milkCoconut'},
9075
23:{pic:'milkCherry'},
9076
24:{pic:'milkSoy'},
9077
25:{pic:'milkSpiced'},
9078
26:{pic:'milkMaple'},
9079
27:{pic:'milkMint'},
9080
};
9081
9082
9083
order=10300;
9084
Game.NewUpgradeCookie({name:'Milk chocolate butter biscuit',desc:'Rewarded for owning 100 of everything.<br>It bears the engraving of a fine entrepreneur.',icon:[27,8],power: 10,price: 999999999999999999999,locked:1});
9085
Game.NewUpgradeCookie({name:'Dark chocolate butter biscuit',desc:'Rewarded for owning 150 of everything.<br>It is adorned with the image of an experienced cookie tycoon.',icon:[27,9],power: 10,price: 999999999999999999999999,locked:1});
9086
Game.NewUpgradeCookie({name:'White chocolate butter biscuit',desc:'Rewarded for owning 200 of everything.<br>The chocolate is chiseled to depict a masterful pastry magnate.',icon:[28,9],power: 10,price: 999999999999999999999999999,locked:1});
9087
Game.NewUpgradeCookie({name:'Ruby chocolate butter biscuit',desc:'Rewarded for owning 250 of everything.<br>Covered in a rare red chocolate, this biscuit is etched to represent the face of a cookie industrialist gone mad with power.',icon:[28,8],power: 10,price: 999999999999999999999999999999,locked:1});
9088
9089
order=10020;
9090
Game.NewUpgradeCookie({name:'Gingersnaps',desc:'Cookies with a soul. Probably.',icon:[29,10],power: 4,price: 99999999999999999999});
9091
Game.NewUpgradeCookie({name:'Cinnamon cookies',desc:'The secret is in the patented swirly glazing.',icon:[23,8],power: 4,price: 99999999999999999999*5});
9092
Game.NewUpgradeCookie({name:'Vanity cookies',desc:'One tiny candied fruit sits atop this decadent cookie.',icon:[22,8],power: 4,price: 999999999999999999999});
9093
Game.NewUpgradeCookie({name:'Cigars',desc:'Close, but no match for those extravagant cookie straws they serve in coffee shops these days.',icon:[25,8],power: 4,price: 999999999999999999999*5});
9094
Game.NewUpgradeCookie({name:'Pinwheel cookies',desc:'Bringing you the dizzying combination of brown flavor and beige taste!',icon:[22,10],power: 4,price: 9999999999999999999999});
9095
Game.NewUpgradeCookie({name:'Fudge squares',desc:'Not exactly cookies, but you won\'t care once you\'ve tasted one of these.<br>They\'re so good, it\'s fudged-up!',icon:[24,8],power: 4,price: 9999999999999999999999*5});
9096
9097
order=10030;
9098
Game.NewUpgradeCookie({name:'Digits',desc:'Three flavors, zero phalanges.',icon:[26,8],require:'Box of brand biscuits',power: 2, price: 999999999999999*5});
9099
9100
order=10029;
9101
Game.NewUpgradeCookie({name:'Butter horseshoes',desc:'It would behoove you to not overindulge in these.',icon:[22,9],require:'Tin of butter cookies',power: 4, price: 99999999999999999999999});
9102
Game.NewUpgradeCookie({name:'Butter pucks',desc:'Lord, what fools these mortals be!<br>(This is kind of a hokey reference.)',icon:[23,9],require:'Tin of butter cookies',power: 4, price: 99999999999999999999999*5});
9103
Game.NewUpgradeCookie({name:'Butter knots',desc:'Look, you can call these pretzels if you want, but you\'d just be fooling yourself, wouldn\'t you?',icon:[24,9],require:'Tin of butter cookies',power: 4, price: 999999999999999999999999});
9104
Game.NewUpgradeCookie({name:'Butter slabs',desc:'Nothing butter than a slab to the face.',icon:[25,9],require:'Tin of butter cookies',power: 4, price: 999999999999999999999999*5});
9105
Game.NewUpgradeCookie({name:'Butter swirls',desc:'These are equal parts sugar, butter, and warm fuzzy feelings - all of which cause millions of deaths everyday.',icon:[26,9],require:'Tin of butter cookies',power: 4, price: 9999999999999999999999999});
9106
9107
order=10020;
9108
Game.NewUpgradeCookie({name:'Shortbread biscuits',desc:'These rich butter cookies are neither short, nor bread. What a country!',icon:[23,10],power: 4,price: 99999999999999999999999});
9109
Game.NewUpgradeCookie({name:'Millionaires\' shortbreads',desc:'Three thought-provoking layers of creamy chocolate, hard-working caramel and crumbly biscuit in a poignant commentary of class struggle.',icon:[24,10],power: 4,price: 99999999999999999999999*5});
9110
Game.NewUpgradeCookie({name:'Caramel cookies',desc:'The polymerized carbohydrates adorning these cookies are sure to stick to your teeth for quite a while.',icon:[25,10],power: 4,price: 999999999999999999999999});
9111
9112
9113
var desc=function(totalHours){
9114
var hours=totalHours%24;
9115
var days=Math.floor(totalHours/24);
9116
var str=hours+(hours==1?' hour':' hours');
9117
if (days>0) str=days+(days==1?' day':' days')+' and '+str;
9118
return 'You retain optimal cookie production while the game is closed for twice as long, for a total of <b>'+str+'</b>.';
9119
}
9120
new Game.Upgrade('Belphegor',desc(2)+'<q>A demon of shortcuts and laziness, Belphegor commands machines to do work in his stead.</q>',Math.pow(angelPriceFactor,1),[7,11]);Game.last.pool='prestige';Game.last.parents=['Twin Gates of Transcendence'];
9121
new Game.Upgrade('Mammon',desc(4)+'<q>The demonic embodiment of wealth, Mammon requests a tithe of blood and gold from all his worshippers.</q>',Math.pow(angelPriceFactor,2),[8,11]);Game.last.pool='prestige';Game.last.parents=['Belphegor'];
9122
new Game.Upgrade('Abaddon',desc(8)+'<q>Master of overindulgence, Abaddon governs the wrinkler brood and inspires their insatiability.</q>',Math.pow(angelPriceFactor,3),[9,11]);Game.last.pool='prestige';Game.last.parents=['Mammon'];
9123
new Game.Upgrade('Satan',desc(16)+'<q>The counterpoint to everything righteous, this demon represents the nefarious influence of deceit and temptation.</q>',Math.pow(angelPriceFactor,4),[10,11]);Game.last.pool='prestige';Game.last.parents=['Abaddon'];
9124
new Game.Upgrade('Asmodeus',desc(32)+'<q>This demon with three monstrous heads draws his power from the all-consuming desire for cookies and all things sweet.</q>',Math.pow(angelPriceFactor,5),[11,11]);Game.last.pool='prestige';Game.last.parents=['Satan'];
9125
new Game.Upgrade('Beelzebub',desc(64)+'<q>The festering incarnation of blight and disease, Beelzebub rules over the vast armies of pastry inferno.</q>',Math.pow(angelPriceFactor,6),[12,11]);Game.last.pool='prestige';Game.last.parents=['Asmodeus'];
9126
new Game.Upgrade('Lucifer',desc(128)+'<q>Also known as the Lightbringer, this infernal prince\'s tremendous ego caused him to be cast down from pastry heaven.</q>',Math.pow(angelPriceFactor,7),[13,11]);Game.last.pool='prestige';Game.last.parents=['Beelzebub'];
9127
9128
new Game.Upgrade('Golden cookie alert sound','Unlocks the <b>golden cookie sound selector</b>, which lets you pick whether golden cookies emit a sound when appearing or not.<q>A sound decision.</q>',9999,[28,6]);Game.last.pool='prestige';Game.last.parents=['Decisive fate','Golden switch'];
9129
9130
order=49900;
9131
new Game.Upgrade('Golden cookie sound selector','Lets you change the sound golden cookies make when they spawn.',0,[28,6]);
9132
Game.last.descFunc=function(){
9133
var choice=this.choicesFunction()[Game.chimeType];
9134
return '<div style="text-align:center;">Current : <div class="icon" style="vertical-align:middle;display:inline-block;'+(choice.icon[2]?'background-image:url('+icon[2]+');':'')+'background-position:'+(-choice.icon[0]*48)+'px '+(-choice.icon[1]*48)+'px;transform:scale(0.5);margin:-16px;"></div> <b>'+choice.name+'</b></div><div class="line"></div>'+this.desc;
9135
};
9136
9137
Game.last.pool='toggle';
9138
Game.last.choicesFunction=function()
9139
{
9140
var choices=[];
9141
choices[0]={name:'No sound',icon:[0,7]};
9142
choices[1]={name:'Chime',icon:[22,6]};
9143
9144
choices[Game.chimeType].selected=1;
9145
return choices;
9146
}
9147
Game.last.choicesPick=function(id)
9148
{Game.chimeType=id;}
9149
9150
9151
new Game.Upgrade('Basic wallpaper assortment','Unlocks the <b>background selector</b>, letting you select the game\'s background.<br>Comes with a variety of basic flavors.<q>Prioritizing aesthetics over crucial utilitarian upgrades? Color me impressed.</q>',99,[29,5]);Game.last.pool='prestige';Game.last.parents=['Classic dairy selection'];
9152
9153
new Game.Upgrade('Legacy','This is the first heavenly upgrade; it unlocks the <b>Heavenly chips</b> system.<div class="line"></div>Each time you ascend, the cookies you made in your past life are turned into <b>heavenly chips</b> and <b>prestige</b>.<div class="line"></div><b>Heavenly chips</b> can be spent on a variety of permanent transcendental upgrades.<div class="line"></div>Your <b>prestige level</b> also gives you a permanent <b>+1% CpS</b> per level.<q>We\'ve all been waiting for you.</q>',1,[21,6]);Game.last.pool='prestige';Game.last.parents=[];
9154
9155
new Game.Upgrade('Elder spice','You can attract <b>2 more wrinklers</b>.<q>The cookie your cookie could smell like.</q>',444444,[19,8]);Game.last.pool='prestige';Game.last.parents=['Unholy bait'];
9156
9157
new Game.Upgrade('Residual luck','While the golden switch is on, you gain an additional <b>+10% CpS</b> per golden cookie upgrade owned.<q>Fortune comes in many flavors.</q>',99999,[27,6]);Game.last.pool='prestige';Game.last.parents=['Golden switch'];
9158
9159
order=150;new Game.Upgrade('Fantasteel mouse','Clicking gains <b>+1% of your CpS</b>.<q>You could be clicking using your touchpad and we\'d be none the wiser.</q>',5000000000000000000,[11,17]);Game.MakeTiered(Game.last,8,11);
9160
new Game.Upgrade('Nevercrack mouse','Clicking gains <b>+1% of your CpS</b>.<q>How much beefier can you make a mouse until it\'s considered a rat?</q>',500000000000000000000,[11,18]);Game.MakeTiered(Game.last,9,11);
9161
9162
9163
new Game.Upgrade('Five-finger discount','All upgrades are <b>1% cheaper per 100 cursors</b>.<q>Stick it to the man.</q>',555555,[28,7],function(){Game.upgradesToRebuild=1;});Game.last.pool='prestige';Game.last.parents=['Halo gloves','Abaddon'];
9164
9165
9166
order=5000;
9167
Game.SynergyUpgrade('Future almanacs','<q>Lets you predict optimal planting times. It\'s crazy what time travel can do!</q>','Farm','Time machine','synergy1');
9168
Game.SynergyUpgrade('Rain prayer','<q>A deeply spiritual ceremonial involving complicated dance moves and high-tech cloud-busting lasers.</q>','Farm','Temple','synergy2');
9169
9170
Game.SynergyUpgrade('Seismic magic','<q>Surprise earthquakes are an old favorite of wizardly frat houses.</q>','Mine','Wizard tower','synergy1');
9171
Game.SynergyUpgrade('Asteroid mining','<q>As per the <span>19</span>74 United Cosmic Convention, comets, moons, and inhabited planetoids are no longer legally excavatable.<br>But hey, a space bribe goes a long way.</q>','Mine','Shipment','synergy2');
9172
9173
Game.SynergyUpgrade('Quantum electronics','<q>Your machines won\'t even be sure if they\'re on or off!</q>','Factory','Antimatter condenser','synergy1');
9174
Game.SynergyUpgrade('Temporal overclocking','<q>Introduce more quickitude in your system for increased speedation of fastness.</q>','Factory','Time machine','synergy2');
9175
9176
Game.SynergyUpgrade('Contracts from beyond','<q>Make sure to read the fine print!</q>','Bank','Portal','synergy1');
9177
Game.SynergyUpgrade('Printing presses','<q>Fake bills so real, they\'re almost worth the ink they\'re printed with.</q>','Bank','Factory','synergy2');
9178
9179
Game.SynergyUpgrade('Paganism','<q>Some deities are better left unworshipped.</q>','Temple','Portal','synergy1');
9180
Game.SynergyUpgrade('God particle','<q>Turns out God is much tinier than we thought, I guess.</q>','Temple','Antimatter condenser','synergy2');
9181
9182
Game.SynergyUpgrade('Arcane knowledge','<q>Some things were never meant to be known - only mildly speculated.</q>','Wizard tower','Alchemy lab','synergy1');
9183
Game.SynergyUpgrade('Magical botany','<q>Already known in some reactionary newspapers as "the wizard\'s GMOs".</q>','Wizard tower','Farm','synergy2');
9184
9185
Game.SynergyUpgrade('Fossil fuels','<q>Somehow better than plutonium for powering rockets.<br>Extracted from the fuels of ancient, fossilized civilizations.</q>','Shipment','Mine','synergy1');
9186
Game.SynergyUpgrade('Shipyards','<q>Where carpentry, blind luck, and asbestos insulation unite to produce the most dazzling spaceships on the planet.</q>','Shipment','Factory','synergy2');
9187
9188
Game.SynergyUpgrade('Primordial ores','<q>Only when refining the purest metals will you extract the sweetest sap of the earth.</q>','Alchemy lab','Mine','synergy1');
9189
Game.SynergyUpgrade('Gold fund','<q>If gold is the backbone of the economy, cookies, surely, are its hip joints.</q>','Alchemy lab','Bank','synergy2');
9190
9191
Game.SynergyUpgrade('Infernal crops','<q>Sprinkle regularly with FIRE.</q>','Portal','Farm','synergy1');
9192
Game.SynergyUpgrade('Abysmal glimmer','<q>Someone, or something, is staring back at you.<br>Perhaps at all of us.</q>','Portal','Prism','synergy2');
9193
9194
Game.SynergyUpgrade('Relativistic parsec-skipping','<q>People will tell you this isn\'t physically possible.<br>These are people you don\'t want on your ship.</q>','Time machine','Shipment','synergy1');
9195
Game.SynergyUpgrade('Primeval glow','<q>From unending times, an ancient light still shines, impossibly pure and fragile in its old age.</q>','Time machine','Prism','synergy2');
9196
9197
Game.SynergyUpgrade('Extra physics funding','<q>Time to put your money where your particle colliders are.</q>','Antimatter condenser','Bank','synergy1');
9198
Game.SynergyUpgrade('Chemical proficiency','<q>Discover exciting new elements, such as Fleshmeltium, Inert Shampoo Byproduct #17 and Carbon++!</q>','Antimatter condenser','Alchemy lab','synergy2');
9199
9200
Game.SynergyUpgrade('Light magic','<q>Actually not to be taken lightly! No, I\'m serious. 178 people died last year. You don\'t mess around with magic.</q>','Prism','Wizard tower','synergy1');
9201
Game.SynergyUpgrade('Mystical energies','<q>Something beckons from within the light. It is warm, comforting, and apparently the cause for several kinds of exotic skin cancers.</q>','Prism','Temple','synergy2');
9202
9203
9204
new Game.Upgrade('Synergies Vol. I','Unlocks a new tier of upgrades that affect <b>2 buildings at the same time</b>.<br>Synergies appear once you have <b>15</b> of both buildings.<q>The many beats the few.</q>',222222,[10,20]);Game.last.pool='prestige';Game.last.parents=['Satan','Dominions'];
9205
new Game.Upgrade('Synergies Vol. II','Unlocks a new tier of upgrades that affect <b>2 buildings at the same time</b>.<br>Synergies appear once you have <b>75</b> of both buildings.<q>The several beats the many.</q>',2222222,[10,29]);Game.last.pool='prestige';Game.last.parents=['Beelzebub','Seraphim','Synergies Vol. I'];
9206
9207
new Game.Upgrade('Heavenly cookies','Cookie production multiplier <b>+10% permanently</b>.<q>Baked with heavenly chips. An otherwordly flavor that transcends time and space.</q>',3,[25,12]);Game.last.pool='prestige';Game.last.parents=['Legacy'];Game.last.power=10;Game.last.pseudoCookie=true;
9208
new Game.Upgrade('Wrinkly cookies','Cookie production multiplier <b>+10% permanently</b>.<q>The result of regular cookies left to age out for countless eons in a place where time and space are meaningless.</q>',6666666,[26,12]);Game.last.pool='prestige';Game.last.parents=['Sacrilegious corruption','Elder spice'];Game.last.power=10;Game.last.pseudoCookie=true;
9209
new Game.Upgrade('Distilled essence of redoubled luck','Golden cookies (and all other things that spawn, such as reindeer) have <b>1% chance of being doubled</b>.<q>Tastes glittery. The empty phial makes for a great pencil holder.</q>',7777777,[27,12]);Game.last.pool='prestige';Game.last.parents=['Divine bakeries','Residual luck'];
9210
9211
order=40000;
9212
new Game.Upgrade('Occult obstruction','Cookie production <b>reduced to 0</b>.<q>If symptoms persist, consult a doctor.</q>',7,[15,5]);//debug purposes only
9213
Game.last.pool='debug';
9214
new Game.Upgrade('Glucose-charged air','Sugar lumps coalesce <b>a whole lot faster</b>.<q>Don\'t breathe too much or you\'ll get diabetes!</q>',7,[29,16]);//debug purposes only
9215
Game.last.pool='debug';
9216
9217
order=10300;
9218
Game.NewUpgradeCookie({name:'Lavender chocolate butter biscuit',desc:'Rewarded for owning 300 of everything.<br>This subtly-flavored biscuit represents the accomplishments of decades of top-secret research. The molded design on the chocolate resembles a well-known entrepreneur who gave their all to the ancient path of baking.',icon:[26,10],power: 10,price: 999999999999999999999999999999999,locked:1});
9219
9220
order=10030;
9221
Game.NewUpgradeCookie({name:'Lombardia cookies',desc:'These come from those farms with the really good memory.',icon:[23,13],require:'Box of brand biscuits',power: 3, price: 999999999999999999999*5});
9222
Game.NewUpgradeCookie({name:'Bastenaken cookies',desc:'French cookies made of delicious cinnamon and candy sugar. These do not contain Nuts!',icon:[24,13],require:'Box of brand biscuits',power: 3, price: 999999999999999999999*5});
9223
9224
order=10020;
9225
Game.NewUpgradeCookie({name:'Pecan sandies',desc:'Stick a nut on a cookie and call it a day! Name your band after it! Whatever!',icon:[25,13],power: 4,price: 999999999999999999999999*5});
9226
Game.NewUpgradeCookie({name:'Moravian spice cookies',desc:'Popular for being the world\'s moravianest cookies.',icon:[26,13],power: 4,price: 9999999999999999999999999});
9227
Game.NewUpgradeCookie({name:'Anzac biscuits',desc:'Army biscuits from a bakery down under, containing no eggs but yes oats.',icon:[27,13],power: 4,price: 9999999999999999999999999*5});
9228
Game.NewUpgradeCookie({name:'Buttercakes',desc:'Glistening with cholesterol, these cookies moistly straddle the line between the legal definition of a cookie and just a straight-up stick of butter.',icon:[29,13],power: 4,price: 99999999999999999999999999});
9229
Game.NewUpgradeCookie({name:'Ice cream sandwiches',desc:'In an alternate universe, "ice cream sandwich" designates an ice cream cone filled with bacon, lettuce, and tomatoes. Maybe some sprinkles too.',icon:[28,13],power: 4,price: 99999999999999999999999999*5});
9230
9231
new Game.Upgrade('Stevia Caelestis','Sugar lumps ripen <b>an hour sooner</b>.<q>A plant of supernatural sweetness grown by angels in heavenly gardens.</q>',100000000,[25,15]);Game.last.pool='prestige';Game.last.parents=['Wrinkly cookies'];
9232
new Game.Upgrade('Diabetica Daemonicus','Sugar lumps mature <b>an hour sooner</b>.<q>A malevolent, if delicious herb that is said to grow on the cliffs of the darkest abyss of the underworld.</q>',300000000,[26,15]);Game.last.pool='prestige';Game.last.parents=['Stevia Caelestis','Lucifer'];
9233
new Game.Upgrade('Sucralosia Inutilis','Bifurcated sugar lumps appear <b>5% more often</b> and are <b>5% more likely</b> to drop 2 lumps.<q>A rare berry of uninteresting flavor that is as elusive as its uses are limited; only sought-after by the most avid collectors with too much wealth on their hands.</q>',1000000000,[27,15]);Game.last.pool='prestige';Game.last.parents=['Diabetica Daemonicus'];
9234
9235
//note : these showIf functions stop working beyond 10 quadrillion prestige level, due to loss in precision; the solution, of course, is to make sure 10 quadrillion is not an attainable prestige level
9236
new Game.Upgrade('Lucky digit','<b>+1%</b> prestige level effect on CpS.<br><b>+1%</b> golden cookie effect duration.<br><b>+1%</b> golden cookie lifespan.<q>This upgrade is a bit shy and only appears when your prestige level ends in 7.</q>',777,[24,15]);Game.last.pool='prestige';Game.last.parents=['Heavenly luck'];Game.last.showIf=function(){return (Math.ceil(Game.prestige)%10==7);};
9237
new Game.Upgrade('Lucky number','<b>+1%</b> prestige level effect on CpS.<br><b>+1%</b> golden cookie effect duration.<br><b>+1%</b> golden cookie lifespan.<q>This upgrade is a reclusive hermit and only appears when your prestige level ends in 777.</q>',77777,[24,15]);Game.last.pool='prestige';Game.last.parents=['Lucky digit','Lasting fortune'];Game.last.showIf=function(){return (Math.ceil(Game.prestige)%1000==777);};
9238
new Game.Upgrade('Lucky payout','<b>+1%</b> prestige level effect on CpS.<br><b>+1%</b> golden cookie effect duration.<br><b>+1%</b> golden cookie lifespan.<q>This upgrade took an oath of complete seclusion from the rest of the world and only appears when your prestige level ends in 777777.</q>',77777777,[24,15]);Game.last.pool='prestige';Game.last.parents=['Lucky number','Decisive fate'];Game.last.showIf=function(){return (Math.ceil(Game.prestige)%1000000==777777);};
9239
9240
order=50000;
9241
new Game.Upgrade('Background selector','Lets you pick which wallpaper to display.',0,[29,5]);
9242
Game.last.descFunc=function(){
9243
var choice=this.choicesFunction()[Game.bgType];
9244
return '<div style="text-align:center;">Current : <div class="icon" style="vertical-align:middle;display:inline-block;'+(choice.icon[2]?'background-image:url('+choice.icon[2]+');':'')+'background-position:'+(-choice.icon[0]*48)+'px '+(-choice.icon[1]*48)+'px;transform:scale(0.5);margin:-16px;"></div> <b>'+choice.name+'</b></div><div class="line"></div>'+this.desc;
9245
};
9246
9247
Game.last.pool='toggle';
9248
Game.last.choicesFunction=function()
9249
{
9250
var choices=[];
9251
choices[0]={name:'Automatic',icon:[0,7]};
9252
choices[1]={name:'Blue',icon:[21,21]};
9253
choices[2]={name:'Red',icon:[22,21]};
9254
choices[3]={name:'White',icon:[23,21]};
9255
choices[4]={name:'Black',icon:[24,21]};
9256
choices[5]={name:'Gold',icon:[25,21]};
9257
choices[6]={name:'Grandmas',icon:[26,21]};
9258
choices[7]={name:'Displeased grandmas',icon:[27,21]};
9259
choices[8]={name:'Angered grandmas',icon:[28,21]};
9260
choices[9]={name:'Money',icon:[29,21]};
9261
choices[Game.bgType].selected=1;
9262
return choices;
9263
}
9264
Game.last.choicesPick=function(id)
9265
{Game.bgType=id;}
9266
9267
Game.BGsByChoice={
9268
0:{pic:'bgBlue'},
9269
1:{pic:'bgBlue'},
9270
2:{pic:'bgRed'},
9271
3:{pic:'bgWhite'},
9272
4:{pic:'bgBlack'},
9273
5:{pic:'bgGold'},
9274
6:{pic:'grandmas1'},
9275
7:{pic:'grandmas2'},
9276
8:{pic:'grandmas3'},
9277
9:{pic:'bgMoney'},
9278
};
9279
9280
order=255;
9281
Game.GrandmaSynergy('Lucky grandmas','A fortunate grandma that always seems to find more cookies.','Chancemaker');
9282
9283
order=1200;
9284
new Game.TieredUpgrade('Your lucky cookie','Chancemakers are <b>twice</b> as efficient.<q>This is the first cookie you\'ve ever baked. It holds a deep sentimental value and, after all this time, an interesting smell.</q>','Chancemaker',1);
9285
new Game.TieredUpgrade('"All Bets Are Off" magic coin','Chancemakers are <b>twice</b> as efficient.<q>A coin that always lands on the other side when flipped. Not heads, not tails, not the edge. The <i>other side</i>.</q>','Chancemaker',2);
9286
new Game.TieredUpgrade('Winning lottery ticket','Chancemakers are <b>twice</b> as efficient.<q>What lottery? THE lottery, that\'s what lottery! Only lottery that matters!</q>','Chancemaker',3);
9287
new Game.TieredUpgrade('Four-leaf clover field','Chancemakers are <b>twice</b> as efficient.<q>No giant monsters here, just a whole lot of lucky grass.</q>','Chancemaker',4);
9288
new Game.TieredUpgrade('A recipe book about books','Chancemakers are <b>twice</b> as efficient.<q>Tip the scales in your favor with 28 creative new ways to cook the books.</q>','Chancemaker',5);
9289
new Game.TieredUpgrade('Leprechaun village','Chancemakers are <b>twice</b> as efficient.<q>You\'ve finally become accepted among the local leprechauns, who lend you their mythical luck as a sign of friendship (as well as some rather foul-tasting tea).</q>','Chancemaker',6);
9290
new Game.TieredUpgrade('Improbability drive','Chancemakers are <b>twice</b> as efficient.<q>A strange engine that turns statistics on their head. Recommended by the Grandmother\'s Guide to the Bakery.</q>','Chancemaker',7);
9291
new Game.TieredUpgrade('Antisuperstistronics','Chancemakers are <b>twice</b> as efficient.<q>An exciting new field of research that makes unlucky things lucky. No mirror unbroken, no ladder unwalked under!</q>','Chancemaker',8);
9292
9293
order=5000;
9294
Game.SynergyUpgrade('Gemmed talismans','<q>Good-luck charms covered in ancient and excruciatingly rare crystals. A must have for job interviews!</q>','Chancemaker','Mine','synergy1');
9295
9296
order=20000;
9297
new Game.Upgrade('Kitten consultants','You gain <b>more CpS</b> the more milk you have.<q>glad to be overpaid to work with you, sir</q>',900000000000000000000000000000000,Game.GetIcon('Kitten',9));Game.last.kitten=1;Game.MakeTiered(Game.last,9,18);
9298
9299
order=99999;
9300
var years=Math.floor((Date.now()-new Date(2013,7,8))/(1000*60*60*24*365));
9301
//only updates on page load
9302
//may behave strangely on leap years
9303
Game.NewUpgradeCookie({name:'Birthday cookie',desc:'-',icon:[22,13],power:years,price:99999999999999999999999999999});Game.last.baseDesc='Cookie production multiplier <b>+1%</b> for every year Cookie Clicker has existed (currently : <b>+'+Beautify(years)+'%</b>).<q>Thank you for playing Cookie Clicker!<br>-Orteil</q>';Game.last.desc=BeautifyInText(Game.last.baseDesc);
9304
9305
9306
order=150;new Game.Upgrade('Armythril mouse','Clicking gains <b>+1% of your CpS</b>.<q>This one takes about 53 people to push it around and another 48 to jump down on the button and trigger a click. You could say it\'s got some heft to it.</q>',50000000000000000000000,[11,19]);Game.MakeTiered(Game.last,10,11);
9307
9308
order=200;new Game.TieredUpgrade('Reverse dementia','Grandmas are <b>twice</b> as efficient.<q>Extremely unsettling, and somehow even worse than the regular kind.</q>','Grandma',9);
9309
order=300;new Game.TieredUpgrade('Humane pesticides','Farms are <b>twice</b> as efficient.<q>Made by people, for people, from people and ready to unleash some righteous scorching pain on those pesky insects that so deserve it.</q>','Farm',9);
9310
order=400;new Game.TieredUpgrade('Mole people','Mines are <b>twice</b> as efficient.<q>Engineered from real human beings within your very labs, these sturdy little folks have a knack for finding the tastiest underground minerals in conditions that more expensive machinery probably wouldn\'t survive.</q>','Mine',9);
9311
order=500;new Game.TieredUpgrade('Machine learning','Factories are <b>twice</b> as efficient.<q>You figured you might get better productivity if you actually told your workers to learn how to work the machines. Sometimes, it\'s the little things...</q>','Factory',9);
9312
order=525;new Game.TieredUpgrade('Edible money','Banks are <b>twice</b> as efficient.<q>It\'s really quite simple; you make all currency too delicious not to eat, solving world hunger and inflation in one fell swoop!</q>','Bank',9);
9313
order=550;new Game.TieredUpgrade('Sick rap prayers','Temples are <b>twice</b> as efficient.<q>With their ill beat and radical rhymes, these way-hip religious tunes are sure to get all the youngins who thought they were 2 cool 4 church back on the pews and praying for more! Wicked!</q>','Temple',9);
9314
order=575;new Game.TieredUpgrade('Deluxe tailored wands','Wizard towers are <b>twice</b> as efficient.<q>In this age of science, most skillful wand-makers are now long gone; but thankfully - not all those wanders are lost.</q>','Wizard tower',9);
9315
order=600;new Game.TieredUpgrade('Autopilot','Shipments are <b>twice</b> as efficient.<q>Your ships are now fitted with completely robotic crews! It\'s crazy how much money you save when you don\'t have to compensate the families of those lost in space.</q>','Shipment',9);
9316
order=700;new Game.TieredUpgrade('The advent of chemistry','Alchemy labs are <b>twice</b> as efficient.<q>You know what? That whole alchemy nonsense was a load of baseless rubbish. Dear god, what were you thinking?</q>','Alchemy lab',9);
9317
order=800;new Game.TieredUpgrade('The real world','Portals are <b>twice</b> as efficient.<q>It turns out that our universe is actually the twisted dimension of another, saner plane of reality. Time to hop on over there and loot the place!</q>','Portal',9);
9318
order=900;new Game.TieredUpgrade('Second seconds','Time machines are <b>twice</b> as efficient.<q>That\'s twice as many seconds in the same amount of time! What a deal! Also, what in god\'s name!</q>','Time machine',9);
9319
order=1000;new Game.TieredUpgrade('Quantum comb','Antimatter condensers are <b>twice</b> as efficient.<q>Quantum entanglement is one of those things that are so annoying to explain that we might honestly be better off without it. This is finally possible thanks to the quantum comb!</q>','Antimatter condenser',9);
9320
order=1100;new Game.TieredUpgrade('Crystal mirrors','Prisms are <b>twice</b> as efficient.<q>Designed to filter more light back into your prisms, reaching levels of brightness that reality itself had never planned for.</q>','Prism',9);
9321
order=1200;new Game.TieredUpgrade('Bunnypedes','Chancemakers are <b>twice</b> as efficient.<q>You\'ve taken to breeding rabbits with hundreds of paws, which makes them intrinsically very lucky and thus a very handy (if very disturbing) pet.</q>','Chancemaker',9);
9322
9323
order=20000;
9324
new Game.Upgrade('Kitten assistants to the regional manager','You gain <b>more CpS</b> the more milk you have.<q>nothing stresses meowt... except having to seek the approval of my inferiors, sir</q>',900000000000000000000000000000000000,Game.GetIcon('Kitten',10));Game.last.kitten=1;Game.MakeTiered(Game.last,10,18);
9325
9326
order=5000;
9327
Game.SynergyUpgrade('Charm quarks','<q>They\'re after your lucky quarks!</q>','Chancemaker','Antimatter condenser','synergy2');
9328
9329
9330
order=10020;
9331
Game.NewUpgradeCookie({name:'Pink biscuits',desc:'One of the oldest cookies. Traditionally dipped in champagne to soften it, because the French will use any opportunity to drink.',icon:[21,16],power: 4,price: 999999999999999999999999999});
9332
Game.NewUpgradeCookie({name:'Whole-grain cookies',desc:'Covered in seeds and other earthy-looking debris. Really going for that "5-second rule" look.',icon:[22,16],power: 4,price: 999999999999999999999999999*5});
9333
Game.NewUpgradeCookie({name:'Candy cookies',desc:'These melt in your hands just a little bit.',icon:[23,16],power: 4,price: 9999999999999999999999999999});
9334
Game.NewUpgradeCookie({name:'Big chip cookies',desc:'You are in awe at the size of these chips. Absolute units.',icon:[24,16],power: 4,price: 9999999999999999999999999999*5});
9335
Game.NewUpgradeCookie({name:'One chip cookies',desc:'You get one.',icon:[25,16],power: 1,price: 99999999999999999999999999999});
9336
9337
9338
new Game.Upgrade('Sugar baking','Each unspent sugar lump (up to 100) gives <b>+1% CpS</b>.<div class="warning">Note : this means that spending sugar lumps will decrease your CpS until they grow back.</div><q>To bake with the sugary essence of eons themselves, you must first learn to take your sweet time.</q>',200000000,[21,17]);Game.last.pool='prestige';Game.last.parents=['Stevia Caelestis'];
9339
new Game.Upgrade('Sugar craving','Once an ascension, you may use the "Sugar frenzy" switch to <b>triple your CpS</b> for 1 hour, at the cost of <b>1 sugar lump</b>.<q>Just a little kick to sweeten the deal.</q>',400000000,[22,17]);Game.last.pool='prestige';Game.last.parents=['Sugar baking'];
9340
new Game.Upgrade('Sugar aging process','Each grandma (up to 600) makes sugar lumps ripen <b>6 seconds</b> sooner.<q>Aren\'t they just the sweetest?</q>',600000000,[23,17]);Game.last.pool='prestige';Game.last.parents=['Sugar craving','Diabetica Daemonicus'];
9341
9342
order=40050;
9343
new Game.Upgrade('Sugar frenzy','Activating this will <b>triple your CpS</b> for 1 hour, at the cost of <b>1 sugar lump</b>.<br>May only be used once per ascension.',0,[22,17]);
9344
Game.last.priceLumps=1;
9345
Game.last.pool='toggle';Game.last.toggleInto=0;
9346
Game.last.canBuyFunc=function(){return Game.lumps>=1;};
9347
Game.last.clickFunction=Game.spendLump(1,'activate the sugar frenzy',function()
9348
{
9349
Game.Upgrades['Sugar frenzy'].buy(1);
9350
buff=Game.gainBuff('sugar frenzy',60*60,3);
9351
if (Game.prefs.popups) Game.Popup('Sugar frenzy activated!');
9352
else Game.Notify('Sugar frenzy!','CpS x3 for 1 hour!',[29,14]);
9353
});
9354
9355
order=10020;
9356
Game.NewUpgradeCookie({name:'Sprinkles cookies',desc:'A bit of festive decorating helps hide the fact that this might be one of the blandest cookies you\'ve ever tasted.',icon:[21,14],power: 4,price: 99999999999999999999999999999*5});
9357
Game.NewUpgradeCookie({name:'Peanut butter blossoms',desc:'Topped with a scrumptious chocolate squirt, which is something we really wish we didn\'t just write.',icon:[22,14],power: 4,price: 999999999999999999999999999999});
9358
Game.NewUpgradeCookie({name:'No-bake cookies',desc:'You have no idea how these mysterious oven-less treats came to be or how they hold their shape. You\'re thinking either elephant glue or cold fusion.',icon:[21,15],power: 4,price: 999999999999999999999999999999*5});
9359
Game.NewUpgradeCookie({name:'Florentines',desc:'These make up for being the fruitcake of cookies by at least having the decency to feature chocolate.',icon:[26,16],power: 4,price: 9999999999999999999999999999999});
9360
Game.NewUpgradeCookie({name:'Chocolate crinkles',desc:'Non-denominational cookies to celebrate year-round deliciousness, and certainly not Christmas or some other nonsense.',icon:[22,15],power: 4,price: 9999999999999999999999999999999*5});
9361
Game.NewUpgradeCookie({name:'Maple cookies',desc:'Made with syrup from a land where milk comes in bags, instead of spontaneously pooling at the bottom of your screen depending on your achievements.',icon:[21,13],power: 4,price: 99999999999999999999999999999999});
9362
9363
9364
order=40000;
9365
new Game.Upgrade('Turbo-charged soil','Garden plants grow every second.<br>Garden seeds are free to plant.<br>You can switch soils at any time.<q>It\'s got electrolytes!</q>',7,[2,16]);//debug purposes only
9366
Game.last.buyFunction=function(){if (Game.Objects['Farm'].minigameLoaded){Game.Objects['Farm'].minigame.computeStepT();}}
9367
Game.last.pool='debug';
9368
9369
order=150;
9370
new Game.Upgrade('Technobsidian mouse','Clicking gains <b>+1% of your CpS</b>.<q>A highly advanced mouse of a sophisticated design. Only one thing on its mind : to click.</q>',5000000000000000000000000,[11,28]);Game.MakeTiered(Game.last,11,11);
9371
new Game.Upgrade('Plasmarble mouse','Clicking gains <b>+1% of your CpS</b>.<q>A shifting blur in the corner of your eye, this mouse can trigger a flurry of clicks when grazed by even the slightest breeze.</q>',500000000000000000000000000,[11,30]);Game.MakeTiered(Game.last,12,11);
9372
9373
order=20000;
9374
new Game.Upgrade('Kitten marketeers','You gain <b>more CpS</b> the more milk you have.<q>no such thing as a saturated markit, sir</q>',900000000000000000000000000000000000000,Game.GetIcon('Kitten',11));Game.last.kitten=1;Game.MakeTiered(Game.last,11,18);
9375
9376
order=10030;
9377
Game.NewUpgradeCookie({name:'Festivity loops',desc:'These garish biscuits are a perfect fit for children\'s birthday parties or the funerals of strange, eccentric billionaires.',icon:[25,17],require:'Box of brand biscuits',power: 2, price: 999999999999999999999999*5});
9378
9379
order=10020;
9380
Game.NewUpgradeCookie({name:'Persian rice cookies',desc:'Rose water and poppy seeds are the secret ingredients of these small, butter-free cookies.',icon:[28,15],power: 4,price: 99999999999999999999999999999999*5});
9381
Game.NewUpgradeCookie({name:'Norwegian cookies',desc:'A flat butter cookie with a sliver of candied cherry on top. It is said that these illustrate the bleakness of scandinavian existentialism.',icon:[22,20],power: 4,price: 999999999999999999999999999999999});
9382
Game.NewUpgradeCookie({name:'Crispy rice cookies',desc:'Fun to make at home! Store-bought cookies are obsolete! Topple the system! There\'s marshmallows in these! Destroy capitalism!',icon:[23,20],power: 4,price: 999999999999999999999999999999999*5});
9383
Game.NewUpgradeCookie({name:'Ube cookies',desc:'The tint is obtained by the use of purple yams. According to color symbolism, these cookies are either noble, holy, or supervillains.',icon:[24,17],power: 4,price: 9999999999999999999999999999999999});
9384
Game.NewUpgradeCookie({name:'Butterscotch cookies',desc:'The butterscotch chips are just the right amount of sticky, and make you feel like you\'re eating candy.',icon:[24,20],power: 4,price: 9999999999999999999999999999999999*5});
9385
Game.NewUpgradeCookie({name:'Speculaas',desc:'These crunchy, almost obnoxiously cinnamony cookies are a source of dutch pride. About the origin of the name, one can only speculate.',icon:[21,20],power: 4,price: 99999999999999999999999999999999999});
9386
9387
order=10200;
9388
Game.NewUpgradeCookie({name:'Elderwort biscuits',desc:'-',icon:[22,25],power:2,price:60*2,locked:1});Game.last.baseDesc='Cookie production multiplier <b>+2%</b>.<br>Grandma production multiplier <b>+2%</b>.<br>Dropped by elderwort plants.<q>They taste incredibly stale, even when baked fresh.</q>';
9389
Game.NewUpgradeCookie({name:'Bakeberry cookies',desc:'-',icon:[23,25],power:2,price:60,locked:1});Game.last.baseDesc='Cookie production multiplier <b>+2%</b>.<br>Dropped by bakeberry plants.<q>Really good dipped in hot chocolate.</q>';
9390
Game.NewUpgradeCookie({name:'Duketater cookies',desc:'-',icon:[24,25],power:10,price:60*3,locked:1});Game.last.baseDesc='Cookie production multiplier <b>+10%</b>.<br>Dropped by duketater plants.<q>Fragrant and mealy, with a slight yellow aftertaste.</q>';
9391
Game.NewUpgradeCookie({name:'Green yeast digestives',desc:'-',icon:[25,25],power:0,price:60*3,locked:1});Game.last.baseDesc='<b>+1%</b> golden cookie gains and effect duration.<br><b>+1%</b> golden cookie frequency.<br><b>+3%</b> random drops.<br>Dropped by green rot plants.<q>These are tastier than you\'d expect, but not by much.</q>';
9392
9393
order=23000;
9394
new Game.Upgrade('Fern tea','You gain <b>+3%</b> of your regular CpS while the game is closed <small>(provided you have the Twin Gates of Transcendence heavenly upgrade)</small>.<br>Dropped by drowsyfern plants.<q>A chemically complex natural beverage, this soothing concoction has been used by mathematicians to solve equations in their sleep.</q>',60,[26,25]);
9395
new Game.Upgrade('Ichor syrup','You gain <b>+7%</b> of your regular CpS while the game is closed <small>(provided you have the Twin Gates of Transcendence heavenly upgrade)</small>.<br>Sugar lumps mature <b>7 minutes</b> sooner.<br>Dropped by ichorpuff plants.<q>Tastes like candy. The smell is another story.</q>',60*2,[27,25]);
9396
9397
order=10200;
9398
Game.NewUpgradeCookie({name:'Wheat slims',desc:'-',icon:[28,25],power:1,price:30,locked:1});Game.last.baseDesc='Cookie production multiplier <b>+1%</b>.<br>Dropped by baker\'s wheat plants.<q>The only reason you\'d consider these to be cookies is because you feel slightly sorry for them.</q>';
9399
9400
var gardenDrops=['Elderwort biscuits','Bakeberry cookies','Duketater cookies','Green yeast digestives','Fern tea','Ichor syrup','Wheat slims'];
9401
for (var i in gardenDrops)//scale by CpS
9402
{
9403
var it=Game.Upgrades[gardenDrops[i]];
9404
it.priceFunc=function(cost){return function(){return cost*Game.cookiesPs*60;}}(it.basePrice);
9405
it.baseDesc=it.baseDesc.replace('<q>','<br>Cost scales with CpS.<q>');
9406
it.desc=BeautifyInText(it.baseDesc);
9407
it.lasting=true;
9408
}
9409
9410
9411
order=10300;
9412
Game.NewUpgradeCookie({name:'Synthetic chocolate green honey butter biscuit',desc:'Rewarded for owning 350 of everything.<br>The recipe for this butter biscuit was once the sole heritage of an ancient mountain monastery. Its flavor is so refined that only a slab of lab-made chocolate specifically engineered to be completely tasteless could complement it.<br>Also it\'s got your face on it.',icon:[24,26],power: 10,price: 999999999999999999999999999999999999,locked:1});
9413
Game.NewUpgradeCookie({name:'Royal raspberry chocolate butter biscuit',desc:'Rewarded for owning 400 of everything.<br>Once reserved for the megalomaniac elite, this unique strain of fruity chocolate has a flavor and texture unlike any other. Whether its exorbitant worth is improved or lessened by the presence of your likeness on it still remains to be seen.',icon:[25,26],power: 10,price: 999999999999999999999999999999999999999,locked:1});
9414
Game.NewUpgradeCookie({name:'Ultra-concentrated high-energy chocolate butter biscuit',desc:'Rewarded for owning 450 of everything.<br>Infused with the power of several hydrogen bombs through a process that left most nuclear engineers and shareholders perplexed. Currently at the center of some rather heated United Nations meetings. Going in more detail about this chocolate would violate several state secrets, but we\'ll just add that someone\'s bust seems to be pictured on it. Perhaps yours?',icon:[26,26],power: 10,price: 999999999999999999999999999999999999999999,locked:1});
9415
9416
9417
9418
order=200;new Game.TieredUpgrade('Timeproof hair dyes','Grandmas are <b>twice</b> as efficient.<q>Why do they always have those strange wispy pink dos? What do they know about candy floss that we don\'t?</q>','Grandma',10);
9419
order=300;new Game.TieredUpgrade('Barnstars','Farms are <b>twice</b> as efficient.<q>Ah, yes. These help quite a bit. Somehow.</q>','Farm',10);
9420
order=400;new Game.TieredUpgrade('Mine canaries','Mines are <b>twice</b> as efficient.<q>These aren\'t used for anything freaky! The miners just enjoy having a pet or two down there.</q>','Mine',10);
9421
order=500;new Game.TieredUpgrade('Brownie point system','Factories are <b>twice</b> as efficient.<q>Oh, these are lovely! You can now reward your factory employees for good behavior, such as working overtime or snitching on coworkers. 58 brownie points gets you a little picture of a brownie, and 178 of those pictures gets you an actual brownie piece for you to do with as you please! Infantilizing? Maybe. Oodles of fun? You betcha!</q>','Factory',10);
9422
order=525;new Game.TieredUpgrade('Grand supercycles','Banks are <b>twice</b> as efficient.<q>We let the public think these are complicated financial terms when really we\'re just rewarding the bankers with snazzy bicycles for a job well done. It\'s only natural after you built those fancy gold swimming pools for them, where they can take a dip and catch Kondratiev waves.</q>','Bank',10);
9423
order=550;new Game.TieredUpgrade('Psalm-reading','Temples are <b>twice</b> as efficient.<q>A theologically dubious and possibly blasphemous blend of fortune-telling and scripture studies.</q>','Temple',10);
9424
order=575;new Game.TieredUpgrade('Immobile spellcasting','Wizard towers are <b>twice</b> as efficient.<q>Wizards who master this skill can now cast spells without having to hop and skip and gesticulate embarrassingly, which is much sneakier and honestly quite a relief.</q>','Wizard tower',10);
9425
order=600;new Game.TieredUpgrade('Restaurants at the end of the universe','Shipments are <b>twice</b> as efficient.<q>Since the universe is spatially infinite, and therefore can be construed to have infinite ends, you\'ve opened an infinite chain of restaurants where your space truckers can rest and partake in some home-brand cookie-based meals.</q>','Shipment',10);
9426
order=700;new Game.TieredUpgrade('On second thought','Alchemy labs are <b>twice</b> as efficient.<q>Disregard that last upgrade, alchemy is where it\'s at! Your eggheads just found a way to transmute children\'s nightmares into rare metals!</q>','Alchemy lab',10);
9427
order=800;new Game.TieredUpgrade('Dimensional garbage gulper','Portals are <b>twice</b> as efficient.<q>So we\'ve been looking for a place to dispose of all the refuse that\'s been accumulating since we started baking - burnt cookies, failed experiments, unruly workers - and well, we figured rather than sell it to poor countries like we\'ve been doing, we could just dump it in some alternate trash dimension where it\'s not gonna bother anybody! Probably!</q>','Portal',10);
9428
order=900;new Game.TieredUpgrade('Additional clock hands','Time machines are <b>twice</b> as efficient.<q>It seemed like a silly idea at first, but it turns out these have the strange ability to twist time in interesting new ways.</q>','Time machine',10);
9429
order=1000;new Game.TieredUpgrade('Baking Nobel prize','Antimatter condensers are <b>twice</b> as efficient.<q>What better way to sponsor scientific growth than to motivate those smarmy nerds with a meaningless award! What\'s more, each prize comes with a fine print lifelong exclusive contract to come work for you (or else)!</q>','Antimatter condenser',10);
9430
order=1100;new Game.TieredUpgrade('Reverse theory of light','Prisms are <b>twice</b> as efficient.<q>A whole new world of physics opens up when you decide that antiphotons are real and posit that light is merely a void in shadow.</q>','Prism',10);
9431
order=1200;new Game.TieredUpgrade('Revised probabilistics','Chancemakers are <b>twice</b> as efficient.<q>Either something happens or it doesn\'t. That\'s a 50% chance! This suddenly makes a lot of unlikely things very possible.</q>','Chancemaker',10);
9432
9433
order=20000;
9434
new Game.Upgrade('Kitten analysts','You gain <b>more CpS</b> the more milk you have.<q>based on purrent return-on-investment meowdels we should be able to affurd to pay our empawyees somewhere around next century, sir</q>',900000000000000000000000000000000000000000,Game.GetIcon('Kitten',12));Game.last.kitten=1;Game.MakeTiered(Game.last,12,18);
9435
9436
9437
new Game.Upgrade('Eye of the wrinkler','Mouse over a wrinkler to see how many cookies are in its stomach.<q>Just a wrinkler and its will to survive.<br>Hangin\' tough, stayin\' hungry.</q>',99999999,[27,26]);Game.last.pool='prestige';Game.last.parents=['Wrinkly cookies'];
9438
9439
new Game.Upgrade('Inspired checklist','Unlocks the <b>Buy all</b> feature, which lets you instantly purchase every upgrade in your store (starting from the cheapest one).<br>Also unlocks the <b>Vault</b>, a store section where you can place upgrades you do not wish to auto-buy.<q>Snazzy grandma accessories? Check. Transdimensional abominations? Check. A bunch of eggs for some reason? Check. Machine that goes "ping"? Check and check.</q>',900000,[28,26]);Game.last.pool='prestige';Game.last.parents=['Persistent memory','Permanent upgrade slot IV'];
9440
9441
order=10300;
9442
Game.NewUpgradeCookie({name:'Pure pitch-black chocolate butter biscuit',desc:'Rewarded for owning 500 of everything.<br>This chocolate is so pure and so flawless that it has no color of its own, instead taking on the appearance of whatever is around it. You\'re a bit surprised to notice that this one isn\'t stamped with your effigy, as its surface is perfectly smooth (to the picometer) - until you realize it\'s quite literally reflecting your own face like a mirror.',icon:[24,27],power: 10,price: 999999999999999999999999999999999999999999999,locked:1});
9443
9444
order=10020;
9445
Game.NewUpgradeCookie({name:'Chocolate oatmeal cookies',desc:'These bad boys compensate for lack of a cohesive form and a lumpy, unsightly appearance by being just simply delicious. Something we should all aspire to.',icon:[23,28],power: 4,price: 99999999999999999999999999999999999*5});
9446
Game.NewUpgradeCookie({name:'Molasses cookies',desc:'Sticky, crackly, and dusted in fine sugar.<br>Some lunatics have been known to eat these with potatoes.',icon:[24,28],power: 4,price: 999999999999999999999999999999999999});
9447
Game.NewUpgradeCookie({name:'Biscotti',desc:'Almonds and pistachios make these very robust cookies slightly more interesting to eat than to bludgeon people with.',icon:[22,28],power: 4,price: 999999999999999999999999999999999999*5});
9448
Game.NewUpgradeCookie({name:'Waffle cookies',desc:'Whether these are cookies with shockingly waffle-like features or simply regular cookie-sized waffles is a debate we\'re not getting into here.',icon:[21,28],power: 4,price: 9999999999999999999999999999999999999});
9449
9450
9451
order=10000;
9452
//early cookies that unlock at the same time as coconut cookies; meant to boost early game a little bit
9453
Game.NewUpgradeCookie({name:'Almond cookies',desc:'Sometimes you feel like one of these. Sometimes you don\'t.',icon:[21,27],power: 2, price: 99999999});
9454
Game.NewUpgradeCookie({name:'Hazelnut cookies',desc:'Tastes like a morning stroll through a fragrant forest, minus the clouds of gnats.',icon:[22,27],power: 2, price: 99999999});
9455
Game.NewUpgradeCookie({name:'Walnut cookies',desc:'Some experts have pointed to the walnut\'s eerie resemblance to the human brain as a sign of its sentience - a theory most walnuts vehemently object to.',icon:[23,27],power: 2, price: 99999999});
9456
9457
9458
new Game.Upgrade('Label printer','Mouse over an upgrade to see its tier.<br><small>Note : only some upgrades have tiers. Tiers are purely cosmetic and have no effect on gameplay.</small><q>Also comes in real handy when you want to tell catsup apart from ketchup.</q>',999999,[28,29]);Game.last.pool='prestige';Game.last.parents=['Starter kitchen'];
9459
9460
9461
9462
9463
order=200;new Game.TieredUpgrade('Good manners','Grandmas are <b>twice</b> as efficient.<q>Apparently these ladies are much more amiable if you take the time to learn their strange, ancient customs, which seem to involve saying "please" and "thank you" and staring at the sun with bulging eyes while muttering eldritch curses under your breath.</q>','Grandma',11);
9464
order=300;new Game.TieredUpgrade('Lindworms','Farms are <b>twice</b> as efficient.<q>You have to import these from far up north, but they really help areate the soil!</q>','Farm',11);
9465
order=400;new Game.TieredUpgrade('Bore again','Mines are <b>twice</b> as efficient.<q>After extracting so much sediment for so long, you\'ve formed some veritable mountains of your own from the accumulated piles of rock and dirt. Time to dig through those and see if you find anything fun!</q>','Mine',11);
9466
order=500;new Game.TieredUpgrade('"Volunteer" interns','Factories are <b>twice</b> as efficient.<q>If you\'re bad at something, always do it for free.</q>','Factory',11);
9467
order=525;new Game.TieredUpgrade('Rules of acquisition','Banks are <b>twice</b> as efficient.<q>Rule 387 : a cookie baked is a cookie kept.</q>','Bank',11);
9468
order=550;new Game.TieredUpgrade('War of the gods','Temples are <b>twice</b> as efficient.<q>An interesting game; the only winning move is not to pray.</q>','Temple',11);
9469
order=575;new Game.TieredUpgrade('Electricity','Wizard towers are <b>twice</b> as efficient.<q>Ancient magicks and forbidden hexes shroud this arcane knowledge, whose unfathomable power can mysteriously turn darkness into light and shock an elephant to death.</q>','Wizard tower',11);
9470
order=600;new Game.TieredUpgrade('Universal alphabet','Shipments are <b>twice</b> as efficient.<q>You\'ve managed to chart a language that can be understood by any sentient species in the galaxy; its exciting vocabulary contains over 56 trillion words that sound and look like sparkly burps, forming intricate sentences that usually translate to something like "give us your cookies, or else".</q>','Shipment',11);
9471
order=700;new Game.TieredUpgrade('Public betterment','Alchemy labs are <b>twice</b> as efficient.<q>Why do we keep trying to change useless matter into cookies, or cookies into even better cookies? Clearly, the way of the future is to change the people who eat the cookies into people with a greater understanding, appreciation and respect for the cookies they\'re eating. Into the vat you go!</q>','Alchemy lab',11);
9472
order=800;new Game.TieredUpgrade('Embedded microportals','Portals are <b>twice</b> as efficient.<q>We\'ve found out that if we bake the portals into the cookies themselves, we can transport people\'s taste buds straight into the taste dimension! Good thing your army of lawyers got rid of the FDA a while ago!</q>','Portal',11);
9473
order=900;new Game.TieredUpgrade('Nostalgia','Time machines are <b>twice</b> as efficient.<q>Your time machine technicians insist that this is some advanced new time travel tech, and not just an existing emotion universal to mankind. Either way, you have to admit that selling people the same old cookies just because it reminds them of the good old times is an interesting prospect.</q>','Time machine',11);
9474
order=1000;new Game.TieredUpgrade('The definite molecule','Antimatter condensers are <b>twice</b> as efficient.<q>Your scientists have found a way to pack a cookie into one single continuous molecule, opening exciting new prospects in both storage and flavor despite the fact that these take up to a whole year to digest.</q>','Antimatter condenser',11);
9475
order=1100;new Game.TieredUpgrade('Light capture measures','Prisms are <b>twice</b> as efficient.<q>As the universe gets ever so slightly dimmer due to you converting more and more of its light into cookies, you\'ve taken to finding new and unexplored sources of light for your prisms; for instance, the warm glow emitted by a pregnant woman, or the twinkle in the eye of a hopeful child.</q>','Prism',11);
9476
order=1200;new Game.TieredUpgrade('0-sided dice','Chancemakers are <b>twice</b> as efficient.<q>The advent of the 0-sided dice has had unexpected and tumultuous effects on the gambling community, and saw experts around the world calling you both a genius and an imbecile.</q>','Chancemaker',11);
9477
9478
9479
new Game.Upgrade('Heralds','You now benefit from the boost provided by <b>heralds</b>.<br>Each herald gives you <b>+1% CpS</b>.<br>Look on the purple flag at the top to see how many heralds are active at any given time.<q>Be excellent to each other.<br>And Patreon, dudes!</q>',100,[21,29]);Game.last.pool='prestige';
9480
9481
order=255;
9482
Game.GrandmaSynergy('Metagrandmas','A fractal grandma to make more grandmas to make more cookies.','Fractal engine');
9483
9484
order=1300;
9485
new Game.TieredUpgrade('Metabakeries','Fractal engines are <b>twice</b> as efficient.<q>They practically bake themselves!</q>','Fractal engine',1);
9486
new Game.TieredUpgrade('Mandelbrown sugar','Fractal engines are <b>twice</b> as efficient.<q>A substance that displays useful properties such as fractal sweetness and instant contact lethality.</q>','Fractal engine',2);
9487
new Game.TieredUpgrade('Fractoids','Fractal engines are <b>twice</b> as efficient.<q>Here\'s a frun fract : all in all, these were a terrible idea.</q>','Fractal engine',3);
9488
new Game.TieredUpgrade('Nested universe theory','Fractal engines are <b>twice</b> as efficient.<q>Asserts that each subatomic particle is host to a whole new universe, and therefore, another limitless quantity of cookies.<br>This somehow stacks with the theory of nanocosmics, because physics.</q>','Fractal engine',4);
9489
new Game.TieredUpgrade('Menger sponge cake','Fractal engines are <b>twice</b> as efficient.<q>Frighteningly absorbent thanks to its virtually infinite surface area. Keep it isolated in a dry chamber, never handle it with an open wound, and do not ever let it touch a body of water.</q>','Fractal engine',5);
9490
new Game.TieredUpgrade('One particularly good-humored cow','Fractal engines are <b>twice</b> as efficient.<q>This unassuming bovine was excruciatingly expensive and it may seem at first like you were ripped off. On closer inspection however, you notice that its earrings (it\'s wearing earrings) are actually fully functional copies of itself, each of which also wearing their own cow earrings, and so on, infinitely. It appears your dairy concerns will be taken care of for a while, although you\'ll have to put up with the cow\'s annoying snickering.</q>','Fractal engine',6);
9491
new Game.TieredUpgrade('Chocolate ouroboros','Fractal engines are <b>twice</b> as efficient.<q>Forever eating its own tail and digesting itself, in a metabolically dubious tale of delicious tragedy.</q>','Fractal engine',7);
9492
new Game.TieredUpgrade('Nested','Fractal engines are <b>twice</b> as efficient.<q>Clever self-reference or shameful cross-promotion? This upgrade apparently has the gall to advertise a link to <u>orteil.dashnet.org/nested</u>, in a tooltip you can\'t even click.</q>','Fractal engine',8);
9493
new Game.TieredUpgrade('Space-filling fibers','Fractal engines are <b>twice</b> as efficient.<q>This special ingredient has the incredible ability to fill the local space perfectly, effectively eradicating hunger in those who consume it!<br>Knowing that no hunger means no need for cookies, your marketers urge you to repurpose this product into next-level packing peanuts.</q>','Fractal engine',9);
9494
new Game.TieredUpgrade('Endless book of prose','Fractal engines are <b>twice</b> as efficient.','Fractal engine',10);
9495
Game.last.descFunc=function(){
9496
var str='"There once was a baker named '+Game.bakeryName+'. One day, there was a knock at the door; '+Game.bakeryName+' opened it and was suddenly face-to-face with a strange and menacing old grandma. The grandma opened her mouth and, in a strange little voice, started reciting this strange little tale : ';
9497
var n=35;
9498
var i=Math.floor(Game.T*0.1);
9499
return this.desc+'<q style="font-family:Courier;">'+(str.substr(i%str.length,n)+(i%str.length>(str.length-n)?str.substr(0,i%str.length-(str.length-n)):''))+'</q>';
9500
};
9501
new Game.TieredUpgrade('The set of all sets','Fractal engines are <b>twice</b> as efficient.<q>The answer, of course, is a definite maybe.</q>','Fractal engine',11);
9502
9503
order=5000;
9504
Game.SynergyUpgrade('Recursive mirrors','<q>Do you have any idea what happens when you point two of these at each other? Apparently, the universe doesn\'t either.</q>','Fractal engine','Prism','synergy1');
9505
//Game.SynergyUpgrade('Compounded odds','<q>When probabilities start cascading, "never in a billion lifetimes" starts looking terribly like "probably before Monday comes around".</q>','Fractal engine','Chancemaker','synergy1');
9506
Game.SynergyUpgrade('Mice clicking mice','','Fractal engine','Cursor','synergy2');
9507
Game.last.descFunc=function(){
9508
Math.seedrandom(Game.seed+'-blasphemouse');
9509
if (Math.random()<0.3) {Math.seedrandom();return this.desc+'<q>Absolutely blasphemouse!</q>';}
9510
else {Math.seedrandom();return this.desc+'<q>Absolutely blasphemous!</q>';}
9511
};
9512
9513
9514
order=10020;
9515
Game.NewUpgradeCookie({name:'Custard creams',desc:'British lore pits these in a merciless war against bourbon biscuits.<br>The filling evokes vanilla without quite approaching it.<br>They\'re tastier on the inside!',icon:[23,29],power: 4,price: 9999999999999999999999999999999999999*5});
9516
Game.NewUpgradeCookie({name:'Bourbon biscuits',desc:'Two chocolate biscuits joined together with even more chocolate.<br>The sworn rivals of custard creams, as legend has it.',icon:[24,29],power: 4,price: 99999999999999999999999999999999999999});
9517
9518
9519
new Game.Upgrade('Keepsakes','Seasonal random drops have a <b>1/5 chance</b> to carry over through ascensions.<q>Cherish the memories.</q>',1111111111,[22,29]);Game.last.pool='prestige';Game.last.parents=['Starsnow','Starlove','Starterror','Startrade','Starspawn'];
9520
9521
order=10020;
9522
Game.NewUpgradeCookie({name:'Mini-cookies',desc:'Have you ever noticed how the smaller something is, the easier it is to binge on it?',icon:[29,30],power: 5,price: 99999999999999999999999999999999999999*5});
9523
9524
new Game.Upgrade('Sugar crystal cookies','Cookie production multiplier <b>+5% permanently</b>, and <b>+1%</b> for every building type level 10 or higher.<q>Infused with cosmic sweetness. It gives off a faint shimmery sound when you hold it up to your ear.</q>',1000000000,[21,30]);Game.last.pool='prestige';Game.last.parents=['Sugar baking'];Game.last.power=function(){
9525
var n=5;
9526
for (var i in Game.Objects)
9527
{
9528
if (Game.Objects[i].level>=10) n++;
9529
}
9530
return n;
9531
};Game.last.pseudoCookie=true;
9532
Game.last.descFunc=function(){
9533
var n=5;
9534
for (var i in Game.Objects)
9535
{
9536
if (Game.Objects[i].level>=10) n++;
9537
}
9538
return '<div style="text-align:center;">Current : <b>+'+Beautify(n)+'%</b><div class="line"></div></div>'+this.desc;
9539
};
9540
new Game.Upgrade('Box of maybe cookies','Contains an assortment of...something.<q>These may or may not be considered cookies.</q>',333000000000,[25,29]);Game.last.pool='prestige';Game.last.parents=['Sugar crystal cookies'];
9541
new Game.Upgrade('Box of not cookies','Contains an assortment of...something.<q>These are strictly, definitely not cookies.</q>',333000000000,[26,29]);Game.last.pool='prestige';Game.last.parents=['Sugar crystal cookies'];
9542
new Game.Upgrade('Box of pastries','Contains an assortment of delicious pastries.<q>These are a damn slippery slope is what they are!</q>',333000000000,[27,29]);Game.last.pool='prestige';Game.last.parents=['Sugar crystal cookies'];
9543
9544
order=10040;
9545
Game.NewUpgradeCookie({name:'Profiteroles',desc:'Also known as cream puffs, these pastries are light, fluffy, filled with whipped cream and fun to throw at people when snowballs are running scarce.',icon:[29,29],require:'Box of pastries', power:4,price: Math.pow(10,31)});
9546
Game.NewUpgradeCookie({name:'Jelly donut',desc:'Guaranteed to contain at least 0.3% jelly filling, or your money back.<br>You can still see the jelly stab wound!',icon:[27,28],require:'Box of pastries', power:4,price: Math.pow(10,33)});
9547
Game.NewUpgradeCookie({name:'Glazed donut',desc:'Absolutely gooey with sugar. The hole is the tastiest part!',icon:[28,28],require:'Box of pastries', power:4,price: Math.pow(10,35)});
9548
Game.NewUpgradeCookie({name:'Chocolate cake',desc:'The cake is a Portal reference!',icon:[25,27],require:'Box of pastries', power:4,price: Math.pow(10,37)});
9549
Game.NewUpgradeCookie({name:'Strawberry cake',desc:'It\'s not easy to come up with flavor text for something as generic as this, but some would say it\'s a piece of cake.',icon:[26,27],require:'Box of pastries', power:4,price: Math.pow(10,39)});
9550
Game.NewUpgradeCookie({name:'Apple pie',desc:'It is said that some grandmas go rogue and bake these instead.',icon:[25,28],require:'Box of pastries', power:4,price: Math.pow(10,41)});
9551
Game.NewUpgradeCookie({name:'Lemon meringue pie',desc:'Meringue is a finicky substance made of sugar and egg whites that requires specific atmospheric conditions to be baked at all. The lemon, as far as we can tell, isn\'t nearly as picky.',icon:[26,28],require:'Box of pastries', power:4,price: Math.pow(10,43)});
9552
Game.NewUpgradeCookie({name:'Butter croissant',desc:'Look around.<br>A rude man in a striped shirt bikes past you. He smells of cigarettes and caf&eacute;-au-lait. Somewhere, a mime uses his moustache to make fun of the British. 300 pigeons fly overhead.<br>Relax. You\'re experiencing croissant.',icon:[29,28],require:'Box of pastries', power:4,price: Math.pow(10,45)});
9553
9554
order=10050;
9555
Game.NewUpgradeCookie({name:'Cookie dough',desc:'Bursting with infinite potential, but can also be eaten as is. Arguably worth the salmonella.',icon:[25,30],require:'Box of maybe cookies', power:4,price: Math.pow(10,35)});
9556
Game.NewUpgradeCookie({name:'Burnt cookie',desc:'This cookie flew too close to the sun and is now a shadow of its former self. If only you remembered to set a timer, you wouldn\'t have this tragedy on your hands...',icon:[23,30],require:'Box of maybe cookies', power:4,price: Math.pow(10,37)});
9557
Game.NewUpgradeCookie({name:'A chocolate chip cookie but with the chips picked off for some reason',desc:'This has to be the saddest thing you\'ve ever seen.',icon:[24,30],require:'Box of maybe cookies', power:3,price: Math.pow(10,39)});
9558
Game.NewUpgradeCookie({name:'Flavor text cookie',desc:'What you\'re currently reading is what gives this cookie its inimitable flavor.',icon:[22,30],require:'Box of maybe cookies', power:4,price: Math.pow(10,41)});
9559
Game.NewUpgradeCookie({name:'High-definition cookie',desc:'Uncomfortably detailed, like those weird stories your aunt keeps telling at parties.',icon:[28,10],require:'Box of maybe cookies', power:5,price: Math.pow(10,43)});
9560
9561
order=10060;
9562
Game.NewUpgradeCookie({name:'Toast',desc:'A crisp slice of bread, begging for some butter and jam.<br>Why do people keep proposing these at parties?',icon:[27,10],require:'Box of not cookies', power:4,price: Math.pow(10,34)});
9563
Game.NewUpgradeCookie({name:'Peanut butter & jelly',desc:'It\'s time.',icon:[29,9],require:'Box of not cookies', power:4,price: Math.pow(10,36)});
9564
Game.NewUpgradeCookie({name:'Wookies',desc:'These aren\'t the cookies you\'re looking for.',icon:[26,30],require:'Box of not cookies', power:4,price: Math.pow(10,38)});
9565
Game.NewUpgradeCookie({name:'Cheeseburger',desc:'Absolutely no relation to cookies whatsoever - Orteil just wanted an excuse to draw a cheeseburger.',icon:[28,30],require:'Box of not cookies', power:4,price: Math.pow(10,40)});
9566
Game.NewUpgradeCookie({name:'One lone chocolate chip',desc:'The start of something beautiful.',icon:[27,30],require:'Box of not cookies', power:1,price: Math.pow(10,42)});
9567
9568
9569
new Game.Upgrade('Genius accounting','Unlocks <b>extra price information</b>.<br>Each displayed cost now specifies how long it\'ll take you to afford it, and how much of your bank it represents.<q>There\'s no accounting for taste, and yet here we are.</q>',2000000,[11,10]);Game.last.pool='prestige';Game.last.parents=['Inspired checklist'];
9570
9571
9572
new Game.Upgrade('Shimmering veil','Unlocks the <b>shimmering veil</b>, a switch that passively boosts your CpS by <b>50%</b>.<br>You start with the veil turned on; however, it is very fragile, and clicking the big cookie or any golden cookie or reindeer will turn it off, requiring 24 hours of CpS to turn back on.<q>Hands off!</q>',999999999,[9,10]);Game.last.pool='prestige';Game.last.parents=['Distilled essence of redoubled luck'];
9573
9574
order=40005;
9575
var func=function(){
9576
var boost=50;
9577
var resist=0;
9578
if (Game.Has('Reinforced membrane')) {boost+=10;resist+=10;}
9579
return (this.name=='Shimmering veil [on]'?'<div style="text-align:center;">Active.</div><div class="line"></div>':'')+'Boosts your cookie production by <b>'+Beautify(boost)+'%</b> when active.<br>The veil is very fragile and will break if you click the big cookie or any golden cookies or reindeer.<br><br>Once broken, turning the veil back on costs 24 hours of unbuffed CpS.'+(resist>0?('<br><br>Has a <b>'+Beautify(resist)+'%</b> chance to not break.'):'');
9580
};
9581
new Game.Upgrade('Shimmering veil [off]','',1000000,[9,10]);
9582
Game.last.pool='toggle';Game.last.toggleInto='Shimmering veil [on]';
9583
Game.last.priceFunc=function(){return Game.unbuffedCps*60*60*24;}
9584
Game.last.descFunc=func;
9585
new Game.Upgrade('Shimmering veil [on]','',0,[9,10]);
9586
Game.last.pool='toggle';Game.last.toggleInto='Shimmering veil [off]';
9587
Game.last.descFunc=func;
9588
9589
Game.loseShimmeringVeil=function(context)
9590
{
9591
if (!Game.Has('Shimmering veil')) return false;
9592
if (!Game.Has('Shimmering veil [off]') && Game.Has('Shimmering veil [on]')) return false;
9593
if (Game.Has('Reinforced membrane'))
9594
{
9595
if (context=='shimmer') Math.seedrandom(Game.seed+'/'+Game.goldenClicks);
9596
else if (context=='click') Math.seedrandom(Game.seed+'/'+Game.cookieClicks);
9597
if (Math.random()<0.1)
9598
{
9599
Game.Notify('The reinforced membrane protects the shimmering veil.','',[7,10]);
9600
Game.Win('Thick-skinned');
9601
return false;
9602
}
9603
Math.seedrandom();
9604
}
9605
var me=Game.Upgrades['Shimmering veil [on]'];
9606
me.bought=1;
9607
//Game.Upgrades[me.toggleInto].bought=false;
9608
Game.Lock(me.toggleInto);
9609
Game.Unlock(me.toggleInto);
9610
Game.Notify('The shimmering veil disappears...','',[9,10]);
9611
Game.upgradesToRebuild=1;
9612
Game.recalculateGains=1;
9613
PlaySound('snd/spellFail.mp3',0.75);
9614
}
9615
9616
9617
var getCookiePrice=function(level){return 999999999999999999999999999999999999999*Math.pow(10,(level-1)/2);};
9618
9619
order=10020;
9620
Game.NewUpgradeCookie({name:'Whoopie pies',desc:'Two chocolate halves joined together by a cream filling. It\'s got no eyebrows, but you never noticed until now.',icon:[21,31],power: 5,price: getCookiePrice(1)});
9621
Game.NewUpgradeCookie({name:'Caramel wafer biscuits',desc:'Coated in delicious chocolate. As many layers as you\'ll get in a biscuit without involving onions.',icon:[22,31],power: 5,price: getCookiePrice(2)});
9622
Game.NewUpgradeCookie({name:'Chocolate chip mocha cookies',desc:'Mocha started out as an excuse to smuggle chocolate into coffee. And now, in a poignant display of diplomacy and cultural exchange, it\'s bringing coffee to chocolate cookies.',icon:[23,31],power: 5,price: getCookiePrice(3)});
9623
Game.NewUpgradeCookie({name:'Earl Grey cookies',desc:'Captain Picard\'s favorite.',icon:[24,31],power: 5,price: getCookiePrice(4)});
9624
Game.NewUpgradeCookie({name:'Corn syrup cookies',desc:'The corn syrup makes it extra chewy. Not the type of stuff you\'d think to put in a cookie, but bakers make do.',icon:[25,31],power: 5,price: getCookiePrice(5)});
9625
Game.NewUpgradeCookie({name:'Icebox cookies',desc:'Can be prepared in a variety of shapes with a variety of ingredients. Made by freezing dough before baking it, mirroring a time-proven medieval torture practice. Gotta keep them guessing.',icon:[26,31],power: 5,price: getCookiePrice(6)});
9626
Game.NewUpgradeCookie({name:'Graham crackers',desc:'Inspired in their design by the wish to live a life of austere temperance, free from pleasure or cheer; it\'s no wonder these are so tasty.',icon:[27,31],power: 5,price: getCookiePrice(7)});
9627
Game.NewUpgradeCookie({name:'Hardtack',desc:'Extremely hard and, if we\'re being honest, extremely tack.<br>If you\'re considering eating this as a fun snack, you probably have other things to worry about than this game, like getting scurvy or your crew fomenting mutiny.',icon:[28,31],power: 5,price: getCookiePrice(8)});
9628
Game.NewUpgradeCookie({name:'Cornflake cookies',desc:'They\'re grrrrrroovy! Careful not to let it sit in your milk too long, lest you accidentally end up with a bowl of cereal and get confused.',icon:[29,31],power: 5,price: getCookiePrice(9)});
9629
Game.NewUpgradeCookie({name:'Tofu cookies',desc:'There\'s really two ways to go with tofu cooking; either it asserts itself in plain sight or it camouflages itself in the other ingredients. This happens to be the latter, and as such, you can\'t really tell the difference between this and a regular cookie, save for that one pixel on the left.',icon:[30,31],power: 5,price: getCookiePrice(10)});
9630
Game.NewUpgradeCookie({name:'Gluten-free cookies',desc:'Made with browned butter and milk to closely match the archetypal chocolate chip cookie.<br>For celiacs, a chance to indulge in a delicious risk-free pastry. For others, a strangely threatening confection whose empty eyes will never know heaven nor hell.',icon:[30,30],power: 5,price: getCookiePrice(10)});
9631
Game.NewUpgradeCookie({name:'Russian bread cookies',desc:'Also known as alphabet cookies; while most bakers follow the recipe to the letter, it is said that some substitute the flour for spelt. But don\'t take my word for it.',icon:[30,29],power: 5,price: getCookiePrice(11)});
9632
Game.NewUpgradeCookie({name:'Lebkuchen',desc:'Diverse cookies from Germany, fragrant with honey and spices, often baked around Christmas.<br>Once worn by warriors of old for protection in battle.<br>+5 STR, +20% magic resistance.',icon:[30,28],power: 5,price: getCookiePrice(12)});
9633
Game.NewUpgradeCookie({name:'Aachener Printen',desc:'The honey once used to sweeten these gingerbread-like treats has since been swapped out for beet sugar, providing another sad example of regressive evolution.',icon:[30,27],power: 5,price: getCookiePrice(13)});
9634
Game.NewUpgradeCookie({name:'Canistrelli',desc:'A dry biscuit flavored with anise and wine, tough like the people of Corsica where it comes from.',icon:[30,26],power: 5,price: getCookiePrice(14)});
9635
Game.NewUpgradeCookie({name:'Nice biscuits',desc:'Made with coconut and perfect with tea. Traces its origins to a French city so nice they named it that.',icon:[30,25],power: 5,price: getCookiePrice(15)});
9636
Game.NewUpgradeCookie({name:'French pure butter cookies',desc:'You can\'t tell what\'s stronger coming off these - the smell of butter or condescension.',icon:[31,25],power: 5,price: getCookiePrice(16)});
9637
Game.NewUpgradeCookie({name:'Petit beurre',desc:'An unassuming biscuit whose name simply means "little butter". Famed and feared for its four ears and forty-eight teeth.<br>When it hears ya, it\'ll get ya...',icon:[31,26],power: 5,price: getCookiePrice(16)});
9638
Game.NewUpgradeCookie({name:'Nanaimo bars',desc:'A delicious no-bake pastry hailing from Canada. Probably beats eating straight-up snow with maple syrup poured on it, but what do I know.',icon:[31,27],power: 5,price: getCookiePrice(17)});
9639
Game.NewUpgradeCookie({name:'Berger cookies',desc:'Messily slathered with chocolate fudge, but one of the most popular bergers of Baltimore, along with the triple fried egg berger and the blue crab cheeseberger.',icon:[31,28],power: 5,price: getCookiePrice(18)});
9640
Game.NewUpgradeCookie({name:'Chinsuko',desc:'A little piece of Okinawa in cookie form. Part of a Japanese custom of selling sweets as souvenirs. But hey, pressed pennies are cool too.',icon:[31,29],power: 5,price: getCookiePrice(19)});
9641
Game.NewUpgradeCookie({name:'Panda koala biscuits',desc:'Assorted jungle animals with equally assorted fillings.<br>Comes in chocolate, strawberry, vanilla and green tea.<br>Eat them all before they go extinct!',icon:[31,13],power: 5,price: getCookiePrice(19)});
9642
Game.NewUpgradeCookie({name:'Putri salju',desc:'A beloved Indonesian pastry; its name means "snow princess", for the powdered sugar it\'s coated with. Had we added these to Cookie Clicker some years ago, this is where we\'d make a reference to that one Disney movie, but it\'s probably time to let it go.',icon:[31,30],power: 5,price: getCookiePrice(20)});
9643
Game.NewUpgradeCookie({name:'Milk cookies',desc:'Best eaten with a tall glass of chocolate.',icon:[31,31],power: 5,price: getCookiePrice(21)});
9644
9645
order=9999;
9646
Game.NewUpgradeCookie({name:'Cookie crumbs',desc:'There used to be a cookie here. Now there isn\'t.<br>Good heavens, what did you <i>DO?!</i>',icon:[30,13],power:1,require:'Legacy',price:100});
9647
Game.NewUpgradeCookie({name:'Chocolate chip cookie',desc:'This is the cookie you\'ve been clicking this whole time. It looks a bit dented and nibbled on, but it\'s otherwise good as new.',icon:[10,0],power:10,require:'Legacy',price:1000000000000});
9648
9649
9650
new Game.Upgrade('Cosmic beginner\'s luck','Prior to purchasing the <b>Heavenly chip secret</b> upgrade in a run, random drops are <b>5 times more common</b>.<q>Oh! A penny!<br>Oh! A priceless heirloom!<br>Oh! Another penny!</q>',999999999*15,[8,10]);Game.last.pool='prestige';Game.last.parents=['Shimmering veil'];
9651
new Game.Upgrade('Reinforced membrane','The <b>shimmering veil</b> is more resistant, and has a <b>10% chance</b> not to break. It also gives <b>+10%</b> more CpS.<q>A consistency between jellyfish and cling wrap.</q>',999999999*15,[7,10]);Game.last.pool='prestige';Game.last.parents=['Shimmering veil'];
9652
9653
9654
order=255;
9655
Game.GrandmaSynergy('Binary grandmas','A digital grandma to transfer more cookies.<br>(See also : boolean grandmas, string grandmas, and not-a-number grandmas, also known as "NaNs".)','Javascript console');
9656
9657
order=1400;
9658
new Game.TieredUpgrade('The JavaScript console for dummies','Javascript consoles are <b>twice</b> as efficient.<q>This should get you started. The first line reads: "To open the javascript console, press-"<br>...the rest of the book is soaked in chocolate milk. If only there was a way to look up this sort of information...</q>','Javascript console',1);
9659
new Game.TieredUpgrade('64bit arrays','Javascript consoles are <b>twice</b> as efficient.<q>A long-form variable type to pack your cookies much more efficiently.</q>','Javascript console',2);
9660
new Game.TieredUpgrade('Stack overflow','Javascript consoles are <b>twice</b> as efficient.<q>This is really bad! You probably forgot to close a loop somewhere and now your programs are going crazy! The rest of your engineers seem really excited about it somehow. How could a software mishap like a stack overflow possibly ever help anyone?</q>','Javascript console',3);
9661
new Game.TieredUpgrade('Enterprise compiler','Javascript consoles are <b>twice</b> as efficient.<q>This bespoke javascript compiler took your team years of development and billions in research, but it should let you execute (certain) functions (up to) 2% faster (in optimal circumstances).</q>','Javascript console',4);
9662
new Game.TieredUpgrade('Syntactic sugar','Javascript consoles are <b>twice</b> as efficient.<q>Tastier code for tastier cookies.</q>','Javascript console',5);
9663
new Game.TieredUpgrade('A nice cup of coffee','Javascript consoles are <b>twice</b> as efficient.<q>All this nerd stuff has you exhausted. You make yourself a nice cup of coffee, brewed with roasted beans from some far-away island. You may have been working a bit too hard though - the cup of coffee starts talking to you, insisting that it is NOT javascript.</q>','Javascript console',6);
9664
new Game.TieredUpgrade('Just-in-time baking','Javascript consoles are <b>twice</b> as efficient.<q>A new method of preparing cookies; they bake themselves right in front of the customers before eating, leaving your kitchens mess-free.</q>','Javascript console',7);
9665
new Game.TieredUpgrade('cookies++','Javascript consoles are <b>twice</b> as efficient.<q>Your very own cookie-themed programming language, elegantly named after its most interesting ability - increasing the "cookies" variable by 1.</q>','Javascript console',8);
9666
new Game.TieredUpgrade('Software updates','Javascript consoles are <b>twice</b> as efficient.<q>This is grand news - someone\'s finally figured out the Wifi password, and your newfound internet connection seems to have triggered a whole lot of software updates! Your browsers, drivers and plugins all received a fresh coat of paint, and your javascript version has been updated to the latest ECMAScript specification. It\'s really too bad thousands had to die due to some deprecated function in your neurotoxin ventilation code, but I guess that\'s progress for you.</q>','Javascript console',9);
9667
new Game.TieredUpgrade('Game.Loop','Javascript consoles are <b>twice</b> as efficient.<q>You\'re not quite sure what to make of this. What does it mean? What does it do? Who would leave something like that just laying around here? Try asking again in 1/30th of a second.</q>','Javascript console',10);
9668
new Game.TieredUpgrade('eval()','Javascript consoles are <b>twice</b> as efficient.<q>It is said that this simple function holds the key to the universe, and that whosoever masters it may shape reality to their will.<br>Good thing you have no idea how it works. Makes for a neat plaque on your wall, though.</q>','Javascript console',11);
9669
9670
order=5000;
9671
Game.SynergyUpgrade('Script grannies','<q>Armies of energy drink-fueled grandmas ready to hack into the cyberspace for renegade e-cookies.</q>','Javascript console','Grandma','synergy1');
9672
Game.SynergyUpgrade('Tombola computing','','Javascript console','Chancemaker','synergy2');
9673
Game.last.descFunc=function(){
9674
Math.seedrandom(Game.seed+'-tombolacomputing');
9675
var str='(Your ticket reads '+Math.floor(Math.random()*100)+' '+Math.floor(Math.random()*100)+' '+Math.floor(Math.random()*100)+' '+Math.floor(Math.random()*100)+', entitling you to '+choose([Math.floor(Math.random()*5+2)+' lines of javascript','one free use of Math.random()','one qubit, whatever that is','one half-eaten cookie','a brand new vacuum cleaner','most of one room-temperature cup of orange soda','one really good sandwich','one handful of pocket lint','someone\'s mostly clean hairpiece','a trip to a fancy restaurant','the knowledge of those numbers','a furtive glance at the news ticker','another ticket, half-price','all-you-can-eat moldy bread','one lifetime supply of oxygen','the color '+choose['red','orange','yellow','green','blue','purple','black','white','gray','brown','pink','teal'],'increased intellect for a limited time','an ancient runesword','the throne of a far-away country','the position of Mafia capo. Good luck','one free time-travel week-end','something beautiful','the deed to some oil well','one hamburger made out of the animal, plant, or person of your choice','the last surviving '+choose['dodo bird','thylacine','unicorn','dinosaur','neanderthal'],'a deep feeling of accomplishment','a fleeting tinge of entertainment','a vague sense of unease','deep existential dread','one extra week added to your lifespan','breathe manually','blink right here and now','one meeting with any famous person, living or dead, in your next dream','one very nice dream','a wacky sound effect','45 seconds of moral flexibility','hundreds and thousands, also known as "sprinkles"','one circle, triangle, square or other simple geometric shape, of average dimensions','just this extra bit of randomness','the extra push you needed to turn your life around','a good fright','one secret superpower','a better luck next time','an irrational phobia of tombola tickets','one whole spider','an increased sense of self-worth and determination','inner peace','one double-XP week-end in the MMORPG of your choice','a little piece of the universe, represented by the trillions of atoms that make up this very ticket','food poisoning','the Moon! Well, conceptually','a new car, baby','a new catchphrase','an intrusive thought of your choice','- ...aw man, it just cuts off there','the director spot for the next big hit movie','really good-looking calves','one genuine pirate golden doubloon','"treasure and riches", or something','one boat, sunken','baby shoes, never worn','direct lineage to some King or Queen','innate knowledge of a dead language you\'ll never encounter','the melody of a song you don\'t know the words to','white noise','mild physical impairment','a new pair of lips','things, and such','one popular expression bearing your name','one typo','one get-out-of-jail-free card','the rest of your life... for now','one polite huff','a condescending stare','one cursed monkey paw','true love, probably','an interesting factoid about the animal, country, TV show or celebrity of your choice','a pop culture reference','minutes of fun','the etymology of the word "tombola" - it\'s Italian for "a tumble"','nothing. You lost, sorry'])+'.)';
9676
Math.seedrandom();
9677
return this.desc+'<q>Like quantum computing, but more fun.<br>'+str+'</q>';
9678
};
9679
9680
order=10020;
9681
Game.NewUpgradeCookie({name:'Kruidnoten',desc:'A festive dutch favorite; tiny cinnamony bites sometimes coated in chocolate. The name translates roughly to "kruidnoten".',icon:[30,3],power: 5,price: getCookiePrice(22)});
9682
Game.NewUpgradeCookie({name:'Marie biscuits',desc:'Pleasantly round, smoothly buttery, subtly vanilla-flavored, ornately embossed, each ridge represents a person Marie killed in prison.',icon:[30,4],power: 5,price: getCookiePrice(23)});
9683
Game.NewUpgradeCookie({name:'Meringue cookies',desc:'Probably the most exciting thing you can make out of egg whites. Also called forgotten cookies, due to the recipe being once lost in a sealed mystical vault for 10,000 years.',icon:[31,4],power: 5,price: getCookiePrice(24)});
9684
9685
order=10060;
9686
Game.NewUpgradeCookie({name:'Pizza',desc:'What is a pizza if not a large, chewy cookie, frosted with a rather exuberant tomato & cheese icing? Not a cookie, that\'s what.',icon:[31,9],require:'Box of not cookies', power:5,price: Math.pow(10,44)});
9687
9688
order=10050;
9689
Game.NewUpgradeCookie({name:'Crackers',desc:'These are the non-flavored kind with no salt added. Really just a judgement-free wheat square begging to have bits of ham and spreadable cheese piled onto it, its main contribution being "crunchy".',icon:[30,9],require:'Box of maybe cookies', power:4,price: Math.pow(10,45)});
9690
9691
order=10030;
9692
Game.NewUpgradeCookie({name:'Havabreaks',desc:'You can snap the sections neatly or just bite into the whole thing like some kind of lunatic. Some oversea countries manufacture these in hundreds of unique flavors, such as green tea, lobster bisque, and dark chocolate.',icon:[31,3],require:'Box of brand biscuits',power: 2, price: 999999999999999999999999999*5});
9693
9694
order=20000;
9695
new Game.Upgrade('Kitten executives','You gain <b>more CpS</b> the more milk you have.<q>ready to execute whatever and whoever you\'d like, sir</q>',900000000000000000000000000000000000000000000,Game.GetIcon('Kitten',13));Game.last.kitten=1;Game.MakeTiered(Game.last,13,18);
9696
9697
9698
order=10020;
9699
Game.NewUpgradeCookie({name:'Chai tea cookies',desc:'Not exactly Captain Picard\'s favorite, but I mean, these will do in a pinch.',icon:[23,32],power: 5,price: getCookiePrice(4)+5});Game.last.order=10020.5685;
9700
9701
Game.NewUpgradeCookie({name:'Yogurt cookies',desc:'Augmented by the wonders of dairy, these cookies are light and fluffy and just one more thing for the lactose-intolerant to avoid.<br>Truly for the cultured among us.',icon:[24,32],power: 5,price: getCookiePrice(25)});
9702
Game.NewUpgradeCookie({name:'Thumbprint cookies',desc:'Filled with jam and sometimes served in little paper cups. No longer admissible as biometric evidence in court. We\'re not having a repeat of that whole mess.',icon:[25,32],power: 5,price: getCookiePrice(26)});
9703
Game.NewUpgradeCookie({name:'Pizzelle',desc:'Thin, crisp waffle cookies baked in a bespoke iron following an ancient Italian recipe.<br>These cookies have been around for a long, long time.<br>These cookies have seen things.',icon:[26,32],power: 5,price: getCookiePrice(27)});
9704
9705
order=10030;
9706
Game.NewUpgradeCookie({name:'Zilla wafers',desc:'Popular vanilla-flavored biscuits that somehow keep ending up in banana pudding.<br>Themed after a beloved radioactive prehistoric monster, for some reason.',icon:[22,32],require:'Box of brand biscuits',power: 2, price: 999999999999999999999999999999*5});
9707
Game.NewUpgradeCookie({name:'Dim Dams',desc:'Two biscuits joined by chocolate and coated in even more chocolate.<br>You wonder - which one is the dim, and which one is the dam?',icon:[31,10],require:'Box of brand biscuits',power: 2, price: 999999999999999999999999999999*5});
9708
9709
order=10060;
9710
Game.NewUpgradeCookie({name:'Candy',desc:'There are two pillars to the world of sweets : pastries, of course - and candy.<br>You could make a whole new game just about these, but for now, please enjoy these assorted generic candies.',icon:[30,10],require:'Box of not cookies', power:5,price: Math.pow(10,46)});
9711
9712
9713
order=19000;
9714
new Game.TieredUpgrade('Fortune #001','Cursors are <b>7%</b> more efficient and <b>7%</b> cheaper.<q>Fingers are not the only thing you can count on.</q>','Cursor','fortune');
9715
new Game.TieredUpgrade('Fortune #002','Grandmas are <b>7%</b> more efficient and <b>7%</b> cheaper.<q>A wrinkle is a crack in a mundane facade.</q>','Grandma','fortune');
9716
new Game.TieredUpgrade('Fortune #003','Farms are <b>7%</b> more efficient and <b>7%</b> cheaper.<q>The seeds of tomorrow already lie within the seeds of today.</q>','Farm','fortune');
9717
new Game.TieredUpgrade('Fortune #004','Mines are <b>7%</b> more efficient and <b>7%</b> cheaper.<q>Riches from deep under elevate you all the same.</q>','Mine','fortune');
9718
new Game.TieredUpgrade('Fortune #005','Factories are <b>7%</b> more efficient and <b>7%</b> cheaper.<q>True worth is not in what you find, but in what you make.</q>','Factory','fortune');
9719
new Game.TieredUpgrade('Fortune #006','Banks are <b>7%</b> more efficient and <b>7%</b> cheaper.<q>The value of money means nothing to a pocket.</q>','Bank','fortune');
9720
new Game.TieredUpgrade('Fortune #007','Temples are <b>7%</b> more efficient and <b>7%</b> cheaper.<q>Not all guides deserve worship.</q>','Temple','fortune');
9721
new Game.TieredUpgrade('Fortune #008','Wizard towers are <b>7%</b> more efficient and <b>7%</b> cheaper.<q>Magic is about two things - showmanship, and rabbits.</q>','Wizard tower','fortune');
9722
new Game.TieredUpgrade('Fortune #009','Shipments are <b>7%</b> more efficient and <b>7%</b> cheaper.<q>Every mile travelled expands the mind by just as much.</q>','Shipment','fortune');
9723
new Game.TieredUpgrade('Fortune #010','Alchemy labs are <b>7%</b> more efficient and <b>7%</b> cheaper.<q>Don\'t get used to yourself. You\'re gonna have to change.</q>','Alchemy lab','fortune');
9724
new Game.TieredUpgrade('Fortune #011','Portals are <b>7%</b> more efficient and <b>7%</b> cheaper.<q>Every doorway is a gamble. Tread with care.</q>','Portal','fortune');
9725
new Game.TieredUpgrade('Fortune #012','Time machines are <b>7%</b> more efficient and <b>7%</b> cheaper.<q>Do your future self a favor; they\'ll thank you for it.</q>','Time machine','fortune');
9726
new Game.TieredUpgrade('Fortune #013','Antimatter condensers are <b>7%</b> more efficient and <b>7%</b> cheaper.<q>The world is made of what we put into it.</q>','Antimatter condenser','fortune');
9727
new Game.TieredUpgrade('Fortune #014','Prisms are <b>7%</b> more efficient and <b>7%</b> cheaper.<q>Staring at a dazzling light can blind you back to darkness.</q>','Prism','fortune');
9728
new Game.TieredUpgrade('Fortune #015','Chancemakers are <b>7%</b> more efficient and <b>7%</b> cheaper.<q>Don\'t leave to blind chance what you could accomplish with deaf skill.</q>','Chancemaker','fortune');
9729
new Game.TieredUpgrade('Fortune #016','Fractal engines are <b>7%</b> more efficient and <b>7%</b> cheaper.<q>It\'s good to see yourself in others. Remember to see yourself in yourself, too.</q>','Fractal engine','fortune');
9730
new Game.TieredUpgrade('Fortune #017','Javascript consoles are <b>7%</b> more efficient and <b>7%</b> cheaper.<q>If things aren\'t working out for you, rewrite the rules.</q>','Javascript console','fortune');
9731
9732
9733
order=19100;
9734
//note : price for these capped to base price OR 1 day of unbuffed CpS
9735
new Game.Upgrade('Fortune #100','Upgrades and buildings cost <b>-1%</b>; you gain <b>+1%</b> CpS.<q>True wealth is counted in gifts.</q>',
9736
Game.Tiers['fortune'].price*100000,[0,0]);Game.MakeTiered(Game.last,'fortune',10);
9737
Game.last.priceFunc=function(me){return Math.min(me.basePrice,Game.unbuffedCps*60*60*24);}
9738
new Game.Upgrade('Fortune #101','You gain <b>+7%</b> CpS.<q>Some people dream of fortunes; others dream of cookies.</q>',Game.Tiers['fortune'].price*100000000,[0,0]);Game.MakeTiered(Game.last,'fortune',10);
9739
Game.last.priceFunc=function(me){return Math.min(me.basePrice,Game.unbuffedCps*60*60*24);}
9740
new Game.Upgrade('Fortune #102','You gain <b>+1%</b> of your regular CpS while the game is closed <small>(provided you have the Twin Gates of Transcendence heavenly upgrade)</small>.<q>Help, I\'m trapped in a browser game!</q>',Game.Tiers['fortune'].price*100000000000,[0,0]);Game.MakeTiered(Game.last,'fortune',10);
9741
Game.last.priceFunc=function(me){return Math.min(me.basePrice,Game.unbuffedCps*60*60*24);}
9742
new Game.Upgrade('Fortune #103','You gain <b>more CpS</b> the more milk you have.<q>Don\'t believe the superstitions; all cats are good luck.</q>',Game.Tiers['fortune'].price*100000000000000,[0,0]);Game.MakeTiered(Game.last,'fortune',18);Game.last.kitten=1;
9743
Game.last.priceFunc=function(me){return Math.min(me.basePrice,Game.unbuffedCps*60*60*24);}
9744
new Game.Upgrade('Fortune #104','Clicking gains <b>+1% of your CpS</b>.<q>Remember to stay in touch.</q>',Game.Tiers['fortune'].price*100000000000,[0,0]);Game.MakeTiered(Game.last,'fortune',11);
9745
Game.last.priceFunc=function(me){return Math.min(me.basePrice,Game.unbuffedCps*60*60*24);}
9746
9747
new Game.Upgrade('Fortune cookies','The news ticker may occasionally have <b>fortunes</b>, which may be clicked for something good.<q>These don\'t taste all that great but that\'s not really the point, is it?</q>',77777777777,[29,8]);Game.last.pool='prestige';Game.last.parents=['Distilled essence of redoubled luck'];
9748
9749
9750
//end of upgrades
9751
9752
Game.seasons={
9753
'christmas':{name:'Christmas',start:'Christmas season has started!',over:'Christmas season is over.',trigger:'Festive biscuit'},
9754
'valentines':{name:'Valentine\'s day',start:'Valentine\'s day has started!',over:'Valentine\'s day is over.',trigger:'Lovesick biscuit'},
9755
'fools':{name:'Business day',start:'Business day has started!',over:'Business day is over.',trigger:'Fool\'s biscuit'},
9756
'easter':{name:'Easter',start:'Easter season has started!',over:'Easter season is over.',trigger:'Bunny biscuit'},
9757
'halloween':{name:'Halloween',start:'Halloween has started!',over:'Halloween is over.',trigger:'Ghostly biscuit'}
9758
};
9759
9760
Game.listTinyOwnedUpgrades=function(arr)
9761
{
9762
var str='';
9763
for (var i=0;i<arr.length;i++)
9764
{
9765
if (Game.Has(arr[i]))
9766
{
9767
var it=Game.Upgrades[arr[i]];
9768
str+='<div class="icon" style="vertical-align:middle;display:inline-block;'+(it.icon[2]?'background-image:url('+it.icon[2]+');':'')+'background-position:'+(-it.icon[0]*48)+'px '+(-it.icon[1]*48)+'px;transform:scale(0.5);margin:-16px;"></div>';
9769
}
9770
}
9771
return str;
9772
}
9773
9774
Game.santaDrops=['Increased merriness','Improved jolliness','A lump of coal','An itchy sweater','Reindeer baking grounds','Weighted sleighs','Ho ho ho-flavored frosting','Season savings','Toy workshop','Naughty list','Santa\'s bottomless bag','Santa\'s helpers','Santa\'s legacy','Santa\'s milk and cookies'];
9775
9776
Game.GetHowManySantaDrops=function()
9777
{
9778
var num=0;
9779
for (var i in Game.santaDrops) {if (Game.Has(Game.santaDrops[i])) num++;}
9780
return num;
9781
}
9782
9783
Game.reindeerDrops=['Christmas tree biscuits','Snowflake biscuits','Snowman biscuits','Holly biscuits','Candy cane biscuits','Bell biscuits','Present biscuits'];
9784
Game.GetHowManyReindeerDrops=function()
9785
{
9786
var num=0;
9787
for (var i in Game.reindeerDrops) {if (Game.Has(Game.reindeerDrops[i])) num++;}
9788
return num;
9789
}
9790
/*for (var i in Game.santaDrops)
9791
{
9792
Game.Upgrades[Game.santaDrops[i]].descFunc=function(){return '<div style="text-align:center;">You currently own <b>'+Game.GetHowManySantaDrops()+'/'+Game.santaDrops.length+'</b> of Santa\'s gifts.</div><div class="line"></div>'+this.desc;};
9793
}*/
9794
9795
Game.seasonDrops=Game.heartDrops.concat(Game.halloweenDrops).concat(Game.easterEggs).concat(Game.santaDrops).concat(Game.reindeerDrops);
9796
9797
Game.saySeasonSwitchUses=function()
9798
{
9799
if (Game.seasonUses==0) return 'You haven\'t switched seasons this ascension yet.';
9800
return 'You\'ve switched seasons <b>'+(Game.seasonUses==1?'once':Game.seasonUses==2?'twice':(Game.seasonUses+' times'))+'</b> this ascension.';
9801
}
9802
Game.Upgrades['Festive biscuit'].descFunc=function(){return '<div style="text-align:center;">'+Game.listTinyOwnedUpgrades(Game.santaDrops)+'<br><br>You\'ve purchased <b>'+Game.GetHowManySantaDrops()+'/'+Game.santaDrops.length+'</b> of Santa\'s gifts.<div class="line"></div>'+Game.listTinyOwnedUpgrades(Game.reindeerDrops)+'<br><br>You\'ve purchased <b>'+Game.GetHowManyReindeerDrops()+'/'+Game.reindeerDrops.length+'</b> reindeer cookies.<div class="line"></div>'+Game.saySeasonSwitchUses()+'<div class="line"></div></div>'+this.desc;};
9803
Game.Upgrades['Bunny biscuit'].descFunc=function(){return '<div style="text-align:center;">'+Game.listTinyOwnedUpgrades(Game.easterEggs)+'<br><br>You\'ve purchased <b>'+Game.GetHowManyEggs()+'/'+Game.easterEggs.length+'</b> eggs.<div class="line"></div>'+Game.saySeasonSwitchUses()+'<div class="line"></div></div>'+this.desc;};
9804
Game.Upgrades['Ghostly biscuit'].descFunc=function(){return '<div style="text-align:center;">'+Game.listTinyOwnedUpgrades(Game.halloweenDrops)+'<br><br>You\'ve purchased <b>'+Game.GetHowManyHalloweenDrops()+'/'+Game.halloweenDrops.length+'</b> halloween cookies.<div class="line"></div>'+Game.saySeasonSwitchUses()+'<div class="line"></div></div>'+this.desc;};
9805
Game.Upgrades['Lovesick biscuit'].descFunc=function(){return '<div style="text-align:center;">'+Game.listTinyOwnedUpgrades(Game.heartDrops)+'<br><br>You\'ve purchased <b>'+Game.GetHowManyHeartDrops()+'/'+Game.heartDrops.length+'</b> heart biscuits.<div class="line"></div>'+Game.saySeasonSwitchUses()+'<div class="line"></div></div>'+this.desc;};
9806
Game.Upgrades['Fool\'s biscuit'].descFunc=function(){return '<div style="text-align:center;">'+Game.saySeasonSwitchUses()+'<div class="line"></div></div>'+this.desc;};
9807
9808
Game.computeSeasonPrices=function()
9809
{
9810
for (var i in Game.seasons)
9811
{
9812
Game.seasons[i].triggerUpgrade.priceFunc=function(){
9813
var m=1;
9814
if (Game.hasGod)
9815
{
9816
var godLvl=Game.hasGod('seasons');
9817
if (godLvl==1) m*=2;
9818
else if (godLvl==2) m*=1.50;
9819
else if (godLvl==3) m*=1.25;
9820
}
9821
//return Game.seasonTriggerBasePrice*Math.pow(2,Game.seasonUses)*m;
9822
//return Game.cookiesPs*60*Math.pow(1.5,Game.seasonUses)*m;
9823
return Game.seasonTriggerBasePrice+Game.unbuffedCps*60*Math.pow(1.5,Game.seasonUses)*m;
9824
}
9825
}
9826
}
9827
Game.computeSeasons=function()
9828
{
9829
for (var i in Game.seasons)
9830
{
9831
var me=Game.Upgrades[Game.seasons[i].trigger];
9832
Game.seasons[i].triggerUpgrade=me;
9833
me.pool='toggle';
9834
me.buyFunction=function()
9835
{
9836
Game.seasonUses+=1;
9837
Game.computeSeasonPrices();
9838
//Game.Lock(this.name);
9839
for (var i in Game.seasons)
9840
{
9841
var me=Game.Upgrades[Game.seasons[i].trigger];
9842
if (me.name!=this.name) {Game.Lock(me.name);Game.Unlock(me.name);}
9843
}
9844
if (Game.season!='' && Game.season!=this.season)
9845
{
9846
var str=Game.seasons[Game.season].over+'<div class="line"></div>';
9847
if (Game.prefs.popups) Game.Popup(str);
9848
else Game.Notify(str,'',Game.seasons[Game.season].triggerUpgrade.icon,4);
9849
}
9850
Game.season=this.season;
9851
Game.seasonT=Game.getSeasonDuration();
9852
Game.storeToRefresh=1;
9853
Game.upgradesToRebuild=1;
9854
Game.Objects['Grandma'].redraw();
9855
var str=Game.seasons[this.season].start+'<div class="line"></div>';
9856
if (Game.prefs.popups) Game.Popup(str);
9857
else Game.Notify(str,'',this.icon,4);
9858
}
9859
9860
me.clickFunction=function(me){return function()
9861
{
9862
//undo season
9863
if (me.bought && Game.season && me==Game.seasons[Game.season].triggerUpgrade)
9864
{
9865
me.lose();
9866
var str=Game.seasons[Game.season].over;
9867
if (Game.prefs.popups) Game.Popup(str);
9868
else Game.Notify(str,'',Game.seasons[Game.season].triggerUpgrade.icon);
9869
if (Game.Has('Season switcher')) {Game.Unlock(Game.seasons[Game.season].trigger);Game.seasons[Game.season].triggerUpgrade.bought=0;}
9870
9871
Game.upgradesToRebuild=1;
9872
Game.recalculateGains=1;
9873
Game.season=Game.baseSeason;
9874
Game.seasonT=-1;
9875
PlaySound('snd/tick.mp3');
9876
return false;
9877
}
9878
else return true;
9879
};}(me);
9880
9881
me.displayFuncWhenOwned=function(){return '<div style="text-align:center;">Time remaining :<br><b>'+(Game.Has('Eternal seasons')?'forever':Game.sayTime(Game.seasonT,-1))+'</b><div style="font-size:80%;">(Click again to cancel season)</div></div>';}
9882
me.timerDisplay=function(upgrade){return function(){if (!Game.Upgrades[upgrade.name].bought || Game.Has('Eternal seasons')) return -1; else return 1-Game.seasonT/Game.getSeasonDuration();}}(me);
9883
9884
}
9885
}
9886
Game.getSeasonDuration=function(){return Game.fps*60*60*24;}
9887
Game.computeSeasons();
9888
9889
//alert untiered building upgrades
9890
for (var i in Game.Upgrades)
9891
{
9892
var me=Game.Upgrades[i];
9893
if (me.order>=200 && me.order<2000 && !me.tier && me.name.indexOf('grandma')==-1 && me.pool!='prestige') console.log(me.name+' has no tier.');
9894
}
9895
9896
Game.UpgradesByPool=[];
9897
for (var i in Game.Upgrades)
9898
{
9899
if (!Game.UpgradesByPool[Game.Upgrades[i].pool]) Game.UpgradesByPool[Game.Upgrades[i].pool]=[];
9900
Game.UpgradesByPool[Game.Upgrades[i].pool].push(Game.Upgrades[i]);
9901
}
9902
9903
Game.PrestigeUpgrades=[];
9904
for (var i in Game.Upgrades)
9905
{
9906
if (Game.Upgrades[i].pool=='prestige' || Game.Upgrades[i].pool=='prestigeDecor')
9907
{
9908
Game.PrestigeUpgrades.push(Game.Upgrades[i]);
9909
Game.Upgrades[i].posX=0;
9910
Game.Upgrades[i].posY=0;
9911
if (Game.Upgrades[i].parents.length==0 && Game.Upgrades[i].name!='Legacy') Game.Upgrades[i].parents=['Legacy'];
9912
Game.Upgrades[i].parents=Game.Upgrades[i].parents||[-1];
9913
for (var ii in Game.Upgrades[i].parents) {if (Game.Upgrades[i].parents[ii]!=-1) Game.Upgrades[i].parents[ii]=Game.Upgrades[Game.Upgrades[i].parents[ii]];}
9914
}
9915
}
9916
9917
Game.goldenCookieUpgrades=['Get lucky','Lucky day','Serendipity','Heavenly luck','Lasting fortune','Decisive fate','Lucky digit','Lucky number','Lucky payout','Golden goose egg'];
9918
9919
Game.cookieUpgrades=[];
9920
for (var i in Game.Upgrades)
9921
{
9922
var me=Game.Upgrades[i];
9923
if ((me.pool=='cookie' || me.pseudoCookie)) Game.cookieUpgrades.push(me);
9924
if (me.tier) Game.Tiers[me.tier].upgrades.push(me);
9925
}
9926
for (var i in Game.UnlockAt){Game.Upgrades[Game.UnlockAt[i].name].unlockAt=Game.UnlockAt[i];}
9927
for (var i in Game.Upgrades){if (Game.Upgrades[i].pool=='prestige') Game.Upgrades[i].order=Game.Upgrades[i].id;}
9928
9929
/*var oldPrestigePrices={"Chimera":5764801,"Synergies Vol. I":2525,"Synergies Vol. II":252525,"Label printer":9999};
9930
for (var i in oldPrestigePrices){Game.Upgrades[i].basePrice=oldPrestigePrices[i];}*/
9931
9932
Game.UpgradePositions={141:[176,-66],181:[-555,-93],253:[-272,-231],254:[-99,-294],255:[-193,-279],264:[48,123],265:[133,154],266:[223,166],267:[305,137],268:[382,85],269:[-640,42],270:[-614,-268],271:[-728,-120],272:[-688,-205],273:[-711,-31],274:[270,-328],275:[317,-439],276:[333,-556],277:[334,-676],278:[333,-796],279:[328,-922],280:[303,-1040],281:[194,-230],282:[-265,212],283:[-321,297],284:[-322,406],285:[-243,501],286:[-403,501],287:[-314,606],288:[-312,-374],289:[-375,-502],290:[-206,-476],291:[453,-745],292:[-375,-651],293:[-399,-794],323:[-86,120],325:[192,-1127],326:[-328,-158],327:[-192,290],328:[-3,237],329:[92,376],353:[121,-326],354:[77,-436],355:[64,-548],356:[57,-673],357:[52,-793],358:[58,-924],359:[82,-1043],360:[-188,408],362:[158,289],363:[-30,-30],364:[-232,-730],365:[-77,349],368:[-82,-532],393:[196,-714],394:[197,-964],395:[-143,-140],396:[-264,-889],397:[-69,563],408:[-204,-1036],409:[-72,-1152],410:[-70,-1328],411:[-388,137],412:[-470,253],413:[-482,389],449:[-367,-1113],450:[-334,-1214],451:[-278,-1303],495:[-402,-966],496:[200,49],505:[-545,-570],520:[-279,-8],537:[-907,-131],539:[-508,-1270],540:[-629,-1291],541:[-594,-1186],542:[-548,-1374],561:[300,-17],562:[52,646],591:[154,744],592:[180,608],643:[-121,710],};
9933
9934
for (var i in Game.UpgradePositions) {Game.UpgradesById[i].posX=Game.UpgradePositions[i][0];Game.UpgradesById[i].posY=Game.UpgradePositions[i][1];}
9935
9936
9937
/*=====================================================================================
9938
ACHIEVEMENTS
9939
=======================================================================================*/
9940
Game.Achievements=[];
9941
Game.AchievementsById=[];
9942
Game.AchievementsN=0;
9943
Game.AchievementsOwned=0;
9944
Game.Achievement=function(name,desc,icon)
9945
{
9946
this.id=Game.AchievementsN;
9947
this.name=name;
9948
this.desc=desc;
9949
this.baseDesc=this.desc;
9950
this.desc=BeautifyInText(this.baseDesc);
9951
this.icon=icon;
9952
this.won=0;
9953
this.disabled=0;
9954
this.order=this.id;
9955
if (order) this.order=order+this.id*0.001;
9956
this.pool='normal';
9957
this.vanilla=Game.vanilla;
9958
this.type='achievement';
9959
9960
this.click=function()
9961
{
9962
if (this.clickFunction) this.clickFunction();
9963
}
9964
Game.last=this;
9965
Game.Achievements[this.name]=this;
9966
Game.AchievementsById[this.id]=this;
9967
Game.AchievementsN++;
9968
return this;
9969
}
9970
9971
Game.Win=function(what)
9972
{
9973
if (typeof what==='string')
9974
{
9975
if (Game.Achievements[what])
9976
{
9977
if (Game.Achievements[what].won==0)
9978
{
9979
var name=Game.Achievements[what].shortName?Game.Achievements[what].shortName:Game.Achievements[what].name;
9980
Game.Achievements[what].won=1;
9981
if (Game.prefs.popups) Game.Popup('Achievement unlocked :<br>'+name);
9982
else Game.Notify('Achievement unlocked','<div class="title" style="font-size:18px;margin-top:-2px;">'+name+'</div>',Game.Achievements[what].icon);
9983
if (Game.CountsAsAchievementOwned(Game.Achievements[what].pool)) Game.AchievementsOwned++;
9984
Game.recalculateGains=1;
9985
}
9986
}
9987
}
9988
else {for (var i in what) {Game.Win(what[i]);}}
9989
}
9990
Game.RemoveAchiev=function(what)
9991
{
9992
if (Game.Achievements[what])
9993
{
9994
if (Game.Achievements[what].won==1)
9995
{
9996
Game.Achievements[what].won=0;
9997
if (Game.CountsAsAchievementOwned(Game.Achievements[what].pool)) Game.AchievementsOwned--;
9998
Game.recalculateGains=1;
9999
}
10000
}
10001
}
10002
Game.Achievement.prototype.toggle=function()//cheating only
10003
{
10004
if (!this.won)
10005
{
10006
Game.Win(this.name);
10007
}
10008
else
10009
{
10010
Game.RemoveAchiev(this.name);
10011
}
10012
if (Game.onMenu=='stats') Game.UpdateMenu();
10013
}
10014
10015
Game.CountsAsAchievementOwned=function(pool)
10016
{
10017
if (pool=='' || pool=='normal') return true; else return false;
10018
}
10019
10020
Game.HasAchiev=function(what)
10021
{
10022
return (Game.Achievements[what]?Game.Achievements[what].won:0);
10023
}
10024
10025
Game.TieredAchievement=function(name,desc,building,tier)
10026
{
10027
var achiev=new Game.Achievement(name,desc,Game.GetIcon(building,tier));
10028
Game.SetTier(building,tier);
10029
return achiev;
10030
}
10031
10032
Game.ProductionAchievement=function(name,building,tier,q,mult)
10033
{
10034
var building=Game.Objects[building];
10035
var icon=[building.iconColumn,22];
10036
var n=12+building.n+(mult||0);
10037
if (tier==2) {icon[1]=23;n+=7;}
10038
else if (tier==3) {icon[1]=24;n+=14;}
10039
var pow=Math.pow(10,n);
10040
var achiev=new Game.Achievement(name,'Make <b>'+Beautify(pow)+'</b> cookies just from '+building.plural+'.'+(q?'<q>'+q+'</q>':''),icon);
10041
building.productionAchievs.push({pow:pow,achiev:achiev});
10042
return achiev;
10043
}
10044
10045
Game.thresholdIcons=[0,1,2,3,4,5,6,7,8,9,10,11,18,19,20,21,22,23,24,25,26,27,28,29,21,22,23,24,25,26,27,28,29,21,22,23,24,25,26,27,28,29];
10046
Game.BankAchievements=[];
10047
Game.BankAchievement=function(name)
10048
{
10049
var threshold=Math.pow(10,Math.floor(Game.BankAchievements.length*1.5+2));
10050
if (Game.BankAchievements.length==0) threshold=1;
10051
var achiev=new Game.Achievement(name,'Bake <b>'+Beautify(threshold)+'</b> cookie'+(threshold==1?'':'s')+' in one ascension.',[Game.thresholdIcons[Game.BankAchievements.length],(Game.BankAchievements.length>32?1:Game.BankAchievements.length>23?2:5)]);
10052
achiev.threshold=threshold;
10053
achiev.order=100+Game.BankAchievements.length*0.01;
10054
Game.BankAchievements.push(achiev);
10055
return achiev;
10056
}
10057
Game.CpsAchievements=[];
10058
Game.CpsAchievement=function(name)
10059
{
10060
var threshold=Math.pow(10,Math.floor(Game.CpsAchievements.length*1.2));
10061
//if (Game.CpsAchievements.length==0) threshold=1;
10062
var achiev=new Game.Achievement(name,'Bake <b>'+Beautify(threshold)+'</b> cookie'+(threshold==1?'':'s')+' per second.',[Game.thresholdIcons[Game.CpsAchievements.length],(Game.CpsAchievements.length>32?1:Game.CpsAchievements.length>23?2:5)]);
10063
achiev.threshold=threshold;
10064
achiev.order=200+Game.CpsAchievements.length*0.01;
10065
Game.CpsAchievements.push(achiev);
10066
return achiev;
10067
}
10068
10069
//define achievements
10070
//WARNING : do NOT add new achievements in between, this breaks the saves. Add them at the end !
10071
10072
var order=0;//this is used to set the order in which the items are listed
10073
10074
Game.BankAchievement('Wake and bake');
10075
Game.BankAchievement('Making some dough');
10076
Game.BankAchievement('So baked right now');
10077
Game.BankAchievement('Fledgling bakery');
10078
Game.BankAchievement('Affluent bakery');
10079
Game.BankAchievement('World-famous bakery');
10080
Game.BankAchievement('Cosmic bakery');
10081
Game.BankAchievement('Galactic bakery');
10082
Game.BankAchievement('Universal bakery');
10083
Game.BankAchievement('Timeless bakery');
10084
Game.BankAchievement('Infinite bakery');
10085
Game.BankAchievement('Immortal bakery');
10086
Game.BankAchievement('Don\'t stop me now');
10087
Game.BankAchievement('You can stop now');
10088
Game.BankAchievement('Cookies all the way down');
10089
Game.BankAchievement('Overdose');
10090
10091
Game.CpsAchievement('Casual baking');
10092
Game.CpsAchievement('Hardcore baking');
10093
Game.CpsAchievement('Steady tasty stream');
10094
Game.CpsAchievement('Cookie monster');
10095
Game.CpsAchievement('Mass producer');
10096
Game.CpsAchievement('Cookie vortex');
10097
Game.CpsAchievement('Cookie pulsar');
10098
Game.CpsAchievement('Cookie quasar');
10099
Game.CpsAchievement('Oh hey, you\'re still here');
10100
Game.CpsAchievement('Let\'s never bake again');
10101
10102
order=30010;
10103
new Game.Achievement('Sacrifice','Ascend with <b>1 million</b> cookies baked.<q>Easy come, easy go.</q>',[11,6]);
10104
new Game.Achievement('Oblivion','Ascend with <b>1 billion</b> cookies baked.<q>Back to square one.</q>',[11,6]);
10105
new Game.Achievement('From scratch','Ascend with <b>1 trillion</b> cookies baked.<q>It\'s been fun.</q>',[11,6]);
10106
10107
order=11010;
10108
new Game.Achievement('Neverclick','Make <b>1 million</b> cookies by only having clicked <b>15 times</b>.',[12,0]);//Game.last.pool='shadow';
10109
order=1000;
10110
new Game.Achievement('Clicktastic','Make <b>1,000</b> cookies from clicking.',[11,0]);
10111
new Game.Achievement('Clickathlon','Make <b>100,000</b> cookies from clicking.',[11,1]);
10112
new Game.Achievement('Clickolympics','Make <b>10,000,000</b> cookies from clicking.',[11,2]);
10113
new Game.Achievement('Clickorama','Make <b>1,000,000,000</b> cookies from clicking.',[11,13]);
10114
10115
order=1050;
10116
new Game.Achievement('Click','Have <b>1</b> cursor.',[0,0]);
10117
new Game.Achievement('Double-click','Have <b>2</b> cursors.',[0,6]);
10118
new Game.Achievement('Mouse wheel','Have <b>50</b> cursors.',[1,6]);
10119
new Game.Achievement('Of Mice and Men','Have <b>100</b> cursors.',[0,1]);
10120
new Game.Achievement('The Digital','Have <b>200</b> cursors.',[0,2]);
10121
10122
order=1100;
10123
new Game.Achievement('Just wrong','Sell a grandma.<q>I thought you loved me.</q>',[10,9]);
10124
Game.TieredAchievement('Grandma\'s cookies','Have <b>1</b> grandma.','Grandma',1);
10125
Game.TieredAchievement('Sloppy kisses','Have <b>50</b> grandmas.','Grandma',2);
10126
Game.TieredAchievement('Retirement home','Have <b>100</b> grandmas.','Grandma',3);
10127
10128
order=1200;
10129
Game.TieredAchievement('My first farm','Have <b>1</b> farm.','Farm',1);
10130
Game.TieredAchievement('Reap what you sow','Have <b>50</b> farms.','Farm',2);
10131
Game.TieredAchievement('Farm ill','Have <b>100</b> farms.','Farm',3);
10132
10133
order=1400;
10134
Game.TieredAchievement('Production chain','Have <b>1</b> factory.','Factory',1);
10135
Game.TieredAchievement('Industrial revolution','Have <b>50</b> factories.','Factory',2);
10136
Game.TieredAchievement('Global warming','Have <b>100</b> factories.','Factory',3);
10137
10138
order=1300;
10139
Game.TieredAchievement('You know the drill','Have <b>1</b> mine.','Mine',1);
10140
Game.TieredAchievement('Excavation site','Have <b>50</b> mines.','Mine',2);
10141
Game.TieredAchievement('Hollow the planet','Have <b>100</b> mines.','Mine',3);
10142
10143
order=1500;
10144
Game.TieredAchievement('Expedition','Have <b>1</b> shipment.','Shipment',1);
10145
Game.TieredAchievement('Galactic highway','Have <b>50</b> shipments.','Shipment',2);
10146
Game.TieredAchievement('Far far away','Have <b>100</b> shipments.','Shipment',3);
10147
10148
order=1600;
10149
Game.TieredAchievement('Transmutation','Have <b>1</b> alchemy lab.','Alchemy lab',1);
10150
Game.TieredAchievement('Transmogrification','Have <b>50</b> alchemy labs.','Alchemy lab',2);
10151
Game.TieredAchievement('Gold member','Have <b>100</b> alchemy labs.','Alchemy lab',3);
10152
10153
order=1700;
10154
Game.TieredAchievement('A whole new world','Have <b>1</b> portal.','Portal',1);
10155
Game.TieredAchievement('Now you\'re thinking','Have <b>50</b> portals.','Portal',2);
10156
Game.TieredAchievement('Dimensional shift','Have <b>100</b> portals.','Portal',3);
10157
10158
order=1800;
10159
Game.TieredAchievement('Time warp','Have <b>1</b> time machine.','Time machine',1);
10160
Game.TieredAchievement('Alternate timeline','Have <b>50</b> time machines.','Time machine',2);
10161
Game.TieredAchievement('Rewriting history','Have <b>100</b> time machines.','Time machine',3);
10162
10163
10164
order=7000;
10165
new Game.Achievement('One with everything','Have <b>at least 1</b> of every building.',[2,7]);
10166
new Game.Achievement('Mathematician','Have at least <b>1 of the most expensive object, 2 of the second-most expensive, 4 of the next</b> and so on (capped at 128).',[23,12]);
10167
new Game.Achievement('Base 10','Have at least <b>10 of the most expensive object, 20 of the second-most expensive, 30 of the next</b> and so on.',[23,12]);
10168
10169
order=10000;
10170
new Game.Achievement('Golden cookie','Click a <b>golden cookie</b>.',[10,14]);
10171
new Game.Achievement('Lucky cookie','Click <b>7 golden cookies</b>.',[22,6]);
10172
new Game.Achievement('A stroke of luck','Click <b>27 golden cookies</b>.',[23,6]);
10173
10174
order=30200;
10175
new Game.Achievement('Cheated cookies taste awful','Hack in some cookies.',[10,6]);Game.last.pool='shadow';
10176
order=11010;
10177
new Game.Achievement('Uncanny clicker','Click really, really fast.<q>Well I\'ll be!</q>',[12,0]);
10178
10179
order=5000;
10180
new Game.Achievement('Builder','Own <b>100</b> buildings.',[2,6]);
10181
new Game.Achievement('Architect','Own <b>500</b> buildings.',[3,6]);
10182
order=6000;
10183
new Game.Achievement('Enhancer','Purchase <b>20</b> upgrades.',[9,0]);
10184
new Game.Achievement('Augmenter','Purchase <b>50</b> upgrades.',[9,1]);
10185
10186
order=11000;
10187
new Game.Achievement('Cookie-dunker','Dunk the cookie.<q>You did it!</q>',[1,8]);
10188
10189
order=10000;
10190
new Game.Achievement('Fortune','Click <b>77 golden cookies</b>.<q>You should really go to bed.</q>',[24,6]);
10191
order=31000;
10192
new Game.Achievement('True Neverclick','Make <b>1 million</b> cookies with <b>no</b> cookie clicks.<q>This kinda defeats the whole purpose, doesn\'t it?</q>',[12,0]);Game.last.pool='shadow';
10193
10194
order=20000;
10195
new Game.Achievement('Elder nap','Appease the grandmatriarchs at least <b>once</b>.<q>we<br>are<br>eternal</q>',[8,9]);
10196
new Game.Achievement('Elder slumber','Appease the grandmatriarchs at least <b>5 times</b>.<q>our mind<br>outlives<br>the universe</q>',[8,9]);
10197
10198
order=1150;
10199
new Game.Achievement('Elder','Own at least <b>7</b> grandma types.',[10,9]);
10200
10201
order=20000;
10202
new Game.Achievement('Elder calm','Declare a covenant with the grandmatriarchs.<q>we<br>have<br>fed</q>',[8,9]);
10203
10204
order=5000;
10205
new Game.Achievement('Engineer','Own <b>1000</b> buildings.',[4,6]);
10206
10207
order=10000;
10208
new Game.Achievement('Leprechaun','Click <b>777 golden cookies</b>.',[25,6]);
10209
new Game.Achievement('Black cat\'s paw','Click <b>7777 golden cookies</b>.',[26,6]);
10210
10211
order=30050;
10212
new Game.Achievement('Nihilism','Ascend with <b>1 quadrillion</b> cookies baked.<q>There are many things<br>that need to be erased</q>',[11,7]);
10213
10214
order=1900;
10215
Game.TieredAchievement('Antibatter','Have <b>1</b> antimatter condenser.','Antimatter condenser',1);
10216
Game.TieredAchievement('Quirky quarks','Have <b>50</b> antimatter condensers.','Antimatter condenser',2);
10217
Game.TieredAchievement('It does matter!','Have <b>100</b> antimatter condensers.','Antimatter condenser',3);
10218
10219
order=6000;
10220
new Game.Achievement('Upgrader','Purchase <b>100</b> upgrades.',[9,2]);
10221
10222
order=7000;
10223
new Game.Achievement('Centennial','Have at least <b>100 of everything</b>.',[6,6]);
10224
10225
order=30500;
10226
new Game.Achievement('Hardcore','Get to <b>1 billion</b> cookies baked with <b>no upgrades purchased</b>.',[12,6]);//Game.last.pool='shadow';
10227
10228
order=30600;
10229
new Game.Achievement('Speed baking I','Get to <b>1 million</b> cookies baked in <b>35 minutes</b>.',[12,5]);Game.last.pool='shadow';
10230
new Game.Achievement('Speed baking II','Get to <b>1 million</b> cookies baked in <b>25 minutes</b>.',[13,5]);Game.last.pool='shadow';
10231
new Game.Achievement('Speed baking III','Get to <b>1 million</b> cookies baked in <b>15 minutes</b>.',[14,5]);Game.last.pool='shadow';
10232
10233
10234
order=61000;
10235
var achiev=new Game.Achievement('Getting even with the oven','Defeat the <b>Sentient Furnace</b> in the factory dungeons.',[12,7]);Game.last.pool='dungeon';
10236
var achiev=new Game.Achievement('Now this is pod-smashing','Defeat the <b>Ascended Baking Pod</b> in the factory dungeons.',[12,7]);Game.last.pool='dungeon';
10237
var achiev=new Game.Achievement('Chirped out','Find and defeat <b>Chirpy</b>, the dysfunctionning alarm bot.',[13,7]);Game.last.pool='dungeon';
10238
var achiev=new Game.Achievement('Follow the white rabbit','Find and defeat the elusive <b>sugar bunny</b>.',[14,7]);Game.last.pool='dungeon';
10239
10240
order=1000;
10241
new Game.Achievement('Clickasmic','Make <b>100,000,000,000</b> cookies from clicking.',[11,14]);
10242
10243
order=1100;
10244
Game.TieredAchievement('Friend of the ancients','Have <b>150</b> grandmas.','Grandma',4);
10245
Game.TieredAchievement('Ruler of the ancients','Have <b>200</b> grandmas.','Grandma',5);
10246
10247
order=32000;
10248
new Game.Achievement('Wholesome','Unlock <b>100%</b> of your heavenly chips power.',[15,7]);
10249
10250
order=33000;
10251
new Game.Achievement('Just plain lucky','You have <b>1 chance in 500,000</b> every second of earning this achievement.',[15,6]);Game.last.pool='shadow';
10252
10253
order=21000;
10254
new Game.Achievement('Itchscratcher','Burst <b>1 wrinkler</b>.',[19,8]);
10255
new Game.Achievement('Wrinklesquisher','Burst <b>50 wrinklers</b>.',[19,8]);
10256
new Game.Achievement('Moistburster','Burst <b>200 wrinklers</b>.',[19,8]);
10257
10258
order=22000;
10259
new Game.Achievement('Spooky cookies','Unlock <b>every Halloween-themed cookie</b>.<div class="line"></div>Owning this achievement makes Halloween-themed cookies drop more frequently in future playthroughs.',[12,8]);
10260
10261
order=22100;
10262
new Game.Achievement('Coming to town','Reach <b>Santa\'s 7th form</b>.',[18,9]);
10263
new Game.Achievement('All hail Santa','Reach <b>Santa\'s final form</b>.',[19,10]);
10264
new Game.Achievement('Let it snow','Unlock <b>every Christmas-themed cookie</b>.<div class="line"></div>Owning this achievement makes Christmas-themed cookies drop more frequently in future playthroughs.',[19,9]);
10265
new Game.Achievement('Oh deer','Pop <b>1 reindeer</b>.',[12,9]);
10266
new Game.Achievement('Sleigh of hand','Pop <b>50 reindeer</b>.',[12,9]);
10267
new Game.Achievement('Reindeer sleigher','Pop <b>200 reindeer</b>.',[12,9]);
10268
10269
order=1200;
10270
Game.TieredAchievement('Perfected agriculture','Have <b>150</b> farms.','Farm',4);
10271
order=1400;
10272
Game.TieredAchievement('Ultimate automation','Have <b>150</b> factories.','Factory',4);
10273
order=1300;
10274
Game.TieredAchievement('Can you dig it','Have <b>150</b> mines.','Mine',4);
10275
order=1500;
10276
Game.TieredAchievement('Type II civilization','Have <b>150</b> shipments.','Shipment',4);
10277
order=1600;
10278
Game.TieredAchievement('Gild wars','Have <b>150</b> alchemy labs.','Alchemy lab',4);
10279
order=1700;
10280
Game.TieredAchievement('Brain-split','Have <b>150</b> portals.','Portal',4);
10281
order=1800;
10282
Game.TieredAchievement('Time duke','Have <b>150</b> time machines.','Time machine',4);
10283
order=1900;
10284
Game.TieredAchievement('Molecular maestro','Have <b>150</b> antimatter condensers.','Antimatter condenser',4);
10285
10286
order=2000;
10287
Game.TieredAchievement('Lone photon','Have <b>1</b> prism.','Prism',1);
10288
Game.TieredAchievement('Dazzling glimmer','Have <b>50</b> prisms.','Prism',2);
10289
Game.TieredAchievement('Blinding flash','Have <b>100</b> prisms.','Prism',3);
10290
Game.TieredAchievement('Unending glow','Have <b>150</b> prisms.','Prism',4);
10291
10292
order=5000;
10293
new Game.Achievement('Lord of Constructs','Own <b>2000</b> buildings.<q>He saw the vast plains stretching ahead of him, and he said : let there be civilization.</q>',[5,6]);
10294
order=6000;
10295
new Game.Achievement('Lord of Progress','Purchase <b>200</b> upgrades.<q>One can always do better. But should you?</q>',[9,14]);
10296
order=7002;
10297
new Game.Achievement('Bicentennial','Have at least <b>200 of everything</b>.<q>You crazy person.</q>',[8,6]);
10298
10299
order=22300;
10300
new Game.Achievement('Lovely cookies','Unlock <b>every Valentine-themed cookie</b>.',[20,3]);
10301
10302
order=7001;
10303
new Game.Achievement('Centennial and a half','Have at least <b>150 of everything</b>.',[7,6]);
10304
10305
order=11000;
10306
new Game.Achievement('Tiny cookie','Click the tiny cookie.<q>These aren\'t the cookies<br>you\'re clicking for.</q>',[0,5]);
10307
10308
order=400000;
10309
new Game.Achievement('You win a cookie','This is for baking 10 trillion cookies and making it on the local news.<q>We\'re all so proud of you.</q>',[10,0]);
10310
10311
order=1070;
10312
Game.ProductionAchievement('Click delegator','Cursor',1,0,7);
10313
order=1120;
10314
Game.ProductionAchievement('Gushing grannies','Grandma',1,0,6);
10315
order=1220;
10316
Game.ProductionAchievement('I hate manure','Farm',1);
10317
order=1320;
10318
Game.ProductionAchievement('Never dig down','Mine',1);
10319
order=1420;
10320
Game.ProductionAchievement('The incredible machine','Factory',1);
10321
order=1520;
10322
Game.ProductionAchievement('And beyond','Shipment',1);
10323
order=1620;
10324
Game.ProductionAchievement('Magnum Opus','Alchemy lab',1);
10325
order=1720;
10326
Game.ProductionAchievement('With strange eons','Portal',1);
10327
order=1820;
10328
Game.ProductionAchievement('Spacetime jigamaroo','Time machine',1);
10329
order=1920;
10330
Game.ProductionAchievement('Supermassive','Antimatter condenser',1);
10331
order=2020;
10332
Game.ProductionAchievement('Praise the sun','Prism',1);
10333
10334
10335
order=1000;
10336
new Game.Achievement('Clickageddon','Make <b>10,000,000,000,000</b> cookies from clicking.',[11,15]);
10337
new Game.Achievement('Clicknarok','Make <b>1,000,000,000,000,000</b> cookies from clicking.',[11,16]);
10338
10339
order=1050;
10340
new Game.Achievement('Extreme polydactyly','Have <b>300</b> cursors.',[0,13]);
10341
new Game.Achievement('Dr. T','Have <b>400</b> cursors.',[0,14]);
10342
10343
order=1100;Game.TieredAchievement('The old never bothered me anyway','Have <b>250</b> grandmas.','Grandma',6);
10344
order=1200;Game.TieredAchievement('Homegrown','Have <b>200</b> farms.','Farm',5);
10345
order=1400;Game.TieredAchievement('Technocracy','Have <b>200</b> factories.','Factory',5);
10346
order=1300;Game.TieredAchievement('The center of the Earth','Have <b>200</b> mines.','Mine',5);
10347
order=1500;Game.TieredAchievement('We come in peace','Have <b>200</b> shipments.','Shipment',5);
10348
order=1600;Game.TieredAchievement('The secrets of the universe','Have <b>200</b> alchemy labs.','Alchemy lab',5);
10349
order=1700;Game.TieredAchievement('Realm of the Mad God','Have <b>200</b> portals.','Portal',5);
10350
order=1800;Game.TieredAchievement('Forever and ever','Have <b>200</b> time machines.','Time machine',5);
10351
order=1900;Game.TieredAchievement('Walk the planck','Have <b>200</b> antimatter condensers.','Antimatter condenser',5);
10352
order=2000;Game.TieredAchievement('Rise and shine','Have <b>200</b> prisms.','Prism',5);
10353
10354
order=30200;
10355
new Game.Achievement('God complex','Name yourself <b>Orteil</b>.<div class="warning">Note : usurpers incur a -1% CpS penalty until they rename themselves something else.</div><q>But that\'s not you, is it?</q>',[17,5]);Game.last.pool='shadow';
10356
new Game.Achievement('Third-party','Use an <b>add-on</b>.<q>Some find vanilla to be the most boring flavor.</q>',[16,5]);Game.last.pool='shadow';//if you're making a mod, add a Game.Win('Third-party') somewhere in there!
10357
10358
order=30050;
10359
new Game.Achievement('Dematerialize','Ascend with <b>1 quintillion</b> cookies baked.<q>Presto!<br>...where\'d the cookies go?</q>',[11,7]);
10360
new Game.Achievement('Nil zero zilch','Ascend with <b>1 sextillion</b> cookies baked.<q>To summarize : really not very much at all.</q>',[11,7]);
10361
new Game.Achievement('Transcendence','Ascend with <b>1 septillion</b> cookies baked.<q>Your cookies are now on a higher plane of being.</q>',[11,8]);
10362
new Game.Achievement('Obliterate','Ascend with <b>1 octillion</b> cookies baked.<q>Resistance is futile, albeit entertaining.</q>',[11,8]);
10363
new Game.Achievement('Negative void','Ascend with <b>1 nonillion</b> cookies baked.<q>You now have so few cookies that it\'s almost like you have a negative amount of them.</q>',[11,8]);
10364
10365
order=22400;
10366
new Game.Achievement('The hunt is on','Unlock <b>1 egg</b>.',[1,12]);
10367
new Game.Achievement('Egging on','Unlock <b>7 eggs</b>.',[4,12]);
10368
new Game.Achievement('Mass Easteria','Unlock <b>14 eggs</b>.',[7,12]);
10369
new Game.Achievement('Hide & seek champion','Unlock <b>all the eggs</b>.<div class="line"></div>Owning this achievement makes eggs drop more frequently in future playthroughs.',[13,12]);
10370
10371
order=11000;
10372
new Game.Achievement('What\'s in a name','Give your bakery a name.',[15,9]);
10373
10374
10375
order=1425;
10376
Game.TieredAchievement('Pretty penny','Have <b>1</b> bank.','Bank',1);
10377
Game.TieredAchievement('Fit the bill','Have <b>50</b> banks.','Bank',2);
10378
Game.TieredAchievement('A loan in the dark','Have <b>100</b> banks.','Bank',3);
10379
Game.TieredAchievement('Need for greed','Have <b>150</b> banks.','Bank',4);
10380
Game.TieredAchievement('It\'s the economy, stupid','Have <b>200</b> banks.','Bank',5);
10381
order=1450;
10382
Game.TieredAchievement('Your time to shrine','Have <b>1</b> temple.','Temple',1);
10383
Game.TieredAchievement('Shady sect','Have <b>50</b> temples.','Temple',2);
10384
Game.TieredAchievement('New-age cult','Have <b>100</b> temples.','Temple',3);
10385
Game.TieredAchievement('Organized religion','Have <b>150</b> temples.','Temple',4);
10386
Game.TieredAchievement('Fanaticism','Have <b>200</b> temples.','Temple',5);
10387
order=1475;
10388
Game.TieredAchievement('Bewitched','Have <b>1</b> wizard tower.','Wizard tower',1);
10389
Game.TieredAchievement('The sorcerer\'s apprentice','Have <b>50</b> wizard towers.','Wizard tower',2);
10390
Game.TieredAchievement('Charms and enchantments','Have <b>100</b> wizard towers.','Wizard tower',3);
10391
Game.TieredAchievement('Curses and maledictions','Have <b>150</b> wizard towers.','Wizard tower',4);
10392
Game.TieredAchievement('Magic kingdom','Have <b>200</b> wizard towers.','Wizard tower',5);
10393
10394
order=1445;
10395
Game.ProductionAchievement('Vested interest','Bank',1);
10396
order=1470;
10397
Game.ProductionAchievement('New world order','Temple',1);
10398
order=1495;
10399
Game.ProductionAchievement('Hocus pocus','Wizard tower',1);
10400
10401
10402
10403
order=1070;
10404
Game.ProductionAchievement('Finger clickin\' good','Cursor',2,0,7);
10405
order=1120;
10406
Game.ProductionAchievement('Panic at the bingo','Grandma',2,0,6);
10407
order=1220;
10408
Game.ProductionAchievement('Rake in the dough','Farm',2);
10409
order=1320;
10410
Game.ProductionAchievement('Quarry on','Mine',2);
10411
order=1420;
10412
Game.ProductionAchievement('Yes I love technology','Factory',2);
10413
order=1445;
10414
Game.ProductionAchievement('Paid in full','Bank',2);
10415
order=1470;
10416
Game.ProductionAchievement('Church of Cookiology','Temple',2);
10417
order=1495;
10418
Game.ProductionAchievement('Too many rabbits, not enough hats','Wizard tower',2);
10419
order=1520;
10420
Game.ProductionAchievement('The most precious cargo','Shipment',2);
10421
order=1620;
10422
Game.ProductionAchievement('The Aureate','Alchemy lab',2);
10423
order=1720;
10424
Game.ProductionAchievement('Ever more hideous','Portal',2);
10425
order=1820;
10426
Game.ProductionAchievement('Be kind, rewind','Time machine',2);
10427
order=1920;
10428
Game.ProductionAchievement('Infinitesimal','Antimatter condenser',2);
10429
order=2020;
10430
Game.ProductionAchievement('A still more glorious dawn','Prism',2);
10431
10432
order=30000;
10433
new Game.Achievement('Rebirth','Ascend at least once.',[21,6]);
10434
10435
order=11000;
10436
new Game.Achievement('Here you go','Click this achievement\'s slot.<q>All you had to do was ask.</q>',[1,7]);Game.last.clickFunction=function(){if (!Game.HasAchiev('Here you go')){PlaySound('snd/tick.mp3');Game.Win('Here you go');}};
10437
10438
order=30000;
10439
new Game.Achievement('Resurrection','Ascend <b>10 times</b>.',[21,6]);
10440
new Game.Achievement('Reincarnation','Ascend <b>100 times</b>.',[21,6]);
10441
new Game.Achievement('Endless cycle','Ascend <b>1000 times</b>.<q>Oh hey, it\'s you again.</q>',[2,7]);Game.last.pool='shadow';
10442
10443
10444
10445
order=1100;
10446
Game.TieredAchievement('The agemaster','Have <b>300</b> grandmas.','Grandma',7);
10447
Game.TieredAchievement('To oldly go','Have <b>350</b> grandmas.','Grandma',8);
10448
10449
order=1200;Game.TieredAchievement('Gardener extraordinaire','Have <b>250</b> farms.','Farm',6);
10450
order=1300;Game.TieredAchievement('Tectonic ambassador','Have <b>250</b> mines.','Mine',6);
10451
order=1400;Game.TieredAchievement('Rise of the machines','Have <b>250</b> factories.','Factory',6);
10452
order=1425;Game.TieredAchievement('Acquire currency','Have <b>250</b> banks.','Bank',6);
10453
order=1450;Game.TieredAchievement('Zealotry','Have <b>250</b> temples.','Temple',6);
10454
order=1475;Game.TieredAchievement('The wizarding world','Have <b>250</b> wizard towers.','Wizard tower',6);
10455
order=1500;Game.TieredAchievement('Parsec-masher','Have <b>250</b> shipments.','Shipment',6);
10456
order=1600;Game.TieredAchievement('The work of a lifetime','Have <b>250</b> alchemy labs.','Alchemy lab',6);
10457
order=1700;Game.TieredAchievement('A place lost in time','Have <b>250</b> portals.','Portal',6);
10458
order=1800;Game.TieredAchievement('Heat death','Have <b>250</b> time machines.','Time machine',6);
10459
order=1900;Game.TieredAchievement('Microcosm','Have <b>250</b> antimatter condensers.','Antimatter condenser',6);
10460
order=2000;Game.TieredAchievement('Bright future','Have <b>250</b> prisms.','Prism',6);
10461
10462
order=25000;
10463
new Game.Achievement('Here be dragon','Complete your <b>dragon\'s training</b>.',[21,12]);
10464
10465
Game.BankAchievement('How?');
10466
Game.BankAchievement('The land of milk and cookies');
10467
Game.BankAchievement('He who controls the cookies controls the universe');Game.last.baseDesc+='<q>The milk must flow!</q>';Game.last.desc=BeautifyInText(Game.last.baseDesc);
10468
Game.BankAchievement('Tonight on Hoarders');
10469
Game.BankAchievement('Are you gonna eat all that?');
10470
Game.BankAchievement('We\'re gonna need a bigger bakery');
10471
Game.BankAchievement('In the mouth of madness');Game.last.baseDesc+='<q>A cookie is just what we tell each other it is.</q>';Game.last.desc=BeautifyInText(Game.last.baseDesc);
10472
Game.BankAchievement('Brought to you by the letter <div style="display:inline-block;background:url(img/money.png);width:16px;height:16px;"></div>');
10473
10474
10475
Game.CpsAchievement('A world filled with cookies');
10476
Game.CpsAchievement('When this baby hits '+Beautify(10000000000000*60*60)+' cookies per hour');
10477
Game.CpsAchievement('Fast and delicious');
10478
Game.CpsAchievement('Cookiehertz : a really, really tasty hertz');Game.last.baseDesc+='<q>Tastier than a hertz donut, anyway.</q>';Game.last.desc=BeautifyInText(Game.last.baseDesc);
10479
Game.CpsAchievement('Woops, you solved world hunger');
10480
Game.CpsAchievement('Turbopuns');Game.last.baseDesc+='<q>Mother Nature will be like "slowwwww dowwwwwn".</q>';Game.last.desc=BeautifyInText(Game.last.baseDesc);
10481
Game.CpsAchievement('Faster menner');
10482
Game.CpsAchievement('And yet you\'re still hungry');
10483
Game.CpsAchievement('The Abakening');
10484
Game.CpsAchievement('There\'s really no hard limit to how long these achievement names can be and to be quite honest I\'m rather curious to see how far we can go.<br>Adolphus W. Green (1844–1917) started as the Principal of the Groton School in 1864. By 1865, he became second assistant librarian at the New York Mercantile Library; from 1867 to 1869, he was promoted to full librarian. From 1869 to 1873, he worked for Evarts, Southmayd & Choate, a law firm co-founded by William M. Evarts, Charles Ferdinand Southmayd and Joseph Hodges Choate. He was admitted to the New York State Bar Association in 1873.<br>Anyway, how\'s your day been?');//Game.last.shortName='There\'s really no hard limit to how long these achievement names can be and to be quite honest I\'m [...]';
10485
Game.CpsAchievement('Fast');Game.last.baseDesc+='<q>Wow!</q>';Game.last.desc=BeautifyInText(Game.last.baseDesc);
10486
10487
order=7002;
10488
new Game.Achievement('Bicentennial and a half','Have at least <b>250 of everything</b>.<q>Keep on truckin\'.</q>',[9,6]);
10489
10490
order=11000;
10491
new Game.Achievement('Tabloid addiction','Click on the news ticker <b>50 times</b>.<q>Page 6 : Mad individual clicks on picture of pastry in a futile attempt to escape boredom!<br>Also page 6 : British parliament ate my baby!</q>',[27,7]);
10492
10493
order=1000;
10494
new Game.Achievement('Clickastrophe','Make <b>100,000,000,000,000,000</b> cookies from clicking.',[11,17]);
10495
new Game.Achievement('Clickataclysm','Make <b>10,000,000,000,000,000,000</b> cookies from clicking.',[11,18]);
10496
10497
order=1050;
10498
new Game.Achievement('Thumbs, phalanges, metacarpals','Have <b>500</b> cursors.<q>& KNUCKLES</q>',[0,15]);
10499
10500
order=6000;
10501
new Game.Achievement('Polymath','Own <b>300</b> upgrades and <b>3000</b> buildings.<q>Excellence doesn\'t happen overnight - it usually takes a good couple days.</q>',[29,7]);
10502
10503
order=6005;
10504
new Game.Achievement('The elder scrolls','Own a combined <b>777</b> grandmas and cursors.<q>Let me guess. Someone stole your cookie.</q>',[10,9]);
10505
10506
order=30050;
10507
new Game.Achievement('To crumbs, you say?','Ascend with <b>1 decillion</b> cookies baked.<q>Very well then.</q>',[29,6]);
10508
10509
order=1200;Game.TieredAchievement('Seedy business','Have <b>300</b> farms.','Farm',7);
10510
order=1300;Game.TieredAchievement('Freak fracking','Have <b>300</b> mines.','Mine',7);
10511
order=1400;Game.TieredAchievement('Modern times','Have <b>300</b> factories.','Factory',7);
10512
order=1425;Game.TieredAchievement('The nerve of war','Have <b>300</b> banks.','Bank',7);
10513
order=1450;Game.TieredAchievement('Wololo','Have <b>300</b> temples.','Temple',7);
10514
order=1475;Game.TieredAchievement('And now for my next trick, I\'ll need a volunteer from the audience','Have <b>300</b> wizard towers.','Wizard tower',7);
10515
order=1500;Game.TieredAchievement('It\'s not delivery','Have <b>300</b> shipments.','Shipment',7);
10516
order=1600;Game.TieredAchievement('Gold, Jerry! Gold!','Have <b>300</b> alchemy labs.','Alchemy lab',7);
10517
order=1700;Game.TieredAchievement('Forbidden zone','Have <b>300</b> portals.','Portal',7);
10518
order=1800;Game.TieredAchievement('cookie clicker forever and forever a hundred years cookie clicker, all day long forever, forever a hundred times, over and over cookie clicker adventures dot com','Have <b>300</b> time machines.','Time machine',7);
10519
order=1900;Game.TieredAchievement('Scientists baffled everywhere','Have <b>300</b> antimatter condensers.','Antimatter condenser',7);
10520
order=2000;Game.TieredAchievement('Harmony of the spheres','Have <b>300</b> prisms.','Prism',7);
10521
10522
order=35000;
10523
new Game.Achievement('Last Chance to See','Burst the near-extinct <b>shiny wrinkler</b>.<q>You monster!</q>',[24,12]);Game.last.pool='shadow';
10524
10525
order=10000;
10526
new Game.Achievement('Early bird','Click a golden cookie <b>less than 1 second after it spawns</b>.',[10,14]);
10527
new Game.Achievement('Fading luck','Click a golden cookie <b>less than 1 second before it dies</b>.',[10,14]);
10528
10529
order=22100;
10530
new Game.Achievement('Eldeer','Pop a reindeer <b>during an elder frenzy</b>.',[12,9]);
10531
10532
order=21100;
10533
new Game.Achievement('Dude, sweet','Harvest <b>7 coalescing sugar lumps</b>.',[24,14]);
10534
new Game.Achievement('Sugar rush','Harvest <b>30 coalescing sugar lumps</b>.',[26,14]);
10535
new Game.Achievement('Year\'s worth of cavities','Harvest <b>365 coalescing sugar lumps</b>.<q>My lumps my lumps my lumps.</q>',[29,14]);
10536
new Game.Achievement('Hand-picked','Successfully harvest a coalescing sugar lump before it\'s ripe.',[28,14]);
10537
new Game.Achievement('Sugar sugar','Harvest a <b>bifurcated sugar lump</b>.',[29,15]);
10538
new Game.Achievement('All-natural cane sugar','Harvest a <b>golden sugar lump</b>.',[29,16]);Game.last.pool='shadow';
10539
new Game.Achievement('Sweetmeats','Harvest a <b>meaty sugar lump</b>.',[29,17]);
10540
10541
order=7002;
10542
new Game.Achievement('Tricentennial','Have at least <b>300 of everything</b>.<q>Can\'t stop, won\'t stop. Probably should stop, though.</q>',[29,12]);
10543
10544
Game.CpsAchievement('Knead for speed');Game.last.baseDesc+='<q>How did we not make that one yet?</q>';Game.last.desc=BeautifyInText(Game.last.baseDesc);
10545
Game.CpsAchievement('Well the cookies start coming and they don\'t stop coming');Game.last.baseDesc+='<q>Didn\'t make sense not to click for fun.</q>';Game.last.desc=BeautifyInText(Game.last.baseDesc);
10546
Game.CpsAchievement('I don\'t know if you\'ve noticed but all these icons are very slightly off-center');
10547
Game.CpsAchievement('The proof of the cookie is in the baking');Game.last.baseDesc+='<q>How can you have any cookies if you don\'t bake your dough?</q>';Game.last.desc=BeautifyInText(Game.last.baseDesc);
10548
Game.CpsAchievement('If it\'s worth doing, it\'s worth overdoing');
10549
10550
Game.BankAchievement('The dreams in which I\'m baking are the best I\'ve ever had');
10551
Game.BankAchievement('Set for life');
10552
10553
order=1200;Game.TieredAchievement('You and the beanstalk','Have <b>350</b> farms.','Farm',8);
10554
order=1300;Game.TieredAchievement('Romancing the stone','Have <b>350</b> mines.','Mine',8);
10555
order=1400;Game.TieredAchievement('Ex machina','Have <b>350</b> factories.','Factory',8);
10556
order=1425;Game.TieredAchievement('And I need it now','Have <b>350</b> banks.','Bank',8);
10557
order=1450;Game.TieredAchievement('Pray on the weak','Have <b>350</b> temples.','Temple',8);
10558
order=1475;Game.TieredAchievement('It\'s a kind of magic','Have <b>350</b> wizard towers.','Wizard tower',8);
10559
order=1500;Game.TieredAchievement('Make it so','Have <b>350</b> shipments.','Shipment',8);
10560
order=1600;Game.TieredAchievement('All that glitters is gold','Have <b>350</b> alchemy labs.','Alchemy lab',8);
10561
order=1700;Game.TieredAchievement('H̸̷͓̳̳̯̟͕̟͍͍̣͡ḛ̢̦̰̺̮̝͖͖̘̪͉͘͡ ̠̦͕̤̪̝̥̰̠̫̖̣͙̬͘ͅC̨̦̺̩̲̥͉̭͚̜̻̝̣̼͙̮̯̪o̴̡͇̘͎̞̲͇̦̲͞͡m̸̩̺̝̣̹̱͚̬̥̫̳̼̞̘̯͘ͅẹ͇̺̜́̕͢s̶̙̟̱̥̮̯̰̦͓͇͖͖̝͘͘͞','Have <b>350</b> portals.','Portal',8);
10562
order=1800;Game.TieredAchievement('Way back then','Have <b>350</b> time machines.','Time machine',8);
10563
order=1900;Game.TieredAchievement('Exotic matter','Have <b>350</b> antimatter condensers.','Antimatter condenser',8);
10564
order=2000;Game.TieredAchievement('At the end of the tunnel','Have <b>350</b> prisms.','Prism',8);
10565
10566
10567
10568
order=1070;
10569
Game.ProductionAchievement('Click (starring Adam Sandler)','Cursor',3,0,7);
10570
order=1120;
10571
Game.ProductionAchievement('Frantiquities','Grandma',3,0,6);
10572
order=1220;
10573
Game.ProductionAchievement('Overgrowth','Farm',3);
10574
order=1320;
10575
Game.ProductionAchievement('Sedimentalism','Mine',3);
10576
order=1420;
10577
Game.ProductionAchievement('Labor of love','Factory',3);
10578
order=1445;
10579
Game.ProductionAchievement('Reverse funnel system','Bank',3);
10580
order=1470;
10581
Game.ProductionAchievement('Thus spoke you','Temple',3);
10582
order=1495;
10583
Game.ProductionAchievement('Manafest destiny','Wizard tower',3);
10584
order=1520;
10585
Game.ProductionAchievement('Neither snow nor rain nor heat nor gloom of night','Shipment',3);
10586
order=1620;
10587
Game.ProductionAchievement('I\'ve got the Midas touch','Alchemy lab',3);
10588
order=1720;
10589
Game.ProductionAchievement('Which eternal lie','Portal',3);
10590
order=1820;
10591
Game.ProductionAchievement('D&eacute;j&agrave; vu','Time machine',3);
10592
order=1920;
10593
Game.ProductionAchievement('Powers of Ten','Antimatter condenser',3);
10594
order=2020;
10595
Game.ProductionAchievement('Now the dark days are gone','Prism',3);
10596
10597
order=1070;
10598
new Game.Achievement('Freaky jazz hands','Reach level <b>10</b> cursors.',[0,26]);Game.Objects['Cursor'].levelAchiev10=Game.last;
10599
order=1120;
10600
new Game.Achievement('Methuselah','Reach level <b>10</b> grandmas.',[1,26]);Game.Objects['Grandma'].levelAchiev10=Game.last;
10601
order=1220;
10602
new Game.Achievement('Huge tracts of land','Reach level <b>10</b> farms.',[2,26]);Game.Objects['Farm'].levelAchiev10=Game.last;
10603
order=1320;
10604
new Game.Achievement('D-d-d-d-deeper','Reach level <b>10</b> mines.',[3,26]);Game.Objects['Mine'].levelAchiev10=Game.last;
10605
order=1420;
10606
new Game.Achievement('Patently genius','Reach level <b>10</b> factories.',[4,26]);Game.Objects['Factory'].levelAchiev10=Game.last;
10607
order=1445;
10608
new Game.Achievement('A capital idea','Reach level <b>10</b> banks.',[15,26]);Game.Objects['Bank'].levelAchiev10=Game.last;
10609
order=1470;
10610
new Game.Achievement('It belongs in a bakery','Reach level <b>10</b> temples.',[16,26]);Game.Objects['Temple'].levelAchiev10=Game.last;
10611
order=1495;
10612
new Game.Achievement('Motormouth','Reach level <b>10</b> wizard towers.',[17,26]);Game.Objects['Wizard tower'].levelAchiev10=Game.last;
10613
order=1520;
10614
new Game.Achievement('Been there done that','Reach level <b>10</b> shipments.',[5,26]);Game.Objects['Shipment'].levelAchiev10=Game.last;
10615
order=1620;
10616
new Game.Achievement('Phlogisticated substances','Reach level <b>10</b> alchemy labs.',[6,26]);Game.Objects['Alchemy lab'].levelAchiev10=Game.last;
10617
order=1720;
10618
new Game.Achievement('Bizarro world','Reach level <b>10</b> portals.',[7,26]);Game.Objects['Portal'].levelAchiev10=Game.last;
10619
order=1820;
10620
new Game.Achievement('The long now','Reach level <b>10</b> time machines.',[8,26]);Game.Objects['Time machine'].levelAchiev10=Game.last;
10621
order=1920;
10622
new Game.Achievement('Chubby hadrons','Reach level <b>10</b> antimatter condensers.',[13,26]);Game.Objects['Antimatter condenser'].levelAchiev10=Game.last;
10623
order=2020;
10624
new Game.Achievement('Palettable','Reach level <b>10</b> prisms.',[14,26]);Game.Objects['Prism'].levelAchiev10=Game.last;
10625
10626
order=61470;
10627
order=61495;
10628
new Game.Achievement('Bibbidi-bobbidi-boo','Cast <b>9</b> spells.',[21,11]);
10629
new Game.Achievement('I\'m the wiz','Cast <b>99</b> spells.',[22,11]);
10630
new Game.Achievement('A wizard is you','Cast <b>999</b> spells.<q>I\'m a what?</q>',[29,11]);
10631
10632
order=10000;
10633
new Game.Achievement('Four-leaf cookie','Have <b>4</b> golden cookies simultaneously.<q>Fairly rare, considering cookies don\'t even have leaves.</q>',[27,6]);Game.last.pool='shadow';
10634
10635
order=2100;
10636
Game.TieredAchievement('Lucked out','Have <b>1</b> chancemaker.','Chancemaker',1);
10637
Game.TieredAchievement('What are the odds','Have <b>50</b> chancemakers.','Chancemaker',2);
10638
Game.TieredAchievement('Grandma needs a new pair of shoes','Have <b>100</b> chancemakers.','Chancemaker',3);
10639
Game.TieredAchievement('Million to one shot, doc','Have <b>150</b> chancemakers.','Chancemaker',4);
10640
Game.TieredAchievement('As luck would have it','Have <b>200</b> chancemakers.','Chancemaker',5);
10641
Game.TieredAchievement('Ever in your favor','Have <b>250</b> chancemakers.','Chancemaker',6);
10642
Game.TieredAchievement('Be a lady','Have <b>300</b> chancemakers.','Chancemaker',7);
10643
Game.TieredAchievement('Dicey business','Have <b>350</b> chancemakers.','Chancemaker',8);
10644
10645
order=2120;
10646
Game.ProductionAchievement('Fingers crossed','Chancemaker',1);
10647
Game.ProductionAchievement('Just a statistic','Chancemaker',2);
10648
Game.ProductionAchievement('Murphy\'s wild guess','Chancemaker',3);
10649
10650
new Game.Achievement('Let\'s leaf it at that','Reach level <b>10</b> chancemakers.',[19,26]);Game.Objects['Chancemaker'].levelAchiev10=Game.last;
10651
10652
order=1000;
10653
new Game.Achievement('The ultimate clickdown','Make <b>1,000,000,000,000,000,000,000</b> cookies from clicking.<q>(of ultimate destiny.)</q>',[11,19]);
10654
10655
10656
order=1100;
10657
Game.TieredAchievement('Aged well','Have <b>400</b> grandmas.','Grandma',9);
10658
Game.TieredAchievement('101st birthday','Have <b>450</b> grandmas.','Grandma',10);
10659
Game.TieredAchievement('Defense of the ancients','Have <b>500</b> grandmas.','Grandma',11);
10660
order=1200;Game.TieredAchievement('Harvest moon','Have <b>400</b> farms.','Farm',9);
10661
order=1300;Game.TieredAchievement('Mine?','Have <b>400</b> mines.','Mine',9);
10662
order=1400;Game.TieredAchievement('In full gear','Have <b>400</b> factories.','Factory',9);
10663
order=1425;Game.TieredAchievement('Treacle tart economics','Have <b>400</b> banks.','Bank',9);
10664
order=1450;Game.TieredAchievement('Holy cookies, grandma!','Have <b>400</b> temples.','Temple',9);
10665
order=1475;Game.TieredAchievement('The Prestige','Have <b>400</b> wizard towers.<q>(Unrelated to the Cookie Clicker feature of the same name.)</q>','Wizard tower',9);
10666
order=1500;Game.TieredAchievement('That\'s just peanuts to space','Have <b>400</b> shipments.','Shipment',9);
10667
order=1600;Game.TieredAchievement('Worth its weight in lead','Have <b>400</b> alchemy labs.','Alchemy lab',9);
10668
order=1700;Game.TieredAchievement('What happens in the vortex stays in the vortex','Have <b>400</b> portals.','Portal',9);
10669
order=1800;Game.TieredAchievement('Invited to yesterday\'s party','Have <b>400</b> time machines.','Time machine',9);
10670
order=1900;Game.TieredAchievement('Downsizing','Have <b>400</b> antimatter condensers.','Antimatter condenser',9);//the trailer got me really hyped up but i've read some pretty bad reviews. is it watchable ? is it worth seeing ? i don't mind matt damon
10671
order=2000;Game.TieredAchievement('My eyes','Have <b>400</b> prisms.','Prism',9);
10672
order=2100;Game.TieredAchievement('Maybe a chance in hell, actually','Have <b>400</b> chancemakers.','Chancemaker',9);
10673
10674
order=1200;Game.TieredAchievement('Make like a tree','Have <b>450</b> farms.','Farm',10);
10675
order=1300;Game.TieredAchievement('Cave story','Have <b>450</b> mines.','Mine',10);
10676
order=1400;Game.TieredAchievement('In-cog-neato','Have <b>450</b> factories.','Factory',10);
10677
order=1425;Game.TieredAchievement('Save your breath because that\'s all you\'ve got left','Have <b>450</b> banks.','Bank',10);
10678
order=1450;Game.TieredAchievement('Vengeful and almighty','Have <b>450</b> temples.','Temple',10);
10679
order=1475;Game.TieredAchievement('Spell it out for you','Have <b>450</b> wizard towers.','Wizard tower',10);
10680
order=1500;Game.TieredAchievement('Space space space space space','Have <b>450</b> shipments.<q>It\'s too far away...</q>','Shipment',10);
10681
order=1600;Game.TieredAchievement('Don\'t get used to yourself, you\'re gonna have to change','Have <b>450</b> alchemy labs.','Alchemy lab',10);
10682
order=1700;Game.TieredAchievement('Objects in the mirror dimension are closer than they appear','Have <b>450</b> portals.','Portal',10);
10683
order=1800;Game.TieredAchievement('Groundhog day','Have <b>450</b> time machines.','Time machine',10);
10684
order=1900;Game.TieredAchievement('A matter of perspective','Have <b>450</b> antimatter condensers.','Antimatter condenser',10);
10685
order=2000;Game.TieredAchievement('Optical illusion','Have <b>450</b> prisms.','Prism',10);
10686
order=2100;Game.TieredAchievement('Jackpot','Have <b>450</b> chancemakers.','Chancemaker',10);
10687
10688
order=36000;
10689
new Game.Achievement('So much to do so much to see','Manage a cookie legacy for <b>at least a year</b>.<q>Thank you so much for playing Cookie Clicker!</q>',[23,11]);Game.last.pool='shadow';
10690
10691
10692
10693
Game.CpsAchievement('Running with scissors');
10694
Game.CpsAchievement('Rarefied air');
10695
Game.CpsAchievement('Push it to the limit');
10696
Game.CpsAchievement('Green cookies sleep furiously');
10697
10698
Game.BankAchievement('Panic! at Nabisco');
10699
Game.BankAchievement('Bursting at the seams');
10700
Game.BankAchievement('Just about full');
10701
Game.BankAchievement('Hungry for more');
10702
10703
order=1000;
10704
new Game.Achievement('All the other kids with the pumped up clicks','Make <b>100,000,000,000,000,000,000,000</b> cookies from clicking.',[11,28]);
10705
new Game.Achievement('One...more...click...','Make <b>10,000,000,000,000,000,000,000,000</b> cookies from clicking.',[11,30]);
10706
10707
order=61515;
10708
new Game.Achievement('Botany enthusiast','Harvest <b>100</b> mature garden plants.',[26,20]);
10709
new Game.Achievement('Green, aching thumb','Harvest <b>1000</b> mature garden plants.',[27,20]);
10710
new Game.Achievement('In the garden of Eden (baby)','Fill every tile of the biggest garden plot with plants.<q>Isn\'t tending to those precious little plants just so rock and/or roll?</q>',[28,20]);
10711
10712
new Game.Achievement('Keeper of the conservatory','Unlock every garden seed.',[25,20]);
10713
new Game.Achievement('Seedless to nay','Convert a complete seed log into sugar lumps by sacrificing your garden to the sugar hornets.<div class="line"></div>Owning this achievement makes seeds <b>5% cheaper</b>, plants mature <b>5% sooner</b>, and plant upgrades drop <b>5% more</b>.',[29,20]);
10714
10715
order=30050;
10716
new Game.Achievement('You get nothing','Ascend with <b>1 undecillion</b> cookies baked.<q>Good day sir!</q>',[29,6]);
10717
new Game.Achievement('Humble rebeginnings','Ascend with <b>1 duodecillion</b> cookies baked.<q>Started from the bottom, now we\'re here.</q>',[29,6]);
10718
new Game.Achievement('The end of the world','Ascend with <b>1 tredecillion</b> cookies baked.<q>(as we know it)</q>',[21,25]);
10719
new Game.Achievement('Oh, you\'re back','Ascend with <b>1 quattuordecillion</b> cookies baked.<q>Missed us?</q>',[21,25]);
10720
new Game.Achievement('Lazarus','Ascend with <b>1 quindecillion</b> cookies baked.<q>All rise.</q>',[21,25]);
10721
10722
Game.CpsAchievement('Leisurely pace');
10723
Game.CpsAchievement('Hypersonic');
10724
10725
Game.BankAchievement('Feed me, Orteil');
10726
Game.BankAchievement('And then what?');
10727
10728
order=7002;
10729
new Game.Achievement('Tricentennial and a half','Have at least <b>350 of everything</b>.<q>(it\'s free real estate)</q>',[21,26]);
10730
new Game.Achievement('Quadricentennial','Have at least <b>400 of everything</b>.<q>You\'ve had to do horrible things to get this far.<br>Horrible... horrible things.</q>',[22,26]);
10731
new Game.Achievement('Quadricentennial and a half','Have at least <b>450 of everything</b>.<q>At this point, you might just be compensating for something.</q>',[23,26]);
10732
10733
new Game.Achievement('Quincentennial','Have at least <b>500 of everything</b>.<q>Some people would say you\'re halfway there.<br>We do not care for those people and their reckless sense of unchecked optimism.</q>',[29,25]);
10734
10735
10736
order=21100;
10737
new Game.Achievement('Maillard reaction','Harvest a <b>caramelized sugar lump</b>.',[29,27]);
10738
10739
order=30250;
10740
new Game.Achievement('When the cookies ascend just right','Ascend with exactly <b>1,000,000,000,000 cookies</b>.',[25,7]);Game.last.pool='shadow';//this achievement is shadow because it is only achievable through blind luck or reading external guides; this may change in the future
10741
10742
10743
order=1050;
10744
new Game.Achievement('With her finger and her thumb','Have <b>600</b> cursors.',[0,16]);
10745
10746
order=1100;Game.TieredAchievement('But wait \'til you get older','Have <b>550</b> grandmas.','Grandma',12);
10747
order=1200;Game.TieredAchievement('Sharpest tool in the shed','Have <b>500</b> farms.','Farm',11);
10748
order=1300;Game.TieredAchievement('Hey now, you\'re a rock','Have <b>500</b> mines.','Mine',11);
10749
order=1400;Game.TieredAchievement('Break the mold','Have <b>500</b> factories.','Factory',11);
10750
order=1425;Game.TieredAchievement('Get the show on, get paid','Have <b>500</b> banks.','Bank',11);
10751
order=1450;Game.TieredAchievement('My world\'s on fire, how about yours','Have <b>500</b> temples.','Temple',11);
10752
order=1475;Game.TieredAchievement('The meteor men beg to differ','Have <b>500</b> wizard towers.','Wizard tower',11);
10753
order=1500;Game.TieredAchievement('Only shooting stars','Have <b>500</b> shipments.','Shipment',11);
10754
order=1600;Game.TieredAchievement('We could all use a little change','Have <b>500</b> alchemy labs.','Alchemy lab',11);//"all that glitters is gold" was already an achievement
10755
order=1700;Game.TieredAchievement('Your brain gets smart but your head gets dumb','Have <b>500</b> portals.','Portal',11);
10756
order=1800;Game.TieredAchievement('The years start coming','Have <b>500</b> time machines.','Time machine',11);
10757
order=1900;Game.TieredAchievement('What a concept','Have <b>500</b> antimatter condensers.','Antimatter condenser',11);
10758
order=2000;Game.TieredAchievement('You\'ll never shine if you don\'t glow','Have <b>500</b> prisms.','Prism',11);
10759
order=2100;Game.TieredAchievement('You\'ll never know if you don\'t go','Have <b>500</b> chancemakers.','Chancemaker',11);
10760
10761
order=2200;
10762
Game.TieredAchievement('Self-contained','Have <b>1</b> fractal engine.','Fractal engine',1);
10763
Game.TieredAchievement('Threw you for a loop','Have <b>50</b> fractal engines.','Fractal engine',2);
10764
Game.TieredAchievement('The sum of its parts','Have <b>100</b> fractal engines.','Fractal engine',3);
10765
Game.TieredAchievement('Bears repeating','Have <b>150</b> fractal engines.<q>Where did these come from?</q>','Fractal engine',4);
10766
Game.TieredAchievement('More of the same','Have <b>200</b> fractal engines.','Fractal engine',5);
10767
Game.TieredAchievement('Last recurse','Have <b>250</b> fractal engines.','Fractal engine',6);
10768
Game.TieredAchievement('Out of one, many','Have <b>300</b> fractal engines.','Fractal engine',7);
10769
Game.TieredAchievement('An example of recursion','Have <b>350</b> fractal engines.','Fractal engine',8);
10770
Game.TieredAchievement('For more information on this achievement, please refer to its title','Have <b>400</b> fractal engines.','Fractal engine',9);
10771
Game.TieredAchievement('I\'m so meta, even this achievement','Have <b>450</b> fractal engines.','Fractal engine',10);
10772
Game.TieredAchievement('Never get bored','Have <b>500</b> fractal engines.','Fractal engine',11);
10773
10774
order=2220;
10775
Game.ProductionAchievement('The needs of the many','Fractal engine',1);
10776
Game.ProductionAchievement('Eating its own','Fractal engine',2);
10777
Game.ProductionAchievement('We must go deeper','Fractal engine',3);
10778
10779
new Game.Achievement('Sierpinski rhomboids','Reach level <b>10</b> fractal engines.',[20,26]);Game.Objects['Fractal engine'].levelAchiev10=Game.last;
10780
10781
Game.CpsAchievement('Gotta go fast');
10782
Game.BankAchievement('I think it\'s safe to say you\'ve got it made');
10783
10784
order=6000;
10785
new Game.Achievement('Renaissance baker','Own <b>400</b> upgrades and <b>4000</b> buildings.<q>If you have seen further, it is by standing on the shoulders of giants - a mysterious species of towering humanoids until now thought long-extinct.</q>',[10,10]);
10786
10787
order=1150;
10788
new Game.Achievement('Veteran','Own at least <b>14</b> grandma types.<q>14\'s a crowd!</q>',[10,9]);
10789
10790
order=10000;
10791
new Game.Achievement('Thick-skinned','Have your <b>reinforced membrane</b> protect the <b>shimmering veil</b>.',[7,10]);
10792
10793
10794
order=2300;
10795
Game.TieredAchievement('F12','Have <b>1</b> javascript console.','Javascript console',1);
10796
Game.TieredAchievement('Variable success','Have <b>50</b> javascript consoles.','Javascript console',2);
10797
Game.TieredAchievement('No comments','Have <b>100</b> javascript consoles.','Javascript console',3);
10798
Game.TieredAchievement('Up to code','Have <b>150</b> javascript consoles.','Javascript console',4);
10799
Game.TieredAchievement('Works on my machine','Have <b>200</b> javascript consoles.','Javascript console',5);
10800
Game.TieredAchievement('Technical debt','Have <b>250</b> javascript consoles.','Javascript console',6);
10801
Game.TieredAchievement('Mind your language','Have <b>300</b> javascript consoles.','Javascript console',7);
10802
Game.TieredAchievement('Inconsolable','Have <b>350</b> javascript consoles.','Javascript console',8);
10803
Game.TieredAchievement('Closure','Have <b>400</b> javascript consoles.','Javascript console',9);
10804
Game.TieredAchievement('Dude what if we\'re all living in a simulation like what if we\'re all just code on a computer somewhere','Have <b>450</b> javascript consoles.','Javascript console',10);
10805
Game.TieredAchievement('Taking the back streets','Have <b>500</b> javascript consoles.','Javascript console',11);
10806
10807
order=2320;
10808
Game.ProductionAchievement('Inherited prototype','Javascript console',1);
10809
Game.ProductionAchievement('A model of document object','Javascript console',2);
10810
Game.ProductionAchievement('First-class citizen','Javascript console',3);
10811
10812
new Game.Achievement('Alexandria','Reach level <b>10</b> javascript consoles.',[32,26]);Game.Objects['Javascript console'].levelAchiev10=Game.last;
10813
10814
Game.CpsAchievement('Bake him away, toys');
10815
Game.CpsAchievement('You\'re #1 so why try harder');
10816
Game.CpsAchievement('Haven\'t even begun to peak');
10817
Game.BankAchievement('A sometimes food');
10818
Game.BankAchievement('Not enough of a good thing');
10819
Game.BankAchievement('Horn of plenty');
10820
10821
order=30050;
10822
new Game.Achievement('Smurf account','Ascend with <b>1 sexdecillion</b> cookies baked.<q>It\'s like you just appeared out of the blue!</q>',[21,32]);
10823
new Game.Achievement('If at first you don\'t succeed','Ascend with <b>1 septendecillion</b> cookies baked.<q>If at first you don\'t succeed, try, try, try again.<br>But isn\'t that the definition of insanity?</q>',[21,32]);
10824
10825
order=33000;
10826
new Game.Achievement('O Fortuna','Own every <b>fortune upgrade</b>.<div class="line"></div>Owning this achievement makes fortunes appear <b>twice as often</b>; unlocked fortune upgrades also have a <b>40% chance</b> to carry over after ascending.',[29,8]);
10827
10828
//end of achievements
10829
10830
/*=====================================================================================
10831
BUFFS
10832
=======================================================================================*/
10833
10834
Game.buffs=[];//buffs currently in effect by name
10835
Game.buffsN=0;
10836
Game.buffsL=l('buffs');
10837
Game.gainBuff=function(type,time,arg1,arg2,arg3)
10838
{
10839
type=Game.buffTypesByName[type];
10840
var obj=type.func(time,arg1,arg2,arg3);
10841
obj.type=type;
10842
obj.arg1=arg1;
10843
obj.arg2=arg2;
10844
obj.arg3=arg3;
10845
10846
var buff={
10847
visible:true,
10848
time:0,
10849
name:'???',
10850
desc:'',
10851
icon:[0,0]
10852
};
10853
if (Game.buffs[obj.name])//if there is already a buff in effect with this name
10854
{
10855
var buff=Game.buffs[obj.name];
10856
if (obj.max) buff.time=Math.max(obj.time,buff.time);//new duration is max of old and new
10857
if (obj.add) buff.time+=obj.time;//new duration is old + new
10858
if (!obj.max && !obj.add) buff.time=obj.time;//new duration is set to new
10859
buff.maxTime=buff.time;
10860
}
10861
else//create new buff
10862
{
10863
for (var i in obj)//paste parameters onto buff
10864
{buff[i]=obj[i];}
10865
buff.maxTime=buff.time;
10866
Game.buffs[buff.name]=buff;
10867
buff.id=Game.buffsN;
10868
10869
//create dom
10870
Game.buffsL.innerHTML=Game.buffsL.innerHTML+'<div id="buff'+buff.id+'" class="crate enabled buff" '+(buff.desc?Game.getTooltip(
10871
'<div class="prompt" style="min-width:200px;text-align:center;font-size:11px;margin:8px 0px;"><h3>'+buff.name+'</h3><div class="line"></div>'+buff.desc+'</div>'
10872
,'left',true):'')+' style="opacity:1;float:none;display:block;'+(buff.icon[2]?'background-image:url('+buff.icon[2]+');':'')+'background-position:'+(-buff.icon[0]*48)+'px '+(-buff.icon[1]*48)+'px;"></div>';
10873
10874
buff.l=l('buff'+buff.id);
10875
10876
Game.buffsN++;
10877
}
10878
Game.recalculateGains=1;
10879
Game.storeToRefresh=1;
10880
return buff;
10881
}
10882
Game.hasBuff=function(what)//returns 0 if there is no buff in effect with this name; else, returns it
10883
{if (!Game.buffs[what]) return 0; else return Game.buffs[what];}
10884
Game.updateBuffs=function()//executed every logic frame
10885
{
10886
for (var i in Game.buffs)
10887
{
10888
var buff=Game.buffs[i];
10889
10890
if (buff.time>=0)
10891
{
10892
if (!l('buffPieTimer'+buff.id)) l('buff'+buff.id).innerHTML=l('buff'+buff.id).innerHTML+'<div class="pieTimer" id="buffPieTimer'+buff.id+'"></div>';
10893
var T=1-(buff.time/buff.maxTime);
10894
T=(T*144)%144;
10895
l('buffPieTimer'+buff.id).style.backgroundPosition=(-Math.floor(T%18))*48+'px '+(-Math.floor(T/18))*48+'px';
10896
}
10897
buff.time--;
10898
if (buff.time<=0)
10899
{
10900
if (Game.onCrate==l('buff'+buff.id)) Game.tooltip.hide();
10901
if (buff.onDie) buff.onDie();
10902
Game.buffsL.removeChild(l('buff'+buff.id));
10903
if (Game.buffs[buff.name])
10904
{
10905
Game.buffs[buff.name]=0;
10906
delete Game.buffs[buff.name];
10907
}
10908
Game.recalculateGains=1;
10909
Game.storeToRefresh=1;
10910
}
10911
}
10912
}
10913
Game.killBuff=function(what)//remove a buff by name
10914
{if (Game.buffs[what]){Game.buffs[what].time=0;/*Game.buffs[what]=0;*/}}
10915
Game.killBuffs=function()//remove all buffs
10916
{Game.buffsL.innerHTML='';Game.buffs=[];Game.recalculateGains=1;Game.storeToRefresh=1;}
10917
10918
10919
Game.buffTypes=[];//buff archetypes; only buffs declared from these can be saved and loaded
10920
Game.buffTypesByName=[];
10921
Game.buffTypesN=0;
10922
Game.buffType=function(name,func)
10923
{
10924
this.name=name;
10925
this.func=func;//this is a function that returns a buff object; it takes a "time" argument in seconds, and 3 more optional arguments at most, which will be saved and loaded as floats
10926
this.id=Game.buffTypesN;
10927
this.vanilla=Game.vanilla;
10928
Game.buffTypesByName[this.name]=this;
10929
Game.buffTypes[Game.buffTypesN]=this;
10930
Game.buffTypesN++;
10931
}
10932
10933
/*
10934
basic buff parameters :
10935
name:'Kitten rain',
10936
desc:'It\'s raining kittens!',
10937
icon:[0,0],
10938
time:30*Game.fps
10939
other parameters :
10940
visible:false - will hide the buff from the buff list
10941
add:true - if this buff already exists, add the new duration to the old one
10942
max:true - if this buff already exists, set the new duration to the max of either
10943
onDie:function(){} - function will execute when the buff runs out
10944
power:3 - used by some buffs
10945
multCpS:3 - buff multiplies CpS by this amount
10946
multClick:3 - buff multiplies click power by this amount
10947
*/
10948
10949
//base buffs
10950
new Game.buffType('frenzy',function(time,pow)
10951
{
10952
return {
10953
name:'Frenzy',
10954
desc:'Cookie production x'+pow+' for '+Game.sayTime(time*Game.fps,-1)+'!',
10955
icon:[10,14],
10956
time:time*Game.fps,
10957
add:true,
10958
multCpS:pow,
10959
aura:1
10960
};
10961
});
10962
new Game.buffType('blood frenzy',function(time,pow)
10963
{
10964
return {
10965
name:'Elder frenzy',
10966
desc:'Cookie production x'+pow+' for '+Game.sayTime(time*Game.fps,-1)+'!',
10967
icon:[29,6],
10968
time:time*Game.fps,
10969
add:true,
10970
multCpS:pow,
10971
aura:1
10972
};
10973
});
10974
new Game.buffType('clot',function(time,pow)
10975
{
10976
return {
10977
name:'Clot',
10978
desc:'Cookie production halved for '+Game.sayTime(time*Game.fps,-1)+'!',
10979
icon:[15,5],
10980
time:time*Game.fps,
10981
add:true,
10982
multCpS:pow,
10983
aura:2
10984
};
10985
});
10986
new Game.buffType('dragon harvest',function(time,pow)
10987
{
10988
return {
10989
name:'Dragon Harvest',
10990
desc:'Cookie production x'+pow+' for '+Game.sayTime(time*Game.fps,-1)+'!',
10991
icon:[10,25],
10992
time:time*Game.fps,
10993
add:true,
10994
multCpS:pow,
10995
aura:1
10996
};
10997
});
10998
new Game.buffType('everything must go',function(time,pow)
10999
{
11000
return {
11001
name:'Everything must go',
11002
desc:'All buildings are '+pow+'% cheaper for '+Game.sayTime(time*Game.fps,-1)+'!',
11003
icon:[17,6],
11004
time:time*Game.fps,
11005
add:true,
11006
power:pow,
11007
aura:1
11008
};
11009
});
11010
new Game.buffType('cursed finger',function(time,pow)
11011
{
11012
return {
11013
name:'Cursed finger',
11014
desc:'Cookie production halted for '+Game.sayTime(time*Game.fps,-1)+',<br>but each click is worth '+Game.sayTime(time*Game.fps,-1)+' of CpS.',
11015
icon:[12,17],
11016
time:time*Game.fps,
11017
add:true,
11018
power:pow,
11019
multCpS:0,
11020
aura:1
11021
};
11022
});
11023
new Game.buffType('click frenzy',function(time,pow)
11024
{
11025
return {
11026
name:'Click frenzy',
11027
desc:'Clicking power x'+pow+' for '+Game.sayTime(time*Game.fps,-1)+'!',
11028
icon:[0,14],
11029
time:time*Game.fps,
11030
add:true,
11031
multClick:pow,
11032
aura:1
11033
};
11034
});
11035
new Game.buffType('dragonflight',function(time,pow)
11036
{
11037
return {
11038
name:'Dragonflight',
11039
desc:'Clicking power x'+pow+' for '+Game.sayTime(time*Game.fps,-1)+'!',
11040
icon:[0,25],
11041
time:time*Game.fps,
11042
add:true,
11043
multClick:pow,
11044
aura:1
11045
};
11046
});
11047
new Game.buffType('cookie storm',function(time,pow)
11048
{
11049
return {
11050
name:'Cookie storm',
11051
desc:'Cookies everywhere!',
11052
icon:[22,6],
11053
time:time*Game.fps,
11054
add:true,
11055
power:pow,
11056
aura:1
11057
};
11058
});
11059
new Game.buffType('building buff',function(time,pow,building)
11060
{
11061
var obj=Game.ObjectsById[building];
11062
return {
11063
name:Game.goldenCookieBuildingBuffs[obj.name][0],
11064
desc:'Your '+obj.amount+' '+obj.plural+' are boosting your CpS!<br>Cookie production +'+(Math.ceil(pow*100-100))+'% for '+Game.sayTime(time*Game.fps,-1)+'!',
11065
icon:[obj.iconColumn,14],
11066
time:time*Game.fps,
11067
add:true,
11068
multCpS:pow,
11069
aura:1
11070
};
11071
});
11072
new Game.buffType('building debuff',function(time,pow,building)
11073
{
11074
var obj=Game.ObjectsById[building];
11075
return {
11076
name:Game.goldenCookieBuildingBuffs[obj.name][1],
11077
desc:'Your '+obj.amount+' '+obj.plural+' are rusting your CpS!<br>Cookie production '+(Math.ceil(pow*100-100))+'% slower for '+Game.sayTime(time*Game.fps,-1)+'!',
11078
icon:[obj.iconColumn,15],
11079
time:time*Game.fps,
11080
add:true,
11081
multCpS:1/pow,
11082
aura:2
11083
};
11084
});
11085
new Game.buffType('sugar blessing',function(time,pow)
11086
{
11087
return {
11088
name:'Sugar blessing',
11089
desc:'You find 10% more golden cookies for the next '+Game.sayTime(time*Game.fps,-1)+'.',
11090
icon:[29,16],
11091
time:time*Game.fps,
11092
//add:true
11093
};
11094
});
11095
new Game.buffType('haggler luck',function(time,pow)
11096
{
11097
return {
11098
name:'Haggler\'s luck',
11099
desc:'All upgrades are '+pow+'% cheaper for '+Game.sayTime(time*Game.fps,-1)+'!',
11100
icon:[25,11],
11101
time:time*Game.fps,
11102
power:pow,
11103
max:true
11104
};
11105
});
11106
new Game.buffType('haggler misery',function(time,pow)
11107
{
11108
return {
11109
name:'Haggler\'s misery',
11110
desc:'All upgrades are '+pow+'% pricier for '+Game.sayTime(time*Game.fps,-1)+'!',
11111
icon:[25,11],
11112
time:time*Game.fps,
11113
power:pow,
11114
max:true
11115
};
11116
});
11117
new Game.buffType('pixie luck',function(time,pow)
11118
{
11119
return {
11120
name:'Crafty pixies',
11121
desc:'All buildings are '+pow+'% cheaper for '+Game.sayTime(time*Game.fps,-1)+'!',
11122
icon:[26,11],
11123
time:time*Game.fps,
11124
power:pow,
11125
max:true
11126
};
11127
});
11128
new Game.buffType('pixie misery',function(time,pow)
11129
{
11130
return {
11131
name:'Nasty goblins',
11132
desc:'All buildings are '+pow+'% pricier for '+Game.sayTime(time*Game.fps,-1)+'!',
11133
icon:[26,11],
11134
time:time*Game.fps,
11135
power:pow,
11136
max:true
11137
};
11138
});
11139
new Game.buffType('magic adept',function(time,pow)
11140
{
11141
return {
11142
name:'Magic adept',
11143
desc:'Spells backfire '+pow+' times less for '+Game.sayTime(time*Game.fps,-1)+'.',
11144
icon:[29,11],
11145
time:time*Game.fps,
11146
power:pow,
11147
max:true
11148
};
11149
});
11150
new Game.buffType('magic inept',function(time,pow)
11151
{
11152
return {
11153
name:'Magic inept',
11154
desc:'Spells backfire '+pow+' times more for '+Game.sayTime(time*Game.fps,-1)+'.',
11155
icon:[29,11],
11156
time:time*Game.fps,
11157
power:pow,
11158
max:true
11159
};
11160
});
11161
new Game.buffType('devastation',function(time,pow)
11162
{
11163
return {
11164
name:'Devastation',
11165
desc:'Clicking power +'+Math.floor(pow*100-100)+'% for '+Game.sayTime(time*Game.fps,-1)+'!',
11166
icon:[23,18],
11167
time:time*Game.fps,
11168
multClick:pow,
11169
aura:1,
11170
max:true
11171
};
11172
});
11173
new Game.buffType('sugar frenzy',function(time,pow)
11174
{
11175
return {
11176
name:'Sugar frenzy',
11177
desc:'Cookie production x'+pow+' for '+Game.sayTime(time*Game.fps,-1)+'!',
11178
icon:[29,14],
11179
time:time*Game.fps,
11180
add:true,
11181
multCpS:pow,
11182
aura:0
11183
};
11184
});
11185
11186
//end of buffs
11187
11188
11189
11190
11191
11192
BeautifyAll();
11193
Game.vanilla=0;//everything we create beyond this will not be saved in the default save
11194
11195
11196
for (var i in Game.customCreate) {Game.customCreate[i]();}
11197
11198
11199
/*=====================================================================================
11200
GRANDMAPOCALYPSE
11201
=======================================================================================*/
11202
Game.UpdateGrandmapocalypse=function()
11203
{
11204
if (Game.Has('Elder Covenant') || Game.Objects['Grandma'].amount==0) Game.elderWrath=0;
11205
else if (Game.pledgeT>0)//if the pledge is active, lower it
11206
{
11207
Game.pledgeT--;
11208
if (Game.pledgeT==0)//did we reach 0? make the pledge purchasable again
11209
{
11210
Game.Lock('Elder Pledge');
11211
Game.Unlock('Elder Pledge');
11212
Game.elderWrath=1;
11213
}
11214
}
11215
else
11216
{
11217
if (Game.Has('One mind') && Game.elderWrath==0)
11218
{
11219
Game.elderWrath=1;
11220
}
11221
if (Math.random()<0.001 && Game.elderWrath<Game.Has('One mind')+Game.Has('Communal brainsweep')+Game.Has('Elder Pact'))
11222
{
11223
Game.elderWrath++;//have we already pledged? make the elder wrath shift between different stages
11224
}
11225
if (Game.Has('Elder Pact') && Game.Upgrades['Elder Pledge'].unlocked==0)
11226
{
11227
Game.Lock('Elder Pledge');
11228
Game.Unlock('Elder Pledge');
11229
}
11230
}
11231
Game.elderWrathD+=((Game.elderWrath+1)-Game.elderWrathD)*0.001;//slowly fade to the target wrath state
11232
11233
if (Game.elderWrath!=Game.elderWrathOld) Game.storeToRefresh=1;
11234
11235
Game.elderWrathOld=Game.elderWrath;
11236
11237
Game.UpdateWrinklers();
11238
}
11239
11240
//wrinklers
11241
11242
function inRect(x,y,rect)
11243
{
11244
//find out if the point x,y is in the rotated rectangle rect{w,h,r,o} (width,height,rotation in radians,y-origin) (needs to be normalized)
11245
//I found this somewhere online I guess
11246
var dx = x+Math.sin(-rect.r)*(-(rect.h/2-rect.o)),dy=y+Math.cos(-rect.r)*(-(rect.h/2-rect.o));
11247
var h1 = Math.sqrt(dx*dx + dy*dy);
11248
var currA = Math.atan2(dy,dx);
11249
var newA = currA - rect.r;
11250
var x2 = Math.cos(newA) * h1;
11251
var y2 = Math.sin(newA) * h1;
11252
if (x2 > -0.5 * rect.w && x2 < 0.5 * rect.w && y2 > -0.5 * rect.h && y2 < 0.5 * rect.h) return true;
11253
return false;
11254
}
11255
11256
Game.wrinklerHP=2.1;
11257
Game.wrinklers=[];
11258
for (var i=0;i<12;i++)
11259
{
11260
Game.wrinklers.push({id:parseInt(i),close:0,sucked:0,phase:0,x:0,y:0,r:0,hurt:0,hp:Game.wrinklerHP,selected:0,type:0});
11261
}
11262
Game.getWrinklersMax=function()
11263
{
11264
var n=10;
11265
if (Game.Has('Elder spice')) n+=2;
11266
return n;
11267
}
11268
Game.ResetWrinklers=function()
11269
{
11270
for (var i in Game.wrinklers)
11271
{
11272
Game.wrinklers[i]={id:parseInt(i),close:0,sucked:0,phase:0,x:0,y:0,r:0,hurt:0,hp:Game.wrinklerHP,selected:0,type:0};
11273
}
11274
}
11275
Game.CollectWrinklers=function()
11276
{
11277
for (var i in Game.wrinklers)
11278
{
11279
Game.wrinklers[i].hp=0;
11280
}
11281
}
11282
Game.wrinklerSquishSound=Math.floor(Math.random()*4)+1;
11283
Game.playWrinklerSquishSound=function()
11284
{
11285
PlaySound('snd/squish'+(Game.wrinklerSquishSound)+'.mp3',0.5);
11286
Game.wrinklerSquishSound+=Math.floor(Math.random()*1.5)+1;
11287
if (Game.wrinklerSquishSound>4) Game.wrinklerSquishSound-=4;
11288
}
11289
Game.SpawnWrinkler=function(me)
11290
{
11291
if (!me)
11292
{
11293
var max=Game.getWrinklersMax();
11294
var n=0;
11295
for (var i in Game.wrinklers)
11296
{
11297
if (Game.wrinklers[i].phase>0) n++;
11298
}
11299
for (var i in Game.wrinklers)
11300
{
11301
var it=Game.wrinklers[i];
11302
if (it.phase==0 && Game.elderWrath>0 && n<max && it.id<max)
11303
{
11304
me=it;
11305
break;
11306
}
11307
}
11308
}
11309
if (!me) return false;
11310
me.phase=1;
11311
me.hp=Game.wrinklerHP;
11312
me.type=0;
11313
if (Math.random()<0.0001) me.type=1;//shiny wrinkler
11314
return me;
11315
}
11316
Game.PopRandomWrinkler=function()
11317
{
11318
var wrinklers=[];
11319
for (var i in Game.wrinklers)
11320
{
11321
if (Game.wrinklers[i].phase>0 && Game.wrinklers[i].hp>0) wrinklers.push(Game.wrinklers[i]);
11322
}
11323
if (wrinklers.length>0)
11324
{
11325
var me=choose(wrinklers);
11326
me.hp=-10;
11327
return me;
11328
}
11329
return false;
11330
}
11331
Game.UpdateWrinklers=function()
11332
{
11333
var xBase=0;
11334
var yBase=0;
11335
var onWrinkler=0;
11336
if (Game.LeftBackground)
11337
{
11338
xBase=Game.cookieOriginX;
11339
yBase=Game.cookieOriginY;
11340
}
11341
var max=Game.getWrinklersMax();
11342
var n=0;
11343
for (var i in Game.wrinklers)
11344
{
11345
if (Game.wrinklers[i].phase>0) n++;
11346
}
11347
for (var i in Game.wrinklers)
11348
{
11349
var me=Game.wrinklers[i];
11350
if (me.phase==0 && Game.elderWrath>0 && n<max && me.id<max)
11351
{
11352
var chance=0.00001*Game.elderWrath;
11353
chance*=Game.eff('wrinklerSpawn');
11354
if (Game.Has('Unholy bait')) chance*=5;
11355
if (Game.hasGod)
11356
{
11357
var godLvl=Game.hasGod('scorn');
11358
if (godLvl==1) chance*=2.5;
11359
else if (godLvl==2) chance*=2;
11360
else if (godLvl==3) chance*=1.5;
11361
}
11362
if (Game.Has('Wrinkler doormat')) chance=0.1;
11363
if (Math.random()<chance)//respawn
11364
{
11365
Game.SpawnWrinkler(me);
11366
}
11367
}
11368
if (me.phase>0)
11369
{
11370
if (me.close<1) me.close+=(1/Game.fps)/10;
11371
if (me.close>1) me.close=1;
11372
}
11373
else me.close=0;
11374
if (me.close==1 && me.phase==1)
11375
{
11376
me.phase=2;
11377
Game.recalculateGains=1;
11378
}
11379
if (me.phase==2)
11380
{
11381
me.sucked+=(((Game.cookiesPs/Game.fps)*Game.cpsSucked));//suck the cookies
11382
}
11383
if (me.phase>0)
11384
{
11385
if (me.type==0)
11386
{
11387
if (me.hp<Game.wrinklerHP) me.hp+=0.04;
11388
me.hp=Math.min(Game.wrinklerHP,me.hp);
11389
}
11390
else if (me.type==1)
11391
{
11392
if (me.hp<Game.wrinklerHP*3) me.hp+=0.04;
11393
me.hp=Math.min(Game.wrinklerHP*3,me.hp);
11394
}
11395
var d=128*(2-me.close);//*Game.BigCookieSize;
11396
if (Game.prefs.fancy) d+=Math.cos(Game.T*0.05+parseInt(me.id))*4;
11397
me.r=(me.id/max)*360;
11398
if (Game.prefs.fancy) me.r+=Math.sin(Game.T*0.05+parseInt(me.id))*4;
11399
me.x=xBase+(Math.sin(me.r*Math.PI/180)*d);
11400
me.y=yBase+(Math.cos(me.r*Math.PI/180)*d);
11401
if (Game.prefs.fancy) me.r+=Math.sin(Game.T*0.09+parseInt(me.id))*4;
11402
var rect={w:100,h:200,r:(-me.r)*Math.PI/180,o:10};
11403
if (Math.random()<0.01) me.hurt=Math.max(me.hurt,Math.random());
11404
if (Game.T%5==0 && Game.CanClick) {if (Game.LeftBackground && Game.mouseX<Game.LeftBackground.canvas.width && inRect(Game.mouseX-me.x,Game.mouseY-me.y,rect)) me.selected=1; else me.selected=0;}
11405
if (me.selected && onWrinkler==0 && Game.CanClick)
11406
{
11407
me.hurt=Math.max(me.hurt,0.25);
11408
//me.close*=0.99;
11409
if (Game.Click && Game.lastClickedEl==l('backgroundLeftCanvas'))
11410
{
11411
if (Game.keys[17] && Game.sesame) {me.type=!me.type;PlaySound('snd/shimmerClick.mp3');}//ctrl-click on a wrinkler in god mode to toggle its shininess
11412
else
11413
{
11414
Game.playWrinklerSquishSound();
11415
me.hurt=1;
11416
me.hp-=0.75;
11417
if (Game.prefs.particles && !(me.hp<=0.5 && me.phase>0))
11418
{
11419
var x=me.x+(Math.sin(me.r*Math.PI/180)*90);
11420
var y=me.y+(Math.cos(me.r*Math.PI/180)*90);
11421
for (var ii=0;ii<3;ii++)
11422
{
11423
//Game.particleAdd(x+Math.random()*50-25,y+Math.random()*50-25,Math.random()*4-2,Math.random()*-2-2,1,1,2,'wrinklerBits.png');
11424
var part=Game.particleAdd(x,y,Math.random()*4-2,Math.random()*-2-2,1,1,2,me.type==1?'shinyWrinklerBits.png':'wrinklerBits.png');
11425
part.r=-me.r;
11426
}
11427
}
11428
}
11429
Game.Click=0;
11430
}
11431
onWrinkler=1;
11432
}
11433
}
11434
11435
if (me.hurt>0)
11436
{
11437
me.hurt-=5/Game.fps;
11438
//me.close-=me.hurt*0.05;
11439
//me.x+=Math.random()*2-1;
11440
//me.y+=Math.random()*2-1;
11441
me.r+=(Math.sin(Game.T*1)*me.hurt)*18;//Math.random()*2-1;
11442
}
11443
if (me.hp<=0.5 && me.phase>0)
11444
{
11445
Game.playWrinklerSquishSound();
11446
PlaySound('snd/pop'+Math.floor(Math.random()*3+1)+'.mp3',0.75);
11447
Game.wrinklersPopped++;
11448
Game.recalculateGains=1;
11449
me.phase=0;
11450
me.close=0;
11451
me.hurt=0;
11452
me.hp=3;
11453
var toSuck=1.1;
11454
if (Game.Has('Sacrilegious corruption')) toSuck*=1.05;
11455
if (me.type==1) toSuck*=3;//shiny wrinklers are an elusive, profitable breed
11456
me.sucked*=toSuck;//cookie dough does weird things inside wrinkler digestive tracts
11457
if (Game.Has('Wrinklerspawn')) me.sucked*=1.05;
11458
if (Game.hasGod)
11459
{
11460
var godLvl=Game.hasGod('scorn');
11461
if (godLvl==1) me.sucked*=1.15;
11462
else if (godLvl==2) me.sucked*=1.1;
11463
else if (godLvl==3) me.sucked*=1.05;
11464
}
11465
if (me.sucked>0.5)
11466
{
11467
if (Game.prefs.popups) Game.Popup('Exploded a '+(me.type==1?'shiny ':'')+'wrinkler : found '+Beautify(me.sucked)+' cookies!');
11468
else Game.Notify('Exploded a '+(me.type==1?'shiny ':'')+'wrinkler','Found <b>'+Beautify(me.sucked)+'</b> cookies!',[19,8],6);
11469
Game.Popup('<div style="font-size:80%;">+'+Beautify(me.sucked)+' cookies</div>',Game.mouseX,Game.mouseY);
11470
11471
if (Game.season=='halloween')
11472
{
11473
//if (Math.random()<(Game.HasAchiev('Spooky cookies')?0.2:0.05))//halloween cookie drops
11474
var failRate=0.95;
11475
if (Game.HasAchiev('Spooky cookies')) failRate=0.8;
11476
if (Game.Has('Starterror')) failRate*=0.9;
11477
failRate*=1/Game.dropRateMult();
11478
if (Game.hasGod)
11479
{
11480
var godLvl=Game.hasGod('seasons');
11481
if (godLvl==1) failRate*=0.9;
11482
else if (godLvl==2) failRate*=0.95;
11483
else if (godLvl==3) failRate*=0.97;
11484
}
11485
if (me.type==1) failRate*=0.9;
11486
if (Math.random()>failRate)//halloween cookie drops
11487
{
11488
var cookie=choose(['Skull cookies','Ghost cookies','Bat cookies','Slime cookies','Pumpkin cookies','Eyeball cookies','Spider cookies']);
11489
if (!Game.HasUnlocked(cookie) && !Game.Has(cookie))
11490
{
11491
Game.Unlock(cookie);
11492
if (Game.prefs.popups) Game.Popup('Found : '+cookie+'!');
11493
else Game.Notify(cookie,'You also found <b>'+cookie+'</b>!',Game.Upgrades[cookie].icon);
11494
}
11495
}
11496
}
11497
Game.DropEgg(0.98);
11498
}
11499
if (me.type==1) Game.Win('Last Chance to See');
11500
Game.Earn(me.sucked);
11501
/*if (Game.prefs.particles)
11502
{
11503
var x=me.x+(Math.sin(me.r*Math.PI/180)*100);
11504
var y=me.y+(Math.cos(me.r*Math.PI/180)*100);
11505
for (var ii=0;ii<6;ii++)
11506
{
11507
Game.particleAdd(x+Math.random()*50-25,y+Math.random()*50-25,Math.random()*4-2,Math.random()*-2-2,1,1,2,'wrinklerBits.png');
11508
}
11509
}*/
11510
if (Game.prefs.particles)
11511
{
11512
var x=me.x+(Math.sin(me.r*Math.PI/180)*90);
11513
var y=me.y+(Math.cos(me.r*Math.PI/180)*90);
11514
if (me.sucked>0)
11515
{
11516
for (var ii=0;ii<5;ii++)
11517
{
11518
Game.particleAdd(Game.mouseX,Game.mouseY,Math.random()*4-2,Math.random()*-2-2,Math.random()*0.5+0.75,1.5,2);
11519
}
11520
}
11521
for (var ii=0;ii<8;ii++)
11522
{
11523
var part=Game.particleAdd(x,y,Math.random()*4-2,Math.random()*-2-2,1,1,2,me.type==1?'shinyWrinklerBits.png':'wrinklerBits.png');
11524
part.r=-me.r;
11525
}
11526
}
11527
me.sucked=0;
11528
}
11529
}
11530
if (onWrinkler)
11531
{
11532
Game.mousePointer=1;
11533
}
11534
}
11535
Game.DrawWrinklers=function()
11536
{
11537
var ctx=Game.LeftBackground;
11538
var selected=0;
11539
for (var i in Game.wrinklers)
11540
{
11541
var me=Game.wrinklers[i];
11542
if (me.phase>0)
11543
{
11544
ctx.globalAlpha=me.close;
11545
ctx.save();
11546
ctx.translate(me.x,me.y);
11547
ctx.rotate(-(me.r)*Math.PI/180);
11548
//var s=Math.min(1,me.sucked/(Game.cookiesPs*60))*0.75+0.25;//scale wrinklers as they eat
11549
//ctx.scale(Math.pow(s,1.5)*1.25,s);
11550
//ctx.fillRect(-50,-10,100,200);
11551
if (me.type==1) ctx.drawImage(Pic('shinyWrinkler.png'),-50,-10);
11552
else if (Game.season=='christmas') ctx.drawImage(Pic('winterWrinkler.png'),-50,-10);
11553
else ctx.drawImage(Pic('wrinkler.png'),-50,-10);
11554
//ctx.fillText(me.id+' : '+me.sucked,0,0);
11555
if (me.type==1 && Math.random()<0.3 && Game.prefs.particles)//sparkle
11556
{
11557
ctx.globalAlpha=Math.random()*0.65+0.1;
11558
var s=Math.random()*30+5;
11559
ctx.globalCompositeOperation='lighter';
11560
ctx.drawImage(Pic('glint.jpg'),-s/2+Math.random()*50-25,-s/2+Math.random()*200,s,s);
11561
}
11562
ctx.restore();
11563
11564
if (me.phase==2 && Math.random()<0.03 && Game.prefs.particles)
11565
{
11566
Game.particleAdd(me.x,me.y,Math.random()*4-2,Math.random()*-2-2,Math.random()*0.5+0.5,1,2);
11567
}
11568
11569
if (me.selected) selected=me;
11570
}
11571
}
11572
if (selected && Game.Has('Eye of the wrinkler'))
11573
{
11574
var x=Game.cookieOriginX;
11575
var y=Game.cookieOriginY;
11576
ctx.font='14px Merriweather';
11577
ctx.textAlign='center';
11578
var width=Math.max(ctx.measureText('Swallowed :').width,ctx.measureText(Beautify(selected.sucked)).width);
11579
ctx.fillStyle='#000';
11580
ctx.strokeStyle='#000';
11581
ctx.lineWidth=8;
11582
ctx.globalAlpha=0.5;
11583
ctx.beginPath();
11584
ctx.moveTo(x,y);
11585
ctx.lineTo(Math.floor(selected.x),Math.floor(selected.y));
11586
ctx.stroke();
11587
ctx.fillRect(x-width/2-8-14,y-23,width+16+28,38);
11588
ctx.globalAlpha=1;
11589
ctx.fillStyle='#fff';
11590
ctx.fillText('Swallowed :',x+14,y-8);
11591
ctx.fillText(Beautify(selected.sucked),x+14,y+8);
11592
ctx.drawImage(Pic('icons.png'),27*48,26*48,48,48,x-width/2-8-22,y-4-24,48,48);
11593
}
11594
}
11595
Game.SaveWrinklers=function()
11596
{
11597
var amount=0;
11598
var amountShinies=0;
11599
var number=0;
11600
var shinies=0;
11601
for (var i in Game.wrinklers)
11602
{
11603
if (Game.wrinklers[i].sucked>0.5)
11604
{
11605
number++;
11606
if (Game.wrinklers[i].type==1)
11607
{
11608
shinies++;
11609
amountShinies+=Game.wrinklers[i].sucked;
11610
}
11611
else amount+=Game.wrinklers[i].sucked;
11612
}
11613
}
11614
return {amount:amount,number:number,shinies:shinies,amountShinies:amountShinies};
11615
}
11616
Game.LoadWrinklers=function(amount,number,shinies,amountShinies)
11617
{
11618
if (number>0 && (amount>0 || amountShinies>0))
11619
{
11620
var fullNumber=number-shinies;
11621
var fullNumberShinies=shinies;
11622
for (var i in Game.wrinklers)
11623
{
11624
if (number>0)
11625
{
11626
Game.wrinklers[i].phase=2;
11627
Game.wrinklers[i].close=1;
11628
Game.wrinklers[i].hp=3;
11629
if (shinies>0) {Game.wrinklers[i].type=1;Game.wrinklers[i].sucked=amountShinies/fullNumberShinies;shinies--;}
11630
else Game.wrinklers[i].sucked=amount/fullNumber;
11631
number--;
11632
}//respawn
11633
}
11634
}
11635
}
11636
11637
/*=====================================================================================
11638
SPECIAL THINGS AND STUFF
11639
=======================================================================================*/
11640
11641
11642
Game.specialTab='';
11643
Game.specialTabHovered='';
11644
Game.specialTabs=[];
11645
11646
Game.UpdateSpecial=function()
11647
{
11648
Game.specialTabs=[];
11649
if (Game.Has('A festive hat')) Game.specialTabs.push('santa');
11650
if (Game.Has('A crumbly egg')) Game.specialTabs.push('dragon');
11651
if (Game.specialTabs.length==0) {Game.ToggleSpecialMenu(0);return;}
11652
11653
if (Game.LeftBackground)
11654
{
11655
Game.specialTabHovered='';
11656
var len=Game.specialTabs.length;
11657
if (len==0) return;
11658
var y=Game.LeftBackground.canvas.height-24-48*len;
11659
for (var i in Game.specialTabs)
11660
{
11661
var selected=0;
11662
if (Game.specialTab==Game.specialTabs[i]) selected=1;
11663
var x=24;
11664
var s=1;
11665
if (selected) {s=2;x+=24;}
11666
11667
if (Math.abs(Game.mouseX-x)<=24*s && Math.abs(Game.mouseY-y)<=24*s)
11668
{
11669
Game.specialTabHovered=Game.specialTabs[i];
11670
Game.mousePointer=1;
11671
Game.CanClick=0;
11672
if (Game.Click)
11673
{
11674
if (Game.specialTab!=Game.specialTabs[i]) {Game.specialTab=Game.specialTabs[i];Game.ToggleSpecialMenu(1);PlaySound('snd/press.mp3');}
11675
else {Game.ToggleSpecialMenu(0);PlaySound('snd/press.mp3');}
11676
//PlaySound('snd/tick.mp3');
11677
}
11678
}
11679
11680
y+=48;
11681
}
11682
}
11683
}
11684
11685
Game.santaLevels=['Festive test tube','Festive ornament','Festive wreath','Festive tree','Festive present','Festive elf fetus','Elf toddler','Elfling','Young elf','Bulky elf','Nick','Santa Claus','Elder Santa','True Santa','Final Claus'];
11686
for (var i in Game.santaDrops)//scale christmas upgrade prices with santa level
11687
{Game.Upgrades[Game.santaDrops[i]].priceFunc=function(){return Math.pow(3,Game.santaLevel)*2525;}}
11688
11689
11690
Game.UpgradeSanta=function()
11691
{
11692
var moni=Math.pow(Game.santaLevel+1,Game.santaLevel+1);
11693
if (Game.cookies>moni && Game.santaLevel<14)
11694
{
11695
PlaySound('snd/shimmerClick.mp3');
11696
11697
Game.Spend(moni);
11698
Game.santaLevel=(Game.santaLevel+1)%15;
11699
if (Game.santaLevel==14)
11700
{
11701
Game.Unlock('Santa\'s dominion');
11702
if (Game.prefs.popups) Game.Popup('You are granted<br>Santa\'s dominion.');
11703
else Game.Notify('You are granted Santa\'s dominion.','',Game.Upgrades['Santa\'s dominion'].icon);
11704
}
11705
var drops=[];
11706
for (var i in Game.santaDrops) {if (!Game.HasUnlocked(Game.santaDrops[i])) drops.push(Game.santaDrops[i]);}
11707
var drop=choose(drops);
11708
if (drop)
11709
{
11710
Game.Unlock(drop);
11711
if (Game.prefs.popups) Game.Popup('You find a present which contains...<br>'+drop+'!');
11712
else Game.Notify('Found a present!','You find a present which contains...<br><b>'+drop+'</b>!',Game.Upgrades[drop].icon);
11713
}
11714
11715
Game.ToggleSpecialMenu(1);
11716
11717
if (l('specialPic')){var rect=l('specialPic').getBoundingClientRect();Game.SparkleAt((rect.left+rect.right)/2,(rect.top+rect.bottom)/2);}
11718
11719
if (Game.santaLevel>=6) Game.Win('Coming to town');
11720
if (Game.santaLevel>=14) Game.Win('All hail Santa');
11721
Game.recalculateGains=1;
11722
Game.upgradesToRebuild=1;
11723
}
11724
}
11725
11726
Game.dragonLevels=[
11727
{name:'Dragon egg',action:'Chip it',pic:0,
11728
cost:function(){return Game.cookies>=1000000;},
11729
buy:function(){Game.Spend(1000000);},
11730
costStr:function(){return Beautify(1000000)+' cookies';}},
11731
{name:'Dragon egg',action:'Chip it',pic:1,
11732
cost:function(){return Game.cookies>=1000000*2;},
11733
buy:function(){Game.Spend(1000000*2);},
11734
costStr:function(){return Beautify(1000000*2)+' cookies';}},
11735
{name:'Dragon egg',action:'Chip it',pic:2,
11736
cost:function(){return Game.cookies>=1000000*4;},
11737
buy:function(){Game.Spend(1000000*4);},
11738
costStr:function(){return Beautify(1000000*4)+' cookies';}},
11739
{name:'Shivering dragon egg',action:'Hatch it',pic:3,
11740
cost:function(){return Game.cookies>=1000000*8;},
11741
buy:function(){Game.Spend(1000000*8);},
11742
costStr:function(){return Beautify(1000000*8)+' cookies';}},
11743
{name:'Krumblor, cookie hatchling',action:'Train Breath of Milk<br><small>Aura : kittens are 5% more effective</small>',pic:4,
11744
cost:function(){return Game.cookies>=1000000*16;},
11745
buy:function(){Game.Spend(1000000*16);},
11746
costStr:function(){return Beautify(1000000*16)+' cookies';}},
11747
{name:'Krumblor, cookie hatchling',action:'Train Dragon Cursor<br><small>Aura : clicking is 5% more effective</small>',pic:4,
11748
cost:function(){return Game.Objects['Cursor'].amount>=100;},
11749
buy:function(){Game.Objects['Cursor'].sacrifice(100);},
11750
costStr:function(){return '100 cursors';}},
11751
{name:'Krumblor, cookie hatchling',action:'Train Elder Battalion<br><small>Aura : grandmas gain +1% CpS for every non-grandma building</small>',pic:4,
11752
cost:function(){return Game.Objects['Grandma'].amount>=100;},
11753
buy:function(){Game.Objects['Grandma'].sacrifice(100);},
11754
costStr:function(){return '100 grandmas';}},
11755
{name:'Krumblor, cookie hatchling',action:'Train Reaper of Fields<br><small>Aura : golden cookies may trigger a Dragon Harvest</small>',pic:4,
11756
cost:function(){return Game.Objects['Farm'].amount>=100;},
11757
buy:function(){Game.Objects['Farm'].sacrifice(100);},
11758
costStr:function(){return '100 farms';}},
11759
{name:'Krumblor, cookie dragon',action:'Train Earth Shatterer<br><small>Aura : buildings sell back for 50% instead of 25%</small>',pic:5,
11760
cost:function(){return Game.Objects['Mine'].amount>=100;},
11761
buy:function(){Game.Objects['Mine'].sacrifice(100);},
11762
costStr:function(){return '100 mines';}},
11763
{name:'Krumblor, cookie dragon',action:'Train Master of the Armory<br><small>Aura : all upgrades are 2% cheaper</small>',pic:5,
11764
cost:function(){return Game.Objects['Factory'].amount>=100;},
11765
buy:function(){Game.Objects['Factory'].sacrifice(100);},
11766
costStr:function(){return '100 factories';}},
11767
{name:'Krumblor, cookie dragon',action:'Train Fierce Hoarder<br><small>Aura : all buildings are 2% cheaper</small>',pic:5,
11768
cost:function(){return Game.Objects['Bank'].amount>=100;},
11769
buy:function(){Game.Objects['Bank'].sacrifice(100);},
11770
costStr:function(){return '100 banks';}},
11771
{name:'Krumblor, cookie dragon',action:'Train Dragon God<br><small>Aura : prestige CpS bonus +5%</small>',pic:5,
11772
cost:function(){return Game.Objects['Temple'].amount>=100;},
11773
buy:function(){Game.Objects['Temple'].sacrifice(100);},
11774
costStr:function(){return '100 temples';}},
11775
{name:'Krumblor, cookie dragon',action:'Train Arcane Aura<br><small>Aura : golden cookies appear 5% more often</small>',pic:5,
11776
cost:function(){return Game.Objects['Wizard tower'].amount>=100;},
11777
buy:function(){Game.Objects['Wizard tower'].sacrifice(100);},
11778
costStr:function(){return '100 wizard towers';}},
11779
{name:'Krumblor, cookie dragon',action:'Train Dragonflight<br><small>Aura : golden cookies may trigger a Dragonflight</small>',pic:5,
11780
cost:function(){return Game.Objects['Shipment'].amount>=100;},
11781
buy:function(){Game.Objects['Shipment'].sacrifice(100);},
11782
costStr:function(){return '100 shipments';}},
11783
{name:'Krumblor, cookie dragon',action:'Train Ancestral Metamorphosis<br><small>Aura : golden cookies give 10% more cookies</small>',pic:5,
11784
cost:function(){return Game.Objects['Alchemy lab'].amount>=100;},
11785
buy:function(){Game.Objects['Alchemy lab'].sacrifice(100);},
11786
costStr:function(){return '100 alchemy labs';}},
11787
{name:'Krumblor, cookie dragon',action:'Train Unholy Dominion<br><small>Aura : wrath cookies give 10% more cookies</small>',pic:5,
11788
cost:function(){return Game.Objects['Portal'].amount>=100;},
11789
buy:function(){Game.Objects['Portal'].sacrifice(100);},
11790
costStr:function(){return '100 portals';}},
11791
{name:'Krumblor, cookie dragon',action:'Train Epoch Manipulator<br><small>Aura : golden cookie effects last 5% longer</small>',pic:5,
11792
cost:function(){return Game.Objects['Time machine'].amount>=100;},
11793
buy:function(){Game.Objects['Time machine'].sacrifice(100);},
11794
costStr:function(){return '100 time machines';}},
11795
{name:'Krumblor, cookie dragon',action:'Train Mind Over Matter<br><small>Aura : +25% random drops</small>',pic:5,
11796
cost:function(){return Game.Objects['Antimatter condenser'].amount>=100;},
11797
buy:function(){Game.Objects['Antimatter condenser'].sacrifice(100);},
11798
costStr:function(){return '100 antimatter condensers';}},
11799
{name:'Krumblor, cookie dragon',action:'Train Radiant Appetite<br><small>Aura : all cookie production multiplied by 2</small>',pic:5,
11800
cost:function(){return Game.Objects['Prism'].amount>=100;},
11801
buy:function(){Game.Objects['Prism'].sacrifice(100);},
11802
costStr:function(){return '100 prisms';}},
11803
{name:'Krumblor, cookie dragon',action:'Train Dragon\'s Fortune<br><small>Aura : +123% CpS per golden cookie on-screen</small>',pic:5,
11804
cost:function(){return Game.Objects['Chancemaker'].amount>=100;},
11805
buy:function(){Game.Objects['Chancemaker'].sacrifice(100);},
11806
costStr:function(){return '100 chancemakers';}},
11807
{name:'Krumblor, cookie dragon',action:'Train Dragon\'s Curve<br><small>Aura : sugar lumps grow 5% faster, 50% weirder</small>',pic:5,
11808
cost:function(){return Game.Objects['Fractal engine'].amount>=100;},
11809
buy:function(){Game.Objects['Fractal engine'].sacrifice(100);},
11810
costStr:function(){return '100 fractal engines';}},
11811
{name:'Krumblor, cookie dragon',action:'Train Reality Bending<br><small>Aura : 10% of every other aura, combined</small>',pic:5,
11812
cost:function(){return Game.Objects['Javascript console'].amount>=100;},
11813
buy:function(){Game.Objects['Javascript console'].sacrifice(100);},
11814
costStr:function(){return '100 javascript consoles';}},
11815
{name:'Krumblor, cookie dragon',action:'Bake dragon cookie<br><small>Delicious!</small>',pic:6,
11816
cost:function(){var fail=0;for (var i in Game.Objects){if (Game.Objects[i].amount<50) fail=1;}return (fail==0);},
11817
buy:function(){for (var i in Game.Objects){Game.Objects[i].sacrifice(50);}Game.Unlock('Dragon cookie');},
11818
costStr:function(){return '50 of every building';}},
11819
{name:'Krumblor, cookie dragon',action:'Train secondary aura<br><small>Lets you use two dragon auras simultaneously</small>',pic:7,
11820
cost:function(){var fail=0;for (var i in Game.Objects){if (Game.Objects[i].amount<200) fail=1;}return (fail==0);},
11821
buy:function(){for (var i in Game.Objects){Game.Objects[i].sacrifice(200);}},
11822
costStr:function(){return '200 of every building';}},
11823
{name:'Krumblor, cookie dragon',action:'Your dragon is fully trained.',pic:8}
11824
];
11825
11826
Game.dragonAuras={
11827
0:{name:'No aura',pic:[0,7],desc:'Select an aura from those your dragon knows.'},
11828
1:{name:'Breath of Milk',pic:[18,25],desc:'Kittens are <b>5%</b> more effective.'},
11829
2:{name:'Dragon Cursor',pic:[0,25],desc:'Clicking is <b>5%</b> more effective.'},
11830
3:{name:'Elder Battalion',pic:[1,25],desc:'Grandmas gain <b>+1% CpS</b> for every non-grandma building.'},
11831
4:{name:'Reaper of Fields',pic:[2,25],desc:'Golden cookies may trigger a <b>Dragon Harvest</b>.'},
11832
5:{name:'Earth Shatterer',pic:[3,25],desc:'Buildings sell back for <b>50%</b> instead of 25%.'},
11833
6:{name:'Master of the Armory',pic:[4,25],desc:'All upgrades are <b>2%</b> cheaper.'},
11834
7:{name:'Fierce Hoarder',pic:[15,25],desc:'All buildings are <b>2%</b> cheaper.'},
11835
8:{name:'Dragon God',pic:[16,25],desc:'Prestige CpS bonus <b>+5%</b>.'},
11836
9:{name:'Arcane Aura',pic:[17,25],desc:'Golden cookies appear <b>+5%</b> more often.'},
11837
10:{name:'Dragonflight',pic:[5,25],desc:'Golden cookies may trigger a <b>Dragonflight</b>.'},
11838
11:{name:'Ancestral Metamorphosis',pic:[6,25],desc:'Golden cookies give <b>10%</b> more cookies.'},
11839
12:{name:'Unholy Dominion',pic:[7,25],desc:'Wrath cookies give <b>10%</b> more cookies.'},
11840
13:{name:'Epoch Manipulator',pic:[8,25],desc:'Golden cookies last <b>5%</b> longer.'},
11841
14:{name:'Mind Over Matter',pic:[13,25],desc:'Random drops are <b>25% more common</b>.'},
11842
15:{name:'Radiant Appetite',pic:[14,25],desc:'All cookie production <b>multiplied by 2</b>.'},
11843
16:{name:'Dragon\'s Fortune',pic:[19,25],desc:'<b>+123% CpS</b> per golden cookie on-screen, multiplicative.'},
11844
17:{name:'Dragon\'s Curve',pic:[20,25],desc:'<b>+5% sugar lump growth</b> and sugar lumps are <b>twice as likely</b> to be unusual.'},
11845
18:{name:'Reality Bending',pic:[32,25],desc:'<b>One tenth</b> of every other dragon aura, <b>combined</b>.'},
11846
};
11847
11848
Game.hasAura=function(what)
11849
{
11850
if (Game.dragonAuras[Game.dragonAura].name==what || Game.dragonAuras[Game.dragonAura2].name==what) return true; else return false;
11851
}
11852
Game.auraMult=function(what)
11853
{
11854
var n=0;
11855
if (Game.dragonAuras[Game.dragonAura].name==what || Game.dragonAuras[Game.dragonAura2].name==what) n=1;
11856
if (Game.dragonAuras[Game.dragonAura].name=='Reality Bending' || Game.dragonAuras[Game.dragonAura2].name=='Reality Bending') n+=0.1;
11857
return n;
11858
}
11859
11860
Game.SelectDragonAura=function(slot,update)
11861
{
11862
var currentAura=0;
11863
var otherAura=0;
11864
if (slot==0) currentAura=Game.dragonAura; else currentAura=Game.dragonAura2;
11865
if (slot==0) otherAura=Game.dragonAura2; else otherAura=Game.dragonAura;
11866
if (!update) Game.SelectingDragonAura=currentAura;
11867
11868
var str='';
11869
for (var i in Game.dragonAuras)
11870
{
11871
if (Game.dragonLevel>=parseInt(i)+4)
11872
{
11873
var icon=Game.dragonAuras[i].pic;
11874
if (i==0 || i!=otherAura) str+='<div class="crate enabled'+(i==Game.SelectingDragonAura?' highlighted':'')+'" style="opacity:1;float:none;display:inline-block;'+(icon[2]?'background-image:url('+icon[2]+');':'')+'background-position:'+(-icon[0]*48)+'px '+(-icon[1]*48)+'px;" '+Game.clickStr+'="PlaySound(\'snd/tick.mp3\');Game.SetDragonAura('+i+','+slot+');" onMouseOut="Game.DescribeDragonAura('+Game.SelectingDragonAura+');" onMouseOver="Game.DescribeDragonAura('+i+');"'+
11875
'></div>';
11876
}
11877
}
11878
11879
var highestBuilding=0;
11880
for (var i in Game.Objects) {if (Game.Objects[i].amount>0) highestBuilding=Game.Objects[i];}
11881
11882
Game.Prompt('<h3>Set your dragon\'s '+(slot==1?'secondary ':'')+'aura</h3>'+
11883
'<div class="line"></div>'+
11884
'<div id="dragonAuraInfo" style="min-height:60px;"></div>'+
11885
'<div style="text-align:center;">'+str+'</div>'+
11886
'<div class="line"></div>'+
11887
'<div style="text-align:center;margin-bottom:8px;">'+(highestBuilding==0?'Switching your aura is <b>free</b> because you own no buildings.':'The cost of switching your aura is <b>1 '+highestBuilding.name+'</b>.<br>This will affect your CpS!')+'</div>'
11888
,[['Confirm',(slot==0?'Game.dragonAura':'Game.dragonAura2')+'=Game.SelectingDragonAura;'+(highestBuilding==0 || currentAura==Game.SelectingDragonAura?'':'Game.ObjectsById['+highestBuilding.id+'].sacrifice(1);')+'Game.ToggleSpecialMenu(1);Game.ClosePrompt();'],'Cancel'],0,'widePrompt');
11889
Game.DescribeDragonAura(Game.SelectingDragonAura);
11890
}
11891
Game.SelectingDragonAura=-1;
11892
Game.SetDragonAura=function(aura,slot)
11893
{
11894
Game.SelectingDragonAura=aura;
11895
Game.SelectDragonAura(slot,1);
11896
}
11897
Game.DescribeDragonAura=function(aura)
11898
{
11899
l('dragonAuraInfo').innerHTML=
11900
'<div style="min-width:200px;text-align:center;"><h4>'+Game.dragonAuras[aura].name+'</h4>'+
11901
'<div class="line"></div>'+
11902
Game.dragonAuras[aura].desc+
11903
'</div>';
11904
}
11905
11906
Game.UpgradeDragon=function()
11907
{
11908
if (Game.dragonLevel<Game.dragonLevels.length-1 && Game.dragonLevels[Game.dragonLevel].cost())
11909
{
11910
PlaySound('snd/shimmerClick.mp3');
11911
Game.dragonLevels[Game.dragonLevel].buy();
11912
Game.dragonLevel=(Game.dragonLevel+1)%Game.dragonLevels.length;
11913
11914
if (Game.dragonLevel>=Game.dragonLevels.length-1) Game.Win('Here be dragon');
11915
Game.ToggleSpecialMenu(1);
11916
if (l('specialPic')){var rect=l('specialPic').getBoundingClientRect();Game.SparkleAt((rect.left+rect.right)/2,(rect.top+rect.bottom)/2);}
11917
Game.recalculateGains=1;
11918
Game.upgradesToRebuild=1;
11919
}
11920
}
11921
11922
Game.ToggleSpecialMenu=function(on)
11923
{
11924
if (on)
11925
{
11926
var pic='';
11927
var frame=0;
11928
if (Game.specialTab=='santa') {pic='santa.png';frame=Game.santaLevel;}
11929
else if (Game.specialTab=='dragon') {pic='dragon.png?v='+Game.version;frame=Game.dragonLevels[Game.dragonLevel].pic;}
11930
else {pic='dragon.png?v='+Game.version;frame=4;}
11931
11932
var str='<div id="specialPic" style="position:absolute;left:-16px;top:-64px;width:96px;height:96px;background:url(img/'+pic+');background-position:'+(-frame*96)+'px 0px;filter:drop-shadow(0px 3px 2px #000);-webkit-filter:drop-shadow(0px 3px 2px #000);"></div>';
11933
str+='<div class="close" onclick="PlaySound(\'snd/press.mp3\');Game.ToggleSpecialMenu(0);">x</div>';
11934
11935
if (Game.specialTab=='santa')
11936
{
11937
var moni=Math.pow(Game.santaLevel+1,Game.santaLevel+1);
11938
11939
str+='<h3>'+Game.santaLevels[Game.santaLevel]+'</h3>';
11940
if (Game.santaLevel<14)
11941
{
11942
str+='<div class="line"></div>'+
11943
'<div class="optionBox" style="margin-bottom:0px;"><a class="option framed large title" '+Game.clickStr+'="Game.UpgradeSanta();">'+
11944
'<div style="display:table-cell;vertical-align:middle;">Evolve</div>'+
11945
'<div style="display:table-cell;vertical-align:middle;padding:4px 12px;">|</div>'+
11946
'<div style="display:table-cell;vertical-align:middle;font-size:65%;">cost :<div'+(Game.cookies>moni?'':' style="color:#777;"')+'>'+Beautify(Math.pow(Game.santaLevel+1,Game.santaLevel+1))+' '+(Game.santaLevel>0?'cookies':'cookie')+'</div></div>'+
11947
'</a></div>';
11948
}
11949
}
11950
else if (Game.specialTab=='dragon')
11951
{
11952
var level=Game.dragonLevels[Game.dragonLevel];
11953
11954
str+='<h3>'+level.name+'</h3>';
11955
11956
if (Game.dragonLevel>=5)
11957
{
11958
var icon=Game.dragonAuras[Game.dragonAura].pic;
11959
str+='<div class="crate enabled" style="opacity:1;position:absolute;right:18px;top:-58px;'+(icon[2]?'background-image:url('+icon[2]+');':'')+'background-position:'+(-icon[0]*48)+'px '+(-icon[1]*48)+'px;" '+Game.clickStr+'="PlaySound(\'snd/tick.mp3\');Game.SelectDragonAura(0);" '+Game.getTooltip(
11960
'<div style="min-width:200px;text-align:center;"><h4>'+Game.dragonAuras[Game.dragonAura].name+'</h4>'+
11961
'<div class="line"></div>'+
11962
Game.dragonAuras[Game.dragonAura].desc+
11963
'</div>'
11964
,'top')+
11965
'></div>';
11966
}
11967
if (Game.dragonLevel>=24)//2nd aura slot; increased with last building (javascript consoles)
11968
{
11969
var icon=Game.dragonAuras[Game.dragonAura2].pic;
11970
str+='<div class="crate enabled" style="opacity:1;position:absolute;right:80px;top:-58px;'+(icon[2]?'background-image:url('+icon[2]+');':'')+'background-position:'+(-icon[0]*48)+'px '+(-icon[1]*48)+'px;" '+Game.clickStr+'="PlaySound(\'snd/tick.mp3\');Game.SelectDragonAura(1);" '+Game.getTooltip(
11971
'<div style="min-width:200px;text-align:center;"><h4>'+Game.dragonAuras[Game.dragonAura2].name+'</h4>'+
11972
'<div class="line"></div>'+
11973
Game.dragonAuras[Game.dragonAura2].desc+
11974
'</div>'
11975
,'top')+
11976
'></div>';
11977
}
11978
11979
if (Game.dragonLevel<Game.dragonLevels.length-1)
11980
{
11981
str+='<div class="line"></div>'+
11982
'<div class="optionBox" style="margin-bottom:0px;"><a class="option framed large title" '+Game.clickStr+'="Game.UpgradeDragon();">'+
11983
'<div style="display:table-cell;vertical-align:middle;">'+level.action+'</div>'+
11984
'<div style="display:table-cell;vertical-align:middle;padding:4px 12px;">|</div>'+
11985
'<div style="display:table-cell;vertical-align:middle;font-size:65%;">sacrifice<div'+(level.cost()?'':' style="color:#777;"')+'>'+level.costStr()+'</div></div>'+
11986
'</a></div>';
11987
}
11988
else
11989
{
11990
str+='<div class="line"></div>'+
11991
'<div style="text-align:center;margin-bottom:4px;">'+level.action+'</div>';
11992
}
11993
}
11994
11995
l('specialPopup').innerHTML=str;
11996
11997
l('specialPopup').className='framed prompt onScreen';
11998
}
11999
else
12000
{
12001
if (Game.specialTab!='')
12002
{
12003
Game.specialTab='';
12004
l('specialPopup').className='framed prompt offScreen';
12005
setTimeout(function(){if (Game.specialTab=='') {/*l('specialPopup').style.display='none';*/l('specialPopup').innerHTML='';}},1000*0.2);
12006
}
12007
}
12008
}
12009
Game.DrawSpecial=function()
12010
{
12011
var len=Game.specialTabs.length;
12012
if (len==0) return;
12013
Game.LeftBackground.globalAlpha=1;
12014
var y=Game.LeftBackground.canvas.height-24-48*len;
12015
var tabI=0;
12016
12017
for (var i in Game.specialTabs)
12018
{
12019
var selected=0;
12020
var hovered=0;
12021
if (Game.specialTab==Game.specialTabs[i]) selected=1;
12022
if (Game.specialTabHovered==Game.specialTabs[i]) hovered=1;
12023
var x=24;
12024
var s=1;
12025
var pic='';
12026
var frame=0;
12027
if (hovered) {s=1;x=24;}
12028
if (selected) {s=1;x=48;}
12029
12030
if (Game.specialTabs[i]=='santa') {pic='santa.png';frame=Game.santaLevel;}
12031
else if (Game.specialTabs[i]=='dragon') {pic='dragon.png?v='+Game.version;frame=Game.dragonLevels[Game.dragonLevel].pic;}
12032
else {pic='dragon.png?v='+Game.version;frame=4;}
12033
12034
if (hovered || selected)
12035
{
12036
var ss=s*64;
12037
var r=Math.floor((Game.T*0.5)%360);
12038
Game.LeftBackground.save();
12039
Game.LeftBackground.translate(x,y);
12040
if (Game.prefs.fancy) Game.LeftBackground.rotate((r/360)*Math.PI*2);
12041
Game.LeftBackground.globalAlpha=0.75;
12042
Game.LeftBackground.drawImage(Pic('shine.png'),-ss/2,-ss/2,ss,ss);
12043
Game.LeftBackground.restore();
12044
}
12045
12046
if (Game.prefs.fancy) Game.LeftBackground.drawImage(Pic(pic),96*frame,0,96,96,(x+(selected?0:Math.sin(Game.T*0.2+tabI)*3)-24*s),(y-(selected?6:Math.abs(Math.cos(Game.T*0.2+tabI))*6)-24*s),48*s,48*s);
12047
else Game.LeftBackground.drawImage(Pic(pic),96*frame,0,96,96,(x-24*s),(y-24*s),48*s,48*s);
12048
12049
tabI++;
12050
y+=48;
12051
}
12052
12053
}
12054
12055
/*=====================================================================================
12056
VISUAL EFFECTS
12057
=======================================================================================*/
12058
12059
Game.Milks=[
12060
{name:'Rank I - Plain milk',pic:'milkPlain',icon:[1,8]},
12061
{name:'Rank II - Chocolate milk',pic:'milkChocolate',icon:[2,8]},
12062
{name:'Rank III - Raspberry milk',pic:'milkRaspberry',icon:[3,8]},
12063
{name:'Rank IV - Orange milk',pic:'milkOrange',icon:[4,8]},
12064
{name:'Rank V - Caramel milk',pic:'milkCaramel',icon:[5,8]},
12065
{name:'Rank VI - Banana milk',pic:'milkBanana',icon:[6,8]},
12066
{name:'Rank VII - Lime milk',pic:'milkLime',icon:[7,8]},
12067
{name:'Rank VIII - Blueberry milk',pic:'milkBlueberry',icon:[8,8]},
12068
{name:'Rank IX - Strawberry milk',pic:'milkStrawberry',icon:[9,8]},
12069
{name:'Rank X - Vanilla milk',pic:'milkVanilla',icon:[10,8]},
12070
{name:'Rank XI - Honey milk',pic:'milkHoney',icon:[21,23]},
12071
{name:'Rank XII - Coffee milk',pic:'milkCoffee',icon:[22,23]},
12072
{name:'Rank XIII - Tea with a spot of milk',pic:'milkTea',icon:[23,23]},
12073
{name:'Rank XIV - Coconut milk',pic:'milkCoconut',icon:[24,23]},
12074
{name:'Rank XV - Cherry milk',pic:'milkCherry',icon:[25,23]},
12075
{name:'Rank XVI - Spiced milk',pic:'milkSpiced',icon:[26,23]},
12076
{name:'Rank XVII - Maple milk',pic:'milkMaple',icon:[28,23]},
12077
{name:'Rank XVIII - Mint milk',pic:'milkMint',icon:[29,23]},
12078
];
12079
Game.Milk=Game.Milks[0];
12080
12081
Game.mousePointer=0;//when 1, draw the mouse as a pointer on the left screen
12082
12083
Game.cookieOriginX=0;
12084
Game.cookieOriginY=0;
12085
Game.DrawBackground=function()
12086
{
12087
12088
Timer.clean();
12089
//background
12090
if (!Game.Background)//init some stuff
12091
{
12092
Game.Background=l('backgroundCanvas').getContext('2d');
12093
Game.Background.canvas.width=Game.Background.canvas.parentNode.offsetWidth;
12094
Game.Background.canvas.height=Game.Background.canvas.parentNode.offsetHeight;
12095
Game.LeftBackground=l('backgroundLeftCanvas').getContext('2d');
12096
Game.LeftBackground.canvas.width=Game.LeftBackground.canvas.parentNode.offsetWidth;
12097
Game.LeftBackground.canvas.height=Game.LeftBackground.canvas.parentNode.offsetHeight;
12098
//preload ascend animation bits so they show up instantly
12099
Game.LeftBackground.globalAlpha=0;
12100
Game.LeftBackground.drawImage(Pic('brokenCookie.png'),0,0);
12101
Game.LeftBackground.drawImage(Pic('brokenCookieHalo.png'),0,0);
12102
Game.LeftBackground.drawImage(Pic('starbg.jpg'),0,0);
12103
12104
window.addEventListener('resize', function(event)
12105
{
12106
Game.Background.canvas.width=Game.Background.canvas.parentNode.offsetWidth;
12107
Game.Background.canvas.height=Game.Background.canvas.parentNode.offsetHeight;
12108
Game.LeftBackground.canvas.width=Game.LeftBackground.canvas.parentNode.offsetWidth;
12109
Game.LeftBackground.canvas.height=Game.LeftBackground.canvas.parentNode.offsetHeight;
12110
});
12111
}
12112
12113
var ctx=Game.LeftBackground;
12114
12115
if (Game.OnAscend)
12116
{
12117
Timer.clean();
12118
//starry background on ascend screen
12119
var w=Game.Background.canvas.width;
12120
var h=Game.Background.canvas.height;
12121
var b=Game.ascendl.getBoundingClientRect();
12122
var x=(b.left+b.right)/2;
12123
var y=(b.top+b.bottom)/2;
12124
Game.Background.globalAlpha=0.5;
12125
var s=1*Game.AscendZoom*(1+Math.cos(Game.T*0.0027)*0.05);
12126
Game.Background.fillPattern(Pic('starbg.jpg'),0,0,w,h,1024*s,1024*s,x+Game.AscendOffX*0.25*s,y+Game.AscendOffY*0.25*s);
12127
Timer.track('star layer 1');
12128
if (Game.prefs.fancy)
12129
{
12130
//additional star layer
12131
Game.Background.globalAlpha=0.5*(0.5+Math.sin(Game.T*0.02)*0.3);
12132
var s=2*Game.AscendZoom*(1+Math.sin(Game.T*0.002)*0.07);
12133
//Game.Background.globalCompositeOperation='lighter';
12134
Game.Background.fillPattern(Pic('starbg.jpg'),0,0,w,h,1024*s,1024*s,x+Game.AscendOffX*0.25*s,y+Game.AscendOffY*0.25*s);
12135
//Game.Background.globalCompositeOperation='source-over';
12136
Timer.track('star layer 2');
12137
12138
x=x+Game.AscendOffX*Game.AscendZoom;
12139
y=y+Game.AscendOffY*Game.AscendZoom;
12140
//wispy nebula around the center
12141
Game.Background.save();
12142
Game.Background.globalAlpha=0.5;
12143
Game.Background.translate(x,y);
12144
Game.Background.globalCompositeOperation='lighter';
12145
Game.Background.rotate(Game.T*0.001);
12146
s=(600+150*Math.sin(Game.T*0.007))*Game.AscendZoom;
12147
Game.Background.drawImage(Pic('heavenRing1.jpg'),-s/2,-s/2,s,s);
12148
Game.Background.rotate(-Game.T*0.0017);
12149
s=(600+150*Math.sin(Game.T*0.0037))*Game.AscendZoom;
12150
Game.Background.drawImage(Pic('heavenRing2.jpg'),-s/2,-s/2,s,s);
12151
Game.Background.restore();
12152
Timer.track('nebula');
12153
12154
/*
12155
//links between upgrades
12156
//not in because I am bad at this
12157
Game.Background.globalAlpha=1;
12158
Game.Background.save();
12159
Game.Background.translate(x,y);
12160
s=(32)*Game.AscendZoom;
12161
12162
for (var i in Game.PrestigeUpgrades)
12163
{
12164
var me=Game.PrestigeUpgrades[i];
12165
var ghosted=0;
12166
if (me.canBePurchased || Game.Has('Neuromancy')){}
12167
else
12168
{
12169
for (var ii in me.parents){if (me.parents[ii]!=-1 && me.parents[ii].canBePurchased) ghosted=1;}
12170
}
12171
for (var ii in me.parents)//create pulsing links
12172
{
12173
if (me.parents[ii]!=-1 && (me.canBePurchased || ghosted))
12174
{
12175
var origX=0;
12176
var origY=0;
12177
var targX=me.posX+28;
12178
var targY=me.posY+28;
12179
if (me.parents[ii]!=-1) {origX=me.parents[ii].posX+28;origY=me.parents[ii].posY+28;}
12180
var rot=-Math.atan((targY-origY)/(origX-targX));
12181
if (targX<=origX) rot+=180;
12182
var dist=Math.floor(Math.sqrt((targX-origX)*(targX-origX)+(targY-origY)*(targY-origY)));
12183
origX+=2;
12184
origY-=18;
12185
//rot=-(Math.PI/2)*(me.id%4);
12186
Game.Background.translate(origX,origY);
12187
Game.Background.rotate(rot);
12188
//Game.Background.drawImage(Pic('linkPulse.png'),-s/2,-s/2,s,s);
12189
Game.Background.fillPattern(Pic('linkPulse.png'),0,-4,dist,8,32,8);
12190
Game.Background.rotate(-rot);
12191
Game.Background.translate(-origX,-origY);
12192
}
12193
}
12194
}
12195
Game.Background.restore();
12196
Timer.track('links');
12197
*/
12198
12199
//Game.Background.drawImage(Pic('shadedBorders.png'),0,0,w,h);
12200
//Timer.track('border');
12201
}
12202
}
12203
else
12204
{
12205
12206
var goodBuff=0;
12207
var badBuff=0;
12208
for (var i in Game.buffs)
12209
{
12210
if (Game.buffs[i].aura==1) goodBuff=1;
12211
if (Game.buffs[i].aura==2) badBuff=1;
12212
}
12213
12214
if (Game.drawT%5==0)
12215
{
12216
Game.defaultBg='bgBlue';
12217
Game.bgR=0;
12218
12219
if (Game.season=='fools') Game.defaultBg='bgMoney';
12220
if (Game.elderWrathD<1)
12221
{
12222
Game.bgR=0;
12223
Game.bg=Game.defaultBg;
12224
Game.bgFade=Game.defaultBg;
12225
}
12226
else if (Game.elderWrathD>=1 && Game.elderWrathD<2)
12227
{
12228
Game.bgR=(Game.elderWrathD-1)/1;
12229
Game.bg=Game.defaultBg;
12230
Game.bgFade='grandmas1';
12231
}
12232
else if (Game.elderWrathD>=2 && Game.elderWrathD<3)
12233
{
12234
Game.bgR=(Game.elderWrathD-2)/1;
12235
Game.bg='grandmas1';
12236
Game.bgFade='grandmas2';
12237
}
12238
else if (Game.elderWrathD>=3)// && Game.elderWrathD<4)
12239
{
12240
Game.bgR=(Game.elderWrathD-3)/1;
12241
Game.bg='grandmas2';
12242
Game.bgFade='grandmas3';
12243
}
12244
12245
if (Game.bgType!=0 && Game.ascensionMode!=1)
12246
{
12247
Game.bgR=0;
12248
Game.bg=Game.BGsByChoice[Game.bgType].pic;
12249
Game.bgFade=Game.bg;
12250
}
12251
12252
Game.Background.fillPattern(Pic(Game.bg+'.jpg'),0,0,Game.Background.canvas.width,Game.Background.canvas.height,512,512,0,0);
12253
if (Game.bgR>0)
12254
{
12255
Game.Background.globalAlpha=Game.bgR;
12256
Game.Background.fillPattern(Pic(Game.bgFade+'.jpg'),0,0,Game.Background.canvas.width,Game.Background.canvas.height,512,512,0,0);
12257
}
12258
Game.Background.globalAlpha=1;
12259
Game.Background.drawImage(Pic('shadedBordersSoft.png'),0,0,Game.Background.canvas.width,Game.Background.canvas.height);
12260
12261
}
12262
Timer.track('window background');
12263
12264
//clear
12265
ctx.clearRect(0,0,ctx.canvas.width,ctx.canvas.height);
12266
/*if (Game.AscendTimer<Game.AscendBreakpoint) ctx.clearRect(0,0,ctx.canvas.width,ctx.canvas.height);
12267
else
12268
{
12269
ctx.globalAlpha=0.05;
12270
ctx.fillStyle='#000';
12271
ctx.fillRect(0,0,ctx.canvas.width,ctx.canvas.height);
12272
ctx.globalAlpha=1;
12273
OldCanvasDrawImage.apply(ctx,[ctx.canvas,Math.random()*4-2,Math.random()*4-2-4]);
12274
ctx.globalAlpha=1;
12275
}*/
12276
Timer.clean();
12277
12278
var showDragon=0;
12279
if (Game.hasBuff('Dragonflight') || Game.hasBuff('Dragon Harvest')) showDragon=1;
12280
12281
Game.cookieOriginX=Math.floor(ctx.canvas.width/2);
12282
Game.cookieOriginY=Math.floor(ctx.canvas.height*0.4);
12283
12284
if (Game.AscendTimer==0)
12285
{
12286
if (Game.prefs.particles)
12287
{
12288
//falling cookies
12289
var pic='';
12290
var opacity=1;
12291
if (Game.elderWrathD<=1.5)
12292
{
12293
if (Game.cookiesPs>=1000) pic='cookieShower3.png';
12294
else if (Game.cookiesPs>=500) pic='cookieShower2.png';
12295
else if (Game.cookiesPs>=50) pic='cookieShower1.png';
12296
else pic='';
12297
}
12298
if (pic!='')
12299
{
12300
if (Game.elderWrathD>=1) opacity=1-((Math.min(Game.elderWrathD,1.5)-1)/0.5);
12301
ctx.globalAlpha=opacity;
12302
var y=(Math.floor(Game.T*2)%512);
12303
ctx.fillPattern(Pic(pic),0,0,ctx.canvas.width,ctx.canvas.height+512,512,512,0,y);
12304
ctx.globalAlpha=1;
12305
}
12306
//snow
12307
if (Game.season=='christmas')
12308
{
12309
var y=(Math.floor(Game.T*2.5)%512);
12310
ctx.globalAlpha=0.75;
12311
ctx.globalCompositeOperation='lighter';
12312
ctx.fillPattern(Pic('snow2.jpg'),0,0,ctx.canvas.width,ctx.canvas.height+512,512,512,0,y);
12313
ctx.globalCompositeOperation='source-over';
12314
ctx.globalAlpha=1;
12315
}
12316
//hearts
12317
if (Game.season=='valentines')
12318
{
12319
var y=(Math.floor(Game.T*2.5)%512);
12320
ctx.globalAlpha=1;
12321
ctx.fillPattern(Pic('heartStorm.png'),0,0,ctx.canvas.width,ctx.canvas.height+512,512,512,0,y);
12322
ctx.globalAlpha=1;
12323
}
12324
Timer.track('left background');
12325
12326
Game.particlesDraw(0);
12327
ctx.globalAlpha=1;
12328
Timer.track('particles');
12329
12330
//big cookie shine
12331
var s=512;
12332
12333
var x=Game.cookieOriginX;
12334
var y=Game.cookieOriginY;
12335
12336
var r=Math.floor((Game.T*0.5)%360);
12337
ctx.save();
12338
ctx.translate(x,y);
12339
ctx.rotate((r/360)*Math.PI*2);
12340
var alphaMult=1;
12341
if (Game.bgType==2 || Game.bgType==4) alphaMult=0.5;
12342
var pic='shine.png';
12343
if (goodBuff) {pic='shineGold.png';alphaMult=1;}
12344
else if (badBuff) {pic='shineRed.png';alphaMult=1;}
12345
if (goodBuff && Game.prefs.fancy) ctx.globalCompositeOperation='lighter';
12346
ctx.globalAlpha=0.5*alphaMult;
12347
ctx.drawImage(Pic(pic),-s/2,-s/2,s,s);
12348
ctx.rotate((-r*2/360)*Math.PI*2);
12349
ctx.globalAlpha=0.25*alphaMult;
12350
ctx.drawImage(Pic(pic),-s/2,-s/2,s,s);
12351
ctx.restore();
12352
Timer.track('shine');
12353
12354
if (Game.ReincarnateTimer>0)
12355
{
12356
ctx.globalAlpha=1-Game.ReincarnateTimer/Game.ReincarnateDuration;
12357
ctx.fillStyle='#000';
12358
ctx.fillRect(0,0,ctx.canvas.width,ctx.canvas.height);
12359
ctx.globalAlpha=1;
12360
}
12361
12362
if (showDragon)
12363
{
12364
//big dragon
12365
var s=300*2*(1+Math.sin(Game.T*0.013)*0.1);
12366
var x=Game.cookieOriginX-s/2;
12367
var y=Game.cookieOriginY-s/(1.4+0.2*Math.sin(Game.T*0.01));
12368
ctx.drawImage(Pic('dragonBG.png'),x,y,s,s);
12369
}
12370
12371
//big cookie
12372
if (false)//don't do that
12373
{
12374
ctx.globalAlpha=1;
12375
var amount=Math.floor(Game.cookies).toString();
12376
var digits=amount.length;
12377
var space=0;
12378
for (var i=0;i<digits;i++)
12379
{
12380
var s=16*(digits-i);
12381
var num=parseInt(amount[i]);
12382
if (i>0) space-=s*(1-num/10)/2;
12383
if (i==0 && num>1) space+=s*0.1;
12384
for (var ii=0;ii<num;ii++)
12385
{
12386
var x=Game.cookieOriginX;
12387
var y=Game.cookieOriginY;
12388
var spin=Game.T*(0.005+i*0.001)+i+(ii/num)*Math.PI*2;
12389
x+=Math.sin(spin)*space;
12390
y+=Math.cos(spin)*space;
12391
ctx.drawImage(Pic('perfectCookie.png'),x-s/2,y-s/2,s,s);
12392
}
12393
space+=s/2;
12394
}
12395
}
12396
else
12397
{
12398
ctx.globalAlpha=1;
12399
var s=256*Game.BigCookieSize;
12400
var x=Game.cookieOriginX;
12401
var y=Game.cookieOriginY;
12402
ctx.save();
12403
ctx.translate(x,y);
12404
if (Game.season=='easter')
12405
{
12406
var nestW=304*0.98*Game.BigCookieSize;
12407
var nestH=161*0.98*Game.BigCookieSize;
12408
ctx.drawImage(Pic('nest.png'),-nestW/2,-nestH/2+130,nestW,nestH);
12409
}
12410
//ctx.rotate(((Game.startDate%360)/360)*Math.PI*2);
12411
ctx.drawImage(Pic('perfectCookie.png'),-s/2,-s/2,s,s);
12412
12413
if (goodBuff && Game.prefs.particles)//sparkle
12414
{
12415
ctx.globalCompositeOperation='lighter';
12416
for (var i=0;i<1;i++)
12417
{
12418
ctx.globalAlpha=Math.random()*0.65+0.1;
12419
var size=Math.random()*30+5;
12420
var a=Math.random()*Math.PI*2;
12421
var d=s*0.9*Math.random()/2;
12422
ctx.drawImage(Pic('glint.jpg'),-size/2+Math.sin(a)*d,-size/2+Math.cos(a)*d,size,size);
12423
}
12424
}
12425
12426
ctx.restore();
12427
Timer.track('big cookie');
12428
}
12429
}
12430
else//no particles
12431
{
12432
//big cookie shine
12433
var s=512;
12434
var x=Game.cookieOriginX-s/2;
12435
var y=Game.cookieOriginY-s/2;
12436
ctx.globalAlpha=0.5;
12437
ctx.drawImage(Pic('shine.png'),x,y,s,s);
12438
12439
if (showDragon)
12440
{
12441
//big dragon
12442
var s=300*2*(1+Math.sin(Game.T*0.013)*0.1);
12443
var x=Game.cookieOriginX-s/2;
12444
var y=Game.cookieOriginY-s/(1.4+0.2*Math.sin(Game.T*0.01));
12445
ctx.drawImage(Pic('dragonBG.png'),x,y,s,s);
12446
}
12447
12448
//big cookie
12449
ctx.globalAlpha=1;
12450
var s=256*Game.BigCookieSize;
12451
var x=Game.cookieOriginX-s/2;
12452
var y=Game.cookieOriginY-s/2;
12453
ctx.drawImage(Pic('perfectCookie.png'),x,y,s,s);
12454
}
12455
12456
//cursors
12457
if (Game.prefs.cursors)
12458
{
12459
ctx.save();
12460
ctx.translate(Game.cookieOriginX,Game.cookieOriginY);
12461
var pic=Pic('cursor.png');
12462
var fancy=Game.prefs.fancy;
12463
12464
if (showDragon) ctx.globalAlpha=0.25;
12465
var amount=Game.Objects['Cursor'].amount;
12466
//var spe=-1;
12467
for (var i=0;i<amount;i++)
12468
{
12469
var n=Math.floor(i/50);
12470
//var a=((i+0.5*n)%50)/50;
12471
var w=0;
12472
if (fancy) w=(Math.sin(Game.T*0.025+(((i+n*12)%25)/25)*Math.PI*2));
12473
if (w>0.997) w=1.5;
12474
else if (w>0.994) w=0.5;
12475
else w=0;
12476
w*=-4;
12477
if (fancy) w+=Math.sin((n+Game.T*0.01)*Math.PI/2)*4;
12478
var x=0;
12479
var y=(140/* *Game.BigCookieSize*/+n*16+w)-16;
12480
12481
var rot=7.2;//(1/50)*360
12482
if (i==0 && fancy) rot-=Game.T*0.1;
12483
if (i%50==0) rot+=7.2/2;
12484
ctx.rotate((rot/360)*Math.PI*2);
12485
ctx.drawImage(pic,0,0,32,32,x,y,32,32);
12486
//ctx.drawImage(pic,32*(i==spe),0,32,32,x,y,32,32);
12487
12488
/*if (i==spe)
12489
{
12490
y+=16;
12491
x=Game.cookieOriginX+Math.sin(-((r-5)/360)*Math.PI*2)*y;
12492
y=Game.cookieOriginY+Math.cos(-((r-5)/360)*Math.PI*2)*y;
12493
if (Game.CanClick && ctx && Math.abs(Game.mouseX-x)<16 && Math.abs(Game.mouseY-y)<16) Game.mousePointer=1;
12494
}*/
12495
}
12496
ctx.restore();
12497
Timer.track('cursors');
12498
}
12499
}
12500
else
12501
{
12502
var tBase=Math.max(0,(Game.AscendTimer-Game.AscendBreakpoint)/(Game.AscendDuration-Game.AscendBreakpoint));
12503
//big crumbling cookie
12504
//var t=(3*Math.pow(tBase,2)-2*Math.pow(tBase,3));//S curve
12505
var t=Math.pow(tBase,0.5);
12506
12507
var shake=0;
12508
if (Game.AscendTimer<Game.AscendBreakpoint) {shake=Game.AscendTimer/Game.AscendBreakpoint;}
12509
//else {shake=1-t;}
12510
12511
ctx.globalAlpha=1;
12512
12513
var x=Game.cookieOriginX;
12514
var y=Game.cookieOriginY;
12515
12516
x+=(Math.random()*2-1)*10*shake;
12517
y+=(Math.random()*2-1)*10*shake;
12518
12519
var s=1;
12520
if (tBase>0)
12521
{
12522
ctx.save();
12523
ctx.globalAlpha=1-Math.pow(t,0.5);
12524
ctx.translate(x,y);
12525
ctx.globalCompositeOperation='lighter';
12526
ctx.rotate(Game.T*0.007);
12527
s=0.5+Math.pow(tBase,0.6)*1;
12528
var s2=(600)*s;
12529
ctx.drawImage(Pic('heavenRing1.jpg'),-s2/2,-s2/2,s2,s2);
12530
ctx.rotate(-Game.T*0.002);
12531
s=0.5+Math.pow(1-tBase,0.4)*1;
12532
s2=(600)*s;
12533
ctx.drawImage(Pic('heavenRing2.jpg'),-s2/2,-s2/2,s2,s2);
12534
ctx.restore();
12535
}
12536
12537
s=256;//*Game.BigCookieSize;
12538
12539
ctx.save();
12540
ctx.translate(x,y);
12541
ctx.rotate((t*(-0.1))*Math.PI*2);
12542
12543
var chunks={0:7,1:6,2:3,3:2,4:8,5:1,6:9,7:5,8:0,9:4};
12544
s*=t/2+1;
12545
/*ctx.globalAlpha=(1-t)*0.33;
12546
for (var i=0;i<10;i++)
12547
{
12548
var d=(t-0.2)*(80+((i+2)%3)*40);
12549
ctx.drawImage(Pic('brokenCookie.png'),256*(chunks[i]),0,256,256,-s/2+Math.sin(-(((chunks[i]+4)%10)/10)*Math.PI*2)*d,-s/2+Math.cos(-(((chunks[i]+4)%10)/10)*Math.PI*2)*d,s,s);
12550
}
12551
ctx.globalAlpha=(1-t)*0.66;
12552
for (var i=0;i<10;i++)
12553
{
12554
var d=(t-0.1)*(80+((i+2)%3)*40);
12555
ctx.drawImage(Pic('brokenCookie.png'),256*(chunks[i]),0,256,256,-s/2+Math.sin(-(((chunks[i]+4)%10)/10)*Math.PI*2)*d,-s/2+Math.cos(-(((chunks[i]+4)%10)/10)*Math.PI*2)*d,s,s);
12556
}*/
12557
ctx.globalAlpha=1-t;
12558
for (var i=0;i<10;i++)
12559
{
12560
var d=(t)*(80+((i+2)%3)*40);
12561
var x2=(Math.random()*2-1)*5*shake;
12562
var y2=(Math.random()*2-1)*5*shake;
12563
ctx.drawImage(Pic('brokenCookie.png'),256*(chunks[i]),0,256,256,-s/2+Math.sin(-(((chunks[i]+4)%10)/10)*Math.PI*2)*d+x2,-s/2+Math.cos(-(((chunks[i]+4)%10)/10)*Math.PI*2)*d+y2,s,s);
12564
}
12565
var brokenHalo=1-Math.min(t/(1/3),1/3)*3;
12566
if (Game.AscendTimer<Game.AscendBreakpoint) brokenHalo=Game.AscendTimer/Game.AscendBreakpoint;
12567
ctx.globalAlpha=brokenHalo;
12568
ctx.drawImage(Pic('brokenCookieHalo.png'),-s/1.3333,-s/1.3333,s*1.5,s*1.5);
12569
12570
ctx.restore();
12571
12572
//flares
12573
var n=9;
12574
var t=Game.AscendTimer/Game.AscendBreakpoint;
12575
if (Game.AscendTimer<Game.AscendBreakpoint)
12576
{
12577
ctx.save();
12578
ctx.translate(x,y);
12579
for (var i=0;i<n;i++)
12580
{
12581
if (Math.floor(t/3*n*3+i*2.7)%2)
12582
{
12583
var t2=Math.pow((t/3*n*3+i*2.7)%1,1.5);
12584
ctx.globalAlpha=(1-t)*(Game.drawT%2==0?0.5:1);
12585
var sw=(1-t2*0.5)*96;
12586
var sh=(0.5+t2*1.5)*96;
12587
ctx.drawImage(Pic('shineSpoke.png'),-sw/2,-sh-32-(1-t2)*256,sw,sh);
12588
}
12589
ctx.rotate(Math.PI*2/n);
12590
}
12591
ctx.restore();
12592
}
12593
12594
12595
//flash at breakpoint
12596
if (tBase<0.1 && tBase>0)
12597
{
12598
ctx.globalAlpha=1-tBase/0.1;
12599
ctx.fillStyle='#fff';
12600
ctx.fillRect(0,0,ctx.canvas.width,ctx.canvas.height);
12601
ctx.globalAlpha=1;
12602
}
12603
if (tBase>0.8)
12604
{
12605
ctx.globalAlpha=(tBase-0.8)/0.2;
12606
ctx.fillStyle='#000';
12607
ctx.fillRect(0,0,ctx.canvas.width,ctx.canvas.height);
12608
ctx.globalAlpha=1;
12609
}
12610
}
12611
12612
//milk and milk accessories
12613
if (Game.prefs.milk)
12614
{
12615
var width=ctx.canvas.width;
12616
var height=ctx.canvas.height;
12617
var x=Math.floor((Game.T*2-(Game.milkH-Game.milkHd)*2000+480*2)%480);//Math.floor((Game.T*2+Math.sin(Game.T*0.1)*2+Math.sin(Game.T*0.03)*2-(Game.milkH-Game.milkHd)*2000+480*2)%480);
12618
var y=(Game.milkHd)*height;//(((Game.milkHd)*ctx.canvas.height)*(1+0.05*(Math.sin(Game.T*0.017)/2+0.5)));
12619
var a=1;
12620
if (Game.AscendTimer>0)
12621
{
12622
y*=1-Math.pow((Game.AscendTimer/Game.AscendBreakpoint),2)*2;
12623
a*=1-Math.pow((Game.AscendTimer/Game.AscendBreakpoint),2)*2;
12624
}
12625
else if (Game.ReincarnateTimer>0)
12626
{
12627
y*=1-Math.pow(1-(Game.ReincarnateTimer/Game.ReincarnateDuration),2)*2;
12628
a*=1-Math.pow(1-(Game.ReincarnateTimer/Game.ReincarnateDuration),2)*2;
12629
}
12630
12631
if (Game.TOYS)
12632
{
12633
//golly
12634
if (!Game.Toy)
12635
{
12636
Game.toys=[];
12637
Game.toysType=choose([1,2]);
12638
Game.Toy=function(x,y)
12639
{
12640
this.id=Game.toys.length;
12641
this.x=x;
12642
this.y=y;
12643
this.xd=Math.random()*10-5;
12644
this.yd=Math.random()*10-5;
12645
this.r=Math.random()*Math.PI*2;
12646
this.rd=Math.random()*0.1-0.05;
12647
var v=Math.random();var a=0.5;var b=0.5;
12648
if (v<=a) v=b-b*Math.pow(1-v/a,3); else v=b+(1-b)*Math.pow((v-a)/(1-a),3);
12649
this.s=(Game.toysType==1?64:48)*(0.1+v*1.9);
12650
if (Game.toysType==2) this.s=(this.id%10==1)?96:48;
12651
this.st=this.s;this.s=0;
12652
var cookies=[[10,0]];
12653
for (var i in Game.Upgrades)
12654
{
12655
var cookie=Game.Upgrades[i];
12656
if (cookie.bought>0 && cookie.pool=='cookie') cookies.push(cookie.icon);
12657
}
12658
this.icon=choose(cookies);
12659
this.dragged=false;
12660
this.l=document.createElement('div');
12661
this.l.innerHTML=this.id;
12662
this.l.style.cssText='cursor:pointer;border-radius:'+(this.s/2)+'px;opacity:0;width:'+this.s+'px;height:'+this.s+'px;background:#999;position:absolute;left:0px;top:0px;z-index:10000000;transform:translate(-1000px,-1000px);';
12663
l('sectionLeft').appendChild(this.l);
12664
AddEvent(this.l,'mousedown',function(what){return function(){what.dragged=true;};}(this));
12665
AddEvent(this.l,'mouseup',function(what){return function(){what.dragged=false;};}(this));
12666
Game.toys.push(this);
12667
return this;
12668
}
12669
for (var i=0;i<Math.floor(Math.random()*15+(Game.toysType==1?5:30));i++)
12670
{
12671
new Game.Toy(Math.random()*width,Math.random()*height*0.3);
12672
}
12673
}
12674
ctx.globalAlpha=0.5;
12675
for (var i in Game.toys)
12676
{
12677
var me=Game.toys[i];
12678
ctx.save();
12679
ctx.translate(me.x,me.y);
12680
ctx.rotate(me.r);
12681
if (Game.toysType==1) ctx.drawImage(Pic('smallCookies.png'),(me.id%8)*64,0,64,64,-me.s/2,-me.s/2,me.s,me.s);
12682
else ctx.drawImage(Pic('icons.png'),me.icon[0]*48,me.icon[1]*48,48,48,-me.s/2,-me.s/2,me.s,me.s);
12683
ctx.restore();
12684
}
12685
ctx.globalAlpha=1;
12686
for (var i in Game.toys)
12687
{
12688
var me=Game.toys[i];
12689
//psst... not real physics
12690
for (var ii in Game.toys)
12691
{
12692
var it=Game.toys[ii];
12693
if (it.id!=me.id)
12694
{
12695
var x1=me.x+me.xd;
12696
var y1=me.y+me.yd;
12697
var x2=it.x+it.xd;
12698
var y2=it.y+it.yd;
12699
var dist=Math.sqrt(Math.pow((x1-x2),2)+Math.pow((y1-y2),2))/(me.s/2+it.s/2);
12700
if (dist<(Game.toysType==1?0.95:0.75))
12701
{
12702
var angle=Math.atan2(y1-y2,x1-x2);
12703
var v1=Math.sqrt(Math.pow((me.xd),2)+Math.pow((me.yd),2));
12704
var v2=Math.sqrt(Math.pow((it.xd),2)+Math.pow((it.yd),2));
12705
var v=((v1+v2)/2+dist)*0.75;
12706
var ratio=it.s/me.s;
12707
me.xd+=Math.sin(-angle+Math.PI/2)*v*(ratio);
12708
me.yd+=Math.cos(-angle+Math.PI/2)*v*(ratio);
12709
it.xd+=Math.sin(-angle-Math.PI/2)*v*(1/ratio);
12710
it.yd+=Math.cos(-angle-Math.PI/2)*v*(1/ratio);
12711
me.rd+=(Math.random()*1-0.5)*0.1*(ratio);
12712
it.rd+=(Math.random()*1-0.5)*0.1*(1/ratio);
12713
me.rd*=Math.min(1,v);
12714
it.rd*=Math.min(1,v);
12715
}
12716
}
12717
}
12718
if (me.y>=height-(Game.milkHd)*height+8)
12719
{
12720
me.xd*=0.85;
12721
me.yd*=0.85;
12722
me.rd*=0.85;
12723
me.yd-=1;
12724
me.xd+=(Math.random()*1-0.5)*0.3;
12725
me.yd+=(Math.random()*1-0.5)*0.05;
12726
me.rd+=(Math.random()*1-0.5)*0.02;
12727
}
12728
else
12729
{
12730
me.xd*=0.99;
12731
me.rd*=0.99;
12732
me.yd+=1;
12733
}
12734
me.yd*=(Math.min(1,Math.abs(me.y-(height-(Game.milkHd)*height)/16)));
12735
me.rd+=me.xd*0.01/(me.s/(Game.toysType==1?64:48));
12736
if (me.x<me.s/2 && me.xd<0) me.xd=Math.max(0.1,-me.xd*0.6); else if (me.x<me.s/2) {me.xd=0;me.x=me.s/2;}
12737
if (me.x>width-me.s/2 && me.xd>0) me.xd=Math.min(-0.1,-me.xd*0.6); else if (me.x>width-me.s/2) {me.xd=0;me.x=width-me.s/2;}
12738
me.xd=Math.min(Math.max(me.xd,-30),30);
12739
me.yd=Math.min(Math.max(me.yd,-30),30);
12740
me.rd=Math.min(Math.max(me.rd,-0.5),0.5);
12741
me.x+=me.xd;
12742
me.y+=me.yd;
12743
me.r+=me.rd;
12744
me.r=me.r%(Math.PI*2);
12745
me.s+=(me.st-me.s)*0.5;
12746
if (Game.toysType==2 && !me.dragged && Math.random()<0.003) me.st=choose([48,48,48,48,96]);
12747
if (me.dragged)
12748
{
12749
me.x=Game.mouseX;
12750
me.y=Game.mouseY;
12751
me.xd+=((Game.mouseX-Game.mouseX2)*3-me.xd)*0.5;
12752
me.yd+=((Game.mouseY-Game.mouseY2)*3-me.yd)*0.5
12753
me.l.style.transform='translate('+(me.x-me.s/2)+'px,'+(me.y-me.s/2)+'px) scale(50)';
12754
}
12755
else me.l.style.transform='translate('+(me.x-me.s/2)+'px,'+(me.y-me.s/2)+'px)';
12756
me.l.style.width=me.s+'px';
12757
me.l.style.height=me.s+'px';
12758
ctx.save();
12759
ctx.translate(me.x,me.y);
12760
ctx.rotate(me.r);
12761
if (Game.toysType==1) ctx.drawImage(Pic('smallCookies.png'),(me.id%8)*64,0,64,64,-me.s/2,-me.s/2,me.s,me.s);
12762
else ctx.drawImage(Pic('icons.png'),me.icon[0]*48,me.icon[1]*48,48,48,-me.s/2,-me.s/2,me.s,me.s);
12763
ctx.restore();
12764
}
12765
}
12766
12767
var pic=Game.Milk.pic;
12768
if (Game.milkType!=0 && Game.ascensionMode!=1) pic=Game.MilksByChoice[Game.milkType].pic;
12769
ctx.globalAlpha=0.9*a;
12770
ctx.fillPattern(Pic(pic+'.png'),0,height-y,width+480,1,480,480,x,0);
12771
12772
ctx.fillStyle='#000';
12773
ctx.fillRect(0,height-y+480,width,Math.max(0,(y-480)));
12774
ctx.globalAlpha=1;
12775
12776
Timer.track('milk');
12777
}
12778
12779
if (Game.AscendTimer>0)
12780
{
12781
ctx.drawImage(Pic('shadedBordersSoft.png'),0,0,ctx.canvas.width,ctx.canvas.height);
12782
}
12783
12784
if (Game.AscendTimer==0)
12785
{
12786
Game.DrawWrinklers();Timer.track('wrinklers');
12787
Game.DrawSpecial();Timer.track('evolvables');
12788
12789
Game.particlesDraw(2);Timer.track('text particles');
12790
12791
//shiny border during frenzies etc
12792
ctx.globalAlpha=1;
12793
var borders='shadedBordersSoft.png';
12794
if (goodBuff) borders='shadedBordersGold.png';
12795
else if (badBuff) borders='shadedBordersRed.png';
12796
if (goodBuff && Game.prefs.fancy) ctx.globalCompositeOperation='lighter';
12797
ctx.drawImage(Pic(borders),0,0,ctx.canvas.width,ctx.canvas.height);
12798
if (goodBuff && Game.prefs.fancy) ctx.globalCompositeOperation='source-over';
12799
}
12800
}
12801
};
12802
12803
12804
/*=====================================================================================
12805
INITIALIZATION END; GAME READY TO LAUNCH
12806
=======================================================================================*/
12807
12808
Game.killShimmers();
12809
12810
//booooo
12811
Game.RuinTheFun=function(silent)
12812
{
12813
Game.popups=0;
12814
Game.SetAllUpgrades(1);
12815
Game.SetAllAchievs(1);
12816
Game.popups=0;
12817
Game.Earn(999999999999999999999999999999);
12818
Game.MaxSpecials();
12819
Game.nextResearch=0;
12820
Game.researchT=-1;
12821
Game.upgradesToRebuild=1;
12822
Game.recalculateGains=1;
12823
Game.popups=1;
12824
for (var i in Game.Objects)
12825
{
12826
var me=Game.Objects[i];
12827
if (me.minigame && me.minigame.onRuinTheFun) me.minigame.onRuinTheFun();
12828
}
12829
if (!silent)
12830
{
12831
if (Game.prefs.popups) Game.Popup('Thou doth ruineth the fun!');
12832
else Game.Notify('Thou doth ruineth the fun!','You\'re free. Free at last.',[11,5]);
12833
}
12834
return 'You feel a bitter taste in your mouth...';
12835
}
12836
12837
Game.SetAllUpgrades=function(on)
12838
{
12839
Game.popups=0;
12840
var leftout=['Magic shenanigans','Occult obstruction','Glucose-charged air'];
12841
for (var i in Game.Upgrades)
12842
{
12843
if (on && (Game.Upgrades[i].pool=='toggle' || leftout.indexOf(Game.Upgrades[i].name)!=-1)) {}
12844
else if (on) Game.Upgrades[i].earn();
12845
else if (!on) Game.Upgrades[i].lose();
12846
}
12847
Game.upgradesToRebuild=1;
12848
Game.recalculateGains=1;
12849
Game.popups=1;
12850
}
12851
Game.SetAllAchievs=function(on)
12852
{
12853
Game.popups=0;
12854
for (var i in Game.Achievements)
12855
{
12856
if (on && Game.Achievements[i].pool!='dungeon') Game.Win(Game.Achievements[i].name);
12857
else if (!on) Game.RemoveAchiev(Game.Achievements[i].name);
12858
}
12859
Game.recalculateGains=1;
12860
Game.popups=1;
12861
}
12862
Game.GetAllDebugs=function()
12863
{
12864
Game.popups=0;
12865
for (var i in Game.Upgrades)
12866
{
12867
if (Game.Upgrades[i].pool=='debug') Game.Upgrades[i].earn();
12868
}
12869
Game.upgradesToRebuild=1;
12870
Game.recalculateGains=1;
12871
Game.popups=1;
12872
}
12873
Game.MaxSpecials=function()
12874
{
12875
Game.dragonLevel=Game.dragonLevels.length-1;
12876
Game.santaLevel=Game.santaLevels.length-1;
12877
}
12878
12879
Game.SesameReset=function()
12880
{
12881
var name=Game.bakeryName;
12882
Game.HardReset(2);
12883
Game.bakeryName=name;
12884
Game.bakeryNameRefresh();
12885
Game.Achievements['Cheated cookies taste awful'].won=1;
12886
}
12887
12888
Game.debugTimersOn=0;
12889
Game.sesame=0;
12890
Game.OpenSesame=function()
12891
{
12892
var str='';
12893
str+='<div class="icon" style="position:absolute;left:-9px;top:-6px;background-position:'+(-10*48)+'px '+(-6*48)+'px;"></div>';
12894
str+='<div style="position:absolute;left:0px;top:0px;z-index:10;font-size:10px;background:#000;padding:1px;" id="fpsCounter"></div>';
12895
12896
str+='<div id="devConsoleContent">';
12897
str+='<div class="title" style="font-size:14px;margin:6px;">Dev tools</div>';
12898
12899
str+='<a class="option neato" '+Game.clickStr+'="Game.Ascend(1);">Ascend</a>';
12900
str+='<div class="line"></div>';
12901
str+='<a class="option neato" '+Game.clickStr+'="Game.cookies*=10;Game.cookiesEarned*=10;">x10</a>';
12902
str+='<a class="option neato" '+Game.clickStr+'="Game.cookies/=10;Game.cookiesEarned/=10;">/10</a><br>';
12903
str+='<a class="option neato" '+Game.clickStr+'="Game.cookies*=1000;Game.cookiesEarned*=1000;">x1k</a>';
12904
str+='<a class="option neato" '+Game.clickStr+'="Game.cookies/=1000;Game.cookiesEarned/=1000;">/1k</a><br>';
12905
str+='<a class="option neato" '+Game.clickStr+'="for (var i in Game.Objects){Game.Objects[i].buy(100);}">Buy 100 of all</a>';//for (var n=0;n<100;n++){for (var i in Game.Objects){Game.Objects[i].buy(1);}}
12906
str+='<a class="option neato" '+Game.clickStr+'="for (var i in Game.Objects){Game.Objects[i].sell(100);}">Sell 100 of all</a><br>';
12907
str+='<a class="option neato" '+Game.clickStr+'="Game.gainLumps(10);">+10 lumps</a>';
12908
str+='<a class="option neato" '+Game.clickStr+'="for (var i in Game.Objects){Game.Objects[i].level=0;Game.Objects[i].onMinigame=false;Game.Objects[i].refresh();}Game.recalculateGains=1;">Reset levels</a>';
12909
str+='<div class="line"></div>';
12910
str+='<a class="option warning" '+Game.clickStr+'="Game.RuinTheFun(1);">Ruin The Fun</a>';
12911
str+='<a class="option warning" '+Game.clickStr+'="Game.SesameReset();">Wipe</a>';
12912
str+='<a class="option neato" '+Game.clickStr+'="Game.GetAllDebugs();">All debugs</a>';
12913
str+='<a class="option neato" '+Game.clickStr+'="Game.debugTimersOn=!Game.debugTimersOn;Game.OpenSesame();">Timers '+(Game.debugTimersOn?'On':'Off')+'</a><br>';
12914
str+='<a class="option neato" '+Game.clickStr+'="Game.SetAllUpgrades(0);">No upgrades</a>';
12915
str+='<a class="option neato" '+Game.clickStr+'="Game.SetAllUpgrades(1);">All upgrades</a><br>';
12916
str+='<a class="option neato" '+Game.clickStr+'="Game.SetAllAchievs(0);">No achievs</a>';
12917
str+='<a class="option neato" '+Game.clickStr+'="Game.SetAllAchievs(1);">All achievs</a><br>';
12918
str+='<a class="option neato" '+Game.clickStr+'="Game.santaLevel=0;Game.dragonLevel=0;">Reset specials</a>';
12919
str+='<a class="option neato" '+Game.clickStr+'="Game.MaxSpecials();">Max specials</a><br>';
12920
str+='<a class="option neato" '+Game.clickStr+'="Game.lumpRefill=0;/*Date.now()-Game.getLumpRefillMax();*/">Reset refills</a>';
12921
str+='<a class="option neato" '+Game.clickStr+'="Game.EditAscend();">'+(Game.DebuggingPrestige?'Exit Ascend Edit':'Ascend Edit')+'</a>';
12922
str+='<a class="option neato" '+Game.clickStr+'="Game.DebugUpgradeCpS();">Debug upgrades CpS</a>';
12923
str+='<a class="option neato" '+Game.clickStr+'="Game.seed=Game.makeSeed();">Re-seed</a>';
12924
str+='<a class="option neato" '+Game.clickStr+'="Game.heralds=100;l(\'heraldsAmount\').innerHTML=Game.heralds;Game.externalDataLoaded=true;Game.recalculateGains=1;">Max heralds</a>';
12925
str+='<div class="line"></div>';
12926
for (var i=0;i<Game.goldenCookieChoices.length/2;i++)
12927
{
12928
str+='<a class="option neato" '+Game.clickStr+'="var newShimmer=new Game.shimmer(\'golden\');newShimmer.force=\''+Game.goldenCookieChoices[i*2+1]+'\';">'+Game.goldenCookieChoices[i*2]+'</a>';
12929
//str+='<a class="option neato" '+Game.clickStr+'="Game.goldenCookie.force=\''+Game.goldenCookie.choices[i*2+1]+'\';Game.goldenCookie.spawn();">'+Game.goldenCookie.choices[i*2]+'</a>';
12930
//str+='<a class="option neato" '+Game.clickStr+'="Game.goldenCookie.click(0,\''+Game.goldenCookie.choices[i*2+1]+'\');">'+Game.goldenCookie.choices[i*2]+'</a>';
12931
}
12932
str+='</div>';
12933
12934
l('devConsole').innerHTML=str;
12935
12936
if (!l('fpsGraph'))
12937
{
12938
var div=document.createElement('canvas');
12939
div.id='fpsGraph';
12940
div.width=128;
12941
div.height=64;
12942
div.style.opacity=0.5;
12943
div.style.pointerEvents='none';
12944
div.style.transformOrigin='0% 0%';
12945
div.style.transform='scale(0.75)';
12946
//l('devConsole').appendChild(div);
12947
l('devConsole').parentNode.insertBefore(div,l('devConsole').nextSibling);
12948
Game.fpsGraph=div;
12949
Game.fpsGraphCtx=Game.fpsGraph.getContext('2d',{alpha:false});
12950
var ctx=Game.fpsGraphCtx;
12951
ctx.fillStyle='#000';
12952
ctx.fillRect(0,0,128,64);
12953
}
12954
12955
l('debug').style.display='block';
12956
Game.sesame=1;
12957
Game.Achievements['Cheated cookies taste awful'].won=1;
12958
}
12959
12960
Game.EditAscend=function()
12961
{
12962
if (!Game.DebuggingPrestige)
12963
{
12964
Game.DebuggingPrestige=true;
12965
Game.AscendTimer=0;
12966
Game.OnAscend=1;
12967
Game.removeClass('ascendIntro');
12968
Game.addClass('ascending');
12969
}
12970
else
12971
{
12972
Game.DebuggingPrestige=false;
12973
}
12974
Game.BuildAscendTree();
12975
Game.OpenSesame();
12976
}
12977
12978
//experimental debugging function that cycles through every owned upgrade, turns it off and on, and lists how much each upgrade is participating to CpS
12979
Game.debuggedUpgradeCpS=[];
12980
Game.debuggedUpgradeCpClick=[];
12981
Game.debugColors=['#322','#411','#600','#900','#f30','#f90','#ff0','#9f0','#0f9','#09f','#90f'];
12982
Game.DebugUpgradeCpS=function()
12983
{
12984
Game.CalculateGains();
12985
Game.debuggedUpgradeCpS=[];
12986
Game.debuggedUpgradeCpClick=[];
12987
var CpS=Game.cookiesPs;
12988
var CpClick=Game.computedMouseCps;
12989
for (var i in Game.Upgrades)
12990
{
12991
var me=Game.Upgrades[i];
12992
if (me.bought)
12993
{
12994
me.bought=0;
12995
Game.CalculateGains();
12996
//Game.debuggedUpgradeCpS[me.name]=CpS-Game.cookiesPs;
12997
Game.debuggedUpgradeCpS[me.name]=(CpS/(Game.cookiesPs||1)-1);
12998
Game.debuggedUpgradeCpClick[me.name]=(CpClick/(Game.computedMouseCps||1)-1);
12999
me.bought=1;
13000
}
13001
}
13002
Game.CalculateGains();
13003
}
13004
13005
13006
13007
13008
for (var i in Game.customInit) {Game.customInit[i]();}
13009
13010
if (!Game.LoadSave())
13011
{//try to load the save when we open the page. if this fails, try to brute-force it half a second later
13012
setTimeout(function(){
13013
var local=Game.localStorageGet(Game.SaveTo);
13014
Game.LoadSave(local);
13015
},500);
13016
}
13017
13018
Game.ready=1;
13019
setTimeout(function(){if (typeof showAds==='undefined' && (!l('detectAds') || l('detectAds').clientHeight<1)) Game.addClass('noAds');},500);
13020
l('javascriptError').innerHTML='';
13021
l('javascriptError').style.display='none';
13022
Game.Loop();
13023
Game.Draw();
13024
}
13025
/*=====================================================================================
13026
LOGIC
13027
=======================================================================================*/
13028
Game.Logic=function()
13029
{
13030
Game.bounds=Game.l.getBoundingClientRect();
13031
13032
if (!Game.OnAscend && Game.AscendTimer==0)
13033
{
13034
for (var i in Game.Objects)
13035
{
13036
if (Game.Objects[i].eachFrame) Game.Objects[i].eachFrame();
13037
}
13038
Game.UpdateSpecial();
13039
Game.UpdateGrandmapocalypse();
13040
13041
//these are kinda fun
13042
//if (Game.BigCookieState==2 && !Game.promptOn && Game.Scroll!=0) Game.ClickCookie();
13043
//if (Game.BigCookieState==1 && !Game.promptOn) Game.ClickCookie();
13044
13045
//handle graphic stuff
13046
if (Game.prefs.wobbly)
13047
{
13048
if (Game.BigCookieState==1) Game.BigCookieSizeT=0.98;
13049
else if (Game.BigCookieState==2) Game.BigCookieSizeT=1.05;
13050
else Game.BigCookieSizeT=1;
13051
Game.BigCookieSizeD+=(Game.BigCookieSizeT-Game.BigCookieSize)*0.75;
13052
Game.BigCookieSizeD*=0.75;
13053
Game.BigCookieSize+=Game.BigCookieSizeD;
13054
Game.BigCookieSize=Math.max(0.1,Game.BigCookieSize);
13055
}
13056
else
13057
{
13058
if (Game.BigCookieState==1) Game.BigCookieSize+=(0.98-Game.BigCookieSize)*0.5;
13059
else if (Game.BigCookieState==2) Game.BigCookieSize+=(1.05-Game.BigCookieSize)*0.5;
13060
else Game.BigCookieSize+=(1-Game.BigCookieSize)*0.5;
13061
}
13062
Game.particlesUpdate();
13063
13064
if (Game.mousePointer) l('sectionLeft').style.cursor='pointer';
13065
else l('sectionLeft').style.cursor='auto';
13066
Game.mousePointer=0;
13067
13068
//handle milk and milk accessories
13069
Game.milkProgress=Game.AchievementsOwned/25;
13070
if (Game.milkProgress>=0.5) Game.Unlock('Kitten helpers');
13071
if (Game.milkProgress>=1) Game.Unlock('Kitten workers');
13072
if (Game.milkProgress>=2) Game.Unlock('Kitten engineers');
13073
if (Game.milkProgress>=3) Game.Unlock('Kitten overseers');
13074
if (Game.milkProgress>=4) Game.Unlock('Kitten managers');
13075
if (Game.milkProgress>=5) Game.Unlock('Kitten accountants');
13076
if (Game.milkProgress>=6) Game.Unlock('Kitten specialists');
13077
if (Game.milkProgress>=7) Game.Unlock('Kitten experts');
13078
if (Game.milkProgress>=8) Game.Unlock('Kitten consultants');
13079
if (Game.milkProgress>=9) Game.Unlock('Kitten assistants to the regional manager');
13080
if (Game.milkProgress>=10) Game.Unlock('Kitten marketeers');
13081
if (Game.milkProgress>=11) Game.Unlock('Kitten analysts');
13082
if (Game.milkProgress>=12) Game.Unlock('Kitten executives');
13083
Game.milkH=Math.min(1,Game.milkProgress)*0.35;
13084
Game.milkHd+=(Game.milkH-Game.milkHd)*0.02;
13085
13086
Game.Milk=Game.Milks[Math.min(Math.floor(Game.milkProgress),Game.Milks.length-1)];
13087
13088
if (Game.autoclickerDetected>0) Game.autoclickerDetected--;
13089
13090
//handle research
13091
if (Game.researchT>0)
13092
{
13093
Game.researchT--;
13094
}
13095
if (Game.researchT==0 && Game.nextResearch)
13096
{
13097
if (!Game.Has(Game.UpgradesById[Game.nextResearch].name))
13098
{
13099
Game.Unlock(Game.UpgradesById[Game.nextResearch].name);
13100
if (Game.prefs.popups) Game.Popup('Researched : '+Game.UpgradesById[Game.nextResearch].name);
13101
else Game.Notify('Research complete','You have discovered : <b>'+Game.UpgradesById[Game.nextResearch].name+'</b>.',Game.UpgradesById[Game.nextResearch].icon);
13102
}
13103
Game.nextResearch=0;
13104
Game.researchT=-1;
13105
Game.recalculateGains=1;
13106
}
13107
//handle seasons
13108
if (Game.seasonT>0)
13109
{
13110
Game.seasonT--;
13111
}
13112
if (Game.seasonT<=0 && Game.season!='' && Game.season!=Game.baseSeason && !Game.Has('Eternal seasons'))
13113
{
13114
var str=Game.seasons[Game.season].over;
13115
if (Game.prefs.popups) Game.Popup(str);
13116
else Game.Notify(str,'',Game.seasons[Game.season].triggerUpgrade.icon);
13117
if (Game.Has('Season switcher')) {Game.Unlock(Game.seasons[Game.season].trigger);Game.seasons[Game.season].triggerUpgrade.bought=0;}
13118
Game.season=Game.baseSeason;
13119
Game.seasonT=-1;
13120
}
13121
13122
//press ctrl to bulk-buy 10, shift to bulk-buy 100
13123
if (!Game.promptOn)
13124
{
13125
if ((Game.keys[16] || Game.keys[17]) && !Game.buyBulkShortcut)
13126
{
13127
Game.buyBulkOld=Game.buyBulk;
13128
if (Game.keys[16]) Game.buyBulk=100;
13129
if (Game.keys[17]) Game.buyBulk=10;
13130
Game.buyBulkShortcut=1;
13131
Game.storeBulkButton(-1);
13132
}
13133
}
13134
if ((!Game.keys[16] && !Game.keys[17]) && Game.buyBulkShortcut)//release
13135
{
13136
Game.buyBulk=Game.buyBulkOld;
13137
Game.buyBulkShortcut=0;
13138
Game.storeBulkButton(-1);
13139
}
13140
13141
//handle cookies
13142
if (Game.recalculateGains) Game.CalculateGains();
13143
Game.Earn(Game.cookiesPs/Game.fps);//add cookies per second
13144
13145
//grow lumps
13146
Game.doLumps();
13147
13148
//minigames
13149
for (var i in Game.Objects)
13150
{
13151
var me=Game.Objects[i];
13152
if (Game.isMinigameReady(me) && me.minigame.logic && Game.ascensionMode!=1) me.minigame.logic();
13153
}
13154
13155
if (Game.specialTab!='' && Game.T%(Game.fps*3)==0) Game.ToggleSpecialMenu(1);
13156
13157
//wrinklers
13158
if (Game.cpsSucked>0)
13159
{
13160
Game.Dissolve((Game.cookiesPs/Game.fps)*Game.cpsSucked);
13161
Game.cookiesSucked+=((Game.cookiesPs/Game.fps)*Game.cpsSucked);
13162
//should be using one of the following, but I'm not sure what I'm using this stat for anymore
13163
//Game.cookiesSucked=Game.wrinklers.reduce(function(s,w){return s+w.sucked;},0);
13164
//for (var i in Game.wrinklers) {Game.cookiesSucked+=Game.wrinklers[i].sucked;}
13165
}
13166
13167
//var cps=Game.cookiesPs+Game.cookies*0.01;//exponential cookies
13168
//Game.Earn(cps/Game.fps);//add cookies per second
13169
13170
for (var i in Game.Objects)
13171
{
13172
var me=Game.Objects[i];
13173
me.totalCookies+=(me.storedTotalCps*Game.globalCpsMult)/Game.fps;
13174
}
13175
if (Game.cookies && Game.T%Math.ceil(Game.fps/Math.min(10,Game.cookiesPs))==0 && Game.prefs.particles) Game.particleAdd();//cookie shower
13176
13177
if (Game.T%(Game.fps*10)==0) Game.recalculateGains=1;//recalculate CpS every 10 seconds (for dynamic boosts such as Century egg)
13178
13179
/*=====================================================================================
13180
UNLOCKING STUFF
13181
=======================================================================================*/
13182
if (Game.T%(Game.fps)==0 && Math.random()<1/500000) Game.Win('Just plain lucky');//1 chance in 500,000 every second achievement
13183
if (Game.T%(Game.fps*5)==0 && Game.ObjectsById.length>0)//check some achievements and upgrades
13184
{
13185
if (isNaN(Game.cookies)) {Game.cookies=0;Game.cookiesEarned=0;Game.recalculateGains=1;}
13186
13187
var timePlayed=new Date();
13188
timePlayed.setTime(Date.now()-Game.startDate);
13189
13190
if (!Game.fullDate || (Date.now()-Game.fullDate)>=365*24*60*60*1000) Game.Win('So much to do so much to see');
13191
13192
if (Game.cookiesEarned>=1000000 && (Game.ascensionMode==1 || Game.resets==0))//challenge run or hasn't ascended yet
13193
{
13194
if (timePlayed<=1000*60*35) Game.Win('Speed baking I');
13195
if (timePlayed<=1000*60*25) Game.Win('Speed baking II');
13196
if (timePlayed<=1000*60*15) Game.Win('Speed baking III');
13197
13198
if (Game.cookieClicks<=15) Game.Win('Neverclick');
13199
if (Game.cookieClicks<=0) Game.Win('True Neverclick');
13200
if (Game.cookiesEarned>=1000000000 && Game.UpgradesOwned==0) Game.Win('Hardcore');
13201
}
13202
13203
for (var i in Game.UnlockAt)
13204
{
13205
var unlock=Game.UnlockAt[i];
13206
if (Game.cookiesEarned>=unlock.cookies)
13207
{
13208
var pass=1;
13209
if (unlock.require && !Game.Has(unlock.require) && !Game.HasAchiev(unlock.require)) pass=0;
13210
if (unlock.season && Game.season!=unlock.season) pass=0;
13211
if (pass) {Game.Unlock(unlock.name);Game.Win(unlock.name);}
13212
}
13213
}
13214
13215
if (Game.Has('Golden switch')) Game.Unlock('Golden switch [off]');
13216
if (Game.Has('Shimmering veil') && !Game.Has('Shimmering veil [off]') && !Game.Has('Shimmering veil [on]')) {Game.Unlock('Shimmering veil [on]');Game.Upgrades['Shimmering veil [off]'].earn();}
13217
if (Game.Has('Sugar craving')) Game.Unlock('Sugar frenzy');
13218
if (Game.Has('Classic dairy selection')) Game.Unlock('Milk selector');
13219
if (Game.Has('Basic wallpaper assortment')) Game.Unlock('Background selector');
13220
if (Game.Has('Golden cookie alert sound')) Game.Unlock('Golden cookie sound selector');
13221
13222
if (Game.Has('Eternal heart biscuits')) Game.Win('Lovely cookies');
13223
if (Game.season=='easter')
13224
{
13225
var eggs=0;
13226
for (var i in Game.easterEggs)
13227
{
13228
if (Game.HasUnlocked(Game.easterEggs[i])) eggs++;
13229
}
13230
if (eggs>=1) Game.Win('The hunt is on');
13231
if (eggs>=7) Game.Win('Egging on');
13232
if (eggs>=14) Game.Win('Mass Easteria');
13233
if (eggs>=Game.easterEggs.length) Game.Win('Hide & seek champion');
13234
}
13235
13236
if (Game.Has('Fortune cookies'))
13237
{
13238
var list=Game.Tiers['fortune'].upgrades;
13239
var fortunes=0;
13240
for (var i in list)
13241
{
13242
if (Game.Has(list[i].name)) fortunes++;
13243
}
13244
if (fortunes>=list.length) Game.Win('O Fortuna');
13245
}
13246
13247
if (Game.prestige>0 && Game.ascensionMode!=1)
13248
{
13249
Game.Unlock('Heavenly chip secret');
13250
if (Game.Has('Heavenly chip secret')) Game.Unlock('Heavenly cookie stand');
13251
if (Game.Has('Heavenly cookie stand')) Game.Unlock('Heavenly bakery');
13252
if (Game.Has('Heavenly bakery')) Game.Unlock('Heavenly confectionery');
13253
if (Game.Has('Heavenly confectionery')) Game.Unlock('Heavenly key');
13254
13255
if (Game.Has('Heavenly key')) Game.Win('Wholesome');
13256
}
13257
13258
for (var i in Game.BankAchievements)
13259
{
13260
if (Game.cookiesEarned>=Game.BankAchievements[i].threshold) Game.Win(Game.BankAchievements[i].name);
13261
}
13262
13263
var buildingsOwned=0;
13264
var mathematician=1;
13265
var base10=1;
13266
var minAmount=100000;
13267
for (var i in Game.Objects)
13268
{
13269
buildingsOwned+=Game.Objects[i].amount;
13270
minAmount=Math.min(Game.Objects[i].amount,minAmount);
13271
if (!Game.HasAchiev('Mathematician')) {if (Game.Objects[i].amount<Math.min(128,Math.pow(2,(Game.ObjectsById.length-Game.Objects[i].id)-1))) mathematician=0;}
13272
if (!Game.HasAchiev('Base 10')) {if (Game.Objects[i].amount<(Game.ObjectsById.length-Game.Objects[i].id)*10) base10=0;}
13273
}
13274
if (minAmount>=1) Game.Win('One with everything');
13275
if (mathematician==1) Game.Win('Mathematician');
13276
if (base10==1) Game.Win('Base 10');
13277
if (minAmount>=100) {Game.Win('Centennial');Game.Unlock('Milk chocolate butter biscuit');}
13278
if (minAmount>=150) {Game.Win('Centennial and a half');Game.Unlock('Dark chocolate butter biscuit');}
13279
if (minAmount>=200) {Game.Win('Bicentennial');Game.Unlock('White chocolate butter biscuit');}
13280
if (minAmount>=250) {Game.Win('Bicentennial and a half');Game.Unlock('Ruby chocolate butter biscuit');}
13281
if (minAmount>=300) {Game.Win('Tricentennial');Game.Unlock('Lavender chocolate butter biscuit');}
13282
if (minAmount>=350) {Game.Win('Tricentennial and a half');Game.Unlock('Synthetic chocolate green honey butter biscuit');}
13283
if (minAmount>=400) {Game.Win('Quadricentennial');Game.Unlock('Royal raspberry chocolate butter biscuit');}
13284
if (minAmount>=450) {Game.Win('Quadricentennial and a half');Game.Unlock('Ultra-concentrated high-energy chocolate butter biscuit');}
13285
if (minAmount>=500) {Game.Win('Quincentennial');Game.Unlock('Pure pitch-black chocolate butter biscuit');}
13286
13287
if (Game.handmadeCookies>=1000) {Game.Win('Clicktastic');Game.Unlock('Plastic mouse');}
13288
if (Game.handmadeCookies>=100000) {Game.Win('Clickathlon');Game.Unlock('Iron mouse');}
13289
if (Game.handmadeCookies>=10000000) {Game.Win('Clickolympics');Game.Unlock('Titanium mouse');}
13290
if (Game.handmadeCookies>=1000000000) {Game.Win('Clickorama');Game.Unlock('Adamantium mouse');}
13291
if (Game.handmadeCookies>=100000000000) {Game.Win('Clickasmic');Game.Unlock('Unobtainium mouse');}
13292
if (Game.handmadeCookies>=10000000000000) {Game.Win('Clickageddon');Game.Unlock('Eludium mouse');}
13293
if (Game.handmadeCookies>=1000000000000000) {Game.Win('Clicknarok');Game.Unlock('Wishalloy mouse');}
13294
if (Game.handmadeCookies>=100000000000000000) {Game.Win('Clickastrophe');Game.Unlock('Fantasteel mouse');}
13295
if (Game.handmadeCookies>=10000000000000000000) {Game.Win('Clickataclysm');Game.Unlock('Nevercrack mouse');}
13296
if (Game.handmadeCookies>=1000000000000000000000) {Game.Win('The ultimate clickdown');Game.Unlock('Armythril mouse');}
13297
if (Game.handmadeCookies>=100000000000000000000000) {Game.Win('All the other kids with the pumped up clicks');Game.Unlock('Technobsidian mouse');}
13298
if (Game.handmadeCookies>=10000000000000000000000000) {Game.Win('One...more...click...');Game.Unlock('Plasmarble mouse');}
13299
13300
if (Game.cookiesEarned<Game.cookies) Game.Win('Cheated cookies taste awful');
13301
13302
if (Game.Has('Skull cookies') && Game.Has('Ghost cookies') && Game.Has('Bat cookies') && Game.Has('Slime cookies') && Game.Has('Pumpkin cookies') && Game.Has('Eyeball cookies') && Game.Has('Spider cookies')) Game.Win('Spooky cookies');
13303
if (Game.wrinklersPopped>=1) Game.Win('Itchscratcher');
13304
if (Game.wrinklersPopped>=50) Game.Win('Wrinklesquisher');
13305
if (Game.wrinklersPopped>=200) Game.Win('Moistburster');
13306
13307
if (Game.cookiesEarned>=1000000 && Game.Has('How to bake your dragon')) Game.Unlock('A crumbly egg');
13308
13309
if (Game.cookiesEarned>=25 && Game.season=='christmas') Game.Unlock('A festive hat');
13310
if (Game.Has('Christmas tree biscuits') && Game.Has('Snowflake biscuits') && Game.Has('Snowman biscuits') && Game.Has('Holly biscuits') && Game.Has('Candy cane biscuits') && Game.Has('Bell biscuits') && Game.Has('Present biscuits')) Game.Win('Let it snow');
13311
13312
if (Game.reindeerClicked>=1) Game.Win('Oh deer');
13313
if (Game.reindeerClicked>=50) Game.Win('Sleigh of hand');
13314
if (Game.reindeerClicked>=200) Game.Win('Reindeer sleigher');
13315
13316
if (buildingsOwned>=100) Game.Win('Builder');
13317
if (buildingsOwned>=500) Game.Win('Architect');
13318
if (buildingsOwned>=1000) Game.Win('Engineer');
13319
if (buildingsOwned>=2000) Game.Win('Lord of Constructs');
13320
if (Game.UpgradesOwned>=20) Game.Win('Enhancer');
13321
if (Game.UpgradesOwned>=50) Game.Win('Augmenter');
13322
if (Game.UpgradesOwned>=100) Game.Win('Upgrader');
13323
if (Game.UpgradesOwned>=200) Game.Win('Lord of Progress');
13324
if (buildingsOwned>=3000 && Game.UpgradesOwned>=300) Game.Win('Polymath');
13325
if (buildingsOwned>=4000 && Game.UpgradesOwned>=400) Game.Win('Renaissance baker');
13326
13327
if (Game.cookiesEarned>=10000000000000 && !Game.HasAchiev('You win a cookie')) {Game.Win('You win a cookie');Game.Earn(1);}
13328
13329
if (Game.shimmerTypes['golden'].n>=4) Game.Win('Four-leaf cookie');
13330
13331
var grandmas=0;
13332
for (var i in Game.GrandmaSynergies)
13333
{
13334
if (Game.Has(Game.GrandmaSynergies[i])) grandmas++;
13335
}
13336
if (!Game.HasAchiev('Elder') && grandmas>=7) Game.Win('Elder');
13337
if (!Game.HasAchiev('Veteran') && grandmas>=14) Game.Win('Veteran');
13338
if (Game.Objects['Grandma'].amount>=6 && !Game.Has('Bingo center/Research facility') && Game.HasAchiev('Elder')) Game.Unlock('Bingo center/Research facility');
13339
if (Game.pledges>0) Game.Win('Elder nap');
13340
if (Game.pledges>=5) Game.Win('Elder slumber');
13341
if (Game.pledges>=10) Game.Unlock('Sacrificial rolling pins');
13342
if (Game.Objects['Cursor'].amount+Game.Objects['Grandma'].amount>=777) Game.Win('The elder scrolls');
13343
13344
for (var i in Game.Objects)
13345
{
13346
var it=Game.Objects[i];
13347
for (var ii in it.productionAchievs)
13348
{
13349
if (it.totalCookies>=it.productionAchievs[ii].pow) Game.Win(it.productionAchievs[ii].achiev.name);
13350
}
13351
}
13352
13353
if (!Game.HasAchiev('Cookie-dunker') && Game.LeftBackground && Game.milkProgress>0.1 && (Game.LeftBackground.canvas.height*0.4+256/2-16)>((1-Game.milkHd)*Game.LeftBackground.canvas.height)) Game.Win('Cookie-dunker');
13354
//&& l('bigCookie').getBoundingClientRect().bottom>l('milk').getBoundingClientRect().top+16 && Game.milkProgress>0.1) Game.Win('Cookie-dunker');
13355
13356
for (var i in Game.customChecks) {Game.customChecks[i]();}
13357
}
13358
13359
Game.cookiesd+=(Game.cookies-Game.cookiesd)*0.3;
13360
13361
if (Game.storeToRefresh) Game.RefreshStore();
13362
if (Game.upgradesToRebuild) Game.RebuildUpgrades();
13363
13364
Game.updateShimmers();
13365
Game.updateBuffs();
13366
13367
Game.UpdateTicker();
13368
}
13369
13370
if (Game.T%(Game.fps*2)==0)
13371
{
13372
var title='Cookie Clicker';
13373
if (Game.season=='fools') title='Cookie Baker';
13374
document.title=(Game.OnAscend?'Ascending! ':'')+Beautify(Game.cookies)+' '+(Game.cookies==1?'cookie':'cookies')+' - '+title;
13375
}
13376
if (Game.T%15==0)
13377
{
13378
//written through the magic of "hope for the best" maths
13379
var chipsOwned=Game.HowMuchPrestige(Game.cookiesReset);
13380
var ascendNowToOwn=Math.floor(Game.HowMuchPrestige(Game.cookiesReset+Game.cookiesEarned));
13381
var ascendNowToGet=ascendNowToOwn-Math.floor(chipsOwned);
13382
var nextChipAt=Game.HowManyCookiesReset(Math.floor(chipsOwned+ascendNowToGet+1))-Game.HowManyCookiesReset(Math.floor(chipsOwned+ascendNowToGet));
13383
var cookiesToNext=Game.HowManyCookiesReset(ascendNowToOwn+1)-(Game.cookiesEarned+Game.cookiesReset);
13384
var percent=1-(cookiesToNext/nextChipAt);
13385
13386
//fill the tooltip under the Legacy tab
13387
var date=new Date();
13388
date.setTime(Date.now()-Game.startDate);
13389
var timeInSeconds=date.getTime()/1000;
13390
var startDate=Game.sayTime(timeInSeconds*Game.fps,-1);
13391
13392
var str='';
13393
str+='You\'ve been on this run for <b>'+(startDate==''?'not very long':(startDate))+'</b>.<br>';
13394
str+='<div class="line"></div>';
13395
if (Game.prestige>0)
13396
{
13397
str+='Your prestige level is currently <b>'+Beautify(Game.prestige)+'</b>.<br>(CpS +'+Beautify(Game.prestige)+'%)';
13398
str+='<div class="line"></div>';
13399
}
13400
if (ascendNowToGet<1) str+='Ascending now would grant you no prestige.';
13401
else if (ascendNowToGet<2) str+='Ascending now would grant you<br><b>1 prestige level</b> (+1% CpS)<br>and <b>1 heavenly chip</b> to spend.';
13402
else str+='Ascending now would grant you<br><b>'+Beautify(ascendNowToGet)+' prestige levels</b> (+'+Beautify(ascendNowToGet)+'% CpS)<br>and <b>'+Beautify(ascendNowToGet)+' heavenly chips</b> to spend.';
13403
str+='<div class="line"></div>';
13404
str+='You need <b>'+Beautify(cookiesToNext)+' more cookies</b> for the next level.<br>';
13405
l('ascendTooltip').innerHTML=str;
13406
13407
if (ascendNowToGet>0)//show number saying how many chips you'd get resetting now
13408
{
13409
var str=ascendNowToGet.toString();
13410
var str2='';
13411
for (var i in str)//add commas
13412
{
13413
if ((str.length-i)%3==0 && i>0) str2+=',';
13414
str2+=str[i];
13415
}
13416
Game.ascendNumber.innerHTML='+'+str2;
13417
Game.ascendNumber.style.display='block';
13418
}
13419
else
13420
{
13421
Game.ascendNumber.style.display='none';
13422
}
13423
13424
if (ascendNowToGet>Game.ascendMeterLevel || Game.ascendMeterPercentT<Game.ascendMeterPercent)
13425
{
13426
//reset the gauge and play a sound if we gained a potential level
13427
Game.ascendMeterPercent=0;
13428
//PlaySound('snd/levelPrestige.mp3');//a bit too annoying
13429
}
13430
Game.ascendMeterLevel=ascendNowToGet;
13431
Game.ascendMeterPercentT=percent;//gauge that fills up as you near your next chip
13432
//if (Game.ascendMeterPercentT<Game.ascendMeterPercent) {Game.ascendMeterPercent=0;PlaySound('snd/levelPrestige.mp3',0.5);}
13433
//if (percent>=1) {Game.ascendMeter.className='';} else Game.ascendMeter.className='filling';
13434
}
13435
Game.ascendMeter.style.right=Math.floor(Math.max(0,1-Game.ascendMeterPercent)*100)+'px';
13436
Game.ascendMeterPercent+=(Game.ascendMeterPercentT-Game.ascendMeterPercent)*0.1;
13437
13438
Game.NotesLogic();
13439
if (Game.mouseMoved || Game.Scroll || Game.tooltip.dynamic) Game.tooltip.update();
13440
13441
if (Game.T%(Game.fps*5)==0 && !Game.mouseDown && (Game.onMenu=='stats' || Game.onMenu=='prefs')) Game.UpdateMenu();
13442
if (Game.T%(Game.fps*1)==0) Game.UpdatePrompt();
13443
if (Game.AscendTimer>0) Game.UpdateAscendIntro();
13444
if (Game.ReincarnateTimer>0) Game.UpdateReincarnateIntro();
13445
if (Game.OnAscend) Game.UpdateAscend();
13446
13447
for (var i in Game.customLogic) {Game.customLogic[i]();}
13448
13449
if (Game.sparklesT>0)
13450
{
13451
Game.sparkles.style.backgroundPosition=-Math.floor((Game.sparklesFrames-Game.sparklesT+1)*128)+'px 0px';
13452
Game.sparklesT--;
13453
if (Game.sparklesT==1) Game.sparkles.style.display='none';
13454
}
13455
13456
Game.Click=0;
13457
Game.Scroll=0;
13458
Game.mouseMoved=0;
13459
Game.CanClick=1;
13460
13461
if ((Game.toSave || (Game.T%(Game.fps*60)==0 && Game.T>Game.fps*10 && Game.prefs.autosave)) && !Game.OnAscend)
13462
{
13463
//check if we can save : no minigames are loading
13464
var canSave=true;
13465
for (var i in Game.Objects)
13466
{
13467
var me=Game.Objects[i];
13468
if (me.minigameLoading){canSave=false;break;}
13469
}
13470
if (canSave) Game.WriteSave();
13471
}
13472
13473
//every 30 minutes : get server data (ie. update notification, patreon data)
13474
if (Game.T%(Game.fps*60*30)==0 && Game.T>Game.fps*10/* && Game.prefs.autoupdate*/) {Game.CheckUpdates();Game.GrabData();}
13475
13476
Game.T++;
13477
}
13478
13479
/*=====================================================================================
13480
DRAW
13481
=======================================================================================*/
13482
13483
Game.Draw=function()
13484
{
13485
Game.DrawBackground();Timer.track('end of background');
13486
13487
if (!Game.OnAscend)
13488
{
13489
13490
var unit=(Math.round(Game.cookiesd)==1?' cookie':' cookies');
13491
var str=Beautify(Math.round(Game.cookiesd));
13492
if (Game.cookiesd>=1000000)//dirty padding
13493
{
13494
var spacePos=str.indexOf(' ');
13495
var dotPos=str.indexOf('.');
13496
var add='';
13497
if (spacePos!=-1)
13498
{
13499
if (dotPos==-1) add+='.000';
13500
else
13501
{
13502
if (spacePos-dotPos==2) add+='00';
13503
if (spacePos-dotPos==3) add+='0';
13504
}
13505
}
13506
str=[str.slice(0, spacePos),add,str.slice(spacePos)].join('');
13507
}
13508
if (str.length>11 && !Game.mobile) unit='<br>cookies';
13509
str+=unit;
13510
if (Game.prefs.monospace) str='<span class="monospace">'+str+'</span>';
13511
str=str+'<div style="font-size:50%;"'+(Game.cpsSucked>0?' class="warning"':'')+'>per second : '+Beautify(Game.cookiesPs*(1-Game.cpsSucked),1)+'</div>';//display cookie amount
13512
l('cookies').innerHTML=str;
13513
l('compactCookies').innerHTML=str;
13514
Timer.track('cookie amount');
13515
13516
for (var i in Game.Objects)
13517
{
13518
var me=Game.Objects[i];
13519
if (me.onMinigame && me.minigame.draw && !me.muted) me.minigame.draw();
13520
}
13521
Timer.track('draw minigames');
13522
13523
if (Game.drawT%5==0)
13524
{
13525
//if (Game.prefs.monospace) {l('cookies').className='title monospace';} else {l('cookies').className='title';}
13526
var lastLocked=0;
13527
for (var i in Game.Objects)
13528
{
13529
var me=Game.Objects[i];
13530
13531
//make products full-opacity if we can buy them
13532
var classes='product';
13533
var price=me.bulkPrice;
13534
if (Game.cookiesEarned>=me.basePrice || me.bought>0) {classes+=' unlocked';lastLocked=0;me.locked=0;} else {classes+=' locked';lastLocked++;me.locked=1;}
13535
if ((Game.buyMode==1 && Game.cookies>=price) || (Game.buyMode==-1 && me.amount>0)) classes+=' enabled'; else classes+=' disabled';
13536
if (lastLocked>2) classes+=' toggledOff';
13537
me.l.className=classes;
13538
//if (me.id>0) {l('productName'+me.id).innerHTML=Beautify(me.storedTotalCps/Game.ObjectsById[me.id-1].storedTotalCps,2);}
13539
}
13540
13541
//make upgrades full-opacity if we can buy them
13542
var lastPrice=0;
13543
for (var i in Game.UpgradesInStore)
13544
{
13545
var me=Game.UpgradesInStore[i];
13546
if (!me.bought)
13547
{
13548
var price=me.getPrice();
13549
var canBuy=me.canBuy();//(Game.cookies>=price);
13550
var enabled=(l('upgrade'+i).className.indexOf('enabled')>-1);
13551
if ((canBuy && !enabled) || (!canBuy && enabled)) Game.upgradesToRebuild=1;
13552
if (price<lastPrice) Game.storeToRefresh=1;//is this upgrade less expensive than the previous one? trigger a refresh to sort it again
13553
lastPrice=price;
13554
}
13555
if (me.timerDisplay)
13556
{
13557
var T=me.timerDisplay();
13558
if (T!=-1)
13559
{
13560
if (!l('upgradePieTimer'+i)) l('upgrade'+i).innerHTML=l('upgrade'+i).innerHTML+'<div class="pieTimer" id="upgradePieTimer'+i+'"></div>';
13561
T=(T*144)%144;
13562
l('upgradePieTimer'+i).style.backgroundPosition=(-Math.floor(T%18))*48+'px '+(-Math.floor(T/18))*48+'px';
13563
}
13564
}
13565
13566
//if (me.canBuy()) l('upgrade'+i).className='crate upgrade enabled'; else l('upgrade'+i).className='crate upgrade disabled';
13567
}
13568
}
13569
Timer.track('store');
13570
13571
if (Game.PARTY)//i was bored and felt like messing with CSS
13572
{
13573
var pulse=Math.pow((Game.T%10)/10,0.5);
13574
Game.l.style.filter='hue-rotate('+((Game.T*5)%360)+'deg) brightness('+(150-50*pulse)+'%)';
13575
Game.l.style.webkitFilter='hue-rotate('+((Game.T*5)%360)+'deg) brightness('+(150-50*pulse)+'%)';
13576
Game.l.style.transform='scale('+(1.02-0.02*pulse)+','+(1.02-0.02*pulse)+') rotate('+(Math.sin(Game.T*0.5)*0.5)+'deg)';
13577
l('wrapper').style.overflowX='hidden';
13578
l('wrapper').style.overflowY='hidden';
13579
}
13580
13581
Timer.clean();
13582
if (Game.prefs.animate && ((Game.prefs.fancy && Game.drawT%1==0) || (!Game.prefs.fancy && Game.drawT%10==0)) && Game.AscendTimer==0 && Game.onMenu=='') Game.DrawBuildings();Timer.track('buildings');
13583
13584
Game.textParticlesUpdate();Timer.track('text particles');
13585
}
13586
13587
Game.NotesDraw();Timer.track('notes');
13588
//Game.tooltip.update();//changed to only update when the mouse is moved
13589
13590
for (var i in Game.customDraw) {Game.customDraw[i]();}
13591
13592
Game.drawT++;
13593
//if (Game.prefs.altDraw) requestAnimationFrame(Game.Draw);
13594
}
13595
13596
/*=====================================================================================
13597
MAIN LOOP
13598
=======================================================================================*/
13599
Game.Loop=function()
13600
{
13601
if (Game.timedout) return false;
13602
Timer.say('START');
13603
Timer.track('browser stuff');
13604
Timer.say('LOGIC');
13605
//update game logic !
13606
Game.catchupLogic=0;
13607
Game.Logic();
13608
Game.catchupLogic=1;
13609
13610
var time=Date.now();
13611
13612
13613
//latency compensator
13614
Game.accumulatedDelay+=((time-Game.time)-1000/Game.fps);
13615
if (Game.prefs.timeout && time-Game.lastActivity>=1000*60*5)
13616
{
13617
if (Game.accumulatedDelay>1000*60*30) Game.delayTimeouts+=3;//more than 30 minutes delay ? computer probably asleep and not making cookies anyway
13618
else if (Game.accumulatedDelay>1000*5) Game.delayTimeouts++;//add to timeout counter when we skip 10 seconds worth of frames (and the player has been inactive for at least 5 minutes)
13619
if (Game.delayTimeouts>=3) Game.Timeout();//trigger timeout when the timeout counter is 3+
13620
}
13621
13622
Game.accumulatedDelay=Math.min(Game.accumulatedDelay,1000*5);//don't compensate over 5 seconds; if you do, something's probably very wrong
13623
Game.time=time;
13624
while (Game.accumulatedDelay>0)
13625
{
13626
Game.Logic();
13627
Game.accumulatedDelay-=1000/Game.fps;//as long as we're detecting latency (slower than target fps), execute logic (this makes drawing slower but makes the logic behave closer to correct target fps)
13628
}
13629
Game.catchupLogic=0;
13630
Timer.track('logic');
13631
Timer.say('END LOGIC');
13632
if (!Game.prefs.altDraw)
13633
{
13634
var hasFocus=document.hasFocus();
13635
Timer.say('DRAW');
13636
if (hasFocus || Game.prefs.focus || Game.loopT%10==0) requestAnimationFrame(Game.Draw);
13637
//if (document.hasFocus() || Game.loopT%5==0) Game.Draw();
13638
Timer.say('END DRAW');
13639
}
13640
else requestAnimationFrame(Game.Draw);
13641
13642
//if (!hasFocus) Game.tooltip.hide();
13643
13644
if (Game.sesame)
13645
{
13646
//fps counter and graph
13647
Game.previousFps=Game.currentFps;
13648
Game.currentFps=Game.getFps();
13649
var ctx=Game.fpsGraphCtx;
13650
ctx.drawImage(Game.fpsGraph,-1,0);
13651
ctx.fillStyle='rgb('+Math.round((1-Game.currentFps/Game.fps)*128)+',0,0)';
13652
ctx.fillRect(128-1,0,1,64);
13653
ctx.strokeStyle='#fff';
13654
ctx.beginPath();
13655
ctx.moveTo(128-1,(1-Game.previousFps/Game.fps)*64);
13656
ctx.lineTo(128,(1-Game.currentFps/Game.fps)*64);
13657
ctx.stroke();
13658
13659
l('fpsCounter').innerHTML=Game.currentFps+' fps';
13660
var str='';
13661
for (var i in Timer.labels) {str+=Timer.labels[i];}
13662
if (Game.debugTimersOn) l('debugLog').style.display='block';
13663
else l('debugLog').style.display='none';
13664
l('debugLog').innerHTML=str;
13665
13666
}
13667
Timer.reset();
13668
13669
Game.loopT++;
13670
setTimeout(Game.Loop,1000/Game.fps);
13671
}
13672
}
13673
13674
13675
/*=====================================================================================
13676
LAUNCH THIS THING
13677
=======================================================================================*/
13678
Game.Launch();
13679
//try {Game.Launch();}
13680
//catch(err) {console.log('ERROR : '+err.message);}
13681
13682
window.onload=function()
13683
{
13684
13685
if (!Game.ready)
13686
{
13687
if (top!=self) Game.ErrorFrame();
13688
else
13689
{
13690
console.log('[=== '+choose([
13691
'Oh, hello!',
13692
'hey, how\'s it hangin',
13693
'About to cheat in some cookies or just checking for bugs?',
13694
'Remember : cheated cookies taste awful!',
13695
'Hey, Orteil here. Cheated cookies taste awful... or do they?',
13696
])+' ===]');
13697
Game.Load();
13698
//try {Game.Load();}
13699
//catch(err) {console.log('ERROR : '+err.message);}
13700
}
13701
}
13702
};
13703
13704