/** * AdminPanel.jsx — Debug/admin panel for SynthQuest * Allows adding/removing stars and unlocking levels for testing */ import React, { useState } from 'react'; import { loadProgress, saveProgress, resetProgress } from './gameState.js'; export default function AdminPanel({ worlds, onClose, adminMode, onToggleAdmin }) { const [, refresh] = useState(0); const p = loadProgress(); const totalStars = Object.values(p.completedLevels).reduce((s, l) => s + (l.stars || 0), 0); const setStars = (levelId, stars) => { if (stars <= 0) { delete p.completedLevels[levelId]; } else { p.completedLevels[levelId] = { stars: Math.min(3, stars), completedAt: Date.now() }; } saveProgress(); refresh(n => n + 1); }; const unlockWorld = (world) => { // Give 1 star to each level in all previous worlds up to the requirement let needed = world.unlockStars || 0; for (const w of worlds) { if (w.id === world.id) break; for (const level of w.levels) { if (needed <= 0) break; const existing = p.completedLevels[level.id]?.stars || 0; if (existing < 1) { p.completedLevels[level.id] = { stars: 1, completedAt: Date.now() }; needed -= 1; } } } saveProgress(); refresh(n => n + 1); }; const giveAllStars = () => { for (const w of worlds) { for (const level of w.levels) { p.completedLevels[level.id] = { stars: 3, completedAt: Date.now() }; } } saveProgress(); refresh(n => n + 1); }; const handleReset = () => { resetProgress(); refresh(n => n + 1); }; return (
e.stopPropagation()}>

🛠 Admin Mode

Total: ★ {totalStars}
{worlds.map((world, wi) => { const worldStars = world.levels.reduce((s, l) => { return s + (p.completedLevels[l.id]?.stars || 0); }, 0); const isUnlocked = !world.unlockStars || totalStars >= world.unlockStars; return (
{world.icon} M{wi + 1}: {world.name} ★ {worldStars}/{world.levels.length * 3} {!isUnlocked && ( )}
{world.levels.map((level, li) => { const stars = p.completedLevels[level.id]?.stars || 0; return (
{wi + 1}.{li + 1} {level.title}
{[0, 1, 2, 3].map(s => ( ))}
); })}
); })}
); }