Phase B: 체력·강제 휴식·행복도·파업·고양이 집·햇볕 데크·오프라인 정산

- 체력(energy): 작업 중 분당 -2(튼튼함 -30%), 소진 시 강제 휴식 —
  배치 해제 후 수면 포즈로 회복(분당 +20, 고양이 집 +30), 완충 시 자동 복귀
- 행복도: 포만 80↑ +1/분, 굶주림 -4/분, 고양이 집 부족 -2/분(바닥 25),
  휴식 +3/분, 햇볕 데크 회복 1.5배, 인기쟁이 동료 버프
  효과: 80↑ 속도 +10%, 50 미만 -30%, 20 미만 파업(배치 해제·재배치 불가)
- 파업: 💢 배회, 행복도 40 회복 시 이전 일터로 자동 복귀
- 새 패시브: 낙천적(-40%)·까다로움(+50%)·인기쟁이 / 튼튼함·일중독 실효과화
- 새 건물: 고양이 집(정원 4, 목재100+돌20)·햇볕 데크(목재120+돌40) —
  배치 없는 패시브 건물(전용 패널), 회관 Lv3 해금, 이모지 렌더(일러스트 대기)
- 오프라인 정산: 최대 8시간을 60초 단위 시뮬레이션, 복귀 시 토스트
- UI: 고양이 카드에 체력(⚡)·행복도(💗) 바, 휴식/파업 상태 표시
- 뷰: 휴식 시 고양이 집으로 이동 후 수면 포즈+💤, 파업 시 💢

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
이 커밋은 다음에 포함됨:
kjs
2026-08-13 16:20:37 +09:00
co-authored by Claude Fable 5
부모 c50e12400b
커밋 1ff8d0b8ca
5개의 변경된 파일과 355개의 추가작업 그리고 45개의 파일을 삭제
+27 -1
파일 보기
@@ -94,6 +94,9 @@ export const PASSIVES: PassiveDef[] = [
{ key: "lazy", name: "게으름뱅이", kind: "negative", desc: "작업 속도 -30%", speedMul: 0.7 },
{ key: "big_eater", name: "대식가", kind: "negative", desc: "식량 소모 +50%", speedMul: 1 },
{ key: "workaholic", name: "일중독", kind: "tradeoff", desc: "작업 속도 +60%, 행복도 감소 +40%", speedMul: 1.6 },
{ key: "optimist", name: "낙천적", kind: "positive", desc: "행복도 감소 속도 -40%", speedMul: 1 },
{ key: "picky", name: "까다로움", kind: "negative", desc: "행복도 감소 속도 +50%", speedMul: 1 },
{ key: "popular", name: "인기쟁이", kind: "positive", desc: "같은 건물 동료의 행복도가 서서히 상승", speedMul: 1 },
];
// ---------- 마을 보드 ----------
@@ -118,6 +121,8 @@ export const FOOTPRINTS: Record<string, { w: number; h: number }> = {
lumberyard: { w: 2, h: 2 },
quarry: { w: 2, h: 2 },
kitchen: { w: 2, h: 2 },
cat_house: { w: 2, h: 2 },
sun_deck: { w: 2, h: 2 },
};
export const footprintOf = (type: string) => FOOTPRINTS[type] ?? { w: 1, h: 1 };
@@ -144,7 +149,8 @@ export const APT_POINT_EVERY = 3; // 3레벨마다 적성 포인트 1
export interface BuildDef {
id: string; // 건물 인스턴스 id (단일 건설)
type: "quarry" | "kitchen";
type: "quarry" | "kitchen" | "cat_house" | "sun_deck";
kind?: "work" | "passive"; // passive: 고양이 배치 없음 (기본 work)
name: string;
emoji: string;
aptitude: AptitudeKey;
@@ -167,6 +173,16 @@ export const BUILD_DEFS: BuildDef[] = [
aptitude: "mining", resource: "stone", maxSlots: 3, cost: { wood: 120 }, reqHallLv: 2, buildTime: 120,
desc: "채굴 적성 고양이가 돌을 캡니다. 돌은 회관 증축과 중급 건물에 필요합니다.",
},
{
id: "cat_house_1", type: "cat_house", name: "고양이 집", emoji: "🛖", kind: "passive",
aptitude: "grooming", maxSlots: 0, cost: { wood: 100, stone: 20 }, reqHallLv: 3, buildTime: 90,
desc: "지친 고양이가 푹 쉬는 보금자리. 휴식 회복이 빨라지고(분당 +30) 행복도 하락을 막아줍니다.",
},
{
id: "sun_deck_1", type: "sun_deck", name: "햇볕 데크", emoji: "🌞", kind: "passive",
aptitude: "grooming", maxSlots: 0, cost: { wood: 120, stone: 40 }, reqHallLv: 3, buildTime: 90,
desc: "따끈한 햇살 아래 뒹굴뒹굴. 마을 전체의 행복도 회복이 1.5배 빨라집니다.",
},
];
// ---------- 요리 (부엌) ----------
@@ -202,6 +218,16 @@ export const mealCap = (kitchenLv: number) =>
export const EAT_THRESHOLD = 65; // 이 포만도 이하면 먹으러 감
export const FULLNESS_DECAY_PER_SEC = 0.03; // × 식욕 수치
// ---------- 체력·행복도 (Phase B) ----------
export const ENERGY_DRAIN_PER_SEC = 2 / 60; // 작업 중 체력 소모 (분당 2)
export const REST_RECOVER_PER_SEC = 20 / 60; // 휴식 회복 (분당 20)
export const HOUSE_RECOVER_PER_SEC = 30 / 60; // 고양이 집 휴식 회복 (분당 30)
export const IDLE_RECOVER_PER_SEC = 10 / 60; // 배회 중 자연 회복 (분당 10)
export const CAT_HOUSE_CAPACITY = 4; // 고양이 집 1채당 휴식 정원
export const STRIKE_THRESHOLD = 20; // 행복도가 이 밑이면 파업
export const STRIKE_RESUME = 40; // 이 이상 회복되면 복귀
// ---------- 마을 회관 증축 ----------
export interface HallLevelDef {