// Screens — Login & Mission Map (Home)
const { useState, useEffect } = React;
function StarfieldBg() {
return (
{Array.from({ length: 80 }).map((_, i) => {
const top = Math.random() * 100;
const left = Math.random() * 100;
const size = Math.random() * 2.5 + 0.8;
const delay = Math.random() * 4;
return (
);
})}
{/* shooting stars */}
);
}
function LoginScreen({ onLogin }) {
const [users, setUsers] = useState([]);
const [mode, setMode] = useState('choose');
const [name, setName] = useState('');
const [nick, setNick] = useState('');
const [avatar, setAvatar] = useState('luna');
const [error, setError] = useState('');
const [filterKind, setFilterKind] = useState('Todos');
useEffect(() => {
window.AppStorage.getUsers().then(setUsers);
}, []);
async function handleCreate() {
if (!name.trim() || !nick.trim()) {
setError('Preencha seu nome e apelido!');
return;
}
const id = nick.trim().toLowerCase().replace(/\s+/g, '_') + '_' + Date.now().toString(36).slice(-4);
const user = { id, name: name.trim(), nick: nick.trim(), avatar };
await window.AppStorage.createUser(user);
await window.AppStorage.setCurrentUserId(id);
onLogin(user);
}
async function handlePick(u) {
await window.AppStorage.setCurrentUserId(u.id);
onLogin(u);
}
const kinds = ['Todos', 'Cadete', 'Alien', 'Espacial'];
const filteredAvatars = filterKind === 'Todos'
? window.Avatars.list
: window.Avatars.list.filter(a => a.kind === filterKind);
return (
🌍
Missão Planeta Azul
Vire um(a) Cadete da Frota Terra!
{mode === 'choose' && (
{users.length > 0 && (
Já sou cadete!
{users.map(u => {
const Av = window.Avatars.get(u.avatar).component;
return (
);
})}
)}
)}
{mode === 'new' && (
Crie sua conta de cadete
Escolha seu personagem:
{kinds.map(k => (
))}
{filteredAvatars.map(a => {
const Av = a.component;
return (
);
})}
{error &&
{error}
}
)}
);
}
function StarBadge({ stars, max = 3, size = 'sm' }) {
return (
{Array.from({ length: max }).map((_, i) => (
★
))}
);
}
function MissionMap({ user, progress, onOpenMission, onOpenGlossary, onOpenMural, onOpenTrophies, onOpenVideos, onLogout }) {
const Av = window.Avatars.get(user.avatar).component;
const missions = window.MISSIONS;
const totalStars = missions.reduce((sum, m) => sum + (Number.isFinite(progress.missions[m.id]?.stars) ? progress.missions[m.id].stars : 0), 0);
const maxStars = missions.length * 3;
const fuelPct = Math.min(100, Math.round((totalStars / maxStars) * 100));
const rank = window.Avatars.getRank(totalStars);
// Sequential unlock: mission N is unlocked if mission N-1 is completed (>=1 star).
function isUnlocked(idx) {
if (idx === 0) return true;
const prev = missions[idx - 1];
return (progress.missions[prev.id]?.stars || 0) >= 1;
}
return (
Estrelas
⭐ {totalStars}/{maxStars}
Medalhas
🏅 {(progress.badges || []).length}
Mapa de Missões
Complete cada missão para virar Comandante da Frota Terra!
{missions.map((m, idx) => {
const mp = progress.missions[m.id];
const stars = mp?.stars || 0;
const completed = mp?.completed || false;
const locked = !isUnlocked(idx);
const total = m.questions.length;
// resume info
const resume = mp?.resume;
const answered = resume?.answeredCount || (completed ? total : 0);
const pct = Math.round((answered / total) * 100);
const inProgress = !completed && answered > 0;
return (
);
})}
);
}
window.Screens = { LoginScreen, MissionMap, StarBadge, StarfieldBg };