Files
wechat-minigame/js/content/registry/progress-projector.js
2026-03-29 00:36:28 +08:00

46 lines
1.4 KiB
JavaScript

function getLevelEntries(levelProgress = {}) {
return Object.values(levelProgress)
}
export function projectCityProgress(city, playerState) {
const levelProgress = playerState.levelProgress[city.id] ?? {}
const levels = getLevelEntries(levelProgress)
const completedLevels = levels.filter((level) => level.completed).length
const totalStars = levels.reduce((sum, level) => sum + (level.stars ?? 0), 0)
const totalLevels = city.levelPresets.length
const isUnlocked = playerState.unlockedCities.includes(city.id)
const isCompleted = totalLevels > 0 && completedLevels >= totalLevels
return {
cityId: city.id,
completedLevels,
totalLevels,
totalStars,
isUnlocked,
isCompleted,
isCollected: playerState.collectedCats.includes(city.id),
hasPassportStamp: playerState.passportStamps.includes(city.id),
}
}
export function projectCityCardView(city, playerState) {
const progress = projectCityProgress(city, playerState)
return {
cityId: city.id,
name: city.display.name,
nameEn: city.display.nameEn,
bgColor: city.display.bgColor,
catImage: city.cover.catImage,
catThumb: city.cover.catThumb,
isUnlocked: progress.isUnlocked,
isCompleted: progress.isCompleted,
isCollected: progress.isCollected,
completedLevels: progress.completedLevels,
totalLevels: progress.totalLevels,
totalStars: progress.totalStars,
}
}
export default projectCityCardView