제작
01 게임
이 문서 안에서
부엌·대장간·공방 세 작업대에서 만들 수 있는 레시피 76종을 정합니다. 음식 효과는 요리와 음식 효과, 장비 보너스는 장비와 각인, 가구를 놓는 방은 화면 구성, 재료 출처는 채집과 주머니와 전투에 있습니다.
한 줄 요약 — 제작에는 게이트가 두 겹 있습니다. 누가 아는가(레퍼토리), 그리고 언제 만드는가(
levelReq). 그리고 만들기는 시간이 걸립니다 — 주문과 완성은 다른 순간입니다.
1. 작업대
| 작업대 | id | 직업 | 아이콘 | 여는 버튼 | 산출물 |
|---|---|---|---|---|---|
| 부엌 | kitchen | 요리사(cook) | / | 요리하기 | 소비형 음식 22종 |
| 대장간 | forge | 대장장이(blacksmith) | / | 제작하기 | 판매용 2종 + 장비 39종 |
| 공방 | workshop | 가구 장인(furnisher) | / | 가구 만들기 | 가구 12종 |
STATION_ROLE 은 작업대→직업, ROLE_STATION 은 직업→작업대, STATION_META 가 아이콘과 여는 버튼 문구를 듭니다. 제작 화면 입구는 그 직업 상세 화면의 버튼뿐입니다.
공방은 대장간의 셋째 선반이 아니라 셋째 작업대입니다. 산출물이 음식도 장비도 아니고 아무 수치도 움직이지 않는 가구이기 때문입니다 — 깔개를 대검 옆줄에 세우면 둘 다 찾기 어려워집니다.
작업대 자체에는 배치 조건이 없습니다(요리사가 있으면 부엌도 있는 셈입니다). 다만 공방 앞에는 문이 하나 더 있습니다 — 가구 장인은 ROLE_KINGDOM_LEVEL.furnisher = 2, 왕국 Lv.2부터 영입됩니다. 왕실 침소가 Lv.1에는 아예 없기 때문이고(화면 구성), 방과 그 방을 채울 사람은 같이 도착해야 합니다.
제작 목록은 그 주민의 메뉴입니다. 카드를 연 사람이 아는 레시피(craftRecipesForVillager)만 줄로 서고, 남이 아는 레시피는 아예 빠집니다 — "{누구} 만 만들 수 있습니다"는 이 사람 화면에 잘못 놓인 영입 안내였습니다. 레벨만 모자란 줄은 남습니다(그 사람 자신의 미래 메뉴이고, 여는 방법인 [레벨업]이 바로 뒤 카드에 있습니다).
2. 두 겹의 게이트
| 사유 | 판정 | 화면 문구 | 플레이어가 할 일 |
|---|---|---|---|
role | 이 작업대의 직업이 아님 | (해당 줄이 안 보임) | — |
repertoire | 그 주민이 이 레시피를 모름 | (해당 줄이 안 보임) | 그 사람을 영입 |
level | 레벨이 levelReq 미만 | "Lv.{n} 필요 (현재 Lv.{cur})" | 이 사람을 키움 |
레퍼토리는 평생 무엇을, levelReq는 언제를 정합니다. whoCanCraft(recipeId)가 이름을 싼 순으로, nextCraftUnlockFor가 다음 해금 힌트를 만듭니다. 명부 이전 세이브 요리사는 전 메뉴 인정, levelReq는 그대로.
repertoire로 막힌 줄은 목록에서 빠지므로 화면 문구가 없습니다. 판정 자체는 남아 있습니다 — craftLockReason은 세 사유를 그대로 답하고, 스토어의 craft가 이를 다시 검사합니다(화면 게이트는 권위가 없습니다). whoCanCraft는 명부와 영입 쪽에서 계속 쓰입니다.
티어 1·2·3, 최저 레벨 CRAFT_TIER_MIN_LEVEL = { 1: 1, 2: 4, 3: 8 }. 재료 희귀도가 자연 게이트. 사다리는 작업대마다 따로 오르고, 가장 높은 줄은 대장간의 불멸의 성물(Lv.12)입니다.
3. 부엌 레시피 22종
굵게 표시 = 중간 가공품(빵·생선 스튜) 또는 인장 전용 재료. 부엌은 22종을 내놓고 음식 효과 카탈로그는 19종입니다 — 차이는 연회 모둠·장터 파이·보물 타르트로, 부엌에서 만들지만 먹는 물건이 아니라 축제 상에 올리는 공물입니다(요리와 음식 효과). 효과가 있는 19종은 카탈로그와 양방향으로 일치해야 하며 테스트가 이를 강제합니다.
새로 들어온 재료는 작업지와 목장에서 옵니다 — 옥수수·포도(밭), 야생 고기·모피(사냥터), 달걀·우유·양털(목장), 들박하·감국(약초). 농부가 밀만, 나무꾼이 자작나무 목재만 가져오던 시절의 재료표가 아닙니다(채집과 주머니).
4. 대장간 레시피 42종
굵게 표시 = 인장 전용 재료(§7). 산출 수량이 1이 아닌 레시피는 돌벽돌(×2) 하나뿐입니다. 장비 산출 키 = 장비 카탈로그 id. 장비 39종은 전부 제작 가능합니다 — 획득 경로가 없는 장비는 이제 없습니다(장비와 각인). 목록이 긴 것은 전사 주무장 한 슬롯을 15자루가 나눠 쓰기 때문이고, 그 15줄이 대장간의 3분의 1이 넘습니다.
5. 공방 레시피 12종
굵게 표시 = 중간 가공품(도구) 또는 인장 전용 재료. 가구 12종도 전부 제작 가능하고, 공방 말고 나오는 곳이 없습니다. 가구는 능력치를 하나도 움직이지 않습니다 — 값은 왕실 침소에 놓였을 때의 격조(furniturePrestige)뿐이고, 놓을 자리는 방의 넓이가 정합니다(화면 구성). 대장간의 도구가 참나무 탁자와 책장에 들어가 작업대를 가로지르는 유일한 사슬을 만듭니다.
6. 레퍼토리
| 주민 | 인장 | 합류 Lv | 아는 레시피 | 개수 |
|---|---|---|---|---|
| 한나 (cook-1) | — | 1 | 빵 · 생선 스튜 · 꽉찬 도시락 · 에그타르트 · 풍년 옥수수죽 | 5 |
| 벨라 (cook-2) | — | 1 | 빵 · 젤리 푸딩 · 포자 수프 · 불꽃 전골 · 장터 파이 · 풍년 옥수수죽 | 6 |
| 루다 (cook-3) | — | 2 | 생선 스튜 · 뼈 육수 · 독초 절임 · 돌격 건량 · 에그타르트 · 밀크 푸딩 · 사냥꾼 전골 · 보물 타르트 | 8 |
| 소피 (cook-4) | — | 3 | 젤리 푸딩 · 뼈 육수 · 포자 수프 · 독초 절임 · 꽉찬 도시락 · 광부 꼬치 · 연회 모둠 · 밀크 푸딩 · 약초꾼 샐러드 · 수호 전골 | 10 |
| 마르타 (cook-5) | 14 | 4 | 빵 · 뼈 육수 · 포자 수프 · 독초 절임 · 마녀의 약차 · 장터 파이 · 연회 모둠 · 보물 타르트 · 수호 전골 | 9 |
| 이본 (cook-6) | 22 | 5 | 생선 스튜 · 젤리 푸딩 · 뼈 육수 · 포자 수프 · 마녀의 약차 · 용의 탕약 · 불꽃 전골 · 용린 스테이크 · 사냥꾼 전골 · 약초꾼 샐러드 | 10 |
| 도르 (blacksmith-1) | — | 1 | 도구 · 돌벽돌 · 괭이 · 도끼 · 약초낫 · 화염검 · 대지 전곤 · 겁화 대부 · 반석 파쇄추 | 9 |
| 페로 (blacksmith-2) | — | 1 | 도구 · 괭이 · 도끼 · 가죽 투구 · 행운의 부적 · 곡괭이 · 사냥활 · 약초낫 · 조류 삼지창 · 대지 전곤 · 창해 월도 · 반석 파쇄추 | 12 |
| 군터 (blacksmith-3) | — | 2 | 괭이 · 도끼 · 곡괭이 · 낚싯대 · 가죽 투구 · 기사 훈장 · 쟁기 · 톱 · 전장의 인 · 치유의 호부 · 사냥활 · 장궁 · 질풍 쌍검 · 성광 창 · 뇌풍 세검 · 서광 성검 | 16 |
| 스벤 (blacksmith-4) | — | 3 | 도구 · 곡괭이 · 낚싯대 · 강철검 · 사슬갑옷 · 행운의 부적 · 쇠메 · 그물 · 강철 투구 · 대검 · 판금갑옷 · 사냥활 · 약초낫 · 은낫 · 화염검 · 심연 낫 · 겁화 대부 · 나락 사슬추 | 18 |
| 아이라 (blacksmith-5) | 15 | 4 | 돌벽돌 · 곡괭이 · 강철검 · 사슬갑옷 · 기사 훈장 · 강철 투구 · 대검 · 판금갑옷 · 전장의 인 · 치유의 호부 · 조류 삼지창 · 성광 창 · 창해 월도 · 서광 성검 | 14 |
| 브릭 (blacksmith-6) | 24 | 5 | 강철검 · 사슬갑옷 · 기사 훈장 · 강철 투구 · 행운의 부적 · 대검 · 판금갑옷 · 전장의 인 · 치유의 호부 · 용왕의 관 · 용아검 · 용린갑옷 · 선왕의 유물 · 불멸의 성물 · 질풍 쌍검 · 심연 낫 · 뇌풍 세검 · 나락 사슬추 | 18 |
| 톨름 (furnisher-1) | — | 1 | 나무 의자 · 참나무 탁자 · 양털 깔개 | 3 |
| 니케 (furnisher-2) | — | 2 | 나무 의자 · 책장 · 천개 침대 | 3 |
| 라반 (furnisher-3) | — | 3 | 참나무 탁자 · 양털 깔개 · 책장 · 구리 샹들리에 | 4 |
| 유리 (furnisher-4) | — | 4 | 나무 의자 · 천개 침대 · 의상장 · 흑단 하프 · 구리 샹들리에 | 5 |
| 오넬 (furnisher-5) | 16 | 6 | 양털 깔개 · 천개 침대 · 구리 샹들리에 · 의상장 · 은거울 · 왕가의 기 | 6 |
| 카시아 (furnisher-6) | 25 | 7 | 참나무 탁자 · 책장 · 흑단 하프 · 은거울 · 왕가의 기 · 실내 분수 · 왕좌 | 7 |
굵게 = 티어3(인장 전용). 레퍼토리는 포함관계가 아니라 겹침입니다 — 같은 직업 안에서 남의 목록을 통째로 삼키는 사람이 하나도 없습니다. 그래서 "제일 비싼 사람만 뽑으면 된다"가 답이 되지 않고, 작업대를 덮으려면 조합을 골라야 합니다.
한 사람 전용은 17종입니다 — 돌격 건량(루다), 광부 꼬치(소피), 용린 스테이크·용의 탕약(이본), 쟁기·톱·장궁(군터), 쇠메·그물·은낫(스벤), 용왕의 관·용아검·용린갑옷·선왕의 유물·불멸의 성물(브릭), 실내 분수·왕좌(카시아).
7. 인장 전용 레시피 12종
| 레시피 | 작업대 | Lv | 아는 사람 |
|---|---|---|---|
| 마녀의 약차 | 부엌 | 8 | 마르타 · 이본 |
| 용린 스테이크 | 부엌 | 9 | 이본 |
| 용의 탕약 | 부엌 | 10 | 이본 |
| 용왕의 관 | 대장간 | 10 | 브릭 |
| 용아검 | 대장간 | 10 | 브릭 |
| 용린갑옷 | 대장간 | 11 | 브릭 |
| 선왕의 유물 | 대장간 | 11 | 브릭 |
| 불멸의 성물 | 대장간 | 12 | 브릭 |
| 은거울 | 공방 | 8 | 오넬 · 카시아 |
| 왕가의 기 | 공방 | 9 | 오넬 · 카시아 |
| 실내 분수 | 공방 | 10 | 카시아 |
| 왕좌 | 공방 | 11 | 카시아 |
이 열둘 = tier === 3 전부이고, isSealOnlyRecipe(만들 수 있는 사람이 전부 인장 영입)가 고르는 집합과도 정확히 같습니다. 세 작업대가 저마다 꼭대기를 인장 쪽에 두고 있습니다. 인장 전용 재료 4종은 인장 채집직 5·6번만 생산합니다.
| 재료 | 캐는 사람 | 들어가는 곳 |
|---|---|---|
| 황금 밀 | 농부 5·6 (셀비 · 하렌) | 마녀의 약차 2 · 용린 스테이크 2 |
| 신목 원목 | 나무꾼 5·6 (카린 · 볼드르) | 용아검 1 · 선왕의 유물 3 · 왕가의 기 2 |
| 미스릴 원석 | 광부 5·6 (밀라 · 그란트) | 용왕의 관 2 · 용아검 3 · 용린갑옷 4 · 은거울 2 · 왕좌 4 |
| 심해 진주 | 어부 5·6 (오시 · 나일) | 용의 탕약 1 · 불멸의 성물 2 · 실내 분수 2 |
티어1·2는 인장 재료를 하나도 쓰지 않습니다(테스트 강제).
8. 만들기 창과 정합성
maxCraftable: 재료마다 floor(보유/필요)의 최솟값. 렌더할 때마다 1~max로 클램프합니다. craft(recipeId, amount, villagerId?) 절차: 레시피 존재 확인 → 만들 사람 판정(villagerCanCraft, 이름 없으면 만들 수 있는 첫 사람) → 대기열 상한 확인 → 전량 검증 후 전량 소모 → 0이 된 키 삭제 → 작업 등록. 완성품은 이 시점에 나오지 않습니다.
assertCraftCatalogue() 검사 4종: duplicateIds(중복 id), outputCollisions(산출 키 = 다른 id), selfReferencing(자기 참조), levelReqViolations(티어 최저 레벨·사다리 위반).
9. 제작 대기 — 주문과 완성은 다른 순간
제작은 즉시 완성이 아닙니다. [제작]은 주문이고, 재료는 그 순간 빠지고, 완성품은 대기가 끝나야 나옵니다.
| 무엇 | 값 | 코드 |
|---|---|---|
| 1배치 대기 | craftTimeSec × CRAFT_(60,000ms) = 4~9분 | craftBatchMs |
| N배치 대기 | 1배치 × N (선형) | craftJobMs |
| 한 주민 동시 작업 | 최대 CRAFT_ = 5건 | craft 거절 |
| 두 번째 작업 시작 | 앞 작업의 readyAt (한 사람 = 한 손) | craftQueueStartAt |
| 지급 | 벽시계가 readyAt을 지나면 syncCrafting이 한 번의 쓰기로 전부 | syncCrafting |
craftTimeSec은 연출 길이로 적힌 4~9초였습니다. 그 값을 문자 그대로 읽으면 "제작 중 목록"이 눈이 닿기 전에 비므로, 적힌 1초 = 작업대에서 1분으로 읽습니다(CRAFT_WAIT_PER_SEC_MS 하나가 전체 손잡이 — 1,000으로 내리면 옛 연출 길이로 돌아갑니다). 같은 숫자가 즉시 완료 값도 정하므로 대기와 그것을 건너뛰는 값은 항상 같이 움직입니다.
작업은 save.crafting: CraftJob[]에 남습니다(id·recipeId·villagerId·qty·startedAt·readyAt). 아무것도 재지 않습니다 — readyAt은 주문 때 한 번 쓰이고 화면이 Date.now()와 비교합니다(건설 KingdomBuilding과 같은 규칙). 필드는 옵셔널이라 SAVE_VERSION은 그대로이고, 대기열 이전 세이브는 빈 작업대로 읽힙니다(craftJobsOf).
syncCrafting 호출 자리: 부팅(오프라인 따라잡기), 주민 상세의 1초 틱, 제작 화면 렌더. 아무것도 안 밀렸으면 세이브를 건드리지 않습니다(멱등·무료). 주민을 내보내도 작업은 남습니다 — 재료가 이미 빠졌으므로 태우지 않고, 목록만 사라집니다.
stats.itemsCrafted는 지급 시점에 오릅니다(주문 시점 아님). 미션과 재건 기금 기준선이 읽는 값이라 "존재하는 아이템"을 뜻해야 합니다.
10. 제작 중 목록과 즉시 완료
주민 상세(요리사·대장장이·가구 장인) 하단에 [제작 중] 블록이 있습니다. 작업 1건 = 1줄, 남은 시간과 진행 막대가 1초마다 갱신됩니다. 대기 중인 뒷줄은 "대기 중"으로 표시합니다(자기 차례가 아닌 시간을 세지 않기 위해). 줄을 누르면 그 작업의 카드가 열립니다.
인장으로 대기를 사는 문은 두 개이고, 값은 같은 규칙에서 나옵니다.
| 문 | 자리 | 값 | 코드 |
|---|---|---|---|
| 즉시 완료 | 만들기 창 (주문+수령 한 번에) | craftTimeSec × 수량 | craftInstant |
| 즉시 완료 | 제작 중 항목 카드 | 위 값 × (남은 시간 / 전체) , 최소 1 | rushCraftJob |
주문 직후면 두 값이 같습니다(테스트 강제). 끝난 작업은 값이 null — 곧 무료로 나올 것을 팔지 않습니다. 버튼은 [받기]로 바뀌고 syncCrafting을 한 번 당겨 부릅니다. 앞 작업을 인장으로 끝내면 뒤 작업이 건너뛴 시간만큼 앞으로 당겨집니다(안 그러면 산 대기를 다음 배치에서 다시 서게 됩니다).
인장은 대기만 삽니다 — 두 문 모두 craft와 같은 관문(직업 고용 · 레시피 숙지 · 레벨 · 전량 재료)을 그대로 통과한 뒤 인장을 더 받고, 재료가 모자라면 인장이 아무리 많아도 거절합니다. 재료·인장 어느 쪽이라도 부족하면 세이브는 그대로입니다.
제작 완료 연출은 없습니다(2026-08-11, src/game/fx/craft.ts 삭제). 지급 자리에만 붙도록 한 번 좁혔던 연출(playCraftFx)을 이번엔 전부 걷어냈습니다. 근거 넷:
- 세 지급 문 모두 이미 토스트가 이름과 개수를 말합니다(
craft.made_n·craft.job.collected·craft.job.rushed). 연출은 1.4초 뒤에 같은 두 사실을 아이콘으로 한 번 더 말했을 뿐입니다. - 네 번째 문에는 애초에 없었습니다 — 주민 상세의 1초 틱이 부르는
syncCrafting은 같은 물건을 아무 연출 없이 넘깁니다. 같은 사건이 문에 따라 있다 없다 했다는 것은, 그것이 정보가 아니라 장식이었다는 뜻입니다. - 세 자리 중 둘(
받기·인장 단축)은close()뒤에 재생했습니다. 창을 닫아 게임으로 돌려보낸 다음 화면을 1.4초 다시 어둡게 만드는 순서입니다. - 제작은 코어 루프의 상시 동작입니다. 작업대 한 번에 전체 화면 암전은 보상이 아니라 마찰입니다.
남는 것은 토스트와 소리(craft·collect·reward)와 분석 이벤트입니다. 사라진 정보는 없습니다.
11. 재료값 대비 산출값
판매가끼리의 비교입니다(resourceSellQuote). 티어가 오를수록 차이가 벌어지고, 부호는 한 방향으로만 갑니다.
| 작업대 | 티어 | 레시피 | 차이 범위 | 이익 | 가장 손해 |
|---|---|---|---|---|---|
| 부엌 | 1 | 7 | -7 ~ +5 | 5종 | 불꽃 전골 (-7) |
| 부엌 | 2 | 12 | -12 ~ +8 | 5종 | 보물 타르트 (-12) |
| 부엌 | 3 | 3 | -76 ~ -48 | 0종 | 용린 스테이크 (-76) |
| 대장간 | 1 | 9 | -14 ~ +5 | 3종 | 가죽 투구 (-14) |
| 대장간 | 2 | 28 | -76 ~ +16 | 4종 | 전장의 인 (-76) |
| 대장간 | 3 | 5 | -292 ~ -48 | 0종 | 용린갑옷 (-292) |
| 공방 | 1 | 4 | -62 ~ -8 | 0종 | 책장 (-62) |
| 공방 | 2 | 4 | -138 ~ -32 | 0종 | 천개 침대 (-138) |
| 공방 | 3 | 4 | -524 ~ -140 | 0종 | 왕좌 (-524) |
76종 중 이익이 남는 것은 17종뿐이고 전부 티어1·2입니다. 티어3은 12종 전부가 적자이며 가장 깊은 곳이 왕좌(재료 824 → 판매 300, −524)입니다. 제작은 되팔아 버는 일이 아니라 쓰려고 만드는 일입니다 — 음식은 먹고, 장비는 채우고, 가구는 놓습니다. 공방이 티어1부터 전 줄 적자인 것도 같은 이유입니다. 가구에는 되팔 이유가 아예 없습니다.
12. 사슬과 막다른 길
| 산출물 | 어디로 들어가는가 |
|---|---|
| 빵 | 연회 모둠 ×2 |
| 생선 스튜 | 용의 탕약 ×2 |
| 도구 | 참나무 탁자 ×1 · 책장 ×2 |
돌벽돌만 아무 데도 들어가지 않는 순수 판매품으로 남았습니다. 도구는 공방이 생기면서 막다른 길에서 벗어났습니다.
13. 설계안 — 아직 구현되지 않음
옛 기획서 ingredient-content.md(삭제됨, 마지막 사본은 구현 상태 §4)에 농사·가공·채집 노드·상점 네 축의 재료 획득 시스템이 설계되어 있었으나 어느 것도 그 형태로는 구현되지 않았습니다. 지금 게임에서 도는 제작은 위 76종입니다.
| 축 | 설계 내용 | 코드 실제 |
|---|---|---|
| 농사 | 건물 8종, 60~120초 주기, 최대 5개 비축 | 건물이 아니라 작업지로 왔습니다 — 밭·숲·사냥터를 주민이 고르고 주머니에 쌓입니다 |
| 가공 | 시설 8종 입력→출력 변환 | 방앗간·화덕·치즈프레스만 오브젝트, 변환 로직 없음 |
| 채집 노드 | 맵 타일 재생 자원 5종 | 없음 (채집은 주민 주머니 모델뿐) |
| 상점 | 6곳에서 코인 구매, 60초 재입고 | 없음 (상점은 결제 상품 전용) |
| 작업대 조건 | station 오브젝트가 맵에 필요 | 검사 코드 없음, stove id도 없음 |
production 블록 | 오브젝트에 output/interval/maxStock | 어느 오브젝트에도 없음 |
별도 카탈로그 data/cooking/recipes.json(34종)은 런타임에서 읽는 코드가 없습니다.
이어서 읽기
- 요리와 음식 효과 — 부엌 산출물 22종의 효과, 구간 적분
- 장비와 각인 — 대장간 산출물 39종의 보너스
- 화면 구성 — 공방 산출물 12종이 놓이는 왕실 침소
- 채집과 주머니·전투 — 기본 자원·인장 재료·전리품 출처
- 명부와 영입 — 요리사·대장장이·가구 장인 18명의 가격과 레퍼토리
- 구현 상태 — 어긋남과 미구현 항목