Skip to content

Commit

Permalink
Address PR Comments
Browse files Browse the repository at this point in the history
  • Loading branch information
Pseudonian committed Feb 7, 2025
1 parent 24e14e9 commit aa7c496
Show file tree
Hide file tree
Showing 11 changed files with 182 additions and 141 deletions.
3 changes: 3 additions & 0 deletions biome.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@
"complexity": {
"noUselessTypeConstraint": "off",
"noForEach": "off"
},
"performance": {
"noDelete": "off"
}
},
"ignore": ["./dist/*", "**/node_modules/*"]
Expand Down
122 changes: 72 additions & 50 deletions src/Campaign.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import i18next from 'i18next'
import { CorruptionLoadout, type Corruptions } from './Corruptions'
import { CorruptionLoadout, corruptionsSchema, type Corruptions } from './Corruptions'
import { player } from './Synergism'
import { DOMCacheGetOrSet } from './Cache/DOM'
import { IconSets } from './Themes'

export type AscensionModifiers = 'GlobalSpeed'

export type CampaignLoadout = Partial<Corruptions>
export type CampaignLoadout = Corruptions
export type CampaignModifiers = Partial<Record<AscensionModifiers, number>>

export type CampaignKeys = 'test1' | 'test2' | 'test3'
Expand All @@ -24,96 +24,118 @@ export interface ICampaignData {
}

