// ==UserScript==
// @name Cookie clicker tools
// @namespace orteil.dashnet.org
// @version 2.104
// @description Cookie clicker tools (visual)
// @author Anton
// @match http://orteil.dashnet.org/cookieclicker/*
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
// ==/UserScript==
(function() {
'use strict';
var log = [], logTitle = '<div class="section">Cookie clicker tools 2.104 is here!</div>', newLogs = 0;
var started = false, t2, t3, tClick, tClickFrenzy, oldTitle = '', tLog,
tPriority, tBankAuto, tAscendDetector, isClickingNow = false, tReloadPageOnWrongBuff;
var _history = function() {
var hist = [];
hist.push('2.103 - Info section fix');
hist.push('2.101 - remove all bufs on negative multiplier (same as reload page)');
hist.push('2.100 - Info section + ascend detector');
hist.push('2.099 - mouse click upgrades');
hist.push('2.097 - auto bank storage');
hist.push('2.096 - buy objects more than 1');
hist.push('2.095 - objects CpS fix (buffs)');
hist.push('2.094 - objects CpS fix (buffs)');
hist.push('2.093 - objects CpS fix');
hist.push('2.092 - priority table fix');
hist.push('2.091 - priority table refactor');
hist.push('2.090 - buy very cheap items first');
hist.push('2.089 - fix pool toggle buy');
hist.push('2.087 - fix buy unknown upgrades');
hist.push('2.086 - clear log button');
hist.push('2.084 - buy unknown upgrades if their price is 0.1% of cookie storage');
hist.push('2.083 - mouse upgrades is processed as Upgrades');
hist.push('2.082 - start from scratch');
hist.push('2.080 - add history, add option "showTimeCompensate"');
hist.push('2.079 - hide donate box');
hist.push('2.078 - Kittens now is processed as Upgrades');
return hist;
}
var _getKittenPercentByUpgradeName = function(kName) {
if (kName == 'Kitten helpers') return Game.milkProgress*0.1;
if (kName == 'Kitten workers') return Game.milkProgress*0.125;
if (kName == 'Kitten engineers') return Game.milkProgress*0.15;
if (kName == 'Kitten overseers') return Game.milkProgress*0.175;
if (kName == 'Kitten managers') return Game.milkProgress*0.2;
if (kName == 'Kitten accountants') return Game.milkProgress*0.2;
if (kName == 'Kitten specialists') return Game.milkProgress*0.2;
if (kName == 'Kitten experts') return Game.milkProgress*0.2;
if (kName == 'Kitten angels') return Game.milkProgress*0.1;
return 0;
}
var options = {
bankStoragePercent: 100,
showTimeCompensate: false,
bankStorageAuto: false
};
var _store = function(name, value) {
if (typeof(Storage) !== "undefined") localStorage.setItem(name, value);
};
var _restore = function(name) {
if (typeof(Storage) !== "undefined") return localStorage.getItem(name);
else return undefined;
};
var _getBuffMult = function () {
var buffMult = 1;
for (var buff in Game.buffs) {
if (Game.buffs[buff] !== 0 && typeof Game.buffs[buff].multCpS !== 'undefined') {
buffMult = buffMult * Game.buffs[buff].multCpS;
}
}
return buffMult === 0 ? 1 : buffMult;
};
var _getNormalCookiesPs = function () {
return Game.cookiesPs > 0 ? Game.cookiesPs / _getBuffMult() : 1;
};
var _getMinimalMoney = function () {
return Math.floor(_getNormalCookiesPs() * 42100 * options.bankStoragePercent / 100);
};
var _getMoneyCanSpend = function () {
var moneyCanSpend = Game.cookies - _getMinimalMoney();
return moneyCanSpend;
};
var _getWrinklerCount = function () {
var wrinklersCount = 0;
for (var i in Game.wrinklers) {
if (Game.wrinklers[i].sucked > 0) {
wrinklersCount++;
}
}
return wrinklersCount;
};
var priorityListObj = {}, priorityList = [], timeCompensateObj = {}, timeCompensateList = [];
var _createPriorityList = function() {
var moneyCanSpend = _getMoneyCanSpend();
var money = Game.cookies;
var buffMult = _getBuffMult();
priorityList = [];
priorityListObj = {};
for (var g in Game.UpgradesById) {
if (Game.UpgradesById[g].bought === 0 && Game.UpgradesById[g].unlocked == 1) {
var isMultiplier = Game.UpgradesById[g].desc.indexOf('production multiplier') >= 0;
var isDouble = Game.UpgradesById[g].desc.indexOf('<b>twice</b>') >= 0;
var isDoubleGrandma = Game.UpgradesById[g].desc.indexOf('Grandmas are <b>twice</b>') >= 0;
var isKitten = Game.UpgradesById[g].name.indexOf('Kitten ') >= 0;
var isDoubleCursor = Game.UpgradesById[g].desc.indexOf('The mouse and cursors are <b>twice</b>') >= 0;
var isClickIncrease = Game.UpgradesById[g].desc.indexOf('Clicking gains <b>+1%') >= 0;
var increasedMoney = 0;
if (isClickIncrease) {
increasedMoney = Game.cookiesPs * 0.01;
} else if (isDoubleCursor) {
increasedMoney = Game.Objects['Cursor'].storedTotalCps * Game.globalCpsMult / buffMult;
} else if (isKitten) {
var kittenPercent = _getKittenPercentByUpgradeName(Game.UpgradesById[g].name);
increasedMoney = _getNormalCookiesPs() * kittenPercent;
} else if (isDoubleGrandma) {
increasedMoney = Game.Objects['Grandma'].storedTotalCps * Game.globalCpsMult / buffMult;
} else if (isMultiplier) {
increasedMoney = _getNormalCookiesPs() * Game.UpgradesById[g].power / 100;
} else if (isDouble) {
increasedMoney = Game.UpgradesById[g].buildingTie.storedTotalCps * Game.globalCpsMult / buffMult;
}
var interest = increasedMoney > 0 ? Game.UpgradesById[g].basePrice / increasedMoney : '-';
if (interest != '-') {
if (typeof priorityListObj[Math.floor(interest)] === 'undefined') {
var pp = moneyCanSpend / Game.UpgradesById[g].basePrice; // percent of cheapness
if (pp > 50) interest /= pp * 50;
priorityListObj[Math.floor(interest)] = {
name: Game.UpgradesById[g].name,
title: Game.UpgradesById[g].name + ' - ' + Beautify(Game.UpgradesById[g].basePrice),
price: Game.UpgradesById[g].basePrice,
cps: 1,
type: 'upgrade',
id: g,
income: increasedMoney
};
}
} else if (Game.UpgradesById[g].type == 'upgrade' &&
Game.UpgradesById[g].basePrice < moneyCanSpend &&
Game.UpgradesById[g].pool != 'toggle' && Game.UpgradesById[g].pool != 'tech')
{
interest = Game.UpgradesById[g].basePrice / moneyCanSpend * 1000;
if (typeof priorityListObj[Math.floor(interest)] === 'undefined') {
pp = moneyCanSpend / Game.UpgradesById[g].basePrice; // percent of cheapness
if (pp > 50) interest /= pp * 50;
priorityListObj[Math.floor(interest)] = {
name: Game.UpgradesById[g].name,
title: Game.UpgradesById[g].name + ' - ' + Beautify(Game.UpgradesById[g].basePrice),
price: Game.UpgradesById[g].basePrice,
cps: 1,
type: 'upgrade',
id: g,
income: 0
};
}
}
//priorityList.push(Game.UpgradesById[g].name + ' - ' + Beautify(Game.UpgradesById[g].basePrice) + ' (INTEREST: ' + Beautify(interest) + ')');
}
}
for (var i in Game.ObjectsById) {
if (typeof i !== 'undefined' && i != 'undefined' && Game.ObjectsById.hasOwnProperty(i)) {
if (Game.ObjectsById[i].locked === 0) {
var cps = (Game.ObjectsById[i].storedTotalCps / Game.ObjectsById[i].amount) * Game.globalCpsMult / buffMult;
interest = Game.ObjectsById[i].price / cps;
var pp = moneyCanSpend / Game.ObjectsById[i].price; // percent of cheapness
if (pp > 50) interest /= pp * 50;
if (isNaN(Math.floor(interest)) && Game.ObjectsById[i].price < moneyCanSpend) interest = 0;
priorityListObj[Math.floor(interest)] = {
name: Game.ObjectsById[i].name,
title: Game.ObjectsById[i].name + ' - ' + Beautify(Game.ObjectsById[i].price),
price: Game.ObjectsById[i].price,
cps: cps,
type: 'buy',
id: i,
income: cps
};
//priorityList.push(Game.ObjectsById[i].name + ' - ' + Beautify(Game.ObjectsById[i].price) + ' (INTEREST: ' + Beautify(interest) + ')');
}
}
}
for (i in priorityListObj) {
var prefix = priorityListObj[i].price < moneyCanSpend ? '!!! ' : (priorityListObj[i].price < money ? '! ' : '');
var pp = Math.floor(moneyCanSpend / priorityListObj[i].price * 100);
priorityList.push(prefix + priorityListObj[i].title + ' : ' + i + ' (' + pp + '%)');
}
timeCompensateObj = {};
timeCompensateList = [];
for (i in priorityListObj) {
var o = priorityListObj[i];
if (o.type == 'buy') {
var cpsWithPercent = (o.cps / _getNormalCookiesPs() + 1) * o.cps;
var interestNew = o.price / cpsWithPercent;
timeCompensateObj[Math.floor(interestNew)] = {
name: o.name,
title: o.title,
price: o.price,
cps: cpsWithPercent,
type: 'buy',
id: o.id,
income: o.income
};
} else {
timeCompensateObj[i] = o;
}
}
for (i in timeCompensateObj) {
prefix = timeCompensateObj[i].price < moneyCanSpend ? '!!! ' : (timeCompensateObj[i].price < money ? '! ' : '');
timeCompensateList.push(prefix + timeCompensateObj[i].title + ' : ' + i);
}
};
var _caption = function(txt) {
var $v = jQuery('#versionNumber');
if ($v.text() != txt) $v.text(txt);
};
var _title = function(txt) {
var newTitle = (newLogs > 0 ? '(' + newLogs + ') ' : '') + txt;
if (document.title != newTitle) {
oldTitle = txt;
document.title = newTitle;
}
};
var _titlePercent = function(have, need, txt) {
var percent = Math.ceil(have / (need !== 0 ? need : 1) * 100);
_title(String(percent) + "% - " + txt);
};
var _logSectionTitle = function (text) {
return '<div class="title">' + text + '</div>';
};
var _logSection = function (title, items) {
return '<div class="subsection">' + _logSectionTitle(title) +
'<div class="listing">' + items.join('</div><div class="listing">') + '</div>' +
'</div>';
};
var clearLogButton = '<button data-id="clearLog" onclick="document.getElementById(\'logButton\').onbuttonclick(this,event)">Clear Log</button>';
var _logPriorityTable = function() {
var moneyCanSpend = _getMoneyCanSpend();
var styles = '<style type="text/css">.prioritytable{width:100%;}.prioritytable td,.prioritytable th{padding:3px;}</style>';
var t = '<table class="prioritytable"><tr style="border-bottom:1px solid;text-align:left;font-weight:bold;"><th>Type</th><th>Name</th><th>Price</th><th>Interest</th><th>Income</th><th>% bank</th></tr>';
for (i in priorityListObj) {
var o = priorityListObj[i];
var pp = Math.floor(moneyCanSpend / o.price * 100);
t += '<tr><td>' + o.type + '</td><td>' + o.name + '</td><td>' + Beautify(o.price) + '</td><td>' + i + '</td><td>' + Beautify(o.income) + '</td><td>' + pp + '</td></tr>';
}
t += '</table>';
return styles + '<div class="subsection">' + _logSectionTitle('Priority ' + clearLogButton) + '<div class="listing">' + t + '</div></div>';
}
var _optionsSection = function() {
var content = [];
content.push('<label for="bankStoragePercent" id="bankStoragePercentLabel">Storage (' + Beautify(_getMinimalMoney()) + ') percent: ' + options.bankStoragePercent + '%</label> <input name="bankStoragePercent" id="bankStoragePercent" type="range" min="0" max="100" value="' + options.bankStoragePercent + '" onchange="document.getElementById(\'logButton\').onsliderchange(this)" />');
content.push('<button data-id="showTimeCompensate" onclick="document.getElementById(\'logButton\').onbuttonclick(this,event)">showTimeCompensate: ' + (options.showTimeCompensate ? 'TRUE' : 'FALSE') + '</button>');
content.push('<button data-id="bankStorageAuto" onclick="document.getElementById(\'logButton\').onbuttonclick(this,event)">bankStorageAuto: ' + (options.bankStorageAuto ? 'TRUE' : 'FALSE') + '</button>');
content.push(clearLogButton);
return content;
};
var _infoSection = function() {
var content = [];
var wrinklersTotal = 0;
for (var i in Game.wrinklers) {
wrinklersTotal += Game.wrinklers[i].sucked;
}
var chipsOwned = Math.floor(Game.HowMuchPrestige(Game.cookiesReset));
var ascendNowToOwn = Math.floor(Game.HowMuchPrestige(Game.cookiesReset + Game.cookiesEarned));
var ascendWillGet = ascendNowToOwn - chipsOwned;
var cookiesToDoubleInitial = Game.HowManyCookiesReset(chipsOwned * 2) - (Game.cookiesEarned + Game.cookiesReset);
var timeToReachDouble = Math.floor(cookiesToDoubleInitial / _getNormalCookiesPs());
content.push('Now clicking: ' + (isClickingNow ? "YES" : "NO"));
content.push('Wrinklers: ' + _getWrinklerCount());
content.push('Wrinklers sucked: ' + Beautify(wrinklersTotal));
content.push('Buff mult: ' + _getBuffMult());
content.push('Normal CpS: ' + Beautify(_getNormalCookiesPs()));
content.push('Money bank: ' + Beautify(_getMinimalMoney()));
content.push('Money can spend: ' + Beautify(_getMoneyCanSpend()));
content.push('You will get prestige by ascending: ' + ascendWillGet);
content.push('Cookies to double prestige: ' + Beautify(cookiesToDoubleInitial));
content.push('Time to double prestige: ' + Game.sayTime(timeToReachDouble * Game.fps, 2));
return content;
}
var _updateLog = function () {
Game.updateLog = logTitle +
//_logSection('Priority ' + clearLogButton, priorityList) +
_logPriorityTable() +
(options.showTimeCompensate ? _logSection('Priority (time compensate)', timeCompensateList) : '') +
_logSection('Info', _infoSection()) +
_logSection('Log', log) +
_logSection('Options', _optionsSection()) +
_logSection('History', _history());
var newButtonText = newLogs > 0 ? 'Log (' + newLogs + ')' : 'Log';
if (jQuery('#logButton').text() != newButtonText) jQuery('#logButton').text(newButtonText);
_title(oldTitle);
};
var _setBankStogarePercent = function(val, needUpdate) {
if (options.bankStoragePercent != val) {
if (needUpdate === true) jQuery('#bankStoragePercent').val(val);
if (console) console.log('bankStoragePercent =', val);
_store('bankStoragePercent', val);
options.bankStoragePercent = val;
jQuery('#bankStoragePercentLabel').text('Storage (' + Beautify(_getMinimalMoney()) + ') percent: ' + val + '%');
_updateLog();
}
}
document.getElementById('logButton').onsliderchange = function(el) {
var val = $(el).val();
_setBankStogarePercent(val);
};
var _bankAutoFunction = function() {
if (options.bankStorageAuto && priorityList.length > 0 && Game.OnAscend == 0) {
for (var idx in priorityListObj) {
var bankStorageNew = Math.floor(idx / 50000);
if (bankStorageNew > 100) bankStorageNew = 100;
if (!isNaN(bankStorageNew)) _setBankStogarePercent(bankStorageNew, true);
else if (console) console.log('bankStorageNew error:', idx);
break;
}
}
};
document.getElementById('logButton').onbuttonclick = function(el,e) {
e.preventDefault();
var id = jQuery(el).attr('data-id');
if (id == 'showTimeCompensate') {
options.showTimeCompensate = !options.showTimeCompensate;
if (console) console.log('showTimeCompensate =', options.showTimeCompensate ? 'TRUE' : 'FALSE');
} else if (id == 'bankStorageAuto') {
options.bankStorageAuto = !options.bankStorageAuto;
_store('bankStorageAuto', options.bankStorageAuto);
if (console) console.log('bankStorageAuto =', options.bankStorageAuto ? 'TRUE' : 'FALSE');
_bankAutoFunction();
} else if (id == 'clearLog') {
log = [];
newLogs = 0;
}
jQuery(el).attr('disabled', 'disabled');
_updateLog();
}
var _addLog = function(text, notCritical) {
var t = new Date();
log.push(t.toUTCString() + ': ' + text);
if (notCritical !== true) newLogs++;
_updateLog();
};
jQuery('#logButton').text('Log').on("click", function() {
newLogs = 0;
jQuery('#logButton').text('Log');
});
var _killAllWrinklers = function () {
var wrinklersCount = _getWrinklerCount();
if (wrinklersCount >= 10) {
var wrinklesIncome = 0;
for (var i in Game.wrinklers) {
wrinklesIncome += Game.wrinklers[i].sucked;
Game.wrinklers[i].hp = 0; // kill ALL
}
if (wrinklesIncome > 0) {
_addLog('Killed all Wrinkles for ' + Beautify(wrinklesIncome) + ' because of count 10.', true);
}
}
};
var _makeABuy = function() {
_killAllWrinklers();
var moneyCanSpend = _getMoneyCanSpend();
if (moneyCanSpend < 0) {
var minimalMoney = _getMinimalMoney();
_caption('Collecting minimum ' + Beautify(minimalMoney));
_titlePercent(Game.cookies, minimalMoney, 'minimum');
return;
}
var needToBuy = undefined, needToBuyInterest = undefined;
if (priorityList.length > 0) {
for (var idx in priorityListObj) {
needToBuy = priorityListObj[idx];
needToBuyInterest = idx;
if (needToBuy.type == 'upgrade') {
_caption('Upgrading ' + needToBuy.name + ' for ' + Beautify(needToBuy.price));
if (needToBuy.price < moneyCanSpend) {
if (Game.UpgradesById[needToBuy.id].canBuy()) {
Game.UpgradesById[needToBuy.id].buy();
_addLog('Buy upgrade ' + Game.UpgradesById[needToBuy.id].name + ' for ' + Beautify(needToBuy.price));
_createPriorityList();
}
} else {
_titlePercent(moneyCanSpend, needToBuy.price, Game.UpgradesById[needToBuy.id].name);
}
} else {
_caption('Collecting ' + Beautify(needToBuy.price) + ' for ' + needToBuy.name);
if (Game.ObjectsById[needToBuy.id].price < moneyCanSpend) {
var amount = 1;
if (Game.ObjectsById[needToBuy.id].getSumPrice(100) < moneyCanSpend) {
Game.ObjectsById[needToBuy.id].buy(100);
amount = 100;
} else if (Game.ObjectsById[needToBuy.id].getSumPrice(10) < moneyCanSpend) {
Game.ObjectsById[needToBuy.id].buy(10);
amount = 10;
} else {
Game.ObjectsById[needToBuy.id].buy(1);
}
_addLog('Buy ' + amount + ' object ' + Game.ObjectsById[needToBuy.id].name + ' for ' + Beautify(Game.ObjectsById[needToBuy.id].price));
_createPriorityList();
} else {
_titlePercent(moneyCanSpend, needToBuy.price, Game.ObjectsById[needToBuy.id].name);
}
}
break;
}
}
};
var startT = function() {
t2 = setInterval(_makeABuy, 500);
started = true;
_caption('Started');
_addLog('Autobuy start!', true);
};
var stopT = function() {
clearInterval(t2);
started = false;
_caption('Collecting gold...');
_addLog('Autobuy stop.', true);
};
jQuery('#versionNumber').on("click", function() {
if (!started)
startT();
else
stopT();
});
options.bankStoragePercent = _restore('bankStoragePercent');
if (typeof options.bankStoragePercent === 'undefined' || options.bankStoragePercent === null) {
options.bankStoragePercent = 100;
}
options.bankStorageAuto = _restore('bankStorageAuto');
if (typeof options.bankStorageAuto === 'undefined' || options.bankStorageAuto === null) {
options.bankStorageAuto = false;
}
setTimeout(function() {
jQuery('#donateBox').hide();
tPriority = setInterval(function () {
_createPriorityList();
_updateLog();
}, 1000);
tLog = setInterval(function () {
_updateLog();
}, 600);
tReloadPageOnWrongBuff = setInterval(function() {
if (_getBuffMult() < 1) {
var hasBuffsToKill = false;
for (var buff in Game.buffs) {
if (Game.buffs[buff] !== 0 && typeof Game.buffs[buff].multCpS !== 'undefined') {
Game.buffs[buff].time = 0; // remove all buffs, not only negative (not cheating)
hasBuffsToKill = true;
}
}
if (hasBuffsToKill) _addLog('Remove all buffs because of negative multiplier', true);
}
}, 1000);
tAscendDetector = setInterval(function() {
if (Game.OnAscend == 1) {
_setBankStogarePercent(0, true);
}
}, 1000);
t3 = setInterval(function() {
var golden = Game.shimmers;
if (golden.length > 0) {
for (var i in golden) {
golden[i].pop();
}
}
}, 500);
tBankAuto = setInterval(_bankAutoFunction, 600001); // 10 minutes
tClickFrenzy = setInterval(function() {
if (Game.hasBuff('Click frenzy') ||
Game.hasBuff('Cursed finger') ||
Game.hasBuff('Elder frenzy') ||
Game.hasBuff('Dragon Harvest') ||
Game.hasBuff('Dragonflight') ||
Game.cookiesPs < 1000000) {
Game.ClickCookie();
isClickingNow = true;
} else {
isClickingNow = false;
}
}, 75);
if (Game.cookiesPs < 1E6) {
tClick = setInterval(function() {
Game.mouseX = jQuery('#bigCookie').width() / 2 + jQuery('#bigCookie').offset().left;
Game.mouseY = jQuery('#bigCookie').height() / 2 + jQuery('#bigCookie').offset().top;
Game.ClickCookie();
if (Game.cookiesPs > 1E8) clearInterval(tClick);
}, 300);
}
_caption('Collecting gold...');
_bankAutoFunction();
}, 5000);
})();