diff --git a/CookieMonster.js b/CookieMonster.js
index 463fb1d..d26a337 100644
--- a/CookieMonster.js
+++ b/CookieMonster.js
@@ -1090,16 +1090,7 @@ CM.Disp.CalculateGrimoireRefillTime = function(currentMagic, maxMagic, targetMag
return count / Game.fps;
}
-CM.Disp.AddWrinklerAreaDetect = function() {
- l('backgroundLeftCanvas').onmouseover = function() {CM.Disp.TooltipWrinklerArea = 1;};
- l('backgroundLeftCanvas').onmouseout = function() {
- CM.Disp.TooltipWrinklerArea = 0;
- Game.tooltip.hide();
- for (var i in Game.wrinklers) {
- CM.Disp.TooltipWrinklerCache[i] = 0;
- }
- };
-}
+
CM.Disp.UpdateAscendState = function() {
if (Game.OnAscend) {
@@ -1227,7 +1218,7 @@ CM.Disp.Beautify = function(num, frac, forced) {
if (num == "0") {
return num
}
- else if (timesTenToPowerThree < 2) {
+ else if (-1 < timesTenToPowerThree < 2) {
answer = Math.round(num * 100) / 100;
}
else if (CM.Config.Scale == 3 && !forced || forced == 3) { // Scientific notation, 123456789 => 1.235E+8
@@ -2093,16 +2084,205 @@ CM.Disp.CreateSimpleTooltip = function(placeholder, text, minWidth) {
}
/**
- * This function creates the tooltip extension of Lucky/Chain and other warnings for the building and upgrade tooltips
- * It is called by CM.DelayInit() and the tooltip is appended to the l('tooltipAnchor').
- * Visbility is then managed in CM.Disp.UpdateTooltip().
+ * This function replaces the original .onmouseover functions of buildings so that it calls CM.Disp.Tooltip()
+ * CM.Disp.Tooltip() sets the tooltip type to 'b'
+ * It is called by CM.DelayInit()
+ * TODO: Place all ReplaceTooltip functions either under CM.DelayInit() or CM.ReplaceNative()
+ * TODO: Move this code to Main.js file
*/
-CM.Disp.CreateTooltipWarn = function() {
+CM.Disp.ReplaceTooltipBuild = function() {
+ CM.Disp.TooltipBuildBackup = [];
+ for (var i in Game.Objects) {
+ var me = Game.Objects[i];
+ if (l('product' + me.id).onmouseover != null) {
+ CM.Disp.TooltipBuildBackup[i] = l('product' + me.id).onmouseover;
+ eval('l(\'product\' + me.id).onmouseover = function() {Game.tooltip.dynamic = 1; Game.tooltip.draw(this, function() {return CM.Disp.Tooltip(\'b\', \'' + i + '\');}, \'store\'); Game.tooltip.wobble();}');
+ }
+ }
+}
+
+/**
+ * This function replaces the original .onmouseover functions of upgrades so that it calls CM.Disp.Tooltip()
+ * CM.Disp.Tooltip() sets the tooltip type to 'u'
+ * It is called by CM.ReplaceNative()
+ * TODO: Place all ReplaceTooltip functions either under CM.DelayInit() or CM.ReplaceNative()
+ * TODO: Move this code to Main.js file
+ *
+ */
+CM.Disp.ReplaceTooltipUpgrade = function() {
+ CM.Disp.TooltipUpgradeBackup = [];
+ for (var i in Game.UpgradesInStore) {
+ var me = Game.UpgradesInStore[i];
+ if (l('upgrade' + i).onmouseover != null) {
+ CM.Disp.TooltipUpgradeBackup[i] = l('upgrade' + i).onmouseover;
+ eval('l(\'upgrade\' + i).onmouseover = function() {if (!Game.mouseDown) {Game.setOnCrate(this); Game.tooltip.dynamic = 1; Game.tooltip.draw(this, function() {return CM.Disp.Tooltip(\'u\', \'' + i + '\');}, \'store\'); Game.tooltip.wobble();}}');
+ }
+ }
+}
+
+/**
+ * This function replaces the original .onmouseover functions of the Grimoire minigame so that it calls CM.Disp.Tooltip()
+ * CM.Disp.Tooltip() sets the tooltip type to 'g'
+ * The function is called by CM.DelayInit()
+ * TODO: Place all ReplaceTooltip functions either under CM.DelayInit() or CM.ReplaceNative()
+ * TODO: Move this code to Main.js file
+ */
+CM.Disp.ReplaceTooltipGrimoire = function() {
+ if (Game.Objects['Wizard tower'].minigameLoaded) {
+ CM.Disp.TooltipGrimoireBackup = [];
+ for (var i in Game.Objects['Wizard tower'].minigame.spellsById) {
+ if (l('grimoireSpell' + i).onmouseover != null) {
+ CM.Disp.TooltipGrimoireBackup[i] = l('grimoireSpell' + i).onmouseover;
+ eval('l(\'grimoireSpell\' + i).onmouseover = function() {Game.tooltip.dynamic = 1; Game.tooltip.draw(this, function() {return CM.Disp.Tooltip(\'g\', \'' + i + '\');}, \'this\'); Game.tooltip.wobble();}');
+ }
+ }
+ }
+}
+
+/**
+ * This function replaces the original .onmouseover functions of sugar lumps so that it calls CM.Disp.Tooltip()
+ * CM.Disp.Tooltip() sets the tooltip type to 's'
+ * The function is called by CM.DelayInit()
+ * TODO: Place all ReplaceTooltip functions either under CM.DelayInit() or CM.ReplaceNative()
+ * TODO: Move this code to Main.js file
+ */
+CM.Disp.ReplaceTooltipLump = function() {
+ if (Game.canLumps()) {
+ CM.Disp.TooltipLumpBackup = l('lumps').onmouseover;
+ eval('l(\'lumps\').onmouseover = function() {Game.tooltip.dynamic = 1; Game.tooltip.draw(this, function() {return CM.Disp.Tooltip(\'s\', \'Lump\');}, \'this\'); Game.tooltip.wobble();}');
+ }
+};
+
+/**
+ * This function enhance the standard tooltips by creating and changing l('tooltip')
+ * The function is called by .onmouseover events that have replaced original code to use CM.Disp.Tooltip()
+ * @param {string} type Type of tooltip (b, u, s or g)
+ * @param {string} name Name of the object/item the tooltip relates to
+ * @returns {string} l('tooltip').innerHTML The HTML of the l('tooltip')-object
+ */
+CM.Disp.Tooltip = function(type, name) {
+ if (type == 'b') { // Buildings
+ l('tooltip').innerHTML = Game.Objects[name].tooltip();
+ // Adds amortization info to the list of info per building
+ if (CM.Config.TooltipAmor == 1) {
+ var buildPrice = CM.Sim.BuildingGetPrice(Game.Objects[name], Game.Objects[name].basePrice, 0, Game.Objects[name].free, Game.Objects[name].amount);
+ var amortizeAmount = buildPrice - Game.Objects[name].totalCookies;
+ if (amortizeAmount > 0) {
+ l('tooltip').innerHTML = l('tooltip').innerHTML
+ .split('so far')
+ .join('so far
• ' + Beautify(amortizeAmount) + ' ' + (Math.floor(amortizeAmount) == 1 ? 'cookie' : 'cookies') + ' left to amortize (' + CM.Disp.GetTimeColor((buildPrice - Game.Objects[name].totalCookies) / (Game.Objects[name].storedTotalCps * Game.globalCpsMult)).text + ')');
+ }
+ }
+ if (Game.buyMode == -1) {
+ /*
+ * Fix sell price displayed in the object tooltip.
+ *
+ * The buildings sell price displayed by the game itself (without any mod) is incorrect.
+ * The following line of code fixes this issue, and can be safely removed when the game gets fixed.
+ *
+ * This issue is extensively detailed here: https://github.com/Aktanusa/CookieMonster/issues/359#issuecomment-735658262
+ */
+ l('tooltip').innerHTML = l('tooltip').innerHTML.split(Beautify(Game.Objects[name].bulkPrice)).join(Beautify(CM.Sim.BuildingSell(Game.Objects[name], Game.Objects[name].basePrice, Game.Objects[name].amount, Game.Objects[name].free, Game.buyBulk, 1)));
+ }
+ }
+ else if (type == 'u') { // Upgrades
+ if (!Game.UpgradesInStore[name]) return '';
+ l('tooltip').innerHTML = Game.crateTooltip(Game.UpgradesInStore[name], 'store');
+ }
+ else if (type === 's') l('tooltip').innerHTML = Game.lumpTooltip(); // Sugar Lumps
+ else if (type === 'g') l('tooltip').innerHTML = Game.Objects['Wizard tower'].minigame.spellTooltip(name)(); // Grimoire
+
+ // Adds area for extra tooltip-sections
+ var area = document.createElement('div');
+ area.id = 'CMTooltipArea';
+ l('tooltip').appendChild(area);
+
+ // Sets global variables used by CM.Disp.UpdateTooltip()
+ CM.Disp.tooltipType = type;
+ CM.Disp.tooltipName = name;
+
+ CM.Disp.UpdateTooltip();
+
+ return l('tooltip').innerHTML;
+}
+
+/**
+ * This function creates a tooltipBox object which contains all CookieMonster added tooltip information.
+ * It is called by all CM.Disp.UpdateTooltip functions.
+ * @returns {object} div An object containing the stylized box
+ */
+CM.Disp.TooltipCreateTooltipBox = function() {
+ l('tooltip').firstChild.style.paddingBottom = '4px'; // Sets padding on base-tooltip
+ var tooltipBox = document.createElement('div');
+ tooltipBox.style.border = '1px solid';
+ tooltipBox.style.padding = '4px';
+ tooltipBox.style.margin = '0px -4px';
+ tooltipBox.id = 'CMTooltipBorder';
+ tooltipBox.className = CM.Disp.colorTextPre + CM.Disp.colorGray;
+ return tooltipBox
+}
+
+/**
+ * This function creates a header object for tooltips.
+ * It is called by all CM.Disp.UpdateTooltip functions.
+ * @param {string} text Title of header
+ * @returns {object} div An object containing the stylized header
+ */
+CM.Disp.TooltipCreateHeader = function(text) {
+ var div = document.createElement('div');
+ div.style.fontWeight = 'bold';
+ div.className = CM.Disp.colorTextPre + CM.Disp.colorBlue;
+ div.textContent = text;
+ return div;
+}
+
+/**
+ * This function appends the sections for Bonus Income, PP and Time left (to achiev) to the tooltip-object
+ * It is called by CM.Disp.UpdateTooltipBuilding() and CM.Disp.UpdateTooltipUpgrade()
+ * The actual data is added by the Update-functions themselves
+ * @param {object} tooltip Object of a TooltipBox, normally created by a call to CM.Disp.TooltipCreateTooltipBox()
+ */
+CM.Disp.TooltipCreateCalculationSection = function(tooltip) {
+ tooltip.appendChild(CM.Disp.TooltipCreateHeader('Bonus Income'));
+ var income = document.createElement('div');
+ income.style.marginBottom = '4px';
+ income.style.color = 'white';
+ income.id = 'CMTooltipIncome';
+ tooltip.appendChild(income);
+
+ tooltip.appendChild(CM.Disp.TooltipCreateHeader('Payback Period'));
+ var pp = document.createElement('div');
+ pp.style.marginBottom = '4px';
+ pp.id = 'CMTooltipPP';
+ tooltip.appendChild(pp);
+
+ tooltip.appendChild(CM.Disp.TooltipCreateHeader('Time Left'));
+ var time = document.createElement('div');
+ time.id = 'CMTooltipTime';
+ tooltip.appendChild(time);
+
+ if (CM.Disp.tooltipType == 'b') {
+ tooltip.appendChild(CM.Disp.TooltipCreateHeader('Production left till next achievement'));
+ tooltip.lastChild.id = 'CMTooltipProductionHeader'; // Assign a id in order to hid when no achiev's are left
+ var production = document.createElement('div');
+ production.id = 'CMTooltipProduction';
+ tooltip.appendChild(production);
+ }
+}
+
+/**
+ * This function creates the tooltip objectm for warnings
+ * It is called by CM.Disp.UpdateTooltipWarnings() whenever the tooltip type is 'b' or 'u'
+ * The object is also removed by CM.Disp.UpdateTooltipWarnings() when type is 's' or 'g'
+ * @returns {object} CM.Disp.TooltipWarn The Warnings-tooltip object
+ */
+CM.Disp.TooltipCreateWarningSection = function() {
CM.Disp.TooltipWarn = document.createElement('div');
CM.Disp.TooltipWarn.style.position = 'absolute';
- CM.Disp.TooltipWarn.style.display = 'none';
+ CM.Disp.TooltipWarn.style.display = 'block';
CM.Disp.TooltipWarn.style.left = 'auto';
CM.Disp.TooltipWarn.style.bottom = 'auto';
+ CM.Disp.TooltipWarn.id = "CMDispTooltipWarningParent";
var create = function(boxId, color, labelTextFront, labelTextBack, deficitId) {
var box = document.createElement('div');
@@ -2138,433 +2318,276 @@ CM.Disp.CreateTooltipWarn = function() {
CM.Disp.TooltipWarn.appendChild(create('CMDispTooltipWarnLuckyFrenzy', CM.Disp.colorYellow, 'Warning: ', 'Purchase of this item will put you under the number of Cookies required for "Lucky!" (Frenzy)', 'CMDispTooltipWarnLuckyFrenzyText'));
CM.Disp.TooltipWarn.lastChild.style.marginBottom = '4px';
CM.Disp.TooltipWarn.appendChild(create('CMDispTooltipWarnConjure', CM.Disp.colorPurple, 'Warning: ', 'Purchase of this item will put you under the number of Cookies required for "Conjure Baked Goods"', 'CMDispTooltipWarnConjureText'));
-
- l('tooltipAnchor').appendChild(CM.Disp.TooltipWarn);
+
+ return CM.Disp.TooltipWarn;
}
/**
- * This function replaces the original .onmouseover functions of buildings so that it calls CM.Disp.Tooltip()
- * CM.Disp.Tooltip() sets the tooltip type to 'b'
- * It is called by CM.DelayInit()
- * TODO: Place all ReplaceTooltip functions either under CM.DelayInit() or CM.ReplaceNative()
+ * This function updates the sections of the tooltips created by CookieMonster
+ * It is called when tooltips are created by and CM.Disp.Tooltip() on every loop by CM.Loop()
*/
-CM.Disp.ReplaceTooltipBuild = function() {
- CM.Disp.TooltipBuildBackup = [];
- for (var i in Game.Objects) {
- var me = Game.Objects[i];
- if (l('product' + me.id).onmouseover != null) {
- CM.Disp.TooltipBuildBackup[i] = l('product' + me.id).onmouseover;
- eval('l(\'product\' + me.id).onmouseover = function() {Game.tooltip.dynamic = 1; Game.tooltip.draw(this, function() {return CM.Disp.Tooltip(\'b\', \'' + i + '\');}, \'store\'); Game.tooltip.wobble();}');
- }
- }
-}
-
-/**
- * This function replaces the original .onmouseover functions of upgrades so that it calls CM.Disp.Tooltip()
- * CM.Disp.Tooltip() sets the tooltip type to 'u'
- * It is called by CM.ReplaceNative()
- * TODO: Place all ReplaceTooltip functions either under CM.DelayInit() or CM.ReplaceNative()
- */
-CM.Disp.ReplaceTooltipUpgrade = function() {
- CM.Disp.TooltipUpgradeBackup = [];
- for (var i in Game.UpgradesInStore) {
- var me = Game.UpgradesInStore[i];
- if (l('upgrade' + i).onmouseover != null) {
- CM.Disp.TooltipUpgradeBackup[i] = l('upgrade' + i).onmouseover;
- eval('l(\'upgrade\' + i).onmouseover = function() {if (!Game.mouseDown) {Game.setOnCrate(this); Game.tooltip.dynamic = 1; Game.tooltip.draw(this, function() {return CM.Disp.Tooltip(\'u\', \'' + i + '\');}, \'store\'); Game.tooltip.wobble();}}');
- }
- }
-}
-
-/**
- * This function replaces the original .onmouseover functions of the Grimoire minigame so that it calls CM.Disp.Tooltip()
- * CM.Disp.Tooltip() sets the tooltip type to 'g'
- * The function is called by CM.DelayInit()
- * TODO: Place all ReplaceTooltip functions either under CM.DelayInit() or CM.ReplaceNative()
- */
-CM.Disp.ReplaceTooltipGrimoire = function() {
- if (Game.Objects['Wizard tower'].minigameLoaded) {
- CM.Disp.TooltipGrimoireBackup = [];
- for (var i in Game.Objects['Wizard tower'].minigame.spellsById) {
- if (l('grimoireSpell' + i).onmouseover != null) {
- CM.Disp.TooltipGrimoireBackup[i] = l('grimoireSpell' + i).onmouseover;
- eval('l(\'grimoireSpell\' + i).onmouseover = function() {Game.tooltip.dynamic = 1; Game.tooltip.draw(this, function() {return CM.Disp.Tooltip(\'g\', \'' + i + '\');}, \'this\'); Game.tooltip.wobble();}');
- }
- }
- }
-}
-
-/**
- * This function replaces the original .onmouseover functions of sugar lumps so that it calls CM.Disp.Tooltip()
- * CM.Disp.Tooltip() sets the tooltip type to 's'
- * The function is called by CM.DelayInit()
- * TODO: Place all ReplaceTooltip functions either under CM.DelayInit() or CM.ReplaceNative()
- */
-CM.Disp.ReplaceTooltipLump = function() {
- if (Game.canLumps()) {
- CM.Disp.TooltipLumpBackup = l('lumps').onmouseover;
- eval('l(\'lumps\').onmouseover = function() {Game.tooltip.dynamic = 1; Game.tooltip.draw(this, function() {return CM.Disp.Tooltip(\'s\', \'Lump\');}, \'this\'); Game.tooltip.wobble();}');
- }
-};
-
-/**
- * This function creates tooltips by creating and changing l('tooltip')
- * The function is called by .onmouseover events that have replaced original code to use CM.Disp.Tooltip(
- */
-CM.Disp.Tooltip = function(type, name) {
- if (type == 'b') {
- l('tooltip').innerHTML = Game.Objects[name].tooltip();
- if (CM.Config.TooltipAmor == 1) {
- var buildPrice = CM.Sim.BuildingGetPrice(Game.Objects[name], Game.Objects[name].basePrice, 0, Game.Objects[name].free, Game.Objects[name].amount);
- var amortizeAmount = buildPrice - Game.Objects[name].totalCookies;
- if (amortizeAmount > 0) {
- l('tooltip').innerHTML = l('tooltip').innerHTML
- .split('so far')
- .join('so far
• ' + Beautify(amortizeAmount) + ' ' + (Math.floor(amortizeAmount) == 1 ? 'cookie' : 'cookies') + ' left to amortize (' + CM.Disp.GetTimeColor((buildPrice - Game.Objects[name].totalCookies) / (Game.Objects[name].storedTotalCps * Game.globalCpsMult)).text + ')');
- }
- }
- if (Game.buyMode == 1) {
- var target = '';
- var change = false;
- if (Game.buyBulk == 10) {
- target = 'Objects10';
- change = true;
- }
- else if (Game.buyBulk == 100) {
- target = 'Objects100';
- change = true;
- }
- if (change) {
- l('tooltip').innerHTML = l('tooltip').innerHTML.split(Beautify(Game.Objects[name].getPrice())).join(Beautify(CM.Cache[target][name].price));
- }
- }
- else if (Game.buyMode == -1) {
- /*
- * Fix sell price displayed in the object tooltip.
- *
- * The buildings sell price displayed by the game itself (without any mod) is incorrect.
- * The following line of code fixes this issue, and can be safely removed when the game gets fixed.
- *
- * This issue is extensively detailed here: https://github.com/Aktanusa/CookieMonster/issues/359#issuecomment-735658262
- */
- l('tooltip').innerHTML = l('tooltip').innerHTML.split(Beautify(Game.Objects[name].bulkPrice)).join(Beautify(CM.Sim.BuildingSell(Game.Objects[name], Game.Objects[name].basePrice, Game.Objects[name].amount, Game.Objects[name].free, Game.buyBulk, 1)));
- }
- }
- else if (type == 'u') {
- if (!Game.UpgradesInStore[name]) return '';
- l('tooltip').innerHTML = Game.crateTooltip(Game.UpgradesInStore[name], 'store');
- }
- else if (type === 's') {
- // Sugar Lump
- l('tooltip').innerHTML = Game.lumpTooltip();
- }
- else { // Grimoire
- l('tooltip').innerHTML = Game.Objects['Wizard tower'].minigame.spellTooltip(name)();
- }
-
- var area = document.createElement('div');
- area.id = 'CMTooltipArea';
- l('tooltip').appendChild(area);
-
- if (CM.Config.TooltipBuildUp == 1 && (type == 'u' || (type == 'b' && Game.buyMode == 1))) {
- l('tooltip').firstChild.style.paddingBottom = '4px';
- var tooltip = document.createElement('div');
- tooltip.style.border = '1px solid';
- tooltip.style.padding = '4px';
- tooltip.style.margin = '0px -4px';
- tooltip.id = 'CMTooltipBorder';
-
- var header = function(text) {
- var div = document.createElement('div');
- div.style.fontWeight = 'bold';
- div.className = CM.Disp.colorTextPre + CM.Disp.colorBlue;
- div.textContent = text;
- return div;
- }
-
- tooltip.appendChild(header('Bonus Income'));
- var income = document.createElement('div');
- income.style.marginBottom = '4px';
- income.style.color = 'white';
- income.id = 'CMTooltipIncome';
- tooltip.appendChild(income);
- tooltip.appendChild(header('Payback Period'));
- var pp = document.createElement('div');
- pp.style.marginBottom = '4px';
- pp.id = 'CMTooltipPP';
- tooltip.appendChild(pp);
- tooltip.appendChild(header('Time Left'));
- var time = document.createElement('div');
- time.id = 'CMTooltipTime';
- tooltip.appendChild(time);
- if (type == 'b') {
- tooltip.appendChild(header('Production left till next achievement'));
- tooltip.lastChild.id = 'CMTooltipProductionHeader';
- var production = document.createElement('div');
- production.id = 'CMTooltipProduction';
- tooltip.appendChild(production);
- }
-
- area.appendChild(tooltip);
- }
-
- CM.Disp.tooltipType = type;
- CM.Disp.tooltipName = name;
-
- CM.Disp.UpdateTooltip();
-
- return l('tooltip').innerHTML;
-}
-
CM.Disp.UpdateTooltip = function() {
CM.Sim.CopyData();
- if (l('tooltipAnchor').style.display != 'none') {
+ if (l('tooltipAnchor').style.display != 'none' && l('CMTooltipArea')) {
+ l('CMTooltipArea').innerHTML = '';
+ tooltipBox = CM.Disp.TooltipCreateTooltipBox();
+ l('CMTooltipArea').appendChild(tooltipBox);
+
+ if (CM.Disp.tooltipType == 'b') {
+ CM.Disp.UpdateTooltipBuilding();
+ }
+ else if (CM.Disp.tooltipType == 'u') {
+ CM.Disp.UpdateTooltipUpgrade();
+ }
+ else if (CM.Disp.tooltipType === 's') {
+ CM.Disp.UpdateTooltipSugarLump();
+ }
+ else if (CM.Disp.tooltipType === 'g') {
+ CM.Disp.UpdateTooltipGrimoire();
+ }
+ CM.Disp.UpdateTooltipWarnings();
+ }
+}
- if (l('CMTooltipArea') != null) {
- if (CM.Disp.tooltipType == 'b' || CM.Disp.tooltipType == 'u') {
- // Error checking
- if (CM.Disp.tooltipType == 'u' && (typeof Game.UpgradesInStore[CM.Disp.tooltipName] === 'undefined' || typeof CM.Cache.Upgrades[Game.UpgradesInStore[CM.Disp.tooltipName].name] === 'undefined')) {
- return;
- }
- var price;
- var bonus;
- if (CM.Disp.tooltipType == 'b') {
- var target = '';
- if (Game.buyMode == 1 && Game.buyBulk == 10) {
- target = 'Objects10';
- price = CM.Cache[target][CM.Disp.tooltipName].price;
- }
- else if (Game.buyMode == 1 && Game.buyBulk == 100) {
- target = 'Objects100';
- price = CM.Cache[target][CM.Disp.tooltipName].price;
- }
- else {
- target = 'Objects';
- price = Game.Objects[CM.Disp.tooltipName].getPrice();
- }
- bonus = CM.Cache[target][CM.Disp.tooltipName].bonus;
- if (CM.Config.TooltipBuildUp == 1 && Game.buyMode == 1) {
- l('CMTooltipBorder').className = CM.Disp.colorTextPre + CM.Cache[target][CM.Disp.tooltipName].color;
- l('CMTooltipPP').textContent = Beautify(CM.Cache[target][CM.Disp.tooltipName].pp, 2);
- l('CMTooltipPP').className = CM.Disp.colorTextPre + CM.Cache[target][CM.Disp.tooltipName].color;
- }
- if (CM.Config.TooltipBuildUp) {
- for (var i in Game.Objects[CM.Disp.tooltipName].productionAchievs) {
- if (!CM.Sim.HasAchiev(Game.Objects[CM.Disp.tooltipName].productionAchievs[i].achiev.name)) {
- var nextProductionAchiev = Game.Objects[CM.Disp.tooltipName].productionAchievs[i]
- break
- }
- }
- if (typeof nextProductionAchiev != "undefined") {
- l('CMTooltipTime').style.marginBottom = '4px';
- l('CMTooltipProductionHeader').style.display = "";
- l('CMTooltipProduction').className = "ProdAchievement" + CM.Disp.tooltipName;
- l('CMTooltipProduction').textContent = Beautify(nextProductionAchiev.pow - CM.Sim.Objects[CM.Disp.tooltipName].totalCookies, 15);
- l('CMTooltipProduction').style.color = "white";
- } else {
- l('CMTooltipProductionHeader').style.display = "none";
- l('CMTooltipTime').style.marginBottom = '0px';
- }
- }
- }
- else { // Upgrades
- bonus = CM.Cache.Upgrades[Game.UpgradesInStore[CM.Disp.tooltipName].name].bonus;
- price = Game.Upgrades[Game.UpgradesInStore[CM.Disp.tooltipName].name].getPrice();
- if (CM.Config.TooltipBuildUp == 1) {
- l('CMTooltipBorder').className = CM.Disp.colorTextPre + CM.Cache.Upgrades[Game.UpgradesInStore[CM.Disp.tooltipName].name].color;
- l('CMTooltipPP').textContent = Beautify(CM.Cache.Upgrades[Game.UpgradesInStore[CM.Disp.tooltipName].name].pp, 2);
- l('CMTooltipPP').className = CM.Disp.colorTextPre + CM.Cache.Upgrades[Game.UpgradesInStore[CM.Disp.tooltipName].name].color;
- }
- }
- if (CM.Config.TooltipBuildUp == 1 && (CM.Disp.tooltipType != 'b' || Game.buyMode == 1)) {
- l('CMTooltipIncome').textContent = Beautify(bonus, 2);
+/**
+ * This function adds extra info to the Building tooltips
+ * It is called when Building tooltips are created or refreshed by CM.Disp.UpdateTooltip()
+ */
+CM.Disp.UpdateTooltipBuilding = function() {
+ if (CM.Config.TooltipBuildUp == 1 && Game.buyMode == 1) {
+ tooltipBox = l('CMTooltipBorder');
+ CM.Disp.TooltipCreateCalculationSection(tooltipBox);
- var increase = Math.round(bonus / Game.cookiesPs * 10000);
- if (isFinite(increase) && increase != 0) {
- l('CMTooltipIncome').textContent += ' (' + (increase / 100) + '% of income)';
- }
+ var target = '';
+ // TODO: Change the Cache code and variables to use Objects1, Objectes10, Objects100
+ // That would depreciate this target setting code
+ if (Game.buyMode == 1 && Game.buyBulk == 10) target = 'Objects10'
+ else if (Game.buyMode == 1 && Game.buyBulk == 100) target = 'Objects100';
+ else target = 'Objects';
- var timeColor = CM.Disp.GetTimeColor((price - (Game.cookies + CM.Disp.GetWrinkConfigBank())) / CM.Disp.GetCPS());
- l('CMTooltipTime').textContent = timeColor.text;
- l('CMTooltipTime').className = CM.Disp.colorTextPre + timeColor.color;
- }
+ var price = Game.Objects[CM.Disp.tooltipName].bulkPrice
+ CM.Disp.TooltipBonusIncome = CM.Cache[target][CM.Disp.tooltipName].bonus;
+
- if (CM.Config.ToolWarnPos == 0) {
- CM.Disp.TooltipWarn.style.right = '0px';
- }
- else {
- CM.Disp.TooltipWarn.style.top = (l('tooltip').offsetHeight) + 'px';
- }
- CM.Disp.TooltipWarn.style.width = (l('tooltip').offsetWidth - 6) + 'px';
+ if (CM.Config.TooltipBuildUp == 1 && Game.buyMode == 1) {
+ l('CMTooltipIncome').textContent = Beautify(CM.Disp.TooltipBonusIncome, 2);
+ var increase = Math.round(CM.Disp.TooltipBonusIncome / Game.cookiesPs * 10000);
+ if (isFinite(increase) && increase != 0) {
+ l('CMTooltipIncome').textContent += ' (' + (increase / 100) + '% of income)';
+ }
+ l('CMTooltipBorder').className = CM.Disp.colorTextPre + CM.Cache[target][CM.Disp.tooltipName].color;
+ l('CMTooltipPP').textContent = Beautify(CM.Cache[target][CM.Disp.tooltipName].pp, 2);
+ l('CMTooltipPP').className = CM.Disp.colorTextPre + CM.Cache[target][CM.Disp.tooltipName].color;
+ var timeColor = CM.Disp.GetTimeColor((price - (Game.cookies + CM.Disp.GetWrinkConfigBank())) / CM.Disp.GetCPS());
+ l('CMTooltipTime').textContent = timeColor.text;
+ l('CMTooltipTime').className = CM.Disp.colorTextPre + timeColor.color;
+ }
- if (CM.Config.ToolWarnLucky == 1) {
- CM.Disp.TooltipWarn.style.display = 'block';
- var limitLucky = CM.Cache.Lucky;
- if (CM.Config.ToolWarnBon == 1) {
- var bonusNoFren = bonus;
- bonusNoFren /= CM.Sim.getCPSBuffMult();
- limitLucky += ((bonusNoFren * 60 * 15) / 0.15);
- }
- var limitLuckyFrenzy = limitLucky * 7;
- var amount = (Game.cookies + CM.Disp.GetWrinkConfigBank()) - price;
- if ((amount < limitLucky || amount < limitLuckyFrenzy) && (CM.Disp.tooltipType != 'b' || Game.buyMode == 1)) {
- if (amount < limitLucky) {
- l('CMDispTooltipWarnLucky').style.display = '';
- l('CMDispTooltipWarnLuckyText').textContent = Beautify(limitLucky - amount) + ' (' + CM.Disp.FormatTime((limitLucky - amount) / CM.Disp.GetCPS()) + ')';
- l('CMDispTooltipWarnLuckyFrenzy').style.display = '';
- l('CMDispTooltipWarnLuckyFrenzyText').textContent = Beautify(limitLuckyFrenzy - amount) + ' (' + CM.Disp.FormatTime((limitLuckyFrenzy - amount) / CM.Disp.GetCPS()) + ')';
- }
- else if (amount < limitLuckyFrenzy) {
- l('CMDispTooltipWarnLuckyFrenzy').style.display = '';
- l('CMDispTooltipWarnLuckyFrenzyText').textContent = Beautify(limitLuckyFrenzy - amount) + ' (' + CM.Disp.FormatTime((limitLuckyFrenzy - amount) / CM.Disp.GetCPS()) + ')';
- l('CMDispTooltipWarnLucky').style.display = 'none';
- }
- } else {
- l('CMDispTooltipWarnLucky').style.display = 'none';
- l('CMDispTooltipWarnLuckyFrenzy').style.display = 'none';
- }
+ // Add "production left till next achievement"-bar
+ for (var i in Game.Objects[CM.Disp.tooltipName].productionAchievs) {
+ if (!CM.Sim.HasAchiev(Game.Objects[CM.Disp.tooltipName].productionAchievs[i].achiev.name)) {
+ var nextProductionAchiev = Game.Objects[CM.Disp.tooltipName].productionAchievs[i]
+ break
+ }
+ }
+ if (typeof nextProductionAchiev != "undefined") {
+ l('CMTooltipTime').style.marginBottom = '4px';
+ l('CMTooltipProductionHeader').style.display = "";
+ l('CMTooltipProduction').className = "ProdAchievement" + CM.Disp.tooltipName;
+ l('CMTooltipProduction').textContent = Beautify(nextProductionAchiev.pow - CM.Sim.Objects[CM.Disp.tooltipName].totalCookies, 15);
+ l('CMTooltipProduction').style.color = "white";
+ } else {
+ l('CMTooltipProductionHeader').style.display = "none";
+ l('CMTooltipTime').style.marginBottom = '0px';
+ }
+ }
+}
+
+/**
+ * This function adds extra info to the Upgrade tooltips
+ * It is called when Upgrade tooltips are created or refreshed by CM.Disp.UpdateTooltip()
+ */
+CM.Disp.UpdateTooltipUpgrade = function() {
+ tooltipBox = l('CMTooltipBorder');
+ CM.Disp.TooltipCreateCalculationSection(tooltipBox);
+
+ CM.Disp.TooltipBonusIncome = CM.Cache.Upgrades[Game.UpgradesInStore[CM.Disp.tooltipName].name].bonus;
+ price = Game.Upgrades[Game.UpgradesInStore[CM.Disp.tooltipName].name].getPrice();
+
+ if (CM.Config.TooltipBuildUp == 1) {
+ l('CMTooltipIncome').textContent = Beautify(CM.Disp.TooltipBonusIncome, 2);
+ var increase = Math.round(CM.Disp.TooltipBonusIncome / Game.cookiesPs * 10000);
+ if (isFinite(increase) && increase != 0) {
+ l('CMTooltipIncome').textContent += ' (' + (increase / 100) + '% of income)';
+ }
+ l('CMTooltipBorder').className = CM.Disp.colorTextPre + CM.Cache.Upgrades[Game.UpgradesInStore[CM.Disp.tooltipName].name].color;
+ l('CMTooltipPP').textContent = Beautify(CM.Cache.Upgrades[Game.UpgradesInStore[CM.Disp.tooltipName].name].pp, 2);
+ l('CMTooltipPP').className = CM.Disp.colorTextPre + CM.Cache.Upgrades[Game.UpgradesInStore[CM.Disp.tooltipName].name].color;
+ var timeColor = CM.Disp.GetTimeColor((price - (Game.cookies + CM.Disp.GetWrinkConfigBank())) / CM.Disp.GetCPS());
+ l('CMTooltipTime').textContent = timeColor.text;
+ l('CMTooltipTime').className = CM.Disp.colorTextPre + timeColor.color;
+ }
+}
+
+/**
+ * This function adds extra info to the Sugar Lump tooltip
+ * It is called when the Sugar Lump tooltip is created or refreshed by CM.Disp.UpdateTooltip()
+ * It adds to the additional information to l('CMTooltipArea')
+ */
+CM.Disp.UpdateTooltipSugarLump = function() {
+ if (CM.Config.TooltipLump === 1) {
+ tooltipBox = l('CMTooltipBorder');
+
+ tooltipBox.appendChild(CM.Disp.TooltipCreateHeader('Current Sugar Lump'));
+
+ var lumpType = document.createElement('div');
+ lumpType.id = 'CMTooltipTime';
+ tooltipBox.appendChild(lumpType);
+ var lumpColor = CM.Disp.GetLumpColor(Game.lumpCurrentType);
+ lumpType.textContent = lumpColor.text;
+ lumpType.className = CM.Disp.colorTextPre + lumpColor.color;
+ }
+}
+
+/**
+ * This function adds extra info to the Grimoire tooltips
+ * It is called when Grimoire tooltips are created or refreshed by CM.Disp.UpdateTooltip()
+ * It adds to the additional information to l('CMTooltipArea')
+ */
+CM.Disp.UpdateTooltipGrimoire = function() {
+ var minigame = Game.Objects['Wizard tower'].minigame;
+ var spellCost = minigame.getSpellCost(minigame.spellsById[CM.Disp.tooltipName]);
+
+ if (CM.Config.TooltipGrim == 1 && spellCost <= minigame.magicM) {
+ tooltipBox = l('CMTooltipBorder');
+
+ // Time left till enough magic for spell
+ tooltipBox.appendChild(CM.Disp.TooltipCreateHeader('Time Left'));
+ var time = document.createElement('div');
+ time.id = 'CMTooltipTime';
+ tooltipBox.appendChild(time);
+ var timeColor = CM.Disp.GetTimeColor(CM.Disp.CalculateGrimoireRefillTime(minigame.magic, minigame.magicM, spellCost));
+ time.textContent = timeColor.text;
+ time.className = CM.Disp.colorTextPre + timeColor.color;
+
+ // Time left untill magic spent is recovered
+ if (spellCost <= minigame.magic) {
+ tooltipBox.appendChild(CM.Disp.TooltipCreateHeader('Recover Time'));
+ var recover = document.createElement('div');
+ recover.id = 'CMTooltipRecover';
+ tooltipBox.appendChild(recover);
+ var recoverColor = CM.Disp.GetTimeColor(CM.Disp.CalculateGrimoireRefillTime(Math.max(0, minigame.magic - spellCost), minigame.magicM, minigame.magic));
+ recover.textContent = recoverColor.text;
+ recover.className = CM.Disp.colorTextPre + recoverColor.color;
+ }
+
+ // Extra information on cookies gained when spell is Conjure Baked Goods (Name == 0)
+ if (CM.Disp.tooltipName == 0) {
+ tooltipBox.appendChild(CM.Disp.TooltipCreateHeader('Cookies to be gained/lost'));
+ var conjure = document.createElement('div');
+ conjure.id = 'CMTooltipConjure';
+ tooltipBox.appendChild(conjure);
+ var reward = document.createElement('span');
+ reward.style.color = "#33FF00"
+ reward.textContent = Beautify(Math.min((Game.cookies + CM.Disp.GetWrinkConfigBank()) * 0.15, CM.Cache.NoGoldSwitchCookiesPS * 60 * 30), 2)
+ conjure.appendChild(reward)
+ var seperator = document.createElement('span');
+ seperator.textContent = ' / '
+ conjure.appendChild(seperator)
+ var loss = document.createElement('span');
+ loss.style.color = "red"
+ loss.textContent = Beautify((CM.Cache.NoGoldSwitchCookiesPS * 60 * 15), 2);
+ conjure.appendChild(loss)
+ }
+
+ l('CMTooltipArea').appendChild(tooltipBox);
+ }
+}
+
+/**
+ * This function updates the warnings section of the building and upgrade tooltips
+ * It is called by CM.Disp.UpdateTooltip()
+ */
+CM.Disp.UpdateTooltipWarnings = function() {
+ if (CM.Disp.tooltipType == "b" || CM.Disp.tooltipType == "u") {
+ if (document.getElementById("tooltipWarn") == null) {
+ warningTooltip = CM.Disp.TooltipCreateWarningSection();
+ l('tooltipAnchor').appendChild(warningTooltip);
+ }
+
+ if (CM.Config.ToolWarnPos == 0) CM.Disp.TooltipWarn.style.right = '0px';
+ else CM.Disp.TooltipWarn.style.top = (l('tooltip').offsetHeight) + 'px';
+
+ CM.Disp.TooltipWarn.style.width = (l('tooltip').offsetWidth - 6) + 'px';
+
+ if (CM.Config.ToolWarnLucky == 1) {
+ var limitLucky = CM.Cache.Lucky;
+ if (CM.Config.ToolWarnBon == 1) {
+ var bonusNoFren = CM.Disp.TooltipBonusIncome;
+ bonusNoFren /= CM.Sim.getCPSBuffMult();
+ limitLucky += ((bonusNoFren * 60 * 15) / 0.15);
+ }
+ var limitLuckyFrenzy = limitLucky * 7;
+ var amount = (Game.cookies + CM.Disp.GetWrinkConfigBank()) - price;
+ if ((amount < limitLucky || amount < limitLuckyFrenzy) && (CM.Disp.tooltipType != 'b' || Game.buyMode == 1)) {
+ if (amount < limitLucky) {
+ l('CMDispTooltipWarnLucky').style.display = '';
+ l('CMDispTooltipWarnLuckyText').textContent = Beautify(limitLucky - amount) + ' (' + CM.Disp.FormatTime((limitLucky - amount) / CM.Disp.GetCPS()) + ')';
+ l('CMDispTooltipWarnLuckyFrenzy').style.display = '';
+ l('CMDispTooltipWarnLuckyFrenzyText').textContent = Beautify(limitLuckyFrenzy - amount) + ' (' + CM.Disp.FormatTime((limitLuckyFrenzy - amount) / CM.Disp.GetCPS()) + ')';
}
- else {
+ else if (amount < limitLuckyFrenzy) {
+ l('CMDispTooltipWarnLuckyFrenzy').style.display = '';
+ l('CMDispTooltipWarnLuckyFrenzyText').textContent = Beautify(limitLuckyFrenzy - amount) + ' (' + CM.Disp.FormatTime((limitLuckyFrenzy - amount) / CM.Disp.GetCPS()) + ')';
l('CMDispTooltipWarnLucky').style.display = 'none';
- l('CMDispTooltipWarnLuckyFrenzy').style.display = 'none';
}
-
- if (CM.Config.ToolWarnConjure == 1) {
- CM.Disp.TooltipWarn.style.display = 'block';
- var limitLucky = CM.Cache.Lucky;
- if (CM.Config.ToolWarnBon == 1) {
- var bonusNoFren = bonus;
- bonusNoFren /= CM.Sim.getCPSBuffMult();
- limitLucky += ((bonusNoFren * 60 * 15) / 0.15);
- }
- var limitConjure = limitLucky * 2;
- var amount = (Game.cookies + CM.Disp.GetWrinkConfigBank()) - price;
- if ((amount < limitConjure) && (CM.Disp.tooltipType != 'b' || Game.buyMode == 1)) {
- l('CMDispTooltipWarnConjure').style.display = '';
- l('CMDispTooltipWarnConjureText').textContent = Beautify(limitConjure - amount) + ' (' + CM.Disp.FormatTime((limitConjure - amount) / CM.Disp.GetCPS()) + ')';
- } else {
- l('CMDispTooltipWarnConjure').style.display = 'none';
- }
- }
- else {
- l('CMDispTooltipWarnConjure').style.display = 'none';
- }
- }
- else if (CM.Disp.tooltipType === 's') {
- // Adding information about Sugar Lumps.
-
- CM.Disp.TooltipWarn.style.display = 'none';
- l('CMDispTooltipWarnLucky').style.display = 'none';
- l('CMDispTooltipWarnLuckyFrenzy').style.display = 'none';
- l('CMDispTooltipWarnConjure').style.display = 'none';
-
- if (CM.Config.TooltipLump === 1) {
- l('CMTooltipArea').innerHTML = '';
-
- l('tooltip').firstChild.style.paddingBottom = '4px';
- var lumpTooltip = document.createElement('div');
- lumpTooltip.style.border = '1px solid';
- lumpTooltip.style.padding = '4px';
- lumpTooltip.style.margin = '0px -4px';
- lumpTooltip.id = 'CMTooltipBorder';
- lumpTooltip.className = CM.Disp.colorTextPre + CM.Disp.colorGray;
-
- var lumpHeader = document.createElement('div');
- lumpHeader.style.fontWeight = 'bold';
- lumpHeader.className = CM.Disp.colorTextPre + CM.Disp.colorBlue;
- lumpHeader.textContent = 'Current Sugar Lump';
-
- lumpTooltip.appendChild(lumpHeader);
- var lumpType = document.createElement('div');
- lumpType.id = 'CMTooltipTime';
- lumpTooltip.appendChild(lumpType);
- var lumpColor = CM.Disp.GetLumpColor(Game.lumpCurrentType);
- lumpType.textContent = lumpColor.text;
- lumpType.className = CM.Disp.colorTextPre + lumpColor.color;
-
- l('CMTooltipArea').appendChild(lumpTooltip);
- }
- }
- else if (CM.Disp.tooltipType === 'g') {
- // Grimoire
- CM.Disp.TooltipWarn.style.display = 'none';
+ } else {
l('CMDispTooltipWarnLucky').style.display = 'none';
l('CMDispTooltipWarnLuckyFrenzy').style.display = 'none';
- l('CMDispTooltipWarnConjure').style.display = 'none';
-
- var minigame = Game.Objects['Wizard tower'].minigame;
- var spellCost = minigame.getSpellCost(minigame.spellsById[CM.Disp.tooltipName]);
-
- if (CM.Config.TooltipGrim == 1 && spellCost <= minigame.magicM) {
- l('CMTooltipArea').innerHTML = '';
-
- l('tooltip').firstChild.style.paddingBottom = '4px';
- var tooltip = document.createElement('div');
- tooltip.style.border = '1px solid';
- tooltip.style.padding = '4px';
- tooltip.style.margin = '0px -4px';
- tooltip.id = 'CMTooltipBorder';
- tooltip.className = CM.Disp.colorTextPre + CM.Disp.colorGray;
-
- var header = function(text) {
- var div = document.createElement('div');
- div.style.fontWeight = 'bold';
- div.className = CM.Disp.colorTextPre + CM.Disp.colorBlue;
- div.textContent = text;
- return div;
- }
-
- tooltip.appendChild(header('Time Left'));
- var time = document.createElement('div');
- time.id = 'CMTooltipTime';
- tooltip.appendChild(time);
- var timeColor = CM.Disp.GetTimeColor(CM.Disp.CalculateGrimoireRefillTime(minigame.magic, minigame.magicM, spellCost));
- time.textContent = timeColor.text;
- time.className = CM.Disp.colorTextPre + timeColor.color;
-
- if (spellCost <= minigame.magic) {
- tooltip.appendChild(header('Recover Time'));
- var recover = document.createElement('div');
- recover.id = 'CMTooltipRecover';
- tooltip.appendChild(recover);
- var recoverColor = CM.Disp.GetTimeColor(CM.Disp.CalculateGrimoireRefillTime(Math.max(0, minigame.magic - spellCost), minigame.magicM, minigame.magic));
- recover.textContent = recoverColor.text;
- recover.className = CM.Disp.colorTextPre + recoverColor.color;
- }
-
- // Extra information when spell is Conjure Baked Goods (Name == 0)
- if (CM.Disp.tooltipName == 0) {
- tooltip.appendChild(header('Cookies to be gained/lost'));
- var conjure = document.createElement('div');
- conjure.id = 'CMTooltipConjure';
- tooltip.appendChild(conjure);
- var reward = document.createElement('span');
- reward.style.color = "#33FF00"
- reward.textContent = Beautify(Math.min((Game.cookies + CM.Disp.GetWrinkConfigBank()) * 0.15, CM.Cache.NoGoldSwitchCookiesPS * 60 * 30), 2)
- conjure.appendChild(reward)
- var seperator = document.createElement('span');
- seperator.textContent = ' / '
- conjure.appendChild(seperator)
- var loss = document.createElement('span');
- loss.style.color = "red"
- loss.textContent = Beautify((CM.Cache.NoGoldSwitchCookiesPS * 60 * 15), 2);
- conjure.appendChild(loss)
- }
-
- l('CMTooltipArea').appendChild(tooltip);
- }
}
}
else {
- CM.Disp.TooltipWarn.style.display = 'none';
+ l('CMDispTooltipWarnLucky').style.display = 'none';
+ l('CMDispTooltipWarnLuckyFrenzy').style.display = 'none';
+ }
+
+ if (CM.Config.ToolWarnConjure == 1) {
+ var limitLucky = CM.Cache.Lucky;
+ if (CM.Config.ToolWarnBon == 1) {
+ var bonusNoFren = CM.Disp.TooltipBonusIncome;
+ bonusNoFren /= CM.Sim.getCPSBuffMult();
+ limitLucky += ((bonusNoFren * 60 * 15) / 0.15);
+ }
+ var limitConjure = limitLucky * 2;
+ var amount = (Game.cookies + CM.Disp.GetWrinkConfigBank()) - price;
+ if ((amount < limitConjure) && (CM.Disp.tooltipType != 'b' || Game.buyMode == 1)) {
+ l('CMDispTooltipWarnConjure').style.display = '';
+ l('CMDispTooltipWarnConjureText').textContent = Beautify(limitConjure - amount) + ' (' + CM.Disp.FormatTime((limitConjure - amount) / CM.Disp.GetCPS()) + ')';
+ } else {
+ l('CMDispTooltipWarnConjure').style.display = 'none';
+ }
+ }
+ else {
+ l('CMDispTooltipWarnConjure').style.display = 'none';
+ }
+ }
+ else {
+ if (l('CMDispTooltipWarningParent') != null) {
+ l('CMDispTooltipWarningParent').remove();
}
}
}
+/**
+ * This function updates the location of the tooltip
+ * It is called by Game.tooltip.update() because of CM.ReplaceNative()
+ */
CM.Disp.UpdateTooltipLocation = function() {
if (Game.tooltip.origin == 'store') {
var warnOffset = 0;
- if (CM.Config.ToolWarnLucky == 1 && CM.Config.ToolWarnPos == 1) warnOffset = CM.Disp.TooltipWarn.clientHeight - 4;
+ if (CM.Config.ToolWarnLucky == 1 && CM.Config.ToolWarnPos == 1 && typeof CM.Disp.TooltipWarn != "undefined") {
+ warnOffset = CM.Disp.TooltipWarn.clientHeight - 4;
+ }
Game.tooltip.tta.style.top = Math.min(parseInt(Game.tooltip.tta.style.top), (l('game').clientHeight + l('topBar').clientHeight) - Game.tooltip.tt.clientHeight - warnOffset - 46) + 'px';
}
// Kept for future possible use if the code changes again
@@ -2574,44 +2597,31 @@ CM.Disp.UpdateTooltipLocation = function() {
}
/**
- * This function toggles the position of the warnings created by CM.Disp.CreateTooltipWarn()
+ * This function toggles the position of the warnings created by CM.Disp.TooltipCreateWarningSection()
* It is called by a change in CM.Config.ToolWarnPos
*/
CM.Disp.ToggleToolWarnPos = function() {
- if (CM.Config.ToolWarnPos == 0) {
- CM.Disp.TooltipWarn.style.top = 'auto';
- CM.Disp.TooltipWarn.style.margin = '4px -4px';
- CM.Disp.TooltipWarn.style.padding = '3px 4px';
- }
- else {
- CM.Disp.TooltipWarn.style.right = 'auto';
- CM.Disp.TooltipWarn.style.margin = '4px';
- CM.Disp.TooltipWarn.style.padding = '4px 3px';
- }
-}
-
-CM.Disp.DrawTooltipWarn = function() {
- if (CM.Config.ToolWarnLucky == 1) {
- l('CMDispTooltipWarnLucky').style.opacity = '0';
- l('CMDispTooltipWarnLuckyFrenzy').style.opacity = '0';
- }
- if (CM.Config.ToolWarnConjure == 1) {
- l('CMDispTooltipWarnConjure').style.opacity = '0';
- }
-}
-
-CM.Disp.UpdateTooltipWarn = function() {
- if (CM.Config.ToolWarnLucky == 1 && l('tooltipAnchor').style.display != 'none' && l('CMTooltipArea') != null) {
- l('CMDispTooltipWarnLucky').style.opacity = '1';
- l('CMDispTooltipWarnLuckyFrenzy').style.opacity = '1';
- }
- if (CM.Config.ToolWarnConjure == 1 && l('tooltipAnchor').style.display != 'none' && l('CMTooltipArea') != null) {
- l('CMDispTooltipWarnConjure').style.opacity = '1';
+ if (typeof CM.Disp.TooltipWarn != "undefined") {
+ if (CM.Config.ToolWarnPos == 0) {
+ CM.Disp.TooltipWarn.style.top = 'auto';
+ CM.Disp.TooltipWarn.style.margin = '4px -4px';
+ CM.Disp.TooltipWarn.style.padding = '3px 4px';
+ }
+ else {
+ CM.Disp.TooltipWarn.style.right = 'auto';
+ CM.Disp.TooltipWarn.style.margin = '4px';
+ CM.Disp.TooltipWarn.style.padding = '4px 3px';
+ }
}
}
+/**
+ * This function checks and create a tooltip for the wrinklers
+ * It is called by CM.Loop()
+ * TODO: Change this code to be the same as other tooltips. (i.d., create tooltip with type "w")
+ */
CM.Disp.CheckWrinklerTooltip = function() {
- if (CM.Config.ToolWrink == 1 && CM.Disp.TooltipWrinklerArea == 1) {
+ if (CM.Config.ToolWrink == 1 && CM.Disp.TooltipWrinklerArea == 1) { // Latter is set by CM.Main.AddWrinklerAreaDetect
var showingTooltip = false;
for (var i in Game.wrinklers) {
var me = Game.wrinklers[i];
@@ -2643,6 +2653,11 @@ CM.Disp.CheckWrinklerTooltip = function() {
}
}
+/**
+ * This function updates the amount to be displayed by the wrinkler tooltip created by CM.Disp.CheckWrinklerTooltip()
+ * It is called by CM.Loop()
+ * TODO: Change this code to be the same as other tooltips. Fit this into CM.Disp.UpdateTooltip()
+ */
CM.Disp.UpdateWrinklerTooltip = function() {
if (CM.Config.ToolWrink == 1 && l('CMTooltipWrinkler') != null) {
var sucked = Game.wrinklers[CM.Disp.TooltipWrinkler].sucked;
@@ -3439,14 +3454,12 @@ CM.ReplaceNative = function() {
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.DrawTooltipWarn();
}
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.UpdateTooltipWarn();
CM.Disp.UpdateTooltipLocation();
}
@@ -3649,11 +3662,10 @@ CM.DelayInit = function() {
for (var i in CM.Disp.TooltipText) {
CM.Disp.CreateSimpleTooltip(CM.Disp.TooltipText[i][0], CM.Disp.TooltipText[i][1], CM.Disp.TooltipText[i][2]);
}
- CM.Disp.CreateTooltipWarn();
CM.Disp.ReplaceTooltipBuild();
CM.Disp.ReplaceTooltipGrimoire();
CM.Disp.ReplaceTooltipLump();
- CM.Disp.AddWrinklerAreaDetect();
+ CM.Main.AddWrinklerAreaDetect();
CM.Cache.InitCookiesDiff();
CM.ReplaceNative();
CM.ReplaceNativeGrimoire();
@@ -3832,6 +3844,23 @@ CM.Main.CheckWrinklerCount = function() {
}
}
+/**
+ * This function creates .onmouseover/out events that determine if the mouse is hovering-over a Wrinkler
+ * It is called by CM.DelayInit
+ * TODO: The system for displaying wrinklers should ideally use a similar system as other tooltips
+ * Thus, writing a CM.Disp.ReplaceTooltipWrinkler function etc.
+ */
+CM.Main.AddWrinklerAreaDetect = function() {
+ l('backgroundLeftCanvas').onmouseover = function() {CM.Disp.TooltipWrinklerArea = 1;};
+ l('backgroundLeftCanvas').onmouseout = function() {
+ CM.Disp.TooltipWrinklerArea = 0;
+ Game.tooltip.hide();
+ for (var i in Game.wrinklers) {
+ CM.Disp.TooltipWrinklerCache[i] = 0;
+ }
+ };
+}
+
CM.HasReplaceNativeGrimoireLaunch = false;
CM.HasReplaceNativeGrimoireDraw = false;
diff --git a/src/Disp.js b/src/Disp.js
index a38b41a..a1ebf03 100644
--- a/src/Disp.js
+++ b/src/Disp.js
@@ -208,16 +208,7 @@ CM.Disp.CalculateGrimoireRefillTime = function(currentMagic, maxMagic, targetMag
return count / Game.fps;
}
-CM.Disp.AddWrinklerAreaDetect = function() {
- l('backgroundLeftCanvas').onmouseover = function() {CM.Disp.TooltipWrinklerArea = 1;};
- l('backgroundLeftCanvas').onmouseout = function() {
- CM.Disp.TooltipWrinklerArea = 0;
- Game.tooltip.hide();
- for (var i in Game.wrinklers) {
- CM.Disp.TooltipWrinklerCache[i] = 0;
- }
- };
-}
+
CM.Disp.UpdateAscendState = function() {
if (Game.OnAscend) {
@@ -345,7 +336,7 @@ CM.Disp.Beautify = function(num, frac, forced) {
if (num == "0") {
return num
}
- else if (timesTenToPowerThree < 2) {
+ else if (-1 < timesTenToPowerThree < 2) {
answer = Math.round(num * 100) / 100;
}
else if (CM.Config.Scale == 3 && !forced || forced == 3) { // Scientific notation, 123456789 => 1.235E+8
@@ -1211,16 +1202,205 @@ CM.Disp.CreateSimpleTooltip = function(placeholder, text, minWidth) {
}
/**
- * This function creates the tooltip extension of Lucky/Chain and other warnings for the building and upgrade tooltips
- * It is called by CM.DelayInit() and the tooltip is appended to the l('tooltipAnchor').
- * Visbility is then managed in CM.Disp.UpdateTooltip().
+ * This function replaces the original .onmouseover functions of buildings so that it calls CM.Disp.Tooltip()
+ * CM.Disp.Tooltip() sets the tooltip type to 'b'
+ * It is called by CM.DelayInit()
+ * TODO: Place all ReplaceTooltip functions either under CM.DelayInit() or CM.ReplaceNative()
+ * TODO: Move this code to Main.js file
*/
-CM.Disp.CreateTooltipWarn = function() {
+CM.Disp.ReplaceTooltipBuild = function() {
+ CM.Disp.TooltipBuildBackup = [];
+ for (var i in Game.Objects) {
+ var me = Game.Objects[i];
+ if (l('product' + me.id).onmouseover != null) {
+ CM.Disp.TooltipBuildBackup[i] = l('product' + me.id).onmouseover;
+ eval('l(\'product\' + me.id).onmouseover = function() {Game.tooltip.dynamic = 1; Game.tooltip.draw(this, function() {return CM.Disp.Tooltip(\'b\', \'' + i + '\');}, \'store\'); Game.tooltip.wobble();}');
+ }
+ }
+}
+
+/**
+ * This function replaces the original .onmouseover functions of upgrades so that it calls CM.Disp.Tooltip()
+ * CM.Disp.Tooltip() sets the tooltip type to 'u'
+ * It is called by CM.ReplaceNative()
+ * TODO: Place all ReplaceTooltip functions either under CM.DelayInit() or CM.ReplaceNative()
+ * TODO: Move this code to Main.js file
+ *
+ */
+CM.Disp.ReplaceTooltipUpgrade = function() {
+ CM.Disp.TooltipUpgradeBackup = [];
+ for (var i in Game.UpgradesInStore) {
+ var me = Game.UpgradesInStore[i];
+ if (l('upgrade' + i).onmouseover != null) {
+ CM.Disp.TooltipUpgradeBackup[i] = l('upgrade' + i).onmouseover;
+ eval('l(\'upgrade\' + i).onmouseover = function() {if (!Game.mouseDown) {Game.setOnCrate(this); Game.tooltip.dynamic = 1; Game.tooltip.draw(this, function() {return CM.Disp.Tooltip(\'u\', \'' + i + '\');}, \'store\'); Game.tooltip.wobble();}}');
+ }
+ }
+}
+
+/**
+ * This function replaces the original .onmouseover functions of the Grimoire minigame so that it calls CM.Disp.Tooltip()
+ * CM.Disp.Tooltip() sets the tooltip type to 'g'
+ * The function is called by CM.DelayInit()
+ * TODO: Place all ReplaceTooltip functions either under CM.DelayInit() or CM.ReplaceNative()
+ * TODO: Move this code to Main.js file
+ */
+CM.Disp.ReplaceTooltipGrimoire = function() {
+ if (Game.Objects['Wizard tower'].minigameLoaded) {
+ CM.Disp.TooltipGrimoireBackup = [];
+ for (var i in Game.Objects['Wizard tower'].minigame.spellsById) {
+ if (l('grimoireSpell' + i).onmouseover != null) {
+ CM.Disp.TooltipGrimoireBackup[i] = l('grimoireSpell' + i).onmouseover;
+ eval('l(\'grimoireSpell\' + i).onmouseover = function() {Game.tooltip.dynamic = 1; Game.tooltip.draw(this, function() {return CM.Disp.Tooltip(\'g\', \'' + i + '\');}, \'this\'); Game.tooltip.wobble();}');
+ }
+ }
+ }
+}
+
+/**
+ * This function replaces the original .onmouseover functions of sugar lumps so that it calls CM.Disp.Tooltip()
+ * CM.Disp.Tooltip() sets the tooltip type to 's'
+ * The function is called by CM.DelayInit()
+ * TODO: Place all ReplaceTooltip functions either under CM.DelayInit() or CM.ReplaceNative()
+ * TODO: Move this code to Main.js file
+ */
+CM.Disp.ReplaceTooltipLump = function() {
+ if (Game.canLumps()) {
+ CM.Disp.TooltipLumpBackup = l('lumps').onmouseover;
+ eval('l(\'lumps\').onmouseover = function() {Game.tooltip.dynamic = 1; Game.tooltip.draw(this, function() {return CM.Disp.Tooltip(\'s\', \'Lump\');}, \'this\'); Game.tooltip.wobble();}');
+ }
+};
+
+/**
+ * This function enhance the standard tooltips by creating and changing l('tooltip')
+ * The function is called by .onmouseover events that have replaced original code to use CM.Disp.Tooltip()
+ * @param {string} type Type of tooltip (b, u, s or g)
+ * @param {string} name Name of the object/item the tooltip relates to
+ * @returns {string} l('tooltip').innerHTML The HTML of the l('tooltip')-object
+ */
+CM.Disp.Tooltip = function(type, name) {
+ if (type == 'b') { // Buildings
+ l('tooltip').innerHTML = Game.Objects[name].tooltip();
+ // Adds amortization info to the list of info per building
+ if (CM.Config.TooltipAmor == 1) {
+ var buildPrice = CM.Sim.BuildingGetPrice(Game.Objects[name], Game.Objects[name].basePrice, 0, Game.Objects[name].free, Game.Objects[name].amount);
+ var amortizeAmount = buildPrice - Game.Objects[name].totalCookies;
+ if (amortizeAmount > 0) {
+ l('tooltip').innerHTML = l('tooltip').innerHTML
+ .split('so far')
+ .join('so far
• ' + Beautify(amortizeAmount) + ' ' + (Math.floor(amortizeAmount) == 1 ? 'cookie' : 'cookies') + ' left to amortize (' + CM.Disp.GetTimeColor((buildPrice - Game.Objects[name].totalCookies) / (Game.Objects[name].storedTotalCps * Game.globalCpsMult)).text + ')');
+ }
+ }
+ if (Game.buyMode == -1) {
+ /*
+ * Fix sell price displayed in the object tooltip.
+ *
+ * The buildings sell price displayed by the game itself (without any mod) is incorrect.
+ * The following line of code fixes this issue, and can be safely removed when the game gets fixed.
+ *
+ * This issue is extensively detailed here: https://github.com/Aktanusa/CookieMonster/issues/359#issuecomment-735658262
+ */
+ l('tooltip').innerHTML = l('tooltip').innerHTML.split(Beautify(Game.Objects[name].bulkPrice)).join(Beautify(CM.Sim.BuildingSell(Game.Objects[name], Game.Objects[name].basePrice, Game.Objects[name].amount, Game.Objects[name].free, Game.buyBulk, 1)));
+ }
+ }
+ else if (type == 'u') { // Upgrades
+ if (!Game.UpgradesInStore[name]) return '';
+ l('tooltip').innerHTML = Game.crateTooltip(Game.UpgradesInStore[name], 'store');
+ }
+ else if (type === 's') l('tooltip').innerHTML = Game.lumpTooltip(); // Sugar Lumps
+ else if (type === 'g') l('tooltip').innerHTML = Game.Objects['Wizard tower'].minigame.spellTooltip(name)(); // Grimoire
+
+ // Adds area for extra tooltip-sections
+ var area = document.createElement('div');
+ area.id = 'CMTooltipArea';
+ l('tooltip').appendChild(area);
+
+ // Sets global variables used by CM.Disp.UpdateTooltip()
+ CM.Disp.tooltipType = type;
+ CM.Disp.tooltipName = name;
+
+ CM.Disp.UpdateTooltip();
+
+ return l('tooltip').innerHTML;
+}
+
+/**
+ * This function creates a tooltipBox object which contains all CookieMonster added tooltip information.
+ * It is called by all CM.Disp.UpdateTooltip functions.
+ * @returns {object} div An object containing the stylized box
+ */
+CM.Disp.TooltipCreateTooltipBox = function() {
+ l('tooltip').firstChild.style.paddingBottom = '4px'; // Sets padding on base-tooltip
+ var tooltipBox = document.createElement('div');
+ tooltipBox.style.border = '1px solid';
+ tooltipBox.style.padding = '4px';
+ tooltipBox.style.margin = '0px -4px';
+ tooltipBox.id = 'CMTooltipBorder';
+ tooltipBox.className = CM.Disp.colorTextPre + CM.Disp.colorGray;
+ return tooltipBox
+}
+
+/**
+ * This function creates a header object for tooltips.
+ * It is called by all CM.Disp.UpdateTooltip functions.
+ * @param {string} text Title of header
+ * @returns {object} div An object containing the stylized header
+ */
+CM.Disp.TooltipCreateHeader = function(text) {
+ var div = document.createElement('div');
+ div.style.fontWeight = 'bold';
+ div.className = CM.Disp.colorTextPre + CM.Disp.colorBlue;
+ div.textContent = text;
+ return div;
+}
+
+/**
+ * This function appends the sections for Bonus Income, PP and Time left (to achiev) to the tooltip-object
+ * It is called by CM.Disp.UpdateTooltipBuilding() and CM.Disp.UpdateTooltipUpgrade()
+ * The actual data is added by the Update-functions themselves
+ * @param {object} tooltip Object of a TooltipBox, normally created by a call to CM.Disp.TooltipCreateTooltipBox()
+ */
+CM.Disp.TooltipCreateCalculationSection = function(tooltip) {
+ tooltip.appendChild(CM.Disp.TooltipCreateHeader('Bonus Income'));
+ var income = document.createElement('div');
+ income.style.marginBottom = '4px';
+ income.style.color = 'white';
+ income.id = 'CMTooltipIncome';
+ tooltip.appendChild(income);
+
+ tooltip.appendChild(CM.Disp.TooltipCreateHeader('Payback Period'));
+ var pp = document.createElement('div');
+ pp.style.marginBottom = '4px';
+ pp.id = 'CMTooltipPP';
+ tooltip.appendChild(pp);
+
+ tooltip.appendChild(CM.Disp.TooltipCreateHeader('Time Left'));
+ var time = document.createElement('div');
+ time.id = 'CMTooltipTime';
+ tooltip.appendChild(time);
+
+ if (CM.Disp.tooltipType == 'b') {
+ tooltip.appendChild(CM.Disp.TooltipCreateHeader('Production left till next achievement'));
+ tooltip.lastChild.id = 'CMTooltipProductionHeader'; // Assign a id in order to hid when no achiev's are left
+ var production = document.createElement('div');
+ production.id = 'CMTooltipProduction';
+ tooltip.appendChild(production);
+ }
+}
+
+/**
+ * This function creates the tooltip objectm for warnings
+ * It is called by CM.Disp.UpdateTooltipWarnings() whenever the tooltip type is 'b' or 'u'
+ * The object is also removed by CM.Disp.UpdateTooltipWarnings() when type is 's' or 'g'
+ * @returns {object} CM.Disp.TooltipWarn The Warnings-tooltip object
+ */
+CM.Disp.TooltipCreateWarningSection = function() {
CM.Disp.TooltipWarn = document.createElement('div');
CM.Disp.TooltipWarn.style.position = 'absolute';
- CM.Disp.TooltipWarn.style.display = 'none';
+ CM.Disp.TooltipWarn.style.display = 'block';
CM.Disp.TooltipWarn.style.left = 'auto';
CM.Disp.TooltipWarn.style.bottom = 'auto';
+ CM.Disp.TooltipWarn.id = "CMDispTooltipWarningParent";
var create = function(boxId, color, labelTextFront, labelTextBack, deficitId) {
var box = document.createElement('div');
@@ -1256,433 +1436,276 @@ CM.Disp.CreateTooltipWarn = function() {
CM.Disp.TooltipWarn.appendChild(create('CMDispTooltipWarnLuckyFrenzy', CM.Disp.colorYellow, 'Warning: ', 'Purchase of this item will put you under the number of Cookies required for "Lucky!" (Frenzy)', 'CMDispTooltipWarnLuckyFrenzyText'));
CM.Disp.TooltipWarn.lastChild.style.marginBottom = '4px';
CM.Disp.TooltipWarn.appendChild(create('CMDispTooltipWarnConjure', CM.Disp.colorPurple, 'Warning: ', 'Purchase of this item will put you under the number of Cookies required for "Conjure Baked Goods"', 'CMDispTooltipWarnConjureText'));
-
- l('tooltipAnchor').appendChild(CM.Disp.TooltipWarn);
+
+ return CM.Disp.TooltipWarn;
}
/**
- * This function replaces the original .onmouseover functions of buildings so that it calls CM.Disp.Tooltip()
- * CM.Disp.Tooltip() sets the tooltip type to 'b'
- * It is called by CM.DelayInit()
- * TODO: Place all ReplaceTooltip functions either under CM.DelayInit() or CM.ReplaceNative()
+ * This function updates the sections of the tooltips created by CookieMonster
+ * It is called when tooltips are created by and CM.Disp.Tooltip() on every loop by CM.Loop()
*/
-CM.Disp.ReplaceTooltipBuild = function() {
- CM.Disp.TooltipBuildBackup = [];
- for (var i in Game.Objects) {
- var me = Game.Objects[i];
- if (l('product' + me.id).onmouseover != null) {
- CM.Disp.TooltipBuildBackup[i] = l('product' + me.id).onmouseover;
- eval('l(\'product\' + me.id).onmouseover = function() {Game.tooltip.dynamic = 1; Game.tooltip.draw(this, function() {return CM.Disp.Tooltip(\'b\', \'' + i + '\');}, \'store\'); Game.tooltip.wobble();}');
- }
- }
-}
-
-/**
- * This function replaces the original .onmouseover functions of upgrades so that it calls CM.Disp.Tooltip()
- * CM.Disp.Tooltip() sets the tooltip type to 'u'
- * It is called by CM.ReplaceNative()
- * TODO: Place all ReplaceTooltip functions either under CM.DelayInit() or CM.ReplaceNative()
- */
-CM.Disp.ReplaceTooltipUpgrade = function() {
- CM.Disp.TooltipUpgradeBackup = [];
- for (var i in Game.UpgradesInStore) {
- var me = Game.UpgradesInStore[i];
- if (l('upgrade' + i).onmouseover != null) {
- CM.Disp.TooltipUpgradeBackup[i] = l('upgrade' + i).onmouseover;
- eval('l(\'upgrade\' + i).onmouseover = function() {if (!Game.mouseDown) {Game.setOnCrate(this); Game.tooltip.dynamic = 1; Game.tooltip.draw(this, function() {return CM.Disp.Tooltip(\'u\', \'' + i + '\');}, \'store\'); Game.tooltip.wobble();}}');
- }
- }
-}
-
-/**
- * This function replaces the original .onmouseover functions of the Grimoire minigame so that it calls CM.Disp.Tooltip()
- * CM.Disp.Tooltip() sets the tooltip type to 'g'
- * The function is called by CM.DelayInit()
- * TODO: Place all ReplaceTooltip functions either under CM.DelayInit() or CM.ReplaceNative()
- */
-CM.Disp.ReplaceTooltipGrimoire = function() {
- if (Game.Objects['Wizard tower'].minigameLoaded) {
- CM.Disp.TooltipGrimoireBackup = [];
- for (var i in Game.Objects['Wizard tower'].minigame.spellsById) {
- if (l('grimoireSpell' + i).onmouseover != null) {
- CM.Disp.TooltipGrimoireBackup[i] = l('grimoireSpell' + i).onmouseover;
- eval('l(\'grimoireSpell\' + i).onmouseover = function() {Game.tooltip.dynamic = 1; Game.tooltip.draw(this, function() {return CM.Disp.Tooltip(\'g\', \'' + i + '\');}, \'this\'); Game.tooltip.wobble();}');
- }
- }
- }
-}
-
-/**
- * This function replaces the original .onmouseover functions of sugar lumps so that it calls CM.Disp.Tooltip()
- * CM.Disp.Tooltip() sets the tooltip type to 's'
- * The function is called by CM.DelayInit()
- * TODO: Place all ReplaceTooltip functions either under CM.DelayInit() or CM.ReplaceNative()
- */
-CM.Disp.ReplaceTooltipLump = function() {
- if (Game.canLumps()) {
- CM.Disp.TooltipLumpBackup = l('lumps').onmouseover;
- eval('l(\'lumps\').onmouseover = function() {Game.tooltip.dynamic = 1; Game.tooltip.draw(this, function() {return CM.Disp.Tooltip(\'s\', \'Lump\');}, \'this\'); Game.tooltip.wobble();}');
- }
-};
-
-/**
- * This function creates tooltips by creating and changing l('tooltip')
- * The function is called by .onmouseover events that have replaced original code to use CM.Disp.Tooltip(
- */
-CM.Disp.Tooltip = function(type, name) {
- if (type == 'b') {
- l('tooltip').innerHTML = Game.Objects[name].tooltip();
- if (CM.Config.TooltipAmor == 1) {
- var buildPrice = CM.Sim.BuildingGetPrice(Game.Objects[name], Game.Objects[name].basePrice, 0, Game.Objects[name].free, Game.Objects[name].amount);
- var amortizeAmount = buildPrice - Game.Objects[name].totalCookies;
- if (amortizeAmount > 0) {
- l('tooltip').innerHTML = l('tooltip').innerHTML
- .split('so far')
- .join('so far
• ' + Beautify(amortizeAmount) + ' ' + (Math.floor(amortizeAmount) == 1 ? 'cookie' : 'cookies') + ' left to amortize (' + CM.Disp.GetTimeColor((buildPrice - Game.Objects[name].totalCookies) / (Game.Objects[name].storedTotalCps * Game.globalCpsMult)).text + ')');
- }
- }
- if (Game.buyMode == 1) {
- var target = '';
- var change = false;
- if (Game.buyBulk == 10) {
- target = 'Objects10';
- change = true;
- }
- else if (Game.buyBulk == 100) {
- target = 'Objects100';
- change = true;
- }
- if (change) {
- l('tooltip').innerHTML = l('tooltip').innerHTML.split(Beautify(Game.Objects[name].getPrice())).join(Beautify(CM.Cache[target][name].price));
- }
- }
- else if (Game.buyMode == -1) {
- /*
- * Fix sell price displayed in the object tooltip.
- *
- * The buildings sell price displayed by the game itself (without any mod) is incorrect.
- * The following line of code fixes this issue, and can be safely removed when the game gets fixed.
- *
- * This issue is extensively detailed here: https://github.com/Aktanusa/CookieMonster/issues/359#issuecomment-735658262
- */
- l('tooltip').innerHTML = l('tooltip').innerHTML.split(Beautify(Game.Objects[name].bulkPrice)).join(Beautify(CM.Sim.BuildingSell(Game.Objects[name], Game.Objects[name].basePrice, Game.Objects[name].amount, Game.Objects[name].free, Game.buyBulk, 1)));
- }
- }
- else if (type == 'u') {
- if (!Game.UpgradesInStore[name]) return '';
- l('tooltip').innerHTML = Game.crateTooltip(Game.UpgradesInStore[name], 'store');
- }
- else if (type === 's') {
- // Sugar Lump
- l('tooltip').innerHTML = Game.lumpTooltip();
- }
- else { // Grimoire
- l('tooltip').innerHTML = Game.Objects['Wizard tower'].minigame.spellTooltip(name)();
- }
-
- var area = document.createElement('div');
- area.id = 'CMTooltipArea';
- l('tooltip').appendChild(area);
-
- if (CM.Config.TooltipBuildUp == 1 && (type == 'u' || (type == 'b' && Game.buyMode == 1))) {
- l('tooltip').firstChild.style.paddingBottom = '4px';
- var tooltip = document.createElement('div');
- tooltip.style.border = '1px solid';
- tooltip.style.padding = '4px';
- tooltip.style.margin = '0px -4px';
- tooltip.id = 'CMTooltipBorder';
-
- var header = function(text) {
- var div = document.createElement('div');
- div.style.fontWeight = 'bold';
- div.className = CM.Disp.colorTextPre + CM.Disp.colorBlue;
- div.textContent = text;
- return div;
- }
-
- tooltip.appendChild(header('Bonus Income'));
- var income = document.createElement('div');
- income.style.marginBottom = '4px';
- income.style.color = 'white';
- income.id = 'CMTooltipIncome';
- tooltip.appendChild(income);
- tooltip.appendChild(header('Payback Period'));
- var pp = document.createElement('div');
- pp.style.marginBottom = '4px';
- pp.id = 'CMTooltipPP';
- tooltip.appendChild(pp);
- tooltip.appendChild(header('Time Left'));
- var time = document.createElement('div');
- time.id = 'CMTooltipTime';
- tooltip.appendChild(time);
- if (type == 'b') {
- tooltip.appendChild(header('Production left till next achievement'));
- tooltip.lastChild.id = 'CMTooltipProductionHeader';
- var production = document.createElement('div');
- production.id = 'CMTooltipProduction';
- tooltip.appendChild(production);
- }
-
- area.appendChild(tooltip);
- }
-
- CM.Disp.tooltipType = type;
- CM.Disp.tooltipName = name;
-
- CM.Disp.UpdateTooltip();
-
- return l('tooltip').innerHTML;
-}
-
CM.Disp.UpdateTooltip = function() {
CM.Sim.CopyData();
- if (l('tooltipAnchor').style.display != 'none') {
+ if (l('tooltipAnchor').style.display != 'none' && l('CMTooltipArea')) {
+ l('CMTooltipArea').innerHTML = '';
+ tooltipBox = CM.Disp.TooltipCreateTooltipBox();
+ l('CMTooltipArea').appendChild(tooltipBox);
+
+ if (CM.Disp.tooltipType == 'b') {
+ CM.Disp.UpdateTooltipBuilding();
+ }
+ else if (CM.Disp.tooltipType == 'u') {
+ CM.Disp.UpdateTooltipUpgrade();
+ }
+ else if (CM.Disp.tooltipType === 's') {
+ CM.Disp.UpdateTooltipSugarLump();
+ }
+ else if (CM.Disp.tooltipType === 'g') {
+ CM.Disp.UpdateTooltipGrimoire();
+ }
+ CM.Disp.UpdateTooltipWarnings();
+ }
+}
- if (l('CMTooltipArea') != null) {
- if (CM.Disp.tooltipType == 'b' || CM.Disp.tooltipType == 'u') {
- // Error checking
- if (CM.Disp.tooltipType == 'u' && (typeof Game.UpgradesInStore[CM.Disp.tooltipName] === 'undefined' || typeof CM.Cache.Upgrades[Game.UpgradesInStore[CM.Disp.tooltipName].name] === 'undefined')) {
- return;
- }
- var price;
- var bonus;
- if (CM.Disp.tooltipType == 'b') {
- var target = '';
- if (Game.buyMode == 1 && Game.buyBulk == 10) {
- target = 'Objects10';
- price = CM.Cache[target][CM.Disp.tooltipName].price;
- }
- else if (Game.buyMode == 1 && Game.buyBulk == 100) {
- target = 'Objects100';
- price = CM.Cache[target][CM.Disp.tooltipName].price;
- }
- else {
- target = 'Objects';
- price = Game.Objects[CM.Disp.tooltipName].getPrice();
- }
- bonus = CM.Cache[target][CM.Disp.tooltipName].bonus;
- if (CM.Config.TooltipBuildUp == 1 && Game.buyMode == 1) {
- l('CMTooltipBorder').className = CM.Disp.colorTextPre + CM.Cache[target][CM.Disp.tooltipName].color;
- l('CMTooltipPP').textContent = Beautify(CM.Cache[target][CM.Disp.tooltipName].pp, 2);
- l('CMTooltipPP').className = CM.Disp.colorTextPre + CM.Cache[target][CM.Disp.tooltipName].color;
- }
- if (CM.Config.TooltipBuildUp) {
- for (var i in Game.Objects[CM.Disp.tooltipName].productionAchievs) {
- if (!CM.Sim.HasAchiev(Game.Objects[CM.Disp.tooltipName].productionAchievs[i].achiev.name)) {
- var nextProductionAchiev = Game.Objects[CM.Disp.tooltipName].productionAchievs[i]
- break
- }
- }
- if (typeof nextProductionAchiev != "undefined") {
- l('CMTooltipTime').style.marginBottom = '4px';
- l('CMTooltipProductionHeader').style.display = "";
- l('CMTooltipProduction').className = "ProdAchievement" + CM.Disp.tooltipName;
- l('CMTooltipProduction').textContent = Beautify(nextProductionAchiev.pow - CM.Sim.Objects[CM.Disp.tooltipName].totalCookies, 15);
- l('CMTooltipProduction').style.color = "white";
- } else {
- l('CMTooltipProductionHeader').style.display = "none";
- l('CMTooltipTime').style.marginBottom = '0px';
- }
- }
- }
- else { // Upgrades
- bonus = CM.Cache.Upgrades[Game.UpgradesInStore[CM.Disp.tooltipName].name].bonus;
- price = Game.Upgrades[Game.UpgradesInStore[CM.Disp.tooltipName].name].getPrice();
- if (CM.Config.TooltipBuildUp == 1) {
- l('CMTooltipBorder').className = CM.Disp.colorTextPre + CM.Cache.Upgrades[Game.UpgradesInStore[CM.Disp.tooltipName].name].color;
- l('CMTooltipPP').textContent = Beautify(CM.Cache.Upgrades[Game.UpgradesInStore[CM.Disp.tooltipName].name].pp, 2);
- l('CMTooltipPP').className = CM.Disp.colorTextPre + CM.Cache.Upgrades[Game.UpgradesInStore[CM.Disp.tooltipName].name].color;
- }
- }
- if (CM.Config.TooltipBuildUp == 1 && (CM.Disp.tooltipType != 'b' || Game.buyMode == 1)) {
- l('CMTooltipIncome').textContent = Beautify(bonus, 2);
+/**
+ * This function adds extra info to the Building tooltips
+ * It is called when Building tooltips are created or refreshed by CM.Disp.UpdateTooltip()
+ */
+CM.Disp.UpdateTooltipBuilding = function() {
+ if (CM.Config.TooltipBuildUp == 1 && Game.buyMode == 1) {
+ tooltipBox = l('CMTooltipBorder');
+ CM.Disp.TooltipCreateCalculationSection(tooltipBox);
- var increase = Math.round(bonus / Game.cookiesPs * 10000);
- if (isFinite(increase) && increase != 0) {
- l('CMTooltipIncome').textContent += ' (' + (increase / 100) + '% of income)';
- }
+ var target = '';
+ // TODO: Change the Cache code and variables to use Objects1, Objectes10, Objects100
+ // That would depreciate this target setting code
+ if (Game.buyMode == 1 && Game.buyBulk == 10) target = 'Objects10'
+ else if (Game.buyMode == 1 && Game.buyBulk == 100) target = 'Objects100';
+ else target = 'Objects';
- var timeColor = CM.Disp.GetTimeColor((price - (Game.cookies + CM.Disp.GetWrinkConfigBank())) / CM.Disp.GetCPS());
- l('CMTooltipTime').textContent = timeColor.text;
- l('CMTooltipTime').className = CM.Disp.colorTextPre + timeColor.color;
- }
+ var price = Game.Objects[CM.Disp.tooltipName].bulkPrice
+ CM.Disp.TooltipBonusIncome = CM.Cache[target][CM.Disp.tooltipName].bonus;
+
- if (CM.Config.ToolWarnPos == 0) {
- CM.Disp.TooltipWarn.style.right = '0px';
- }
- else {
- CM.Disp.TooltipWarn.style.top = (l('tooltip').offsetHeight) + 'px';
- }
- CM.Disp.TooltipWarn.style.width = (l('tooltip').offsetWidth - 6) + 'px';
+ if (CM.Config.TooltipBuildUp == 1 && Game.buyMode == 1) {
+ l('CMTooltipIncome').textContent = Beautify(CM.Disp.TooltipBonusIncome, 2);
+ var increase = Math.round(CM.Disp.TooltipBonusIncome / Game.cookiesPs * 10000);
+ if (isFinite(increase) && increase != 0) {
+ l('CMTooltipIncome').textContent += ' (' + (increase / 100) + '% of income)';
+ }
+ l('CMTooltipBorder').className = CM.Disp.colorTextPre + CM.Cache[target][CM.Disp.tooltipName].color;
+ l('CMTooltipPP').textContent = Beautify(CM.Cache[target][CM.Disp.tooltipName].pp, 2);
+ l('CMTooltipPP').className = CM.Disp.colorTextPre + CM.Cache[target][CM.Disp.tooltipName].color;
+ var timeColor = CM.Disp.GetTimeColor((price - (Game.cookies + CM.Disp.GetWrinkConfigBank())) / CM.Disp.GetCPS());
+ l('CMTooltipTime').textContent = timeColor.text;
+ l('CMTooltipTime').className = CM.Disp.colorTextPre + timeColor.color;
+ }
- if (CM.Config.ToolWarnLucky == 1) {
- CM.Disp.TooltipWarn.style.display = 'block';
- var limitLucky = CM.Cache.Lucky;
- if (CM.Config.ToolWarnBon == 1) {
- var bonusNoFren = bonus;
- bonusNoFren /= CM.Sim.getCPSBuffMult();
- limitLucky += ((bonusNoFren * 60 * 15) / 0.15);
- }
- var limitLuckyFrenzy = limitLucky * 7;
- var amount = (Game.cookies + CM.Disp.GetWrinkConfigBank()) - price;
- if ((amount < limitLucky || amount < limitLuckyFrenzy) && (CM.Disp.tooltipType != 'b' || Game.buyMode == 1)) {
- if (amount < limitLucky) {
- l('CMDispTooltipWarnLucky').style.display = '';
- l('CMDispTooltipWarnLuckyText').textContent = Beautify(limitLucky - amount) + ' (' + CM.Disp.FormatTime((limitLucky - amount) / CM.Disp.GetCPS()) + ')';
- l('CMDispTooltipWarnLuckyFrenzy').style.display = '';
- l('CMDispTooltipWarnLuckyFrenzyText').textContent = Beautify(limitLuckyFrenzy - amount) + ' (' + CM.Disp.FormatTime((limitLuckyFrenzy - amount) / CM.Disp.GetCPS()) + ')';
- }
- else if (amount < limitLuckyFrenzy) {
- l('CMDispTooltipWarnLuckyFrenzy').style.display = '';
- l('CMDispTooltipWarnLuckyFrenzyText').textContent = Beautify(limitLuckyFrenzy - amount) + ' (' + CM.Disp.FormatTime((limitLuckyFrenzy - amount) / CM.Disp.GetCPS()) + ')';
- l('CMDispTooltipWarnLucky').style.display = 'none';
- }
- } else {
- l('CMDispTooltipWarnLucky').style.display = 'none';
- l('CMDispTooltipWarnLuckyFrenzy').style.display = 'none';
- }
+ // Add "production left till next achievement"-bar
+ for (var i in Game.Objects[CM.Disp.tooltipName].productionAchievs) {
+ if (!CM.Sim.HasAchiev(Game.Objects[CM.Disp.tooltipName].productionAchievs[i].achiev.name)) {
+ var nextProductionAchiev = Game.Objects[CM.Disp.tooltipName].productionAchievs[i]
+ break
+ }
+ }
+ if (typeof nextProductionAchiev != "undefined") {
+ l('CMTooltipTime').style.marginBottom = '4px';
+ l('CMTooltipProductionHeader').style.display = "";
+ l('CMTooltipProduction').className = "ProdAchievement" + CM.Disp.tooltipName;
+ l('CMTooltipProduction').textContent = Beautify(nextProductionAchiev.pow - CM.Sim.Objects[CM.Disp.tooltipName].totalCookies, 15);
+ l('CMTooltipProduction').style.color = "white";
+ } else {
+ l('CMTooltipProductionHeader').style.display = "none";
+ l('CMTooltipTime').style.marginBottom = '0px';
+ }
+ }
+}
+
+/**
+ * This function adds extra info to the Upgrade tooltips
+ * It is called when Upgrade tooltips are created or refreshed by CM.Disp.UpdateTooltip()
+ */
+CM.Disp.UpdateTooltipUpgrade = function() {
+ tooltipBox = l('CMTooltipBorder');
+ CM.Disp.TooltipCreateCalculationSection(tooltipBox);
+
+ CM.Disp.TooltipBonusIncome = CM.Cache.Upgrades[Game.UpgradesInStore[CM.Disp.tooltipName].name].bonus;
+ price = Game.Upgrades[Game.UpgradesInStore[CM.Disp.tooltipName].name].getPrice();
+
+ if (CM.Config.TooltipBuildUp == 1) {
+ l('CMTooltipIncome').textContent = Beautify(CM.Disp.TooltipBonusIncome, 2);
+ var increase = Math.round(CM.Disp.TooltipBonusIncome / Game.cookiesPs * 10000);
+ if (isFinite(increase) && increase != 0) {
+ l('CMTooltipIncome').textContent += ' (' + (increase / 100) + '% of income)';
+ }
+ l('CMTooltipBorder').className = CM.Disp.colorTextPre + CM.Cache.Upgrades[Game.UpgradesInStore[CM.Disp.tooltipName].name].color;
+ l('CMTooltipPP').textContent = Beautify(CM.Cache.Upgrades[Game.UpgradesInStore[CM.Disp.tooltipName].name].pp, 2);
+ l('CMTooltipPP').className = CM.Disp.colorTextPre + CM.Cache.Upgrades[Game.UpgradesInStore[CM.Disp.tooltipName].name].color;
+ var timeColor = CM.Disp.GetTimeColor((price - (Game.cookies + CM.Disp.GetWrinkConfigBank())) / CM.Disp.GetCPS());
+ l('CMTooltipTime').textContent = timeColor.text;
+ l('CMTooltipTime').className = CM.Disp.colorTextPre + timeColor.color;
+ }
+}
+
+/**
+ * This function adds extra info to the Sugar Lump tooltip
+ * It is called when the Sugar Lump tooltip is created or refreshed by CM.Disp.UpdateTooltip()
+ * It adds to the additional information to l('CMTooltipArea')
+ */
+CM.Disp.UpdateTooltipSugarLump = function() {
+ if (CM.Config.TooltipLump === 1) {
+ tooltipBox = l('CMTooltipBorder');
+
+ tooltipBox.appendChild(CM.Disp.TooltipCreateHeader('Current Sugar Lump'));
+
+ var lumpType = document.createElement('div');
+ lumpType.id = 'CMTooltipTime';
+ tooltipBox.appendChild(lumpType);
+ var lumpColor = CM.Disp.GetLumpColor(Game.lumpCurrentType);
+ lumpType.textContent = lumpColor.text;
+ lumpType.className = CM.Disp.colorTextPre + lumpColor.color;
+ }
+}
+
+/**
+ * This function adds extra info to the Grimoire tooltips
+ * It is called when Grimoire tooltips are created or refreshed by CM.Disp.UpdateTooltip()
+ * It adds to the additional information to l('CMTooltipArea')
+ */
+CM.Disp.UpdateTooltipGrimoire = function() {
+ var minigame = Game.Objects['Wizard tower'].minigame;
+ var spellCost = minigame.getSpellCost(minigame.spellsById[CM.Disp.tooltipName]);
+
+ if (CM.Config.TooltipGrim == 1 && spellCost <= minigame.magicM) {
+ tooltipBox = l('CMTooltipBorder');
+
+ // Time left till enough magic for spell
+ tooltipBox.appendChild(CM.Disp.TooltipCreateHeader('Time Left'));
+ var time = document.createElement('div');
+ time.id = 'CMTooltipTime';
+ tooltipBox.appendChild(time);
+ var timeColor = CM.Disp.GetTimeColor(CM.Disp.CalculateGrimoireRefillTime(minigame.magic, minigame.magicM, spellCost));
+ time.textContent = timeColor.text;
+ time.className = CM.Disp.colorTextPre + timeColor.color;
+
+ // Time left untill magic spent is recovered
+ if (spellCost <= minigame.magic) {
+ tooltipBox.appendChild(CM.Disp.TooltipCreateHeader('Recover Time'));
+ var recover = document.createElement('div');
+ recover.id = 'CMTooltipRecover';
+ tooltipBox.appendChild(recover);
+ var recoverColor = CM.Disp.GetTimeColor(CM.Disp.CalculateGrimoireRefillTime(Math.max(0, minigame.magic - spellCost), minigame.magicM, minigame.magic));
+ recover.textContent = recoverColor.text;
+ recover.className = CM.Disp.colorTextPre + recoverColor.color;
+ }
+
+ // Extra information on cookies gained when spell is Conjure Baked Goods (Name == 0)
+ if (CM.Disp.tooltipName == 0) {
+ tooltipBox.appendChild(CM.Disp.TooltipCreateHeader('Cookies to be gained/lost'));
+ var conjure = document.createElement('div');
+ conjure.id = 'CMTooltipConjure';
+ tooltipBox.appendChild(conjure);
+ var reward = document.createElement('span');
+ reward.style.color = "#33FF00"
+ reward.textContent = Beautify(Math.min((Game.cookies + CM.Disp.GetWrinkConfigBank()) * 0.15, CM.Cache.NoGoldSwitchCookiesPS * 60 * 30), 2)
+ conjure.appendChild(reward)
+ var seperator = document.createElement('span');
+ seperator.textContent = ' / '
+ conjure.appendChild(seperator)
+ var loss = document.createElement('span');
+ loss.style.color = "red"
+ loss.textContent = Beautify((CM.Cache.NoGoldSwitchCookiesPS * 60 * 15), 2);
+ conjure.appendChild(loss)
+ }
+
+ l('CMTooltipArea').appendChild(tooltipBox);
+ }
+}
+
+/**
+ * This function updates the warnings section of the building and upgrade tooltips
+ * It is called by CM.Disp.UpdateTooltip()
+ */
+CM.Disp.UpdateTooltipWarnings = function() {
+ if (CM.Disp.tooltipType == "b" || CM.Disp.tooltipType == "u") {
+ if (document.getElementById("tooltipWarn") == null) {
+ warningTooltip = CM.Disp.TooltipCreateWarningSection();
+ l('tooltipAnchor').appendChild(warningTooltip);
+ }
+
+ if (CM.Config.ToolWarnPos == 0) CM.Disp.TooltipWarn.style.right = '0px';
+ else CM.Disp.TooltipWarn.style.top = (l('tooltip').offsetHeight) + 'px';
+
+ CM.Disp.TooltipWarn.style.width = (l('tooltip').offsetWidth - 6) + 'px';
+
+ if (CM.Config.ToolWarnLucky == 1) {
+ var limitLucky = CM.Cache.Lucky;
+ if (CM.Config.ToolWarnBon == 1) {
+ var bonusNoFren = CM.Disp.TooltipBonusIncome;
+ bonusNoFren /= CM.Sim.getCPSBuffMult();
+ limitLucky += ((bonusNoFren * 60 * 15) / 0.15);
+ }
+ var limitLuckyFrenzy = limitLucky * 7;
+ var amount = (Game.cookies + CM.Disp.GetWrinkConfigBank()) - price;
+ if ((amount < limitLucky || amount < limitLuckyFrenzy) && (CM.Disp.tooltipType != 'b' || Game.buyMode == 1)) {
+ if (amount < limitLucky) {
+ l('CMDispTooltipWarnLucky').style.display = '';
+ l('CMDispTooltipWarnLuckyText').textContent = Beautify(limitLucky - amount) + ' (' + CM.Disp.FormatTime((limitLucky - amount) / CM.Disp.GetCPS()) + ')';
+ l('CMDispTooltipWarnLuckyFrenzy').style.display = '';
+ l('CMDispTooltipWarnLuckyFrenzyText').textContent = Beautify(limitLuckyFrenzy - amount) + ' (' + CM.Disp.FormatTime((limitLuckyFrenzy - amount) / CM.Disp.GetCPS()) + ')';
}
- else {
+ else if (amount < limitLuckyFrenzy) {
+ l('CMDispTooltipWarnLuckyFrenzy').style.display = '';
+ l('CMDispTooltipWarnLuckyFrenzyText').textContent = Beautify(limitLuckyFrenzy - amount) + ' (' + CM.Disp.FormatTime((limitLuckyFrenzy - amount) / CM.Disp.GetCPS()) + ')';
l('CMDispTooltipWarnLucky').style.display = 'none';
- l('CMDispTooltipWarnLuckyFrenzy').style.display = 'none';
}
-
- if (CM.Config.ToolWarnConjure == 1) {
- CM.Disp.TooltipWarn.style.display = 'block';
- var limitLucky = CM.Cache.Lucky;
- if (CM.Config.ToolWarnBon == 1) {
- var bonusNoFren = bonus;
- bonusNoFren /= CM.Sim.getCPSBuffMult();
- limitLucky += ((bonusNoFren * 60 * 15) / 0.15);
- }
- var limitConjure = limitLucky * 2;
- var amount = (Game.cookies + CM.Disp.GetWrinkConfigBank()) - price;
- if ((amount < limitConjure) && (CM.Disp.tooltipType != 'b' || Game.buyMode == 1)) {
- l('CMDispTooltipWarnConjure').style.display = '';
- l('CMDispTooltipWarnConjureText').textContent = Beautify(limitConjure - amount) + ' (' + CM.Disp.FormatTime((limitConjure - amount) / CM.Disp.GetCPS()) + ')';
- } else {
- l('CMDispTooltipWarnConjure').style.display = 'none';
- }
- }
- else {
- l('CMDispTooltipWarnConjure').style.display = 'none';
- }
- }
- else if (CM.Disp.tooltipType === 's') {
- // Adding information about Sugar Lumps.
-
- CM.Disp.TooltipWarn.style.display = 'none';
- l('CMDispTooltipWarnLucky').style.display = 'none';
- l('CMDispTooltipWarnLuckyFrenzy').style.display = 'none';
- l('CMDispTooltipWarnConjure').style.display = 'none';
-
- if (CM.Config.TooltipLump === 1) {
- l('CMTooltipArea').innerHTML = '';
-
- l('tooltip').firstChild.style.paddingBottom = '4px';
- var lumpTooltip = document.createElement('div');
- lumpTooltip.style.border = '1px solid';
- lumpTooltip.style.padding = '4px';
- lumpTooltip.style.margin = '0px -4px';
- lumpTooltip.id = 'CMTooltipBorder';
- lumpTooltip.className = CM.Disp.colorTextPre + CM.Disp.colorGray;
-
- var lumpHeader = document.createElement('div');
- lumpHeader.style.fontWeight = 'bold';
- lumpHeader.className = CM.Disp.colorTextPre + CM.Disp.colorBlue;
- lumpHeader.textContent = 'Current Sugar Lump';
-
- lumpTooltip.appendChild(lumpHeader);
- var lumpType = document.createElement('div');
- lumpType.id = 'CMTooltipTime';
- lumpTooltip.appendChild(lumpType);
- var lumpColor = CM.Disp.GetLumpColor(Game.lumpCurrentType);
- lumpType.textContent = lumpColor.text;
- lumpType.className = CM.Disp.colorTextPre + lumpColor.color;
-
- l('CMTooltipArea').appendChild(lumpTooltip);
- }
- }
- else if (CM.Disp.tooltipType === 'g') {
- // Grimoire
- CM.Disp.TooltipWarn.style.display = 'none';
+ } else {
l('CMDispTooltipWarnLucky').style.display = 'none';
l('CMDispTooltipWarnLuckyFrenzy').style.display = 'none';
- l('CMDispTooltipWarnConjure').style.display = 'none';
-
- var minigame = Game.Objects['Wizard tower'].minigame;
- var spellCost = minigame.getSpellCost(minigame.spellsById[CM.Disp.tooltipName]);
-
- if (CM.Config.TooltipGrim == 1 && spellCost <= minigame.magicM) {
- l('CMTooltipArea').innerHTML = '';
-
- l('tooltip').firstChild.style.paddingBottom = '4px';
- var tooltip = document.createElement('div');
- tooltip.style.border = '1px solid';
- tooltip.style.padding = '4px';
- tooltip.style.margin = '0px -4px';
- tooltip.id = 'CMTooltipBorder';
- tooltip.className = CM.Disp.colorTextPre + CM.Disp.colorGray;
-
- var header = function(text) {
- var div = document.createElement('div');
- div.style.fontWeight = 'bold';
- div.className = CM.Disp.colorTextPre + CM.Disp.colorBlue;
- div.textContent = text;
- return div;
- }
-
- tooltip.appendChild(header('Time Left'));
- var time = document.createElement('div');
- time.id = 'CMTooltipTime';
- tooltip.appendChild(time);
- var timeColor = CM.Disp.GetTimeColor(CM.Disp.CalculateGrimoireRefillTime(minigame.magic, minigame.magicM, spellCost));
- time.textContent = timeColor.text;
- time.className = CM.Disp.colorTextPre + timeColor.color;
-
- if (spellCost <= minigame.magic) {
- tooltip.appendChild(header('Recover Time'));
- var recover = document.createElement('div');
- recover.id = 'CMTooltipRecover';
- tooltip.appendChild(recover);
- var recoverColor = CM.Disp.GetTimeColor(CM.Disp.CalculateGrimoireRefillTime(Math.max(0, minigame.magic - spellCost), minigame.magicM, minigame.magic));
- recover.textContent = recoverColor.text;
- recover.className = CM.Disp.colorTextPre + recoverColor.color;
- }
-
- // Extra information when spell is Conjure Baked Goods (Name == 0)
- if (CM.Disp.tooltipName == 0) {
- tooltip.appendChild(header('Cookies to be gained/lost'));
- var conjure = document.createElement('div');
- conjure.id = 'CMTooltipConjure';
- tooltip.appendChild(conjure);
- var reward = document.createElement('span');
- reward.style.color = "#33FF00"
- reward.textContent = Beautify(Math.min((Game.cookies + CM.Disp.GetWrinkConfigBank()) * 0.15, CM.Cache.NoGoldSwitchCookiesPS * 60 * 30), 2)
- conjure.appendChild(reward)
- var seperator = document.createElement('span');
- seperator.textContent = ' / '
- conjure.appendChild(seperator)
- var loss = document.createElement('span');
- loss.style.color = "red"
- loss.textContent = Beautify((CM.Cache.NoGoldSwitchCookiesPS * 60 * 15), 2);
- conjure.appendChild(loss)
- }
-
- l('CMTooltipArea').appendChild(tooltip);
- }
}
}
else {
- CM.Disp.TooltipWarn.style.display = 'none';
+ l('CMDispTooltipWarnLucky').style.display = 'none';
+ l('CMDispTooltipWarnLuckyFrenzy').style.display = 'none';
+ }
+
+ if (CM.Config.ToolWarnConjure == 1) {
+ var limitLucky = CM.Cache.Lucky;
+ if (CM.Config.ToolWarnBon == 1) {
+ var bonusNoFren = CM.Disp.TooltipBonusIncome;
+ bonusNoFren /= CM.Sim.getCPSBuffMult();
+ limitLucky += ((bonusNoFren * 60 * 15) / 0.15);
+ }
+ var limitConjure = limitLucky * 2;
+ var amount = (Game.cookies + CM.Disp.GetWrinkConfigBank()) - price;
+ if ((amount < limitConjure) && (CM.Disp.tooltipType != 'b' || Game.buyMode == 1)) {
+ l('CMDispTooltipWarnConjure').style.display = '';
+ l('CMDispTooltipWarnConjureText').textContent = Beautify(limitConjure - amount) + ' (' + CM.Disp.FormatTime((limitConjure - amount) / CM.Disp.GetCPS()) + ')';
+ } else {
+ l('CMDispTooltipWarnConjure').style.display = 'none';
+ }
+ }
+ else {
+ l('CMDispTooltipWarnConjure').style.display = 'none';
+ }
+ }
+ else {
+ if (l('CMDispTooltipWarningParent') != null) {
+ l('CMDispTooltipWarningParent').remove();
}
}
}
+/**
+ * This function updates the location of the tooltip
+ * It is called by Game.tooltip.update() because of CM.ReplaceNative()
+ */
CM.Disp.UpdateTooltipLocation = function() {
if (Game.tooltip.origin == 'store') {
var warnOffset = 0;
- if (CM.Config.ToolWarnLucky == 1 && CM.Config.ToolWarnPos == 1) warnOffset = CM.Disp.TooltipWarn.clientHeight - 4;
+ if (CM.Config.ToolWarnLucky == 1 && CM.Config.ToolWarnPos == 1 && typeof CM.Disp.TooltipWarn != "undefined") {
+ warnOffset = CM.Disp.TooltipWarn.clientHeight - 4;
+ }
Game.tooltip.tta.style.top = Math.min(parseInt(Game.tooltip.tta.style.top), (l('game').clientHeight + l('topBar').clientHeight) - Game.tooltip.tt.clientHeight - warnOffset - 46) + 'px';
}
// Kept for future possible use if the code changes again
@@ -1692,44 +1715,31 @@ CM.Disp.UpdateTooltipLocation = function() {
}
/**
- * This function toggles the position of the warnings created by CM.Disp.CreateTooltipWarn()
+ * This function toggles the position of the warnings created by CM.Disp.TooltipCreateWarningSection()
* It is called by a change in CM.Config.ToolWarnPos
*/
CM.Disp.ToggleToolWarnPos = function() {
- if (CM.Config.ToolWarnPos == 0) {
- CM.Disp.TooltipWarn.style.top = 'auto';
- CM.Disp.TooltipWarn.style.margin = '4px -4px';
- CM.Disp.TooltipWarn.style.padding = '3px 4px';
- }
- else {
- CM.Disp.TooltipWarn.style.right = 'auto';
- CM.Disp.TooltipWarn.style.margin = '4px';
- CM.Disp.TooltipWarn.style.padding = '4px 3px';
- }
-}
-
-CM.Disp.DrawTooltipWarn = function() {
- if (CM.Config.ToolWarnLucky == 1) {
- l('CMDispTooltipWarnLucky').style.opacity = '0';
- l('CMDispTooltipWarnLuckyFrenzy').style.opacity = '0';
- }
- if (CM.Config.ToolWarnConjure == 1) {
- l('CMDispTooltipWarnConjure').style.opacity = '0';
- }
-}
-
-CM.Disp.UpdateTooltipWarn = function() {
- if (CM.Config.ToolWarnLucky == 1 && l('tooltipAnchor').style.display != 'none' && l('CMTooltipArea') != null) {
- l('CMDispTooltipWarnLucky').style.opacity = '1';
- l('CMDispTooltipWarnLuckyFrenzy').style.opacity = '1';
- }
- if (CM.Config.ToolWarnConjure == 1 && l('tooltipAnchor').style.display != 'none' && l('CMTooltipArea') != null) {
- l('CMDispTooltipWarnConjure').style.opacity = '1';
+ if (typeof CM.Disp.TooltipWarn != "undefined") {
+ if (CM.Config.ToolWarnPos == 0) {
+ CM.Disp.TooltipWarn.style.top = 'auto';
+ CM.Disp.TooltipWarn.style.margin = '4px -4px';
+ CM.Disp.TooltipWarn.style.padding = '3px 4px';
+ }
+ else {
+ CM.Disp.TooltipWarn.style.right = 'auto';
+ CM.Disp.TooltipWarn.style.margin = '4px';
+ CM.Disp.TooltipWarn.style.padding = '4px 3px';
+ }
}
}
+/**
+ * This function checks and create a tooltip for the wrinklers
+ * It is called by CM.Loop()
+ * TODO: Change this code to be the same as other tooltips. (i.d., create tooltip with type "w")
+ */
CM.Disp.CheckWrinklerTooltip = function() {
- if (CM.Config.ToolWrink == 1 && CM.Disp.TooltipWrinklerArea == 1) {
+ if (CM.Config.ToolWrink == 1 && CM.Disp.TooltipWrinklerArea == 1) { // Latter is set by CM.Main.AddWrinklerAreaDetect
var showingTooltip = false;
for (var i in Game.wrinklers) {
var me = Game.wrinklers[i];
@@ -1761,6 +1771,11 @@ CM.Disp.CheckWrinklerTooltip = function() {
}
}
+/**
+ * This function updates the amount to be displayed by the wrinkler tooltip created by CM.Disp.CheckWrinklerTooltip()
+ * It is called by CM.Loop()
+ * TODO: Change this code to be the same as other tooltips. Fit this into CM.Disp.UpdateTooltip()
+ */
CM.Disp.UpdateWrinklerTooltip = function() {
if (CM.Config.ToolWrink == 1 && l('CMTooltipWrinkler') != null) {
var sucked = Game.wrinklers[CM.Disp.TooltipWrinkler].sucked;
diff --git a/src/Main.js b/src/Main.js
index 842c488..5bf1c02 100644
--- a/src/Main.js
+++ b/src/Main.js
@@ -18,14 +18,12 @@ CM.ReplaceNative = function() {
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.DrawTooltipWarn();
}
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.UpdateTooltipWarn();
CM.Disp.UpdateTooltipLocation();
}
@@ -228,11 +226,10 @@ CM.DelayInit = function() {
for (var i in CM.Disp.TooltipText) {
CM.Disp.CreateSimpleTooltip(CM.Disp.TooltipText[i][0], CM.Disp.TooltipText[i][1], CM.Disp.TooltipText[i][2]);
}
- CM.Disp.CreateTooltipWarn();
CM.Disp.ReplaceTooltipBuild();
CM.Disp.ReplaceTooltipGrimoire();
CM.Disp.ReplaceTooltipLump();
- CM.Disp.AddWrinklerAreaDetect();
+ CM.Main.AddWrinklerAreaDetect();
CM.Cache.InitCookiesDiff();
CM.ReplaceNative();
CM.ReplaceNativeGrimoire();
@@ -411,6 +408,23 @@ CM.Main.CheckWrinklerCount = function() {
}
}
+/**
+ * This function creates .onmouseover/out events that determine if the mouse is hovering-over a Wrinkler
+ * It is called by CM.DelayInit
+ * TODO: The system for displaying wrinklers should ideally use a similar system as other tooltips
+ * Thus, writing a CM.Disp.ReplaceTooltipWrinkler function etc.
+ */
+CM.Main.AddWrinklerAreaDetect = function() {
+ l('backgroundLeftCanvas').onmouseover = function() {CM.Disp.TooltipWrinklerArea = 1;};
+ l('backgroundLeftCanvas').onmouseout = function() {
+ CM.Disp.TooltipWrinklerArea = 0;
+ Game.tooltip.hide();
+ for (var i in Game.wrinklers) {
+ CM.Disp.TooltipWrinklerCache[i] = 0;
+ }
+ };
+}
+
CM.HasReplaceNativeGrimoireLaunch = false;
CM.HasReplaceNativeGrimoireDraw = false;