import { db } from './index'; import type { GameState, ActivityEntry } from './schema'; // Initialize or get game state export async function getOrCreateGameState(): Promise { const states = await db.gameState.toArray(); if (states.length > 0) { // Update last played await db.gameState.update(states[0].id!, { lastPlayed: new Date() }); return states[0]; } // Create initial game state const newState: Omit = { lastActivityRefresh: new Date(), lastPlayed: new Date(), totalDiscoveries: 0, uniqueDiscoveries: 0, variationsFound: 0, rarityScore: 0, currentStreak: 0 }; const id = await db.gameState.add(newState); return { ...newState, id }; } // Update progress export async function updateProgress(updates: Partial): Promise { const state = await getOrCreateGameState(); await db.gameState.update(state.id!, updates); } // Increment discovery counters export async function incrementDiscoveryCounter(counter: 'totalDiscoveries' | 'uniqueDiscoveries' | 'variationsFound'): Promise { const state = await getOrCreateGameState(); await db.gameState.update(state.id!, { [counter]: (state[counter] || 0) + 1 }); } // Add rarity score points export async function addRarityScore(points: number): Promise { const state = await getOrCreateGameState(); await db.gameState.update(state.id!, { rarityScore: (state.rarityScore || 0) + points }); } // Create a new activity entry export async function createActivityEntry(entry: Omit): Promise { return await db.activityEntries.add({ ...entry, createdAt: new Date() }); } // Get recent activity export async function getRecentActivity(limit: number = 10): Promise { return await db.activityEntries .orderBy('createdAt') .reverse() .limit(limit) .toArray(); } // Check if should refresh activity (e.g., every 30 minutes) export async function shouldRefreshActivity(): Promise { const state = await getOrCreateGameState(); const minutesSinceRefresh = (Date.now() - state.lastActivityRefresh.getTime()) / (1000 * 60); return minutesSinceRefresh >= 30; } // Mark activity as refreshed export async function markActivityRefreshed(): Promise { const state = await getOrCreateGameState(); await db.gameState.update(state.id!, { lastActivityRefresh: new Date() }); } // Update current streak export async function updateStreak(daysActive: number): Promise { const state = await getOrCreateGameState(); await db.gameState.update(state.id!, { currentStreak: daysActive }); } // Calculate rarity points for a discovery export function calculateRarityPoints(scanCount: number): number { if (scanCount <= 5) return 100; // Legendary if (scanCount <= 20) return 50; // Epic if (scanCount <= 50) return 20; // Rare if (scanCount <= 100) return 10; // Uncommon return 5; // Common }