export class CampaignManager {
private totalCampaignTokens: number
private currentCampaign: Campaign | undefined
private campaigns!: Record<CampaignKeys, Campaign>
#totalCampaignTokens: number
#currentCampaign: Campaign | undefined
#campaigns!: Record<CampaignKeys, Campaign>

constructor (campaignManagerData?: ICampaignManagerData) {
this.campaigns = {} as Record<CampaignKeys, Campaign>
if (campaignManagerData !== undefined) {
for (const campaignKey of Object.keys(campaignDatas)) {
const key = campaignKey as keyof typeof campaignDatas
this.campaigns[key] = new Campaign(campaignDatas[key], key, campaignManagerData.campaigns?.[key])
}
if (campaignManagerData !== undefined) {
this.#campaigns = Object.fromEntries(
Object.entries(campaignDatas).map(([key, data]) => {
return [key, new Campaign(data, key, campaignManagerData.campaigns?.[key as CampaignKeys])]
}
)) as Record<CampaignKeys, Campaign>
const currentKey = campaignManagerData.currentCampaign
if (currentKey !== undefined) {
this.currentCampaign = this.campaigns[currentKey]
player.corruptions.used = new CorruptionLoadout(this.currentCampaign.campaignCorruptions)
this.#currentCampaign = this.#campaigns[currentKey]
player.corruptions.used = new CorruptionLoadout(this.#currentCampaign.campaignCorruptions)
} else {
this.currentCampaign = undefined
this.#currentCampaign = undefined
}
}
else {
for (const campaignKey of Object.keys(campaignDatas)) {
const key = campaignKey as keyof typeof campaignDatas
this.campaigns[key] = new Campaign(campaignDatas[key], key, 0)
}
this.currentCampaign = undefined
this.#campaigns = Object.fromEntries(
Object.entries(campaignDatas).map(([key, data]) => {
return [key, new Campaign(data, key)]
}
)) as Record<CampaignKeys, Campaign>
this.#currentCampaign = undefined
}
this.totalCampaignTokens = this.computeTotalCampaignTokens()
this.#totalCampaignTokens = this.computeTotalCampaignTokens()
}

computeTotalCampaignTokens = () => {
computeTotalCampaignTokens () {
let sum = 0
for (const campaign in this.campaigns) {
const key = campaign as keyof typeof this.campaigns
sum += this.campaigns[key].computeTokenValue()
for (const campaign of Object.values(this.#campaigns)) {
sum += campaign.computeTokenValue()
}
return sum
}

get tokens () {
return this.totalCampaignTokens
return this.#totalCampaignTokens
}

get current () {
return this.currentCampaign
return this.#currentCampaign
}

// Store as this in player
get c10Completions (): Record<CampaignKeys, number> {
return Object.fromEntries(
Object.entries(this.campaigns).map(([key, value]) => [key, value.c10Completions])
Object.entries(this.#campaigns).map(([key, value]) => [key, value.c10Completions])
) as Record<CampaignKeys, number>
}
}

export class Campaign {
// Stored as variable out of scope
name: string
description: string
campaignCorruptions: CampaignLoadout
campaignModifiers: CampaignModifiers
limit: number
isMeta: boolean

// Saved as a variable
_c10Completions = 0
#name: string
#description: string
#campaignCorruptions: CampaignLoadout
#campaignModifiers: CampaignModifiers
#limit: number
#isMeta: boolean
#c10Completions = 0

constructor (campaignData: ICampaignData, key: string, c10?: number) {
this.name = i18next.t(`campaigns.data.${key}.name`)
this.description = i18next.t(`campaigns.data.${key}.description`)
this.campaignCorruptions = campaignData.campaignCorruptions
this.campaignModifiers = campaignData.campaignModifiers
this.limit = campaignData.limit
this.isMeta = campaignData.isMeta
this._c10Completions = c10 ?? 0
this.#name = i18next.t(`campaigns.data.${key}.name`)
this.#description = i18next.t(`campaigns.data.${key}.description`)
this.#campaignCorruptions = corruptionsSchema.parse(campaignData.campaignCorruptions)
this.#campaignModifiers = campaignData.campaignModifiers
this.#limit = campaignData.limit
this.#isMeta = campaignData.isMeta
this.#c10Completions = c10 ?? 0
}

public computeTokenValue = () => {
const metaMultiplier = this.isMeta ? 2 : 1
return metaMultiplier * Math.min(this.c10Completions, this.limit)
const metaMultiplier = this.#isMeta ? 2 : 1
return metaMultiplier * Math.min(this.c10Completions, this.#limit)
}

public createUsableLoadout = (): CorruptionLoadout => {
return new CorruptionLoadout(this.campaignCorruptions)
return new CorruptionLoadout(this.#campaignCorruptions)
}

public set c10Completions (value: number) {
this._c10Completions = Math.min(value, this.limit)
this.#c10Completions = Math.min(value, this.#limit)
}

public get campaignCorruptions () {
return this.#campaignCorruptions
}

public get c10Completions () {
return this._c10Completions
return this.#c10Completions
}

public get name () {
return this.#name
}

public get description () {
return this.#description
}

public get limit () {
return this.#limit
}

public get campaignModifiers () {
return this.#campaignModifiers
}

public get isMeta () {
return this.#isMeta
}
}

Expand Down Expand Up @@ -142,7 +164,7 @@ export const campaignDatas: Record<CampaignKeys, ICampaignData> = {
test3: {
campaignCorruptions: {
viscosity: 1,
deflation: 1,
deflation: 1,
dilation: 1
},
campaignModifiers: {
Expand Down
57 changes: 42 additions & 15 deletions src/Corruptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,43 @@ import { Alert, Prompt } from './UpdateHTML'
import { getElementById, productContents, sumContents, validateNonnegativeInteger } from './Utility'
import { Globals as G } from './Variables'
import { PCoinUpgradeEffects } from './PseudoCoinUpgrades'
import { z } from 'zod'

export enum CorruptionIndices {
'viscosity' = 0,
'dilation' = 1,
'hyperchallenge' = 2,
'illiteracy' = 3,
'deflation' = 4,
'extinction' = 5,
'drought' = 6,
'recession' = 7
}

export const convertInputToCorruption = (array: number[]): Corruptions => {
return {
viscosity: array[0],
drought: array[6],
deflation: array[4],
extinction: array[5],
illiteracy: array[3],
recession: array[7],
dilation: array[1],
hyperchallenge: array[2]
viscosity: array[CorruptionIndices.viscosity],
drought: array[CorruptionIndices.drought],
deflation: array[CorruptionIndices.deflation],
extinction: array[CorruptionIndices.extinction],
illiteracy: array[CorruptionIndices.illiteracy],
recession: array[CorruptionIndices.recession],
dilation: array[CorruptionIndices.dilation],
hyperchallenge: array[CorruptionIndices.hyperchallenge]
}
}

export const corruptionsSchema = z.object({
viscosity: z.number().default(0),
drought: z.number().default(0),
deflation: z.number().default(0),
extinction: z.number().default(0),
illiteracy: z.number().default(0),
recession: z.number().default(0),
dilation: z.number().default(0),
hyperchallenge: z.number().default(0),
})

export type Corruptions = {
viscosity: number
drought: number
Expand Down Expand Up @@ -58,8 +81,10 @@ export class CorruptionLoadout {
}
#bonusLevels = 0

constructor (p: Partial<Corruptions>) {
Object.assign(this.#levels, p)
constructor (p: Corruptions) {
Object.entries(p).forEach(([key, value]) => {
this.#levels[key as keyof Corruptions] = value
})
}

public setCorruptionLevels (corruptions: Partial<Corruptions>) {
Expand Down Expand Up @@ -325,13 +350,13 @@ export type SavedCorruption = {

export class CorruptionSaves {
#saves: Array<SavedCorruption> = []
constructor (corrSaveData: Record<string, Partial<Corruptions>>) {
constructor (corrSaveData: Record<string, Corruptions>) {
for (const saveKey of Object.keys(corrSaveData).slice(0, 16)) {
this.#saves.push({ name: saveKey, loadout: new CorruptionLoadout(corrSaveData[saveKey]) })
}
}

addSave (loadoutName: string, loadoutValues: Partial<Corruptions>) {
addSave (loadoutName: string, loadoutValues: Corruptions) {
this.#saves.push({ name: loadoutName, loadout: new CorruptionLoadout(loadoutValues) })
}

Expand Down Expand Up @@ -648,9 +673,10 @@ export const applyCorruptions = (corruptions: string) => {
console.log(corruptions)

if (corruptions.includes('/') && corruptions.split('/').length === 8) {
// Supports legacy format
corr = convertInputToCorruption(corruptions.split('/').map(Number))
} else {
corr = JSON.parse(corruptions) as Corruptions
corr = corruptionsSchema.parse(corruptions)
}

if (corr) {
Expand All @@ -665,7 +691,7 @@ export const applyCorruptions = (corruptions: string) => {
async function importCorruptionsPrompt () {
const input = await Prompt(i18next.t('corruptions.importCorruptionsPrompt.import'))

if (!applyCorruptions(input as string)) {
if (input === null || !applyCorruptions(input)) {
void Alert(i18next.t('corruptions.importCorruptionsPrompt.importError'))
}
}
Expand Down Expand Up @@ -695,7 +721,8 @@ async function corruptionLoadoutGetNewName (loadout = 0) {

export const updateCorruptionLoadoutNames = () => {
const rows = getElementById<HTMLTableElement>('corruptionLoadoutTable').rows
for (let i = 0; i < 8; i++) {
const totalSlots = 8 + PCoinUpgradeEffects.CORRUPTION_LOADOUT_SLOT_QOL
for (let i = 0; i < totalSlots; i++) {
const cells = rows[i + 2].cells // start changes on 2nd row
if (cells[0].textContent!.length === 0) { // first time setup
cells[0].addEventListener('click', () => void corruptionLoadoutGetNewName(i)) // get name function handles -1 for array
Expand Down
4 changes: 2 additions & 2 deletions src/History.ts
Original file line number Diff line number Diff line change
Expand Up @@ -558,10 +558,10 @@ const resetHistoryFormatCorruptions = (data: ResetHistoryEntryAscend): [string,
corrs++
}

const corr_str = JSON.stringify(corrToLoad)
const corrStr = JSON.stringify(corrToLoad)

if (corruptions) {
loadout += `<button class="corrLoad ascendHistoryLoadCorruptions" data-corr='${corr_str}'>Load</button>`
loadout += `<button class="corrLoad ascendHistoryLoadCorruptions" data-corr='${corrStr}'>Load</button>`
}
if (data.currentChallenge !== undefined) {
score += ` / C${data.currentChallenge}`
Expand Down
2 changes: 1 addition & 1 deletion src/Reset.ts
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@ const resetAddHistoryEntry = (input: resetNames, from = 'unknown') => {
seconds: player.ascensionCounter,
date: Date.now(),
c10Completions: player.challengecompletions[10],
usedCorruptions: player.corruptions.used, // shallow copy,
usedCorruptions: player.corruptions.used.loadout,
corruptionScore: corruptionMetaData[3],
wowCubes: corruptionMetaData[4],
wowTesseracts: corruptionMetaData[5],
Expand Down
37 changes: 19 additions & 18 deletions src/Synergism.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ import {
corruptionLoadoutTableCreate,
corruptionLoadoutTableUpdate,
CorruptionSaves,
corruptionsSchema,
corruptionStatsUpdate,
updateCorruptionLoadoutNames,
updateUndefinedLoadouts,
Expand Down Expand Up @@ -881,25 +882,25 @@ export const player: Player = {
},

corruptions: {
next: new CorruptionLoadout({}),
used: new CorruptionLoadout({}),
next: new CorruptionLoadout(corruptionsSchema.parse({})),
used: new CorruptionLoadout(corruptionsSchema.parse({})),
saves: new CorruptionSaves({
'Loadout 1': {},
'Loadout 2': {},
'Loadout 3': {},
'Loadout 4': {},
'Loadout 5': {},
'Loadout 6': {},
'Loadout 7': {},
'Loadout 8': {},
'Loadout 9': {},
'Loadout 10': {},
'Loadout 11': {},
'Loadout 12': {},
'Loadout 13': {},
'Loadout 14': {},
'Loadout 15': {},
'Loadout 16': {},
'Loadout 1': corruptionsSchema.parse({}),
'Loadout 2': corruptionsSchema.parse({}),
'Loadout 3': corruptionsSchema.parse({}),
'Loadout 4': corruptionsSchema.parse({}),
'Loadout 5': corruptionsSchema.parse({}),
'Loadout 6': corruptionsSchema.parse({}),
'Loadout 7': corruptionsSchema.parse({}),
'Loadout 8': corruptionsSchema.parse({}),
'Loadout 9': corruptionsSchema.parse({}),
'Loadout 10': corruptionsSchema.parse({}),
'Loadout 11': corruptionsSchema.parse({}),
'Loadout 12': corruptionsSchema.parse({}),
'Loadout 13': corruptionsSchema.parse({}),
'Loadout 14': corruptionsSchema.parse({}),
'Loadout 15': corruptionsSchema.parse({}),
'Loadout 16': corruptionsSchema.parse({}),
}),
showStats: true
},
Expand Down
Loading

0 comments on commit aa7c496

Please sign in to comment.