diff --git a/src/App.jsx b/src/App.jsx
index 00460bd..4571ee9 100644
--- a/src/App.jsx
+++ b/src/App.jsx
@@ -7,7 +7,7 @@ import { LOCATIONS, teleportTo, worldState } from './worldState';
import { onAdminChange } from './controls/KeyInput';
import ControlPanel from './ui/ControlPanel';
import LoadingScreen from './ui/LoadingScreen';
-import { login as authLogin, initSession, isLoggedIn, saveScore, getHandle, logout } from './lib/auth';
+import { login as authLogin, initSession, isLoggedIn, loadScore, saveScore, getHandle, logout } from './lib/auth';
const ACTION_SEQUENCE = ['attack', 'skill', 'jump', 'fly_dodge', 'damage'];
const TELEPORT_ANIM = 'fly_dodge';
@@ -27,6 +27,7 @@ const VRM_FILES = ['ai.vrm', 'ai_mode.vrm'];
export default function App() {
const [loadProgress, setLoadProgress] = useState(0);
const [loaded, setLoaded] = useState(false);
+ const [showIcon, setShowIcon] = useState(false);
const [fadeOut, setFadeOut] = useState(false);
useEffect(() => {
@@ -55,8 +56,9 @@ export default function App() {
.then(() => {
if (cancelled) return;
setLoadProgress(100);
- setTimeout(() => setLoaded(true), 300);
- setTimeout(() => setFadeOut(true), 2000);
+ setTimeout(() => setShowIcon(true), 500);
+ setTimeout(() => setLoaded(true), 1500);
+ setTimeout(() => setFadeOut(true), 2500);
});
return () => { cancelled = true; };
@@ -69,7 +71,7 @@ export default function App() {
- {score}
toggleBgm(tier)}
style={{ width: 14, height: 14, filter: 'brightness(0) invert(1)', opacity: playing ? 1 : 0.4, cursor: 'pointer' }}
/>
+ {score}
);
}
@@ -321,6 +323,12 @@ function AppMain() {
setAuthDid(did);
const h = await getHandle();
if (h) setSavedHandle(h);
+ const saved = await loadScore();
+ if (saved) setCrowns(prev => ({
+ gold: saved.gold || prev.gold,
+ silver: saved.silver || prev.silver,
+ bronze: saved.bronze || prev.bronze,
+ }));
}).catch(() => {});
}, []);
diff --git a/src/lib/auth.js b/src/lib/auth.js
index 9ba8918..e967e3b 100644
--- a/src/lib/auth.js
+++ b/src/lib/auth.js
@@ -79,6 +79,23 @@ export async function getHandle() {
} catch { return null }
}
+export async function loadScore() {
+ if (!agent) return null
+ const CROWN_MAP = { 1: 'gold', 2: 'silver', 3: 'bronze' }
+ try {
+ const record = await agent.com.atproto.repo.getRecord({
+ repo: agent.assertDid, collection: COLLECTION, rkey: 'self',
+ })
+ const items = record.data.value?.item || []
+ const crowns = { gold: 0, silver: 0, bronze: 0 }
+ for (const item of items) {
+ const tier = CROWN_MAP[item.id]
+ if (tier) crowns[tier] = item.cp
+ }
+ return crowns
+ } catch { return null }
+}
+
export async function saveScore(crowns) {
if (!agent) return null
diff --git a/src/ui/LoadingScreen.jsx b/src/ui/LoadingScreen.jsx
index a404f50..f8f271c 100644
--- a/src/ui/LoadingScreen.jsx
+++ b/src/ui/LoadingScreen.jsx
@@ -32,25 +32,33 @@ const labelStyle = {
marginTop: 10,
};
-export default function LoadingScreen({ progress, fadeOut }) {
+const BASE_URL = import.meta.env.BASE_URL;
+
+export default function LoadingScreen({ progress, fadeOut, showIcon }) {
return (