Files
CookieMonster/src/Sim/Calculations/CalculateGains.js
2021-03-14 00:41:14 +01:00

219 lines
8.3 KiB
JavaScript

/* eslint-disable no-unused-vars */
import GetCPSBuffMult from '../../Cache/CPS/GetCPSBuffMult';
import { CacheCentEgg } from '../../Cache/VariablesAndData';
import SimAuraMult from '../ReplacedGameFunctions/SimAuraMult';
import SimEff from '../ReplacedGameFunctions/SimEff';
import SimGetHeavenlyMultiplier from '../ReplacedGameFunctions/SimGetHeavenlyMultiplier';
import SimHas from '../ReplacedGameFunctions/SimHas';
import SimHasGod from '../ReplacedGameFunctions/SimHasGod';
import SimWin from '../SimulationData/SimWin';
import {
SimAchievementsOwned, SimCookiesPs, SimCookiesPsRaw, SimDateAges, SimDateCentury, SimEffs, SimHeavenlyPower, SimObjects, SimPrestige, SimUpgrades,
} from '../VariablesAndData';
/**
* This function calculates the CPS of the current "sim data"
* It is similar to Game.CalculateGains()
* It is called at the start of any function that simulates certain behaviour or actions
* @global {number} CM.Sim.cookiesPs The CPS of the current sim data
*/
export default function CalculateGains() {
SimCookiesPs = 0;
let mult = 1;
// Include minigame effects
const effs = {};
for (const i of Object.keys(Game.Objects)) {
if (Game.Objects[i].minigameLoaded && Game.Objects[i].minigame.effs) {
const myEffs = Game.Objects[i].minigame.effs;
for (const ii in myEffs) {
if (effs[ii]) effs[ii] *= myEffs[ii];
else effs[ii] = myEffs[ii];
}
}
}
SimEffs = effs;
if (Game.ascensionMode !== 1) mult += parseFloat(SimPrestige) * 0.01 * SimHeavenlyPower * SimGetHeavenlyMultiplier();
mult *= SimEff('cps');
if (SimHas('Heralds') && Game.ascensionMode !== 1) mult *= 1 + 0.01 * Game.heralds;
for (const i of Object.keys(Game.cookieUpgrades)) {
const me = Game.cookieUpgrades[i];
if (SimHas(me.name)) {
// Some upgrades have a functio as .power (notably the valentine cookies)
// CM.Sim.InitialBuildingData has changed to use CM.Sim.Has instead of Game.Has etc.
// Therefore this call is to the .power of the Sim.Object
if (typeof (me.power) === 'function') {
mult *= 1 + (SimUpgrades[me.name].power(SimUpgrades[me.name]) * 0.01);
} else mult *= 1 + (me.power * 0.01);
}
}
if (SimHas('Specialized chocolate chips')) mult *= 1.01;
if (SimHas('Designer cocoa beans')) mult *= 1.02;
if (SimHas('Underworld ovens')) mult *= 1.03;
if (SimHas('Exotic nuts')) mult *= 1.04;
if (SimHas('Arcane sugar')) mult *= 1.05;
if (SimHas('Increased merriness')) mult *= 1.15;
if (SimHas('Improved jolliness')) mult *= 1.15;
if (SimHas('A lump of coal')) mult *= 1.01;
if (SimHas('An itchy sweater')) mult *= 1.01;
if (SimHas('Santa\'s dominion')) mult *= 1.2;
if (SimHas('Fortune #100')) mult *= 1.01;
if (SimHas('Fortune #101')) mult *= 1.07;
if (SimHas('Dragon scale')) mult *= 1.03;
// Check effect of chosen Gods
let buildMult = 1;
if (SimHasGod) {
let godLvl = SimHasGod('asceticism');
if (godLvl === 1) mult *= 1.15;
else if (godLvl === 2) mult *= 1.1;
else if (godLvl === 3) mult *= 1.05;
godLvl = SimHasGod('ages');
if (godLvl === 1) mult *= 1 + 0.15 * Math.sin((SimDateAges / 1000 / (60 * 60 * 3)) * Math.PI * 2);
else if (godLvl === 2) mult *= 1 + 0.15 * Math.sin((SimDateAges / 1000 / (60 * 60 * 12)) * Math.PI * 2);
else if (godLvl === 3) mult *= 1 + 0.15 * Math.sin((SimDateAges / 1000 / (60 * 60 * 24)) * Math.PI * 2);
godLvl = SimHasGod('decadence');
if (godLvl === 1) buildMult *= 0.93;
else if (godLvl === 2) buildMult *= 0.95;
else if (godLvl === 3) buildMult *= 0.98;
godLvl = SimHasGod('industry');
if (godLvl === 1) buildMult *= 1.1;
else if (godLvl === 2) buildMult *= 1.06;
else if (godLvl === 3) buildMult *= 1.03;
godLvl = SimHasGod('labor');
if (godLvl === 1) buildMult *= 0.97;
else if (godLvl === 2) buildMult *= 0.98;
else if (godLvl === 3) buildMult *= 0.99;
}
if (SimHas('Santa\'s legacy')) mult *= 1 + (Game.santaLevel + 1) * 0.03;
const milkProgress = SimAchievementsOwned / 25;
let milkMult = 1;
if (SimHas('Santa\'s milk and cookies')) milkMult *= 1.05;
// if (CM.Sim.hasAura('Breath of Milk')) milkMult *= 1.05;
milkMult *= 1 + SimAuraMult('Breath of Milk') * 0.05;
if (SimHasGod) {
const godLvl = SimHasGod('mother');
if (godLvl === 1) milkMult *= 1.1;
else if (godLvl === 2) milkMult *= 1.05;
else if (godLvl === 3) milkMult *= 1.03;
}
milkMult *= SimEff('milk');
let catMult = 1;
if (SimHas('Kitten helpers')) catMult *= (1 + milkProgress * 0.1 * milkMult);
if (SimHas('Kitten workers')) catMult *= (1 + milkProgress * 0.125 * milkMult);
if (SimHas('Kitten engineers')) catMult *= (1 + milkProgress * 0.15 * milkMult);
if (SimHas('Kitten overseers')) catMult *= (1 + milkProgress * 0.175 * milkMult);
if (SimHas('Kitten managers')) catMult *= (1 + milkProgress * 0.2 * milkMult);
if (SimHas('Kitten accountants')) catMult *= (1 + milkProgress * 0.2 * milkMult);
if (SimHas('Kitten specialists')) catMult *= (1 + milkProgress * 0.2 * milkMult);
if (SimHas('Kitten experts')) catMult *= (1 + milkProgress * 0.2 * milkMult);
if (SimHas('Kitten consultants')) catMult *= (1 + milkProgress * 0.2 * milkMult);
if (SimHas('Kitten assistants to the regional manager')) catMult *= (1 + milkProgress * 0.175 * milkMult);
if (SimHas('Kitten marketeers')) catMult *= (1 + milkProgress * 0.15 * milkMult);
if (SimHas('Kitten analysts')) catMult *= (1 + milkProgress * 0.125 * milkMult);
if (SimHas('Kitten executives')) catMult *= (1 + milkProgress * 0.115 * milkMult);
if (SimHas('Kitten angels')) catMult *= (1 + milkProgress * 0.1 * milkMult);
if (SimHas('Fortune #103')) catMult *= (1 + milkProgress * 0.05 * milkMult);
for (const i of Object.keys(SimObjects)) {
const me = SimObjects[i];
let storedCps = me.cps(me);
if (Game.ascensionMode !== 1) storedCps *= (1 + me.level * 0.01) * buildMult;
if (me.name === 'Grandma' && SimHas('Milkhelp® lactose intolerance relief tablets')) storedCps *= 1 + 0.05 * milkProgress * milkMult;
SimCookiesPs += me.amount * storedCps;
}
if (SimHas('"egg"')) SimCookiesPs += 9;// "egg"
mult *= catMult;
let eggMult = 1;
if (SimHas('Chicken egg')) eggMult *= 1.01;
if (SimHas('Duck egg')) eggMult *= 1.01;
if (SimHas('Turkey egg')) eggMult *= 1.01;
if (SimHas('Quail egg')) eggMult *= 1.01;
if (SimHas('Robin egg')) eggMult *= 1.01;
if (SimHas('Ostrich egg')) eggMult *= 1.01;
if (SimHas('Cassowary egg')) eggMult *= 1.01;
if (SimHas('Salmon roe')) eggMult *= 1.01;
if (SimHas('Frogspawn')) eggMult *= 1.01;
if (SimHas('Shark egg')) eggMult *= 1.01;
if (SimHas('Turtle egg')) eggMult *= 1.01;
if (SimHas('Ant larva')) eggMult *= 1.01;
if (SimHas('Century egg')) {
// The boost increases a little every day, with diminishing returns up to +10% on the 100th day
let day = Math.floor((SimDateCentury - Game.startDate) / 1000 / 10) * 10 / 60 / 60 / 24;
day = Math.min(day, 100);
// Sets a Cache value to be displayed in the Stats page, could be moved...
CacheCentEgg = 1 + (1 - (1 - day / 100) ** 3) * 0.1;
eggMult *= CacheCentEgg;
}
mult *= eggMult;
if (SimHas('Sugar baking')) mult *= (1 + Math.min(100, Game.lumps) * 0.01);
// if (CM.Sim.hasAura('Radiant Appetite')) mult *= 2;
mult *= 1 + SimAuraMult('Radiant Appetite');
const rawCookiesPs = SimCookiesPs * mult;
for (const i of Object.keys(Game.CpsAchievements)) {
if (rawCookiesPs >= Game.CpsAchievements[i].threshold) SimWin(Game.CpsAchievements[i].name);
}
SimCookiesPsRaw = rawCookiesPs;
const n = Game.shimmerTypes.golden.n;
const auraMult = SimAuraMult('Dragon\'s Fortune');
for (let i = 0; i < n; i++) {
mult *= 1 + auraMult * 1.23;
}
const name = Game.bakeryName.toLowerCase();
if (name === 'orteil') mult *= 0.99;
else if (name === 'ortiel') mult *= 0.98;
if (SimHas('Elder Covenant')) mult *= 0.95;
if (SimHas('Golden switch [off]')) {
let goldenSwitchMult = 1.5;
if (SimHas('Residual luck')) {
const upgrades = Game.goldenCookieUpgrades;
for (const i of Object.keys(upgrades)) {
if (SimHas(upgrades[i])) goldenSwitchMult += 0.1;
}
}
mult *= goldenSwitchMult;
}
if (SimHas('Shimmering veil [off]')) {
let veilMult = 0.5;
if (SimHas('Reinforced membrane')) veilMult += 0.1;
mult *= 1 + veilMult;
}
if (SimHas('Magic shenanigans')) mult *= 1000;
if (SimHas('Occult obstruction')) mult *= 0;
SimCookiesPs = Game.runModHookOnValue('cps', SimCookiesPs);
mult *= GetCPSBuffMult();
SimCookiesPs *= mult;
// if (Game.hasBuff('Cursed finger')) Game.cookiesPs = 0;
}