File size: 3,003 Bytes
b66ef35 565e57b b66ef35 565e57b b66ef35 565e57b b66ef35 565e57b b66ef35 565e57b b66ef35 565e57b b66ef35 565e57b b66ef35 565e57b b66ef35 565e57b b66ef35 565e57b b66ef35 565e57b b66ef35 565e57b b66ef35 565e57b b66ef35 565e57b b66ef35 565e57b b66ef35 565e57b b66ef35 565e57b b66ef35 565e57b b66ef35 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
import { db } from './index';
import type { GameState, ActivityEntry } from './schema';
// Initialize or get game state
export async function getOrCreateGameState(): Promise<GameState> {
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<GameState, 'id'> = {
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<GameState>): Promise<void> {
const state = await getOrCreateGameState();
await db.gameState.update(state.id!, updates);
}
// Increment discovery counters
export async function incrementDiscoveryCounter(counter: 'totalDiscoveries' | 'uniqueDiscoveries' | 'variationsFound'): Promise<void> {
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<void> {
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<ActivityEntry, 'id' | 'createdAt'>): Promise<number> {
return await db.activityEntries.add({
...entry,
createdAt: new Date()
});
}
// Get recent activity
export async function getRecentActivity(limit: number = 10): Promise<ActivityEntry[]> {
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<boolean> {
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<void> {
const state = await getOrCreateGameState();
await db.gameState.update(state.id!, {
lastActivityRefresh: new Date()
});
}
// Update current streak
export async function updateStreak(daysActive: number): Promise<void> {
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
} |