마을 초기화 버튼 (회관 패널)

- engine.reset(): 세이브 삭제 + 새 게임 상태로 즉시 전환 (튜토리얼부터)
- 회관 패널 하단에 확인 창 포함 초기화 버튼
- 콘솔에서 localStorage만 지우면 5초 자동 저장이 되살리는 문제의 정식 해법

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
이 커밋은 다음에 포함됨:
kjs
2026-08-13 18:12:05 +09:00
co-authored by Claude Fable 5
부모 a4c6764731
커밋 dd49dd8c6d
2개의 변경된 파일과 29개의 추가작업 그리고 1개의 파일을 삭제
+22 -1
파일 보기
@@ -375,6 +375,16 @@ export default function Game() {
state={state} state={state}
onUpgrade={() => run(() => engine.upgradeHall())} onUpgrade={() => run(() => engine.upgradeHall())}
highlightUpgrade={tutTarget === "hall-upgrade"} highlightUpgrade={tutTarget === "hall-upgrade"}
onReset={() => {
if (
window.confirm(
"정말 마을을 초기화할까요? 고양이·건물·자원이 모두 사라지고 처음부터 시작합니다.",
)
) {
dispatch(() => engine.reset());
setPanel(null);
}
}}
/> />
</SidePanel> </SidePanel>
)} )}
@@ -528,10 +538,12 @@ function HallPanel({
state, state,
onUpgrade, onUpgrade,
highlightUpgrade, highlightUpgrade,
onReset,
}: { }: {
state: GameState; state: GameState;
onUpgrade: () => void; onUpgrade: () => void;
highlightUpgrade?: boolean; highlightUpgrade?: boolean;
onReset: () => void;
}) { }) {
const next = HALL_LEVELS[state.hall.level + 1]; const next = HALL_LEVELS[state.hall.level + 1];
return ( return (
@@ -601,8 +613,17 @@ function HallPanel({
)} )}
</div> </div>
) : ( ) : (
<p className="text-sm text-gray-400">회관이 최고 레벨입니다.</p> <p className="text-sm text-[#a3906c]">회관이 최고 레벨입니다.</p>
)} )}
<div className="border-t border-dashed border-[rgba(126,95,48,.3)] pt-3">
<button
onClick={onReset}
className="w-full rounded-lg border border-[rgba(176,71,42,.4)] bg-[rgba(214,106,74,.08)] py-2 text-xs text-[#b0472a] hover:bg-[rgba(214,106,74,.16)]"
>
🗑 마을 초기화 (새 게임 시작 — 되돌릴 수 없어요)
</button>
</div>
</div> </div>
); );
} }
+7
파일 보기
@@ -310,6 +310,13 @@ export const engine = {
state.tutorialStep = step; state.tutorialStep = step;
}, },
/** 마을 완전 초기화 (새 게임 + 튜토리얼부터) */
reset() {
localStorage.removeItem(SAVE_KEY);
state = createInitialState();
offlineMinutes = null;
},
tick(dt: number) { tick(dt: number) {
if (!state) return; if (!state) return;
for (const building of state.buildings) { for (const building of state.buildings) {