Skip to content

Commit 34d3b0b

Browse files
authored
Merge pull request #599 from Pseudo-Corp/player-object-2
Player object 2
2 parents 079f852 + 6f5c79a commit 34d3b0b

28 files changed

+1815
-394
lines changed

index.html

+142-78
Large diffs are not rendered by default.

package.json

+4-1
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,14 @@
1010
"eventemitter3": "^4.0.7",
1111
"i18next": "^22.4.9",
1212
"localforage": "^1.10.0",
13+
"lodash.clonedeepwith": "^4.5.0",
1314
"lz-string": "^1.4.4",
14-
"worker-timers": "^7.0.53"
15+
"worker-timers": "^7.0.53",
16+
"zod": "^3.23.8"
1517
},
1618
"devDependencies": {
1719
"@biomejs/biome": "^1.4.1",
20+
"@types/lodash.clonedeepwith": "^4.5.9",
1821
"@types/lz-string": "^1.3.34",
1922
"deep-object-diff": "^1.1.9",
2023
"dprint": "^0.45.0",

src/BlueberryUpgrades.ts

+26-15
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import i18next from 'i18next'
22
import { DOMCacheGetOrSet } from './Cache/DOM'
3+
import { calculateAmbrosiaGenerationSpeed, calculateAmbrosiaLuck } from './Calculate'
34
import { DynamicUpgrade } from './DynamicUpgrade'
45
import type { IUpgradeData } from './DynamicUpgrade'
56
import { exportData, saveFilename } from './ImportExport'
67
import { format, player } from './Synergism'
78
import type { Player } from './types/Synergism'
89
import { Alert, Confirm, Prompt } from './UpdateHTML'
910
import { visualUpdateAmbrosia } from './UpdateVisuals'
11+
import { Globals as G } from './Variables'
1012

1113
export type blueberryUpgradeNames =
1214
| 'ambrosiaTutorial'
@@ -121,7 +123,7 @@ export class BlueberryUpgrade extends DynamicUpgrade {
121123
break
122124
} else {
123125
if (this.level === 0) {
124-
const availableBlueberries = player.caches.blueberryInventory.totalVal - player.spentBlueberries
126+
const availableBlueberries = G.ambrosiaCurrStats.ambrosiaBlueberries - player.spentBlueberries
125127
if (availableBlueberries < this.blueberryCost) {
126128
return Alert(i18next.t('ambrosia.notEnoughBlueberries'))
127129
} else {
@@ -283,7 +285,7 @@ export class BlueberryUpgrade extends DynamicUpgrade {
283285
}
284286

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

294296
public get bonus () {
295-
const effectiveLevel = (player.singularityChallenges.noAmbrosiaUpgrades.enabled) ? 0: this.level
297+
const effectiveLevel = (player.singularityChallenges.noAmbrosiaUpgrades.enabled) ? 0 : this.level
296298
return this.rewards(effectiveLevel)
297299
}
298300
}
@@ -389,8 +391,9 @@ export const blueberryUpgradeData: Record<
389391
ambrosiaTutorial: 10
390392
},
391393
cacheUpdates: [
392-
() => player.caches.ambrosiaLuck.updateVal('BlueberryUpgrade1'),
393-
() => player.caches.ambrosiaLuck.updateVal('BlueberryUpgrade2')
394+
() => {
395+
G.ambrosiaCurrStats.ambrosiaLuck = calculateAmbrosiaLuck().value
396+
}
394397
]
395398
},
396399
ambrosiaQuarkCube1: {
@@ -428,7 +431,7 @@ export const blueberryUpgradeData: Record<
428431
},
429432
rewards: (n: number) => {
430433
const baseVal = 0.0002 * n
431-
const val = 1 + baseVal * player.caches.ambrosiaLuck.usedTotal
434+
const val = 1 + baseVal * G.ambrosiaCurrStats.ambrosiaLuck
432435
return {
433436
cubes: val,
434437
desc: String(
@@ -485,9 +488,9 @@ export const blueberryUpgradeData: Record<
485488
rewards: (n: number) => {
486489
const baseVal = 0.0001 * n
487490
const effectiveLuck = Math.min(
488-
player.caches.ambrosiaLuck.usedTotal,
491+
G.ambrosiaCurrStats.ambrosiaLuck,
489492
Math.pow(1000, 0.5)
490-
* Math.pow(player.caches.ambrosiaLuck.usedTotal, 0.5)
493+
* Math.pow(G.ambrosiaCurrStats.ambrosiaLuck, 0.5)
491494
)
492495
const val = 1 + baseVal * effectiveLuck
493496
return {
@@ -535,7 +538,9 @@ export const blueberryUpgradeData: Record<
535538
ambrosiaCubes1: 20
536539
},
537540
cacheUpdates: [
538-
() => player.caches.ambrosiaLuck.updateVal('BlueberryCubeLuck1')
541+
() => {
542+
G.ambrosiaCurrStats.ambrosiaLuck = calculateAmbrosiaLuck().value
543+
}
539544
]
540545
},
541546
ambrosiaQuarkLuck1: {
@@ -563,7 +568,9 @@ export const blueberryUpgradeData: Record<
563568
ambrosiaQuarks1: 20
564569
},
565570
cacheUpdates: [
566-
() => player.caches.ambrosiaLuck.updateVal('BlueberryQuarkLuck1')
571+
() => {
572+
G.ambrosiaCurrStats.ambrosiaLuck = calculateAmbrosiaLuck().value
573+
}
567574
]
568575
},
569576
ambrosiaQuarks2: {
@@ -645,7 +652,9 @@ export const blueberryUpgradeData: Record<
645652
ambrosiaLuck1: 40
646653
},
647654
cacheUpdates: [
648-
() => player.caches.ambrosiaLuck.updateVal('BlueberryUpgrade2')
655+
() => {
656+
G.ambrosiaCurrStats.ambrosiaLuck = calculateAmbrosiaLuck().value
657+
}
649658
]
650659
},
651660
ambrosiaPatreon: {
@@ -667,7 +676,9 @@ export const blueberryUpgradeData: Record<
667676
}
668677
},
669678
cacheUpdates: [
670-
() => player.caches.ambrosiaGeneration.updateVal('BlueberryPatreon')
679+
() => {
680+
G.ambrosiaCurrStats.ambrosiaGenerationSpeed = calculateAmbrosiaGenerationSpeed().value
681+
}
671682
]
672683
},
673684
ambrosiaObtainium1: {
@@ -678,7 +689,7 @@ export const blueberryUpgradeData: Record<
678689
return baseCost * Math.pow(25, level)
679690
},
680691
rewards: (n: number) => {
681-
const luck = player.caches.ambrosiaLuck.usedTotal
692+
const luck = G.ambrosiaCurrStats.ambrosiaLuck
682693
return {
683694
luckMult: n,
684695
obtainiumMult: n * luck,
@@ -698,7 +709,7 @@ export const blueberryUpgradeData: Record<
698709
return baseCost * Math.pow(25, level)
699710
},
700711
rewards: (n: number) => {
701-
const luck = player.caches.ambrosiaLuck.usedTotal
712+
const luck = G.ambrosiaCurrStats.ambrosiaLuck
702713
return {
703714
luckMult: n,
704715
offeringMult: n * luck,
@@ -757,7 +768,7 @@ export const validateBlueberryTree = (modules: BlueberryOpt) => {
757768
}
758769

759770
const ambrosiaBudget = player.lifetimeAmbrosia
760-
const blueberryBudget = player.caches.blueberryInventory.totalVal
771+
const blueberryBudget = G.ambrosiaCurrStats.ambrosiaBlueberries
761772

762773
let spentAmbrosia = 0
763774
let spentBlueberries = 0

src/Calculate.ts

+97-6
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { quarkHandler } from './Quark'
1111
import { reset } from './Reset'
1212
import { calculateSingularityDebuff } from './singularity'
1313
import { getFastForwardTotalMultiplier } from './singularity'
14+
import { cacheReinitialize } from './StatCache'
1415
import { format, getTimePinnedToLoadDate, player, resourceGain, saveSynergy, updateAll } from './Synergism'
1516
import { toggleTalismanBuy, updateTalismanInventory } from './Talismans'
1617
import { clearInterval, setInterval } from './Timers'
@@ -571,6 +572,7 @@ export const calculateObtainium = () => {
571572
G.obtainiumGain *= 1 + player.researches[81] / 10
572573
G.obtainiumGain *= 1 + player.shopUpgrades.obtainiumAuto / 50
573574
G.obtainiumGain *= 1 + player.shopUpgrades.cashGrab / 100
575+
G.obtainiumGain *= 1 + (1 / 25) * player.shopUpgrades.obtainiumEX
574576
G.obtainiumGain *= 1
575577
+ (G.rune5level / 200)
576578
* G.effectiveLevelMult
@@ -623,7 +625,6 @@ export const calculateObtainium = () => {
623625
G.obtainiumGain += 2 * player.researches[64]
624626
}
625627
G.obtainiumGain *= Math.min(1, Math.pow(player.reincarnationcounter / 10, 2))
626-
G.obtainiumGain *= 1 + (1 / 25) * player.shopUpgrades.obtainiumEX
627628
if (player.reincarnationCount >= 5) {
628629
G.obtainiumGain *= Math.max(1, player.reincarnationcounter / 10)
629630
}
@@ -1398,6 +1399,8 @@ export const calculateOffline = async (forceTime = 0) => {
13981399
quarks: quarkHandler().gain // Calculate this after the fact
13991400
}
14001401

1402+
cacheReinitialize()
1403+
14011404
addTimers('ascension', timeAdd)
14021405
addTimers('quarks', timeAdd)
14031406
addTimers('goldenQuarks', timeAdd)
@@ -1777,7 +1780,7 @@ export const calculateAllCubeMultiplier = () => {
17771780
// Cash Grab Ultra
17781781
+calculateCashGrabCubeBonus(),
17791782
// EX Ultra
1780-
+calculateEXUltraCubeBonus(),
1783+
+calculateEXUltraCubeBonus()
17811784
// Total Global Cube Multipliers: 33
17821785
]
17831786

@@ -2117,7 +2120,7 @@ export const getOcteractValueMultipliers = () => {
21172120
// Cash Grab ULTRA
21182121
+calculateCashGrabCubeBonus(),
21192122
// EX ULTRA
2120-
+calculateEXUltraCubeBonus(),
2123+
+calculateEXUltraCubeBonus()
21212124
]
21222125
}
21232126

@@ -3225,7 +3228,7 @@ export const calculateAmbrosiaQuarkMult = () => {
32253228
}
32263229

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

32313234
export const calculateCashGrabBlueberryBonus = () => {
@@ -3257,13 +3260,14 @@ export const calculateEXUltraCubeBonus = () => {
32573260
}
32583261

32593262
export const calculateEXALTBonusMult = () => {
3260-
if (!player.singularityChallenges.limitedAscensions.rewards.exaltBonus)
3263+
if (!player.singularityChallenges.limitedAscensions.rewards.exaltBonus) {
32613264
return 1
3265+
}
32623266

32633267
if (G.currentSingChallenge !== undefined) {
32643268
return Math.pow(1.04, player.singularityChallenges[G.currentSingChallenge].completions)
32653269
}
3266-
return 1
3270+
return 1
32673271
}
32683272

32693273
export const calculateDilatedFiveLeafBonus = () => {
@@ -3275,6 +3279,93 @@ export const calculateDilatedFiveLeafBonus = () => {
32753279
return singThresholds.length / 100
32763280
}
32773281

3282+
/**
3283+
* Computs Additive Luck Multiplier for Ambrosia Luck. Base = 1.00
3284+
* @returns Additive Luck Multiplier and array of modifiers
3285+
*/
3286+
export const calculateAdditiveLuckMult = () => {
3287+
const arr = [
3288+
1,
3289+
+player.singularityChallenges.noSingularityUpgrades.rewards.luckBonus, // No Singularity Upgrade 1x30
3290+
calculateDilatedFiveLeafBonus(), // Dilated Five Leaf Clover Perk
3291+
player.shopUpgrades.shopAmbrosiaLuckMultiplier4 / 100, // EXALT-unlocked shop upgrade
3292+
+player.singularityChallenges.noAmbrosiaUpgrades.rewards.luckBonus, // No Ambrosia Challenge Reward
3293+
G.isEvent ? calculateEventBuff(BuffType.AmbrosiaLuck) : 0 // Event
3294+
]
3295+
3296+
return {
3297+
value: sumContents(arr),
3298+
array: arr
3299+
}
3300+
}
3301+
3302+
/**
3303+
* Computs Ambrosia Luck. Base = 100
3304+
* @returns Ambrosia Luck * Additive Luck Multiplier, and array of modifiers (last entry is multiplier)
3305+
*/
3306+
export const calculateAmbrosiaLuck = () => {
3307+
const arr = [
3308+
100, // Base
3309+
calculateSingularityAmbrosiaLuckMilestoneBonus(), // Ambrosia Luck Milestones
3310+
calculateAmbrosiaLuckShopUpgrade(), // Ambrosia Luck from Shop Upgrades (I-IV)
3311+
calculateAmbrosiaLuckSingularityUpgrade(), // Ambrosia Luck from Singularity Upgrades (I-IV)
3312+
calculateAmbrosiaLuckOcteractUpgrade(), // Ambrosia Luck from Octeract Upgrades (I-IV)
3313+
+player.blueberryUpgrades.ambrosiaLuck1.bonus.ambrosiaLuck, // Ambrosia Luck from Luck Module I
3314+
+player.blueberryUpgrades.ambrosiaLuck2.bonus.ambrosiaLuck, // Ambrosia Luck from Luck Module II
3315+
+player.blueberryUpgrades.ambrosiaCubeLuck1.bonus.ambrosiaLuck, // Ambrosia Luck from Cube-Luck Synergy Module
3316+
+player.blueberryUpgrades.ambrosiaQuarkLuck1.bonus.ambrosiaLuck, // Ambrosia Luck from Quark-Luck Synergy Module
3317+
player.highestSingularityCount >= 131 ? 131 : 0, // Singularity Perk "One Hundred Thirty One!"
3318+
player.highestSingularityCount >= 269 ? 269 : 0, // Singularity Perk "Two Hundred Sixty Nine!"
3319+
player.shopUpgrades.shopOcteractAmbrosiaLuck * (1 + Math.floor(Math.log10(player.totalWowOcteracts + 1))), // Octeract -> Ambrosia Shop Upgrade
3320+
+player.singularityChallenges.noAmbrosiaUpgrades.rewards.additiveLuck // No Ambrosia Challenge Reward
3321+
]
3322+
3323+
const multiplicativeLuck = calculateAdditiveLuckMult().value
3324+
3325+
return {
3326+
value: sumContents(arr) * multiplicativeLuck,
3327+
array: arr.concat(multiplicativeLuck)
3328+
}
3329+
}
3330+
3331+
/**
3332+
* Calculates the total number of Blueberries unlocked
3333+
* @returns Blueberry Count, and array of modifiers
3334+
*/
3335+
export const calculateBlueberryInventory = () => {
3336+
const arr = [
3337+
+(player.singularityChallenges.noSingularityUpgrades.completions > 0), // E1x1 Clear!
3338+
+player.singularityUpgrades.blueberries.getEffect().bonus, // Singularity Blueberry Upgrade
3339+
calculateSingularityMilestoneBlueberries(), // Singularity Milestones (Congealed Blueberries)
3340+
+player.singularityChallenges.noAmbrosiaUpgrades.rewards.blueberries // No Ambrosia Challenge Reward
3341+
]
3342+
3343+
return {
3344+
value: sumContents(arr),
3345+
array: arr
3346+
}
3347+
}
3348+
3349+
export const calculateAmbrosiaGenerationSpeed = () => {
3350+
const arr = [
3351+
+player.visitedAmbrosiaSubtab,
3352+
calculateBlueberryInventory().value,
3353+
calculateAmbrosiaGenerationShopUpgrade(),
3354+
calculateAmbrosiaGenerationSingularityUpgrade(),
3355+
calculateAmbrosiaGenerationOcteractUpgrade(),
3356+
+player.blueberryUpgrades.ambrosiaPatreon.bonus.blueberryGeneration,
3357+
+player.singularityChallenges.oneChallengeCap.rewards.blueberrySpeedMult,
3358+
+player.singularityChallenges.noAmbrosiaUpgrades.rewards.blueberrySpeedMult,
3359+
G.isEvent ? 1 + calculateEventBuff(BuffType.BlueberryTime) : 1,
3360+
calculateCashGrabBlueberryBonus()
3361+
]
3362+
3363+
return {
3364+
value: productContents(arr),
3365+
array: arr
3366+
}
3367+
}
3368+
32783369
export const dailyResetCheck = () => {
32793370
if (!player.dayCheck) {
32803371
return

src/CheckVariables.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1048,7 +1048,7 @@ export const checkVariablesOnLoad = (data: PlayerSave) => {
10481048
shopAmbrosiaLuck4: 0,
10491049
shopCashGrabUltra: 0,
10501050
shopAmbrosiaAccelerator: 0,
1051-
shopEXUltra: 0,
1051+
shopEXUltra: 0
10521052
}
10531053

10541054
player.worlds.add(
@@ -1438,7 +1438,7 @@ export const checkVariablesOnLoad = (data: PlayerSave) => {
14381438
if (enabled) {
14391439
Globals.currentSingChallenge = singularityChallengeData[k].HTMLTag
14401440
}
1441-
1441+
14421442
player.singularityChallenges[k] = new SingularityChallenge(
14431443
updatedData,
14441444
k.toString()
@@ -1675,7 +1675,7 @@ export const checkVariablesOnLoad = (data: PlayerSave) => {
16751675
player.ultimateProgress = 0
16761676
}
16771677

1678-
if (player.shopUpgrades.shopAmbrosiaAccelerator === undefined) {
1678+
if (player.shopUpgrades.shopAmbrosiaAccelerator === undefined) {
16791679
player.shopUpgrades.shopCashGrabUltra = 0
16801680
player.shopUpgrades.shopAmbrosiaAccelerator = 0
16811681
player.shopUpgrades.shopEXUltra = 0

src/Event.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import i18next from 'i18next'
22
import { DOMCacheGetOrSet } from './Cache/DOM'
3+
import { calculateAdditiveLuckMult, calculateAmbrosiaGenerationSpeed, calculateAmbrosiaLuck } from './Calculate'
34
import { format, getTimePinnedToLoadDate, player } from './Synergism'
45
import { Alert, revealStuff } from './UpdateHTML'
56
import { Globals as G } from './Variables'
@@ -184,8 +185,9 @@ export const eventCheck = async () => {
184185

185186
if (G.isEvent !== updateIsEventCheck) {
186187
revealStuff()
187-
player.caches.ambrosiaGeneration.updateVal('Event')
188-
player.caches.ambrosiaLuckAdditiveMult.updateVal('Event')
188+
G.ambrosiaCurrStats.ambrosiaAdditiveLuckMult = calculateAdditiveLuckMult().value
189+
G.ambrosiaCurrStats.ambrosiaLuck = calculateAmbrosiaLuck().value
190+
G.ambrosiaCurrStats.ambrosiaGenerationSpeed = calculateAmbrosiaGenerationSpeed().value
189191
}
190192
}
191193

src/EventListeners.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -542,7 +542,7 @@ export const generateEventHandlers = () => {
542542
'input',
543543
() => updateAutoChallenge(3)
544544
)
545-
// Part 3: Subtabs because Mixelz doesn't know what the fuck he's doing
545+
546546
for (let index = 0; index < 2; index++) {
547547
DOMCacheGetOrSet(`toggleChallengesSubTab${index + 1}`).addEventListener(
548548
'click',
@@ -866,7 +866,7 @@ export const generateEventHandlers = () => {
866866
DOMCacheGetOrSet('exportgame').addEventListener('click', () => exportSynergism())
867867
DOMCacheGetOrSet('saveStringInput').addEventListener('blur', (e) => updateSaveString(e.target as HTMLInputElement))
868868
DOMCacheGetOrSet('savegame').addEventListener('click', () => saveSynergy(true))
869-
DOMCacheGetOrSet('deleteGame').addEventListener('click', () => resetGame())
869+
DOMCacheGetOrSet('deleteGame').addEventListener('click', () => resetGame(false))
870870
DOMCacheGetOrSet('preloadDeleteGame').addEventListener('click', () => reloadDeleteGame())
871871
DOMCacheGetOrSet('promocodes').addEventListener('click', () => promocodesPrompt())
872872
DOMCacheGetOrSet('addCodeBox').addEventListener('mouseover', () => promocodesInfo('add'))

0 commit comments

Comments
 (0)