행복도 시스템 해금제: 회관 Lv3 + 햇볕 데크 설치 시 개방 (소프트락 수정)
- 해금 전: 행복도 증감·파업 로직 완전 비활성, 속도 배율 중립, UI에서 💗 숨김 → 초반에 행복도를 올릴 수단이 없어 파업 소프트락에 걸리던 문제 해결 - 해금 조건 달성 시 촌장 냥이가 재등장해 행복도 시스템 안내 (1회) - 해금 순간 전원 행복도 80으로 초기화 - 기존 세이브 마이그레이션: 조건 미충족이면 파업 해제 + 행복도 리셋, 이미 충족한 마을은 안내 생략 - 햇볕 데크 설명에 해금 역할 명시 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
이 커밋은 다음에 포함됨:
@@ -369,6 +369,36 @@ export default function Game() {
|
||||
);
|
||||
})()}
|
||||
|
||||
{/* ── 촌장 냥이: 행복도 시스템 안내 (해금 시 1회) ── */}
|
||||
{state.happinessUnlocked &&
|
||||
!state.happinessIntroSeen &&
|
||||
(state.tutorialStep ?? TUTORIAL_DONE) >= TUTORIAL_STEPS.length && (
|
||||
<div className="pointer-events-none absolute bottom-8 left-4 z-40 flex max-w-md items-end gap-2">
|
||||
{/* eslint-disable-next-line @next/next/no-img-element */}
|
||||
<img
|
||||
src={catSprite("korean_shorthair", "idle")}
|
||||
alt="촌장 냥이"
|
||||
className="h-24 w-24 shrink-0 object-contain drop-shadow-lg"
|
||||
/>
|
||||
<div className="panel-paper pointer-events-auto relative mb-2 rounded-2xl p-4 shadow-xl">
|
||||
<div className="font-jua text-[13px] text-[#8a6316]">🎗️ 촌장 냥이</div>
|
||||
<p className="mt-1 text-sm leading-relaxed text-[#3f2c14]">
|
||||
오랜만이야! 마을이 근사해졌네. 햇볕 데크도 생겼으니 이제
|
||||
친구들의 <b>💗 행복도</b>를 챙길 때야. 배부르게 먹고 푹 쉬면
|
||||
행복해지고, 굶거나 고양이 집이 모자라면 시무룩해져. 행복도가
|
||||
너무 낮으면 <b>파업</b>할 수도 있으니 잘 돌봐줘! 80 이상이면
|
||||
일도 10% 빨라진단다.
|
||||
</p>
|
||||
<button
|
||||
onClick={() => dispatch(() => engine.markHappinessIntroSeen())}
|
||||
className="nature-btn mt-3 block px-5 py-1.5 text-sm"
|
||||
>
|
||||
알겠어, 잘 돌볼게! 💗
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* ── DB 상태 (좌하단 미니) ── */}
|
||||
<div className="absolute bottom-2 left-3 z-30 opacity-70">
|
||||
<DbStatus />
|
||||
@@ -464,6 +494,7 @@ export default function Game() {
|
||||
key={cat.id}
|
||||
cat={cat}
|
||||
buildings={state.buildings}
|
||||
happinessUnlocked={state.happinessUnlocked}
|
||||
onInvest={(catId, key) => run(() => engine.investAptitude(catId, key))}
|
||||
/>
|
||||
))}
|
||||
@@ -1147,10 +1178,12 @@ function CatCard({
|
||||
cat,
|
||||
buildings,
|
||||
onInvest,
|
||||
happinessUnlocked,
|
||||
}: {
|
||||
cat: Cat;
|
||||
buildings: Building[];
|
||||
onInvest: (catId: string, key: AptitudeKey) => void;
|
||||
happinessUnlocked?: boolean;
|
||||
}) {
|
||||
const workplace = buildings.find((b) => b.id === cat.assignedTo);
|
||||
const expNeeded = cat.level * 90;
|
||||
@@ -1232,6 +1265,7 @@ function CatCard({
|
||||
⚡ {Math.floor(cat.status.energy)}/{cat.stats.stamina}
|
||||
</span>
|
||||
</div>
|
||||
{happinessUnlocked && (
|
||||
<div className="mt-1.5 flex items-center gap-2">
|
||||
<div className="bar-track h-2 flex-1">
|
||||
<div
|
||||
@@ -1248,6 +1282,7 @@ function CatCard({
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
|
||||
{cat.passives.length > 0 && (
|
||||
<div className="mt-2 flex flex-wrap gap-1">
|
||||
|
||||
새 이슈에서 참조
사용자 차단