diff --git a/CookieMonster.js b/CookieMonster.js index 6b2149e..894ae36 100644 --- a/CookieMonster.js +++ b/CookieMonster.js @@ -319,6 +319,63 @@ CM.Cache.UpdateCurrWrinklerCPS = function() { CM.Cache.CurrWrinklerCPSMult = count * (count * 0.05 * 1.1) * (Game.Has('Sacrilegious corruption') * 0.05 + 1) * (Game.Has('Wrinklerspawn') * 0.05 + 1) * godMult; } +/******** + * Section: Functions related to "Specials" (Dragon and Santa) */ + +/** + * This functions caches the current cost of upgrading the dragon level so it can be displayed in the tooltip + * It is called by the relevan tooltip-code as a result of CM.Disp.AddDragonLevelUpTooltip() and by CM.Loop() + * @global {number} CM.Cache.lastDragonLevel The last cached dragon level + * @global {string} CM.Cache.CostDragonUpgrade The Beautified cost of the next upgrade + */ +CM.Cache.CacheDragonCost = function() { + if (CM.Cache.lastDragonLevel != Game.dragonLevel || CM.Sim.DoSims) { + if (Game.dragonLevels[Game.dragonLevel].buy.toString().includes("sacrifice")) { + var target = Game.dragonLevels[Game.dragonLevel].buy.toString().match(/Objects\[(.*)\]/)[1]; + var amount = Game.dragonLevels[Game.dragonLevel].buy.toString().match(/sacrifice\((.*?)\)/)[1]; + if (target != "i") { + target = target.replaceAll("\'", ""); + if (Game.Objects[target].amount < amount) { + CM.Cache.CostDragonUpgrade = "Not enough buildings to sell"; + } + else { + var cost = 0; + CM.Sim.CopyData(); + for (var i = 0; i < amount; i++) { + var price = CM.Sim.Objects[target].basePrice * Math.pow(Game.priceIncrease, Math.max(0, CM.Sim.Objects[target].amount - 1 - CM.Sim.Objects[target].free)); + price = Game.modifyBuildingPrice(CM.Sim.Objects[target], price); + price = Math.ceil(price); + cost += price; + CM.Sim.Objects[target].amount--; + } + CM.Cache.CostDragonUpgrade = CM.Disp.Beautify(cost); + } + } + else { + var cost = 0; + CM.Sim.CopyData(); + for (var j in Game.Objects) { + target = j; + if (Game.Objects[target].amount < amount) { + CM.Cache.CostDragonUpgrade = "Not enough buildings to sell"; + } + else { + for (var i = 0; i < amount; i++) { + var price = CM.Sim.Objects[target].basePrice * Math.pow(Game.priceIncrease, Math.max(0, CM.Sim.Objects[target].amount - 1 - CM.Sim.Objects[target].free)); + price = Game.modifyBuildingPrice(CM.Sim.Objects[target], price); + price = Math.ceil(price); + cost += price; + CM.Sim.Objects[target].amount--; + } + } + } + CM.Cache.CostDragonUpgrade = CM.Disp.Beautify(cost); + } + } + CM.Cache.lastDragonLevel = Game.dragonLevel; + } +} + /******** * Section: UNSORTED */ @@ -2927,7 +2984,7 @@ CM.Disp.UpdateWrinklerTooltip = function() { } /******** - * Section: Functions related to the dragon aura interface */ + * Section: Functions related to the Dragon */ /** * This functions adds the two extra lines about CPS and time to recover to the aura picker infoscreen @@ -2957,6 +3014,22 @@ CM.Disp.AddAuraInfo = function(aura) { } } +/** + * This functions adds a tooltip to the level up button displaying the cost of rebuying all + * It is called by Game.ToggleSpecialMenu() after CM.ReplaceNative() + */ +CM.Disp.AddDragonLevelUpTooltip = function() { + // Check if it is the dragon popup that is on screen + if ((l('specialPopup').className.match(/onScreen/) && l('specialPopup').children[0].style.background.match(/dragon/)) != null) { + for (let i = 0; i < l('specialPopup').childNodes.length; i++) { + if (l('specialPopup').childNodes[i].className == "optionBox") { + l('specialPopup').children[i].onmouseover = function() {CM.Cache.CacheDragonCost(); Game.tooltip.dynamic = 1; Game.tooltip.draw(this, CM.Cache.CostDragonUpgrade, 'this'); Game.tooltip.wobble();} + l('specialPopup').children[i].onmouseout = function() {Game.tooltip.shouldHide=1;} + } + } + } +} + /******** * Section: General functions related to the Options/Stats pages @@ -3519,7 +3592,7 @@ CM.Disp.CreateStatsMissDisp = function(theMissDisp) { * @returns {object} section The object contating the Lucky section */ CM.Disp.CreateStatsLuckySection = function() { - // TODO: Remove this and creater better tooltip!! + // This sets which tooltip to display for certain stats var goldCookTooltip = CM.Sim.auraMult('Dragon\'s Fortune') ? 'GoldCookDragonsFortuneTooltipPlaceholder' : 'GoldCookTooltipPlaceholder'; var section = document.createElement('div'); @@ -3584,7 +3657,7 @@ CM.Disp.CreateStatsLuckySection = function() { * @returns {object} section The object contating the Chain section */ CM.Disp.CreateStatsChainSection = function() { - // TODO: Remove this and creater better tooltip!! + // This sets which tooltip to display for certain stats var goldCookTooltip = CM.Sim.auraMult('Dragon\'s Fortune') ? 'GoldCookDragonsFortuneTooltipPlaceholder' : 'GoldCookTooltipPlaceholder'; var section = document.createElement('div'); @@ -3957,7 +4030,7 @@ CM.ReplaceNative = function() { CM.Backup.scriptLoaded = Game.scriptLoaded; Game.scriptLoaded = function(who, script) { CM.Backup.scriptLoaded(who, script); - CM.Disp.AddTooltipGrimoire() + CM.Disp.ReplaceTooltipGrimoire() CM.ReplaceNativeGrimoire(); } @@ -3982,6 +4055,16 @@ CM.ReplaceNative = function() { CM.Disp.AddAuraInfo(aura); } + CM.Backup.ToggleSpecialMenu = Game.ToggleSpecialMenu; + /** + * This functions adds the code to display the tooltips for the levelUp button of the dragon + */ + Game.ToggleSpecialMenu = function(on) { + CM.Backup.ToggleSpecialMenu(on); + CM.Disp.AddDragonLevelUpTooltip(); + } + + CM.Backup.UpdateMenu = Game.UpdateMenu; Game.UpdateMenu = function() { if (typeof jscolor.picker === 'undefined' || typeof jscolor.picker.owner === 'undefined') { @@ -4024,7 +4107,7 @@ CM.ReplaceNativeGrimoireLaunch = function() { eval('CM.Backup.GrimoireLaunchMod = ' + minigame.launch.toString().split('=this').join('= Game.Objects[\'Wizard tower\'].minigame')); Game.Objects['Wizard tower'].minigame.launch = function() { CM.Backup.GrimoireLaunchMod(); - CM.Disp.AddTooltipGrimoire(); + CM.Disp.ReplaceTooltipGrimoire(); CM.HasReplaceNativeGrimoireDraw = false; CM.ReplaceNativeGrimoireDraw(); } @@ -4061,11 +4144,13 @@ CM.Loop = function() { CM.Cache.CacheStats(); CM.Cache.CacheMissingUpgrades(); CM.Cache.RemakeChain(); + CM.Cache.CacheDragonCost(); CM.Cache.RemakeSeaSpec(); CM.Cache.RemakeSellForChoEgg(); CM.Sim.DoSims = 0; + } // Check for aura change to recalculate buildings prices diff --git a/src/Cache.js b/src/Cache.js index 8172a17..49cd373 100644 --- a/src/Cache.js +++ b/src/Cache.js @@ -288,6 +288,63 @@ CM.Cache.UpdateCurrWrinklerCPS = function() { CM.Cache.CurrWrinklerCPSMult = count * (count * 0.05 * 1.1) * (Game.Has('Sacrilegious corruption') * 0.05 + 1) * (Game.Has('Wrinklerspawn') * 0.05 + 1) * godMult; } +/******** + * Section: Functions related to "Specials" (Dragon and Santa) */ + +/** + * This functions caches the current cost of upgrading the dragon level so it can be displayed in the tooltip + * It is called by the relevan tooltip-code as a result of CM.Disp.AddDragonLevelUpTooltip() and by CM.Loop() + * @global {number} CM.Cache.lastDragonLevel The last cached dragon level + * @global {string} CM.Cache.CostDragonUpgrade The Beautified cost of the next upgrade + */ +CM.Cache.CacheDragonCost = function() { + if (CM.Cache.lastDragonLevel != Game.dragonLevel || CM.Sim.DoSims) { + if (Game.dragonLevels[Game.dragonLevel].buy.toString().includes("sacrifice")) { + var target = Game.dragonLevels[Game.dragonLevel].buy.toString().match(/Objects\[(.*)\]/)[1]; + var amount = Game.dragonLevels[Game.dragonLevel].buy.toString().match(/sacrifice\((.*?)\)/)[1]; + if (target != "i") { + target = target.replaceAll("\'", ""); + if (Game.Objects[target].amount < amount) { + CM.Cache.CostDragonUpgrade = "Not enough buildings to sell"; + } + else { + var cost = 0; + CM.Sim.CopyData(); + for (var i = 0; i < amount; i++) { + var price = CM.Sim.Objects[target].basePrice * Math.pow(Game.priceIncrease, Math.max(0, CM.Sim.Objects[target].amount - 1 - CM.Sim.Objects[target].free)); + price = Game.modifyBuildingPrice(CM.Sim.Objects[target], price); + price = Math.ceil(price); + cost += price; + CM.Sim.Objects[target].amount--; + } + CM.Cache.CostDragonUpgrade = CM.Disp.Beautify(cost); + } + } + else { + var cost = 0; + CM.Sim.CopyData(); + for (var j in Game.Objects) { + target = j; + if (Game.Objects[target].amount < amount) { + CM.Cache.CostDragonUpgrade = "Not enough buildings to sell"; + } + else { + for (var i = 0; i < amount; i++) { + var price = CM.Sim.Objects[target].basePrice * Math.pow(Game.priceIncrease, Math.max(0, CM.Sim.Objects[target].amount - 1 - CM.Sim.Objects[target].free)); + price = Game.modifyBuildingPrice(CM.Sim.Objects[target], price); + price = Math.ceil(price); + cost += price; + CM.Sim.Objects[target].amount--; + } + } + } + CM.Cache.CostDragonUpgrade = CM.Disp.Beautify(cost); + } + } + CM.Cache.lastDragonLevel = Game.dragonLevel; + } +} + /******** * Section: UNSORTED */ diff --git a/src/Config.js b/src/Config.js index e9b8717..54e467e 100644 --- a/src/Config.js +++ b/src/Config.js @@ -13,7 +13,6 @@ */ CM.Config.SaveConfig = function() { let saveString = b64_to_utf8(unescape(localStorage.getItem('CookieClickerGame')).split('!END!')[0]); - let pattern = /CookieMonster.*[;$]/; CookieMonsterSave = saveString.match(/CookieMonster.*(;|$)/); if (CookieMonsterSave != null) { newSaveString = saveString.replace(CookieMonsterSave[0], "CookieMonster:" + CM.save()); diff --git a/src/Disp.js b/src/Disp.js index f61e8a6..469c8ed 100644 --- a/src/Disp.js +++ b/src/Disp.js @@ -1808,7 +1808,7 @@ CM.Disp.UpdateWrinklerTooltip = function() { } /******** - * Section: Functions related to the dragon aura interface */ + * Section: Functions related to the Dragon */ /** * This functions adds the two extra lines about CPS and time to recover to the aura picker infoscreen @@ -1838,6 +1838,22 @@ CM.Disp.AddAuraInfo = function(aura) { } } +/** + * This functions adds a tooltip to the level up button displaying the cost of rebuying all + * It is called by Game.ToggleSpecialMenu() after CM.ReplaceNative() + */ +CM.Disp.AddDragonLevelUpTooltip = function() { + // Check if it is the dragon popup that is on screen + if ((l('specialPopup').className.match(/onScreen/) && l('specialPopup').children[0].style.background.match(/dragon/)) != null) { + for (let i = 0; i < l('specialPopup').childNodes.length; i++) { + if (l('specialPopup').childNodes[i].className == "optionBox") { + l('specialPopup').children[i].onmouseover = function() {CM.Cache.CacheDragonCost(); Game.tooltip.dynamic = 1; Game.tooltip.draw(this, CM.Cache.CostDragonUpgrade, 'this'); Game.tooltip.wobble();} + l('specialPopup').children[i].onmouseout = function() {Game.tooltip.shouldHide=1;} + } + } + } +} + /******** * Section: General functions related to the Options/Stats pages @@ -2400,7 +2416,7 @@ CM.Disp.CreateStatsMissDisp = function(theMissDisp) { * @returns {object} section The object contating the Lucky section */ CM.Disp.CreateStatsLuckySection = function() { - // TODO: Remove this and creater better tooltip!! + // This sets which tooltip to display for certain stats var goldCookTooltip = CM.Sim.auraMult('Dragon\'s Fortune') ? 'GoldCookDragonsFortuneTooltipPlaceholder' : 'GoldCookTooltipPlaceholder'; var section = document.createElement('div'); @@ -2465,7 +2481,7 @@ CM.Disp.CreateStatsLuckySection = function() { * @returns {object} section The object contating the Chain section */ CM.Disp.CreateStatsChainSection = function() { - // TODO: Remove this and creater better tooltip!! + // This sets which tooltip to display for certain stats var goldCookTooltip = CM.Sim.auraMult('Dragon\'s Fortune') ? 'GoldCookDragonsFortuneTooltipPlaceholder' : 'GoldCookTooltipPlaceholder'; var section = document.createElement('div'); diff --git a/src/Main.js b/src/Main.js index 5d3e2a4..3db9a69 100644 --- a/src/Main.js +++ b/src/Main.js @@ -45,7 +45,7 @@ CM.ReplaceNative = function() { CM.Backup.scriptLoaded = Game.scriptLoaded; Game.scriptLoaded = function(who, script) { CM.Backup.scriptLoaded(who, script); - CM.Disp.AddTooltipGrimoire() + CM.Disp.ReplaceTooltipGrimoire() CM.ReplaceNativeGrimoire(); } @@ -70,6 +70,16 @@ CM.ReplaceNative = function() { CM.Disp.AddAuraInfo(aura); } + CM.Backup.ToggleSpecialMenu = Game.ToggleSpecialMenu; + /** + * This functions adds the code to display the tooltips for the levelUp button of the dragon + */ + Game.ToggleSpecialMenu = function(on) { + CM.Backup.ToggleSpecialMenu(on); + CM.Disp.AddDragonLevelUpTooltip(); + } + + CM.Backup.UpdateMenu = Game.UpdateMenu; Game.UpdateMenu = function() { if (typeof jscolor.picker === 'undefined' || typeof jscolor.picker.owner === 'undefined') { @@ -112,7 +122,7 @@ CM.ReplaceNativeGrimoireLaunch = function() { eval('CM.Backup.GrimoireLaunchMod = ' + minigame.launch.toString().split('=this').join('= Game.Objects[\'Wizard tower\'].minigame')); Game.Objects['Wizard tower'].minigame.launch = function() { CM.Backup.GrimoireLaunchMod(); - CM.Disp.AddTooltipGrimoire(); + CM.Disp.ReplaceTooltipGrimoire(); CM.HasReplaceNativeGrimoireDraw = false; CM.ReplaceNativeGrimoireDraw(); } @@ -149,11 +159,13 @@ CM.Loop = function() { CM.Cache.CacheStats(); CM.Cache.CacheMissingUpgrades(); CM.Cache.RemakeChain(); + CM.Cache.CacheDragonCost(); CM.Cache.RemakeSeaSpec(); CM.Cache.RemakeSellForChoEgg(); CM.Sim.DoSims = 0; + } // Check for aura change to recalculate buildings prices