Skip to content

Commit

Permalink
Merge pull request #599 from Pseudo-Corp/player-object-2
Browse files Browse the repository at this point in the history
Player object 2
  • Loading branch information
Pseudonian authored Jun 19, 2024
2 parents 079f852 + 6f5c79a commit 34d3b0b
Show file tree
Hide file tree
Showing 28 changed files with 1,815 additions and 394 deletions.
220 changes: 142 additions & 78 deletions index.html

Large diffs are not rendered by default.

5 changes: 4 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,14 @@
"eventemitter3": "^4.0.7",
"i18next": "^22.4.9",
"localforage": "^1.10.0",
"lodash.clonedeepwith": "^4.5.0",
"lz-string": "^1.4.4",
"worker-timers": "^7.0.53"
"worker-timers": "^7.0.53",
"zod": "^3.23.8"
},
"devDependencies": {
"@biomejs/biome": "^1.4.1",
"@types/lodash.clonedeepwith": "^4.5.9",
"@types/lz-string": "^1.3.34",
"deep-object-diff": "^1.1.9",
"dprint": "^0.45.0",
Expand Down
41 changes: 26 additions & 15 deletions src/BlueberryUpgrades.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import i18next from 'i18next'
import { DOMCacheGetOrSet } from './Cache/DOM'
import { calculateAmbrosiaGenerationSpeed, calculateAmbrosiaLuck } from './Calculate'
import { DynamicUpgrade } from './DynamicUpgrade'
import type { IUpgradeData } from './DynamicUpgrade'
import { exportData, saveFilename } from './ImportExport'
import { format, player } from './Synergism'
import type { Player } from './types/Synergism'
import { Alert, Confirm, Prompt } from './UpdateHTML'
import { visualUpdateAmbrosia } from './UpdateVisuals'
import { Globals as G } from './Variables'

export type blueberryUpgradeNames =
| 'ambrosiaTutorial'
Expand Down Expand Up @@ -121,7 +123,7 @@ export class BlueberryUpgrade extends DynamicUpgrade {
break
} else {
if (this.level === 0) {
const availableBlueberries = player.caches.blueberryInventory.totalVal - player.spentBlueberries
const availableBlueberries = G.ambrosiaCurrStats.ambrosiaBlueberries - player.spentBlueberries
if (availableBlueberries < this.blueberryCost) {
return Alert(i18next.t('ambrosia.notEnoughBlueberries'))
} else {
Expand Down Expand Up @@ -283,7 +285,7 @@ export class BlueberryUpgrade extends DynamicUpgrade {
}

public get rewardDesc (): string {
const effectiveLevel = (player.singularityChallenges.noAmbrosiaUpgrades.enabled) ? 0: this.level
const effectiveLevel = (player.singularityChallenges.noAmbrosiaUpgrades.enabled) ? 0 : this.level
if ('desc' in this.rewards(0)) {
return String(this.rewards(effectiveLevel).desc)
} else {
Expand All @@ -292,7 +294,7 @@ export class BlueberryUpgrade extends DynamicUpgrade {
}

public get bonus () {
const effectiveLevel = (player.singularityChallenges.noAmbrosiaUpgrades.enabled) ? 0: this.level
const effectiveLevel = (player.singularityChallenges.noAmbrosiaUpgrades.enabled) ? 0 : this.level
return this.rewards(effectiveLevel)
}
}
Expand Down Expand Up @@ -389,8 +391,9 @@ export const blueberryUpgradeData: Record<
ambrosiaTutorial: 10
},
cacheUpdates: [
() => player.caches.ambrosiaLuck.updateVal('BlueberryUpgrade1'),
() => player.caches.ambrosiaLuck.updateVal('BlueberryUpgrade2')
() => {
G.ambrosiaCurrStats.ambrosiaLuck = calculateAmbrosiaLuck().value
}
]
},
ambrosiaQuarkCube1: {
Expand Down Expand Up @@ -428,7 +431,7 @@ export const blueberryUpgradeData: Record<
},
rewards: (n: number) => {
const baseVal = 0.0002 * n
const val = 1 + baseVal * player.caches.ambrosiaLuck.usedTotal
const val = 1 + baseVal * G.ambrosiaCurrStats.ambrosiaLuck
return {
cubes: val,
desc: String(
Expand Down Expand Up @@ -485,9 +488,9 @@ export const blueberryUpgradeData: Record<
rewards: (n: number) => {
const baseVal = 0.0001 * n
const effectiveLuck = Math.min(
player.caches.ambrosiaLuck.usedTotal,
G.ambrosiaCurrStats.ambrosiaLuck,
Math.pow(1000, 0.5)
* Math.pow(player.caches.ambrosiaLuck.usedTotal, 0.5)
* Math.pow(G.ambrosiaCurrStats.ambrosiaLuck, 0.5)
)
const val = 1 + baseVal * effectiveLuck
return {
Expand Down Expand Up @@ -535,7 +538,9 @@ export const blueberryUpgradeData: Record<
ambrosiaCubes1: 20
},
cacheUpdates: [
() => player.caches.ambrosiaLuck.updateVal('BlueberryCubeLuck1')
() => {
G.ambrosiaCurrStats.ambrosiaLuck = calculateAmbrosiaLuck().value
}
]
},
ambrosiaQuarkLuck1: {
Expand Down Expand Up @@ -563,7 +568,9 @@ export const blueberryUpgradeData: Record<
ambrosiaQuarks1: 20
},
cacheUpdates: [
() => player.caches.ambrosiaLuck.updateVal('BlueberryQuarkLuck1')
() => {
G.ambrosiaCurrStats.ambrosiaLuck = calculateAmbrosiaLuck().value
}
]
},
ambrosiaQuarks2: {
Expand Down Expand Up @@ -645,7 +652,9 @@ export const blueberryUpgradeData: Record<
ambrosiaLuck1: 40
},
cacheUpdates: [
() => player.caches.ambrosiaLuck.updateVal('BlueberryUpgrade2')
() => {
G.ambrosiaCurrStats.ambrosiaLuck = calculateAmbrosiaLuck().value
}
]
},
ambrosiaPatreon: {
Expand All @@ -667,7 +676,9 @@ export const blueberryUpgradeData: Record<
}
},
cacheUpdates: [
() => player.caches.ambrosiaGeneration.updateVal('BlueberryPatreon')
() => {
G.ambrosiaCurrStats.ambrosiaGenerationSpeed = calculateAmbrosiaGenerationSpeed().value
}
]
},
ambrosiaObtainium1: {
Expand All @@ -678,7 +689,7 @@ export const blueberryUpgradeData: Record<
return baseCost * Math.pow(25, level)
},
rewards: (n: number) => {
const luck = player.caches.ambrosiaLuck.usedTotal
const luck = G.ambrosiaCurrStats.ambrosiaLuck
return {
luckMult: n,
obtainiumMult: n * luck,
Expand All @@ -698,7 +709,7 @@ export const blueberryUpgradeData: Record<
return baseCost * Math.pow(25, level)
},
rewards: (n: number) => {
const luck = player.caches.ambrosiaLuck.usedTotal
const luck = G.ambrosiaCurrStats.ambrosiaLuck
return {
luckMult: n,
offeringMult: n * luck,
Expand Down Expand Up @@ -757,7 +768,7 @@ export const validateBlueberryTree = (modules: BlueberryOpt) => {
}

const ambrosiaBudget = player.lifetimeAmbrosia
const blueberryBudget = player.caches.blueberryInventory.totalVal
const blueberryBudget = G.ambrosiaCurrStats.ambrosiaBlueberries

let spentAmbrosia = 0
let spentBlueberries = 0
Expand Down
103 changes: 97 additions & 6 deletions src/Calculate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { quarkHandler } from './Quark'
import { reset } from './Reset'
import { calculateSingularityDebuff } from './singularity'
import { getFastForwardTotalMultiplier } from './singularity'
import { cacheReinitialize } from './StatCache'
import { format, getTimePinnedToLoadDate, player, resourceGain, saveSynergy, updateAll } from './Synergism'
import { toggleTalismanBuy, updateTalismanInventory } from './Talismans'
import { clearInterval, setInterval } from './Timers'
Expand Down Expand Up @@ -571,6 +572,7 @@ export const calculateObtainium = () => {
G.obtainiumGain *= 1 + player.researches[81] / 10
G.obtainiumGain *= 1 + player.shopUpgrades.obtainiumAuto / 50
G.obtainiumGain *= 1 + player.shopUpgrades.cashGrab / 100
G.obtainiumGain *= 1 + (1 / 25) * player.shopUpgrades.obtainiumEX
G.obtainiumGain *= 1
+ (G.rune5level / 200)
* G.effectiveLevelMult
Expand Down Expand Up @@ -623,7 +625,6 @@ export const calculateObtainium = () => {
G.obtainiumGain += 2 * player.researches[64]
}
G.obtainiumGain *= Math.min(1, Math.pow(player.reincarnationcounter / 10, 2))
G.obtainiumGain *= 1 + (1 / 25) * player.shopUpgrades.obtainiumEX
if (player.reincarnationCount >= 5) {
G.obtainiumGain *= Math.max(1, player.reincarnationcounter / 10)
}
Expand Down Expand Up @@ -1398,6 +1399,8 @@ export const calculateOffline = async (forceTime = 0) => {
quarks: quarkHandler().gain // Calculate this after the fact
}

cacheReinitialize()

addTimers('ascension', timeAdd)
addTimers('quarks', timeAdd)
addTimers('goldenQuarks', timeAdd)
Expand Down Expand Up @@ -1777,7 +1780,7 @@ export const calculateAllCubeMultiplier = () => {
// Cash Grab Ultra
+calculateCashGrabCubeBonus(),
// EX Ultra
+calculateEXUltraCubeBonus(),
+calculateEXUltraCubeBonus()
// Total Global Cube Multipliers: 33
]

Expand Down Expand Up @@ -2117,7 +2120,7 @@ export const getOcteractValueMultipliers = () => {
// Cash Grab ULTRA
+calculateCashGrabCubeBonus(),
// EX ULTRA
+calculateEXUltraCubeBonus(),
+calculateEXUltraCubeBonus()
]
}

Expand Down Expand Up @@ -3225,7 +3228,7 @@ export const calculateAmbrosiaQuarkMult = () => {
}

export const calculateCashGrabBonus = (extra: number) => {
return 1 + player.shopUpgrades.shopCashGrabUltra * extra * Math.min(1, Math.pow(player.lifetimeAmbrosia / 1e7, 1/3))
return 1 + player.shopUpgrades.shopCashGrabUltra * extra * Math.min(1, Math.pow(player.lifetimeAmbrosia / 1e7, 1 / 3))
}

export const calculateCashGrabBlueberryBonus = () => {
Expand Down Expand Up @@ -3257,13 +3260,14 @@ export const calculateEXUltraCubeBonus = () => {
}

export const calculateEXALTBonusMult = () => {
if (!player.singularityChallenges.limitedAscensions.rewards.exaltBonus)
if (!player.singularityChallenges.limitedAscensions.rewards.exaltBonus) {
return 1
}

if (G.currentSingChallenge !== undefined) {
return Math.pow(1.04, player.singularityChallenges[G.currentSingChallenge].completions)
}
return 1
return 1
}

export const calculateDilatedFiveLeafBonus = () => {
Expand All @@ -3275,6 +3279,93 @@ export const calculateDilatedFiveLeafBonus = () => {
return singThresholds.length / 100
}

/**
* Computs Additive Luck Multiplier for Ambrosia Luck. Base = 1.00
* @returns Additive Luck Multiplier and array of modifiers
*/
export const calculateAdditiveLuckMult = () => {
const arr = [
1,
+player.singularityChallenges.noSingularityUpgrades.rewards.luckBonus, // No Singularity Upgrade 1x30
calculateDilatedFiveLeafBonus(), // Dilated Five Leaf Clover Perk
player.shopUpgrades.shopAmbrosiaLuckMultiplier4 / 100, // EXALT-unlocked shop upgrade
+player.singularityChallenges.noAmbrosiaUpgrades.rewards.luckBonus, // No Ambrosia Challenge Reward
G.isEvent ? calculateEventBuff(BuffType.AmbrosiaLuck) : 0 // Event
]

return {
value: sumContents(arr),
array: arr
}
}

/**
* Computs Ambrosia Luck. Base = 100
* @returns Ambrosia Luck * Additive Luck Multiplier, and array of modifiers (last entry is multiplier)
*/
export const calculateAmbrosiaLuck = () => {
const arr = [
100, // Base
calculateSingularityAmbrosiaLuckMilestoneBonus(), // Ambrosia Luck Milestones
calculateAmbrosiaLuckShopUpgrade(), // Ambrosia Luck from Shop Upgrades (I-IV)
calculateAmbrosiaLuckSingularityUpgrade(), // Ambrosia Luck from Singularity Upgrades (I-IV)
calculateAmbrosiaLuckOcteractUpgrade(), // Ambrosia Luck from Octeract Upgrades (I-IV)
+player.blueberryUpgrades.ambrosiaLuck1.bonus.ambrosiaLuck, // Ambrosia Luck from Luck Module I
+player.blueberryUpgrades.ambrosiaLuck2.bonus.ambrosiaLuck, // Ambrosia Luck from Luck Module II
+player.blueberryUpgrades.ambrosiaCubeLuck1.bonus.ambrosiaLuck, // Ambrosia Luck from Cube-Luck Synergy Module
+player.blueberryUpgrades.ambrosiaQuarkLuck1.bonus.ambrosiaLuck, // Ambrosia Luck from Quark-Luck Synergy Module
player.highestSingularityCount >= 131 ? 131 : 0, // Singularity Perk "One Hundred Thirty One!"
player.highestSingularityCount >= 269 ? 269 : 0, // Singularity Perk "Two Hundred Sixty Nine!"
player.shopUpgrades.shopOcteractAmbrosiaLuck * (1 + Math.floor(Math.log10(player.totalWowOcteracts + 1))), // Octeract -> Ambrosia Shop Upgrade
+player.singularityChallenges.noAmbrosiaUpgrades.rewards.additiveLuck // No Ambrosia Challenge Reward
]

const multiplicativeLuck = calculateAdditiveLuckMult().value

return {
value: sumContents(arr) * multiplicativeLuck,
array: arr.concat(multiplicativeLuck)
}
}

/**
* Calculates the total number of Blueberries unlocked
* @returns Blueberry Count, and array of modifiers
*/
export const calculateBlueberryInventory = () => {
const arr = [
+(player.singularityChallenges.noSingularityUpgrades.completions > 0), // E1x1 Clear!
+player.singularityUpgrades.blueberries.getEffect().bonus, // Singularity Blueberry Upgrade
calculateSingularityMilestoneBlueberries(), // Singularity Milestones (Congealed Blueberries)
+player.singularityChallenges.noAmbrosiaUpgrades.rewards.blueberries // No Ambrosia Challenge Reward
]

return {
value: sumContents(arr),
array: arr
}
}

export const calculateAmbrosiaGenerationSpeed = () => {
const arr = [
+player.visitedAmbrosiaSubtab,
calculateBlueberryInventory().value,
calculateAmbrosiaGenerationShopUpgrade(),
calculateAmbrosiaGenerationSingularityUpgrade(),
calculateAmbrosiaGenerationOcteractUpgrade(),
+player.blueberryUpgrades.ambrosiaPatreon.bonus.blueberryGeneration,
+player.singularityChallenges.oneChallengeCap.rewards.blueberrySpeedMult,
+player.singularityChallenges.noAmbrosiaUpgrades.rewards.blueberrySpeedMult,
G.isEvent ? 1 + calculateEventBuff(BuffType.BlueberryTime) : 1,
calculateCashGrabBlueberryBonus()
]

return {
value: productContents(arr),
array: arr
}
}

export const dailyResetCheck = () => {
if (!player.dayCheck) {
return
Expand Down
6 changes: 3 additions & 3 deletions src/CheckVariables.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1048,7 +1048,7 @@ export const checkVariablesOnLoad = (data: PlayerSave) => {
shopAmbrosiaLuck4: 0,
shopCashGrabUltra: 0,
shopAmbrosiaAccelerator: 0,
shopEXUltra: 0,
shopEXUltra: 0
}

player.worlds.add(
Expand Down Expand Up @@ -1438,7 +1438,7 @@ export const checkVariablesOnLoad = (data: PlayerSave) => {
if (enabled) {
Globals.currentSingChallenge = singularityChallengeData[k].HTMLTag
}

player.singularityChallenges[k] = new SingularityChallenge(
updatedData,
k.toString()
Expand Down Expand Up @@ -1675,7 +1675,7 @@ export const checkVariablesOnLoad = (data: PlayerSave) => {
player.ultimateProgress = 0
}

if (player.shopUpgrades.shopAmbrosiaAccelerator === undefined) {
if (player.shopUpgrades.shopAmbrosiaAccelerator === undefined) {
player.shopUpgrades.shopCashGrabUltra = 0
player.shopUpgrades.shopAmbrosiaAccelerator = 0
player.shopUpgrades.shopEXUltra = 0
Expand Down
6 changes: 4 additions & 2 deletions src/Event.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import i18next from 'i18next'
import { DOMCacheGetOrSet } from './Cache/DOM'
import { calculateAdditiveLuckMult, calculateAmbrosiaGenerationSpeed, calculateAmbrosiaLuck } from './Calculate'
import { format, getTimePinnedToLoadDate, player } from './Synergism'
import { Alert, revealStuff } from './UpdateHTML'
import { Globals as G } from './Variables'
Expand Down Expand Up @@ -184,8 +185,9 @@ export const eventCheck = async () => {

if (G.isEvent !== updateIsEventCheck) {
revealStuff()
player.caches.ambrosiaGeneration.updateVal('Event')
player.caches.ambrosiaLuckAdditiveMult.updateVal('Event')
G.ambrosiaCurrStats.ambrosiaAdditiveLuckMult = calculateAdditiveLuckMult().value
G.ambrosiaCurrStats.ambrosiaLuck = calculateAmbrosiaLuck().value
G.ambrosiaCurrStats.ambrosiaGenerationSpeed = calculateAmbrosiaGenerationSpeed().value
}
}

Expand Down
4 changes: 2 additions & 2 deletions src/EventListeners.ts
Original file line number Diff line number Diff line change
Expand Up @@ -542,7 +542,7 @@ export const generateEventHandlers = () => {
'input',
() => updateAutoChallenge(3)
)
// Part 3: Subtabs because Mixelz doesn't know what the fuck he's doing

for (let index = 0; index < 2; index++) {
DOMCacheGetOrSet(`toggleChallengesSubTab${index + 1}`).addEventListener(
'click',
Expand Down Expand Up @@ -866,7 +866,7 @@ export const generateEventHandlers = () => {
DOMCacheGetOrSet('exportgame').addEventListener('click', () => exportSynergism())
DOMCacheGetOrSet('saveStringInput').addEventListener('blur', (e) => updateSaveString(e.target as HTMLInputElement))
DOMCacheGetOrSet('savegame').addEventListener('click', () => saveSynergy(true))
DOMCacheGetOrSet('deleteGame').addEventListener('click', () => resetGame())
DOMCacheGetOrSet('deleteGame').addEventListener('click', () => resetGame(false))
DOMCacheGetOrSet('preloadDeleteGame').addEventListener('click', () => reloadDeleteGame())
DOMCacheGetOrSet('promocodes').addEventListener('click', () => promocodesPrompt())
DOMCacheGetOrSet('addCodeBox').addEventListener('mouseover', () => promocodesInfo('add'))
Expand Down
Loading

0 comments on commit 34d3b0b

Please sign in to comment.