전투
01 게임
이 문서 안에서
이 문서는 전사가 싸우는 규칙을 정합니다. 판정이 하나도 없고, 실제로 돌아가는 것은 syncWarriorBattle() 함수 하나뿐입니다. 스테이지 138개와 던전 10개의 수치표는 던전과 몬스터에, 장비 ATK와 각인 배수는 장비와 각인에 있습니다.
한 줄 요약 — 전사 한 명의 ATK를 4초당 1회씩 그 전사가 출정한 던전의 스테이지 HP에서 깎고, 스테이지마다 몬스터의 한 방을 받습니다. 쓰러지면 몇 초 뒤 일어나 그 던전을 처음부터 다시 갑니다.
1. 전사 생명력
| 항목 | 값 |
|---|---|
| 소유 | 전사만. 나머지 직업에는 hp 필드가 없습니다 |
| 최대치 | base × 1.42^(level-1) × (1 + gearPct/ |
base | 명부 traits. — 전사 6명이 105~170 |
| 성장 | 레벨당 ×1.42. 레벨업 시 오른 만큼 그대로 채워 줍니다 |
| 장비 | stamina 보너스가 퍼센트. 사슬갑옷 20 = +20% |
STAGE_RETALIATION_HITS = 1. 스테이지 하나를 깎는 동안 그 전사가 받는 총 피해 = stage.atk × 1. 진행에 비례해 부과합니다.
3이었던 자리입니다 — 전사들이 한 줄로 싸울 때의 값입니다. 그때는 반격이 앞줄부터 최대 여섯 개의 생명력 통에 나눠 담겼고, 전멸해도 프런티어가 남아 던전이 여러 회복 주기에 걸쳐 떨어졌습니다. 지금은 둘 다 아닙니다: 한 명이 전부 맞고, 쓰러지면 판이 던전 입구로 돌아가므로 한 판에 끝까지 밀어야 합니다. 3에서는 관문 레벨 전사가 던전의 15~36%에서 멈추고 아무리 되풀이해도 끝낼 수 없었고, 1에서는 50~86%에 닿아 3레벨(생명력 ×1.42씩)이면 나머지를 넘습니다 — WARRIOR_HP_LEVEL_RATIO에 기록된 의도 그대로입니다.
쓰러지면: HP_RECOVERY_MS = 8초 후 온전한 몸으로 재개 — 그리고 출정 던전의 첫 스테이지부터 다시(runStage를 그 던전 입구로 되돌립니다). 두 시간짜리 정지였던 자리입니다 — 화면에는 쓰러진 전사와 태연히 서 있는 몬스터, 분 단위 카운트다운, 그리고 할 수 있는 일이 아무것도 없었습니다. 고장난 화면과 구별되지 않았습니다.
기록(`highestCleared`)은 되돌리지 않습니다. 되돌아가는 것은 판(runStage)뿐입니다. 기록은 던전 목록·임무·다음 판의 출발점이 읽는 값이고, 마지막 던전은 스테이지 하나가 몇 시간이라 하룻밤 실수로 지워질 값이 아닙니다.
다시 지나는 층 — 값은 받고, 속도는 파밍 속도
싸운 몬스터는 값을 냅니다. 첫 번째든 마흔 번째든, 쓰러뜨린 머리는 들고 있던 것을 떨굽니다. 재도전 구간이 프런티어와 다른 것은 속도입니다:
| 어디 | 한 마리에 걸리는 시간 | 보상 |
|---|---|---|
새 땅(stage.) | 스테이지 HP ÷ 내 ATK — 바닥 없음 | 골드 · 전리품 1개 |
다시 지나는 땅(≤ cleared) | `stageFarmMs` — 그 땅의 관문 레벨 전사 속도(바닥 30초) | 골드 · 전리품 1개 |
| 순찰(공략한 던전) | 같은 식 | 골드 · 전리품 1개 |
즉 "이미 딴 땅을 다시 잡는 것"은 순찰과 같은 것으로 취급합니다 — 순찰이 곧 그 규칙의 특수한 경우입니다. 이 구분이 이 고리의 밸런스 전부입니다: 생명력은 쓰러질 때만 돌아오므로 쓰러짐은 공짜 풀 힐이고, 속도 제한 없이 재클리어가 값을 내면 레벨 7 전사 3명이 세 번째 던전 입구에서 하루 840마리를 법니다 — 레벨 20 전사 6명이 다섯 번째 던전을 순찰해 버는 것보다 많고, 전리품 레시피는 그 순찰 속도를 기준으로 매겨져 있습니다.
바닥이 상수 30초여선 안 되는 이유. 바닥은 싸움을 느리게만 하므로, 전사가 넘어선 몬스터에 대해서는 오히려 가속이 됩니다 — 39스테이지를 30초에 한 마리씩 잡는 Lv.20 전사는 자기 프런티어를 미는 것의 여섯 배를 벌었습니다. 그래서 stageFarmMs는 그 땅이 현역이던 속도를 씁니다: 그 스테이지가 속한 던전의 관문 레벨 전사가 필요한 시간이고, 초반 스테이지를 위한 바닥만 30초로 둡니다. 옛 땅은 옛 값만 내고, 진격은 늘 그보다 낫습니다.
바닥이 걸린 동안에는 ATK도 상성도 속도를 바꾸지 못합니다 — 상한이 상한인 이유이고, 장비와 속성이 값을 하는 자리는 새 땅입니다.
이미 공략한 던전을 순찰하다 쓰러지면 순찰 바퀴만 되돌아갑니다(그 던전은 이미 딴 곳이라 진행을 깎을 것이 없습니다). 되돌아가는 거리는 부적이 줄입니다 — 아래 참조. 한 번의 정산이 되풀이하는 재도전은 WIPE_RESTART_CAP = 40판까지입니다 — 2주치 부재를 정산하며 수십만 번 죽는 대신, 40번이면 플레이어가 알아야 할 것은 이미 전부 말한 것입니다.
부적 — 쓰러진 손실
쓰러짐의 값이 시계에서 땅으로 바뀌었으므로, 부적(recovery)도 그 땅을 되사는 쪽으로 물립니다: 전사가 그 던전에서 이미 딴 스테이지 수의 recovery%만큼 앞에서 다시 시작합니다(각인 3 최상급이면 59% — 떨어진 자리 근처까지). 순수 이득이 아니라 거래입니다: 건너뛴 땅은 건너뛴 파밍 수입이므로, 부적을 낀 전사는 가벼운 가방으로 프런티어에 빨리 돌아오고, 안 낀 전사는 꽉 찬 가방으로 걸어옵니다. 8초 넉다운도 같은 퍼센트만큼 짧아집니다(warriorRecoveryMs).
음식 회복: 뼈 육수(bone_broth) 그 전사 50%. 전사 상세의 음식 목록에서 먹입니다 — 쓰러진 전사에게 먹이면 즉시 일으켜 세웁니다. 전원 회복 요리는 없습니다: 회복이 파티 단위였을 때의 연회 모둠은 축제 공물로 남았습니다(요리와 음식 효과).
2. 이 전투에 없는 것
명중·회피·치명타·턴 큐·프레임 루프·영구 사망 — 모두 없습니다. 상성 보정은 전사별 무기로 배선되어 있습니다(던전과 몬스터 7장). 난수를 쓰는 곳은 전리품 추첨뿐이고, 명부 전사 6명이 사실상 전투 인구의 상한입니다.
3. syncWarriorBattle()
한 전사의 VillagerState.battle 위에서 경과 시간을 적분합니다. 왕국의 전사 전원을 한 번에 정산하는 것은 syncKingdomBattles이고, 이것은 주민 목록을 한 바퀴 돌면서 전사마다 syncWarriorBattle을 호출하는 단순 폴드입니다 — 전사 간에 읽는 상태가 없으므로 순서가 의미를 갖지 않습니다.
멈추는 네 조건 — 하나라도 걸리면 경과 시간을 버립니다:
atk <= 0(전사가 쓰러져 있음)resolveDungeon()이null- 개척지가 출정 던전의
[stageStart, stageEnd)밖 isDungeonLevelMet()실패 — 이 전사의 레벨이 그 던전의 관문 미만
누적식:
effectiveMs = buffedWorkMs(lastFoughtAt, now, villager.buffs, "warrior_atk")
hits = effectiveMs / 4_000
damage = damageDealt + hits × warriorAtkOf(warrior)
클리어 루프:
limit = min(stageCount(), active.stageEnd)
while (target < limit):
stage = getBattleStage(target)
atk = liveAtkAgainst(stage의 속성) // 상성 포함
if damage < stage.hp → damageDealt = damage, 반환
damage -= stage.hp; target += 1
if stage.index > cleared:
cleared = stage.index
gold += stage.rewardGold; 전리품 1개 추첨
- 잉여 대미지는 다음 스테이지로 이월
- 루프는 던전 경계에서 멈춤
- 던전 완주 시 잉여 대미지 폐기(
damageDealt: 0) - 재도전 구간(
stage.index <= cleared)은 보상은 그대로, 속도만PATROL_MIN_MS바닥에 걸림
4. 전사별 전투
전사 한 명이 곧 하나의 전투입니다. 편성 화면이 없고, 두 전사를 같은 던전에 출정시켜도 각자의 독립된 런으로 진행합니다.
전사 ATK = 10 + level × 3 + floor(장비 ATK 합 + 명부 고유 ATK)
ATK를 합산하는 곳은 없습니다. 상성 배수는 그 전사의 무기 속성으로, 그 전사 앞에 선 몬스터에게만 곱합니다(warriorAffinityMul). 버프도 그 전사의 villager.buffs에만 있고, warrior_atk 배수는 먹인 그 한 명에게만 적용됩니다.
| 로스터 id | 이름 | 고유 ATK | 시작 Lv | 영입가 |
|---|---|---|---|---|
warrior-1 | 카일 | 2 | 1 | 골드 44 |
warrior-2 | 델라 | 4 | 1 | 골드 60 |
warrior-3 | 롤프 | 7 | 2 | 골드 90 |
warrior-4 | 유나 | 11 | 3 | 골드 132 |
warrior-5 | 가레스 | 16 | 4 | 골드 170 + 인장 18 |
warrior-6 | 이졸데 | 22 | 5 | 골드 220 + 인장 26 |
각자의 전장. 각 전사는 고유한 VillagerState.battle을 갖고 있습니다:
- 고유한
highestCleared— 이 전사가 가 본 가장 먼 스테이지 - 고유한
dungeonId— 이 전사가 출정한 던전 - 고유한
runStage— 지금 서 있는 자리(기록과 별개) - 고유한
defeatedAt— 쓰러진 시각(0이면 서 있음) - 고유한
spoils·spoilsGold— 이 전사의 전리품 자루 - 고유한
history— 최근 전투 이력
한 전사가 쓰러져도 다른 전사는 자기 던전에서 계속 싸웁니다. 쓰러짐은 한 전사의 일이지, 왕국의 일이 아닙니다.
던전 레벨 게이트도 전사 개인의 레벨로 판정합니다(isDungeonLevelMet). 인장으로 산 통행 허가만이 왕국 전체에 열려 있습니다(save.dungeonWaivers) — 허가가 사는 것은 장소이지 사람이 아니기 때문입니다.
5. 정산 시점
| 호출 시점 |
|---|
| 부팅 시 1회 |
| 전사 상세 열기·그리기·1초 틱·닫기 |
세이브 구조(VillagerState.battle):
통행 허가는 왕국 단위로 남습니다:
정산은 아무것도 지급하지 않습니다. 클리어한 골드와 전리품은 그 전사의 spoilsGold · spoils에 쌓이고, 가방과 지갑으로 들어가는 통로는 collectBattleSpoils(villagerId) 하나뿐입니다(6장).
6. 전리품
균등 분포, 풀 크기 1 = 100%, 2 = 각 50%. loot_bonus(독초 절임) 버프 시 추가 추첨:
lootCoverage = buffCoverageMs(...) / elapsed
rng() < lootCoverage → 같은 풀에서 extraPerClear 개 추가
6.1 쌓아두기 — battle.spoils · battle.spoilsGold
왕국의 다른 모든 생산은 수거해야 가방에 들어옵니다(주머니, 채집망, 목장). 전투만 스스로 지급해서, 정산이 백그라운드에서 끝나 있으면 전사 상세를 열었을 때 넘겨받을 것이 남아 있지 않았습니다. 밤새 싸운 결과가 아무도 보지 않는 동안 움직인 숫자로만 도착한 셈입니다.
그래서 클리어는 그 전사의 전리품 자루를 채웁니다.
| 성질 | 값 | 이유 |
|---|---|---|
| 상한 | 주머니와 같음 — 100 + (레벨- × 명부 pouch × 왕실 가죽 가방(×2) | 모든 주민은 상한을 가집니다. 가득 차면 싸움이 멈추고 수거를 기다립니다(채집자가 캐기를 멈추는 것과 같습니다). 상한이 없던 동안 전사는 부재 중 수입에서 어떤 채집자도 따라올 수 없었고, 용량을 파는 유료 상품이 전사에게는 팔 것이 없었습니다 |
| 소유 | 전사 한 명 | 이 전사가 벌었고, 이 전사의 카드에서 한 번 누르면 비웁니다 |
| 출정 변경 | 그대로 따라감 | 재배치는 명령이지 정산이 아닙니다 |
| 전멸·해고 | 그대로 남음 | 자루는 주민이 아니라 진행 상태에 붙어 있습니다 |
6.2 넘겨받기 — collectBattleSpoils(villagerId, now?)
전사 상세의 전리품 섹션, 가방으로 옮기기 버튼. 한 번의 쓰기로
spoils전량 →inventoryspoilsGold전량 →gold, 그리고stats.goldEarned(두 재화 수입 계수)- 자루 초기화, 획득 팝업에 골드 칸까지 함께 표시
비어 있으면 세이브를 건드리지 않고 { gold: 0, loot: {} }를 반환합니다. stats.resourcesGathered는 채집 계수이므로 전투 전리품은 예전처럼 세지 않습니다. stats.stagesCleared는 클리어 시점에 그대로 오릅니다 — 수거하지 않아도 주기 임무는 진행됩니다.
정산 결과의 goldEarned · lootGained는 그 정산이 벌어들인 양을 보고할 뿐 소유를 뜻하지 않습니다(토스트와 전투 이력이 읽는 값).
7. 음식 버프
| 음식 | 효과 | 수치 | 자리 |
|---|---|---|---|
불꽃 전골 (pepper_) | warrior_atk | ×1.25, 20분 | 구간 적분 |
용린 스테이크 (dragon_) | warrior_atk | ×1.6, 30분 | 구간 적분 |
독초 절임 (venom_) | loot_ | +1개, 30분 | 추가 추첨 |
돌격 건량 (charge_) | battle_ | 60초분 즉시 | damageDealt 직접 가산 |
수호 스튜 (guardian_) | damage_cut | 25%, 30분 | 피격량 감산 |
모든 음식은 한 전사에게 먹입니다(target: "warrior"). 버프는 그 전사의 villager.buffs에 걸리고, 정산할 때 그 전사의 구간 적분에만 들어갑니다. 왕국 전체에 거는 전투 버프는 없습니다.
8. 전투 이력
battle.history — 전사마다 최근 10건, 최신순.
| 종류 | 조건 | 기록 내용 |
|---|---|---|
win | 정산이 1스테이지 이상 클리어 | 스테이지 수 · 골드 |
dungeon | 출정 던전 마지막 스테이지 돌파 | 스테이지 수 · 골드 |
defeat | 전멸 | 스테이지 · 몬스터 |
patrol | 순찰에서 1마리 이상 처치 | 스테이지 수 · 골드 |
승리는 정산당 한 줄로 묶입니다. 왕국 전체의 이력은 kingdomBattleHistory가 모든 전사의 로그를 합쳐 최신순 10건을 돌려줍니다.
9. 화면과 연출
전투 UI는 전사 주민 상세 오버레이 안 섹션입니다. Phaser 비네트 224×120px, 250ms 폴링으로 실제 전투 대상을 그립니다. 순찰 중에도 전사와 몬스터가 공격하고, 전멸하면 전사가 쓰러진 채 남은 초를 표시합니다. 일어서면 던전 첫 몬스터로 바뀌어 다시 공격합니다. 적 반격과 쓰러짐·부활 모션은 순수 연출이며, 진행·피해·회복 판정은 syncWarriorBattle이 만든 스냅샷만 따릅니다.
한 마리, 한 시계
스냅샷의 quarry 필드가 지금 이 전사 앞에 선 몬스터 하나를 가리키고, 비네트·하단 자동전투 패널·적 정보 세 화면이 모두 이것만 읽습니다. 예전에는 패널이 프런티어를, 비네트가 순찰 던전의 마지막 몬스터를, 적 정보가 던전 그 자체를 말했고 시뮬레이션은 로스터 평균을 상대했습니다 — 한 전투를 두고 세 화면이 서로 다른 답을 한 것입니다.
| 화면 | 무엇을 읽는가 |
|---|---|
| 비네트(스프라이트·이름·HP 게이지) | quarry, quarryDamage |
자동전투 패널(줄·바·적 HP a/b) | 같은 두 값. 바는 항상 줄어듭니다(몬스터 체력이므로) |
| 적 정보 | 같은 몬스터의 초상·속성·반격·보상·전리품 후보 |
시계도 하나입니다. 세이브는 경과 시간을 연속으로 적분하므로(syncWarriorBattle), 두 화면이 어긋나는 원인은 늘 한쪽이 멈춰 있는 것이었습니다 — 패널 바는 1초마다 기어가는데 비네트 게이지는 BATTLE_HIT_MS(4초) 동안 굳어 있다가 한 번에 뛰었습니다. 비네트는 이제 250ms마다 권위 상태를 다시 읽고, 타격 프레임은 숫자를 띄우는 자리이지 게이지를 움직이는 자리가 아닙니다. 게이지가 가리키는 대상은 화면에 서 있는 몬스터입니다(mountedEnemyHealth): 쓰러뜨린 순간 스냅샷은 이미 다음 머리를 말하므로, 그 값을 죽는 스프라이트 밑에 그리면 처치가 회복처럼 보입니다.
어긋남과 미구현 항목은 구현 상태에 있습니다.
이어서 읽기
- 던전과 몬스터 — 스테이지·던전 수치표, 몬스터와 상성 카탈로그
- 장비와 각인 — 전사 장비 ATK와 각인 배수
- 코어 루프 — 벽시계 파생 모델의 원형
- 요리와 음식 효과 — 전투 음식의 제작과 창
- 성장과 레벨 — 레벨이 ATK와 던전 게이트에 들어가는 방식
- 명부와 영입 — 전사 6명의 가격과 영입 조건
- 구현 상태 — 어긋남과 미구현 항목 전체 목록