diff --git a/src/App.jsx b/src/App.jsx index 45da7e0..169eb51 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -2,18 +2,21 @@ import { useState, useEffect } from 'react' import { generateToken, loadState, saveState } from './api.js' import { createState } from './gameState.js' import { BACKGROUNDS } from './constants.js' -import Ledger from './screens/Ledger.jsx' +import Shell from './components/Shell.jsx' +import Actor from './screens/Actor.jsx' +import Forum from './screens/Forum.jsx' import Map from './screens/Map.jsx' -import Prologue from './screens/Prologue.jsx' import './App.css' +import contextsJson from './config/contexts.json' + const TOKEN_KEY = 'otivm_token' export default function App() { - const [state, setState] = useState(null) - const [token, setToken] = useState(null) + const [state, setState] = useState(null) + const [token, setToken] = useState(null) const [loading, setLoading] = useState(true) - const [screen, setScreen] = useState('prologue') + const [context, setContext] = useState('actor') useEffect(() => { async function bootstrap() { @@ -26,13 +29,12 @@ export default function App() { const saved = await loadState(tok) if (saved) { setState(saved) - // If background already chosen, open on ledger - setScreen(saved.background_id ? 'ledger' : 'prologue') + setContext(saved.background_id && saved.background_id !== 'unknown' ? 'forum' : 'actor') } else { const fresh = createState(tok) setState(fresh) await saveState(tok, fresh) - setScreen('prologue') + setContext('actor') } setLoading(false) } @@ -44,8 +46,6 @@ export default function App() { await saveState(token, newState) } - // Called from Prologue when player confirms a background. - // Seeds background_id into state, saves, switches to Ledger. async function onSelectBackground(backgroundId) { const bg = BACKGROUNDS.find(b => b.id === backgroundId) if (!bg) return @@ -56,15 +56,9 @@ export default function App() { } setState(updated) await saveState(token, updated) - setScreen('ledger') + setContext('forum') } - // Session abandonment — forward-looking lifecycle handler. - // Does not delete the old save. Appends a terminal event so the record - // is complete. The old save becomes a historical artefact on disk. - // In the Simulator this event will have social and ecological consequences - // for the clan — a Constructor who stops participating leaves a gap. - // For now: mark abandoned, generate new token, bootstrap fresh in-place. async function onNewGame() { if (state && token) { const abandoned = { @@ -82,53 +76,93 @@ export default function App() { const fresh = createState(newTok) setState(fresh) await saveState(newTok, fresh) - setScreen('prologue') + setContext('actor') } if (loading) { - return ( -