waves/public/assets/g/cookieclicker/mods/CCSE.js
2025-04-09 17:11:14 -05:00

4138 lines
173 KiB
JavaScript

if(CCSE === undefined) var CCSE = {};
if(!CCSE.postLoadHooks) CCSE.postLoadHooks = [];
CCSE.name = 'CCSE';
CCSE.version = '2.035';
CCSE.Steam = (typeof Steam !== 'undefined');
CCSE.GameVersion = CCSE.Steam ? '2.052' : '2.052';
CCSE.launch = function(){
CCSE.loading = 1;
CCSE.init = function(){
CCSE.init = 0;
CCSE.InitNote();
CCSE.InitializeConfig();
CCSE.AddCCSEStyles();
// Define more parts of CCSE
CCSE.Backup = {};
CCSE.collapseMenu = {};
if(!Game.customMinigame) Game.customMinigame = {};
for(var key in Game.Objects) if(!Game.customMinigame[key]) Game.customMinigame[key] = {};
// Build a list of functions to feed to requestAnimationFrame
CCSE.playlist = [];
CCSE.track = 0;
CCSE.playlist.push(function(){
CCSE.ReplaceMainGame();
requestAnimationFrame(CCSE.playlist[CCSE.track++]);
});
CCSE.playlist.push(function(){
CCSE.MinigameReplacer(CCSE.ReplaceGrimoire, 'Wizard tower');
requestAnimationFrame(CCSE.playlist[CCSE.track++]);
});
CCSE.playlist.push(function(){
CCSE.MinigameReplacer(CCSE.ReplacePantheon, 'Temple');
requestAnimationFrame(CCSE.playlist[CCSE.track++]);
});
CCSE.playlist.push(function(){
CCSE.MinigameReplacer(CCSE.ReplaceGarden, 'Farm');
requestAnimationFrame(CCSE.playlist[CCSE.track++]);
});
CCSE.playlist.push(function(){
CCSE.MinigameReplacer(CCSE.ReplaceMarket, 'Bank');
requestAnimationFrame(CCSE.playlist[CCSE.track++]);
});
CCSE.playlist.push(function(){
CCSE.ReplaceBuildingsStart();
requestAnimationFrame(CCSE.playlist[CCSE.track++]);
});
CCSE.playlist.push(CCSE.ReplaceBuildings); // We'll call the next one from here
CCSE.playlist.push(function(){
CCSE.ReplaceBuildingsFinish();
requestAnimationFrame(CCSE.playlist[CCSE.track++]);
});
CCSE.playlist.push(function(){
CCSE.ReplaceUpgradesStart();
requestAnimationFrame(CCSE.playlist[CCSE.track++]);
});
CCSE.playlist.push(CCSE.ReplaceUpgrades); // We'll call the next one from here
CCSE.playlist.push(function(){
CCSE.ReplaceUpgradesFinish();
requestAnimationFrame(CCSE.playlist[CCSE.track++]);
});
CCSE.playlist.push(function(){
CCSE.ReplaceAchievementsStart();
requestAnimationFrame(CCSE.playlist[CCSE.track++]);
});
CCSE.playlist.push(CCSE.ReplaceAchievements); // We'll call the next one from here
CCSE.playlist.push(CCSE.finalize);
requestAnimationFrame(CCSE.playlist[CCSE.track++]);
}
CCSE.finalize = function(){
// Load any custom save data and inject save functions
if(!Game.modSaveData[CCSE.name]) CCSE.load();
// Inject menu functions
Game.customOptionsMenu.push(function(){
CCSE.AppendCollapsibleOptionsMenu(CCSE.name, CCSE.GetMenuString());
});
Game.customStatsMenu.push(function(){
CCSE.AppendStatsVersionNumber(CCSE.name, CCSE.version);
});
Game.customInfoMenu.push(function(){
CCSE.PrependCollapsibleInfoMenu(CCSE.name, CCSE.updateLog);
});
Game.registerHook('reset', CCSE.reset);
//l('versionNumber').innerHTML = 'Game ' + l('versionNumber').innerHTML + '<br>CCSE v. ' + CCSE.version;
var versionNumber = l('versionNumber');
var versionDiv = document.createElement('p');
versionDiv.id = 'CCSEversionNumber';
versionDiv.innerHTML = 'CCSE v. ' + CCSE.version;
var textDiv = document.createElement('span');
textDiv.id = 'CCSEversionGame';
textDiv.innerHTML = 'Game ';
versionNumber.appendChild(versionDiv);
versionNumber.insertBefore(textDiv, versionNumber.firstChild);
// Announce completion, set the isLoaded flag, and run any functions that were waiting for this to load
CCSE.Note.title = 'CCSE loaded!';
CCSE.Note.life = Game.fps;
CCSE.isLoaded = 1;
CCSE.loading = 0;
if(CCSE.postLoadHooks) for(var i in CCSE.postLoadHooks) CCSE.postLoadHooks[i]();
if(CCSE.Steam){
Game.loadModData = CCSE.GameLoadModData;
CCSE.LaunchOtherMods();
if(CCSE.gameHasLoadedSave) Game.loadModData();
}
CCSE.applyPref('showVersionNo');
}
/*=====================================================================================
Update history
=======================================================================================*/
{ CCSE.updateLog = '<div class="subsection"><div class="listing">Cookie Clicker Script Extender is a modding framework intended to make modding this game easier and more accessible.</div>' +
'<div class="listing">CCSE is written and maintained by Klattmose (<a href="https://github.com/klattmose" target="_blank">GitHub</a>, <a href="https://www.reddit.com/user/klattmose/" target="_blank">reddit</a>)</div>' +
'<div class="listing">Further documentation can be found <a href="https://klattmose.github.io/CookieClicker/CCSE-POCs/" target="_blank">here</a>.</div>' +
'<div class="listing">If you have a bug report or a suggestion, create an issue <a href="https://github.com/klattmose/klattmose.github.io/issues" target="_blank">here</a>.</div></div>' +
'<div class="subsection"><div class="title">CCSE version history</div>' +
'</div><div class="subsection update small"><div class="title">05/16/2023</div>' +
'<div class="listing">&bull; Can now give ids to Headers</div>' +
'</div><div class="subsection update small"><div class="title">03/13/2023</div>' +
'<div class="listing">&bull; Added option to hide the CCSE version in the lower left of the screen</div>' +
'<div class="listing">&bull; Added some hooks for the YouCustomizer functions</div>' +
'<div class="listing">&bull; Fixed compatibility with Frozen Cookies</div>' +
'</div><div class="subsection update small"><div class="title">01/07/2022</div>' +
'<div class="listing">&bull; Added hook for Game.resize</div>' +
'<div class="listing">&bull; Added hook for Garden.logic (for plant aging)</div>' +
'</div><div class="subsection update small"><div class="title">10/04/2021</div>' +
'<div class="listing">&bull; Fixed bug that was preventing custom buildings, upgrades, and achievements from being saved in some circumstances</div>' +
'</div><div class="subsection update small"><div class="title">09/26/2021</div>' +
'<div class="listing">&bull; Steam version: Will now initialize before other mods</div>' +
'<div class="listing">&bull; Fixed getting permanent upgrades on a Born Again ascension</div>' +
'<div class="listing">&bull; Fixed breaking Game.NewUpgradeCookie</div>' +
'<div class="listing">&bull; Reset custom upgrades, achievements, etc. managed by CCSE on game reset even if the mod generating them isn\'t loaded</div>' +
'</div><div class="subsection update small"><div class="title">09/18/2021</div>' +
'<div class="listing">&bull; Steam version: Custom links in the menu will now open in a browser rather than Steam</div>' +
'<div class="listing">&bull; Fixed some upgrade descriptions breaking in localization</div>' +
'<div class="listing">&bull; Added hooks for Game.crate and Game.crateTooltip</div>' +
'<div class="listing">&bull; Changed Game.Loader.Load injection to detect \'/\' instead of \'http\'</div>' +
'</div><div class="subsection update small"><div class="title">09/10/2021</div>' +
'<div class="listing">&bull; Added PasswordBox and CheckBox to MenuHelper</div>' +
'<div class="listing">&bull; Added function to append custom CSS styles</div>' +
'<div class="listing">&bull; Fixed bug in custom Background selector</div>' +
'</div><div class="subsection update small"><div class="title">09/09/2021</div>' +
'<div class="listing">&bull; Steam version: Added hooks for Steam.modsPopup</div>' +
'<div class="listing">&bull; Added support for custom images for the Pantheon and Grimoire</div>' +
'<div class="listing">&bull; Added support for custom Golden cookie sound selector options</div>' +
'<div class="listing">&bull; Added support for custom Milk selector options</div>' +
'<div class="listing">&bull; Added support for custom Background selector options</div>' +
'</div><div class="subsection update small"><div class="title">09/01/2021</div>' +
'<div class="listing">&bull; Vaulting for custom upgrades no longer depends on mod load order</div>' +
'<div class="listing">&bull; Setting custom upgrades as Permanent will no longer break the game if the Stats menu is opened without the mod loaded</div>' +
'<div class="listing">&bull; Added some functions for commonly used menu items</div>' +
'</div><div class="subsection update small"><div class="title">02/06/2021</div>' +
'<div class="listing">&bull; Halved the loading time with this one weird trick!</div>' +
'<div class="listing">&bull; The trick is called optimization</div>' +
'<div class="listing">&bull; And learning about prototype functions</div>' +
'</div><div class="subsection update small"><div class="title">10/31/2020</div>' +
'<div class="listing">&bull; Updated to use the new modding API</div>' +
'<div class="listing">&bull; The CCSE.save object (where the mod save data is stored) is now named CCSE.config. The new CCSE.save is a function that will get called by Cookie Clicker when it decides it\'s time to save.</div>' +
'</div><div class="subsection update small"><div class="title">06/20/2020</div>' +
'<div class="listing">&bull; Added hooks for the new stock market minigame</div>' +
'<div class="listing">&bull; Added hook for the new function Game.ClickSpecialPic</div>' +
'</div><div class="subsection update small"><div class="title">10/22/2019</div>' +
'<div class="listing">&bull; Added hook for the new function Game.auraMult</div>' +
'</div><div class="subsection update small"><div class="title">05/14/2019 - parallel processing</div>' +
'<div class="listing">&bull; Won\'t freeze the game while CCSE is loading</div>' +
'<div class="listing">&bull; Also has a progress meter for feedback</div>' +
'<div class="listing">&bull; Bug fixes</div>' +
'</div><div class="subsection update"><div class="title">05/11/2019 - take two</div>' +
'<div class="listing">&bull; You know that moment where you do something and then immediately realize a better way to do it?</div>' +
'<div class="listing">&bull; Changed the method for injecting code to standardized functions rather than calling "eval" willy-nilly</div>' +
'<div class="listing">&bull; Added function for creating seasons</div>' +
'<div class="listing">&bull; Created this update log, and put the version number in the lower left corner</div>' +
'<div class="listing">&bull; With apologies for pretending to be a game update</div>' +
'</div><div class="subsection update"><div class="title">05/05/2019 - initial release</div>' +
'<div class="listing">&bull; Added a bunch of mod hooks to the game</div>' +
'<div class="listing">&bull; Added functions to ease the creation of content like achievements and buildings</div>' +
'<div class="listing">&bull; Added a save system to manage game objects created through CCSE</div>' +
'<div class="listing">&bull; Further documentation <a href="https://klattmose.github.io/CookieClicker/CCSE-POCs/" target="_blank">here</a></div>' +
'</div><div class="subsection"></div><div class="section">Cookie Clicker</div>';
}
/*=====================================================================================
The heart of the mod. Functions to inject code into functions.
=======================================================================================*/
CCSE.InjectCodeIntoFunction = function(functionName, alterFunctionCode, code, preEvalScript, hasPrototype){
// preEvalScript is to set variables that are used in the function but aren't declared in the function
if(preEvalScript) eval(preEvalScript);
var originalFunction = eval(functionName);
if (originalFunction === null) {
console.warn(`CCSE: ${ functionName } is not found. Could not inject ${ code }`);
return;
} else if (typeof originalFunction !== "function") {
console.warn(`CCSE: ${ functionName } is not a function. Could not inject ${ code }`);
return;
}
//console.log(functionName);
eval(functionName + " = " + alterFunctionCode(originalFunction.toString()));
if(hasPrototype) {
var alteredFunction = eval(functionName);
alteredFunction.prototype = originalFunction.prototype;
}
CCSE.functionsAltered++;
if(!CCSE.isLoaded) CCSE.UpdateNote();
//if(eval(functionName + ".toString()").indexOf(code) == -1) console.log("Error injecting code into function " + functionName + ". Could not inject " + code);
}
CCSE.SliceCodeIntoFunction = function(functionName, pos, code, preEvalScript, hasPrototype){
var alterFunctionCode = function(temp){
return temp.slice(0, pos) + code + temp.slice(pos);
}
CCSE.InjectCodeIntoFunction(functionName, alterFunctionCode, code, preEvalScript, hasPrototype);
}
CCSE.SpliceCodeIntoFunction = function(functionName, row, code, preEvalScript, hasPrototype){
var alterFunctionCode = function(temp){
temp = temp.split("\n");
i = row < 0 ? temp.length + row : row;
temp.splice(i, 0, code);
return temp.join("\n");
}
CCSE.InjectCodeIntoFunction(functionName, alterFunctionCode, code, preEvalScript, hasPrototype);
}
CCSE.ReplaceCodeIntoFunction = function(functionName, targetString, code, mode, preEvalScript, hasPrototype){
var alterFunctionCode = function(temp){
switch(mode){
case -1: // Insert before targetString
return temp.replace(targetString, code + "\n" + targetString);
case 0: // Replace targetString. Regex will work
return temp.replace(targetString, code);
case 1: // Insert after targetString
return temp.replace(targetString, targetString + "\n" + code);
default:
throw new Error("mode must be either, -1, 0, or 1");
}
}
CCSE.InjectCodeIntoFunction(functionName, alterFunctionCode, code, preEvalScript, hasPrototype);
}
CCSE.GetProgressHTML = function(progress){
return `<div style="text-align: center; font-weight: bold; color: white;">${ progress }%</div>`;
}
CCSE.InitNote = function(){
if(CCSE.Steam) CCSE.iconURL = CCSE.GetModPath('CCSE') + '/CCSEicon.png';
else CCSE.iconURL = 'https://klattmose.github.io/CookieClicker/img/CCSEicon.png';
CCSE.functionsTotal = (
141
+ (CCSE.Steam ? 7 : 0)
+ Game.ObjectsN * 18 - 1 + 3
+ Game.UpgradesN * 1 + 25
+ Game.AchievementsN * 1
); // Needs to be manually updated
CCSE.functionsAltered = 0;
CCSE.progress = 0;
Game.Notify('CCSE is initializing', CCSE.GetProgressHTML(0), [0, 0, CCSE.iconURL], 6, 1);
CCSE.Note = Game.NotesById[Game.noteId - 1];
CCSE.Note.life = 600000; // 10 minutes, just to be sure
}
CCSE.UpdateNote = function(){
CCSE.Note.life = 600000;
var progress = Math.min(Math.floor(CCSE.functionsAltered / CCSE.functionsTotal * 100), 100);
if(progress != CCSE.progress){
CCSE.progress = progress;
CCSE.Note.desc = CCSE.GetProgressHTML(CCSE.progress);
Game.UpdateNotes();
}
}
/*=====================================================================================
Do all replacing in one function
Actually don't, it locks up the browser for as long as it's running
Also declare hook arrays in the close vicinity of the functions they get used in
=======================================================================================*/
CCSE.ReplaceMainGame = function(){
// Temporary variable for storing function strings
// Slightly more efficient than nesting functions
// Doubt it really matters
var temp = '';
var pos = 0;
var proto;
var obj;
// Game.UpdateMenu
if(!Game.customMenu) Game.customMenu = [];
if(!Game.customOptionsMenu) Game.customOptionsMenu = [];
if(!Game.customStatsMenu) Game.customStatsMenu = [];
if(!Game.customInfoMenu) Game.customInfoMenu = [];
CCSE.ReplaceCodeIntoFunction('Game.UpdateMenu', "l('menu').innerHTML=str;", `
if(Game.onMenu == 'prefs'){
// Game.UpdateMenu injection point 0
for(var i in Game.customOptionsMenu) Game.customOptionsMenu[i]();
}
else if(Game.onMenu == 'stats'){
// Game.UpdateMenu injection point 1
for(var i in Game.customStatsMenu) Game.customStatsMenu[i]();
}
else if(Game.onMenu == 'log'){
// Game.UpdateMenu injection point 2
for(var i in Game.customInfoMenu) Game.customInfoMenu[i]();
}
// Any that don't want to fit into a label
// Game.UpdateMenu injection point 3
for(var i in Game.customMenu) Game.customMenu[i]();
`, 1);
// Code specific to the Steam version
// Might move to their own function maybe
if(CCSE.Steam){
// Steam.modsPopup
// This function has several functions defined within it
if(!Game.customModsPopup) Game.customModsPopup = [];
if(!Game.customModsPopupCheckModDependencies) Game.customModsPopupCheckModDependencies = []; // Return okay to have no effect
if(!Game.customModsPopupUpdateModList) Game.customModsPopupUpdateModList = [];
if(!Game.customModsPopupUpdateModOptions) Game.customModsPopupUpdateModOptions = [];
CCSE.SliceCodeIntoFunction('Steam.modsPopup', -1, `
// Steam.modsPopup injection point 0
for(var i in Game.customModsPopup) Game.customModsPopup[i](selectedMod, mods);
`);
CCSE.ReplaceCodeIntoFunction('Steam.modsPopup', "return okay;",
`// Steam.modsPopup injection point 1
for(var i in Game.customModsPopupCheckModDependencies) okay = Game.customModsPopupCheckModDependencies[i](okay, mod, loadedMods, selectedMod, mods);
`, -1);
CCSE.ReplaceCodeIntoFunction('Steam.modsPopup', "updateModOptions();",
`// Steam.modsPopup injection point 2
for(var i in Game.customModsPopupUpdateModList) Game.customModsPopupUpdateModList[i](selectedMod, mods);
`, -1);
CCSE.ReplaceCodeIntoFunction('Steam.modsPopup', 'else el.innerHTML=loc("Select a mod.");',
`// Steam.modsPopup injection point 3
for(var i in Game.customModsPopupUpdateModOptions) Game.customModsPopupUpdateModOptions[i](selectedMod, mods);
`, 1);
// Steam.workshopPopup
if(!Game.customWorkshopPopup) Game.customWorkshopPopup = [];
if(!Game.customWorkshopPopupUpdateModDisplay) Game.customWorkshopPopupUpdateModDisplay = [];
if(!Game.customWorkshopPopupUpdatePublishedModsPopup) Game.customWorkshopPopupUpdatePublishedModsPopup = [];
CCSE.SliceCodeIntoFunction('Steam.workshopPopup', -1, `
// Steam.customWorkshopPopup injection point 0
for(var i in Game.customWorkshopPopup) Game.customWorkshopPopup[i](selectedMod, selectedModPath);
`);
CCSE.ReplaceCodeIntoFunction('Steam.workshopPopup', "Game.UpdatePrompt();",
`// Steam.customWorkshopPopup injection point 1
for(var i in Game.customWorkshopPopupUpdateModDisplay) Game.customWorkshopPopupUpdateModDisplay[i](selectedMod, el);
`, 1);
CCSE.ReplaceCodeIntoFunction('Steam.workshopPopup', "else l('modDisplay').innerHTML=`<div style=\"font-size:11px;margin:8px;\">(${loc(\"none\")})</div>`;",
`// Steam.customWorkshopPopup injection point 2
for(var i in Game.customWorkshopPopupUpdatePublishedModsPopup) Game.customWorkshopPopupUpdatePublishedModsPopup[i](response);
`, 1);
}
/*
New modding api works
// Game.LoadSave
if(!Game.customLoad) Game.customLoad = [];
if(!(Game.LoadSave.toString().indexOf('Game.customLoad') > 0)){
CCSE.ReplaceCodeIntoFunction('Game.LoadSave', 'if (Game.prefs.showBackupWarning==1)',
`// Game.LoadSave injection point 0
for(var i in Game.customLoad) Game.customLoad[i](); `, -1);
}*/
// Game.WriteSave
// This section only exists to support custom seasons
CCSE.ReplaceCodeIntoFunction('Game.WriteSave', '(Game.season?', '((Game.season)?', 0);
CCSE.ReplaceCodeIntoFunction('Game.WriteSave', '(Game.seasonT)', '((Game.season)?Game.seasonT:-1)', 0);
// Game.Reset
if(!Game.customReset) Game.customReset = [];
CCSE.SliceCodeIntoFunction('Game.Reset', -1, `
// Game.Reset injection point 0
for(var i in Game.customReset) Game.customReset[i](hard);
`);
// randomFloor
// Gonna just replace it and try to keep up with any changes (however unlikely)
// function randomFloor(x) {if ((x%1)<Math.random()) return Math.floor(x); else return Math.ceil(x);}
// Return ret to have no effect
if(!Game.customRandomFloor) Game.customRandomFloor = [];
randomFloor = function(x){
var ret;
if ((x%1)<Math.random()) ret = Math.floor(x);
else ret = Math.ceil(x);
// randomFloor injection point 0
for(var i in Game.customRandomFloor) ret = Game.customRandomFloor[i](x, ret);
return ret;
}
// Beautify
// Return ret to have no effect
if(!Game.customBeautify) Game.customBeautify = [];
CCSE.ReplaceCodeIntoFunction('Beautify', "return negative?'-'+output:output+decimal;",
`var ret = negative?'-'+output:output+decimal;
// Beautify injection point 0
for(var i in Game.customBeautify) ret = Game.customBeautify[i](value, floats, ret);
return ret;`, 0);
// Game.Loader.Load
// To allow for images from outside the dashnet domain
CCSE.ReplaceCodeIntoFunction('Game.Loader.Load', 'img.src=this.domain', "img.src=(assets[i].indexOf('/')>=0?'':this.domain)", 0);
// Game.resize
if(!Game.customResize) Game.customResize = [];
CCSE.SliceCodeIntoFunction('Game.resize', -1, `
// Game.resize injection point 0
for(var i in Game.customResize) Game.customResize[i]();
`);
// ----- Tooltips block ----- //
// Game.tooltip.draw
if(!Game.customTooltipDraw) Game.customTooltipDraw = [];
CCSE.SliceCodeIntoFunction('Game.tooltip.draw', -1, `
// Game.tooltip.draw injection point 0
for(var i in Game.customTooltipDraw) Game.customTooltipDraw[i](from, text, origin);
`);
// Game.tooltip.update
if(!Game.customTooltipUpdate) Game.customTooltipUpdate = [];
CCSE.SliceCodeIntoFunction('Game.tooltip.update', -1, `
// Game.tooltip.update injection point 0
for(var i in Game.customTooltipUpdate) Game.customTooltipUpdate[i]();
`);
// Game.crate
// Return ret to have no effect
if(!Game.customCrate) Game.customCrate = [];
CCSE.ReplaceCodeIntoFunction('Game.crate', 'return (Game', "var ret = (Game", 0);
CCSE.SliceCodeIntoFunction('Game.crate', -1, `
// Game.crate injection point 0
for(var i in Game.customCrate) ret = Game.customCrate[i](me, context, forceClickStr, id, ret, style);
return ret;
`);
// Game.crateTooltip
// Return ret to have no effect
if(!Game.customCrateTooltip) Game.customCrateTooltip = [];
CCSE.ReplaceCodeIntoFunction('Game.crateTooltip', 'return', "var ret = ", 0);
CCSE.SliceCodeIntoFunction('Game.crateTooltip', -1, `
// Game.crateTooltip injection point 0
for(var i in Game.customCrateTooltip) ret = Game.customCrateTooltip[i](me, context, ret);
return ret;
`);
// ----- Ascension block ----- //
// Game.HowMuchPrestige
// Return ret to have no effect
if(!Game.customHowMuchPrestige) Game.customHowMuchPrestige = [];
CCSE.ReplaceCodeIntoFunction('Game.HowMuchPrestige', 'return', "var ret = ", 0);
CCSE.SliceCodeIntoFunction('Game.HowMuchPrestige', -1, `
// Game.HowMuchPrestige injection point 0
for(var i in Game.customHowMuchPrestige) ret = Game.customHowMuchPrestige[i](cookies, ret);
return ret;
`);
// Game.HowManyCookiesReset
// Return ret to have no effect
if(!Game.customHowManyCookiesReset) Game.customHowManyCookiesReset = [];
CCSE.ReplaceCodeIntoFunction('Game.HowManyCookiesReset', 'return', "var ret = ", 0);
CCSE.SliceCodeIntoFunction('Game.HowManyCookiesReset', -1, `
// Game.HowManyCookiesReset injection point 0
for(var i in Game.customHowManyCookiesReset) ret = Game.customHowManyCookiesReset[i](chips, ret);
return ret;
`);
// Game.GetHeavenlyMultiplier
// Functions should return a value to multiply the heavenlyMult by
if(!Game.customHeavenlyMultiplier) Game.customHeavenlyMultiplier = [];
CCSE.ReplaceCodeIntoFunction('Game.GetHeavenlyMultiplier', 'return heavenlyMult;', `
// Game.GetHeavenlyMultiplier injection point 0
for(var i in Game.customHeavenlyMultiplier) heavenlyMult *= Game.customHeavenlyMultiplier[i]();`, -1);
// Game.UpdateAscensionModePrompt
if(!Game.customUpdateAscensionModePrompt) Game.customUpdateAscensionModePrompt = [];
CCSE.SliceCodeIntoFunction('Game.UpdateAscensionModePrompt', -1, `
// Game.UpdateAscensionModePrompt injection point 0
for(var i in Game.customUpdateAscensionModePrompt) Game.customUpdateAscensionModePrompt[i]();
`);
// Game.Reincarnate
// Only runs when bypass == 1 (i.e. passed the confirmation prompt)
if(!Game.customReincarnate) Game.customReincarnate = [];
CCSE.SliceCodeIntoFunction('Game.Reincarnate', -2, `
// Game.Reincarnate injection point 0
if(bypass == 1) for(var i in Game.customReincarnate) Game.customReincarnate[i]();
`);
// Game.Ascend
// Only runs when bypass == 1 (i.e. passed the confirmation prompt)
if(!Game.customAscend) Game.customAscend = [];
CCSE.SliceCodeIntoFunction('Game.Ascend', -2, `
// Game.Ascend injection point 0
if(bypass == 1) for(var i in Game.customAscend) Game.customAscend[i]();
`);
// Game.UpdateAscend
// Runs every frame while on the Ascension tree
if(!Game.customUpdateAscend) Game.customUpdateAscend = [];
CCSE.SliceCodeIntoFunction('Game.UpdateAscend', -1, `
// Game.UpdateAscend injection point 0
for(var i in Game.customUpdateAscend) Game.customUpdateAscend[i]();
`);
// Game.BuildAscendTree
if(!Game.customBuildAscendTree) Game.customBuildAscendTree = [];
CCSE.SliceCodeIntoFunction('Game.BuildAscendTree', -1, `
// Game.BuildAscendTree injection point 0
for(var i in Game.customBuildAscendTree) Game.customBuildAscendTree[i](justBought);
`);
// ----- Sugar Lumps block ----- //
// Game.lumpTooltip
// Return str to have no effect
if(!Game.customLumpTooltip) Game.customLumpTooltip = [];
CCSE.ReplaceCodeIntoFunction('Game.lumpTooltip', 'return',
`// Game.lumpTooltip injection point 0
for(var i in Game.customLumpTooltip) str = Game.customLumpTooltip[i](str, phase);`, -1);
// Game.computeLumpTimes
if(!Game.customComputeLumpTimes) Game.customComputeLumpTimes = [];
CCSE.SliceCodeIntoFunction('Game.computeLumpTimes', -1, `
// Game.computeLumpTimes injection point 0
for(var i in Game.customComputeLumpTimes) Game.customComputeLumpTimes[i]();
`);
// Game.gainLumps
if(!Game.customGainLumps) Game.customGainLumps = [];
CCSE.SliceCodeIntoFunction('Game.gainLumps', -1, `
// Game.gainLumps injection point 0
for(var i in Game.customGainLumps) Game.customGainLumps[i](total);
`);
// Game.clickLump
if(!Game.customClickLump) Game.customClickLump = [];
CCSE.SliceCodeIntoFunction('Game.clickLump', -1, `
// Game.clickLump injection point 0
for(var i in Game.customClickLump) Game.customClickLump[i]();
`);
// Game.harvestLumps
if(!Game.customHarvestLumps) Game.customHarvestLumps = [];
CCSE.ReplaceCodeIntoFunction('Game.harvestLumps', 'total=Math.floor(total);',
`// Game.harvestLumps injection point 0`, -1);
CCSE.ReplaceCodeIntoFunction('Game.harvestLumps', "Game.Win('Maillard reaction');",
`// Game.harvestLumps injection point 1`, 1);
CCSE.SliceCodeIntoFunction('Game.harvestLumps', -1, `
// Game.harvestLumps injection point 2
for(var i in Game.customHarvestLumps) Game.customHarvestLumps[i](amount, silent);
`);
// Game.computeLumpType
// Functions should push things to types
if(!Game.customComputeLumpType) Game.customComputeLumpType = [];
CCSE.ReplaceCodeIntoFunction('Game.computeLumpType', '//caramelized',
`// Game.computeLumpType injection point 0
for(var i in Game.customComputeLumpType) Game.customComputeLumpType[i](types);`, 1);
// Game.canLumps
// Return ret to have no effect
if(!Game.customCanLumps) Game.customCanLumps = [];
CCSE.SpliceCodeIntoFunction('Game.canLumps', 2, 'var ret;');
CCSE.ReplaceCodeIntoFunction('Game.canLumps', 'return true;', 'ret = true;', 0);
CCSE.ReplaceCodeIntoFunction('Game.canLumps', 'return false',
`else ret = false;
// Game.canLumps injection point 0
for(var i in Game.customCanLumps) ret = Game.customCanLumps[i](ret);
return ret;`, 0);
// Game.getLumpRefillMax
// Return ret to have no effect
if(!Game.customLumpRefillMax) Game.customLumpRefillMax = [];
CCSE.ReplaceCodeIntoFunction('Game.getLumpRefillMax', 'return', 'var ret =', 0);
CCSE.SliceCodeIntoFunction('Game.getLumpRefillMax', -1,
`// Game.getLumpRefillMax injection point 0
for(var i in Game.customLumpRefillMax) ret = Game.customLumpRefillMax[i](ret);
return ret;
`);
// Game.refillLump
if(!Game.customRefillLump) Game.customRefillLump = [];
CCSE.SliceCodeIntoFunction('Game.refillLump', -1, `
// Game.refillLump injection point 0
for(var i in Game.customRefillLump) Game.customRefillLump[i]();
`);
// Game.doLumps
// Runs every logic frame when lumps matter
if(!Game.customDoLumps) Game.customDoLumps = [];
CCSE.ReplaceCodeIntoFunction('Game.doLumps', 'var icon=', '// Game.doLumps injection point 0', -1);
CCSE.SliceCodeIntoFunction('Game.doLumps', -1, `
// Game.doLumps injection point 1
for(var i in Game.customDoLumps) Game.customDoLumps[i]();
`);
// ----- Economics block ----- //
// Game.CalculateGains
// I really think this is what he meant it to be
// The original just has Game.customCps doing the same thing as Game.customCpsMult
//eval('Game.CalculateGains = ' + Game.CalculateGains.toString().replace(
// 'for (var i in Game.customCps) {mult*=Game.customCps[i]();}',
// 'for (var i in Game.customCps) {Game.cookiesPs += Game.customCps[i]();}'));
// Game.dropRateMult
// Return 1 to have no effect
if(!Game.customDropRateMult) Game.customDropRateMult = [];
CCSE.ReplaceCodeIntoFunction('Game.dropRateMult', 'return',
`// Game.dropRateMult injection point 0
for(var i in Game.customDropRateMult) rate *= Game.customDropRateMult[i]();`, -1);
// ----- Shimmers block ----- //
// Game.shimmer
// Runs when a shimmer (Golden cookie or reindeer) gets created
// You can push a function that pops it immediately, but it will mess up any FtHoF predictor you use
if(!Game.customShimmer) Game.customShimmer = [];
CCSE.SliceCodeIntoFunction('Game.shimmer', -1, `
// Game.shimmer injection point 0
for(var i in Game.customShimmer) Game.customShimmer[i](this);
`, 0, 1);
// Game.updateShimmers
// Runs every logic frame when shimmers matter
if(!Game.customUpdateShimmers) Game.customUpdateShimmers = [];
CCSE.SliceCodeIntoFunction('Game.updateShimmers', -1, `
// Game.updateShimmers injection point 0
for(var i in Game.customUpdateShimmers) Game.customUpdateShimmers[i]();
`);
// Game.killShimmers
// Runs when we want to remove all shimmers
if(!Game.customKillShimmers) Game.customKillShimmers = [];
CCSE.SliceCodeIntoFunction('Game.killShimmers', -1, `
// Game.killShimmers injection point 0
for(var i in Game.customKillShimmers) Game.customKillShimmers[i]();
`);
// Game.shimmerTypes
if(!Game.customShimmerTypesAll) Game.customShimmerTypesAll = {};
if(!Game.customShimmerTypesAll.initFunc) Game.customShimmerTypesAll.initFunc = [];
CCSE.customShimmerTypesAllinitFunc = function(me){
for(var i in Game.customShimmerTypesAll.initFunc) Game.customShimmerTypesAll.initFunc[i](me);
}
if(!Game.customShimmerTypesAll.durationMult) Game.customShimmerTypesAll.durationMult = [];
CCSE.customShimmerTypesAlldurationMult = function(me){
var dur = 1;
for(var i in Game.customShimmerTypesAll.durationMult) dur *= Game.customShimmerTypesAll.durationMult[i](me);
return dur;
}
if(!Game.customShimmerTypesAll.updateFunc) Game.customShimmerTypesAll.updateFunc = [];
CCSE.customShimmerTypesAllupdateFunc = function(me){
for(var i in Game.customShimmerTypesAll.updateFunc) Game.customShimmerTypesAll.updateFunc[i](me);
}
if(!Game.customShimmerTypesAll.popFunc) Game.customShimmerTypesAll.popFunc = [];
CCSE.customShimmerTypesAllpopFunc = function(me){
for(var i in Game.customShimmerTypesAll.popFunc) Game.customShimmerTypesAll.popFunc[i](me);
}
if(!Game.customShimmerTypesAll.spawnConditions) Game.customShimmerTypesAll.spawnConditions = [];
CCSE.customShimmerTypesAllspawnConditions = function(ret){
for(var i in Game.customShimmerTypesAll.spawnConditions) ret = Game.customShimmerTypesAll.spawnConditions[i](ret);
return ret;
}
if(!Game.customShimmerTypesAll.getTimeMod) Game.customShimmerTypesAll.getTimeMod = [];
CCSE.customShimmerTypesAllgetTimeMod = function(me){
var m = 1;
for(var i in Game.customShimmerTypesAll.getTimeMod) m *= Game.customShimmerTypesAll.getTimeMod[i](me);
return m;
}
// In these, "me" refers to the shimmer itself, and "this" to the shimmer's type object
// I put this in a separate function to call them when a new type is defined
if(!Game.customShimmerTypes) Game.customShimmerTypes = {};
CCSE.Backup.customShimmerTypes = {};
for(var key in Game.shimmerTypes){
CCSE.ReplaceShimmerType(key);
}
CCSE.SliceCodeIntoFunction("Game.playGoldenCookieChime", -1, "else CCSE.PlayShimmerSpawnSound('golden')", 0);
CCSE.ReplaceCodeIntoFunction("Game.shimmerTypes['golden'].initFunc", "Game.chimeType!=0", "CCSE.config.chimeType != 'No sound'", 0);
CCSE.ReplaceCodeIntoFunction("Game.shimmerTypes['reindeer'].initFunc", "Game.chimeType!=0", "CCSE.config.chimeType != 'No sound'", 0);
// Game.shimmerTypes['golden'].popFunc
// customListPush functions should push strings to list
// customEffectDurMod functions should return a multiplier to the effect's duration
// customMult functions should return a multiplier to the effect's magnitude (for Lucky, Chain Cookie, and Cookie Storm drops)
// customBuff functions should return a a buff (result from Game.gainBuff). Return buff for no effect
if(!Game.customShimmerTypes['golden'].customListPush) Game.customShimmerTypes['golden'].customListPush = [];
if(!Game.customShimmerTypes['golden'].customEffectDurMod) Game.customShimmerTypes['golden'].customEffectDurMod = [];
if(!Game.customShimmerTypes['golden'].customMult) Game.customShimmerTypes['golden'].customMult = [];
if(!Game.customShimmerTypes['golden'].customBuff) Game.customShimmerTypes['golden'].customBuff = [];
CCSE.ReplaceCodeIntoFunction("Game.shimmerTypes['golden'].popFunc", 'var list=[];',
`// Game.shimmerTypes['golden'].popFunc injection point 1
for(var i in Game.customShimmerTypes['golden'].customListPush) Game.customShimmerTypes['golden'].customListPush[i](me, list);`, 1);
CCSE.ReplaceCodeIntoFunction("Game.shimmerTypes['golden'].popFunc", 'var buff=0;',
`// Game.shimmerTypes['golden'].popFunc injection point 2
for(var i in Game.customShimmerTypes['golden'].customEffectDurMod) effectDurMod *= Game.customShimmerTypes['golden'].customEffectDurMod[i](me);
for(var i in Game.customShimmerTypes['golden'].customMult) mult *= Game.customShimmerTypes['golden'].customMult[i](me);
for(var i in Game.customShimmerTypes['golden'].customBuff) buff = Game.customShimmerTypes['golden'].customBuff[i](me, buff, choice, effectDurMod, mult);`, 1);
// Game.shimmerTypes['reindeer'].popFunc
// customDropRateMult should return a multiplier to the fail rate for reindeer drops
// Game.customDropRateMult is already taken into account. This is for reindeer specific functions
// Return 1 to have no effect. Return 0 for a guarantee*
if(!Game.customShimmerTypes['reindeer'].customDropRateMult) Game.customShimmerTypes['reindeer'].customDropRateMult = [];
CCSE.ReplaceCodeIntoFunction("Game.shimmerTypes['reindeer'].popFunc", 'if (Math.random()>failRate)',
`// Game.shimmerTypes['reindeer'].popFunc injection point 1
for(var i in Game.customShimmerTypes['reindeer'].customDropRateMult) failRate *= Game.customShimmerTypes['reindeer'].customDropRateMult[i](me);`, -1);
// ----- Particles block ----- //
// Game.particleAdd
temp = Game.particleAdd.toString();
temp = temp.replaceAll("pic='icons.png';", `if (me.picPos.length == 3) {pic=me.picPos[2];me.picId = 0;}
else pic='icons.png';`)
eval('Game.particleAdd=' + temp);
// ----- Notifications block ----- //
// ----- Prompts block ----- //
// ----- Menu block ----- //
// These start to get into the basic appearance of the game, and stray away from the gameplay itself
// If someone has an idea they want to try that requires hooks into these functions, I can add them then
// ----- Buildings block ----- //
// Game.Object
// Alter this function so creating new buildings doesn't break the minigames
CCSE.ReplaceCodeIntoFunction('Game.Object', `str+='<div class="row" id="row'+this.id+'"><div class="separatorBottom"></div>';`,
`{
var div = document.createElement('div');
div.id = 'row'+this.id;
div.classList.add('row');
str += '<div class="separatorBottom"></div>';
}`, 0);
CCSE.ReplaceCodeIntoFunction('Game.Object', `str+='<div class="rowSpecial" id="rowSpecial'+this.id+'"></div>';`,
`div.innerHTML = str;`, 1);
CCSE.ReplaceCodeIntoFunction('Game.Object', `l('rows').innerHTML=l('rows').innerHTML+str;`,
`l('rows').appendChild(div);`, 0);
// Game.DrawBuildings
// Runs every draw frame if we're not ascending
if(!Game.customDrawBuildings) Game.customDrawBuildings = [];
CCSE.SliceCodeIntoFunction('Game.DrawBuildings', -1, `
// Game.DrawBuildings injection point 0
for(var i in Game.customDrawBuildings) Game.customDrawBuildings[i]();
`);
// Game.modifyBuildingPrice
// Functions should return a value to multiply the price by
// Return 1 to have no effect
if(!Game.customModifyBuildingPrice) Game.customModifyBuildingPrice = [];
CCSE.ReplaceCodeIntoFunction('Game.modifyBuildingPrice', 'return', `
// Game.modifyBuildingPrice injection point 0
for(var i in Game.customModifyBuildingPrice) price *= Game.customModifyBuildingPrice[i](building, price);`, -1);
// Game.storeBulkButton
if(!Game.customStoreBulkButton) Game.customStoreBulkButton = [];
CCSE.SliceCodeIntoFunction('Game.storeBulkButton', -1, `
// Game.storeBulkButton injection point 0
for(var i in Game.customStoreBulkButton) Game.customStoreBulkButton[i]();
`);
// Game.BuildStore
if(!Game.customBuildStore) Game.customBuildStore = [];
CCSE.SliceCodeIntoFunction('Game.BuildStore', -1, `
// Game.BuildStore injection point 0
for(var i in Game.customBuildStore) Game.customBuildStore[i]();
`);
// Game.RefreshStore
if(!Game.customRefreshStore) Game.customRefreshStore = [];
CCSE.SliceCodeIntoFunction('Game.RefreshStore', -1, `
// Game.RefreshStore injection point 0
for(var i in Game.customRefreshStore) Game.customRefreshStore[i]();
`);
// Game.scriptLoaded
if(!Game.customScriptLoaded) Game.customScriptLoaded = [];
if(!Game.customMinigameOnLoad) Game.customMinigameOnLoad = {};
for(key in Game.Objects) if(!Game.customMinigameOnLoad[key]) Game.customMinigameOnLoad[key] = [];
CCSE.SliceCodeIntoFunction('Game.scriptLoaded', -1, `
// Game.scriptLoaded injection point 0
for(var i in Game.customScriptLoaded) Game.customScriptLoaded[i](who, script); // Who knows, maybe those arguments might be needed
for(var i in Game.customMinigameOnLoad[who.name]) Game.customMinigameOnLoad[who.name][i](who, script);
`);
// ----- Upgrades block ----- //
// Game.storeBuyAll
if(!Game.customStoreBuyAll) Game.customStoreBuyAll = [];
CCSE.SliceCodeIntoFunction('Game.storeBuyAll', -1, `
// Game.storeBuyAll injection point 0
for(var i in Game.customStoreBuyAll) Game.customStoreBuyAll[i]();
`);
// Game.CountsAsUpgradeOwned
// Return ret to have no effect
if(!Game.customCountsAsUpgradeOwned) Game.customCountsAsUpgradeOwned = [];
CCSE.SpliceCodeIntoFunction('Game.CountsAsUpgradeOwned', 2, 'var ret;');
CCSE.ReplaceCodeIntoFunction('Game.CountsAsUpgradeOwned', /return/g, 'ret =', 0);
CCSE.SliceCodeIntoFunction('Game.CountsAsUpgradeOwned', -1, `
// Game.CountsAsUpgradeOwned injection point 0
for(var i in Game.customCountsAsUpgradeOwned) ret = Game.customCountsAsUpgradeOwned[i](pool, ret);
return ret;
`);
// Game.Unlock
if(!Game.customUnlock) Game.customUnlock = [];
CCSE.SliceCodeIntoFunction('Game.Unlock', -1, `
// Game.Unlock injection point 0
for(var i in Game.customUnlock) Game.customUnlock[i](what);
`);
// Game.Lock
if(!Game.customLock) Game.customLock = [];
CCSE.SliceCodeIntoFunction('Game.Lock', -1, `
// Game.Lock injection point 0
for(var i in Game.customLock) Game.customLock[i](what);
`);
// Game.RebuildUpgrades
if(!Game.customRebuildUpgrades) Game.customRebuildUpgrades = [];
CCSE.SliceCodeIntoFunction('Game.RebuildUpgrades', -1, `
// Game.RebuildUpgrades injection point 0
for(var i in Game.customRebuildUpgrades) Game.customRebuildUpgrades[i]();
`);
// Game.GetTieredCpsMult
// Functions should return a value to multiply mult by (Return 1 to have no effect)
if(!Game.customGetTieredCpsMult) Game.customGetTieredCpsMult = [];
CCSE.ReplaceCodeIntoFunction('Game.GetTieredCpsMult', 'return', `
// Game.GetTieredCpsMult injection point 0
for(var i in Game.customGetTieredCpsMult) mult *= Game.customGetTieredCpsMult[i](me);`, -1);
// Game.UnlockTiered
if(!Game.customUnlockTiered) Game.customUnlockTiered = [];
CCSE.SliceCodeIntoFunction('Game.UnlockTiered', -1, `
// Game.UnlockTiered injection point 0
for(var i in Game.customUnlockTiered) Game.customUnlockTiered[i](me);
`);
// Game.SetResearch
if(!Game.customSetResearch) Game.customSetResearch = [];
CCSE.SliceCodeIntoFunction('Game.SetResearch', -1, `
// Game.SetResearch injection point 0
for(var i in Game.customSetResearch) Game.customSetResearch[i](what, time);
`);
// Game.DropEgg
// Functions should return a value to multiply failRate by (Return 1 to have no effect)
if(!Game.customDropEgg) Game.customDropEgg = [];
CCSE.SpliceCodeIntoFunction('Game.DropEgg', 2,
`// Game.DropEgg injection point 0
for(var i in Game.customDropEgg) failRate *= Game.customDropEgg[i]();`);
// Game.PermanentSlotIcon
// Functions should return an upgrade id. Return id for no effect.
if(!Game.customPermanentUpgradeId) Game.customPermanentUpgradeId = [];
Game.customPermanentUpgradeId.push(CCSE.GetPermanentUpgrade);
CCSE.SpliceCodeIntoFunction('Game.PermanentSlotIcon', 2,
`// Game.PermanentSlotIcon injection point 0
var id = Game.permanentUpgrades[slot];
for(var i in Game.customPermanentUpgradeId) id = Game.customPermanentUpgradeId[i](slot, id);`,
'Game.PermanentSlotIcon=' + Game.PermanentSlotIcon.toString().replaceAll('Game.permanentUpgrades[slot]','id'));
// Game.AssignPermanentSlot
CCSE.ReplaceCodeIntoFunction('Game.AssignPermanentSlot', 'if (!fail)',
'for (var ii in CCSE.config.permanentUpgrades) {if (CCSE.config.permanentUpgrades[ii]==me.name) fail=1;}', -1);
CCSE.ReplaceCodeIntoFunction('Game.AssignPermanentSlot', 'var upgrade=Game.permanentUpgrades[slot];',
'for(var i in Game.customPermanentUpgradeId) upgrade = Game.customPermanentUpgradeId[i](slot, upgrade);', 1);
CCSE.ReplaceCodeIntoFunction('Game.AssignPermanentSlot', 'Game.BuildAscendTree();',
'CCSE.RectifyPermanentUpgrades();Game.BuildAscendTree();', 0);
// Game.PutUpgradeInPermanentSlot
if(!Game.customPutUpgradeInPermanentSlot) Game.customPutUpgradeInPermanentSlot = [];
CCSE.SliceCodeIntoFunction('Game.PutUpgradeInPermanentSlot', -1, `
// Game.PutUpgradeInPermanentSlot injection point 0
for(var i in Game.customPutUpgradeInPermanentSlot) Game.customPutUpgradeInPermanentSlot[i](upgrade, slot);
`);
// Game.loseShimmeringVeil
if(!Game.customLoseShimmeringVeil) Game.customLoseShimmeringVeil = [];
CCSE.SliceCodeIntoFunction('Game.loseShimmeringVeil', -1, `
// Game.loseShimmeringVeil injection point 0
for(var i in Game.customLoseShimmeringVeil) Game.customLoseShimmeringVeil[i](context);
`);
// Game.listTinyOwnedUpgrades
if(!Game.customListTinyOwnedUpgrades) Game.customListTinyOwnedUpgrades = [];
CCSE.ReplaceCodeIntoFunction('Game.listTinyOwnedUpgrades', 'return', `
// Game.listTinyOwnedUpgrades injection point 0
for(var i in Game.customListTinyOwnedUpgrades) str = Game.customListTinyOwnedUpgrades[i](arr, str);`, -1);
// Game.TieredUpgrade
CCSE.ReplaceCodeIntoFunction('Game.TieredUpgrade', 'new Game.Upgrade', 'CCSE.NewUpgrade', 0);
// Game.SynergyUpgrade
CCSE.ReplaceCodeIntoFunction('Game.SynergyUpgrade', 'new Game.Upgrade', 'CCSE.NewUpgrade', 0);
// Game.GrandmaSynergy
CCSE.ReplaceCodeIntoFunction('Game.GrandmaSynergy', 'new Game.Upgrade', 'CCSE.NewUpgrade', 0);
// Game.NewUpgradeCookie
CCSE.ReplaceCodeIntoFunction('Game.NewUpgradeCookie', 'new Game.Upgrade', 'CCSE.NewUpgrade', 0, CCSE.Steam ?
`var strCookieProductionMultiplierPlus=loc("Cookie production multiplier <b>+%1%</b>.",'[x]');
var getStrCookieProductionMultiplierPlus=function(x)
{return strCookieProductionMultiplierPlus.replace('[x]',x);}` : 0);
CCSE.ReplaceCodeIntoFunction('Game.NewUpgradeCookie', 'return upgrade;', 'Game.cookieUpgrades.push(upgrade);', -1, CCSE.Steam ?
`var strCookieProductionMultiplierPlus=loc("Cookie production multiplier <b>+%1%</b>.",'[x]');
var getStrCookieProductionMultiplierPlus=function(x)
{return strCookieProductionMultiplierPlus.replace('[x]',x);}` : 0);
// Game.getVeilDefense
// Return 0 for no effect
if(!Game.customGetVeilDefense) Game.customGetVeilDefense = [];
CCSE.ReplaceCodeIntoFunction('Game.getVeilDefense', 'return', `
// Game.getVeilDefense injection point 0
for(var i in Game.customGetVeilDefense) n += Game.customGetVeilDefense[i](n);`, -1);
// Game.getVeilBoost
// Return 0 for no effect
if(!Game.customGetVeilBoost) Game.customGetVeilBoost = [];
CCSE.ReplaceCodeIntoFunction('Game.getVeilBoost', 'return', `
// Game.getVeilBoost injection point 0
for(var i in Game.customGetVeilBoost) n += Game.customGetVeilBoost[i](n);`, -1);
// ----- Seasons block ----- //
// Game.computeSeasons
CCSE.ReplaceCodeIntoFunction('Game.computeSeasons', `Game.Notify(Game.seasons[this.season].start+'<div class="line"></div>','',this.icon,4);`, `
// Game.computeSeasons injection point 0
for(var i in Game.customUpgrades[this.name].buyFunction) Game.customUpgrades[this.name].buyFunction[i](this);`, 1);
// Game.getSeasonDuration
// Just rewrote it instead of doing the eval replace thing
// Functions should return a multiplier to the season duration
// Return 1 to have no effect
if(!Game.customGetSeasonDuration) Game.customGetSeasonDuration = [];
Game.getSeasonDuration = function(){
var ret = Game.fps*60*60*24;
// Game.getSeasonDuration injection point 0
for(var i in Game.customGetSeasonDuration) ret *= Game.customGetSeasonDuration[i]();
return ret;
}
// ----- Achievements block ----- //
// Game.Win
if(!Game.customWin) Game.customWin = [];
CCSE.SliceCodeIntoFunction('Game.Win', -1, `
// Game.Win injection point 0
for(var i in Game.customWin) Game.customWin[i](what);
`);
// Game.TieredAchievement
CCSE.ReplaceCodeIntoFunction('Game.TieredAchievement', 'new Game.Achievement', 'CCSE.NewAchievement', 0);
// Game.ProductionAchievement
CCSE.ReplaceCodeIntoFunction('Game.ProductionAchievement', 'new Game.Achievement', 'CCSE.NewAchievement', 0);
// Game.BankAchievement
CCSE.ReplaceCodeIntoFunction('Game.BankAchievement', 'new Game.Achievement', 'CCSE.NewAchievement', 0);
// Game.CpsAchievement
CCSE.ReplaceCodeIntoFunction('Game.CpsAchievement', 'new Game.Achievement', 'CCSE.NewAchievement', 0);
// ----- Buffs block ----- //
// Game.gainBuff
if(!Game.customGainBuff) Game.customGainBuff = [];
CCSE.ReplaceCodeIntoFunction('Game.gainBuff', 'return', `
// Game.gainBuff injection point 0
for(var i in Game.customGainBuff) Game.customGainBuff[i](buff);`, -1);
// Game.updateBuffs
// executed every logic frame
if(!Game.customUpdateBuffs) Game.customUpdateBuffs = [];
CCSE.SliceCodeIntoFunction('Game.updateBuffs', -1, `
// Game.updateBuffs injection point 0
for(var i in Game.customUpdateBuffs) Game.customUpdateBuffs[i]();
`);
for(var i in Game.buffTypes){
var buff = Game.buffTypes[i];
if(buff.name == 'building buff'){
CCSE.ReplaceCodeIntoFunction('Game.buffTypes[' + i + '].func',
'icon:[obj.iconColumn,14],',
'icon:[obj.iconColumn,14,(obj.art.customIconsPic ? obj.art.customIconsPic : 0)],', 0);
}
else if(buff.name == 'building debuff'){
CCSE.ReplaceCodeIntoFunction('Game.buffTypes[' + i + '].func',
'icon:[obj.iconColumn,15],',
'icon:[obj.iconColumn,15,(obj.art.customIconsPic ? obj.art.customIconsPic : 0)],', 0);
}
}
// ----- GRANDMAPOCALYPSE block ----- //
// I need this because this gets used once and if I leave it out the game breaks
function inRect(x,y,rect)
{
//find out if the point x,y is in the rotated rectangle rect{w,h,r,o} (width,height,rotation in radians,y-origin) (needs to be normalized)
//I found this somewhere online I guess
var dx = x+Math.sin(-rect.r)*(-(rect.h/2-rect.o)),dy=y+Math.cos(-rect.r)*(-(rect.h/2-rect.o));
var h1 = Math.sqrt(dx*dx + dy*dy);
var currA = Math.atan2(dy,dx);
var newA = currA - rect.r;
var x2 = Math.cos(newA) * h1;
var y2 = Math.sin(newA) * h1;
if (x2 > -0.5 * rect.w && x2 < 0.5 * rect.w && y2 > -0.5 * rect.h && y2 < 0.5 * rect.h) return true;
return false;
}
// Game.UpdateGrandmapocalypse
// executed every logic frame
if(!Game.customUpdateGrandmapocalypse) Game.customUpdateGrandmapocalypse = [];
CCSE.SliceCodeIntoFunction('Game.UpdateGrandmapocalypse', -1, `
// Game.UpdateGrandmapocalypse injection point 0
for(var i in Game.customUpdateGrandmapocalypse) Game.customUpdateGrandmapocalypse[i]();
`);
// Game.getWrinklersMax
// Functions should return a value to add to n. Return 0 to have no effect
if(!Game.customGetWrinklersMax) Game.customGetWrinklersMax = [];
CCSE.ReplaceCodeIntoFunction('Game.getWrinklersMax', 'return', `
// Game.getWrinklersMax injection point 0
for(var i in Game.customGetWrinklersMax) n += Game.customGetWrinklersMax[i](n);`, -1);
// Game.SpawnWrinkler
if(!Game.customSpawnWrinkler) Game.customSpawnWrinkler = [];
CCSE.ReplaceCodeIntoFunction('Game.SpawnWrinkler', 'return me', `
// Game.SpawnWrinkler injection point 0
for(var i in Game.customSpawnWrinkler) Game.customSpawnWrinkler[i](me);`, -1);
// Game.UpdateWrinklers
// customWrinklerSpawnChance functions should return a multiplier to chance. (Return 1 to have no effect)
if(!Game.customUpdateWrinklers) Game.customUpdateWrinklers = [];
if(!Game.customWrinklerSpawnChance) Game.customWrinklerSpawnChance = [];
if(!Game.customWrinklerPop) Game.customWrinklerPop = [];
CCSE.ReplaceCodeIntoFunction('Game.UpdateWrinklers', 'if (Math.random()<chance)', `
// Game.UpdateWrinklers injection point 0
for(var i in Game.customWrinklerSpawnChance) chance *= Game.customWrinklerSpawnChance[i]();`, -1);
CCSE.ReplaceCodeIntoFunction('Game.UpdateWrinklers', 'Game.Earn(me.sucked);', `
// Game.UpdateWrinklers injection point 1
for(var i in Game.customWrinklerPop) Game.customWrinklerPop[i](me);`, -1);
CCSE.SliceCodeIntoFunction('Game.UpdateWrinklers', -1, `
// Game.UpdateWrinklers injection point 2
for(var i in Game.customUpdateWrinklers) Game.customUpdateWrinklers[i]();
`, inRect.toString());
// Game.DrawWrinklers
if(!Game.customDrawWrinklers) Game.customDrawWrinklers = [];
CCSE.SliceCodeIntoFunction('Game.DrawWrinklers', -1, `
// Game.DrawWrinklers injection point 0
for(var i in Game.customDrawWrinklers) Game.customDrawWrinklers[i]();
`);
// Game.SaveWrinklers
// Return ret to have no effect
if(!Game.customSaveWrinklers) Game.customSaveWrinklers = [];
CCSE.ReplaceCodeIntoFunction('Game.SaveWrinklers', 'return', `
// Game.SaveWrinklers injection point 0
var ret =`, 0);
CCSE.SliceCodeIntoFunction('Game.SaveWrinklers', -1, `
// Game.SaveWrinklers injection point 1
for(var i in Game.customSaveWrinklers) ret = Game.customSaveWrinklers[i](ret);
return ret;
`);
// Game.LoadWrinklers
if(!Game.customLoadWrinklers) Game.customLoadWrinklers = [];
CCSE.SliceCodeIntoFunction('Game.LoadWrinklers', -1, `
// Game.LoadWrinklers injection point 0
for(var i in Game.customLoadWrinklers) Game.customLoadWrinklers[i](amount, number, shinies, amountShinies);
`);
// ----- Special things and stuff block ----- //
// Game.UpdateSpecial
// customSpecialTabs functions should push a string to Game.specialTabs (or not)
if(!Game.customSpecialTabs) Game.customSpecialTabs = [];
CCSE.ReplaceCodeIntoFunction('Game.UpdateSpecial', 'if (Game.specialTabs.length==0)',
`// Game.UpdateSpecial injection point 0
for(var i in Game.customSpecialTabs) Game.customSpecialTabs[i]();`, -1);
// Game.UpgradeSanta
if(!Game.customUpgradeSanta) Game.customUpgradeSanta = [];
CCSE.SliceCodeIntoFunction('Game.UpgradeSanta', -1, `
// Game.UpgradeSanta injection point 0
for(var i in Game.customUpgradeSanta) Game.customUpgradeSanta[i]();
`);
// Game.hasAura
// Return ret to have no effect
if(!Game.customHasAura) Game.customHasAura = [];
CCSE.SpliceCodeIntoFunction('Game.hasAura', 2, 'var ret;');
CCSE.ReplaceCodeIntoFunction('Game.hasAura', /return/g, 'ret =', 0);
CCSE.SliceCodeIntoFunction('Game.hasAura', -1, `
// Game.hasAura injection point 0
for(var i in Game.customHasAura) ret = Game.customHasAura[i](what, ret);
return ret;
`);
// Game.auraMult
// Return 1 to have no effect
if(!Game.customAuraMult) Game.customAuraMult = [];
CCSE.ReplaceCodeIntoFunction('Game.auraMult', 'return', `
// Game.auraMult injection point 0
for(var i in Game.customAuraMult) n *= Game.customAuraMult[i](what);
return`, 0);
// Game.SelectDragonAura
// Actually no. This function is not conducive to customization. Seems like 2 auras is all we get.
// customCurrentDragonAura functions should return an array index for currentAura (Return currentAura to do nothing)
// customDragonAuraShow functions should return 1 to show that aura in the picker, 0 to not (Return show to do nothing)
/*if(!Game.customCurrentDragonAura) Game.customCurrentDragonAura = [];
if(!Game.customDragonAuraShow) Game.customDragonAuraShow = [];
temp = Game.SelectDragonAura.toString();
eval('Game.SelectDragonAura = ' + temp.replace('if (!update)',
`for(var i in Game.customCurrentDragonAura) currentAura = Game.customCurrentDragonAura[i](slot, update, currentAura);
if (!update)`).replace('if (i==0 || i!=otherAura)',
`var show = (i==0 || i!=otherAura);
for(var i in Game.customDragonAuraShow) show = Game.customDragonAuraShow[i](slot, update, i, show);
if (show)`));*/
// Game.DescribeDragonAura
if(!Game.customDescribeDragonAura) Game.customDescribeDragonAura = [];
CCSE.SliceCodeIntoFunction('Game.DescribeDragonAura', -1, `
// Game.DescribeDragonAura injection point 0
for(var i in Game.customDescribeDragonAura) Game.customDescribeDragonAura[i](aura);
`);
// Game.UpgradeDragon
if(!Game.customUpgradeDragon) Game.customUpgradeDragon = [];
CCSE.SliceCodeIntoFunction('Game.UpgradeDragon', -1, `
// Game.UpgradeDragon injection point 0
for(var i in Game.customUpgradeDragon) Game.customUpgradeDragon[i]();
`);
// Game.ClickSpecialPic
if(!Game.customClickSpecialPic) Game.customClickSpecialPic = [];
CCSE.SliceCodeIntoFunction('Game.ClickSpecialPic', -1, `
// Game.ClickSpecialPic injection point 0
for(var i in Game.customClickSpecialPic) Game.customClickSpecialPic[i]();
`);
// Game.ToggleSpecialMenu
// customToggleSpecialMenu functions should return a string for l('specialPopup').innerHTML (Return str for no effect)
// str.replace('background:url(img/dragon.png?v='+Game.version+');background-position:-384px 0px;', <your pic here>)
// Pics are 96px by 96px
if(!Game.customToggleSpecialMenu) Game.customToggleSpecialMenu = [];
CCSE.ReplaceCodeIntoFunction('Game.ToggleSpecialMenu', "l('specialPopup').innerHTML=str;",
`// Game.ToggleSpecialMenu injection point 0
for(var i in Game.customToggleSpecialMenu) str = Game.customToggleSpecialMenu[i](str);`, -1);
// Game.DrawSpecial
// customDrawSpecialPic functions should alter the picframe object
// Pics are 96px by 96px
if(!Game.customDrawSpecial) Game.customDrawSpecial = [];
if(!Game.customDrawSpecialPic) Game.customDrawSpecialPic = [];
CCSE.ReplaceCodeIntoFunction('Game.DrawSpecial', "if (hovered || selected)",
`// Game.DrawSpecial injection point 0
var picframe = {pic:pic, frame:frame};
for(var j in Game.customDrawSpecialPic) Game.customDrawSpecialPic[j](picframe, Game.specialTabs[i]);
pic = picframe.pic; frame = picframe.frame;`, -1);
CCSE.SliceCodeIntoFunction('Game.DrawSpecial', -1, `
// Game.DrawSpecial injection point 1
for(var i in Game.customDrawSpecial) Game.customDrawSpecial[i]();
`);
// ----- Visual Effects block ----- //
// Game.DrawBackground
// Game.customDrawBackground functions get called in the same block that creates the cookie rain and seasonal backgrounds
// If you want a hook somewhere else, let me know
if(!Game.customDrawBackground) Game.customDrawBackground = [];
CCSE.ReplaceCodeIntoFunction('Game.DrawBackground', "Timer.track('left background');",
`// Game.DrawBackground injection point 0
for(var i in Game.customDrawBackground) Game.customDrawBackground[i]();`, -1);
// Setup for custom Milk Selector options
CCSE.ReplaceCodeIntoFunction('Game.DrawBackground', "if (Game.milkType!=0 && Game.ascensionMode!=1) pic=Game.AllMilks[Game.milkType].pic;",
'if (CCSE.config.milkType!="Automatic" && Game.ascensionMode!=1) pic=CCSE.GetSelectedMilk().milk.pic;', 0);
// Setup for custom Background Selector options
temp = Game.DrawBackground.toString();
temp = temp.replace("Game.bg+'.jpg'", 'Game.bg');
temp = temp.replace("Game.bgFade+'.jpg'", 'Game.bgFade');
temp = temp.replace("Game.BGsByChoice[Game.bgType]", 'choice');
temp = temp.replace("if (Game.bgType!=0 && Game.ascensionMode!=1)",
`Game.bg += '.jpg';
Game.bgFade += '.jpg';
if (Game.ascensionMode!=1)
{
let choice = CCSE.GetSelectedBackground();
if(choice.name != loc('Automatic'))`);
temp = temp.replace("Game.Background.fillPattern(Pic(Game.bg)",
`}
Game.Background.fillPattern(Pic(Game.bg)`);
eval('Game.DrawBackground = ' + temp);
for(var i in Game.BGsByChoice) Game.BGsByChoice[i].pic += '.jpg';
// ----- Debug block ----- //
// Game.OpenSesame
// Game.customOpenSesame functions should add HTML strings to the debug menu
if(!Game.customOpenSesame) Game.customOpenSesame = [];
CCSE.ReplaceCodeIntoFunction('Game.OpenSesame', "str+='</div>';",
`// Game.OpenSesame injection point 0
for(var i in Game.customOpenSesame) str += Game.customOpenSesame[i]();`, -1);
// ----- YouCustomizer block ----- //
// Game.YouCustomizer.render
if(!Game.customYouCustomizerRender) Game.customYouCustomizerRender = [];
CCSE.SliceCodeIntoFunction('Game.YouCustomizer.render', -1, `
// Game.YouCustomizer.render injection point 0
for(var i in Game.customYouCustomizerRender) Game.customYouCustomizerRender[i]();
`);
// Game.YouCustomizer.getGeneValue
// Return retVal to have no effect
temp = Game.YouCustomizer.getGeneValue.toString();
temp = temp.replace('var gene=', 'var retVal;\r\nvar gene=');
temp = temp.replaceAll('return', 'retVal =');
eval('Game.YouCustomizer.getGeneValue = ' + temp);
if(!Game.customYouCustomizerGetGeneValue) Game.customYouCustomizerGetGeneValue = [];
CCSE.SliceCodeIntoFunction('Game.YouCustomizer.getGeneValue', -1, `
// Game.YouCustomizer.getGeneValue injection point 0
for(var i in Game.customYouCustomizerGetGeneValue) retVal = Game.customYouCustomizerGetGeneValue[i](id, retVal);
return retVal;
`);
// Game.YouCustomizer.offsetGene
if(!Game.customYouCustomizerOffsetGene) Game.customYouCustomizerOffsetGene = [];
CCSE.SliceCodeIntoFunction('Game.YouCustomizer.offsetGene', -1, `
// Game.YouCustomizer.offsetGene injection point 0
for(var i in Game.customYouCustomizerOffsetGene) Game.customYouCustomizerOffsetGene[i](gene,off);
`);
// Game.YouCustomizer.randomize
if(!Game.customYouCustomizerRandomize) Game.customYouCustomizerRandomize = [];
CCSE.ReplaceCodeIntoFunction('Game.YouCustomizer.randomize', "Game.YouCustomizer.render();",
`// Game.YouCustomizer.randomize injection point 0
for(var i in Game.customYouCustomizerRandomize) str = Game.customYouCustomizerRandomize[i]();`, -1);
// Game.YouCustomizer.renderPortrait
if(!Game.customYouCustomizerRenderPortrait) Game.customYouCustomizerRenderPortrait = [];
CCSE.SliceCodeIntoFunction('Game.YouCustomizer.renderPortrait', -1, `
// Game.YouCustomizer.renderPortrait injection point 0
for(var i in Game.customYouCustomizerRenderPortrait) Game.customYouCustomizerRenderPortrait[i]();
`);
// Game.YouCustomizer.prompt
if(!Game.customYouCustomizerPrompt) Game.customYouCustomizerPrompt = [];
if(!Game.customYouCustomizerMakeCustomizerSelector) Game.customYouCustomizerMakeCustomizerSelector = [];
temp = Game.YouCustomizer.prompt.toString();
temp = temp.replace('return', 'var retVal =');
temp = temp.replace('}', `
// Game.YouCustomizer.prompt injection point 0
for(var i in Game.customYouCustomizerMakeCustomizerSelector) retVal = Game.customYouCustomizerMakeCustomizerSelector[i](gene,text,retVal);
return retVal;
}`);
eval('Game.YouCustomizer.prompt = ' + temp);
CCSE.SliceCodeIntoFunction('Game.YouCustomizer.prompt', -1, `
// Game.YouCustomizer.prompt injection point 1
for(var i in Game.customYouCustomizerPrompt) Game.customYouCustomizerPrompt[i]();
`);
// ----- Gifting block ----- //
// Game.promptGiftRedeem
// Game.promptGiftSend
// Submit an issue to the GitHub page with where you want a hook
// Until that happens, these functions won't either
}
if(!CCSE.customReplaceShimmerType) CCSE.customReplaceShimmerType = [];
CCSE.ReplaceShimmerType = function(key){
var temp = '';
var pos = 0;
var proto;
var escKey = key.replace(/'/g, "\\'");
if(!Game.customShimmerTypes[key]) Game.customShimmerTypes[key] = {};
CCSE.Backup.customShimmerTypes[key] = {};
// Game.shimmerTypes[key].initFunc
// durationMult functions should return a value to multiply the duration by
if(!Game.customShimmerTypes[key].initFunc) Game.customShimmerTypes[key].initFunc = [];
if(!Game.customShimmerTypes[key].durationMult) Game.customShimmerTypes[key].durationMult = [];
Game.customShimmerTypes[key].initFunc.push(CCSE.customShimmerTypesAllinitFunc);
Game.customShimmerTypes[key].durationMult.push(CCSE.customShimmerTypesAlldurationMult);
CCSE.ReplaceCodeIntoFunction("Game.shimmerTypes['" + escKey + "'].initFunc", 'me.dur=dur;',
`// Game.shimmerTypes['` + escKey + `'].initFunc injection point 0
for(var i in Game.customShimmerTypes['` + escKey + `'].durationMult) dur *= Game.customShimmerTypes['` + escKey + `'].durationMult[i](me);`, -1);
CCSE.SliceCodeIntoFunction("Game.shimmerTypes['" + escKey + "'].initFunc", -1, `
// Game.shimmerTypes['` + escKey + `'].initFunc injection point 1
for(var i in Game.customShimmerTypes['` + escKey + `'].initFunc) Game.customShimmerTypes['` + escKey + `'].initFunc[i](me);
`);
//CCSE.ReplaceCodeIntoFunction("Game.shimmerTypes['" + escKey + "'].initFunc", 'Game.chimeType==1 && ', '', 0);
// Game.shimmerTypes[key].updateFunc
if(!Game.customShimmerTypes[key].updateFunc) Game.customShimmerTypes[key].updateFunc = [];
Game.customShimmerTypes[key].updateFunc.push(CCSE.customShimmerTypesAllupdateFunc);
CCSE.SliceCodeIntoFunction("Game.shimmerTypes['" + escKey + "'].updateFunc", -1, `
// Game.shimmerTypes['` + escKey + `'].updateFunc injection point 0
for(var i in Game.customShimmerTypes['` + escKey + `'].updateFunc) Game.customShimmerTypes['` + escKey + `'].updateFunc[i](me);
`);
// Game.shimmerTypes[key].popFunc
if(!Game.customShimmerTypes[key].popFunc) Game.customShimmerTypes[key].popFunc = [];
Game.customShimmerTypes[key].popFunc.push(CCSE.customShimmerTypesAllpopFunc);
CCSE.SliceCodeIntoFunction("Game.shimmerTypes['" + escKey + "'].popFunc", -1, `
// Game.shimmerTypes['` + escKey + `'].popFunc injection point 0
for(var i in Game.customShimmerTypes['` + escKey + `'].popFunc) Game.customShimmerTypes['` + escKey + `'].popFunc[i](me);
`);
// Game.shimmerTypes[key].spawnConditions
// Return ret to have no effect
if(!Game.customShimmerTypes[key].spawnConditions) Game.customShimmerTypes[key].spawnConditions = [];
Game.customShimmerTypes[key].spawnConditions.push(CCSE.customShimmerTypesAllspawnConditions);
CCSE.SpliceCodeIntoFunction("Game.shimmerTypes['" + escKey + "'].spawnConditions", 2, 'var ret;');
CCSE.ReplaceCodeIntoFunction("Game.shimmerTypes['" + escKey + "'].spawnConditions", /return/g, 'ret =', 0);
CCSE.SliceCodeIntoFunction("Game.shimmerTypes['" + escKey + "'].spawnConditions", -1, `
// Game.shimmerTypes['` + escKey + `'].spawnConditions injection point 0
for(var i in Game.customShimmerTypes['` + escKey + `'].spawnConditions) ret = Game.customShimmerTypes['` + escKey + `'].spawnConditions[i](ret);
return ret;
`);
// Game.shimmerTypes[key].getTimeMod
// Functions should return a multiplier to the shimmer's spawn time (higher takes longer to spawn)
// Return 1 to have no effect
if(!Game.customShimmerTypes[key].getTimeMod) Game.customShimmerTypes[key].getTimeMod = [];
Game.customShimmerTypes[key].getTimeMod.push(CCSE.customShimmerTypesAllgetTimeMod);
CCSE.ReplaceCodeIntoFunction("Game.shimmerTypes['" + escKey + "'].getTimeMod", 'return', `
// Game.shimmerTypes['` + escKey + `'].getTimeMod injection point 0
for(var i in Game.customShimmerTypes['` + escKey + `'].getTimeMod) m *= Game.customShimmerTypes['` + escKey + `'].getTimeMod[i](me);`, -1);
for(var i in CCSE.customReplaceShimmerType) CCSE.customReplaceShimmerType[i](key);
}
if(!CCSE.customReplaceBuilding) CCSE.customReplaceBuilding = [];
CCSE.ReplaceBuildingsStart = function(){
if(!Game.customBuildingsAll) Game.customBuildingsAll = {};
if(!Game.customBuildingsAll.switchMinigame) Game.customBuildingsAll.switchMinigame = [];
CCSE.customBuildingsAllswitchMinigame = function(obj, on){
for(var i in Game.customBuildingsAll.switchMinigame) Game.customBuildingsAll.switchMinigame[i](obj, on);
}
if(!Game.customBuildingsAll.getSellMultiplier) Game.customBuildingsAll.getSellMultiplier = [];
CCSE.customBuildingsAllgetSellMultiplier = function(obj, giveBack){
for(var i in Game.customBuildingsAll.getSellMultiplier) giveBack = Game.customBuildingsAll.getSellMultiplier[i](obj, giveBack);
return giveBack;
}
if(!Game.customBuildingsAll.buy) Game.customBuildingsAll.buy = [];
CCSE.customBuildingsAllbuy = function(obj, amount){
for(var i in Game.customBuildingsAll.buy) Game.customBuildingsAll.buy[i](obj, amount);
}
if(!Game.customBuildingsAll.sell) Game.customBuildingsAll.sell = [];
CCSE.customBuildingsAllsell = function(obj, amount, bypass){
for(var i in Game.customBuildingsAll.sell) Game.customBuildingsAll.sell[i](obj, amount, bypass);
}
if(!Game.customBuildingsAll.sacrifice) Game.customBuildingsAll.sacrifice = [];
CCSE.customBuildingsAllsacrifice = function(obj, amount){
for(var i in Game.customBuildingsAll.sacrifice) Game.customBuildingsAll.sacrifice[i](obj, amount);
}
if(!Game.customBuildingsAll.buyFree) Game.customBuildingsAll.buyFree = [];
CCSE.customBuildingsAllbuyFree = function(obj, amount){
for(var i in Game.customBuildingsAll.buyFree) Game.customBuildingsAll.buyFree[i](obj, amount);
}
if(!Game.customBuildingsAll.getFree) Game.customBuildingsAll.getFree = [];
CCSE.customBuildingsAllgetFree = function(obj, amount){
for(var i in Game.customBuildingsAll.getFree) Game.customBuildingsAll.getFree[i](obj, amount);
}
if(!Game.customBuildingsAll.getFreeRanks) Game.customBuildingsAll.getFreeRanks = [];
CCSE.customBuildingsAllgetFreeRanks = function(obj, amount){
for(var i in Game.customBuildingsAll.getFreeRanks) Game.customBuildingsAll.getFreeRanks[i](obj, amount);
}
if(!Game.customBuildingsAll.tooltip) Game.customBuildingsAll.tooltip = [];
CCSE.customBuildingsAlltooltip = function(obj, ret){
for(var i in Game.customBuildingsAll.tooltip) ret = Game.customBuildingsAll.tooltip[i](obj, ret);
return ret;
}
if(!Game.customBuildingsAll.levelTooltip) Game.customBuildingsAll.levelTooltip = [];
CCSE.customBuildingsAlllevelTooltip = function(obj, ret){
for(var i in Game.customBuildingsAll.levelTooltip) ret = Game.customBuildingsAll.levelTooltip[i](obj, ret);
return ret;
}
if(!Game.customBuildingsAll.refresh) Game.customBuildingsAll.refresh = [];
CCSE.customBuildingsAllrefresh = function(obj){
for(var i in Game.customBuildingsAll.refresh) Game.customBuildingsAll.refresh[i](obj);
}
if(!Game.customBuildingsAll.rebuild) Game.customBuildingsAll.rebuild = [];
CCSE.customBuildingsAllrebuild = function(obj){
for(var i in Game.customBuildingsAll.rebuild) Game.customBuildingsAll.rebuild[i](obj);
}
if(!Game.customBuildingsAll.mute) Game.customBuildingsAll.mute = [];
CCSE.customBuildingsAllmute = function(obj, val){
for(var i in Game.customBuildingsAll.mute) Game.customBuildingsAll.mute[i](obj, val);
}
if(!Game.customBuildingsAll.draw) Game.customBuildingsAll.draw = [];
CCSE.customBuildingsAlldraw = function(obj){
for(var i in Game.customBuildingsAll.draw) Game.customBuildingsAll.draw[i](obj);
}
if(!Game.customBuildingsAll.buyFunction) Game.customBuildingsAll.buyFunction = [];
CCSE.customBuildingsAllbuyFunction = function(obj){
for(var i in Game.customBuildingsAll.buyFunction) Game.customBuildingsAll.buyFunction[i](obj);
}
if(!Game.customBuildingsAll.cpsMult) Game.customBuildingsAll.cpsMult = [];
CCSE.customBuildingsAllcpsMult = function(obj){
var mult = 1;
for(var i in Game.customBuildingsAll.cpsMult) mult *= Game.customBuildingsAll.cpsMult[i](obj);
return mult;
}
if(!Game.customBuildings) Game.customBuildings = {};
CCSE.Backup.customBuildings = {};
CCSE.i = 0;
}
CCSE.ReplaceBuildings = function(){
var time = Date.now();
for(var i = CCSE.i; i < Game.ObjectsN; i++){
CCSE.ReplaceBuilding(Game.ObjectsById[i].name);
if(Date.now() > time + 500 / Game.fps) break;
}
CCSE.i = i + 1;
if(CCSE.i < Game.ObjectsN){
// Didn't do all of them. Wait for priority and go again
requestAnimationFrame(CCSE.ReplaceBuildings);
}else{
// Continue on
requestAnimationFrame(CCSE.playlist[CCSE.track++]);
}
}
CCSE.ReplaceBuildingsFinish = function(){
// ----- Individual Buildings block ----- //
var obj = Game.Objects['Cursor'];
// Cursor.cps
// cpsAdd Functions should return a value to add per non cursor building (Return 0 to have no effect)
if(!Game.customBuildings[obj.name].cpsAdd) Game.customBuildings[obj.name].cpsAdd = [];
if(!Game.customBuildings[obj.name].cpsMult) Game.customBuildings[obj.name].cpsMult = [];
CCSE.ReplaceCodeIntoFunction("Game.Objects['Cursor'].cps", 'var mult=1;', `
// Cursor.cps injection point 1
for(var i in Game.customBuildings['` + obj.name + `'].cpsAdd) add += Game.customBuildings['` + obj.name + `'].cpsAdd[i](me);`, -1);
obj = Game.Objects['Grandma'];
// Grandma.art.pic
// Functions should push an image name (sans the .png part) into list
if(!Game.customGrandmaPicture) Game.customGrandmaPicture = [];
CCSE.ReplaceCodeIntoFunction("Game.Objects['Grandma'].art.pic", 'return', `
// Grandma.art.pic injection point 0
for(var j in Game.customGrandmaPicture) Game.customGrandmaPicture[j](i, list);`, -1);
// Grandma.cps
// cpsAdd Functions should return a value to add before multiplying (Return 0 to have no effect)
if(!Game.customBuildings[obj.name].cpsAdd) Game.customBuildings[obj.name].cpsAdd = [];
if(!Game.customBuildings[obj.name].cpsMult) Game.customBuildings[obj.name].cpsMult = [];
CCSE.ReplaceCodeIntoFunction("Game.Objects['Grandma'].cps", 'return', `
// Grandma.cps injection point 1
for(var i in Game.customBuildings['` + obj.name + `'].cpsAdd) add += Game.customBuildings['` + obj.name + `'].cpsAdd[i](me);`, -1);
}
CCSE.ReplaceBuilding = function(key){
// A lot of Copy/Paste happened, hence why I did so many functions.
// Also, I may not have fully tested each one.
var temp = '';
var pos = 0;
var proto;
var escKey = key.replace(/'/g, "\\'");
var obj = Game.Objects[key];
if(!Game.customBuildings[key]) Game.customBuildings[key] = {};
CCSE.Backup.customBuildings[key] = {};
// this.switchMinigame
if(!Game.customBuildings[key].switchMinigame) Game.customBuildings[key].switchMinigame = [];
Game.customBuildings[key].switchMinigame.push(CCSE.customBuildingsAllswitchMinigame);
CCSE.SliceCodeIntoFunction("Game.Objects['" + escKey + "'].switchMinigame", -1, `
// Game.Objects['` + escKey + `'].switchMinigame injection point 0
for(var i in Game.customBuildings[this.name].switchMinigame) Game.customBuildings[this.name].switchMinigame[i](this, on);
`);
// this.getSellMultiplier
// Return ret to have no effect
if(!Game.customBuildings[key].getSellMultiplier) Game.customBuildings[key].getSellMultiplier = [];
Game.customBuildings[key].getSellMultiplier.push(CCSE.customBuildingsAllgetSellMultiplier);
CCSE.ReplaceCodeIntoFunction("Game.Objects['" + escKey + "'].getSellMultiplier", 'return', `
// Game.Objects['` + escKey + `'].getSellMultiplier injection point 0
for(var i in Game.customBuildings[this.name].getSellMultiplier) giveBack = Game.customBuildings[this.name].getSellMultiplier[i](this, giveBack);`, -1);
// this.buy
if(!Game.customBuildings[key].buy) Game.customBuildings[key].buy = [];
Game.customBuildings[key].buy.push(CCSE.customBuildingsAllbuy);
CCSE.SliceCodeIntoFunction("Game.Objects['" + escKey + "'].buy", -1, `
// Game.Objects['` + escKey + `'].buy injection point 0
for(var i in Game.customBuildings[this.name].buy) Game.customBuildings[this.name].buy[i](this, amount);
`);
// this.sell
if(!Game.customBuildings[key].sell) Game.customBuildings[key].sell = [];
Game.customBuildings[key].sell.push(CCSE.customBuildingsAllsell);
CCSE.SliceCodeIntoFunction("Game.Objects['" + escKey + "'].sell", -1, `
// Game.Objects['` + escKey + `'].sell injection point 0
for(var i in Game.customBuildings[this.name].sell) Game.customBuildings[this.name].sell[i](this, amount, bypass);
`);
// this.sacrifice
if(!Game.customBuildings[key].sacrifice) Game.customBuildings[key].sacrifice = [];
Game.customBuildings[key].sacrifice.push(CCSE.customBuildingsAllsacrifice);
CCSE.SliceCodeIntoFunction("Game.Objects['" + escKey + "'].sacrifice", -1, `
// Game.Objects['` + escKey + `'].sacrifice injection point 0
for(var i in Game.customBuildings[this.name].sacrifice) Game.customBuildings[this.name].sacrifice[i](this, amount);
`);
// this.buyFree
if(!Game.customBuildings[key].buyFree) Game.customBuildings[key].buyFree = [];
Game.customBuildings[key].buyFree.push(CCSE.customBuildingsAllbuyFree);
CCSE.SliceCodeIntoFunction("Game.Objects['" + escKey + "'].buyFree", -1, `
// Game.Objects['` + escKey + `'].buyFree injection point 0
for(var i in Game.customBuildings[this.name].buyFree) Game.customBuildings[this.name].buyFree[i](this, amount);
`, 'var price = Game.Objects["' + escKey + '"].basePrice');
// this.getFree
if(!Game.customBuildings[key].getFree) Game.customBuildings[key].getFree = [];
Game.customBuildings[key].getFree.push(CCSE.customBuildingsAllgetFree);
CCSE.SliceCodeIntoFunction("Game.Objects['" + escKey + "'].getFree", -1, `
// Game.Objects['` + escKey + `'].getFree injection point 0
for(var i in Game.customBuildings[this.name].getFree) Game.customBuildings[this.name].getFree[i](this, amount);
`);
// this.getFreeRanks
if(!Game.customBuildings[key].getFreeRanks) Game.customBuildings[key].getFreeRanks = [];
Game.customBuildings[key].getFreeRanks.push(CCSE.customBuildingsAllgetFreeRanks);
CCSE.SliceCodeIntoFunction("Game.Objects['" + escKey + "'].getFreeRanks", -1, `
// Game.Objects['` + escKey + `'].getFreeRanks injection point 0
for(var i in Game.customBuildings[this.name].getFreeRanks) Game.customBuildings[this.name].getFreeRanks[i](this, amount);
`);
// this.tooltip
// Return ret to have no effect
if(!Game.customBuildings[key].tooltip) Game.customBuildings[key].tooltip = [];
Game.customBuildings[key].tooltip.push(CCSE.customBuildingsAlltooltip);
CCSE.ReplaceCodeIntoFunction("Game.Objects['" + escKey + "'].tooltip", 'return', 'var ret =', 0);
CCSE.SliceCodeIntoFunction("Game.Objects['" + escKey + "'].tooltip", -1, `
// Game.Objects['` + escKey + `'].tooltip injection point 0
for(var i in Game.customBuildings[this.name].tooltip) ret = Game.customBuildings[this.name].tooltip[i](this, ret);
return ret;
`);
// this.levelTooltip
// Return ret to have no effect
if(!Game.customBuildings[key].levelTooltip) Game.customBuildings[key].levelTooltip = [];
Game.customBuildings[key].levelTooltip.push(CCSE.customBuildingsAlllevelTooltip);
CCSE.ReplaceCodeIntoFunction("Game.Objects['" + escKey + "'].levelTooltip", 'return', 'var ret =', 0);
CCSE.SliceCodeIntoFunction("Game.Objects['" + escKey + "'].levelTooltip", -1, `
// Game.Objects['` + escKey + `'].levelTooltip injection point 0
for(var i in Game.customBuildings[this.name].levelTooltip) ret = Game.customBuildings[this.name].levelTooltip[i](this, ret);
return ret;
`);
// this.levelUp
// Haha no. This is like four functions that return each other
// I'm not dealing with it unless I have to.
// this.refresh
if(!Game.customBuildings[key].refresh) Game.customBuildings[key].refresh = [];
Game.customBuildings[key].refresh.push(CCSE.customBuildingsAllrefresh);
CCSE.SliceCodeIntoFunction("Game.Objects['" + escKey + "'].refresh", -1, `
// Game.Objects['` + escKey + `'].refresh injection point 0
for(var i in Game.customBuildings[this.name].refresh) Game.customBuildings[this.name].refresh[i](this);
`);
// this.rebuild
if(!Game.customBuildings[key].rebuild) Game.customBuildings[key].rebuild = [];
Game.customBuildings[key].rebuild.push(CCSE.customBuildingsAllrebuild);
CCSE.SliceCodeIntoFunction("Game.Objects['" + escKey + "'].rebuild", -1, `
// Game.Objects['` + escKey + `'].rebuild injection point 0
for(var i in Game.customBuildings[this.name].rebuild) Game.customBuildings[this.name].rebuild[i](this);
`);
// this.mute
if(!Game.customBuildings[key].mute) Game.customBuildings[key].mute = [];
Game.customBuildings[key].mute.push(CCSE.customBuildingsAllmute);
CCSE.SliceCodeIntoFunction("Game.Objects['" + escKey + "'].mute", -1, `
// Game.Objects['` + escKey + `'].mute injection point 0
for(var i in Game.customBuildings[this.name].mute) Game.customBuildings[this.name].mute[i](this, val);
`);
// this.draw
if(!Game.customBuildings[key].draw) Game.customBuildings[key].draw = [];
Game.customBuildings[key].draw.push(CCSE.customBuildingsAlldraw);
if(key == 'Cursor'){ // Because cursors are special
Game.Objects[key].draw = function(){
// Game.Objects['Cursor'].draw injection point 0
for(var i in Game.customBuildings[this.name].draw) Game.customBuildings[this.name].draw[i](this);
}
}
else{
CCSE.SliceCodeIntoFunction("Game.Objects['" + escKey + "'].draw", -1, `
// Game.Objects['` + escKey + `'].draw injection point 0
for(var i in Game.customBuildings[this.name].draw) Game.customBuildings[this.name].draw[i](this);
`);
}
// this.buyFunction
if(!Game.customBuildings[key].buyFunction) Game.customBuildings[key].buyFunction = [];
Game.customBuildings[key].buyFunction.push(CCSE.customBuildingsAllbuyFunction);
CCSE.SliceCodeIntoFunction("Game.Objects['" + escKey + "'].buyFunction", -1, `
// Game.Objects['` + escKey + `'].buyFunction injection point 0
for(var i in Game.customBuildings[this.name].buyFunction) Game.customBuildings[this.name].buyFunction[i](this);
`);
// this.cps
// cpsMult Functions should return a value to multiply the price by (Return 1 to have no effect)
if(!Game.customBuildings[obj.name].cpsMult) Game.customBuildings[obj.name].cpsMult = [];
Game.customBuildings[key].cpsMult.push(CCSE.customBuildingsAllcpsMult);
CCSE.ReplaceCodeIntoFunction("Game.Objects['" + escKey + "'].cps", 'return', `
// Game.Objects['` + escKey + `'].cps injection point 0
for(var i in Game.customBuildings[this.name].cpsMult) mult *= Game.customBuildings[this.name].cpsMult[i](me);
`, -1);
for(var i in CCSE.customReplaceBuilding) CCSE.customReplaceBuilding[i](key, obj);
}
if(!CCSE.customReplaceUpgrade) CCSE.customReplaceUpgrade = [];
CCSE.ReplaceUpgradesStart = function(){
if(!Game.customUpgradesAll) Game.customUpgradesAll = {};
if(!Game.customUpgradesAll.getPrice) Game.customUpgradesAll.getPrice = [];
CCSE.customUpgradesAllgetPrice = function(me){
var ret = 1
for(var i in Game.customUpgradesAll.getPrice) ret *= Game.customUpgradesAll.getPrice[i](me);
return ret;
}
if(!Game.customUpgradesAll.click) Game.customUpgradesAll.click = [];
CCSE.customUpgradesAllclick = function(me, e){
for(var i in Game.customUpgradesAll.click) Game.customUpgradesAll.click[i](me, e);
}
if(!Game.customUpgradesAll.buy) Game.customUpgradesAll.buy = [];
CCSE.customUpgradesAllbuy = function(me, bypass, success){
for(var i in Game.customUpgradesAll.buy) Game.customUpgradesAll.buy[i](me, bypass, success);
}
if(!Game.customUpgradesAll.earn) Game.customUpgradesAll.earn = [];
CCSE.customUpgradesAllearn = function(me){
for(var i in Game.customUpgradesAll.earn) Game.customUpgradesAll.earn[i](me);
}
if(!Game.customUpgradesAll.unearn) Game.customUpgradesAll.unearn = [];
CCSE.customUpgradesAllunearn = function(me){
for(var i in Game.customUpgradesAll.unearn) Game.customUpgradesAll.unearn[i](me);
}
if(!Game.customUpgradesAll.unlock) Game.customUpgradesAll.unlock = [];
CCSE.customUpgradesAllunlock = function(me){
for(var i in Game.customUpgradesAll.unlock) Game.customUpgradesAll.unlock[i](me);
}
if(!Game.customUpgradesAll.lose) Game.customUpgradesAll.lose = [];
CCSE.customUpgradesAlllose = function(me){
for(var i in Game.customUpgradesAll.lose) Game.customUpgradesAll.lose[i](me);
}
if(!Game.customUpgradesAll.toggle) Game.customUpgradesAll.toggle = [];
CCSE.customUpgradesAlltoggle = function(me){
for(var i in Game.customUpgradesAll.toggle) Game.customUpgradesAll.toggle[i](me);
}
if(!Game.customUpgradesAll.buyFunction) Game.customUpgradesAll.buyFunction = [];
CCSE.customUpgradesAllbuyFunction = function(me){
for(var i in Game.customUpgradesAll.buyFunction) Game.customUpgradesAll.buyFunction[i](me);
}
if(!Game.customUpgradesAll.descFunc) Game.customUpgradesAll.descFunc = [];
CCSE.customUpgradesAlldescFunc = function(me, desc){
for(var i in Game.customUpgradesAll.descFunc) desc = Game.customUpgradesAll.descFunc[i](me, desc);
return desc;
}
if(!Game.customUpgrades) Game.customUpgrades = {};
CCSE.Backup.customUpgrades = {};
CCSE.i = 0;
}
CCSE.ReplaceUpgrades = function(){
var time = Date.now();
for(var i = CCSE.i; i < Game.UpgradesN; i++){
CCSE.ReplaceUpgrade(Game.UpgradesById[i].name);
if(Date.now() > time + 500 / Game.fps) break;
}
CCSE.i = i + 1;
if(CCSE.i < Game.UpgradesN){
// Didn't do all of them. Wait for priority and go again
requestAnimationFrame(CCSE.ReplaceUpgrades);
}else{
// Continue on
requestAnimationFrame(CCSE.playlist[CCSE.track++]);
}
}
CCSE.ReplaceUpgradesFinish = function(){
// this.getPrice
// Functions should return a value to multiply the price by (Return 1 to have no effect)
CCSE.ReplaceCodeIntoFunction("Game.Upgrade.prototype.getPrice", 'return Math', `
// Game.Upgrade.prototype.getPrice injection point 0
if(Game.customUpgrades[this.name]) for(var i in Game.customUpgrades[this.name].getPrice) price *= Game.customUpgrades[this.name].getPrice[i](this);`, -1);
// this.click
CCSE.SliceCodeIntoFunction("Game.Upgrade.prototype.click", -1, `
// Game.Upgrade.prototype.click injection point 0
if(Game.customUpgrades[this.name]) for(var i in Game.customUpgrades[this.name].click) Game.customUpgrades[this.name].click[i](this, e);
`);
// this.buy
CCSE.ReplaceCodeIntoFunction("Game.Upgrade.prototype.buy", 'return success', `
// Game.Upgrade.prototype.buy injection point 0
if(Game.customUpgrades[this.name]) for(var i in Game.customUpgrades[this.name].buy) Game.customUpgrades[this.name].buy[i](this, bypass, success);`, -1);
// this.earn
CCSE.SliceCodeIntoFunction("Game.Upgrade.prototype.earn", -1, `
// Game.Upgrade.prototype.earn injection point 0
if(Game.customUpgrades[this.name]) for(var i in Game.customUpgrades[this.name].earn) Game.customUpgrades[this.name].earn[i](this);
`);
// this.unearn
CCSE.SliceCodeIntoFunction("Game.Upgrade.prototype.unearn", -1, `
// Game.Upgrade.prototype.unearn injection point 0
if(Game.customUpgrades[this.name]) for(var i in Game.customUpgrades[this.name].unearn) Game.customUpgrades[this.name].unearn[i](this);
`);
// this.unlock
CCSE.SliceCodeIntoFunction("Game.Upgrade.prototype.unlock", -1, `
// Game.Upgrade.prototype.unlock injection point 0
if(Game.customUpgrades[this.name]) if(Game.customUpgrades[this.name]) for(var i in Game.customUpgrades[this.name].unlock) Game.customUpgrades[this.name].unlock[i](this);
`);
// this.lose
CCSE.SliceCodeIntoFunction("Game.Upgrade.prototype.lose", -1, `
// Game.Upgrade.prototype.lose injection point 0
if(Game.customUpgrades[this.name]) for(var i in Game.customUpgrades[this.name].lose) Game.customUpgrades[this.name].lose[i](this);
`);
// this.toggle
CCSE.SliceCodeIntoFunction("Game.Upgrade.prototype.toggle", -1, `
// Game.Upgrade.prototype.toggle injection point 0
if(Game.customUpgrades[this.name]) for(var i in Game.customUpgrades[this.name].toggle) Game.customUpgrades[this.name].toggle[i](this);
`);
// this.isVaulted
CCSE.SpliceCodeIntoFunction("Game.Upgrade.prototype.isVaulted", 2, `
// Game.Upgrade.prototype.isVaulted injection point 0
if (CCSE.config.vault.indexOf(this.name)!=-1) return true;
`);
// this.vault
CCSE.ReplaceCodeIntoFunction("Game.Upgrade.prototype.vault", 'Game.vault', `
if(this.CCSE) CCSE.config.vault.push(this.name);
else `, -1);
// this.unvault
CCSE.ReplaceCodeIntoFunction("Game.Upgrade.prototype.unvault", 'Game.vault', `
if(this.CCSE) CCSE.config.vault.splice(CCSE.config.vault.indexOf(this.name),1);
else `, -1);
// Golden cookie sound selector custom options
CCSE.ReplaceCodeIntoFunction("Game.Upgrades['Golden cookie sound selector'].olddescFunc", "this.choicesFunction()[Game.chimeType]", "CCSE.GetSelectedShimmerSound()", 0);
//CCSE.ReplaceCodeIntoFunction("Game.Upgrades['Golden cookie sound selector'].olddescFunc", "'+icon[2]+'", "'+choice.icon[2]+'", 0);
// Game.Upgrades['Golden cookie sound selector'].choicesFunction
if(!Game.customUpgrades['Golden cookie sound selector'].choicesFunction) Game.customUpgrades['Golden cookie sound selector'].choicesFunction = [];
CCSE.ReplaceCodeIntoFunction("Game.Upgrades['Golden cookie sound selector'].choicesFunction", "return choices;",
`// Game.customUpgrades['Golden cookie sound selector'].choicesFunction injection point 0
for(var i in Game.customUpgrades['Golden cookie sound selector'].choicesFunction) Game.customUpgrades['Golden cookie sound selector'].choicesFunction[i](choices);
CCSE.OverrideShimmerSoundSelector(choices);`, -1);
/*Game.customUpgrades['Golden cookie sound selector'].choicesFunction.push(function(choices){
choices[1].default = 'snd/chime.mp3';
choices[1].shimmerTypes = {golden:'snd/chime.mp3', reindeer:'snd/jingle.mp3'};
});*/
CCSE.ReplaceCodeIntoFunction("Game.Upgrades['Golden cookie sound selector'].choicesPick", "Game.chimeType=id;",
'CCSE.SetSelectedShimmerSound(id);', 0);
// Milk selector custom options
CCSE.ReplaceCodeIntoFunction("Game.Upgrades['Milk selector'].olddescFunc", "this.choicesFunction()[Game.milkType]", "CCSE.GetSelectedMilk()", 0);
// Game.Upgrades['Milk selector'].choicesFunction
if(!Game.customUpgrades['Milk selector'].choicesFunction) Game.customUpgrades['Milk selector'].choicesFunction = [];
CCSE.ReplaceCodeIntoFunction("Game.Upgrades['Milk selector'].choicesFunction", "return choices;",
`// Game.customUpgrades['Milk selector'].choicesFunction injection point 0
for(var i in Game.customUpgrades['Milk selector'].choicesFunction) Game.customUpgrades['Milk selector'].choicesFunction[i](choices);
CCSE.OverrideMilkSelector(choices);`, -1);
Game.customUpgrades['Milk selector'].choicesFunction.push(function(choices){
if(!CCSE.Steam) for(var i in choices) choices[i].milk = Game.AllMilks[i];
choices[0].milk = Game.Milk;
});
CCSE.ReplaceCodeIntoFunction("Game.Upgrades['Milk selector'].choicesPick", "Game.milkType=id;",
'CCSE.SetSelectedMilk(id);', 0);
// Background selector custom options
CCSE.ReplaceCodeIntoFunction("Game.Upgrades['Background selector'].olddescFunc", "this.choicesFunction()[Game.bgType]", "CCSE.GetSelectedBackground()", 0);
// Game.Upgrades['Background selector'].choicesFunction
if(!Game.customUpgrades['Background selector'].choicesFunction) Game.customUpgrades['Background selector'].choicesFunction = [];
CCSE.ReplaceCodeIntoFunction("Game.Upgrades['Background selector'].choicesFunction", "return choices;",
`// Game.customUpgrades['Background selector'].choicesFunction injection point 0
for(var i in Game.customUpgrades['Background selector'].choicesFunction) Game.customUpgrades['Background selector'].choicesFunction[i](choices);
CCSE.OverrideBackgroundSelector(choices);`, -1);
CCSE.ReplaceCodeIntoFunction("Game.Upgrades['Background selector'].choicesPick", "Game.bgType=id;",
'CCSE.SetSelectedBackground(id);', 0);
// Game.Upgrades['Jukebox'].choicesFunction
// Return str to have no effect
if(!Game.customUpgrades['Jukebox'].choicesFunction) Game.customUpgrades['Jukebox'].choicesFunction = [];
CCSE.ReplaceCodeIntoFunction("Game.Upgrades['Jukebox'].choicesFunction", "return",
`// Game.customUpgrades['Jukebox'].choicesFunction injection point 0
for(var i in Game.customUpgrades['Jukebox'].choicesFunction) str = Game.customUpgrades['Jukebox'].choicesFunction[i](str);`, -1);
// Permanent upgrades are tricky
var slots=['Permanent upgrade slot I','Permanent upgrade slot II','Permanent upgrade slot III','Permanent upgrade slot IV','Permanent upgrade slot V'];
for (var i=0;i<slots.length;i++)
{
CCSE.SpliceCodeIntoFunction("Game.Upgrades['" + slots[i] + "'].olddescFunc", 1,
`// ` + slots[i] + ` olddescFunc injection point 0
var id = Game.permanentUpgrades[` + i + `];
for(var i in Game.customPermanentUpgradeId) id = Game.customPermanentUpgradeId[i](` + i + `, id);`,
'Game.Upgrades["' + slots[i] + '"].olddescFunc=' + Game.Upgrades[slots[i]].olddescFunc.toString().replaceAll('Game.permanentUpgrades[i]','id'));
}
}
CCSE.ReplaceUpgrade = function(key){
var temp = '';
var pos = 0;
var proto;
var escKey = key.replace(/'/g, "\\'");
var upgrade = Game.Upgrades[key];
if(!Game.customUpgrades[key]) Game.customUpgrades[key] = {};
CCSE.Backup.customUpgrades[key] = {};
// this.getPrice
// Functions should return a value to multiply the price by (Return 1 to have no effect)
if(!Game.customUpgrades[key].getPrice) Game.customUpgrades[key].getPrice = [];
Game.customUpgrades[key].getPrice.push(CCSE.customUpgradesAllgetPrice);
// this.click
if(!Game.customUpgrades[key].click) Game.customUpgrades[key].click = [];
Game.customUpgrades[key].click.push(CCSE.customUpgradesAllclick);
// this.buy
if(!Game.customUpgrades[key].buy) Game.customUpgrades[key].buy = [];
Game.customUpgrades[key].buy.push(CCSE.customUpgradesAllbuy);
// this.earn
if(!Game.customUpgrades[key].earn) Game.customUpgrades[key].earn = [];
Game.customUpgrades[key].earn.push(CCSE.customUpgradesAllearn);
// this.unearn
if(!Game.customUpgrades[key].unearn) Game.customUpgrades[key].unearn = [];
Game.customUpgrades[key].unearn.push(CCSE.customUpgradesAllunearn);
// this.unlock
if(!Game.customUpgrades[key].unlock) Game.customUpgrades[key].unlock = [];
Game.customUpgrades[key].unlock.push(CCSE.customUpgradesAllunlock);
// this.lose
if(!Game.customUpgrades[key].lose) Game.customUpgrades[key].lose = [];
Game.customUpgrades[key].lose.push(CCSE.customUpgradesAlllose);
// this.toggle
if(!Game.customUpgrades[key].toggle) Game.customUpgrades[key].toggle = [];
Game.customUpgrades[key].toggle.push(CCSE.customUpgradesAlltoggle);
// this.buyFunction
if(!Game.customUpgrades[key].buyFunction) Game.customUpgrades[key].buyFunction = [];
Game.customUpgrades[key].buyFunction.push(CCSE.customUpgradesAllbuyFunction);
if(upgrade.buyFunction){
//upgrade.oldbuyFunction = upgrade.buyFunction;
CCSE.SliceCodeIntoFunction("Game.Upgrades['" + escKey + "'].buyFunction", -1, `
// Game.Upgrades['` + escKey + `'].buyFunction injection point 0
if(Game.customUpgrades[this.name]) for(var i in Game.customUpgrades[this.name].buyFunction) Game.customUpgrades[this.name].buyFunction[i](this);
`);
/* This broke Frozen Cookies
upgrade.buyFunction = function(){
upgrade.oldbuyFunction();
// Game.Upgrades[this.name].buyFunction injection point 0
if(Game.customUpgrades[this.name]) for(var i in Game.customUpgrades[this.name].buyFunction) Game.customUpgrades[this.name].buyFunction[i](this);
}*/
}else{
upgrade.buyFunction = function(){
// Game.Upgrades[this.name].buyFunction injection point 0
if(Game.customUpgrades[this.name]) for(var i in Game.customUpgrades[this.name].buyFunction) Game.customUpgrades[this.name].buyFunction[i](this);
}
CCSE.functionsAltered++;
}
// this.descFunc
// Far too disparate for my desired consistency
if(!Game.customUpgrades[key].descFunc) Game.customUpgrades[key].descFunc = [];
Game.customUpgrades[key].descFunc.push(CCSE.customUpgradesAlldescFunc);
if(upgrade.descFunc){
//eval('upgrade.olddescFunc = ' + upgrade.descFunc.toString());
upgrade.olddescFunc = upgrade.descFunc;
upgrade.descFunc = function(){
var desc = this.olddescFunc();
if(Game.customUpgrades[this.name]) for(var i in Game.customUpgrades[this.name].descFunc) desc = Game.customUpgrades[this.name].descFunc[i](this, desc);
return desc;
}
}else{
upgrade.descFunc = function(){
var desc = this.ddesc ? this.ddesc : this.desc;
// Game.Upgrades['` + escKey + `'].descFunc injection point 0
if(Game.customUpgrades[this.name]) for(var i in Game.customUpgrades[this.name].descFunc) desc = Game.customUpgrades[this.name].descFunc[i](this, desc);
return desc;
}
}
for(var i in CCSE.customReplaceUpgrade) CCSE.customReplaceUpgrade[i](key, upgrade);
}
if(!CCSE.customReplaceAchievement) CCSE.customReplaceAchievement = [];
CCSE.ReplaceAchievementsStart = function(){
if(!Game.customAchievementsAll) Game.customAchievementsAll = {};
if(!Game.customAchievementsAll.click) Game.customAchievementsAll.click = [];
CCSE.customAchievementsAllclick = function(me){
for(var i in Game.customAchievementsAll.click) Game.customAchievementsAll.click[i](me);
}
if(!Game.customAchievements) Game.customAchievements = {};
CCSE.Backup.customAchievements = {};
CCSE.i = 0;
}
CCSE.ReplaceAchievements = function(){
var time = Date.now();
for(var i = CCSE.i; i < Game.AchievementsN; i++){
CCSE.ReplaceAchievement(Game.AchievementsById[i].name);
if(Date.now() > time + 500 / Game.fps) break;
}
CCSE.i = i + 1;
if(CCSE.i < Game.AchievementsN){
// Didn't do all of them. Wait for priority and go again
requestAnimationFrame(CCSE.ReplaceAchievements);
}else{
// Continue on
requestAnimationFrame(CCSE.playlist[CCSE.track++]);
}
}
CCSE.ReplaceAchievement = function(key){
var escKey = key.replace(/'/g, "\\'");
var achievement = Game.Achievements[key];
if(!Game.customAchievements[key]) Game.customAchievements[key] = {};
CCSE.Backup.customAchievements[key] = {};
// this.click
if(!Game.customAchievements[key].click) Game.customAchievements[key].click = [];
Game.customAchievements[key].click.push(CCSE.customAchievementsAllclick);
CCSE.SliceCodeIntoFunction("Game.Achievements['" + escKey + "'].click", -1, `
// Game.Achievements['` + escKey + `'].click injection point 0
if(Game.customAchievements[this.name]) for(var i in Game.customAchievements[this.name].click) Game.customAchievements[this.name].click[i](this);
`);
for(var i in CCSE.customReplaceAchievement) CCSE.customReplaceAchievement[i](key, achievement);
}
CCSE.AddCCSEStyles = function(){
CCSE.AddStyles(`input.checkbox {
margin: 4px;
border: 3px solid transparent;
border-image: url(img/frameBorder.png) 3 round;
border-radius: 2px;
box-shadow: 0px 0px 1px 2px rgba(0,0,0,0.5), 0px 2px 4px rgba(0,0,0,0.25), 0px 0px 6px 1px rgba(0,0,0,0.5) inset;
transition: opacity 0.1s ease-out;
vertical-align: middle;
min-width: 2rem;
min-height: 2rem;
text-align: center;
background: #000 url(img/darkNoise.jpg);
background-image: url(img/shadedBordersSoft.png),url(img/darkNoise.jpg);
background-size: 100% 100%,auto;
background-color: #000;
text-shadow: 0px 1px 1px #000;
color: #ccc;
line-height: 100%;
display: inline-block;
font-size: 12px;
text-decoration: none;
-webkit-appearance: none;
position: relative;
}
input.checkbox:checked:after {
content: '\\01F36A';
font-size: 1.25rem;
margin: auto;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
text-align: center;
}`);
}
/*=====================================================================================
Menu functions
=======================================================================================*/
CCSE.AppendOptionsMenu = function(inp, style = 1){
// Accepts inputs of either string or div
// Choose div class based on given style. A style of 0 will have no class.
var divClass;
switch (style) {
case 1:
divClass = "block";
break;
case 2:
divClass = "framed";
break;
}
var template = document.createElement('template');
template.innerHTML = '<div ' + (divClass ? `class="${ divClass }" ` : '') + 'style="padding:0px;margin:8px 4px;"><div class="subsection" style="padding:0px;"></div></div>';
var div = template.content;
var div2 = div.children[0].children[0];
if(typeof inp == 'string'){
div2.innerHTML = inp;
}
else{
div2.appendChild(inp);
}
var menu = l('menu');
if(menu){
var padding = menu.childNodes;
padding = padding[padding.length - 1];
if(padding){
menu.insertBefore(div, padding);
} else {
menu.appendChild(div);
}
}
}
CCSE.AppendCollapsibleOptionsMenu = function(title, body){
// Title must be a string. Body may be either string or div
var titleDiv = document.createElement('div');
titleDiv.className = 'title';
titleDiv.textContent = title + ' ';
if(CCSE.collapseMenu[title] === undefined) CCSE.collapseMenu[title] = 0;
// Stolen wholesale from Cookie Monster
var span = document.createElement('span');
span.style.cursor = 'pointer';
span.style.display = 'inline-block';
span.style.height = '14px';
span.style.width = '14px';
span.style.borderRadius = '7px';
span.style.textAlign = 'center';
span.style.backgroundColor = '#C0C0C0';
span.style.color = 'black';
span.style.fontSize = '13px';
span.style.verticalAlign = 'middle';
span.textContent = (CCSE.collapseMenu[title] ? '+' : '-');
span.addEventListener("click", function(){
CCSE.ToggleCollabsibleMenu(title);
Game.UpdateMenu();
}) ;
titleDiv.appendChild(span);
var bodyDiv;
if(typeof body == 'string'){
bodyDiv = document.createElement('div');
bodyDiv.innerHTML = body;
}
else{
bodyDiv = body;
}
var div = document.createElement('div');
div.appendChild(titleDiv);
if(!CCSE.collapseMenu[title]) div.appendChild(bodyDiv);
CCSE.AppendOptionsMenu(div);
}
CCSE.ToggleCollabsibleMenu = function(title) {
if(CCSE.collapseMenu[title] == 0){
CCSE.collapseMenu[title]++;
}
else{
CCSE.collapseMenu[title]--;
}
}
CCSE.AppendStatsGeneral = function(inp){
// Accepts inputs of either string or div
var div;
if(typeof inp == 'string'){
div = document.createElement('div');
div.innerHTML = inp;
}
else{
div = inp;
}
var general = l('statsGeneral');
if(general) general.appendChild(div);
}
CCSE.AppendStatsSpecial = function(inp){
// Accepts inputs of either string or div
var div;
if(typeof inp == 'string'){
div = document.createElement('div');
div.innerHTML = inp;
}
else{
div = inp;
}
var special = l('statsSpecial');
if(!special){
subsections = l('menu').getElementsByClassName('subsection');
special = document.createElement('div');
special.className = 'subsection';
special.innerHTML = '<div class="title">' + loc('Special') + '</div>';
l('menu').insertBefore(special, subsections[1]);
}
if(special) special.appendChild(div);
}
CCSE.AppendStatsVersionNumber = function(modName, versionString){
var general = l('statsGeneral');
var str = '<b>' + modName + ':</b> ' + versionString;
var div = document.createElement('div');
div.className = 'listing';
div.innerHTML = str;
if(general) general.parentNode.appendChild(div);
}
CCSE.GetMenuString = function(){
var str = '<div class="listing">' +
CCSE.MenuHelper.ActionButton("CCSE.ExportSave();", 'Export custom save') +
CCSE.MenuHelper.ActionButton("CCSE.ImportSave();", 'Import custom save') +
'<label>Back up data added by mods and managed by CCSE</label></div>';
str += '<div class="listing">' + CCSE.MenuHelper.CheckBox(CCSE.config, 'showVersionNo', 'showVersionNoButton', 'Version Number ON', 'Version Number OFF', 'CCSE.togglePref') + '<label>Show the version number of CCSE in the bottom left of the screen.</label></div>';
return str;
}
CCSE.PrependCollapsibleInfoMenu = function(title, body){
// Title must be a string. Body may be either string or div
var titleDiv = document.createElement('div');
titleDiv.className = 'title';
titleDiv.textContent = title + ' ';
if(CCSE.collapseMenu[title + 'info'] === undefined) CCSE.collapseMenu[title + 'info'] = 0;
// Stolen wholesale from Cookie Monster
var span = document.createElement('span');
span.style.cursor = 'pointer';
span.style.display = 'inline-block';
span.style.height = '14px';
span.style.width = '14px';
span.style.borderRadius = '7px';
span.style.textAlign = 'center';
span.style.backgroundColor = '#C0C0C0';
span.style.color = 'black';
span.style.fontSize = '13px';
span.style.verticalAlign = 'middle';
span.textContent = (CCSE.collapseMenu[title + 'info'] ? '+' : '-');
span.onclick = function(){CCSE.ToggleCollabsibleMenu(title + 'info'); Game.UpdateMenu();};
titleDiv.appendChild(span);
var bodyDiv;
if(typeof body == 'string'){
bodyDiv = document.createElement('div');
bodyDiv.innerHTML = body;
}
else{
bodyDiv = body;
}
var div = document.createElement('div');
div.appendChild(titleDiv);
div.classList.add('subsection');
if(!CCSE.collapseMenu[title + 'info']) div.appendChild(bodyDiv);
var menu = l('menu');
if(menu){
var about = menu.getElementsByClassName('subsection')[0];
if(about){
about.parentNode.insertBefore(div, about);
}
}
}
CCSE.MenuHelper = {
ActionButton: (action, text) =>
'<a class="smallFancyButton option"' +
`${ Game.clickStr }="${ action } PlaySound('snd/tick.mp3');">${ text }</a>`,
Header: (text, id) =>
'<div class="listing optionHeader" ' + (id ? `id="${ id }" ` : '') + `style="padding: 5px 16px; opacity: 0.7; font-size: 17px; font-family: Kavoon, Georgia, serif;">${ text }</div>`,
InputBox: (id, width, value, onChange) =>
`<input type="text" id="${ id }" class="option" style="width:${ width }px;" value="${ value }" onChange="${ onChange }">`,
PasswordBox: (id, width, value, onChange) =>
`<input type="password" id="${ id }" class="option" style="width:${ width }px;" value="${ value }" onChange="${ onChange }">`,
SearchBox: (id, width, value, onChange, placeholder = 'Search') =>
`<input type="search" id="${ id }" class="option" style="width:${ width }px;" value="${ value }" onChange="${ onChange }" placeholder="${ placeholder }">`,
TinyIcon: (icon) =>
'<div class="icon" style="vertical-align:middle;display:inline-block;margin:-16px;transform:scale(0.5);' +
(icon[2] ? `background-image:url(${ icon[2] });` : '') +
`background-position:${ -icon[0] * 48 }px ${ -icon[1] * 48 }px;"></div>`,
Slider: (slider, leftText, rightText, startValueFunction, callback = '', min = 0, max = 100, step = 1) => {
var value = startValueFunction();
rightText = rightText.replace('[$]', value);
return `<div class="sliderBox"><div style="float:left;" class="smallFancyButton">${ leftText }</div>` +
`<div style="float:right;" class="smallFancyButton" id="${ slider }RightText">${ rightText }</div>` +
`<input type="range" id="${ slider }" class="slider" style="clear:both;" min="${ min }" max="${ max }" step="${ step }"` +
` value="${ value }" onchange="${ callback }" oninput="${ callback }" onmouseup="PlaySound('snd/tick.mp3');"></div>`
},
ToggleButton: (config, prefName, button, on, off, callback, invert) => {
var invert = invert ? 1 : 0;
if(!callback) callback = '';
else callback += `('${ prefName }', '${ button }', '${ on.replace("'","\\'") }', '${ off.replace("'","\\'") }', '${ invert }');`;
callback += "PlaySound('snd/tick.mp3');";
var className = `smallFancyButton prefButton option${ (config[prefName]^invert) ? '' : ' off' }`;
return `<a id="${ button }" class="${ className }" ${ Game.clickStr }="${ callback }">${ config[prefName] ? on : off }</a>`;
},
CheckBox: (config, prefName, button, on, off, callback, invert) => {
var invert = invert ? 1 : 0;
if(!callback) callback = '';
else callback += `('${ prefName }', '${ button }', '${ on.replace("'","\\'") }', '${ off.replace("'","\\'") }', '${ invert }');`;
callback += "PlaySound('snd/tick.mp3');";
var checked = config[prefName] ? ' checked="checked"' : '';
var className = `checkbox checkbox${ (config[prefName]^invert) ? 'on' : ' off' }`;
return `<input type="checkbox" id="${ button }" class="${ className }" ${ checked } ${ Game.clickStr }="${ callback }">` +
`<label id="${ button }_label" for="${ button }">${ config[prefName] ? on : off }</label>`;
}
}
CCSE.togglePref = function(prefName, button, on, off, invert){
if (CCSE.config[prefName]){
l(button).removeAttribute('checked');
l(button + '_label').innerHTML = off;
CCSE.config[prefName] = 0;
}else{
l(button).setAttribute('checked','checked')
l(button + '_label').innerHTML = on;
CCSE.config[prefName] = 1;
}
CCSE.applyPref(prefName);
}
/*=====================================================================================
Minigames
=======================================================================================*/
CCSE.MinigameReplacer = function(func, objKey){
if(!Game.customMinigameOnLoad) Game.customMinigameOnLoad = {};
if(!Game.customMinigameOnLoad[objKey]) Game.customMinigameOnLoad[objKey] = [];
var me = Game.Objects[objKey];
if(me.minigameLoaded) func(me, 'minigameScript-' + me.id);
Game.customMinigameOnLoad[objKey].push(func);
}
CCSE.ReplaceGrimoire = function(){
CCSE.functionsTotal += 11;
var objKey = "Wizard tower";
var M = Game.Objects[objKey].minigame;
var preEvalScript = "var M = Game.Objects['" + objKey + "'].minigame;";
// M.computeMagicM
if(!Game.customMinigame[objKey].computeMagicM) Game.customMinigame[objKey].computeMagicM = [];
CCSE.SliceCodeIntoFunction('M.computeMagicM', -1, `
// M.computeMagicM injection point 0
for(var i in Game.customMinigame['` + objKey + `'].computeMagicM) Game.customMinigame['` + objKey + `'].computeMagicM[i]();
`, preEvalScript);
// M.getFailChance
// functions should return a value to multiply failChance by (Return 1 for no effect)
if(!Game.customMinigame[objKey].getFailChance) Game.customMinigame[objKey].getFailChance = [];
CCSE.ReplaceCodeIntoFunction('M.getFailChance', 'return', `
// M.getFailChance injection point 0
for(var i in Game.customMinigame['` + objKey + `'].getFailChance) failChance *= Game.customMinigame['` + objKey + `'].getFailChance[i](spell);`, -1,
preEvalScript);
// M.castSpell
// I'm open to suggestions
// M.getSpellCost
// functions should return a value to multiply out by (Return 1 for no effect)
if(!Game.customMinigame[objKey].getSpellCost) Game.customMinigame[objKey].getSpellCost = [];
CCSE.ReplaceCodeIntoFunction('M.getSpellCost', 'return', `
// M.getSpellCost injection point 0
for(var i in Game.customMinigame['` + objKey + `'].getSpellCost) out *= Game.customMinigame['` + objKey + `'].getSpellCost[i](spell);`, -1,
preEvalScript);
// M.getSpellCostBreakdown
// functions should return a string value (Return str for no effect)
if(!Game.customMinigame[objKey].getSpellCostBreakdown) Game.customMinigame[objKey].getSpellCostBreakdown = [];
CCSE.ReplaceCodeIntoFunction('M.getSpellCostBreakdown', 'return', `
// M.getSpellCostBreakdown injection point 0
for(var i in Game.customMinigame['` + objKey + `'].getSpellCostBreakdown) str = Game.customMinigame['` + objKey + `'].getSpellCostBreakdown[i](spell, str);`, -1,
preEvalScript);
// M.spellTooltip
// functions should return a string value (Return str for no effect)
if(!Game.customMinigame[objKey].spellTooltip) Game.customMinigame[objKey].spellTooltip = [];
CCSE.ReplaceCodeIntoFunction('M.spellTooltip', 'background-position', `' + (me.icon[2]?'background-image:url('+me.icon[2]+');':'') + 'background-position`, 0, preEvalScript);
CCSE.ReplaceCodeIntoFunction('M.spellTooltip', 'return str', `
// M.spellTooltip injection point 0
for(var i in Game.customMinigame['` + objKey + `'].spellTooltip) str = Game.customMinigame['` + objKey + `'].spellTooltip[i](id, str);`, -1,
preEvalScript);
// M.refillTooltip
// functions should return a string value (Return str for no effect)
if(!Game.customMinigame[objKey].refillTooltip) Game.customMinigame[objKey].refillTooltip = [];
CCSE.ReplaceCodeIntoFunction('M.refillTooltip', 'return', 'var str = ', 0,
preEvalScript);
CCSE.SliceCodeIntoFunction('M.refillTooltip', -1, `
// M.refillTooltip injection point 0
for(var i in Game.customMinigame['` + objKey + `'].refillTooltip) str = Game.customMinigame['` + objKey + `'].refillTooltip[i](id, str);
return str;
`, preEvalScript);
// M.spells['hand of fate'].win
// functions should push a value to choices
if(!Game.customMinigame[objKey].fateWin) Game.customMinigame[objKey].fateWin = [];
CCSE.ReplaceCodeIntoFunction('M.spells["hand of fate"].win', 'newShimmer.force',
`// M.spells["hand of fate"].win injection point 0
for(var i in Game.customMinigame['` + objKey + `'].fateWin) Game.customMinigame['` + objKey + `'].fateWin[i](choices);`, -1,
preEvalScript);
// M.spells['hand of fate'].fail
// functions should push a value to choices
if(!Game.customMinigame[objKey].fateFail) Game.customMinigame[objKey].fateFail = [];
CCSE.ReplaceCodeIntoFunction('M.spells["hand of fate"].fail', 'newShimmer.force',
`// M.spells["hand of fate"].fail injection point 0
for(var i in Game.customMinigame['` + objKey + `'].fateFail) Game.customMinigame['` + objKey + `'].fateFail[i](choices);`, -1,
preEvalScript);
// M.launch
if(M.launch.toString().indexOf('// M.launch injection point 0') == -1){
CCSE.SliceCodeIntoFunction('M.launch', -1, `
// M.launch injection point 0
for(var i in Game.customMinigameOnLoad['` + objKey + `']) Game.customMinigameOnLoad['` + objKey + `'][i](M.parent);
`, preEvalScript);
}
}
CCSE.ReplaceMarket = function(){
CCSE.functionsTotal += 24;
var objKey = "Bank";
var M = Game.Objects[objKey].minigame;
var preEvalScript = "var M = Game.Objects['" + objKey + "'].minigame;";
// M.goodTooltip
// functions should return a string value (Return str for no effect)
if(!Game.customMinigame[objKey].goodTooltip) Game.customMinigame[objKey].goodTooltip = [];
CCSE.ReplaceCodeIntoFunction('M.goodTooltip', 'return str', `
// M.goodTooltip injection point 0
for(var i in Game.customMinigame['` + objKey + `'].goodTooltip) str = Game.customMinigame['` + objKey + `'].goodTooltip[i](id, str);`, -1,
preEvalScript);
// M.tradeTooltip
// functions should return a string value (Return str for no effect)
if(!Game.customMinigame[objKey].tradeTooltip) Game.customMinigame[objKey].tradeTooltip = [];
CCSE.ReplaceCodeIntoFunction('M.tradeTooltip', 'return str', `
// M.tradeTooltip injection point 0
for(var i in Game.customMinigame['` + objKey + `'].tradeTooltip) str = Game.customMinigame['` + objKey + `'].tradeTooltip[i](id, n, str);`, -1,
preEvalScript);
// M.goodDelta
// functions should return a value to multiply val by (Return 1 for no effect)
if(!Game.customMinigame[objKey].goodDelta) Game.customMinigame[objKey].goodDelta = [];
CCSE.ReplaceCodeIntoFunction('M.goodDelta', 'return', `
// M.goodDelta injection point 0
for(var i in Game.customMinigame['` + objKey + `'].goodDelta) val *= Game.customMinigame['` + objKey + `'].goodDelta[i](id, back);`, -1,
preEvalScript);
// M.getGoodMaxStock
// functions should return an int value (Return ret for no effect)
if(!Game.customMinigame[objKey].getGoodMaxStock) Game.customMinigame[objKey].getGoodMaxStock = [];
CCSE.ReplaceCodeIntoFunction('M.getGoodMaxStock', 'return', 'var ret = ', 0,
preEvalScript);
CCSE.SliceCodeIntoFunction('M.getGoodMaxStock', -1, `
// M.getGoodMaxStock injection point 0
for(var i in Game.customMinigame['` + objKey + `'].getGoodMaxStock) ret = Game.customMinigame['` + objKey + `'].getGoodMaxStock[i](good, ret);
return ret;
`, preEvalScript);
// M.getGoodPrice
// functions should return a value to multiply val by (Return 1 for no effect)
if(!Game.customMinigame[objKey].getGoodPrice) Game.customMinigame[objKey].getGoodPrice = [];
CCSE.ReplaceCodeIntoFunction('M.getGoodPrice', 'return good.val;',
`var val = good.val;
// M.getGoodPrice injection point 0
for(var i in Game.customMinigame['` + objKey + `'].getGoodPrice) val *= Game.customMinigame['` + objKey + `'].getGoodPrice[i](good);
return val;`, 0,
preEvalScript);
// M.buyGood
// functions that run when a good is purchased
if(!Game.customMinigame[objKey].buyGood) Game.customMinigame[objKey].buyGood = [];
CCSE.ReplaceCodeIntoFunction('M.buyGood', 'return true', `
// M.buyGood injection point 0
for(var i in Game.customMinigame['` + objKey + `'].buyGood) Game.customMinigame['` + objKey + `'].buyGood[i](id, n);`, -1,
preEvalScript);
// M.sellGood
// functions that run when a good is sold
if(!Game.customMinigame[objKey].sellGood) Game.customMinigame[objKey].sellGood = [];
CCSE.ReplaceCodeIntoFunction('M.sellGood', 'return true', `
// M.sellGood injection point 0
for(var i in Game.customMinigame['` + objKey + `'].sellGood) Game.customMinigame['` + objKey + `'].sellGood[i](id, n);`, -1,
preEvalScript);
// M.getRestingVal
// functions should return a number value (Return ret for no effect)
if(!Game.customMinigame[objKey].getRestingVal) Game.customMinigame[objKey].getRestingVal = [];
CCSE.ReplaceCodeIntoFunction('M.getRestingVal', 'return', 'var ret = ', 0,
preEvalScript);
CCSE.ReplaceCodeIntoFunction('M.getRestingVal', '}', `
// M.getRestingVal injection point 0
for(var i in Game.customMinigame['` + objKey + `'].getRestingVal) ret = Game.customMinigame['` + objKey + `'].getRestingVal[i](id, ret);
return ret;
`, -1, preEvalScript);
// M.updateGoodStyle
if(!Game.customMinigame[objKey].updateGoodStyle) Game.customMinigame[objKey].updateGoodStyle = [];
CCSE.SliceCodeIntoFunction('M.updateGoodStyle', -1, `
// M.updateGoodStyle injection point 0
for(var i in Game.customMinigame['` + objKey + `'].updateGoodStyle) Game.customMinigame['` + objKey + `'].updateGoodStyle[i](id, me);
`, preEvalScript);
// M.officeTooltip
// functions should return a string value (Return str for no effect)
if(!Game.customMinigame[objKey].officeTooltip) Game.customMinigame[objKey].officeTooltip = [];
CCSE.ReplaceCodeIntoFunction('M.officeTooltip', 'return str', `
// M.officeTooltip injection point 0
for(var i in Game.customMinigame['` + objKey + `'].officeTooltip) str = Game.customMinigame['` + objKey + `'].officeTooltip[i](me, str);`, -1,
preEvalScript);
// M.getMaxBrokers
// functions should return an int value (Return ret for no effect)
if(!Game.customMinigame[objKey].getMaxBrokers) Game.customMinigame[objKey].getMaxBrokers = [];
CCSE.ReplaceCodeIntoFunction('M.getMaxBrokers', 'return', 'var ret = ', 0,
preEvalScript);
CCSE.ReplaceCodeIntoFunction('M.getMaxBrokers', '}', `
// M.getMaxBrokers injection point 0
for(var i in Game.customMinigame['` + objKey + `'].getMaxBrokers) ret = Game.customMinigame['` + objKey + `'].getMaxBrokers[i](ret);
return ret;
`, -1, preEvalScript);
// M.getBrokerPrice
// functions should return an int value (Return ret for no effect)
if(!Game.customMinigame[objKey].getBrokerPrice) Game.customMinigame[objKey].getBrokerPrice = [];
CCSE.ReplaceCodeIntoFunction('M.getBrokerPrice', 'return', 'var ret = ', 0,
preEvalScript);
CCSE.ReplaceCodeIntoFunction('M.getBrokerPrice', '}', `
// M.getBrokerPrice injection point 0
for(var i in Game.customMinigame['` + objKey + `'].getBrokerPrice) ret = Game.customMinigame['` + objKey + `'].getBrokerPrice[i](ret);
return ret;
`, -1, preEvalScript);
// M.brokersTooltip
// functions should return a string value (Return str for no effect)
if(!Game.customMinigame[objKey].brokersTooltip) Game.customMinigame[objKey].brokersTooltip = [];
CCSE.ReplaceCodeIntoFunction('M.brokersTooltip', 'return str', `
// M.brokersTooltip injection point 0
for(var i in Game.customMinigame['` + objKey + `'].brokersTooltip) str = Game.customMinigame['` + objKey + `'].brokersTooltip[i](str);`, -1,
preEvalScript);
// M.loanTooltip
// functions should return a string value (Return str for no effect)
if(!Game.customMinigame[objKey].loanTooltip) Game.customMinigame[objKey].loanTooltip = [];
CCSE.ReplaceCodeIntoFunction('M.loanTooltip', 'return str', `
// M.loanTooltip injection point 0
for(var i in Game.customMinigame['` + objKey + `'].loanTooltip) str = Game.customMinigame['` + objKey + `'].loanTooltip[i](id, loan, str);`, -1,
preEvalScript);
// M.takeLoan
// Will be added if given a specific request
// M.getOppSlots
// functions should return a value to add to slots (Return 0 for no effect)
if(!Game.customMinigame[objKey].getOppSlots) Game.customMinigame[objKey].getOppSlots = [];
CCSE.ReplaceCodeIntoFunction('M.getOppSlots', 'return', `
// M.getOppSlots injection point 0
for(var i in Game.customMinigame['` + objKey + `'].getOppSlots) slots += Game.customMinigame['` + objKey + `'].getOppSlots[i]();`, -1,
preEvalScript);
// M.oppTooltip
// functions should return a string value (Return str for no effect)
if(!Game.customMinigame[objKey].oppTooltip) Game.customMinigame[objKey].oppTooltip = [];
CCSE.ReplaceCodeIntoFunction('M.oppTooltip', 'return str', `
// M.oppTooltip injection point 0
for(var i in Game.customMinigame['` + objKey + `'].oppTooltip) str = Game.customMinigame['` + objKey + `'].oppTooltip[i](str);`, -1,
preEvalScript);
// M.refillTooltip
// functions should return a string value (Return str for no effect)
if(!Game.customMinigame[objKey].refillTooltip) Game.customMinigame[objKey].refillTooltip = [];
CCSE.ReplaceCodeIntoFunction('M.refillTooltip', 'return', 'var str = ', 0,
preEvalScript);
CCSE.SliceCodeIntoFunction('M.refillTooltip', -1, `
// M.refillTooltip injection point 0
for(var i in Game.customMinigame['` + objKey + `'].refillTooltip) str = Game.customMinigame['` + objKey + `'].refillTooltip[i](id, str);
return str;
`, preEvalScript);
// M.tick
if(!Game.customMinigame[objKey].tick) Game.customMinigame[objKey].tick = [];
CCSE.SliceCodeIntoFunction('M.tick', -1, `
// M.tick injection point 0
for(var i in Game.customMinigame['` + objKey + `'].tick) Game.customMinigame['` + objKey + `'].tick[i]();
`, preEvalScript);
// M.launch
if(M.launch.toString().indexOf('// M.launch injection point 0') == -1){
CCSE.SliceCodeIntoFunction('M.launch', -1, `
// M.launch injection point 0
for(var i in Game.customMinigameOnLoad['` + objKey + `']) Game.customMinigameOnLoad['` + objKey + `'][i](M.parent);
`, preEvalScript);
}
}
CCSE.ReplacePantheon = function(){
CCSE.functionsTotal += 12;
var objKey = "Temple";
var M = Game.Objects[objKey].minigame;
var preEvalScript = "var M = Game.Objects['" + objKey + "'].minigame;";
// M.godTooltip
// functions should return a string value (Return str for no effect)
if(!Game.customMinigame[objKey].godTooltip) Game.customMinigame[objKey].godTooltip = [];
CCSE.ReplaceCodeIntoFunction('M.godTooltip', 'background-position', `' + (me.icon[2]?'background-image:url('+me.icon[2]+');':'') + 'background-position`, 0, preEvalScript);
CCSE.ReplaceCodeIntoFunction('M.godTooltip', 'return str', `
// M.godTooltip injection point 0
for(var i in Game.customMinigame['` + objKey + `'].godTooltip) str = Game.customMinigame['` + objKey + `'].godTooltip[i](id, str);`, -1,
preEvalScript);
// M.slotTooltip
// functions should return a string value (Return str for no effect)
if(!Game.customMinigame[objKey].slotTooltip) Game.customMinigame[objKey].slotTooltip = [];
CCSE.ReplaceCodeIntoFunction('M.slotTooltip', 'background-position', `' + (me.icon[2]?'background-image:url('+me.icon[2]+');':'') + 'background-position`, 0, preEvalScript);
CCSE.ReplaceCodeIntoFunction('M.slotTooltip', 'return str', `
// M.slotTooltip injection point 0
for(var i in Game.customMinigame['` + objKey + `'].slotTooltip) str = Game.customMinigame['` + objKey + `'].slotTooltip[i](id, str);`, -1,
preEvalScript);
// M.useSwap
if(!Game.customMinigame[objKey].useSwap) Game.customMinigame[objKey].useSwap = [];
CCSE.SliceCodeIntoFunction('M.useSwap', -1, `
// M.useSwap injection point 0
for(var i in Game.customMinigame['` + objKey + `'].useSwap) Game.customMinigame['` + objKey + `'].useSwap[i](n);
`, preEvalScript);
// M.slotGod
if(!Game.customMinigame[objKey].slotGod) Game.customMinigame[objKey].slotGod = [];
CCSE.SliceCodeIntoFunction('M.slotGod', -1, `
// M.slotGod injection point 0
for(var i in Game.customMinigame['` + objKey + `'].slotGod) Game.customMinigame['` + objKey + `'].slotGod[i](god, slot);
`, preEvalScript);
// M.dragGod
if(!Game.customMinigame[objKey].dragGod) Game.customMinigame[objKey].dragGod = [];
CCSE.SliceCodeIntoFunction('M.dragGod', -1, `
// M.dragGod injection point 0
for(var i in Game.customMinigame['` + objKey + `'].dragGod) Game.customMinigame['` + objKey + `'].dragGod[i](what);
`, preEvalScript);
// M.dropGod
if(!Game.customMinigame[objKey].dropGod) Game.customMinigame[objKey].dropGod = [];
CCSE.SliceCodeIntoFunction('M.dropGod', -1, `
// M.dropGod injection point 0
for(var i in Game.customMinigame['` + objKey + `'].dropGod) Game.customMinigame['` + objKey + `'].dropGod[i]();
`, preEvalScript);
// M.hoverSlot
if(!Game.customMinigame[objKey].hoverSlot) Game.customMinigame[objKey].hoverSlot = [];
CCSE.SliceCodeIntoFunction('M.hoverSlot', -1, `
// M.hoverSlot injection point 0
for(var i in Game.customMinigame['` + objKey + `'].hoverSlot) Game.customMinigame['` + objKey + `'].hoverSlot[i](what);
`, preEvalScript);
// Game.hasGod
// Game.forceUnslotGod
// M.refillTooltip
// functions should return a string value (Return str for no effect)
if(!Game.customMinigame[objKey].refillTooltip) Game.customMinigame[objKey].refillTooltip = [];
CCSE.ReplaceCodeIntoFunction('M.refillTooltip', 'return', 'var str = ', 0,
preEvalScript);
CCSE.SliceCodeIntoFunction('M.refillTooltip', -1, `
// M.refillTooltip injection point 0
for(var i in Game.customMinigame['` + objKey + `'].refillTooltip) str = Game.customMinigame['` + objKey + `'].refillTooltip[i](id, str);
return str;
`, preEvalScript);
// M.launch
if(M.launch.toString().indexOf('// M.launch injection point 0') == -1){
CCSE.SliceCodeIntoFunction('M.launch', -1, `
// M.launch injection point 0
for(var i in Game.customMinigameOnLoad['` + objKey + `']) Game.customMinigameOnLoad['` + objKey + `'][i](M.parent);
`, preEvalScript);
}
}
CCSE.ReplaceGarden = function(){
CCSE.functionsTotal += 33;
var objKey = "Farm";
var M = Game.Objects[objKey].minigame;
var preEvalScript = "var M = Game.Objects['" + objKey + "'].minigame;";
var temp = '';
// M.logic (plantAging)
// return age to have no effect
if(!Game.customMinigame[objKey].plantAging) Game.customMinigame[objKey].plantAging = [];
temp = M.logic.toString();
temp = temp.replace('tile[1]+=', 'var age = ');
temp = temp.replace('tile[1]=Math.max(tile[1],0);',
`// M.logic injection point 0
for(var i in Game.customMinigame['` + objKey + `'].plantAging) age = Game.customMinigame['` + objKey + `'].plantAging[i](age, tile, x, y);
tile[1] += age;
tile[1]=Math.max(tile[1],0);`);
eval('M.logic=' + temp);
// M.getUnlockedN
if(!Game.customMinigame[objKey].getUnlockedN) Game.customMinigame[objKey].getUnlockedN = [];
CCSE.ReplaceCodeIntoFunction('M.getUnlockedN', 'return',
`// M.getUnlockedN injection point 0
for(var i in Game.customMinigame['` + objKey + `'].getUnlockedN) Game.customMinigame['` + objKey + `'].getUnlockedN[i]();`, -1,
preEvalScript);
// M.dropUpgrade
if(!Game.customMinigame[objKey].dropUpgrade) Game.customMinigame[objKey].dropUpgrade = [];
CCSE.SliceCodeIntoFunction('M.dropUpgrade', -1,
`// M.dropUpgrade injection point 0
for(var i in Game.customMinigame['` + objKey + `'].dropUpgrade) Game.customMinigame['` + objKey + `'].dropUpgrade[i](upgrade, rate);
`, preEvalScript);
// M.computeMatures
if(!Game.customMinigame[objKey].computeMatures) Game.customMinigame[objKey].computeMatures = [];
CCSE.SliceCodeIntoFunction('M.computeMatures', -1,
`// M.computeMatures injection point 0
for(var i in Game.customMinigame['` + objKey + `'].computeMatures) Game.customMinigame['` + objKey + `'].computeMatures[i](mult);
`, preEvalScript);
// M.getMuts
// functions should push mutations to muts
if(!Game.customMinigame[objKey].getMuts) Game.customMinigame[objKey].getMuts = [];
CCSE.ReplaceCodeIntoFunction('M.getMuts', 'return',
`// M.getMuts injection point 0
for(var i in Game.customMinigame['` + objKey + `'].getMuts) Game.customMinigame['` + objKey + `'].getMuts[i](neighs, neighsM, muts);`, -1,
preEvalScript);
// M.computeBoostPlot
// You're going to have to use MAXIMUM EFFORT
if(!Game.customMinigame[objKey].computeBoostPlot) Game.customMinigame[objKey].computeBoostPlot = [];
CCSE.SliceCodeIntoFunction('M.computeBoostPlot', -1,
`// M.computeBoostPlot injection point 0
for(var i in Game.customMinigame['` + objKey + `'].computeBoostPlot) Game.customMinigame['` + objKey + `'].computeBoostPlot[i]();
`, preEvalScript);
// M.computeEffs
// functions should change effs (or not, I'm a comment, not a cop)
if(!Game.customMinigame[objKey].computeEffs) Game.customMinigame[objKey].computeEffs = [];
CCSE.ReplaceCodeIntoFunction('M.computeEffs', 'M.effs=effs;',
`// M.computeEffs injection point 0
for(var i in Game.customMinigame['` + objKey + `'].computeEffs) Game.customMinigame['` + objKey + `'].computeEffs[i](effs);`, -1,
preEvalScript);
// M.tools TODO
// M.getCost TODO
// M.getPlantDesc
// Return ret for no effect
if(!Game.customMinigame[objKey].getPlantDesc) Game.customMinigame[objKey].getPlantDesc = [];
CCSE.ReplaceCodeIntoFunction('M.getPlantDesc', 'return', 'var ret = ', 0,
preEvalScript);
CCSE.SliceCodeIntoFunction('M.getPlantDesc', -1,
`// M.getPlantDesc injection point 0
for(var i in Game.customMinigame['` + objKey + `'].getPlantDesc) ret = Game.customMinigame['` + objKey + `'].getPlantDesc[i](me, ret);
return ret;
`, preEvalScript);
// M.soilTooltip
// Return str for no effect
if(!Game.customMinigame[objKey].soilTooltip) Game.customMinigame[objKey].soilTooltip = [];
CCSE.ReplaceCodeIntoFunction('M.soilTooltip', 'return str;',
`// M.soilTooltip injection point 0
for(var i in Game.customMinigame['` + objKey + `'].soilTooltip) str = Game.customMinigame['` + objKey + `'].soilTooltip[i](id, str);`, -1,
preEvalScript);
// M.seedTooltip
// Return str for no effect
if(!Game.customMinigame[objKey].seedTooltip) Game.customMinigame[objKey].seedTooltip = [];
CCSE.ReplaceCodeIntoFunction('M.seedTooltip', 'return str;',
`// M.seedTooltip injection point 0
for(var i in Game.customMinigame['` + objKey + `'].seedTooltip) str = Game.customMinigame['` + objKey + `'].seedTooltip[i](id, str);`, -1,
preEvalScript);
// M.toolTooltip
// Return str for no effect
if(!Game.customMinigame[objKey].toolTooltip) Game.customMinigame[objKey].toolTooltip = [];
CCSE.ReplaceCodeIntoFunction('M.toolTooltip', 'return str;',
`// M.toolTooltip injection point 0
for(var i in Game.customMinigame['` + objKey + `'].toolTooltip) str = Game.customMinigame['` + objKey + `'].toolTooltip[i](id, str);`, -1,
preEvalScript);
// M.tileTooltip
// Return ret for no effect
if(!Game.customMinigame[objKey].tileTooltip) Game.customMinigame[objKey].tileTooltip = [];
CCSE.ReplaceCodeIntoFunction('M.tileTooltip', 'return function(){', `return function(){
var ret = '';`, 0,
preEvalScript);
CCSE.ReplaceCodeIntoFunction('M.tileTooltip', /return str;/g, 'ret = str;', 0,
preEvalScript);
CCSE.ReplaceCodeIntoFunction('M.tileTooltip', '};',
`// M.tileTooltip injection point 0
for(var i in Game.customMinigame['` + objKey + `'].tileTooltip) ret = Game.customMinigame['` + objKey + `'].tileTooltip[i](x, y, ret);
return ret;`, -1,
preEvalScript);
// M.refillTooltip
// functions should return a string value (Return str for no effect)
if(!Game.customMinigame[objKey].refillTooltip) Game.customMinigame[objKey].refillTooltip = [];
CCSE.ReplaceCodeIntoFunction('M.refillTooltip', 'return', 'var str = ', 0,
preEvalScript);
CCSE.SliceCodeIntoFunction('M.refillTooltip', -1, `
// M.refillTooltip injection point 0
for(var i in Game.customMinigame['` + objKey + `'].refillTooltip) str = Game.customMinigame['` + objKey + `'].refillTooltip[i](id, str);
return str;
`, preEvalScript);
// M.buildPanel
if(!Game.customMinigame[objKey].buildPanel) Game.customMinigame[objKey].buildPanel = [];
CCSE.SliceCodeIntoFunction('M.buildPanel', -1,
`// M.buildPanel injection point 0
for(var i in Game.customMinigame['` + objKey + `'].buildPanel) Game.customMinigame['` + objKey + `'].buildPanel[i]();
`, preEvalScript);
// M.buildPlot
if(!Game.customMinigame[objKey].buildPlot) Game.customMinigame[objKey].buildPlot = [];
CCSE.SliceCodeIntoFunction('M.buildPlot', -1,
`// M.buildPlot injection point 0
for(var i in Game.customMinigame['` + objKey + `'].buildPlot) Game.customMinigame['` + objKey + `'].buildPlot[i]();
`, preEvalScript);
// M.clickTile
if(!Game.customMinigame[objKey].clickTile) Game.customMinigame[objKey].clickTile = [];
CCSE.SliceCodeIntoFunction('M.clickTile', -1,
`// M.clickTile injection point 0
for(var i in Game.customMinigame['` + objKey + `'].clickTile) Game.customMinigame['` + objKey + `'].clickTile[i](x, y);
`, preEvalScript);
// M.useTool
// M.getTile
// Return ret to have no effect
if(!Game.customMinigame[objKey].getTile) Game.customMinigame[objKey].getTile = [];
CCSE.ReplaceCodeIntoFunction('M.getTile', '{', 'var ret;', 1,
preEvalScript);
CCSE.ReplaceCodeIntoFunction('M.getTile', 'return', 'ret =', 0,
preEvalScript);
CCSE.ReplaceCodeIntoFunction('M.getTile', 'return', 'else ret =', 0,
preEvalScript);
CCSE.SliceCodeIntoFunction('M.getTile', -1,
`// M.getTile injection point 0
for(var i in Game.customMinigame['` + objKey + `'].getTile) ret = Game.customMinigame['` + objKey + `'].getTile[i](x, y, ret);
return ret;
`, preEvalScript);
// M.getTile
// Return ret to have no effect
if(!Game.customMinigame[objKey].isTileUnlocked) Game.customMinigame[objKey].isTileUnlocked = [];
CCSE.ReplaceCodeIntoFunction('M.isTileUnlocked', '{', 'var ret;', 1,
preEvalScript);
CCSE.ReplaceCodeIntoFunction('M.isTileUnlocked', /return/g, 'ret =', 0,
preEvalScript);
CCSE.SliceCodeIntoFunction('M.isTileUnlocked', -1,
`// M.isTileUnlocked injection point 0
for(var i in Game.customMinigame['` + objKey + `'].isTileUnlocked) ret = Game.customMinigame['` + objKey + `'].isTileUnlocked[i](x, y, ret);
return ret;
`, preEvalScript);
// M.computeStepT
if(!Game.customMinigame[objKey].computeStepT) Game.customMinigame[objKey].computeStepT = [];
CCSE.SliceCodeIntoFunction('M.computeStepT', -1,
`// M.computeStepT injection point 0
for(var i in Game.customMinigame['` + objKey + `'].computeStepT) Game.customMinigame['` + objKey + `'].computeStepT[i]();
`, preEvalScript);
// M.convert
if(!Game.customMinigame[objKey].convert) Game.customMinigame[objKey].convert = [];
CCSE.SliceCodeIntoFunction('M.convert', -1,
`// M.convert injection point 0
for(var i in Game.customMinigame['` + objKey + `'].convert) Game.customMinigame['` + objKey + `'].convert[i]();
`, preEvalScript);
// M.harvestAll
if(!Game.customMinigame[objKey].harvestAll) Game.customMinigame[objKey].harvestAll = [];
CCSE.SliceCodeIntoFunction('M.harvestAll', -1,
`// M.harvestAll injection point 0
for(var i in Game.customMinigame['` + objKey + `'].harvestAll) Game.customMinigame['` + objKey + `'].harvestAll[i](type, mature, mortal);
`, preEvalScript);
// M.harvest
if(!Game.customMinigame[objKey].harvest) Game.customMinigame[objKey].harvest = [];
CCSE.ReplaceCodeIntoFunction('M.harvest', 'return true;',
`// M.harvest injection point 0
for(var i in Game.customMinigame['` + objKey + `'].harvest) Game.customMinigame['` + objKey + `'].harvest[i](x, y, manual);`, -1,
preEvalScript);
// M.unlockSeed
if(!Game.customMinigame[objKey].unlockSeed) Game.customMinigame[objKey].unlockSeed = [];
CCSE.ReplaceCodeIntoFunction('M.unlockSeed', 'return true;',
`// M.unlockSeed injection point 0
for(var i in Game.customMinigame['` + objKey + `'].unlockSeed) Game.customMinigame['` + objKey + `'].unlockSeed[i](me);`, -1,
preEvalScript);
// M.lockSeed
if(!Game.customMinigame[objKey].lockSeed) Game.customMinigame[objKey].lockSeed = [];
CCSE.ReplaceCodeIntoFunction('M.lockSeed', 'return true;',
`// M.lockSeed injection point 0
for(var i in Game.customMinigame['` + objKey + `'].lockSeed) Game.customMinigame['` + objKey + `'].lockSeed[i](me);`, -1,
preEvalScript);
// M.launch
if(M.launch.toString().indexOf('// M.launch injection point 0') == -1){
CCSE.SliceCodeIntoFunction('M.launch', -1, `
// M.launch injection point 0
for(var i in Game.customMinigameOnLoad['` + objKey + `']) Game.customMinigameOnLoad['` + objKey + `'][i](M.parent);
`, preEvalScript);
}
}
/*=====================================================================================
Grimoire
=======================================================================================*/
if(!CCSE.customRedrawSpells) CCSE.customRedrawSpells = [];
CCSE.RedrawSpells = function(){
var str = '';
var M = Game.Objects['Wizard tower'].minigame;
for(var i in M.spells){
var me = M.spells[i];
var icon = me.icon || [28,12];
str += '<div class="grimoireSpell titleFont" id="grimoireSpell' + me.id + '" ' + Game.getDynamicTooltip('Game.ObjectsById[' + M.parent.id + '].minigame.spellTooltip(' + me.id + ')','this') + '><div class="usesIcon shadowFilter grimoireIcon" style="' + (icon[2]?'background-image:url('+icon[2]+');':'') + 'background-position:' + (-icon[0] * 48) + 'px ' + (-icon[1] * 48) + 'px;"></div><div class="grimoirePrice" id="grimoirePrice' + me.id + '">-</div></div>';
}
l('grimoireSpells').innerHTML = str;
for(var i in M.spells){
var me = M.spells[i];
AddEvent(l('grimoireSpell' + me.id), 'click', function(spell){return function(){PlaySound('snd/tick.mp3'); M.castSpell(spell);}}(me));
}
for(var i in CCSE.customRedrawSpells) CCSE.customRedrawSpells[i]();
}
// Cookie Monster compatibility because it was here first
CCSE.customRedrawSpells.push(function(){if(typeof CM != 'undefined') CM.Disp.AddTooltipGrimoire();});
if(!CCSE.customNewSpell) CCSE.customNewSpell = [];
CCSE.NewSpell = function(key, spell){
var M = Game.Objects['Wizard tower'].minigame;
M.spells[key] = spell;
M.spellsById = [];
var n = 0;
for(var i in M.spells){
M.spells[i].id = n;
M.spellsById[n] = M.spells[i];
n++;
}
for(var i in CCSE.customNewSpell) CCSE.customNewSpell[i](key, spell);
CCSE.RedrawSpells();
}
/*=====================================================================================
Pantheon
=======================================================================================*/
if(!CCSE.customRedrawGods) CCSE.customRedrawGods = [];
CCSE.RedrawGods = function(){
var str = '';
var M = Game.Objects['Temple'].minigame;
for(var i in M.slot){
var me = M.slot[i];
str += '<div class="ready templeGod templeGod' + (i % 4) + ' templeSlot titleFont" id="templeSlot' + i + '" ' + Game.getDynamicTooltip('Game.ObjectsById[' + M.parent.id + '].minigame.slotTooltip(' + i + ')', 'this') + '><div class="usesIcon shadowFilter templeGem templeGem' + (parseInt(i) + 1) + '"></div></div>';
}
l('templeSlots').innerHTML = str;
str = '';
for(var i in M.gods){
var me = M.gods[i];
var icon = me.icon || [0,0];
str += '<div class="ready templeGod templeGod' + (me.id % 4) + ' titleFont" id="templeGod' + me.id + '" ' + Game.getDynamicTooltip('Game.ObjectsById[' + M.parent.id + '].minigame.godTooltip(' + me.id + ')', 'this') + '><div class="usesIcon shadowFilter templeIcon" style="' + (icon[2]?'background-image:url('+icon[2]+');':'') + 'background-position:' + (-icon[0] * 48) + 'px ' + (-icon[1] * 48) + 'px;"></div><div class="templeSlotDrag" id="templeGodDrag' + me.id + '"></div></div>';
str += '<div class="templeGodPlaceholder" id="templeGodPlaceholder' + me.id + '"></div>';
}
l('templeGods').innerHTML = str;
for(var i in M.slot){
var me=M.slot[i];
AddEvent(l('templeSlot' + i), 'mouseover', function(what){return function(){M.hoverSlot(what);}}(i));
AddEvent(l('templeSlot' + i), 'mouseout', function(what){return function(){M.hoverSlot(-1);}}(i));
}
for(var i in M.gods){
var me = M.gods[i];
AddEvent(l('templeGodDrag' + me.id), 'mousedown', function(what){return function(){M.dragGod(what);}}(me));
AddEvent(l('templeGodDrag' + me.id), 'mouseup', function(what){return function(){M.dropGod(what);}}(me));
}
M.load(M.save());
for(var i in CCSE.customRedrawGods) CCSE.customRedrawGods[i]();
}
if(!CCSE.customNewGod) CCSE.customNewGod = [];
CCSE.NewGod = function(key, god){
var M = Game.Objects['Temple'].minigame;
M.gods[key] = god;
M.godsById = [];
var n = 0;
for(var i in M.gods){
M.gods[i].id = n;
M.godsById[n] = M.gods[i];
n++;
}
for(var i in CCSE.customNewGod) CCSE.customNewGod[i](key, god);
CCSE.RedrawGods();
}
/*=====================================================================================
Garden
=======================================================================================*/
if(!CCSE.customNewPlant) CCSE.customNewPlant = [];
CCSE.NewPlant = function(key, plant){
var M = Game.Objects['Farm'].minigame;
M.plants[key] = plant;
M.plantsById = [];
var n = 0;
for(var i in M.plants){
M.plants[i].id = n;
M.plantsById[n] = M.plants[i];
n++;
}
for(var i in CCSE.customNewPlant) CCSE.customNewPlant[i](key, plant);
M.buildPanel();
}
/*=====================================================================================
Save custom things
If you use CCSE to create custom upgrades or achievements,
it will also save their state to local storage whenever the game is saved.
Each custom upgrade or achievement needs a unique name, or they could get overwritten.
Yes, this means across mods as well.
If two mods have things with the same name, the mods cannot be used at the same time.
This is because of how the game itself keeps track of these things
You can also use CCSE to save your mod data.
Add your save data as a child of CCSE.config.OtherMods. Make sure not to step on anyone else's toes!
Push your save function into CCSE.customSave, and push your load function into CCSE.customLoad
=======================================================================================*/
// The following code copied from https://github.com/pieroxy/lz-string
CCSE.LZString = function(){function o(o,r){if(!t[o]){t[o]={};for(var n=0;n<o.length;n++)t[o][o.charAt(n)]=n}return t[o][r]}var r=String.fromCharCode,n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$",t={},i={compressToBase64:function(o){if(null==o)return"";var r=i._compress(o,6,function(o){return n.charAt(o)});switch(r.length%4){default:case 0:return r;case 1:return r+"===";case 2:return r+"==";case 3:return r+"="}},decompressFromBase64:function(r){return null==r?"":""==r?null:i._decompress(r.length,32,function(e){return o(n,r.charAt(e))})},compressToUTF16:function(o){return null==o?"":i._compress(o,15,function(o){return r(o+32)})+" "},decompressFromUTF16:function(o){return null==o?"":""==o?null:i._decompress(o.length,16384,function(r){return o.charCodeAt(r)-32})},compressToUint8Array:function(o){for(var r=i.compress(o),n=new Uint8Array(2*r.length),e=0,t=r.length;t>e;e++){var s=r.charCodeAt(e);n[2*e]=s>>>8,n[2*e+1]=s%256}return n},decompressFromUint8Array:function(o){if(null===o||void 0===o)return i.decompress(o);for(var n=new Array(o.length/2),e=0,t=n.length;t>e;e++)n[e]=256*o[2*e]+o[2*e+1];var s=[];return n.forEach(function(o){s.push(r(o))}),i.decompress(s.join(""))},compressToEncodedURIComponent:function(o){return null==o?"":i._compress(o,6,function(o){return e.charAt(o)})},decompressFromEncodedURIComponent:function(r){return null==r?"":""==r?null:(r=r.replace(/ /g,"+"),i._decompress(r.length,32,function(n){return o(e,r.charAt(n))}))},compress:function(o){return i._compress(o,16,function(o){return r(o)})},_compress:function(o,r,n){if(null==o)return"";var e,t,i,s={},p={},u="",c="",a="",l=2,f=3,h=2,d=[],m=0,v=0;for(i=0;i<o.length;i+=1)if(u=o.charAt(i),Object.prototype.hasOwnProperty.call(s,u)||(s[u]=f++,p[u]=!0),c=a+u,Object.prototype.hasOwnProperty.call(s,c))a=c;else{if(Object.prototype.hasOwnProperty.call(p,a)){if(a.charCodeAt(0)<256){for(e=0;h>e;e++)m<<=1,v==r-1?(v=0,d.push(n(m)),m=0):v++;for(t=a.charCodeAt(0),e=0;8>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}else{for(t=1,e=0;h>e;e++)m=m<<1|t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t=0;for(t=a.charCodeAt(0),e=0;16>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}l--,0==l&&(l=Math.pow(2,h),h++),delete p[a]}else for(t=s[a],e=0;h>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;l--,0==l&&(l=Math.pow(2,h),h++),s[c]=f++,a=String(u)}if(""!==a){if(Object.prototype.hasOwnProperty.call(p,a)){if(a.charCodeAt(0)<256){for(e=0;h>e;e++)m<<=1,v==r-1?(v=0,d.push(n(m)),m=0):v++;for(t=a.charCodeAt(0),e=0;8>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}else{for(t=1,e=0;h>e;e++)m=m<<1|t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t=0;for(t=a.charCodeAt(0),e=0;16>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}l--,0==l&&(l=Math.pow(2,h),h++),delete p[a]}else for(t=s[a],e=0;h>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;l--,0==l&&(l=Math.pow(2,h),h++)}for(t=2,e=0;h>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;for(;;){if(m<<=1,v==r-1){d.push(n(m));break}v++}return d.join("")},decompress:function(o){return null==o?"":""==o?null:i._decompress(o.length,32768,function(r){return o.charCodeAt(r)})},_decompress:function(o,n,e){var t,i,s,p,u,c,a,l,f=[],h=4,d=4,m=3,v="",w=[],A={val:e(0),position:n,index:1};for(i=0;3>i;i+=1)f[i]=i;for(p=0,c=Math.pow(2,2),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;switch(t=p){case 0:for(p=0,c=Math.pow(2,8),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;l=r(p);break;case 1:for(p=0,c=Math.pow(2,16),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;l=r(p);break;case 2:return""}for(f[3]=l,s=l,w.push(l);;){if(A.index>o)return"";for(p=0,c=Math.pow(2,m),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;switch(l=p){case 0:for(p=0,c=Math.pow(2,8),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;f[d++]=r(p),l=d-1,h--;break;case 1:for(p=0,c=Math.pow(2,16),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;f[d++]=r(p),l=d-1,h--;break;case 2:return w.join("")}if(0==h&&(h=Math.pow(2,m),m++),f[l])v=f[l];else{if(l!==d)return null;v=s+s.charAt(0)}w.push(v),f[d++]=s+v.charAt(0),h--,s=v,0==h&&(h=Math.pow(2,m),m++)}}};return i}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module&&(module.exports=LZString);
if(!CCSE.customSave) CCSE.customSave = [];
CCSE.save = function(type){
CCSE.config.version = CCSE.version;
for(var name in CCSE.config.Buildings){
if(Game.Objects[name]){
var saved = CCSE.config.Buildings[name];
var me = Game.Objects[name];
saved.amount = me.amount;
saved.bought = me.bought;
saved.totalCookies = me.totalCookies;
saved.level = me.level;
saved.muted = me.muted;
saved.highest = me.highest;
saved.free = me.free;
if(Game.isMinigameReady(me)) saved.minigameSave = me.minigame.save(); else saved.minigameSave = '';
}
}
for(var name in CCSE.config.Achievements){
if(Game.Achievements[name]){
CCSE.config.Achievements[name].won = Game.Achievements[name].won;
}
}
for(var name in CCSE.config.Upgrades){
if(Game.Upgrades[name]){
CCSE.config.Upgrades[name].unlocked = Game.Upgrades[name].unlocked;
CCSE.config.Upgrades[name].bought = Game.Upgrades[name].bought;
}
}
for(var name in CCSE.config.Buffs){
var buff = CCSE.config.Buffs[name];
buff.time = 0;
if(Game.buffs[buff.name]){
if(Game.buffs[buff.name].time){
buff.time = Game.buffs[buff.name].time;
buff.maxTime = Game.buffs[buff.name].maxTime;
buff.arg1 = Game.buffs[buff.name].arg1;
buff.arg2 = Game.buffs[buff.name].arg2;
buff.arg3 = Game.buffs[buff.name].arg3;
}
}
}
for(var name in CCSE.config.Seasons){
var season = CCSE.config.Seasons[name];
season.lastTime = Date.now();
if(Game.season == name){
season.T = Game.seasonT;
}
else{
season.T = -1;
}
}
for(var i in CCSE.customSave) CCSE.customSave[i]();
var str = JSON.stringify(CCSE.config);
//str = CCSE.LZString.compressToUTF16(str);
if(type == 2){
return str;
}
else if(type == 3){
return JSON.stringify(CCSE.config, null, 2);
}
else if (type==1){
str = escape(utf8_to_b64(str) + '!END!');
return str;
}
else{
return str;
/*str = utf8_to_b64(str) + '!END!';
str = escape(str);
Game.localStorageSet(CCSE.name, str);*/
}
}
if(!CCSE.customLoad) CCSE.customLoad = [];
CCSE.load = function(data, isBase64){
var config;
var str = '';
var cautiousDecompress = function(data){
var ret = null;
try{
ret = JSON.parse(data);
}catch{
ret = CCSE.LZString.decompressFromUTF16(data);
ret = JSON.parse(ret);
}
return ret;
}
if(isBase64){ // Getting here from import CCSE in menu
if(data){
str = unescape(data);
}
if(str != ''){
str = str.split('!END!')[0];
str = b64_to_utf8(str);
config = cautiousDecompress(str);
}
}
else{ // Getting here from game function call
if(data){ // Has data in game save
config = cautiousDecompress(data);
}
}
CCSE.InitializeConfig(config);
if(CCSE.config.version != CCSE.version){
//l('logButton').classList.add('hasUpdate');
CCSE.collapseMenu['CCSEinfo'] = 0;
}else{
CCSE.collapseMenu['CCSEinfo'] = 1;
}
for(var name in CCSE.config.Buildings){
if(Game.Objects[name]){
var saved = CCSE.config.Buildings[name];
var me = Game.Objects[name];
me.switchMinigame(false);
me.pics = [];
me.amount = saved.amount;
me.bought = saved.bought;
me.totalCookies = saved.totalCookies;
me.level = saved.level;
me.muted = saved.muted;
me.highest = saved.highest ? saved.highest : 0; // Left this out earlier, can't expect it to be there
me.free = saved.free ? saved.free : 0; // Left this out earlier, can't expect it to be there
me.minigameSave = saved.minigameSave;
if(me.minigame && me.minigameLoaded && me.minigame.reset){me.minigame.reset(true); me.minigame.load(me.minigameSave);}
Game.BuildingsOwned += me.amount;
}
}
for(var name in CCSE.config.Achievements){
if(Game.Achievements[name]){
Game.Achievements[name].won = CCSE.config.Achievements[name].won;
}
}
for(var name in CCSE.config.Upgrades){
if(Game.Upgrades[name]){
Game.Upgrades[name].unlocked = CCSE.config.Upgrades[name].unlocked;
Game.Upgrades[name].bought = CCSE.config.Upgrades[name].bought;
}
}
for(var name in CCSE.config.Buffs){
var found = false;
for(var i in Game.buffTypes) if(Game.buffTypes[i].name == name) found = true;
if(found){
if(CCSE.config.Buffs[name].time){
var buff = CCSE.config.Buffs[name];
Game.gainBuff(name, buff.maxTime / Game.fps, buff.arg1, buff.arg2, buff.arg3).time = buff.time;
}
}
}
for(var name in CCSE.config.Seasons){
if(Game.seasons[name]){
if(CCSE.config.Seasons[name].T > 0){
Game.season = name;
Game.seasonT = CCSE.config.Seasons[name].T;
var framesElapsed = Math.ceil(((Date.now() - CCSE.config.Seasons[name].lastTime) / 1000) * Game.fps);
if(Game.seasonT > 0) Game.seasonT = Math.max(Game.seasonT - framesElapsed, 1);
}
if(Game.Has('Season switcher')) Game.Unlock(Game.seasons[name].trigger);
}
}
Game.upgradesToRebuild = 1;
for(var i in CCSE.customLoad) CCSE.customLoad[i]();
Game.Win('Third-party');
}
CCSE.InitializeConfig = function(config){
if(!CCSE.config) CCSE.config = {};
if(!CCSE.config.version) CCSE.config.version = 1;
if(!CCSE.config.Achievements) CCSE.config.Achievements = {};
if(!CCSE.config.Upgrades) CCSE.config.Upgrades = {};
if(!CCSE.config.Buildings) CCSE.config.Buildings = {};
if(!CCSE.config.Buffs) CCSE.config.Buffs = {};
if(!CCSE.config.Seasons) CCSE.config.Seasons = {};
if(!CCSE.config.OtherMods) CCSE.config.OtherMods = {};
if(!CCSE.config.vault) CCSE.config.vault = [];
if(!CCSE.config.permanentUpgrades) CCSE.config.permanentUpgrades = [-1,-1,-1,-1,-1];
if(!CCSE.config.chimeType) CCSE.config.chimeType = 'No sound';
if(!CCSE.config.milkType) CCSE.config.milkType = 'Automatic';
if(!CCSE.config.bgType) CCSE.config.bgType = 'Automatic';
if(CCSE.config.showVersionNo === undefined) CCSE.config.showVersionNo = 1;
if(config){
if(config.version) CCSE.config.version = config.version;
if(config.Achievements) for(var i in config.Achievements) CCSE.config.Achievements[i] = config.Achievements[i];
if(config.Upgrades) for(var i in config.Upgrades) CCSE.config.Upgrades[i] = config.Upgrades[i];
if(config.Buildings) for(var i in config.Buildings) CCSE.config.Buildings[i] = config.Buildings[i];
if(config.Buffs) for(var i in config.Buffs) CCSE.config.Buffs[i] = config.Buffs[i];
if(config.Seasons) for(var i in config.Seasons) CCSE.config.Seasons[i] = config.Seasons[i];
if(config.OtherMods) for(var i in config.OtherMods) CCSE.config.OtherMods[i] = config.OtherMods[i];
if(config.vault) for(var i in config.vault) CCSE.config.vault[i] = config.vault[i];
if(config.permanentUpgrades) for(var i in config.permanentUpgrades) CCSE.config.permanentUpgrades[i] = config.permanentUpgrades[i];
if(config.chimeType) CCSE.config.chimeType = config.chimeType;
if(config.milkType) CCSE.config.milkType = config.milkType;
if(config.bgType) CCSE.config.bgType = config.bgType;
if(config.showVersionNo !== undefined) CCSE.config.showVersionNo = config.showVersionNo;
}
}
CCSE.applyPref = function(prefName){
switch(prefName){
case 'showVersionNo':
if(CCSE.config[prefName]){
l('CCSEversionNumber').style.display = '';
l('CCSEversionGame').style.display = '';
}else{
l('CCSEversionNumber').style.display = 'none';
l('CCSEversionGame').style.display = 'none';
}
break;
}
}
// These two kept for people who might be blindsided by the save format change
CCSE.ExportSave = function(){
Game.Prompt(
'<h3>Export configuration</h3>' +
'<div class="block">This is your CCSE save.<br>It contains data that other mods authors decided to allow CCSE to manage, as well as data for custom things added through CCSE (i.e. achivements, upgrades, etc)</div>' +
'<div class="block"><textarea id="textareaPrompt" style="width:100%;height:128px;" readonly>' + CCSE.save(1) + '</textarea></div>',
['All done!']);
l('textareaPrompt').focus();
l('textareaPrompt').select();
}
CCSE.ImportSave = function(){
var load = 'if(l("textareaPrompt").value.length > 0){CCSE.load(l("textareaPrompt").value, 1); Game.ClosePrompt(); Game.UpdateMenu();}';
Game.Prompt(
'<h3>Import config</h3>'+
'<div class="block">Paste your CCSE save here.</div>'+
'<div class="block"><textarea id="textareaPrompt" style="width: 100%; height: 128px;"></textarea></div>',
[['Load', load], 'Nevermind']);
l('textareaPrompt').focus();
}
/*
Made obsolete by native mod save support
CCSE.ExportCombinedSave = function(){
var saveString = JSON.stringify({'Vanilla':Game.WriteSave(1),'CCSE':CCSE.save(1)});
Game.Prompt('<h3>Export combined save</h3><div class="block">This is your vanilla game save combined with your CCSE save in a single convenient location!</div><div class="block"><textarea id="textareaPrompt" style="width:100%;height:128px;" readonly>' +
saveString +
'</textarea></div>',['All done!']);
l('textareaPrompt').focus();
l('textareaPrompt').select();
}
CCSE.ImportCombinedSave = function(){
Game.Prompt('<h3>Import combined save</h3><div class="block">Paste your combined vanilla/CCSE save here.</div><div class="block"><textarea id="textareaPrompt" style="width:100%;height:128px;"></textarea></div>',
[['Load','if(l(\'textareaPrompt\').value.length > 0){CCSE.LoadCombinedSave(l(\'textareaPrompt\').value); Game.ClosePrompt(); Game.UpdateMenu();}'], 'Nevermind']);
l('textareaPrompt').focus();
}
CCSE.LoadCombinedSave = function(saveStr){
var save = JSON.parse(saveStr);
Game.ImportSaveCode(save.Vanilla);
CCSE.load(save.CCSE, 1);
}*/
/*
I apparently never incorporated these anywhere. Might as well comment them out.
CCSE.ExportEditableSave = function(){
Game.Prompt('<h3>Export configuration</h3><div class="block">This is your CCSE save.<br>In JSON format for people who want to edit it.</div><div class="block"><textarea id="textareaPrompt" style="width:100%;height:128px;" readonly>' +
CCSE.save(3) +
'</textarea></div>',['All done!']);
l('textareaPrompt').focus();
l('textareaPrompt').select();
}
CCSE.ImportEditableSave = function(){
Game.Prompt('<h3>Import config</h3><div class="block">Paste your CCSE save here (in JSON format).</div><div class="block"><textarea id="textareaPrompt" style="width:100%;height:128px;"></textarea></div>',
[['Load','if(l(\'textareaPrompt\').value.length > 0){CCSE.load(l(\'textareaPrompt\').value); Game.ClosePrompt(); Game.UpdateMenu();}'], 'Nevermind']);
l('textareaPrompt').focus();
}*/
CCSE.reset = function(hard){
for(var name in CCSE.config.Buildings){
var me = CCSE.config.Buildings[name];
me.amount=0;me.bought=0;me.highest=0;me.free=0;me.totalCookies=0;
me.onMinigame = false;
if(hard) me.muted=0;
me.pics=[];
}
for(var name in CCSE.config.Achievements){
if(hard) CCSE.config.Achievements[name].won = 0;
}
for(var name in CCSE.config.Upgrades){
var me = CCSE.config.Upgrades[name];
me.bought = 0;
me.unlocked = 0;
}
for(var name in CCSE.config.Buffs){
var buff = CCSE.config.Buffs[name];
buff.time = 0;
buff.maxTime = 0;
buff.arg1 = 0;
buff.arg2 = 0;
buff.arg3 = 0;
}
for(var name in CCSE.config.Seasons){
var season = CCSE.config.Seasons[name];
season.lastTime = Date.now();
season.T = 0;
}
if(hard){
CCSE.config.vault = [];
CCSE.config.permanentUpgrades = [-1,-1,-1,-1,-1];
CCSE.config.chimeType = 'No sound';
CCSE.config.milkType = 'Automatic';
CCSE.config.bgType = 'Automatic';
} else {
if(Game.ascensionMode != 1){
for(var i in CCSE.config.permanentUpgrades){
if(CCSE.config.permanentUpgrades[i] != -1)
if(Game.Upgrades[CCSE.config.permanentUpgrades[i]])
Game.Upgrades[CCSE.config.permanentUpgrades[i]].earn();
}
}
}
}
/*=====================================================================================
Standard creation helpers
=======================================================================================*/
CCSE.NewUpgrade = function(name, desc, price, icon, buyFunction){
var me = new Game.Upgrade(name, desc, price, icon, buyFunction);
CCSE.ReplaceUpgrade(name);
if(CCSE.config.Upgrades[name]){
me.unlocked = CCSE.config.Upgrades[name].unlocked;
me.bought = CCSE.config.Upgrades[name].bought;
}else{
CCSE.config.Upgrades[name] = {
unlocked: 0,
bought: 0
}
}
me.CCSE = 1;
if(typeof LocalizeUpgradesAndAchievs !== 'undefined') LocalizeUpgradesAndAchievs();
return me;
}
CCSE.NewHeavenlyUpgrade = function(name, desc, price, icon, posX, posY, parents, buyFunction){
var me = CCSE.NewUpgrade(name, desc, price, icon, buyFunction);
Game.PrestigeUpgrades.push(me);
me.pool = 'prestige';
me.posX = posX;
me.posY = posY;
me.order = me.id;
me.parents = parents;
if(me.parents.length == 0) me.parents = ['Legacy'];
me.parents = me.parents || [-1];
for(var ii in me.parents){
if(me.parents[ii] != -1) me.parents[ii] = Game.Upgrades[me.parents[ii]];
}
return me;
}
CCSE.NewAchievement = function(name, desc, icon){
var me = new Game.Achievement(name, desc, icon);
CCSE.ReplaceAchievement(name);
if(CCSE.config.Achievements[name]){
me.won = CCSE.config.Achievements[name].won;
}else{
CCSE.config.Achievements[name] = {
won: 0
}
}
if(typeof LocalizeUpgradesAndAchievs !== 'undefined') LocalizeUpgradesAndAchievs();
return me;
}
CCSE.NewBuilding = function(name, commonName, desc, icon, iconColumn, art, price, cps, buyFunction, foolObject, buildingSpecial){
var me = new Game.Object(name, commonName, desc, icon, iconColumn, art, price, cps, buyFunction);
// This is the name, description, and icon used during Business Season
if(foolObject) Game.foolObjects[name] = foolObject;
// The name of this building's golden cookie buff and debuff
if(buildingSpecial) Game.goldenCookieBuildingBuffs[name] = buildingSpecial;
CCSE.ReplaceBuilding(name);
if(art.customBuildingPic){
Game.customBuildStore.push(function(){
l('productIcon' + me.id).style.backgroundImage = 'url(' + art.customBuildingPic + ')';
l('productIconOff' + me.id).style.backgroundImage = 'url(' + art.customBuildingPic + ')';
});
}
if(art.customIconsPic){
Game.customBuildings[name].tooltip.push(function(obj, ret){
if(me.locked) return ret;
else return ret.replace('background-position', 'background-image:url(' + obj.art.customIconsPic + ');background-position');
});
}
if(CCSE.config.Buildings[name]){
var saved = CCSE.config.Buildings[name];
me.amount = saved.amount;
me.bought = saved.bought;
me.totalCookies = saved.totalCookies;
me.level = saved.level;
me.muted = saved.muted;
me.highest = saved.highest ? saved.highest : 0; // Left this out earlier, can't expect it to be there
me.free = saved.free ? saved.free : 0; // Left this out earlier, can't expect it to be there
me.minigameSave = saved.minigameSave;
Game.BuildingsOwned += me.amount;
}else{
var saved = {};
saved.amount = 0;
saved.bought = 0;
saved.totalCookies = 0;
saved.level = 0;
saved.muted = 0;
saved.free = 0;
saved.highest = 0;
saved.minigameSave = '';
CCSE.config.Buildings[name] = saved;
}
Game.BuildStore();
me.canvas=l('rowCanvas'+me.id);
me.ctx=me.canvas.getContext('2d',{alpha:false});
me.pics=[];
var icon=[0*64,me.icon*64];
var muteStr = '<div class="tinyProductIcon" id="mutedProduct'+me.id+'" style="display:none;' + (me.art.customBuildingPic ? 'background-image:url(' + me.art.customBuildingPic + ');' : '') + 'background-position:-'+icon[0]+'px -'+icon[1]+'px;" '+Game.clickStr+'="Game.ObjectsById['+me.id+'].mute(0);PlaySound(Game.ObjectsById['+me.id+'].muted?\'snd/clickOff.mp3\':\'snd/clickOn.mp3\');" '+Game.getDynamicTooltip('Game.mutedBuildingTooltip('+me.id+')','this')+'></div>';
AddEvent(me.canvas,'mouseover',function(me){return function(){me.mouseOn=true;}}(me));
AddEvent(me.canvas,'mouseout',function(me){return function(){me.mouseOn=false;}}(me));
AddEvent(me.canvas,'mousemove',function(me){return function(e){var box=this.getBoundingClientRect();me.mousePos[0]=e.pageX-box.left;me.mousePos[1]=e.pageY-box.top;}}(me));
l('buildingsMute').innerHTML+=muteStr;
Game.recalculateGains = 1;
return me;
}
CCSE.NewBuff = function(name, func){
var me = new Game.buffType(name, func);
if(CCSE.config.Buffs[name]){
if(CCSE.config.Buffs[name].time){
CCSE.config.Buffs[name].name = func().name;
var buff = CCSE.config.Buffs[name];
Game.gainBuff(name, buff.maxTime / Game.fps, buff.arg1, buff.arg2, buff.arg3).time = buff.time;
}
}else{
CCSE.config.Buffs[name] = {
name: func().name,
maxTime: 0,
time: 0,
arg1: 0,
arg2: 0,
arg3: 0
}
}
return me;
}
CCSE.NewSeason = function(name, firstDay, lastDay, season, announcement){
Game.seasons[name] = season;
lastDay.setDate(lastDay.getDate() + 1); // lastDay is inclusive
if(Date.now() >= firstDay && Date.now() <= lastDay) Game.baseSeason = name;
CCSE.customLoad.push(function(){
if(Game.season == name && Game.season == Game.baseSeason){
Game.Notify(announcement[0], announcement[1], announcement[2], 60 * 3);
}
});
CCSE.ReplaceCodeIntoFunction('Game.WriteSave', /\(\(Game.season/g, "((Game.season && Game.season != '" + name + "'", 0);
Game.computeSeasons();
Game.computeSeasonPrices();
if(CCSE.config.Seasons[name]){
if(CCSE.config.Seasons[name].T > 0){
Game.seasonT = CCSE.config.Seasons[name].T;
Game.season = name;
var framesElapsed = Math.ceil(((Date.now() - CCSE.config.Seasons[name].lastTime) / 1000) * Game.fps);
if(Game.seasonT > 0) Game.seasonT = Math.max(Game.seasonT - framesElapsed, 1);
}
}else{
CCSE.config.Seasons[name] = {
T: 0,
lastTime: Date.now()
}
}
if(Game.Has('Season switcher')) Game.Unlock(Game.seasons[name].trigger);
Game.upgradesToRebuild = 1;
}
CCSE.NewShimmerSoundSelection = function(name, icon, defaultSound, shimmerTypes){
// name What the game will display in the selector
// icon An array [x, y, (optional)url] See how upgrades handle icons to get an idea
// defaultSound The default sound to play for a shimmer spawn
// shimmerTypes For different sounds for each shimmer type {golden:'soundUrl',reindeer:'differentSoundUrl'}
let sound = {name:name, icon:icon};
if(defaultSound) sound.default = defaultSound;
if(shimmerTypes) sound.shimmerTypes = shimmerTypes;
Game.customUpgrades['Golden cookie sound selector'].choicesFunction.push(function(choices){
choices.push(sound);
});
}
CCSE.NewMilkSelection = function(name, icon, pic){
// name What the game will display in the selector
// icon An array [x, y, (optional)url] See how upgrades handle icons to get an idea
// pic Url to your picture
let milk = {name:name, icon:icon, milk:{pic:pic}, order:Game.AllMilks.length};
Game.customUpgrades['Milk selector'].choicesFunction.push(function(choices){
choices.push(milk);
});
}
CCSE.NewBackgroundSelection = function(name, icon, pic){
// name What the game will display in the selector
// icon An array [x, y, (optional)url] See how upgrades handle icons to get an idea
// pic Url to your picture
let bg = {name:name, icon:icon, pic:pic};
Game.customUpgrades['Background selector'].choicesFunction.push(function(choices){
choices.push(bg);
});
}
/*=====================================================================================
Custom Selector helper functions
=======================================================================================*/
CCSE.OverrideShimmerSoundSelector = function(choices){
let found = false;
for(var i in choices){
let choice = choices[i];
if(choice.name == CCSE.config.chimeType){choice.selected = 1; found = true}
else choice.selected = false;
}
// If the selected sound is from an unloaded mod, default to Chime
if(!found) choices[1].selected = 1;
}
CCSE.GetSelectedShimmerSound = function(){
let choices = Game.Upgrades['Golden cookie sound selector'].choicesFunction();
let choice = choices[1];
for(var i in choices) if(choices[i].selected) choice = choices[i];
return choice;
}
CCSE.SetSelectedShimmerSound = function(id){
let choices = Game.Upgrades['Golden cookie sound selector'].choicesFunction();
Game.chimeType = (id > 4 ? 0 : id); // Manually update when vanilla choices change
CCSE.config.chimeType = choices[id].name;
}
CCSE.PlayShimmerSpawnSound = function(shimmerType){
//if(Game.chimeType){ // Game.chimeType is 0 for No sound
let choice = CCSE.GetSelectedShimmerSound();
let sfx = '';
if(choice.shimmerTypes && choice.shimmerTypes[shimmerType] !== undefined) sfx = choice.shimmerTypes[shimmerType];
else if(choice.default) sfx = choice.default;
PlaySound(sfx);
//}
}
CCSE.OverrideMilkSelector = function(choices){
let found = false;
for(var i in choices){
let choice = choices[i];
if(choice.name == CCSE.config.milkType){choice.selected = 1; found = true}
else choice.selected = false;
}
// If the selected milk is from an unloaded mod, default to Automatic
if(!found) choices[0].selected = 1;
}
CCSE.GetSelectedMilk = function(){
let choices = Game.Upgrades['Milk selector'].choicesFunction();
let choice = {milk:Game.Milk};
for(var i in choices) if(choices[i].selected) choice = choices[i];
return choice;
}
CCSE.SetSelectedMilk = function(id){
Game.milkType = (id<Game.AllMilks.length ? id : 0); // Vanilla value defaults to 0 (Automatic)
CCSE.config.milkType = Game.Upgrades['Milk selector'].choicesFunction()[id].name;
}
CCSE.OverrideBackgroundSelector = function(choices){
let found = false;
for(var i in choices){
let choice = choices[i];
if(choice.name == CCSE.config.bgType){choice.selected = 1; found = true}
else choice.selected = false;
}
// If the selected bg is from an unloaded mod, default to Automatic
if(!found) choices[0].selected = 1;
}
CCSE.GetSelectedBackground = function(){
let choices = Game.Upgrades['Background selector'].choicesFunction();
let choice = choices[0];
for(var i in choices) if(choices[i].selected){
choice = choices[i];
if(Game.BGsByChoice[i]) choice.pic = Game.BGsByChoice[i].pic;
}
return choice;
}
CCSE.SetSelectedBackground = function(id){
Game.bgType = (Game.BGsByChoice[id] ? id : 0); // Vanilla value defaults to 0 (Automatic)
CCSE.config.bgType = Game.Upgrades['Background selector'].choicesFunction()[id].name;
}
/*=====================================================================================
Other
=======================================================================================*/
CCSE.AddMoreWrinklers = function(n){
var j = Game.wrinklers.length;
for (var i = j; i < j + n; i++){
Game.wrinklers.push({id:parseInt(i),close:0,sucked:0,phase:0,x:0,y:0,r:0,hurt:0,hp:Game.wrinklerHP,selected:0,type:0});
}
}
CCSE.CreateSpecialObject = function(name, conditionFunc, pictureFunc, drawFunc){
// name the key to identify this particular special object. Must be unique
// conditionFunc a function that returns true if the object should be shown, false if not
// pictureFunc a function that recieves and alters an object picframe{pic:<url>, frame:<integer>}
// drawFunc a function that recieves and returns an HTML string.
Game.customSpecialTabs.push(function(){
if(conditionFunc()) Game.specialTabs.push(name);
});
Game.customDrawSpecialPic.push(function(picframe, tab){
if(tab == name) pictureFunc(picframe);
});
Game.customToggleSpecialMenu.push(function(str){
if(Game.specialTab == name) str = drawFunc(str);
return str;
});
}
CCSE.SetSpecialMenuImage = function(str, pic, frame){
// We assume that Game.specialTab is not santa or dragon
return str.replace(
'background:url('+Game.resPath+'img/dragon.png?v='+Game.version+');background-position:'+(-4*96)+'px 0px;',
'background:url(' + pic + ');background-position:' + (frame * (-96)) + 'px 0px;');
}
CCSE.GetPermanentUpgrade = function(slot, id){
if(CCSE.config.permanentUpgrades[slot] == -1) return id;
return (Game.Upgrades[CCSE.config.permanentUpgrades[slot]] ? Game.Upgrades[CCSE.config.permanentUpgrades[slot]].id : -1);
}
CCSE.RectifyPermanentUpgrades = function(){
for(var i in Game.permanentUpgrades){
if(Game.permanentUpgrades[i] != -1){
var upgrade = Game.UpgradesById[Game.permanentUpgrades[i]];
if(upgrade.CCSE){
Game.permanentUpgrades[i] = -1;
CCSE.config.permanentUpgrades[i] = upgrade.name;
}else{
CCSE.config.permanentUpgrades[i] = -1;
}
}
}
}
CCSE.AddStyles = function(content){
var style = document.createElement('style');
style.setAttribute('type', 'text/css');
style.innerHTML = content;
document.getElementsByTagName('head')[0].appendChild(style);
}
/*=====================================================================================
Confirmation Prompts
=======================================================================================*/
CCSE.ConfirmLoad = function(modName, modVersion, versionText){
return confirm(
`${ modName } version ${ modVersion } is meant for ${ versionText }. `+
"Loading a different version may cause errors. " +
`Do you still want to load ${ modName }?`);
}
CCSE.ConfirmGameVersion = function(modName, modVersion, version){
var proceed = true;
if(Game.version != version){
proceed = CCSE.ConfirmLoad(modName, modVersion, `Game version ${ version }`);
}
return proceed;
}
CCSE.ConfirmCCSEVersion = function(modName, modVersion, version){
var proceed = true;
if(CCSE.version != version){
proceed = CCSE.ConfirmLoad(modName, modVersion, `CCSE version ${ version }`);
}
return proceed;
}
CCSE.ConfirmGameCCSEVersion = function(modName, modVersion, gameVersion, ccseVersion){
var proceed = true;
if(Game.version != gameVersion && CCSE.version != ccseVersion){
proceed = CCSE.ConfirmLoad(modName, modVersion, `Game version ${ gameVersion } and CCSE version ${ ccseVersion }`);
}
else if(Game.version != gameVersion){
proceed = CCSE.ConfirmLoad(modName, modVersion, `Game version ${ gameVersion }`);
}
else if(CCSE.version != ccseVersion){
proceed = CCSE.ConfirmLoad(modName, modVersion, `CCSE version ${ ccseVersion }`);
}
return proceed;
}
/* Doesn't work until the mods actually get loaded in order
CCSE.LaunchCCSEMod = function(func){
if(CCSE.isLoaded) func();
else CCSE.postLoadHooks.push(func);
}*/
if(CCSE.Steam){
CCSE.GetModPath = (modName) => {
let mod = App.mods[modName];
let pos = mod.dir.lastIndexOf('\\');
if(pos == -1) return '../mods/' + (mod.local ? 'local' : 'workshop') + '/' + mod.path;
else return '../mods/' + mod.dir.substring(pos + 1);
}
CCSE.GetModFolder = (modName) => App.mods[modName].path;
CCSE.MenuHelper.AutoVersion = (mod) => {
let func = function(){
let modInfo = Steam.mods[mod.id].info;
Game.customStatsMenu.push(function(){
CCSE.AppendStatsVersionNumber(modInfo.Name, modInfo.ModVersion);
});
}
if(CCSE.isLoaded) func();
else CCSE.postLoadHooks.push(func);
}
}
/*=====================================================================================
Start your engines
=======================================================================================*/
if(CCSE.ConfirmGameVersion(CCSE.name, CCSE.version, CCSE.GameVersion)){
Game.registerMod(CCSE.name, CCSE);
if(CCSE.Steam){
CCSE.LaunchOtherMods = Game.launchMods;
Game.launchMods = CCSE.init;
CCSE.GameLoadModData = Game.loadModData;
Game.loadModData = function(){CCSE.gameHasLoadedSave=1;}
}
}
}
if(!CCSE.isLoaded && !CCSE.loading) CCSE.launch();