Compare commits
87 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
348c47e1dc | ||
|
|
6e09c8dafb | ||
|
|
f1a79cbaa3 | ||
|
|
5640cbb9c8 | ||
|
|
6917e3139a | ||
|
|
f120f047dc | ||
|
|
13a49e3e39 | ||
|
|
762a6919e7 | ||
|
|
77ba8c4e84 | ||
|
|
914a5e2ff3 | ||
|
|
6bced494f8 | ||
|
|
ee35136130 | ||
|
|
85ed508010 | ||
|
|
0ea31f6e94 | ||
|
|
5ceffa9d63 | ||
|
|
07b67be07e | ||
|
|
5aa21209b9 | ||
|
|
14c1afa30d | ||
|
|
f36869d528 | ||
|
|
da3200612b | ||
|
|
d870823c07 | ||
|
|
b134e3b45c | ||
|
|
07944e366a | ||
|
|
dbcec54b3d | ||
|
|
f1ccbf8937 | ||
|
|
56903744d8 | ||
|
|
2ff6ea0746 | ||
|
|
a251c5a906 | ||
|
|
35ddafdca7 | ||
|
|
2063fa9db7 | ||
|
|
b9486e9895 | ||
|
|
cd18b1a402 | ||
|
|
4118343606 | ||
|
|
0941e33c11 | ||
|
|
971f08b125 | ||
|
|
cd7376eaf6 | ||
|
|
89e8ec86db | ||
|
|
47b6d4d83f | ||
|
|
e5ce8e5ebd | ||
|
|
fb83f6679a | ||
|
|
6957513960 | ||
|
|
c54ecefe4b | ||
|
|
450db504be | ||
|
|
da917ebc6b | ||
|
|
d997ff7652 | ||
|
|
c34bcbfc3a | ||
|
|
3ddd1b3d23 | ||
|
|
af05f9907c | ||
|
|
9a2d96d043 | ||
|
|
28c5909e1f | ||
|
|
1418c17ec9 | ||
|
|
a8d404aca7 | ||
|
|
989ef30f4a | ||
|
|
e877f05a06 | ||
|
|
e4bca75da1 | ||
|
|
418b1a7d2e | ||
|
|
db41ada262 | ||
|
|
27833773c9 | ||
|
|
1742ce201c | ||
|
|
850f16ca4c | ||
|
|
4d445c676c | ||
|
|
f9ac7aa549 | ||
|
|
a7e2b2cf35 | ||
|
|
55fc259849 | ||
|
|
c9a1e60d50 | ||
|
|
188a622c97 | ||
|
|
ccc01ab5dc | ||
|
|
ee1545fca0 | ||
|
|
267b40bfa1 | ||
|
|
f429888727 | ||
|
|
4ae550e4ab | ||
|
|
952ee91f7c | ||
|
|
a9fe2df233 | ||
|
|
d453499014 | ||
|
|
9395bebd46 | ||
|
|
75c52362b9 | ||
|
|
448922dbda | ||
|
|
686238e6e5 | ||
|
|
d9c21a43bf | ||
|
|
93f87913b4 | ||
|
|
ddf70d1aaa | ||
|
|
1091d6b666 | ||
|
|
734ecdae1b | ||
|
|
07907265b9 | ||
|
|
f6afe67f31 | ||
|
|
7fbe7bc3f9 | ||
|
|
fd71845140 |
2
Combine.bat
Normal file
2
Combine.bat
Normal file
@@ -0,0 +1,2 @@
|
||||
@ECHO OFF
|
||||
COPY /B /Y .\src\Header.js + .\src\Cache.js + .\src\Config.js + .\src\Data.js + .\src\Disp.js + .\src\Main.js + .\src\Sim.js + .\src\Footer.js CookieMonster.js
|
||||
2453
CookieMonster.js
2453
CookieMonster.js
File diff suppressed because it is too large
Load Diff
60
README.md
60
README.md
@@ -1,6 +1,6 @@
|
||||
# Cookie Monster
|
||||
|
||||
Cookie Monster is an addon you can load into Cookie Clicker, that offers a wide range of tools and statistics to enhance the game. It is **not** a cheat interface – although it does offer helpers for golden cookies and such, everything can be toggled off at will to only leave how much information you want.
|
||||
**Cookie Monster** is an addon you can load into Cookie Clicker, that offers a wide range of tools and statistics to enhance the game. **It is not a cheat interface** – although it does offer helpers for golden cookies and such, everything can be toggled off at will to only leave how much information you want.
|
||||
|
||||
This is a helper, and it is here to help you at *whichever* degree you want, if you only need some help shortening long numbers, it does that. If you need to be accompanied by hand to pick the best buildings to buy, it does that, but **everything is an option**.
|
||||
|
||||
@@ -26,7 +26,7 @@ This index is computed for buildings and upgrades. If the relevant option is ena
|
||||
* Purple: (upgrades) This item has a worse BCI than any building
|
||||
* Gray: (upgrades) This item has not been calculated and/or cannot be calculated due to no definitive worth.
|
||||
|
||||
Note : For this index, **lower is better**, meaning a building with a BCI of 1 is more interesting that one with a BCI of 3.
|
||||
Note: For this index, **lower is better**, meaning a building with a BCI of 1 is more interesting than one with a BCI of 3.
|
||||
|
||||
## What it doesn't do
|
||||
|
||||
@@ -50,19 +50,24 @@ Do note though that, although these upgrades have no direct value, if buying the
|
||||
|
||||
## Bookmarklet
|
||||
|
||||
Simply use like the previous addon, create a bookmark and set this as the URL. Then when in the game, click on that bookmark.
|
||||
Copy this code and save it as a bookmark. Paste it in the URL section. To activate, click the bookmark when the game's open.
|
||||
|
||||
```javascript
|
||||
javascript: (function () {
|
||||
var load = document.createElement('script');
|
||||
load.setAttribute('type', 'text/javascript');
|
||||
load.setAttribute('src', 'http://aktanusa.github.io/CookieMonster/CookieMonster.js');
|
||||
document.head.appendChild(load);
|
||||
Game.LoadMod('http://aktanusa.github.io/CookieMonster/CookieMonster.js');
|
||||
}());
|
||||
```
|
||||
|
||||
If (for some reason) the above doesn't work, trying pasting everything after the <code>javascript:</code> bit into your browser's console.
|
||||
|
||||
For beta, use the following instead:
|
||||
|
||||
```javascript
|
||||
javascript: (function () {
|
||||
Game.LoadMod('http://aktanusa.github.io/CookieMonster/CookieMonsterBeta.js');
|
||||
}());
|
||||
```
|
||||
|
||||
## Userscript
|
||||
|
||||
If you'd rather use the addon as a script via per example *Greasemonkey* or *Tampermonkey*, you can use the following script, which will automatically load *Cookie Monster* every time the original game loads. You may need to specify <code>http://orteil.dashnet.org/cookieclicker/</code> when asked for a *namespace* or *includes*. For how to add an userscript to your browser, refer to your browser/plugin's documentation as the method changes for each one.
|
||||
@@ -76,16 +81,34 @@ If you'd rather use the addon as a script via per example *Greasemonkey* or *Tam
|
||||
// @grant none
|
||||
// ==/UserScript==
|
||||
|
||||
var init = Game.Init;
|
||||
Game.Init = function() {
|
||||
init();
|
||||
(function () {
|
||||
var load = document.createElement('script');
|
||||
load.setAttribute('type', 'text/javascript');
|
||||
load.setAttribute('src', 'http://aktanusa.github.io/CookieMonster/CookieMonster.js');
|
||||
document.head.appendChild(load);
|
||||
}());
|
||||
javascript:(function() {
|
||||
var checkReady = setInterval(function() {
|
||||
if (typeof Game.ready !== 'undefined' && Game.ready) {
|
||||
Game.LoadMod('http://aktanusa.github.io/CookieMonster/CookieMonster.js');
|
||||
clearInterval(checkReady);
|
||||
}
|
||||
}, 1000);
|
||||
}());
|
||||
```
|
||||
If you are using the beta, use this instead:
|
||||
|
||||
```javascript
|
||||
// ==UserScript==
|
||||
// @name Cookie Monster Beta
|
||||
// @namespace Cookie
|
||||
// @include http://orteil.dashnet.org/cookieclicker/beta/
|
||||
// @version 1
|
||||
// @grant none
|
||||
// ==/UserScript==
|
||||
|
||||
javascript:(function() {
|
||||
var checkReady = setInterval(function() {
|
||||
if (typeof Game.ready !== 'undefined' && Game.ready) {
|
||||
Game.LoadMod('http://aktanusa.github.io/CookieMonster/CookieMonsterBeta.js');
|
||||
clearInterval(checkReady);
|
||||
}
|
||||
}, 1000);
|
||||
}());
|
||||
```
|
||||
|
||||
# Bugs and suggestions
|
||||
@@ -96,10 +119,7 @@ Before submitting a bug, make sure to give a shot at the latest version of the a
|
||||
|
||||
```javascript
|
||||
javascript: (function () {
|
||||
var load = document.createElement('script');
|
||||
load.setAttribute('type', 'text/javascript');
|
||||
load.setAttribute('src', 'https://raw.githubusercontent.com/Aktanusa/CookieMonster/dev/CookieMonster.js');
|
||||
document.head.appendChild(load);
|
||||
Game.LoadMod('https://raw.githubusercontent.com/Aktanusa/CookieMonster/dev/CookieMonster.js');
|
||||
}());
|
||||
```
|
||||
|
||||
|
||||
BIN
jscolor/arrow.gif
Normal file
BIN
jscolor/arrow.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 66 B |
BIN
jscolor/cross.gif
Normal file
BIN
jscolor/cross.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 83 B |
BIN
jscolor/hs.png
Normal file
BIN
jscolor/hs.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.6 KiB |
BIN
jscolor/hv.png
Normal file
BIN
jscolor/hv.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.8 KiB |
997
jscolor/jscolor.js
Normal file
997
jscolor/jscolor.js
Normal file
@@ -0,0 +1,997 @@
|
||||
/**
|
||||
* jscolor, JavaScript Color Picker
|
||||
*
|
||||
* @version 1.4.3
|
||||
* @license GNU Lesser General Public License, http://www.gnu.org/copyleft/lesser.html
|
||||
* @author Jan Odvarko, http://odvarko.cz
|
||||
* @created 2008-06-15
|
||||
* @updated 2014-07-16
|
||||
* @link http://jscolor.com
|
||||
*/
|
||||
|
||||
|
||||
var jscolor = {
|
||||
|
||||
|
||||
dir : '', // location of jscolor directory (leave empty to autodetect)
|
||||
bindClass : 'color', // class name
|
||||
binding : true, // automatic binding via <input class="...">
|
||||
preloading : true, // use image preloading?
|
||||
|
||||
|
||||
install : function() {
|
||||
jscolor.addEvent(window, 'load', jscolor.init);
|
||||
},
|
||||
|
||||
|
||||
init : function() {
|
||||
if(jscolor.binding) {
|
||||
jscolor.bind();
|
||||
}
|
||||
if(jscolor.preloading) {
|
||||
jscolor.preload();
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
getDir : function() {
|
||||
if(!jscolor.dir) {
|
||||
var detected = jscolor.detectDir();
|
||||
jscolor.dir = detected!==false ? detected : 'jscolor/';
|
||||
}
|
||||
return jscolor.dir;
|
||||
},
|
||||
|
||||
|
||||
detectDir : function() {
|
||||
var base = location.href;
|
||||
|
||||
var e = document.getElementsByTagName('base');
|
||||
for(var i=0; i<e.length; i+=1) {
|
||||
if(e[i].href) { base = e[i].href; }
|
||||
}
|
||||
|
||||
var e = document.getElementsByTagName('script');
|
||||
for(var i=0; i<e.length; i+=1) {
|
||||
if(e[i].src && /(^|\/)jscolor\.js([?#].*)?$/i.test(e[i].src)) {
|
||||
var src = new jscolor.URI(e[i].src);
|
||||
var srcAbs = src.toAbsolute(base);
|
||||
srcAbs.path = srcAbs.path.replace(/[^\/]+$/, ''); // remove filename
|
||||
srcAbs.query = null;
|
||||
srcAbs.fragment = null;
|
||||
return srcAbs.toString();
|
||||
}
|
||||
}
|
||||
return false;
|
||||
},
|
||||
|
||||
|
||||
bind : function() {
|
||||
var matchClass = new RegExp('(^|\\s)('+jscolor.bindClass+')(\\s*(\\{[^}]*\\})|\\s|$)', 'i');
|
||||
var e = document.getElementsByTagName('input');
|
||||
for(var i=0; i<e.length; i+=1) {
|
||||
var m;
|
||||
if(!e[i].color && e[i].className && (m = e[i].className.match(matchClass))) {
|
||||
var prop = {};
|
||||
if(m[4]) {
|
||||
try {
|
||||
prop = (new Function ('return (' + m[4] + ')'))();
|
||||
} catch(eInvalidProp) {}
|
||||
}
|
||||
e[i].color = new jscolor.color(e[i], prop);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
preload : function() {
|
||||
for(var fn in jscolor.imgRequire) {
|
||||
if(jscolor.imgRequire.hasOwnProperty(fn)) {
|
||||
jscolor.loadImage(fn);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
images : {
|
||||
pad : [ 181, 101 ],
|
||||
sld : [ 16, 101 ],
|
||||
cross : [ 15, 15 ],
|
||||
arrow : [ 7, 11 ]
|
||||
},
|
||||
|
||||
|
||||
imgRequire : {},
|
||||
imgLoaded : {},
|
||||
|
||||
|
||||
requireImage : function(filename) {
|
||||
jscolor.imgRequire[filename] = true;
|
||||
},
|
||||
|
||||
|
||||
loadImage : function(filename) {
|
||||
if(!jscolor.imgLoaded[filename]) {
|
||||
jscolor.imgLoaded[filename] = new Image();
|
||||
jscolor.imgLoaded[filename].src = jscolor.getDir()+filename;
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
fetchElement : function(mixed) {
|
||||
return typeof mixed === 'string' ? document.getElementById(mixed) : mixed;
|
||||
},
|
||||
|
||||
|
||||
addEvent : function(el, evnt, func) {
|
||||
if(el.addEventListener) {
|
||||
el.addEventListener(evnt, func, false);
|
||||
} else if(el.attachEvent) {
|
||||
el.attachEvent('on'+evnt, func);
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
fireEvent : function(el, evnt) {
|
||||
if(!el) {
|
||||
return;
|
||||
}
|
||||
if(document.createEvent) {
|
||||
var ev = document.createEvent('HTMLEvents');
|
||||
ev.initEvent(evnt, true, true);
|
||||
el.dispatchEvent(ev);
|
||||
} else if(document.createEventObject) {
|
||||
var ev = document.createEventObject();
|
||||
el.fireEvent('on'+evnt, ev);
|
||||
} else if(el['on'+evnt]) { // alternatively use the traditional event model (IE5)
|
||||
el['on'+evnt]();
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
getElementPos : function(e) {
|
||||
var e1=e, e2=e;
|
||||
var x=0, y=0;
|
||||
if(e1.offsetParent) {
|
||||
do {
|
||||
x += e1.offsetLeft;
|
||||
y += e1.offsetTop;
|
||||
} while(e1 = e1.offsetParent);
|
||||
}
|
||||
while((e2 = e2.parentNode) && e2.nodeName.toUpperCase() !== 'BODY') {
|
||||
x -= e2.scrollLeft;
|
||||
y -= e2.scrollTop;
|
||||
}
|
||||
return [x, y];
|
||||
},
|
||||
|
||||
|
||||
getElementSize : function(e) {
|
||||
return [e.offsetWidth, e.offsetHeight];
|
||||
},
|
||||
|
||||
|
||||
getRelMousePos : function(e) {
|
||||
var x = 0, y = 0;
|
||||
if (!e) { e = window.event; }
|
||||
if (typeof e.offsetX === 'number') {
|
||||
x = e.offsetX;
|
||||
y = e.offsetY;
|
||||
} else if (typeof e.layerX === 'number') {
|
||||
x = e.layerX;
|
||||
y = e.layerY;
|
||||
}
|
||||
return { x: x, y: y };
|
||||
},
|
||||
|
||||
|
||||
getViewPos : function() {
|
||||
if(typeof window.pageYOffset === 'number') {
|
||||
return [window.pageXOffset, window.pageYOffset];
|
||||
} else if(document.body && (document.body.scrollLeft || document.body.scrollTop)) {
|
||||
return [document.body.scrollLeft, document.body.scrollTop];
|
||||
} else if(document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {
|
||||
return [document.documentElement.scrollLeft, document.documentElement.scrollTop];
|
||||
} else {
|
||||
return [0, 0];
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
getViewSize : function() {
|
||||
if(typeof window.innerWidth === 'number') {
|
||||
return [window.innerWidth, window.innerHeight];
|
||||
} else if(document.body && (document.body.clientWidth || document.body.clientHeight)) {
|
||||
return [document.body.clientWidth, document.body.clientHeight];
|
||||
} else if(document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
|
||||
return [document.documentElement.clientWidth, document.documentElement.clientHeight];
|
||||
} else {
|
||||
return [0, 0];
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
URI : function(uri) { // See RFC3986
|
||||
|
||||
this.scheme = null;
|
||||
this.authority = null;
|
||||
this.path = '';
|
||||
this.query = null;
|
||||
this.fragment = null;
|
||||
|
||||
this.parse = function(uri) {
|
||||
var m = uri.match(/^(([A-Za-z][0-9A-Za-z+.-]*)(:))?((\/\/)([^\/?#]*))?([^?#]*)((\?)([^#]*))?((#)(.*))?/);
|
||||
this.scheme = m[3] ? m[2] : null;
|
||||
this.authority = m[5] ? m[6] : null;
|
||||
this.path = m[7];
|
||||
this.query = m[9] ? m[10] : null;
|
||||
this.fragment = m[12] ? m[13] : null;
|
||||
return this;
|
||||
};
|
||||
|
||||
this.toString = function() {
|
||||
var result = '';
|
||||
if(this.scheme !== null) { result = result + this.scheme + ':'; }
|
||||
if(this.authority !== null) { result = result + '//' + this.authority; }
|
||||
if(this.path !== null) { result = result + this.path; }
|
||||
if(this.query !== null) { result = result + '?' + this.query; }
|
||||
if(this.fragment !== null) { result = result + '#' + this.fragment; }
|
||||
return result;
|
||||
};
|
||||
|
||||
this.toAbsolute = function(base) {
|
||||
var base = new jscolor.URI(base);
|
||||
var r = this;
|
||||
var t = new jscolor.URI;
|
||||
|
||||
if(base.scheme === null) { return false; }
|
||||
|
||||
if(r.scheme !== null && r.scheme.toLowerCase() === base.scheme.toLowerCase()) {
|
||||
r.scheme = null;
|
||||
}
|
||||
|
||||
if(r.scheme !== null) {
|
||||
t.scheme = r.scheme;
|
||||
t.authority = r.authority;
|
||||
t.path = removeDotSegments(r.path);
|
||||
t.query = r.query;
|
||||
} else {
|
||||
if(r.authority !== null) {
|
||||
t.authority = r.authority;
|
||||
t.path = removeDotSegments(r.path);
|
||||
t.query = r.query;
|
||||
} else {
|
||||
if(r.path === '') {
|
||||
t.path = base.path;
|
||||
if(r.query !== null) {
|
||||
t.query = r.query;
|
||||
} else {
|
||||
t.query = base.query;
|
||||
}
|
||||
} else {
|
||||
if(r.path.substr(0,1) === '/') {
|
||||
t.path = removeDotSegments(r.path);
|
||||
} else {
|
||||
if(base.authority !== null && base.path === '') {
|
||||
t.path = '/'+r.path;
|
||||
} else {
|
||||
t.path = base.path.replace(/[^\/]+$/,'')+r.path;
|
||||
}
|
||||
t.path = removeDotSegments(t.path);
|
||||
}
|
||||
t.query = r.query;
|
||||
}
|
||||
t.authority = base.authority;
|
||||
}
|
||||
t.scheme = base.scheme;
|
||||
}
|
||||
t.fragment = r.fragment;
|
||||
|
||||
return t;
|
||||
};
|
||||
|
||||
function removeDotSegments(path) {
|
||||
var out = '';
|
||||
while(path) {
|
||||
if(path.substr(0,3)==='../' || path.substr(0,2)==='./') {
|
||||
path = path.replace(/^\.+/,'').substr(1);
|
||||
} else if(path.substr(0,3)==='/./' || path==='/.') {
|
||||
path = '/'+path.substr(3);
|
||||
} else if(path.substr(0,4)==='/../' || path==='/..') {
|
||||
path = '/'+path.substr(4);
|
||||
out = out.replace(/\/?[^\/]*$/, '');
|
||||
} else if(path==='.' || path==='..') {
|
||||
path = '';
|
||||
} else {
|
||||
var rm = path.match(/^\/?[^\/]*/)[0];
|
||||
path = path.substr(rm.length);
|
||||
out = out + rm;
|
||||
}
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
if(uri) {
|
||||
this.parse(uri);
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
|
||||
//
|
||||
// Usage example:
|
||||
// var myColor = new jscolor.color(myInputElement)
|
||||
//
|
||||
|
||||
color : function(target, prop) {
|
||||
|
||||
|
||||
this.required = true; // refuse empty values?
|
||||
this.adjust = true; // adjust value to uniform notation?
|
||||
this.hash = false; // prefix color with # symbol?
|
||||
this.caps = true; // uppercase?
|
||||
this.slider = true; // show the value/saturation slider?
|
||||
this.valueElement = target; // value holder
|
||||
this.styleElement = target; // where to reflect current color
|
||||
this.onImmediateChange = null; // onchange callback (can be either string or function)
|
||||
this.hsv = [0, 0, 1]; // read-only 0-6, 0-1, 0-1
|
||||
this.rgb = [1, 1, 1]; // read-only 0-1, 0-1, 0-1
|
||||
this.minH = 0; // read-only 0-6
|
||||
this.maxH = 6; // read-only 0-6
|
||||
this.minS = 0; // read-only 0-1
|
||||
this.maxS = 1; // read-only 0-1
|
||||
this.minV = 0; // read-only 0-1
|
||||
this.maxV = 1; // read-only 0-1
|
||||
|
||||
this.pickerOnfocus = true; // display picker on focus?
|
||||
this.pickerMode = 'HSV'; // HSV | HVS
|
||||
this.pickerPosition = 'bottom'; // left | right | top | bottom
|
||||
this.pickerSmartPosition = true; // automatically adjust picker position when necessary
|
||||
this.pickerButtonHeight = 20; // px
|
||||
this.pickerClosable = false;
|
||||
this.pickerCloseText = 'Close';
|
||||
this.pickerButtonColor = 'ButtonText'; // px
|
||||
this.pickerFace = 10; // px
|
||||
this.pickerFaceColor = 'ThreeDFace'; // CSS color
|
||||
this.pickerBorder = 1; // px
|
||||
this.pickerBorderColor = 'ThreeDHighlight ThreeDShadow ThreeDShadow ThreeDHighlight'; // CSS color
|
||||
this.pickerInset = 1; // px
|
||||
this.pickerInsetColor = 'ThreeDShadow ThreeDHighlight ThreeDHighlight ThreeDShadow'; // CSS color
|
||||
this.pickerZIndex = 10000;
|
||||
|
||||
|
||||
for(var p in prop) {
|
||||
if(prop.hasOwnProperty(p)) {
|
||||
this[p] = prop[p];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
this.hidePicker = function() {
|
||||
if(isPickerOwner()) {
|
||||
removePicker();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
this.showPicker = function() {
|
||||
if(!isPickerOwner()) {
|
||||
var tp = jscolor.getElementPos(target); // target pos
|
||||
var ts = jscolor.getElementSize(target); // target size
|
||||
var vp = jscolor.getViewPos(); // view pos
|
||||
var vs = jscolor.getViewSize(); // view size
|
||||
var ps = getPickerDims(this); // picker size
|
||||
var a, b, c;
|
||||
switch(this.pickerPosition.toLowerCase()) {
|
||||
case 'left': a=1; b=0; c=-1; break;
|
||||
case 'right':a=1; b=0; c=1; break;
|
||||
case 'top': a=0; b=1; c=-1; break;
|
||||
default: a=0; b=1; c=1; break;
|
||||
}
|
||||
var l = (ts[b]+ps[b])/2;
|
||||
|
||||
// picker pos
|
||||
if (!this.pickerSmartPosition) {
|
||||
var pp = [
|
||||
tp[a],
|
||||
tp[b]+ts[b]-l+l*c
|
||||
];
|
||||
} else {
|
||||
var pp = [
|
||||
-vp[a]+tp[a]+ps[a] > vs[a] ?
|
||||
(-vp[a]+tp[a]+ts[a]/2 > vs[a]/2 && tp[a]+ts[a]-ps[a] >= 0 ? tp[a]+ts[a]-ps[a] : tp[a]) :
|
||||
tp[a],
|
||||
-vp[b]+tp[b]+ts[b]+ps[b]-l+l*c > vs[b] ?
|
||||
(-vp[b]+tp[b]+ts[b]/2 > vs[b]/2 && tp[b]+ts[b]-l-l*c >= 0 ? tp[b]+ts[b]-l-l*c : tp[b]+ts[b]-l+l*c) :
|
||||
(tp[b]+ts[b]-l+l*c >= 0 ? tp[b]+ts[b]-l+l*c : tp[b]+ts[b]-l-l*c)
|
||||
];
|
||||
}
|
||||
drawPicker(pp[a], pp[b]);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
this.importColor = function() {
|
||||
if(!valueElement) {
|
||||
this.exportColor();
|
||||
} else {
|
||||
if(!this.adjust) {
|
||||
if(!this.fromString(valueElement.value, leaveValue)) {
|
||||
styleElement.style.backgroundImage = styleElement.jscStyle.backgroundImage;
|
||||
styleElement.style.backgroundColor = styleElement.jscStyle.backgroundColor;
|
||||
styleElement.style.color = styleElement.jscStyle.color;
|
||||
this.exportColor(leaveValue | leaveStyle);
|
||||
}
|
||||
} else if(!this.required && /^\s*$/.test(valueElement.value)) {
|
||||
valueElement.value = '';
|
||||
styleElement.style.backgroundImage = styleElement.jscStyle.backgroundImage;
|
||||
styleElement.style.backgroundColor = styleElement.jscStyle.backgroundColor;
|
||||
styleElement.style.color = styleElement.jscStyle.color;
|
||||
this.exportColor(leaveValue | leaveStyle);
|
||||
|
||||
} else if(this.fromString(valueElement.value)) {
|
||||
// OK
|
||||
} else {
|
||||
this.exportColor();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
this.exportColor = function(flags) {
|
||||
if(!(flags & leaveValue) && valueElement) {
|
||||
var value = this.toString();
|
||||
if(this.caps) { value = value.toUpperCase(); }
|
||||
if(this.hash) { value = '#'+value; }
|
||||
valueElement.value = value;
|
||||
}
|
||||
if(!(flags & leaveStyle) && styleElement) {
|
||||
styleElement.style.backgroundImage = "none";
|
||||
styleElement.style.backgroundColor =
|
||||
'#'+this.toString();
|
||||
styleElement.style.color =
|
||||
0.213 * this.rgb[0] +
|
||||
0.715 * this.rgb[1] +
|
||||
0.072 * this.rgb[2]
|
||||
< 0.5 ? '#FFF' : '#000';
|
||||
}
|
||||
if(!(flags & leavePad) && isPickerOwner()) {
|
||||
redrawPad();
|
||||
}
|
||||
if(!(flags & leaveSld) && isPickerOwner()) {
|
||||
redrawSld();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
this.fromHSV = function(h, s, v, flags) { // null = don't change
|
||||
if(h !== null) { h = Math.max(0.0, this.minH, Math.min(6.0, this.maxH, h)); }
|
||||
if(s !== null) { s = Math.max(0.0, this.minS, Math.min(1.0, this.maxS, s)); }
|
||||
if(v !== null) { v = Math.max(0.0, this.minV, Math.min(1.0, this.maxV, v)); }
|
||||
|
||||
this.rgb = HSV_RGB(
|
||||
h===null ? this.hsv[0] : (this.hsv[0]=h),
|
||||
s===null ? this.hsv[1] : (this.hsv[1]=s),
|
||||
v===null ? this.hsv[2] : (this.hsv[2]=v)
|
||||
);
|
||||
|
||||
this.exportColor(flags);
|
||||
};
|
||||
|
||||
|
||||
this.fromRGB = function(r, g, b, flags) { // null = don't change
|
||||
if(r !== null) { r = Math.max(0.0, Math.min(1.0, r)); }
|
||||
if(g !== null) { g = Math.max(0.0, Math.min(1.0, g)); }
|
||||
if(b !== null) { b = Math.max(0.0, Math.min(1.0, b)); }
|
||||
|
||||
var hsv = RGB_HSV(
|
||||
r===null ? this.rgb[0] : r,
|
||||
g===null ? this.rgb[1] : g,
|
||||
b===null ? this.rgb[2] : b
|
||||
);
|
||||
if(hsv[0] !== null) {
|
||||
this.hsv[0] = Math.max(0.0, this.minH, Math.min(6.0, this.maxH, hsv[0]));
|
||||
}
|
||||
if(hsv[2] !== 0) {
|
||||
this.hsv[1] = hsv[1]===null ? null : Math.max(0.0, this.minS, Math.min(1.0, this.maxS, hsv[1]));
|
||||
}
|
||||
this.hsv[2] = hsv[2]===null ? null : Math.max(0.0, this.minV, Math.min(1.0, this.maxV, hsv[2]));
|
||||
|
||||
// update RGB according to final HSV, as some values might be trimmed
|
||||
var rgb = HSV_RGB(this.hsv[0], this.hsv[1], this.hsv[2]);
|
||||
this.rgb[0] = rgb[0];
|
||||
this.rgb[1] = rgb[1];
|
||||
this.rgb[2] = rgb[2];
|
||||
|
||||
this.exportColor(flags);
|
||||
};
|
||||
|
||||
|
||||
this.fromString = function(hex, flags) {
|
||||
var m = hex.match(/^\W*([0-9A-F]{3}([0-9A-F]{3})?)\W*$/i);
|
||||
if(!m) {
|
||||
return false;
|
||||
} else {
|
||||
if(m[1].length === 6) { // 6-char notation
|
||||
this.fromRGB(
|
||||
parseInt(m[1].substr(0,2),16) / 255,
|
||||
parseInt(m[1].substr(2,2),16) / 255,
|
||||
parseInt(m[1].substr(4,2),16) / 255,
|
||||
flags
|
||||
);
|
||||
} else { // 3-char notation
|
||||
this.fromRGB(
|
||||
parseInt(m[1].charAt(0)+m[1].charAt(0),16) / 255,
|
||||
parseInt(m[1].charAt(1)+m[1].charAt(1),16) / 255,
|
||||
parseInt(m[1].charAt(2)+m[1].charAt(2),16) / 255,
|
||||
flags
|
||||
);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
this.toString = function() {
|
||||
return (
|
||||
(0x100 | Math.round(255*this.rgb[0])).toString(16).substr(1) +
|
||||
(0x100 | Math.round(255*this.rgb[1])).toString(16).substr(1) +
|
||||
(0x100 | Math.round(255*this.rgb[2])).toString(16).substr(1)
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
function RGB_HSV(r, g, b) {
|
||||
var n = Math.min(Math.min(r,g),b);
|
||||
var v = Math.max(Math.max(r,g),b);
|
||||
var m = v - n;
|
||||
if(m === 0) { return [ null, 0, v ]; }
|
||||
var h = r===n ? 3+(b-g)/m : (g===n ? 5+(r-b)/m : 1+(g-r)/m);
|
||||
return [ h===6?0:h, m/v, v ];
|
||||
}
|
||||
|
||||
|
||||
function HSV_RGB(h, s, v) {
|
||||
if(h === null) { return [ v, v, v ]; }
|
||||
var i = Math.floor(h);
|
||||
var f = i%2 ? h-i : 1-(h-i);
|
||||
var m = v * (1 - s);
|
||||
var n = v * (1 - s*f);
|
||||
switch(i) {
|
||||
case 6:
|
||||
case 0: return [v,n,m];
|
||||
case 1: return [n,v,m];
|
||||
case 2: return [m,v,n];
|
||||
case 3: return [m,n,v];
|
||||
case 4: return [n,m,v];
|
||||
case 5: return [v,m,n];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function removePicker() {
|
||||
delete jscolor.picker.owner;
|
||||
document.getElementsByTagName('body')[0].removeChild(jscolor.picker.boxB);
|
||||
}
|
||||
|
||||
|
||||
function drawPicker(x, y) {
|
||||
if(!jscolor.picker) {
|
||||
jscolor.picker = {
|
||||
box : document.createElement('div'),
|
||||
boxB : document.createElement('div'),
|
||||
pad : document.createElement('div'),
|
||||
padB : document.createElement('div'),
|
||||
padM : document.createElement('div'),
|
||||
sld : document.createElement('div'),
|
||||
sldB : document.createElement('div'),
|
||||
sldM : document.createElement('div'),
|
||||
btn : document.createElement('div'),
|
||||
btnS : document.createElement('span'),
|
||||
btnT : document.createTextNode(THIS.pickerCloseText)
|
||||
};
|
||||
for(var i=0,segSize=4; i<jscolor.images.sld[1]; i+=segSize) {
|
||||
var seg = document.createElement('div');
|
||||
seg.style.height = segSize+'px';
|
||||
seg.style.fontSize = '1px';
|
||||
seg.style.lineHeight = '0';
|
||||
jscolor.picker.sld.appendChild(seg);
|
||||
}
|
||||
jscolor.picker.sldB.appendChild(jscolor.picker.sld);
|
||||
jscolor.picker.box.appendChild(jscolor.picker.sldB);
|
||||
jscolor.picker.box.appendChild(jscolor.picker.sldM);
|
||||
jscolor.picker.padB.appendChild(jscolor.picker.pad);
|
||||
jscolor.picker.box.appendChild(jscolor.picker.padB);
|
||||
jscolor.picker.box.appendChild(jscolor.picker.padM);
|
||||
jscolor.picker.btnS.appendChild(jscolor.picker.btnT);
|
||||
jscolor.picker.btn.appendChild(jscolor.picker.btnS);
|
||||
jscolor.picker.box.appendChild(jscolor.picker.btn);
|
||||
jscolor.picker.boxB.appendChild(jscolor.picker.box);
|
||||
}
|
||||
|
||||
var p = jscolor.picker;
|
||||
|
||||
// controls interaction
|
||||
p.box.onmouseup =
|
||||
p.box.onmouseout = function() { target.focus(); };
|
||||
p.box.onmousedown = function() { abortBlur=true; };
|
||||
p.box.onmousemove = function(e) {
|
||||
if (holdPad || holdSld) {
|
||||
holdPad && setPad(e);
|
||||
holdSld && setSld(e);
|
||||
if (document.selection) {
|
||||
document.selection.empty();
|
||||
} else if (window.getSelection) {
|
||||
window.getSelection().removeAllRanges();
|
||||
}
|
||||
dispatchImmediateChange();
|
||||
}
|
||||
};
|
||||
if('ontouchstart' in window) { // if touch device
|
||||
var handle_touchmove = function(e) {
|
||||
var event={
|
||||
'offsetX': e.touches[0].pageX-touchOffset.X,
|
||||
'offsetY': e.touches[0].pageY-touchOffset.Y
|
||||
};
|
||||
if (holdPad || holdSld) {
|
||||
holdPad && setPad(event);
|
||||
holdSld && setSld(event);
|
||||
dispatchImmediateChange();
|
||||
}
|
||||
e.stopPropagation(); // prevent move "view" on broswer
|
||||
e.preventDefault(); // prevent Default - Android Fix (else android generated only 1-2 touchmove events)
|
||||
};
|
||||
p.box.removeEventListener('touchmove', handle_touchmove, false)
|
||||
p.box.addEventListener('touchmove', handle_touchmove, false)
|
||||
}
|
||||
p.padM.onmouseup =
|
||||
p.padM.onmouseout = function() { if(holdPad) { holdPad=false; jscolor.fireEvent(valueElement,'change'); } };
|
||||
p.padM.onmousedown = function(e) {
|
||||
// if the slider is at the bottom, move it up
|
||||
switch(modeID) {
|
||||
case 0: if (THIS.hsv[2] === 0) { THIS.fromHSV(null, null, 1.0); }; break;
|
||||
case 1: if (THIS.hsv[1] === 0) { THIS.fromHSV(null, 1.0, null); }; break;
|
||||
}
|
||||
holdSld=false;
|
||||
holdPad=true;
|
||||
setPad(e);
|
||||
dispatchImmediateChange();
|
||||
};
|
||||
if('ontouchstart' in window) {
|
||||
p.padM.addEventListener('touchstart', function(e) {
|
||||
touchOffset={
|
||||
'X': e.target.offsetParent.offsetLeft,
|
||||
'Y': e.target.offsetParent.offsetTop
|
||||
};
|
||||
this.onmousedown({
|
||||
'offsetX':e.touches[0].pageX-touchOffset.X,
|
||||
'offsetY':e.touches[0].pageY-touchOffset.Y
|
||||
});
|
||||
});
|
||||
}
|
||||
p.sldM.onmouseup =
|
||||
p.sldM.onmouseout = function() { if(holdSld) { holdSld=false; jscolor.fireEvent(valueElement,'change'); } };
|
||||
p.sldM.onmousedown = function(e) {
|
||||
holdPad=false;
|
||||
holdSld=true;
|
||||
setSld(e);
|
||||
dispatchImmediateChange();
|
||||
};
|
||||
if('ontouchstart' in window) {
|
||||
p.sldM.addEventListener('touchstart', function(e) {
|
||||
touchOffset={
|
||||
'X': e.target.offsetParent.offsetLeft,
|
||||
'Y': e.target.offsetParent.offsetTop
|
||||
};
|
||||
this.onmousedown({
|
||||
'offsetX':e.touches[0].pageX-touchOffset.X,
|
||||
'offsetY':e.touches[0].pageY-touchOffset.Y
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// picker
|
||||
var dims = getPickerDims(THIS);
|
||||
p.box.style.width = dims[0] + 'px';
|
||||
p.box.style.height = dims[1] + 'px';
|
||||
|
||||
// picker border
|
||||
p.boxB.style.position = 'absolute';
|
||||
p.boxB.style.clear = 'both';
|
||||
p.boxB.style.left = x+'px';
|
||||
p.boxB.style.top = y+'px';
|
||||
p.boxB.style.zIndex = THIS.pickerZIndex;
|
||||
p.boxB.style.border = THIS.pickerBorder+'px solid';
|
||||
p.boxB.style.borderColor = THIS.pickerBorderColor;
|
||||
p.boxB.style.background = THIS.pickerFaceColor;
|
||||
|
||||
// pad image
|
||||
p.pad.style.width = jscolor.images.pad[0]+'px';
|
||||
p.pad.style.height = jscolor.images.pad[1]+'px';
|
||||
|
||||
// pad border
|
||||
p.padB.style.position = 'absolute';
|
||||
p.padB.style.left = THIS.pickerFace+'px';
|
||||
p.padB.style.top = THIS.pickerFace+'px';
|
||||
p.padB.style.border = THIS.pickerInset+'px solid';
|
||||
p.padB.style.borderColor = THIS.pickerInsetColor;
|
||||
|
||||
// pad mouse area
|
||||
p.padM.style.position = 'absolute';
|
||||
p.padM.style.left = '0';
|
||||
p.padM.style.top = '0';
|
||||
p.padM.style.width = THIS.pickerFace + 2*THIS.pickerInset + jscolor.images.pad[0] + jscolor.images.arrow[0] + 'px';
|
||||
p.padM.style.height = p.box.style.height;
|
||||
p.padM.style.cursor = 'crosshair';
|
||||
|
||||
// slider image
|
||||
p.sld.style.overflow = 'hidden';
|
||||
p.sld.style.width = jscolor.images.sld[0]+'px';
|
||||
p.sld.style.height = jscolor.images.sld[1]+'px';
|
||||
|
||||
// slider border
|
||||
p.sldB.style.display = THIS.slider ? 'block' : 'none';
|
||||
p.sldB.style.position = 'absolute';
|
||||
p.sldB.style.right = THIS.pickerFace+'px';
|
||||
p.sldB.style.top = THIS.pickerFace+'px';
|
||||
p.sldB.style.border = THIS.pickerInset+'px solid';
|
||||
p.sldB.style.borderColor = THIS.pickerInsetColor;
|
||||
|
||||
// slider mouse area
|
||||
p.sldM.style.display = THIS.slider ? 'block' : 'none';
|
||||
p.sldM.style.position = 'absolute';
|
||||
p.sldM.style.right = '0';
|
||||
p.sldM.style.top = '0';
|
||||
p.sldM.style.width = jscolor.images.sld[0] + jscolor.images.arrow[0] + THIS.pickerFace + 2*THIS.pickerInset + 'px';
|
||||
p.sldM.style.height = p.box.style.height;
|
||||
try {
|
||||
p.sldM.style.cursor = 'pointer';
|
||||
} catch(eOldIE) {
|
||||
p.sldM.style.cursor = 'hand';
|
||||
}
|
||||
|
||||
// "close" button
|
||||
function setBtnBorder() {
|
||||
var insetColors = THIS.pickerInsetColor.split(/\s+/);
|
||||
var pickerOutsetColor = insetColors.length < 2 ? insetColors[0] : insetColors[1] + ' ' + insetColors[0] + ' ' + insetColors[0] + ' ' + insetColors[1];
|
||||
p.btn.style.borderColor = pickerOutsetColor;
|
||||
}
|
||||
p.btn.style.display = THIS.pickerClosable ? 'block' : 'none';
|
||||
p.btn.style.position = 'absolute';
|
||||
p.btn.style.left = THIS.pickerFace + 'px';
|
||||
p.btn.style.bottom = THIS.pickerFace + 'px';
|
||||
p.btn.style.padding = '0 15px';
|
||||
p.btn.style.height = '18px';
|
||||
p.btn.style.border = THIS.pickerInset + 'px solid';
|
||||
setBtnBorder();
|
||||
p.btn.style.color = THIS.pickerButtonColor;
|
||||
p.btn.style.font = '12px sans-serif';
|
||||
p.btn.style.textAlign = 'center';
|
||||
try {
|
||||
p.btn.style.cursor = 'pointer';
|
||||
} catch(eOldIE) {
|
||||
p.btn.style.cursor = 'hand';
|
||||
}
|
||||
p.btn.onmousedown = function () {
|
||||
THIS.hidePicker();
|
||||
};
|
||||
p.btnS.style.lineHeight = p.btn.style.height;
|
||||
|
||||
// load images in optimal order
|
||||
switch(modeID) {
|
||||
case 0: var padImg = 'hs.png'; break;
|
||||
case 1: var padImg = 'hv.png'; break;
|
||||
}
|
||||
p.padM.style.backgroundImage = "url('"+jscolor.getDir()+"cross.gif')";
|
||||
p.padM.style.backgroundRepeat = "no-repeat";
|
||||
p.sldM.style.backgroundImage = "url('"+jscolor.getDir()+"arrow.gif')";
|
||||
p.sldM.style.backgroundRepeat = "no-repeat";
|
||||
p.pad.style.backgroundImage = "url('"+jscolor.getDir()+padImg+"')";
|
||||
p.pad.style.backgroundRepeat = "no-repeat";
|
||||
p.pad.style.backgroundPosition = "0 0";
|
||||
|
||||
// place pointers
|
||||
redrawPad();
|
||||
redrawSld();
|
||||
|
||||
jscolor.picker.owner = THIS;
|
||||
document.getElementsByTagName('body')[0].appendChild(p.boxB);
|
||||
}
|
||||
|
||||
|
||||
function getPickerDims(o) {
|
||||
var dims = [
|
||||
2*o.pickerInset + 2*o.pickerFace + jscolor.images.pad[0] +
|
||||
(o.slider ? 2*o.pickerInset + 2*jscolor.images.arrow[0] + jscolor.images.sld[0] : 0),
|
||||
o.pickerClosable ?
|
||||
4*o.pickerInset + 3*o.pickerFace + jscolor.images.pad[1] + o.pickerButtonHeight :
|
||||
2*o.pickerInset + 2*o.pickerFace + jscolor.images.pad[1]
|
||||
];
|
||||
return dims;
|
||||
}
|
||||
|
||||
|
||||
function redrawPad() {
|
||||
// redraw the pad pointer
|
||||
switch(modeID) {
|
||||
case 0: var yComponent = 1; break;
|
||||
case 1: var yComponent = 2; break;
|
||||
}
|
||||
var x = Math.round((THIS.hsv[0]/6) * (jscolor.images.pad[0]-1));
|
||||
var y = Math.round((1-THIS.hsv[yComponent]) * (jscolor.images.pad[1]-1));
|
||||
jscolor.picker.padM.style.backgroundPosition =
|
||||
(THIS.pickerFace+THIS.pickerInset+x - Math.floor(jscolor.images.cross[0]/2)) + 'px ' +
|
||||
(THIS.pickerFace+THIS.pickerInset+y - Math.floor(jscolor.images.cross[1]/2)) + 'px';
|
||||
|
||||
// redraw the slider image
|
||||
var seg = jscolor.picker.sld.childNodes;
|
||||
|
||||
switch(modeID) {
|
||||
case 0:
|
||||
var rgb = HSV_RGB(THIS.hsv[0], THIS.hsv[1], 1);
|
||||
for(var i=0; i<seg.length; i+=1) {
|
||||
seg[i].style.backgroundColor = 'rgb('+
|
||||
(rgb[0]*(1-i/seg.length)*100)+'%,'+
|
||||
(rgb[1]*(1-i/seg.length)*100)+'%,'+
|
||||
(rgb[2]*(1-i/seg.length)*100)+'%)';
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
var rgb, s, c = [ THIS.hsv[2], 0, 0 ];
|
||||
var i = Math.floor(THIS.hsv[0]);
|
||||
var f = i%2 ? THIS.hsv[0]-i : 1-(THIS.hsv[0]-i);
|
||||
switch(i) {
|
||||
case 6:
|
||||
case 0: rgb=[0,1,2]; break;
|
||||
case 1: rgb=[1,0,2]; break;
|
||||
case 2: rgb=[2,0,1]; break;
|
||||
case 3: rgb=[2,1,0]; break;
|
||||
case 4: rgb=[1,2,0]; break;
|
||||
case 5: rgb=[0,2,1]; break;
|
||||
}
|
||||
for(var i=0; i<seg.length; i+=1) {
|
||||
s = 1 - 1/(seg.length-1)*i;
|
||||
c[1] = c[0] * (1 - s*f);
|
||||
c[2] = c[0] * (1 - s);
|
||||
seg[i].style.backgroundColor = 'rgb('+
|
||||
(c[rgb[0]]*100)+'%,'+
|
||||
(c[rgb[1]]*100)+'%,'+
|
||||
(c[rgb[2]]*100)+'%)';
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function redrawSld() {
|
||||
// redraw the slider pointer
|
||||
switch(modeID) {
|
||||
case 0: var yComponent = 2; break;
|
||||
case 1: var yComponent = 1; break;
|
||||
}
|
||||
var y = Math.round((1-THIS.hsv[yComponent]) * (jscolor.images.sld[1]-1));
|
||||
jscolor.picker.sldM.style.backgroundPosition =
|
||||
'0 ' + (THIS.pickerFace+THIS.pickerInset+y - Math.floor(jscolor.images.arrow[1]/2)) + 'px';
|
||||
}
|
||||
|
||||
|
||||
function isPickerOwner() {
|
||||
return jscolor.picker && jscolor.picker.owner === THIS;
|
||||
}
|
||||
|
||||
|
||||
function blurTarget() {
|
||||
if(valueElement === target) {
|
||||
THIS.importColor();
|
||||
}
|
||||
if(THIS.pickerOnfocus) {
|
||||
THIS.hidePicker();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function blurValue() {
|
||||
if(valueElement !== target) {
|
||||
THIS.importColor();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function setPad(e) {
|
||||
var mpos = jscolor.getRelMousePos(e);
|
||||
var x = mpos.x - THIS.pickerFace - THIS.pickerInset;
|
||||
var y = mpos.y - THIS.pickerFace - THIS.pickerInset;
|
||||
switch(modeID) {
|
||||
case 0: THIS.fromHSV(x*(6/(jscolor.images.pad[0]-1)), 1 - y/(jscolor.images.pad[1]-1), null, leaveSld); break;
|
||||
case 1: THIS.fromHSV(x*(6/(jscolor.images.pad[0]-1)), null, 1 - y/(jscolor.images.pad[1]-1), leaveSld); break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function setSld(e) {
|
||||
var mpos = jscolor.getRelMousePos(e);
|
||||
var y = mpos.y - THIS.pickerFace - THIS.pickerInset;
|
||||
switch(modeID) {
|
||||
case 0: THIS.fromHSV(null, null, 1 - y/(jscolor.images.sld[1]-1), leavePad); break;
|
||||
case 1: THIS.fromHSV(null, 1 - y/(jscolor.images.sld[1]-1), null, leavePad); break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function dispatchImmediateChange() {
|
||||
if (THIS.onImmediateChange) {
|
||||
var callback;
|
||||
if (typeof THIS.onImmediateChange === 'string') {
|
||||
callback = new Function (THIS.onImmediateChange);
|
||||
} else {
|
||||
callback = THIS.onImmediateChange;
|
||||
}
|
||||
callback.call(THIS);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var THIS = this;
|
||||
var modeID = this.pickerMode.toLowerCase()==='hvs' ? 1 : 0;
|
||||
var abortBlur = false;
|
||||
var
|
||||
valueElement = jscolor.fetchElement(this.valueElement),
|
||||
styleElement = jscolor.fetchElement(this.styleElement);
|
||||
var
|
||||
holdPad = false,
|
||||
holdSld = false,
|
||||
touchOffset = {};
|
||||
var
|
||||
leaveValue = 1<<0,
|
||||
leaveStyle = 1<<1,
|
||||
leavePad = 1<<2,
|
||||
leaveSld = 1<<3;
|
||||
|
||||
// target
|
||||
jscolor.addEvent(target, 'focus', function() {
|
||||
if(THIS.pickerOnfocus) { THIS.showPicker(); }
|
||||
});
|
||||
jscolor.addEvent(target, 'blur', function() {
|
||||
if(!abortBlur) {
|
||||
window.setTimeout(function(){ abortBlur || blurTarget(); abortBlur=false; }, 0);
|
||||
} else {
|
||||
abortBlur = false;
|
||||
}
|
||||
});
|
||||
|
||||
// valueElement
|
||||
if(valueElement) {
|
||||
var updateField = function() {
|
||||
THIS.fromString(valueElement.value, leaveValue);
|
||||
dispatchImmediateChange();
|
||||
};
|
||||
jscolor.addEvent(valueElement, 'keyup', updateField);
|
||||
jscolor.addEvent(valueElement, 'input', updateField);
|
||||
jscolor.addEvent(valueElement, 'blur', blurValue);
|
||||
valueElement.setAttribute('autocomplete', 'off');
|
||||
}
|
||||
|
||||
// styleElement
|
||||
if(styleElement) {
|
||||
styleElement.jscStyle = {
|
||||
backgroundImage : styleElement.style.backgroundImage,
|
||||
backgroundColor : styleElement.style.backgroundColor,
|
||||
color : styleElement.style.color
|
||||
};
|
||||
}
|
||||
|
||||
// require images
|
||||
switch(modeID) {
|
||||
case 0: jscolor.requireImage('hs.png'); break;
|
||||
case 1: jscolor.requireImage('hv.png'); break;
|
||||
}
|
||||
jscolor.requireImage('cross.gif');
|
||||
jscolor.requireImage('arrow.gif');
|
||||
|
||||
this.importColor();
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
jscolor.install();
|
||||
179
src/Cache.js
Normal file
179
src/Cache.js
Normal file
@@ -0,0 +1,179 @@
|
||||
/*********
|
||||
* Cache *
|
||||
*********/
|
||||
|
||||
CM.Cache.NextNumber = function(base) {
|
||||
var count = base > Math.pow(2, 53) ? Math.pow(2, Math.floor(Math.log(base) / Math.log(2)) - 53) : 1;
|
||||
while (base == base + count) {
|
||||
count = CM.Cache.NextNumber(count);
|
||||
}
|
||||
return (base + count);
|
||||
}
|
||||
|
||||
CM.Cache.RemakeIncome = function() {
|
||||
// Simulate Building Buys for 1 amount
|
||||
CM.Sim.BuyBuildings(1, 'Objects');
|
||||
|
||||
// Simulate Upgrade Buys
|
||||
CM.Sim.BuyUpgrades();
|
||||
|
||||
// Simulate Building Buys for 10 amount
|
||||
CM.Sim.BuyBuildings(10, 'Objects10');
|
||||
}
|
||||
|
||||
CM.Cache.RemakeBuildingsBCI = function() {
|
||||
CM.Disp.min = -1;
|
||||
CM.Disp.max = -1;
|
||||
CM.Disp.mid = -1;
|
||||
for (var i in CM.Cache.Objects) {
|
||||
CM.Cache.Objects[i].bci = Game.Objects[i].getPrice() / CM.Cache.Objects[i].bonus;
|
||||
if (CM.Disp.min == -1 || CM.Cache.Objects[i].bci < CM.Disp.min) CM.Disp.min = CM.Cache.Objects[i].bci;
|
||||
if (CM.Disp.max == -1 || CM.Cache.Objects[i].bci > CM.Disp.max) CM.Disp.max = CM.Cache.Objects[i].bci;
|
||||
}
|
||||
CM.Disp.mid = ((CM.Disp.max - CM.Disp.min) / 2) + CM.Disp.min;
|
||||
for (var i in CM.Cache.Objects) {
|
||||
var color = '';
|
||||
if (CM.Cache.Objects[i].bci == CM.Disp.min) color = CM.Disp.colorGreen;
|
||||
else if (CM.Cache.Objects[i].bci == CM.Disp.max) color = CM.Disp.colorRed;
|
||||
else if (CM.Cache.Objects[i].bci > CM.Disp.mid) color = CM.Disp.colorOrange;
|
||||
else color = CM.Disp.colorYellow;
|
||||
CM.Cache.Objects[i].color = color;
|
||||
}
|
||||
}
|
||||
|
||||
CM.Cache.RemakeUpgradeBCI = function() {
|
||||
for (var i in CM.Cache.Upgrades) {
|
||||
CM.Cache.Upgrades[i].bci = Game.Upgrades[i].getPrice() / CM.Cache.Upgrades[i].bonus;
|
||||
if (isNaN(CM.Cache.Upgrades[i].bci)) CM.Cache.Upgrades[i].bci = 'Infinity';
|
||||
var color = '';
|
||||
if (CM.Cache.Upgrades[i].bci <= 0 || CM.Cache.Upgrades[i].bci == 'Infinity') color = CM.Disp.colorGray;
|
||||
else if (CM.Cache.Upgrades[i].bci < CM.Disp.min) color = CM.Disp.colorBlue;
|
||||
else if (CM.Cache.Upgrades[i].bci == CM.Disp.min) color = CM.Disp.colorGreen;
|
||||
else if (CM.Cache.Upgrades[i].bci == CM.Disp.max) color = CM.Disp.colorRed;
|
||||
else if (CM.Cache.Upgrades[i].bci > CM.Disp.max) color = CM.Disp.colorPurple;
|
||||
else if (CM.Cache.Upgrades[i].bci > CM.Disp.mid) color = CM.Disp.colorOrange;
|
||||
else color = CM.Disp.colorYellow;
|
||||
CM.Cache.Upgrades[i].color = color;
|
||||
}
|
||||
}
|
||||
|
||||
CM.Cache.RemakeBuildings10BCI = function() {
|
||||
for (var i in CM.Cache.Objects10) {
|
||||
CM.Cache.Objects10[i].price = CM.Sim.BuildingGetPrice(Game.Objects[i].basePrice, Game.Objects[i].amount, 10);
|
||||
CM.Cache.Objects10[i].bci = CM.Cache.Objects10[i].price / CM.Cache.Objects10[i].bonus;
|
||||
var color = '';
|
||||
if (CM.Cache.Objects10[i].bci <= 0 || CM.Cache.Objects10[i].bci == 'Infinity') color = CM.Disp.colorGray;
|
||||
else if (CM.Cache.Objects10[i].bci < CM.Disp.min) color = CM.Disp.colorBlue;
|
||||
else if (CM.Cache.Objects10[i].bci == CM.Disp.min) color = CM.Disp.colorGreen;
|
||||
else if (CM.Cache.Objects10[i].bci == CM.Disp.max) color = CM.Disp.colorRed;
|
||||
else if (CM.Cache.Objects10[i].bci > CM.Disp.max) color = CM.Disp.colorPurple;
|
||||
else if (CM.Cache.Objects10[i].bci > CM.Disp.mid) color = CM.Disp.colorOrange;
|
||||
else color = CM.Disp.colorYellow;
|
||||
CM.Cache.Objects10[i].color = color;
|
||||
}
|
||||
}
|
||||
|
||||
CM.Cache.RemakeBCI = function() {
|
||||
// Buildings for 1 amount
|
||||
CM.Cache.RemakeBuildingsBCI();
|
||||
|
||||
// Upgrades
|
||||
CM.Cache.RemakeUpgradeBCI();
|
||||
|
||||
// Buildings for 10 amount
|
||||
CM.Cache.RemakeBuildings10BCI();
|
||||
}
|
||||
|
||||
CM.Cache.RemakeLucky = function() {
|
||||
CM.Cache.Lucky = (Game.cookiesPs * 60 * 15) / 0.15;
|
||||
if (Game.frenzy > 0) {
|
||||
CM.Cache.Lucky /= Game.frenzyPower;
|
||||
}
|
||||
CM.Cache.LuckyReward = (CM.Cache.Lucky * 0.15) + 13;
|
||||
CM.Cache.LuckyFrenzy = CM.Cache.Lucky * 7;
|
||||
CM.Cache.LuckyRewardFrenzy = (CM.Cache.LuckyFrenzy * 0.15) + 13;
|
||||
}
|
||||
|
||||
CM.Cache.MaxChainMoni = function(digit, maxPayout) {
|
||||
var chain = 1 + Math.max(0, Math.ceil(Math.log(Game.cookies) / Math.LN10) - 10);
|
||||
var moni = Math.max(digit, Math.min(Math.floor(1 / 9 * Math.pow(10, chain) * digit), maxPayout));
|
||||
var nextMoni = Math.max(digit, Math.min(Math.floor(1 / 9 * Math.pow(10, chain + 1) * digit), maxPayout));
|
||||
while (nextMoni < maxPayout) {
|
||||
chain++;
|
||||
moni = Math.max(digit, Math.min(Math.floor(1 / 9 * Math.pow(10, chain) * digit), maxPayout));
|
||||
nextMoni = Math.max(digit, Math.min(Math.floor(1 / 9 * Math.pow(10, chain + 1) * digit), maxPayout));
|
||||
}
|
||||
return moni;
|
||||
}
|
||||
|
||||
CM.Cache.RemakeChain = function() {
|
||||
var maxPayout = Game.cookiesPs * 60 * 60 * 6;
|
||||
if (Game.frenzy > 0) {
|
||||
maxPayout /= Game.frenzyPower;
|
||||
}
|
||||
|
||||
CM.Cache.ChainReward = CM.Cache.MaxChainMoni(7, maxPayout);
|
||||
|
||||
CM.Cache.ChainWrathReward = CM.Cache.MaxChainMoni(6, maxPayout);
|
||||
|
||||
var base = 0;
|
||||
if (CM.Cache.ChainReward > CM.Cache.ChainWrathReward) {
|
||||
base = CM.Cache.ChainReward;
|
||||
}
|
||||
else {
|
||||
base = CM.Cache.ChainWrathReward;
|
||||
}
|
||||
if (maxPayout < base) {
|
||||
CM.Cache.Chain = 0;
|
||||
}
|
||||
else {
|
||||
CM.Cache.Chain = CM.Cache.NextNumber(base) / 0.25;
|
||||
}
|
||||
|
||||
CM.Cache.ChainFrenzyReward = CM.Cache.MaxChainMoni(7, maxPayout * 7);
|
||||
|
||||
CM.Cache.ChainFrenzyWrathReward = CM.Cache.MaxChainMoni(6, maxPayout * 7);
|
||||
|
||||
if (CM.Cache.ChainFrenzyReward > CM.Cache.ChainFrenzyWrathReward) {
|
||||
base = CM.Cache.ChainFrenzyReward;
|
||||
}
|
||||
else {
|
||||
base = CM.Cache.ChainFrenzyWrathReward;
|
||||
}
|
||||
if ((maxPayout * 7) < base) {
|
||||
CM.Cache.ChainFrenzy = 0;
|
||||
}
|
||||
else {
|
||||
CM.Cache.ChainFrenzy = CM.Cache.NextNumber(base) / 0.25;
|
||||
}
|
||||
}
|
||||
|
||||
CM.Cache.RemakeSeaSpec = function() {
|
||||
if (Game.season == 'christmas') {
|
||||
CM.Cache.SeaSpec = Math.max(25, Game.cookiesPs * 60 * 1);
|
||||
if (Game.Has('Ho ho ho-flavored frosting')) CM.Cache.SeaSpec *= 2;
|
||||
}
|
||||
}
|
||||
|
||||
CM.Cache.RemakeSellAllTotal = function() {
|
||||
var sellTotal = 0;
|
||||
for (var i in Game.Objects) {
|
||||
var me = Game.Objects[i];
|
||||
sellTotal += CM.Sim.BuildingSell(me.basePrice, me.amount, me.amount);
|
||||
}
|
||||
CM.Cache.SellAllTotal = sellTotal;
|
||||
}
|
||||
|
||||
CM.Cache.Lucky = 0;
|
||||
CM.Cache.LuckyReward = 0;
|
||||
CM.Cache.LuckyFrenzy = 0;
|
||||
CM.Cache.LuckyRewardFrenzy = 0;
|
||||
CM.Cache.SeaSpec = 0;
|
||||
CM.Cache.Chain = 0;
|
||||
CM.Cache.ChainReward = 0;
|
||||
CM.Cache.ChainWrathReward = 0;
|
||||
CM.Cache.ChainFrenzy = 0;
|
||||
CM.Cache.ChainFrenzyReward = 0;
|
||||
CM.Cache.ChainFrenzyWrathReward = 0;
|
||||
CM.Cache.SellAllTotal = 0;
|
||||
|
||||
131
src/Config.js
Normal file
131
src/Config.js
Normal file
@@ -0,0 +1,131 @@
|
||||
/**********
|
||||
* Config *
|
||||
**********/
|
||||
|
||||
CM.SaveConfig = function(config) {
|
||||
localStorage.setItem(CM.ConfigPrefix, JSON.stringify(config));
|
||||
}
|
||||
|
||||
CM.LoadConfig = function() {
|
||||
if (localStorage.getItem(CM.ConfigPrefix) != null) {
|
||||
CM.Config = JSON.parse(localStorage.getItem(CM.ConfigPrefix));
|
||||
|
||||
// Check values
|
||||
var mod = false;
|
||||
for (var i in CM.ConfigDefault) {
|
||||
if (typeof CM.Config[i] === 'undefined') {
|
||||
mod = true;
|
||||
CM.Config[i] = CM.ConfigDefault[i];
|
||||
}
|
||||
else if (i != 'StatsPref' && i != 'Colors') {
|
||||
if (i.indexOf('SoundURL') == -1) {
|
||||
if (!(CM.Config[i] > -1 && CM.Config[i] < CM.ConfigData[i].label.length)) {
|
||||
mod = true;
|
||||
CM.Config[i] = CM.ConfigDefault[i];
|
||||
}
|
||||
}
|
||||
else { // Sound URLs
|
||||
if (typeof CM.Config[i] != 'string') {
|
||||
mod = true;
|
||||
CM.Config[i] = CM.ConfigDefault[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (i == 'StatsPref') {
|
||||
for (var j in CM.ConfigDefault.StatsPref) {
|
||||
if (typeof CM.Config[i][j] === 'undefined' || !(CM.Config[i][j] > -1 && CM.Config[i][j] < 2)) {
|
||||
mod = true;
|
||||
CM.Config[i][j] = CM.ConfigDefault[i][j];
|
||||
}
|
||||
}
|
||||
}
|
||||
else { // Colors
|
||||
for (var j in CM.ConfigDefault.StatsPref) {
|
||||
if (typeof CM.Config[i][j] === 'undefined' || typeof CM.Config[i][j] != 'string') {
|
||||
mod = true;
|
||||
CM.Config[i][j] = CM.ConfigDefault[i][j];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (mod) CM.SaveConfig(CM.Config);
|
||||
CM.Loop(); // Do loop once
|
||||
for (var i in CM.ConfigDefault) {
|
||||
if (i != 'StatsPref' && typeof CM.ConfigData[i].func !== 'undefined') {
|
||||
CM.ConfigData[i].func();
|
||||
}
|
||||
}
|
||||
}
|
||||
else { // Default values
|
||||
CM.RestoreDefault();
|
||||
}
|
||||
}
|
||||
|
||||
CM.RestoreDefault = function() {
|
||||
CM.Config = {};
|
||||
CM.SaveConfig(CM.ConfigDefault);
|
||||
CM.LoadConfig();
|
||||
Game.UpdateMenu();
|
||||
}
|
||||
|
||||
CM.ToggleConfigUp = function(config) {
|
||||
CM.Config[config]++;
|
||||
if (CM.Config[config] == CM.ConfigData[config].label.length) {
|
||||
CM.Config[config] = 0;
|
||||
}
|
||||
if (typeof CM.ConfigData[config].func !== 'undefined') {
|
||||
CM.ConfigData[config].func();
|
||||
}
|
||||
l(CM.ConfigPrefix + config).innerHTML = CM.Disp.GetConfigDisplay(config);
|
||||
CM.SaveConfig(CM.Config);
|
||||
}
|
||||
|
||||
CM.ToggleConfigDown = function(config) {
|
||||
CM.Config[config]--;
|
||||
if (CM.Config[config] < 0) {
|
||||
CM.Config[config] = CM.ConfigData[config].label.length - 1;
|
||||
}
|
||||
if (typeof CM.ConfigData[config].func !== 'undefined') {
|
||||
CM.ConfigData[config].func();
|
||||
}
|
||||
l(CM.ConfigPrefix + config).innerHTML = CM.Disp.GetConfigDisplay(config);
|
||||
CM.SaveConfig(CM.Config);
|
||||
}
|
||||
|
||||
CM.ToggleStatsConfig = function(config) {
|
||||
if (CM.Config.StatsPref[config] == 0) {
|
||||
CM.Config.StatsPref[config]++;
|
||||
}
|
||||
else {
|
||||
CM.Config.StatsPref[config]--;
|
||||
}
|
||||
CM.SaveConfig(CM.Config);
|
||||
}
|
||||
|
||||
CM.ConfigData.BotBar = {label: ['Bottom Bar OFF', 'Bottom Bar ON'], desc: 'Building Information', func: function() {CM.Disp.ToggleBotBar();}};
|
||||
CM.ConfigData.TimerBar = {label: ['Timer Bar OFF', 'Timer Bar ON'], desc: 'Timers of Golden Cookie, Season Popup, Frenzy (Normal, Clot, Elder), Click Frenzy', func: function() {CM.Disp.ToggleTimerBar();}};
|
||||
CM.ConfigData.TimerBarPos = {label: ['Timer Bar Position (Top Left)', 'Timer Bar Position (Bottom)'], desc: 'Placement of the Timer Bar', func: function() {CM.Disp.ToggleTimerBarPos();}};
|
||||
CM.ConfigData.BuildColor = {label: ['Building Colors OFF', 'Building Colors ON'], desc: 'Color code buildings', func: function() {CM.Disp.UpdateBuildings();}};
|
||||
CM.ConfigData.UpBarColor = {label: ['Upgrade Bar/Colors OFF', 'Upgrade Bar/Colors ON'], desc: 'Color code upgrades and add a counter', func: function() {CM.Disp.ToggleUpBarColor();}};
|
||||
CM.ConfigData.Colors = {desc: {Blue: 'Color for better than best BCI building', Green: 'Color for best BCI building', Yellow: 'Color for between best and worst BCI buildings closer to best', Orange: 'Color for between best and worst BCI buildings closer to worst', Red: 'Color for worst BCI building', Purple: 'Color for worse than worst BCI building', Gray: 'Color for negative or infinity BCI'}, func: function() {CM.Disp.UpdateColors();}};
|
||||
CM.ConfigData.Flash = {label: ['Flash OFF', 'Flash ON'], desc: 'Flash screen on Golden Cookie/Season Popup'};
|
||||
CM.ConfigData.Sound = {label: ['Sounds OFF', 'Sounds ON'], desc: 'Play a sound on Golden Cookie/Season Popup'};
|
||||
CM.ConfigData.Volume = {label: [], desc: 'Volume of the sound'};
|
||||
for (var i = 0; i < 101; i++) {
|
||||
CM.ConfigData.Volume.label[i] = i + '%';
|
||||
}
|
||||
CM.ConfigData.GCSoundURL = {label: 'Golden Cookie Sound URL:', desc: 'URL of the sound to be played when a Golden Cookie spawns'};
|
||||
CM.ConfigData.SeaSoundURL = {label: 'Season Special Sound URL:', desc: 'URL of the sound to be played when a Season Special spawns'};
|
||||
CM.ConfigData.GCTimer = {label: ['Golden Cookie Timer OFF', 'Golden Cookie Timer ON'], desc: 'A timer on the Golden Cookie when it has been spawned', func: function() {CM.Disp.ToggleGCTimer();}};
|
||||
CM.ConfigData.Title = {label: ['Title OFF', 'Title ON'], desc: 'Update title with Golden Cookie/Season Popup timers'};
|
||||
CM.ConfigData.Tooltip = {label: ['Tooltip Information OFF', 'Tooltip Information ON'], desc: 'Extra information in tooltip for buildings/upgrades'};
|
||||
CM.ConfigData.TooltipAmor = {label: ['Tooltip Amortization Information OFF', 'Tooltip Amortization Information ON'], desc: 'Add amortization information to buildings tooltip'};
|
||||
CM.ConfigData.ToolWarnCaut = {label: ['Tooltip Warning/Caution OFF', 'Tooltip Warning/Caution ON'], desc: 'A warning/caution when buying if it will put the bank under the amount needed for max "Lucky!"/"Lucky!" (Frenzy) rewards', func: function() {CM.Disp.ToggleToolWarnCaut();}};
|
||||
CM.ConfigData.ToolWarnCautPos = {label: ['Tooltip Warning/Caution Position (Left)', 'Tooltip Warning/Caution Position (Bottom)'], desc: 'Placement of the warning/caution boxes', func: function() {CM.Disp.ToggleToolWarnCautPos();}};
|
||||
CM.ConfigData.ToolWarnCautBon = {label: ['Calculate Tooltip Warning/Caution With Bonus CPS OFF', 'Calculate Tooltip Warning/Caution With Bonus CPS ON'], desc: 'Calculate the warning/caution with or without the bonus CPS you get from buying'};
|
||||
CM.ConfigData.ToolWrink = {label: ['Wrinkler Tooltip OFF', 'Wrinkler Tooltip ON'], desc: 'Shows the amount of cookies a wrinkler will give when popping it'};
|
||||
CM.ConfigData.Stats = {label: ['Statistics OFF', 'Statistics ON'], desc: 'Extra Cookie Monster statistics!'};
|
||||
CM.ConfigData.UpStats = {label: ['Statistics Update Rate (Default)', 'Statistics Update Rate (1s)'], desc: 'Default Game rate is once every 5 seconds'};
|
||||
CM.ConfigData.SayTime = {label: ['Format Time OFF', 'Format Time ON'], desc: 'Change how time is displayed in statistics', func: function() {CM.Disp.ToggleSayTime();}};
|
||||
CM.ConfigData.Scale = {label: ['Game\'s Setting Scale', 'Metric', 'Short Scale', 'Scientific Notation'], desc: 'Change how long numbers are handled', func: function() {CM.Disp.RefreshScale();}};
|
||||
|
||||
8
src/Data.js
Normal file
8
src/Data.js
Normal file
@@ -0,0 +1,8 @@
|
||||
/********
|
||||
* Data *
|
||||
********/
|
||||
|
||||
CM.Data.HalloCookies = ['Skull cookies', 'Ghost cookies', 'Bat cookies', 'Slime cookies', 'Pumpkin cookies', 'Eyeball cookies', 'Spider cookies'];
|
||||
CM.Data.ChristCookies = ['Christmas tree biscuits', 'Snowflake biscuits', 'Snowman biscuits', 'Holly biscuits', 'Candy cane biscuits', 'Bell biscuits', 'Present biscuits'];
|
||||
CM.Data.ValCookies = ['Pure heart biscuits', 'Ardent heart biscuits', 'Sour heart biscuits', 'Weeping heart biscuits', 'Golden heart biscuits', 'Eternal heart biscuits'];
|
||||
|
||||
1643
src/Disp.js
Normal file
1643
src/Disp.js
Normal file
File diff suppressed because it is too large
Load Diff
5
src/Footer.js
Normal file
5
src/Footer.js
Normal file
@@ -0,0 +1,5 @@
|
||||
/**********
|
||||
* Footer *
|
||||
**********/
|
||||
|
||||
CM.Init();
|
||||
20
src/Header.js
Normal file
20
src/Header.js
Normal file
@@ -0,0 +1,20 @@
|
||||
/**********
|
||||
* Header *
|
||||
**********/
|
||||
|
||||
CM = {};
|
||||
|
||||
CM.Backup = {};
|
||||
|
||||
CM.Cache = {};
|
||||
|
||||
CM.Config = {};
|
||||
|
||||
CM.ConfigData = {};
|
||||
|
||||
CM.Data = {};
|
||||
|
||||
CM.Disp = {};
|
||||
|
||||
CM.Sim = {};
|
||||
|
||||
171
src/Main.js
Normal file
171
src/Main.js
Normal file
@@ -0,0 +1,171 @@
|
||||
/********
|
||||
* Main *
|
||||
********/
|
||||
|
||||
CM.ReplaceNative = function() {
|
||||
CM.Backup.Beautify = Beautify;
|
||||
Beautify = CM.Disp.Beautify;
|
||||
|
||||
CM.Backup.CalculateGains = Game.CalculateGains;
|
||||
Game.CalculateGains = function() {
|
||||
CM.Backup.CalculateGains();
|
||||
CM.Sim.DoSims = 1;
|
||||
CM.Sim.Date = new Date().getTime();
|
||||
}
|
||||
|
||||
CM.Backup.seasonPopup = {};
|
||||
CM.Backup.seasonPopup.spawn = Game.seasonPopup.spawn;
|
||||
eval('CM.Backup.seasonPopup.spawnMod = ' + Game.seasonPopup.spawn.toString().split('this').join('Game.seasonPopup'));
|
||||
Game.seasonPopup.spawn = function() {
|
||||
CM.Backup.seasonPopup.spawnMod();
|
||||
CM.Disp.EmphSeasonPopup();
|
||||
}
|
||||
|
||||
CM.Backup.tooltip = {};
|
||||
CM.Backup.tooltip.draw = Game.tooltip.draw;
|
||||
eval('CM.Backup.tooltip.drawMod = ' + Game.tooltip.draw.toString().split('this').join('Game.tooltip'));
|
||||
Game.tooltip.draw = function(from, text, origin) {
|
||||
CM.Backup.tooltip.drawMod(from, text, origin);
|
||||
CM.Disp.DrawTooltipWarnCaut();
|
||||
}
|
||||
|
||||
CM.Backup.tooltip.update = Game.tooltip.update;
|
||||
eval('CM.Backup.tooltip.updateMod = ' + Game.tooltip.update.toString().split('this').join('Game.tooltip'));
|
||||
Game.tooltip.update = function() {
|
||||
CM.Backup.tooltip.updateMod();
|
||||
CM.Disp.UpdateTooltipWarnCaut();
|
||||
CM.Disp.UpdateTooltipLocation();
|
||||
}
|
||||
|
||||
CM.Backup.UpdateSpecial = Game.UpdateSpecial;
|
||||
Game.UpdateSpecial = function() {
|
||||
if (CM.Config.TimerBar == 1 && CM.Config.TimerBarPos == 0) {
|
||||
var timerBarHeight = parseInt(CM.Disp.TimerBar.style.height);
|
||||
Game.mouseY -= timerBarHeight;
|
||||
CM.Backup.UpdateSpecial();
|
||||
Game.mouseY += timerBarHeight;
|
||||
}
|
||||
else {
|
||||
CM.Backup.UpdateSpecial();
|
||||
}
|
||||
}
|
||||
|
||||
CM.Backup.RebuildUpgrades = Game.RebuildUpgrades;
|
||||
Game.RebuildUpgrades = function() {
|
||||
CM.Backup.RebuildUpgrades();
|
||||
CM.Disp.AddTooltipUpgrade();
|
||||
Game.CalculateGains();
|
||||
}
|
||||
|
||||
CM.Backup.UpdateMenu = Game.UpdateMenu;
|
||||
Game.UpdateMenu = function() {
|
||||
if (typeof jscolor.picker === 'undefined' || typeof jscolor.picker.owner === 'undefined') {
|
||||
CM.Backup.UpdateMenu();
|
||||
CM.Disp.AddMenu();
|
||||
}
|
||||
}
|
||||
|
||||
CM.Backup.sayTime = Game.sayTime;
|
||||
CM.Disp.sayTime = function(time, detail) {
|
||||
if (isNaN(time) || time <= 0) return CM.Backup.sayTime(time, detail);
|
||||
else return CM.Disp.FormatTime(time / Game.fps, 1);
|
||||
}
|
||||
|
||||
CM.Backup.Loop = Game.Loop;
|
||||
Game.Loop = function() {
|
||||
CM.Backup.Loop();
|
||||
CM.Loop();
|
||||
}
|
||||
}
|
||||
|
||||
CM.Loop = function() {
|
||||
if (CM.Disp.lastAscendState != Game.OnAscend) {
|
||||
CM.Disp.lastAscendState = Game.OnAscend;
|
||||
CM.Disp.UpdateAscendState();
|
||||
}
|
||||
if (!Game.OnAscend && Game.AscendTimer == 0) {
|
||||
if (CM.Sim.DoSims) {
|
||||
CM.Cache.RemakeIncome();
|
||||
CM.Cache.RemakeBCI();
|
||||
CM.Cache.RemakeLucky();
|
||||
CM.Cache.RemakeChain();
|
||||
CM.Cache.RemakeSeaSpec();
|
||||
CM.Cache.RemakeSellAllTotal();
|
||||
|
||||
CM.Disp.UpdateBotBarOther();
|
||||
CM.Disp.UpdateBuildings();
|
||||
CM.Disp.UpdateUpgrades();
|
||||
|
||||
CM.Sim.DoSims = 0;
|
||||
}
|
||||
|
||||
// Redraw timers
|
||||
CM.Disp.UpdateBotBarTime();
|
||||
CM.Disp.UpdateTimerBar();
|
||||
|
||||
// Update Tooltip
|
||||
CM.Disp.UpdateTooltip();
|
||||
|
||||
// Update Wrinkler Tooltip
|
||||
CM.Disp.CheckWrinklerTooltip();
|
||||
CM.Disp.UpdateWrinklerTooltip();
|
||||
|
||||
// Update Title
|
||||
CM.Disp.UpdateTitle();
|
||||
|
||||
// Change menu refresh interval
|
||||
CM.Disp.RefreshMenu();
|
||||
}
|
||||
|
||||
// Check Golden Cookies
|
||||
CM.Disp.CheckGoldenCookie();
|
||||
}
|
||||
|
||||
CM.Init = function() {
|
||||
var proceed = true;
|
||||
if (Game.version != CM.VersionMajor) {
|
||||
proceed = confirm('Cookie Monster version ' + CM.VersionMajor + '.' + CM.VersionMinor + ' is meant for Game version ' + CM.VersionMajor + '. Loading a different version may cause errors. Do you still want to load Cookie Monster?');
|
||||
}
|
||||
if (proceed) {
|
||||
CM.Disp.AddJscolor();
|
||||
|
||||
var delay = setInterval(function() {
|
||||
if (typeof jscolor !== 'undefined') {
|
||||
CM.DelayInit();
|
||||
clearInterval(delay);
|
||||
}
|
||||
}, 500);
|
||||
}
|
||||
}
|
||||
|
||||
CM.DelayInit = function() {
|
||||
CM.Sim.InitData();
|
||||
CM.Disp.CreateCssArea();
|
||||
CM.Disp.CreateBotBar();
|
||||
CM.Disp.CreateTimerBar();
|
||||
CM.Disp.CreateUpgradeBar();
|
||||
CM.Disp.CreateWhiteScreen();
|
||||
CM.Disp.CreateGCTimer();
|
||||
CM.Disp.CreateResetTooltip();
|
||||
CM.Disp.CreateChoEggTooltip();
|
||||
CM.Disp.CreateTooltipWarnCaut();
|
||||
CM.Disp.AddTooltipBuild();
|
||||
//CM.Disp.AddTooltipBuildExtra(); // The extra per building was removed
|
||||
CM.Disp.AddWrinklerAreaDetect();
|
||||
CM.ReplaceNative();
|
||||
Game.CalculateGains();
|
||||
CM.LoadConfig(); // Must be after all things are created!
|
||||
CM.Disp.lastAscendState = Game.OnAscend;
|
||||
|
||||
if (Game.prefs.popups) Game.Popup('Cookie Monster version ' + CM.VersionMajor + '.' + CM.VersionMinor + ' loaded!');
|
||||
else Game.Notify('Cookie Monster version ' + CM.VersionMajor + '.' + CM.VersionMinor + ' loaded!','','',1, 1);
|
||||
|
||||
Game.Win('Third-party');
|
||||
}
|
||||
|
||||
CM.ConfigDefault = {BotBar: 1, TimerBar: 1, TimerBarPos: 0, BuildColor: 1, UpBarColor: 1, Flash: 1, Sound: 1, Volume: 100, GCSoundURL: 'http://freesound.org/data/previews/66/66717_931655-lq.mp3', SeaSoundURL: 'http://www.freesound.org/data/previews/121/121099_2193266-lq.mp3', GCTimer: 1, Title: 1, Tooltip: 1, TooltipAmor: 0, ToolWarnCaut: 1, ToolWarnCautPos: 1, ToolWarnCautBon: 0, ToolWrink: 1, Stats: 1, UpStats: 1, SayTime: 1, Scale: 2, StatsPref: {Lucky: 1, Chain: 1, HC: 1, Wrink: 1, Sea: 1}, Colors : {Blue: '#4bb8f0', Green: '#00ff00', Yellow: '#ffff00', Orange: '#ff7f00', Red: '#ff0000', Purple: '#ff00ff', Gray: '#b3b3b3'}};
|
||||
CM.ConfigPrefix = 'CMConfig';
|
||||
|
||||
CM.VersionMajor = '2';
|
||||
CM.VersionMinor = '2';
|
||||
|
||||
388
src/Sim.js
Normal file
388
src/Sim.js
Normal file
@@ -0,0 +1,388 @@
|
||||
/*******
|
||||
* Sim *
|
||||
*******/
|
||||
|
||||
CM.Sim.BuildingGetPrice = function(basePrice, start, increase) {
|
||||
var totalPrice = 0;
|
||||
var count = 0;
|
||||
while(count < increase) {
|
||||
var price = basePrice * Math.pow(Game.priceIncrease, start + count);
|
||||
if (Game.Has('Season savings')) price *= 0.99;
|
||||
if (Game.Has('Santa\'s dominion')) price *= 0.99;
|
||||
if (Game.Has('Faberge egg')) price *= 0.99;
|
||||
if (Game.Has('Divine discount')) price *= 0.99;
|
||||
if (Game.hasAura('Fierce Hoarder')) price *= 0.98;
|
||||
totalPrice += Math.ceil(price);
|
||||
count++;
|
||||
}
|
||||
return totalPrice;
|
||||
}
|
||||
|
||||
CM.Sim.BuildingSell = function(basePrice, start, amount) {
|
||||
var totalMoni = 0;
|
||||
while (amount > 0) {
|
||||
var giveBack = 0.5;
|
||||
if (Game.hasAura('Earth Shatterer')) giveBack = 0.85;
|
||||
totalMoni += Math.floor(CM.Sim.BuildingGetPrice(basePrice, start, 1) * giveBack);
|
||||
start--;
|
||||
amount--;
|
||||
}
|
||||
return totalMoni;
|
||||
}
|
||||
|
||||
CM.Sim.Has = function(what) {
|
||||
if (Game.ascensionMode == 1 && Game.Upgrades[what].pool == 'prestige') return 0;
|
||||
return (CM.Sim.Upgrades[what] ? CM.Sim.Upgrades[what].bought : 0);
|
||||
}
|
||||
|
||||
|
||||
CM.Sim.Win = function(what) {
|
||||
if (CM.Sim.Achievements[what]) {
|
||||
if (CM.Sim.Achievements[what].won == 0) {
|
||||
CM.Sim.Achievements[what].won = 1;
|
||||
if (Game.Achievements[what].pool != 'shadow') CM.Sim.AchievementsOwned++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
eval('CM.Sim.HasAchiev = ' + Game.HasAchiev.toString().split('Game').join('CM.Sim'));
|
||||
|
||||
eval('CM.Sim.GetHeavenlyMultiplier = ' + Game.GetHeavenlyMultiplier.toString().split('Game').join('CM.Sim'));
|
||||
|
||||
CM.Sim.hasAura = function(what) {
|
||||
if (Game.dragonAuras[CM.Sim.dragonAura].name == what || Game.dragonAuras[CM.Sim.dragonAura2].name == what)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
eval('CM.Sim.GetTieredCpsMult = ' + Game.GetTieredCpsMult.toString().split('Game.Has').join('CM.Sim.Has').split('me.tieredUpgrades').join('Game.Objects[me.name].tieredUpgrades').split('me.synergies').join('Game.Objects[me.name].synergies').split('syn.buildingTie1.amount').join('CM.Sim.Objects[syn.buildingTie1.name].amount').split('syn.buildingTie2.amount').join('CM.Sim.Objects[syn.buildingTie2.name].amount'));
|
||||
|
||||
eval('CM.Sim.getGrandmaSynergyUpgradeMultiplier = ' + Game.getGrandmaSynergyUpgradeMultiplier.toString().split('Game.Objects[\'Grandma\']').join('CM.Sim.Objects[\'Grandma\']'));
|
||||
|
||||
CM.Sim.InitData = function() {
|
||||
// Buildings
|
||||
CM.Sim.Objects = [];
|
||||
for (var i in Game.Objects) {
|
||||
CM.Sim.Objects[i] = {};
|
||||
var me = Game.Objects[i];
|
||||
var you = CM.Sim.Objects[i];
|
||||
eval('you.cps = ' + me.cps.toString().split('Game.Has').join('CM.Sim.Has').split('Game.hasAura').join('CM.Sim.hasAura').split('Game.Objects').join('CM.Sim.Objects').split('Game.GetTieredCpsMult').join('CM.Sim.GetTieredCpsMult').split('Game.getGrandmaSynergyUpgradeMultiplier').join('CM.Sim.getGrandmaSynergyUpgradeMultiplier'));
|
||||
// Below is needed for above eval!
|
||||
you.baseCps = me.baseCps;
|
||||
you.name = me.name;
|
||||
}
|
||||
|
||||
// Upgrades
|
||||
CM.Sim.Upgrades = [];
|
||||
for (var i in Game.Upgrades) {
|
||||
CM.Sim.Upgrades[i] = {};
|
||||
}
|
||||
|
||||
// Achievements
|
||||
CM.Sim.Achievements = [];
|
||||
for (var i in Game.Achievements) {
|
||||
CM.Sim.Achievements[i] = {};
|
||||
}
|
||||
}
|
||||
|
||||
CM.Sim.CopyData = function() {
|
||||
// Other variables
|
||||
CM.Sim.UpgradesOwned = Game.UpgradesOwned;
|
||||
CM.Sim.pledges = Game.pledges;
|
||||
CM.Sim.AchievementsOwned = Game.AchievementsOwned;
|
||||
CM.Sim.heavenlyPower = Game.heavenlyPower;
|
||||
CM.Sim.prestige = Game.prestige;
|
||||
CM.Sim.dragonAura = Game.dragonAura;
|
||||
CM.Sim.dragonAura2 = Game.dragonAura2;
|
||||
|
||||
// Buildings
|
||||
for (var i in Game.Objects) {
|
||||
var me = Game.Objects[i];
|
||||
var you = CM.Sim.Objects[i];
|
||||
you.amount = me.amount;
|
||||
}
|
||||
|
||||
// Upgrades
|
||||
for (var i in Game.Upgrades) {
|
||||
var me = Game.Upgrades[i];
|
||||
var you = CM.Sim.Upgrades[i];
|
||||
you.bought = me.bought;
|
||||
}
|
||||
|
||||
// Achievements
|
||||
for (var i in Game.Achievements) {
|
||||
var me = Game.Achievements[i];
|
||||
var you = CM.Sim.Achievements[i];
|
||||
you.won = me.won;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
CM.Sim.CalculateGains = function() {
|
||||
CM.Sim.cookiesPs = 0;
|
||||
var mult = 1;
|
||||
|
||||
if (Game.ascensionMode != 1) mult += parseFloat(CM.Sim.prestige) * 0.01 * CM.Sim.heavenlyPower * CM.Sim.GetHeavenlyMultiplier();
|
||||
|
||||
var cookieMult = 0;
|
||||
for (var i in CM.Sim.Upgrades) {
|
||||
var me = CM.Sim.Upgrades[i];
|
||||
if (me.bought > 0) {
|
||||
if (Game.Upgrades[i].pool == 'cookie' && CM.Sim.Has(Game.Upgrades[i].name)) mult *= (1 + (typeof(Game.Upgrades[i].power) == 'function' ? Game.Upgrades[i].power(Game.Upgrades[i]) : Game.Upgrades[i].power) * 0.01);
|
||||
}
|
||||
}
|
||||
|
||||
mult *= (1 + 0.01 * cookieMult);
|
||||
if (CM.Sim.Has('Specialized chocolate chips')) mult *= 1.01;
|
||||
if (CM.Sim.Has('Designer cocoa beans')) mult *= 1.02;
|
||||
if (CM.Sim.Has('Underworld ovens')) mult *= 1.03;
|
||||
if (CM.Sim.Has('Exotic nuts')) mult *= 1.04;
|
||||
if (CM.Sim.Has('Arcane sugar')) mult *= 1.05;
|
||||
|
||||
if (CM.Sim.Has('Increased merriness')) mult *= 1.15;
|
||||
if (CM.Sim.Has('Improved jolliness')) mult *= 1.15;
|
||||
if (CM.Sim.Has('A lump of coal')) mult *= 1.01;
|
||||
if (CM.Sim.Has('An itchy sweater')) mult *= 1.01;
|
||||
if (CM.Sim.Has('Santa\'s dominion')) mult *= 1.2;
|
||||
|
||||
if (CM.Sim.Has('Santa\'s legacy')) mult *= 1 + (Game.santaLevel + 1) * 0.03;
|
||||
|
||||
for (var i in CM.Sim.Objects) {
|
||||
var me = CM.Sim.Objects[i];
|
||||
CM.Sim.cookiesPs += me.amount * (typeof(me.cps) == 'function' ? me.cps(me) : me.cps);
|
||||
}
|
||||
|
||||
if (CM.Sim.Has('"egg"')) CM.Sim.cookiesPs += 9; // "egg"
|
||||
|
||||
var milkMult=1;
|
||||
if (CM.Sim.Has('Santa\'s milk and cookies')) milkMult *= 1.05;
|
||||
if (CM.Sim.hasAura('Breath of Milk')) milkMult *= 1.05;
|
||||
if (CM.Sim.Has('Kitten helpers')) mult *= (1 + (CM.Sim.AchievementsOwned / 25) * 0.1 * milkMult);
|
||||
if (CM.Sim.Has('Kitten workers')) mult *= (1 + (CM.Sim.AchievementsOwned / 25) * 0.125 * milkMult);
|
||||
if (CM.Sim.Has('Kitten engineers')) mult *= (1 + (CM.Sim.AchievementsOwned / 25) * 0.15 * milkMult);
|
||||
if (CM.Sim.Has('Kitten overseers')) mult *= (1 + (CM.Sim.AchievementsOwned / 25) * 0.175 * milkMult);
|
||||
if (CM.Sim.Has('Kitten managers')) mult *= (1 + (CM.Sim.AchievementsOwned / 25) * 0.2 * milkMult);
|
||||
if (CM.Sim.Has('Kitten accountants')) mult *= (1 + (CM.Sim.AchievementsOwned / 25) * 0.2 * milkMult);
|
||||
if (CM.Sim.Has('Kitten specialists')) mult *= (1 + (CM.Sim.AchievementsOwned / 25) * 0.2 * milkMult);
|
||||
if (CM.Sim.Has('Kitten experts')) mult *= (1 + (CM.Sim.AchievementsOwned / 25) * 0.2 * milkMult);
|
||||
if (CM.Sim.Has('Kitten angels')) mult *= (1 + (CM.Sim.AchievementsOwned / 25) * 0.1 * milkMult);
|
||||
|
||||
var eggMult = 0;
|
||||
if (CM.Sim.Has('Chicken egg')) eggMult++;
|
||||
if (CM.Sim.Has('Duck egg')) eggMult++;
|
||||
if (CM.Sim.Has('Turkey egg')) eggMult++;
|
||||
if (CM.Sim.Has('Quail egg')) eggMult++;
|
||||
if (CM.Sim.Has('Robin egg')) eggMult++;
|
||||
if (CM.Sim.Has('Ostrich egg')) eggMult++;
|
||||
if (CM.Sim.Has('Cassowary egg')) eggMult++;
|
||||
if (CM.Sim.Has('Salmon roe')) eggMult++;
|
||||
if (CM.Sim.Has('Frogspawn')) eggMult++;
|
||||
if (CM.Sim.Has('Shark egg')) eggMult++;
|
||||
if (CM.Sim.Has('Turtle egg')) eggMult++;
|
||||
if (CM.Sim.Has('Ant larva')) eggMult++;
|
||||
if (CM.Sim.Has('Century egg')) {
|
||||
// The boost increases a little every day, with diminishing returns up to +10% on the 100th day
|
||||
var day = Math.floor((CM.Sim.Date - Game.startDate) / 1000 / 10) * 10 / 60 / 60 / 24;
|
||||
day = Math.min(day,100);
|
||||
eggMult += (1 - Math.pow(1 - day / 100, 3)) * 10;
|
||||
}
|
||||
mult *= (1 + 0.01 * eggMult);
|
||||
|
||||
if (CM.Sim.hasAura('Radiant Appetite')) mult *= 2;
|
||||
|
||||
var rawCookiesPs = CM.Sim.cookiesPs * mult;
|
||||
for (var i in Game.CpsAchievements) {
|
||||
if (rawCookiesPs >= Game.CpsAchievements[i].threshold) CM.Sim.Win(Game.CpsAchievements[i].name);
|
||||
}
|
||||
|
||||
if (Game.frenzy > 0) mult *= Game.frenzyPower;
|
||||
|
||||
// Pointless?
|
||||
name = Game.bakeryName.toLowerCase();
|
||||
if (name == 'orteil') mult *= 0.99;
|
||||
else if (name == 'ortiel') mult *= 0.98; //or so help me
|
||||
|
||||
if (CM.Sim.Has('Elder Covenant')) mult *= 0.95;
|
||||
|
||||
if (CM.Sim.Has('Golden switch [off]')) {
|
||||
var goldenSwitchMult = 1.5;
|
||||
if (CM.Sim.Has('Residual luck')) {
|
||||
var upgrades = ['Get lucky', 'Lucky day', 'Serendipity', 'Heavenly luck', 'Lasting fortune', 'Decisive fate'];
|
||||
for (var i in upgrades) {
|
||||
if (CM.Sim.Has(upgrades[i])) goldenSwitchMult += 0.1;
|
||||
}
|
||||
}
|
||||
mult *= goldenSwitchMult;
|
||||
}
|
||||
|
||||
CM.Sim.cookiesPs *= mult;
|
||||
};
|
||||
|
||||
CM.Sim.CheckOtherAchiev = function() {
|
||||
var grandmas=0;
|
||||
if (CM.Sim.Has('Farmer grandmas')) grandmas++;
|
||||
if (CM.Sim.Has('Worker grandmas')) grandmas++;
|
||||
if (CM.Sim.Has('Miner grandmas')) grandmas++;
|
||||
if (CM.Sim.Has('Cosmic grandmas')) grandmas++;
|
||||
if (CM.Sim.Has('Transmuted grandmas')) grandmas++;
|
||||
if (CM.Sim.Has('Altered grandmas')) grandmas++;
|
||||
if (CM.Sim.Has('Grandmas\' grandmas')) grandmas++;
|
||||
if (CM.Sim.Has('Antigrandmas')) grandmas++;
|
||||
if (CM.Sim.Has('Rainbow grandmas')) grandmas++;
|
||||
if (!CM.Sim.HasAchiev('Elder') && grandmas >= 7) CM.Sim.Win('Elder');
|
||||
|
||||
// Redo?
|
||||
var buildingsOwned = 0;
|
||||
var mathematician = 1;
|
||||
var base10 = 1;
|
||||
var minAmount = 100000;
|
||||
for (var i in CM.Sim.Objects) {
|
||||
buildingsOwned += CM.Sim.Objects[i].amount;
|
||||
minAmount = Math.min(CM.Sim.Objects[i].amount, minAmount);
|
||||
if (!CM.Sim.HasAchiev('Mathematician')) {
|
||||
if (CM.Sim.Objects[i].amount < Math.min(128, Math.pow(2, (Game.ObjectsById.length - Game.Objects[i].id) - 1))) mathematician = 0;
|
||||
}
|
||||
if (!CM.Sim.HasAchiev('Base 10')) {
|
||||
if (CM.Sim.Objects[i].amount < (Game.ObjectsById.length - Game.Objects[i].id)*10) base10 = 0;
|
||||
}
|
||||
}
|
||||
if (minAmount >= 1) CM.Sim.Win('One with everything');
|
||||
if (mathematician == 1) CM.Sim.Win('Mathematician');
|
||||
if (base10 == 1) CM.Sim.Win('Base 10');
|
||||
if (minAmount >= 100) CM.Sim.Win('Centennial');
|
||||
if (minAmount >= 150) CM.Sim.Win('Centennial and a half');
|
||||
if (minAmount >= 200) CM.Sim.Win('Bicentennial');
|
||||
if (minAmount >= 250) CM.Sim.Win('Bicentennial and a half');
|
||||
|
||||
if (buildingsOwned >= 100) CM.Sim.Win('Builder');
|
||||
if (buildingsOwned >= 500) CM.Sim.Win('Architect');
|
||||
if (buildingsOwned >= 1000) CM.Sim.Win('Engineer');
|
||||
if (buildingsOwned >= 1500) CM.Sim.Win('Lord of Constructs');
|
||||
|
||||
if (CM.Sim.UpgradesOwned >= 20) CM.Sim.Win('Enhancer');
|
||||
if (CM.Sim.UpgradesOwned >= 50) CM.Sim.Win('Augmenter');
|
||||
if (CM.Sim.UpgradesOwned >= 100) CM.Sim.Win('Upgrader');
|
||||
if (CM.Sim.UpgradesOwned >= 200) CM.Sim.Win('Lord of Progress');
|
||||
|
||||
if (buildingsOwned >= 3000 && CM.Sim.UpgradesOwned >= 300) CM.Sim.Win('Polymath');
|
||||
|
||||
if (CM.Sim.Objects['Cursor'].amount + CM.Sim.Objects['Grandma'].amount >= 777) CM.Sim.Win('The elder scrolls');
|
||||
|
||||
var hasAllHalloCook = true;
|
||||
for (var i in CM.Data.HalloCookies) {
|
||||
if (!CM.Sim.Has(CM.Data.HalloCookies[i])) hasAllHalloCook = false;
|
||||
}
|
||||
if (hasAllHalloCook) CM.Sim.Win('Spooky cookies');
|
||||
|
||||
var hasAllChristCook = true;
|
||||
for (var i in CM.Data.ChristCookies) {
|
||||
if (!CM.Sim.Has(CM.Data.ChristCookies[i])) hasAllChristCook = false;
|
||||
}
|
||||
if (hasAllChristCook) CM.Sim.Win('Let it snow');
|
||||
}
|
||||
|
||||
CM.Sim.BuyBuildings = function(amount, target) {
|
||||
CM.Cache[target] = [];
|
||||
for (var i in Game.Objects) {
|
||||
CM.Sim.CopyData();
|
||||
var me = CM.Sim.Objects[i];
|
||||
me.amount += amount;
|
||||
|
||||
if (i == 'Cursor') {
|
||||
if (me.amount >= 1) CM.Sim.Win('Click');
|
||||
if (me.amount >= 2) CM.Sim.Win('Double-click');
|
||||
if (me.amount >= 50) CM.Sim.Win('Mouse wheel');
|
||||
if (me.amount >= 100) CM.Sim.Win('Of Mice and Men');
|
||||
if (me.amount >= 200) CM.Sim.Win('The Digital');
|
||||
if (me.amount >= 300) CM.Sim.Win('Extreme polydactyly');
|
||||
if (me.amount >= 400) CM.Sim.Win('Dr. T');
|
||||
if (me.amount >= 500) CM.Sim.Win('Thumbs, phalanges, metacarpals');
|
||||
}
|
||||
else {
|
||||
for (var j in Game.Objects[me.name].tieredAchievs) {
|
||||
if (me.amount >= Game.Tiers[Game.Objects[me.name].tieredAchievs[j].tier].achievUnlock)
|
||||
CM.Sim.Win(Game.Objects[me.name].tieredAchievs[j].name);
|
||||
}
|
||||
}
|
||||
|
||||
var lastAchievementsOwned = CM.Sim.AchievementsOwned;
|
||||
|
||||
CM.Sim.CalculateGains();
|
||||
|
||||
CM.Sim.CheckOtherAchiev();
|
||||
|
||||
if (lastAchievementsOwned != CM.Sim.AchievementsOwned) {
|
||||
CM.Sim.CalculateGains();
|
||||
}
|
||||
|
||||
CM.Cache[target][i] = {};
|
||||
CM.Cache[target][i].bonus = CM.Sim.cookiesPs - Game.cookiesPs;
|
||||
}
|
||||
}
|
||||
|
||||
CM.Sim.BuyUpgrades = function() {
|
||||
CM.Cache.Upgrades = [];
|
||||
for (var i in Game.Upgrades) {
|
||||
if (Game.Upgrades[i].pool == 'toggle' || (Game.Upgrades[i].bought == 0 && Game.Upgrades[i].unlocked && Game.Upgrades[i].pool != 'prestige')) {
|
||||
CM.Sim.CopyData();
|
||||
var me = CM.Sim.Upgrades[i];
|
||||
me.bought = 1;
|
||||
if (Game.CountsAsUpgradeOwned(Game.Upgrades[i].pool)) CM.Sim.UpgradesOwned++;
|
||||
|
||||
if (i == 'Elder Pledge') {
|
||||
CM.Sim.pledges++;
|
||||
if (CM.Sim.pledges > 0) CM.Sim.Win('Elder nap');
|
||||
if (CM.Sim.pledges >= 5) CM.Sim.Win('Elder slumber');
|
||||
}
|
||||
else if (i == 'Elder Covenant') {
|
||||
CM.Sim.Win('Elder calm')
|
||||
}
|
||||
else if (i == 'Eternal heart biscuits') {
|
||||
CM.Sim.Win('Lovely cookies');
|
||||
}
|
||||
else if (i == 'Heavenly key') {
|
||||
CM.Sim.Win('Wholesome');
|
||||
}
|
||||
|
||||
var lastAchievementsOwned = CM.Sim.AchievementsOwned;
|
||||
|
||||
CM.Sim.CalculateGains();
|
||||
|
||||
CM.Sim.CheckOtherAchiev();
|
||||
|
||||
if (lastAchievementsOwned != CM.Sim.AchievementsOwned) {
|
||||
CM.Sim.CalculateGains();
|
||||
}
|
||||
|
||||
CM.Cache.Upgrades[i] = {};
|
||||
CM.Cache.Upgrades[i].bonus = CM.Sim.cookiesPs - Game.cookiesPs;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CM.Sim.ResetBonus = function() {
|
||||
CM.Sim.CopyData();
|
||||
|
||||
if (Game.cookiesEarned >= 1000000) CM.Sim.Win('Sacrifice');
|
||||
if (Game.cookiesEarned >= 1000000000) CM.Sim.Win('Oblivion');
|
||||
if (Game.cookiesEarned >= 1000000000000) CM.Sim.Win('From scratch');
|
||||
if (Game.cookiesEarned >= 1000000000000000) CM.Sim.Win('Nihilism');
|
||||
if (Game.cookiesEarned >= 1000000000000000000) CM.Sim.Win('Dematerialize');
|
||||
if (Game.cookiesEarned >= 1000000000000000000000) CM.Sim.Win('Nil zero zilch');
|
||||
if (Game.cookiesEarned >= 1000000000000000000000000) CM.Sim.Win('Transcendence');
|
||||
if (Game.cookiesEarned >= 1000000000000000000000000000) CM.Sim.Win('Obliterate');
|
||||
if (Game.cookiesEarned >= 1000000000000000000000000000000) CM.Sim.Win('Negative void');
|
||||
if (Game.cookiesEarned >= 1000000000000000000000000000000000) CM.Sim.Win('To crumbs, you say?');
|
||||
|
||||
var lastAchievementsOwned = CM.Sim.AchievementsOwned;
|
||||
|
||||
CM.Sim.CalculateGains();
|
||||
|
||||
if (lastAchievementsOwned != CM.Sim.AchievementsOwned) {
|
||||
CM.Sim.CalculateGains();
|
||||
}
|
||||
|
||||
return (CM.Sim.cookiesPs - Game.cookiesPs);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user