Phase A: 채석장·돌 자원·회관 Lv3·부엌 증축·훈제 생선·적성 포인트

- 돌 자원 + 채석장(목재 120, 회관 Lv2 해금, 채굴 3슬롯)
- 건설 시스템 공통화 (BUILD_DEFS): 공터 표시·건설 패널 데이터 기반
- 부엌 Lv2 증축 (목재 150+돌 60): 선반 15, 회관 Lv3와 함께 훈제 생선 해금
- 회관 Lv3: 목재 250+돌 150, 채석장·부엌 Lv2·Lv5↑ 2마리 → 수용 8
  (Lv4는 목공소 대기 잠금 예고)
- 적성 포인트: 3레벨마다 1 지급, 카드에서 원하는 적성에 투자 (품종 상한)
- 경험치 필요량 레벨×60 → ×90, 세이브 마이그레이션(stone·aptitudePoints)
- HUD 돌 칩, 자원 이모지/라벨 공통화

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
이 커밋은 다음에 포함됨:
kjs
2026-08-13 15:01:12 +09:00
co-authored by Claude Fable 5
부모 590cb98ca7
커밋 9de2abfd85
5개의 변경된 파일과 304개의 추가작업 그리고 63개의 파일을 삭제
+52 -5
파일 보기
@@ -86,13 +86,46 @@ export const PASSIVES: PassiveDef[] = [
{ key: "workaholic", name: "일중독", kind: "tradeoff", desc: "작업 속도 +60%, 행복도 감소 +40%", speedMul: 1.6 },
];
// ---------- 성장 ----------
export const EXP_PER_LEVEL = 90; // 레벨업 필요 경험치 = 레벨 × 90
export const APT_POINT_EVERY = 3; // 3레벨마다 적성 포인트 1
// ---------- 건설 가능한 건물 ----------
export interface BuildDef {
id: string; // 건물 인스턴스 id (단일 건설)
type: "quarry" | "kitchen";
name: string;
emoji: string;
aptitude: AptitudeKey;
resource?: "fish" | "wood" | "stone";
maxSlots: number;
cost: Partial<Record<"fish" | "wood" | "stone", number>>;
reqHallLv: number;
desc: string;
}
export const BUILD_DEFS: BuildDef[] = [
{
id: "kitchen_1", type: "kitchen", name: "부엌", emoji: "🍳",
aptitude: "cooking", maxSlots: 2, cost: { wood: 60 }, reqHallLv: 1,
desc: "요리 적성 고양이가 생선으로 요리를 만들고, 배고픈 고양이들이 알아서 먹으러 옵니다.",
},
{
id: "quarry_1", type: "quarry", name: "채석장", emoji: "⛏️",
aptitude: "mining", resource: "stone", maxSlots: 3, cost: { wood: 120 }, reqHallLv: 2,
desc: "채굴 적성 고양이가 돌을 캡니다. 돌은 회관 증축과 중급 건물에 필요합니다.",
},
];
// ---------- 요리 (부엌) ----------
export interface RecipeDef {
key: string;
name: string;
emoji: string;
input: Partial<Record<"fish" | "wood", number>>; // 재료 (추후 획득처 확장)
input: Partial<Record<"fish" | "wood" | "stone", number>>; // 재료 (추후 획득처 확장)
work: number; // 요리 1개당 필요 작업량
fullness: number; // 먹었을 때 포만도 회복량
reqHallLv: number; // 해금 조건: 회관 레벨
@@ -112,8 +145,10 @@ export const RECIPES: RecipeDef[] = [
},
];
export const KITCHEN_BUILD_COST = { wood: 60 };
export const KITCHEN_MEAL_CAP = 10; // 요리 선반 최대 보관 수
export const KITCHEN_MEAL_CAPS = [10, 15]; // 부엌 레벨별 선반 보관 수
export const KITCHEN_UPGRADE_COST = { wood: 150, stone: 60 }; // Lv1→2
export const mealCap = (kitchenLv: number) =>
KITCHEN_MEAL_CAPS[kitchenLv - 1] ?? KITCHEN_MEAL_CAPS[KITCHEN_MEAL_CAPS.length - 1];
export const EAT_THRESHOLD = 65; // 이 포만도 이하면 먹으러 감
export const FULLNESS_DECAY_PER_SEC = 0.03; // × 식욕 수치
@@ -121,14 +156,26 @@ export const FULLNESS_DECAY_PER_SEC = 0.03; // × 식욕 수치
export interface HallLevelDef {
capacity: number;
cost: Partial<Record<"fish" | "wood", number>>;
cost: Partial<Record<"fish" | "wood" | "stone", number>>;
reqCat?: { level: number; count: number };
reqBuildings?: Array<{ type: "quarry" | "kitchen"; level?: number; label: string }>;
locked?: string; // 아직 구현 안 된 선행 요소 안내
}
export const HALL_LEVELS: Record<number, HallLevelDef> = {
2: { capacity: 5, cost: { wood: 100, fish: 80 }, reqCat: { level: 3, count: 1 } },
3: { capacity: 8, cost: { wood: 400 }, reqCat: { level: 5, count: 2 }, locked: "돌 자원(채석장)이 추가된 뒤 해금됩니다" },
3: {
capacity: 8, cost: { wood: 250, stone: 150 },
reqCat: { level: 5, count: 2 },
reqBuildings: [
{ type: "quarry", label: "채석장 건설" },
{ type: "kitchen", level: 2, label: "부엌 Lv2" },
],
},
4: {
capacity: 12, cost: { stone: 400 }, reqCat: { level: 8, count: 3 },
locked: "목공소(목판)가 추가된 뒤 해금됩니다",
},
};
export const CAT_NAMES = [