채집과 주머니
01 게임
이 문서 안에서
- 1. 주머니 모델
- 1.1 공식
- 1.2 상수
- 1.3 레벨별 기본 용량 (특성 ×1, 구매권·버프 없음)
- 1.4 자동 유입 없음
- 2. 채집 직업 4종과 산출물
- 2.1 작업지 (src/game/data/worksites.ts)
- 3. 광산 8곳
- 4. 수거
- 4.1 [가방으로 옮기기] — collectVillager(id)
- 4.2 [모두 수거] — collectAllVillagers(now, bonus)
- 4.3 +10% 보너스
- 4.4 집사의 손길 (perm_collect, $9.99)
- 5. 버프 곱셈 자리
- 6. 화면
- 7. 설계안 — 맵 채집 노드 (미구현)
- 이어서 읽기
자원이 생기는 경로는 주민 개인 주머니 하나뿐입니다. 적립 공식, 용량 배수, 채집 직업 4종 산출물, 광산 8곳과 배정 규칙, 수거 명세서와 +10% 보너스, 음식 버프 적용 위치를 정합니다.
한 줄 요약 — 주머니 수량은
gatheredAt이후 경과를 나눈 파생값이고, 플레이어가 버튼을 누르기 전까지는 공용 가방으로 넘어오지 않습니다.
1. 주머니 모델
1.1 공식
용량 (villagerPouchCapacity): capacity = max(1, round((100 + (level-1)×10) × traits.pouch × pouchMultiplier × maxBuffMultiplier))
단위당 시간 (villagerGatherMs): ms = max(2000, floor((8000 × mineMul) / (max(0.1, traits.gather) × max(1, gear))))
보유 수량 (gatheredAmount): amount = min(capacity, max(0, floor(buffedWorkMs(gatheredAt, now, buffs, "gather_rate", role) / villagerGatherMs)))
gather_rate 버프는 ms/개가 아니라 시계 배율로 적분에 곱해집니다. 구매권(packPurchases)은 세 함수의 필수 인자입니다.
1.2 상수
| 상수 | 값 | 뜻 |
|---|---|---|
GATHER_ | 8,000 ms | 1개당 작업 시간 |
POUCH_ | 100 | Lv.1 용량 |
POUCH_ | 10 | 레벨 1당 추가 용량 |
POUCH_ | 2 | perm_ 소유 시 용량 배수 |
COLLECT_ | 0.1 | 일괄 수거 보너스 비율 |
villagerGatherMs 하한 | 2,000 ms | 분당 30개 속도 천장 |
traits. 하한 | 0.1 | 0으로 나누기 방지 |
gear. 하한 | 1 | 장비가 속도를 깎지 못함 |
1.3 레벨별 기본 용량 (특성 ×1, 구매권·버프 없음)
| Lv | 용량 | 만충 시간 |
|---|---|---|
| 1 | 100 | ≈ 13분 20초 |
| 5 | 140 | ≈ 18분 40초 |
| 10 | 190 | ≈ 25분 20초 |
| 20 | 290 | ≈ 38분 40초 |
상한 초과 시간은 버려집니다. 수거 시 gatheredAt = now 리셋.
1.4 자동 유입 없음
채집 자원은 공용 가방으로 저절로 흘러들지 않습니다. 예외는 없습니다 — 수거는 언제나 플레이어가 누릅니다. stats.resourcesGathered는 "거둔 양"입니다.
2026-08-10 — 전투도 이 규칙 아래로 들어왔습니다. 스테이지 보상은 전사 개인의 전리품 자루에 쌓이고 전사 상세에서 수거합니다(전투 6장). 이제 왕국에서 플레이어를 거치지 않고 가방에 들어오는 것은 없습니다.
2. 채집 직업 4종과 산출물
| 직업 | 주머니 자원 | 비고 |
|---|---|---|
| farmer | 작업지에 따라 가변 (wheat~grape) | 밭 6단계 (작업지 선택) |
| woodcutter | 작업지에 따라 가변 (birch_log~ebony_log) | 숲 5단계 (작업지 선택) |
| miner | 배정 광산에 따라 가변 (quarry_~crystal) | 광산 8곳 |
| fisher | 작업지에 따라 가변 (river_~moonlit_eel) | 어장 5단계 (작업지 선택) |
| warrior / cook / blacksmith | 없음 | villagerPouch → null |
해석: premiumResourceFor(rosterId) ?? worksiteResource(v) ?? ROLE_RESOURCE[role]. 작업지가 있는 직업(농부·나무꾼·사냥꾼·어부)은 배정된 작업지의 자원을 캐고, 광부는 배정 광산의 광물을 캡니다. 인장 5·6번 후보는 전용 재료만 캡니다.
| 후보 | 전용 재료 |
|---|---|
farmer-5·farmer-6 | golden_ |
woodcutter-5·woodcutter-6 | heartwood |
miner-5·miner-6 | mithril |
fisher-5·fisher-6 | deep_ |
2.1 작업지 (src/game/data/worksites.ts)
농부·나무꾼·사냥꾼·어부는 광부의 광산처럼 작업지를 선택합니다. 레벨 게이트를 넘으면 더 깊은 곳을 열 수 있고, 깊을수록 좋은 재료를 가져오되 gatherMsMul이 올라 느려집니다.
| 직업 | 작업지 수 | 시작 자원 → 최종 자원 | 레벨 범위 |
|---|---|---|---|
| 농부 | 6 | wheat(Lv.1) → grape(Lv.16) | 1·3·5·8·12·16 |
| 나무꾼 | 5 | birch_log(Lv.1) → ebony_log(Lv.15) | 1·3·6·10·15 |
| 사냥꾼 | 5 | game_(Lv.1) → boar_(Lv.15) | 1·3·6·10·15 |
| 어부 | 5 | river_(Lv.1) → moonlit_eel(Lv.15) | 1·3·6·10·15 |
작업지 이동은 setVillagerWorksite 명시적 조작만. 이동 시 gatheredAt = now로 미수거분 소실. defaultWorksiteFor는 시작 작업지(체인의 첫 번째). 인장 후보(전용 재료)는 작업지가 없습니다(resolvedWorksiteFor → null).
3. 광산 8곳
개방 허가 비용 = round(levelReq × 0.75) + 3. gatherMsMul은 ms/개에 곱해집니다(클수록 느림).
| index | id | 이름 | levelReq | 자원 | gatherMsMul | sealOnly | 개방 허가 |
|---|---|---|---|---|---|---|---|
| 0 | pebble- | 자갈 채석장 | 1 | stone | 1.00 | 판매 안 함 | |
| 1 | copper- | 구리 갱도 | 3 | copper | 1.05 | 인장 5 | |
| 2 | iron- | 철광 맥 | 5 | iron | 1.10 | 인장 7 | |
| 3 | coal- | 석탄 심층 | 8 | coal | 1.15 | 인장 9 | |
| 4 | silver- | 은빛 회랑 | 12 | silver | 1.20 | 인장 12 | |
| 5 | sunstone- | 태양석 동굴 | 16 | sunstone | 1.25 | 인장 15 | |
| 6 | crystal- | 수정 공동 | 20 | crystal | 1.30 | 인장 18 | |
| 7 | mithril- | 미스릴 심연 | 3 | mithril | 1.35 | 예 | 판매 안 함 |
해금 규칙 (isMineUnlocked): 광부 아님→false / sealOnly→인장 광부+레벨 충족만 true / 인장 광부→일반 광산 false / 개방 허가 있음→true / level < levelReq→false / 선형 체인 충족→true.
인장 광부 판정: premiumResourceFor(rosterId)==="mithril" 또는 seals > 0.
defaultMineFor는 해금 중 가장 얕은 곳. 이동은 setMinerMine 명시적 조작만. 이동 시 gatheredAt = now로 미수거분 소실. 허가는 주민 개인 소유(VillagerState.mineGrants), 체인 전체를 엽니다.
copper·coal·silver·sunstone·crystal은 레시피에 안 쓰입니다. 가치는 판매가뿐입니다.
| 광산 | 시간당 개수 | 개당 판매가 | 시간당 골드 |
|---|---|---|---|
| 자갈 채석장 | 450 | 1 | 450 |
| 구리 갱도 | 429 | 2 | 857 |
| 철광 맥 | 409 | 2 | 818 |
| 석탄 심층 | 391 | 4 | 1,565 |
| 은빛 회랑 | 375 | 6 | 2,250 |
| 태양석 동굴 | 360 | 10 | 3,600 |
| 수정 공동 | 346 | 16 | 5,538 |
| 미스릴 심연 | 333 | 60 | 20,000 |
4. 수거
4.1 [가방으로 옮기기] — collectVillager(id)
주머니 읽기 → amount <= 0이면 세이브 불변 → 집사의 손길 소유 시 collectBonus(amount) 가산 → inventory += amount → gatheredAt = now + pruneBuffs → stats.resourcesGathered += amount → 1회 persist. 약초꾼의 개별 collectForager도 약초 자원별로 같은 보너스를 붙입니다.
4.2 [모두 수거] — collectAllVillagers(now, bonus)
전 주민 합계 계산 → total <= 0이면 불변 → bonus시 자원별 collectBonus 가산 → 인벤토리 가산 → 비워진 주민만 시계 리셋 → 1회 persist. 프리뷰(collectPreview)와 동일 villagerPouch 사용.
4.3 +10% 보너스
collectBonus(amount) = max(1, ceil(amount × 0.1)). 올림, 최소 1. 수거 자체는 무료·무제한. 광고는 보너스만 삽니다. 규칙: { dailyCap: null, cooldownMs: 600_000 }. 다른 보상형 지면은 주민 카드의 20분 gather_boost입니다.
2026-08-03 — 수거 무료화, 광고는 보너스 전용으로 변경.
2026-08-04 — 일일 1회 → 10분 쿨다운. 반복 시 +10% 수렴, 집사의 손길과 같은 몫.
4.4 집사의 손길 (perm_collect, $9.99)
개별·일괄 수거가 곧 ×1.1이고, 모든 주머니와 약초 채집망의 채집 시계가 상시 ×1.5입니다(광고 불필요). 주민 카드의 20분 광고 가속은 선택한 한 명에게 추가로 곱해집니다. 특권은 수거를 대신 누르지는 않습니다.
2026-08-10 — 부팅 시 자동 수거 삭제. 플레이어가 손대기 전에 주머니를 비우는 것은 채집 루프의 유일한 조작을, 가장 많이 지불한 플레이어에게서 걷어내는 일이었습니다. 상품은 수거의 크기와 채집 속도를 팔되, 조작 자체는 남깁니다.
tests/architecture.test.ts가main.ts를 지킵니다.
5. 버프 곱셈 자리
용량 사슬: (100+(lv-1)×10) × traits.pouch(0.90~1.70) × pouchMultiplier(1|2) × maxBuffMultiplier(1|1.5). 최소 1.
기본 속도: max(2000, floor((8000 × placeMul × resourceMul) / (innate × gear))). 실제 누적 작업 시간은 여기에 음식·광고 gather_rate 적분과 집사의 손길 collectGatherMultiplier(1|1.5)를 곱합니다.
용량 버프만 창 최댓값 사용. 속도 버프는 buffedWorkMs 적분. 현재 빌드 최대 innate×gear = 2.81(하한 도달 불가). 버프 지속 상한 = 기본 × 2(MAX_BUFF_STACK_FACTOR).
생선 스튜(harvest): 즉시 max(1, floor((min×60000)/villagerGatherMs)) 개를 가방에 직접 넣음. gatheredAt 불변. gather_rate 버프 무시, 광산·장비 반영.
6. 화면
| 자리 | 표시 |
|---|---|
| 주민 카드 | {자원} {n}/ |
| 주민 상세 | 수량, 분당 채집량, 가득 참 안내, 가방으로 옮기기 버튼 |
| 광산 목록 | 이름+자원 / 레벨·인장 조건 / 버튼(작업 중·이동·개방·잠김) |
| 명세서 시트 | 자원별 수량·+n, 합계, 수거/수거(+/광고/쿨다운 버튼 |
7. 설계안 — 맵 채집 노드 (미구현)
주머니 모델과 별개의 맵 타일 채집 설계. P5. 노드 5종: 해초 밭(120초)·야생 허브(90초)·낚시터(60초)·벌 떼(300초)·야생 동물(180초).
이어서 읽기
- 코어 루프 — 공식이 틱 없이 성립하는 이유
- 명부와 영입 —
traits.gather/traits.pouch42명분 값 - 성장과 레벨 — 용량을 키우는 레벨업 트랙과 비용 곡선
- 요리와 음식 효과 — 채집 축 요리 5종과 버프 스택 규칙
- 장비와 각인 — 속도 사슬의
gear항 - 구현 상태 — 어긋남과 미구현 항목