import { getPublicPath } from '@/lib/utils' import { PLACE_REQUIRED_COUNTS } from './lobby.config' export const BADGE_SCENE_GROUPS = { 1: [1, 2], 2: [3, 4], 3: [5, 6], } as const export const BADGE_UNLOCK_VIDEO_MAP = { 1: getPublicPath('video/nieer/nieer_2_2.mp4'), 2: getPublicPath('video/nieer/nieer_2_3.mp4'), 3: getPublicPath('video/nieer/nieer_2_6.mp4'), } as const export const BADGE_CONFIG = [ { id: 1, className: 'top-0 left-36', }, { id: 2, className: 'top-0 left-146', }, { id: 3, className: 'top-0 right-36', }, ] as const export const PLACE_SEQUENCE = [1, 2, 3, 4, 5, 6] as const export type PlaceCompletionMap = Record<(typeof PLACE_SEQUENCE)[number], boolean> export const getPlaceCompletionMap = ( visitedReflectionCursors: Record> ): PlaceCompletionMap => { const getVisitedCount = (placeName: string): number => visitedReflectionCursors[placeName]?.size ?? 0 return { 1: getVisitedCount('place1') >= (PLACE_REQUIRED_COUNTS[1] ?? 0), 2: getVisitedCount('place2') >= (PLACE_REQUIRED_COUNTS[2] ?? 0), 3: getVisitedCount('place3') >= (PLACE_REQUIRED_COUNTS[3] ?? 0), 4: getVisitedCount('place4') >= (PLACE_REQUIRED_COUNTS[4] ?? 0), 5: getVisitedCount('place5') >= (PLACE_REQUIRED_COUNTS[5] ?? 0), 6: getVisitedCount('place6') >= (PLACE_REQUIRED_COUNTS[6] ?? 0), } } export const getUnlockedBadgeIds = ( placeCompletion: PlaceCompletionMap ): Array => { return ( Object.entries(BADGE_SCENE_GROUPS) as unknown as Array< [keyof typeof BADGE_SCENE_GROUPS, readonly number[]] > ) .filter(([, sceneIds]) => sceneIds.every((sceneId) => placeCompletion[sceneId as keyof PlaceCompletionMap]) ) .map(([badgeId]) => badgeId) } export const getBadgeUnlockedMap = (placeCompletion: PlaceCompletionMap) => ({ 1: placeCompletion[1] && placeCompletion[2], 2: placeCompletion[3] && placeCompletion[4], 3: placeCompletion[5] && placeCompletion[6], }) export const getUnlockedByIdMap = (placeCompletion: PlaceCompletionMap) => ({ 1: true, 2: placeCompletion[1], 3: placeCompletion[2], 4: placeCompletion[3], 5: placeCompletion[4], 6: placeCompletion[5], }) as const export const getGuideSceneId = (placeCompletion: PlaceCompletionMap) => { const nextScene = PLACE_SEQUENCE.find((sceneId) => !placeCompletion[sceneId]) return nextScene ?? 6 } export const getAllPlacesCompleted = (placeCompletion: PlaceCompletionMap) => PLACE_SEQUENCE.every((sceneId) => placeCompletion[sceneId]) export const getUnlockVideoSrcForScene = ( sceneId: number, visitedReflectionCursors: Record> ): string | undefined => { const previousPlaceCompletion = getPlaceCompletionMap(visitedReflectionCursors) const previousBadges = new Set(getUnlockedBadgeIds(previousPlaceCompletion)) const nextVisitedReflectionCursors: Record> = Object.fromEntries( Object.entries(visitedReflectionCursors).map(([placeName, cursorIds]) => [ placeName, new Set(cursorIds), ]) ) const currentPlaceName = `place${sceneId}` const requiredCount = PLACE_REQUIRED_COUNTS[sceneId] ?? 0 nextVisitedReflectionCursors[currentPlaceName] = new Set( Array.from({ length: requiredCount }, (_, index) => index + 1) ) const nextPlaceCompletion = getPlaceCompletionMap(nextVisitedReflectionCursors) const unlockedBadgeId = getUnlockedBadgeIds(nextPlaceCompletion).find( (badgeId) => !previousBadges.has(badgeId) ) return unlockedBadgeId ? BADGE_UNLOCK_VIDEO_MAP[unlockedBadgeId] : undefined }