내 작은 왕국 기획 위키

전투

01 게임

이 문서 안에서

이 문서는 전사가 싸우는 규칙을 정합니다. 판정이 하나도 없고, 실제로 돌아가는 것은 syncWarriorBattle() 함수 하나뿐입니다. 스테이지 138개와 던전 10개의 수치표는 던전과 몬스터에, 장비 ATK와 각인 배수는 장비와 각인에 있습니다.

한 줄 요약 — 전사 한 명의 ATK를 4초당 1회씩 그 전사가 출정한 던전의 스테이지 HP에서 깎고, 스테이지마다 몬스터의 한 방을 받습니다. 쓰러지면 몇 초 뒤 일어나 그 던전을 처음부터 다시 갑니다.


1. 전사 생명력

항목
소유전사만. 나머지 직업에는 hp 필드가 없습니다
최대치base × 1.42^(level-1) × (1 + gearPct/100)
base명부 traits.stamina — 전사 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.index > cleared)스테이지 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을 호출하는 단순 폴드입니다 — 전사 간에 읽는 상태가 없으므로 순서가 의미를 갖지 않습니다.

멈추는 네 조건 — 하나라도 걸리면 경과 시간을 버립니다:

  1. atk <= 0 (전사가 쓰러져 있음)
  2. resolveDungeon()null
  3. 개척지가 출정 던전의 [stageStart, stageEnd)
  4. 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개 추첨

4. 전사별 전투

전사 한 명이 곧 하나의 전투입니다. 편성 화면이 없고, 두 전사를 같은 던전에 출정시켜도 각자의 독립된 런으로 진행합니다.

전사 ATK = 10 + level × 3 + floor(장비 ATK 합 + 명부 고유 ATK)

ATK를 합산하는 곳은 없습니다. 상성 배수는 그 전사의 무기 속성으로, 그 전사 앞에 선 몬스터에게만 곱합니다(warriorAffinityMul). 버프도 그 전사의 villager.buffs에만 있고, warrior_atk 배수는 먹인 그 한 명에게만 적용됩니다.

로스터 id이름고유 ATK시작 Lv영입가
warrior-1카일21골드 44
warrior-2델라41골드 60
warrior-3롤프72골드 90
warrior-4유나113골드 132
warrior-5가레스164골드 170 + 인장 18
warrior-6이졸데225골드 220 + 인장 26

각자의 전장. 각 전사는 고유한 VillagerState.battle을 갖고 있습니다:

한 전사가 쓰러져도 다른 전사는 자기 던전에서 계속 싸웁니다. 쓰러짐은 한 전사의 일이지, 왕국의 일이 아닙니다.

던전 레벨 게이트도 전사 개인의 레벨로 판정합니다(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 + (레벨-1)×10 × 명부 pouch × 왕실 가죽 가방(×2)모든 주민은 상한을 가집니다. 가득 차면 싸움이 멈추고 수거를 기다립니다(채집자가 캐기를 멈추는 것과 같습니다). 상한이 없던 동안 전사는 부재 중 수입에서 어떤 채집자도 따라올 수 없었고, 용량을 파는 유료 상품이 전사에게는 팔 것이 없었습니다
소유전사 한 명이 전사가 벌었고, 이 전사의 카드에서 한 번 누르면 비웁니다
출정 변경그대로 따라감재배치는 명령이지 정산이 아닙니다
전멸·해고그대로 남음자루는 주민이 아니라 진행 상태에 붙어 있습니다

6.2 넘겨받기 — collectBattleSpoils(villagerId, now?)

전사 상세의 전리품 섹션, 가방으로 옮기기 버튼. 한 번의 쓰기로

비어 있으면 세이브를 건드리지 않고 { gold: 0, loot: {} }를 반환합니다. stats.resourcesGathered는 채집 계수이므로 전투 전리품은 예전처럼 세지 않습니다. stats.stagesCleared는 클리어 시점에 그대로 오릅니다 — 수거하지 않아도 주기 임무는 진행됩니다.

정산 결과의 goldEarned · lootGained그 정산이 벌어들인 양을 보고할 뿐 소유를 뜻하지 않습니다(토스트와 전투 이력이 읽는 값).


7. 음식 버프

음식효과수치자리
불꽃 전골 (pepper_stew)warrior_atk×1.25, 20분구간 적분
용린 스테이크 (dragon_roast)warrior_atk×1.6, 30분구간 적분
독초 절임 (venom_pickle)loot_bonus+1개, 30분추가 추첨
돌격 건량 (charge_ration)battle_damage60초분 즉시damageDealt 직접 가산
수호 스튜 (guardian_stew)damage_cut25%, 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): 쓰러뜨린 순간 스냅샷은 이미 다음 머리를 말하므로, 그 값을 죽는 스프라이트 밑에 그리면 처치가 회복처럼 보입니다.

어긋남과 미구현 항목은 구현 상태에 있습니다.


이어서 읽기

이 문서를 가리키는 곳