Android build v1.1.15
This commit is contained in:
@@ -0,0 +1,115 @@
|
||||
export type Iwt2InventoryItem = {
|
||||
id: string
|
||||
name: string
|
||||
quantity: number
|
||||
rarity: 'common' | 'uncommon' | 'rare' | 'epic' | 'legendary'
|
||||
}
|
||||
|
||||
export type Iwt2CollectionLog = {
|
||||
bossKills: Record<string, number>
|
||||
dropsFound: Record<string, number>
|
||||
}
|
||||
|
||||
export type Iwt2Save = {
|
||||
version: 1
|
||||
updatedAt: number
|
||||
character: {
|
||||
name: string
|
||||
level: number
|
||||
experience: number
|
||||
}
|
||||
inventory: Iwt2InventoryItem[]
|
||||
collectionLog: Iwt2CollectionLog
|
||||
}
|
||||
|
||||
const IWT2_SAVE_KEY = 'i-want-to-heal-2:save:v1'
|
||||
|
||||
export function createDefaultIwt2Save(): Iwt2Save {
|
||||
return {
|
||||
version: 1,
|
||||
updatedAt: Date.now(),
|
||||
character: {
|
||||
name: 'Healer',
|
||||
level: 1,
|
||||
experience: 0,
|
||||
},
|
||||
inventory: [],
|
||||
collectionLog: {
|
||||
bossKills: {},
|
||||
dropsFound: {},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
function normalizeSave(value: unknown): Iwt2Save {
|
||||
if (!value || typeof value !== 'object') return createDefaultIwt2Save()
|
||||
const candidate = value as Partial<Iwt2Save>
|
||||
if (candidate.version !== 1) return createDefaultIwt2Save()
|
||||
return {
|
||||
version: 1,
|
||||
updatedAt: typeof candidate.updatedAt === 'number' ? candidate.updatedAt : Date.now(),
|
||||
character: {
|
||||
name: candidate.character?.name || 'Healer',
|
||||
level: Math.max(1, Math.floor(candidate.character?.level ?? 1)),
|
||||
experience: Math.max(0, Math.floor(candidate.character?.experience ?? 0)),
|
||||
},
|
||||
inventory: Array.isArray(candidate.inventory) ? candidate.inventory : [],
|
||||
collectionLog: {
|
||||
bossKills: candidate.collectionLog?.bossKills ?? {},
|
||||
dropsFound: candidate.collectionLog?.dropsFound ?? {},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
export function loadIwt2Save(): Iwt2Save {
|
||||
try {
|
||||
return normalizeSave(JSON.parse(window.localStorage.getItem(IWT2_SAVE_KEY) ?? 'null'))
|
||||
} catch {
|
||||
return createDefaultIwt2Save()
|
||||
}
|
||||
}
|
||||
|
||||
export function writeIwt2Save(save: Iwt2Save) {
|
||||
window.localStorage.setItem(IWT2_SAVE_KEY, JSON.stringify({
|
||||
...save,
|
||||
updatedAt: Date.now(),
|
||||
}))
|
||||
}
|
||||
|
||||
export function recordIwt2BossKill(save: Iwt2Save, bossId: string): Iwt2Save {
|
||||
const drop = bossDropFor(bossId)
|
||||
return {
|
||||
...save,
|
||||
updatedAt: Date.now(),
|
||||
character: {
|
||||
...save.character,
|
||||
experience: save.character.experience + 125,
|
||||
level: Math.max(save.character.level, 1 + Math.floor((save.character.experience + 125) / 500)),
|
||||
},
|
||||
inventory: [
|
||||
...save.inventory,
|
||||
{
|
||||
id: `${drop.id}-${Date.now()}`,
|
||||
name: drop.name,
|
||||
quantity: 1,
|
||||
rarity: 'common',
|
||||
},
|
||||
],
|
||||
collectionLog: {
|
||||
...save.collectionLog,
|
||||
bossKills: {
|
||||
...save.collectionLog.bossKills,
|
||||
[bossId]: (save.collectionLog.bossKills[bossId] ?? 0) + 1,
|
||||
},
|
||||
dropsFound: {
|
||||
...save.collectionLog.dropsFound,
|
||||
[drop.id]: (save.collectionLog.dropsFound[drop.id] ?? 0) + 1,
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
function bossDropFor(bossId: string): { id: string, name: string } {
|
||||
if (bossId === 'yian-kut-ku') return { id: 'yian-kut-ku-scale', name: 'Yian Kut Ku Scale' }
|
||||
return { id: 'raw-bulldrome-coin', name: 'Raw Bulldrome Coin' }
|
||||
}
|
||||
Reference in New Issue
Block a user