해전과 결투
나눗셈은 모두 버림입니다. 주소는 KO 한글판 파일 오프셋 / EN 영문판 파일 오프셋.
"공동(pooled)" 능력치 = 그 배의 선장과 함께 탄 항해사 중 최고값(외부자료의 정의, 대조로 같은 구조 확인).
1. 전투 순서 (확인됨[대조])
- 함대 순서: 공격 본대 → 방어 본대 → 공격 지원 함대 → 방어 지원 함대. 한 턴 10라운드, 라운드마다 각 함대가 다음 배를 움직입니다. (턴 루프 EN 0x151D8 일대)
- 한 턴 = 20분. 21:00 이후 턴이 끝나면 일몰로 종료(코드 1). 바다 메뉴의 "전투"는 5:00–19:40에만 가능, NPC가 먼저 거는 습격은 6:00–17:40에만(KO 0x1F583 / EN 0x1FA1E).
- 전투 중에는 식량·물 소비, 날씨, 다른 함대 처리가 없습니다.
2. 바람과 이동력 (확인됨[대조])
전투 바람(KO 0x1410F / EN 0x143BF):
WS = 1 + random(8) (1–8)
방향 = floor(random(8) × 5 / 7) (0–5, 헥스 방향)
이동력(KO 0x1288D / EN 0x12B3F; 상수 150, 20, 15, 25, 10 확인). 선장 본인의 항해술 Sea, 항해 레벨 NL:
P = floor(동력 × WS × 8 / 150) + 20
Q = floor(P × Sea / 100)
MP = clamp(Q + floor(NL × Q / 15), 10, 25)
한 걸음 비용(KO 0x127F1 / EN 0x12AA3). 바람 가중치 W = 순풍 1, 60° 2, 120° 3, 역풍 4:
직진: floor(동력 × W / 100) + 5
회전: W가 3·4이면 10 − floor(5 × 조타 / 100), 아니면 5
회전율(KO 0x12840 / EN 0x12AF2; 상수 200, 15, 100 확인):
T = floor(조타 × Sea / 200)
회전율 = min(100, T + floor(NL × T / 15))
걸음마다 회전 충전값 += 회전율(최대 100), 50 이상이어야 60° 회전 가능, 회전하면 0으로. 충전값은 턴을 넘어 유지됩니다. (외부자료, 대조)
3. 포격
3.1 대포 (확인됨[직접] 표 위치, 값은 영문판과 같음)
사거리 표 DS:0x0828, 위력 표 DS:0x0838(한글판; 영문판 0x09EE / 0x09FE). 거리 d = 2, 3, 4, 5의 배수 10, 9, 8, 7.
| 번호 | 대포 | 사거리 | 위력 | 화력 d=2/3/4/5 |
|---|---|---|---|---|
| 1 | 캐넌 | 3 | 20 | 200 / 180 / – / – |
| 2 | 데미캐넌 | 2 | 14 | 140 / – / – / – |
| 3 | 캐넌 페드레로 | 2 | 10 | 100 / – / – / – |
| 4 | 컬버린 | 5 | 10 | 100 / 90 / 80 / 70 |
| 5 | 데미컬버린 | 5 | 4 | 40 / 36 / 32 / 28 |
| 6 | 세이커 | 2 | 4 | 40 / – / – / – |
| 7 | 캐로네이드 | 5 | 20 | 200 / 180 / 160 / 140 |
(대포 이름은 영문판 기준 음역. 한글판 표기는 게임 화면 확인 필요.)
발사 조건(KO 0x12900 / EN 0x12BB2): 포탄이 남았고, 거리 2 이상 사거리 이하, 표적이 양 현측 60° 부채꼴 안. 앞뒤로는 쏠 수 없습니다. 인접(거리 1)은 백병전만.
3.2 포격 피해 (확인됨[직접], KO 0x12AD3 / EN 0x12D85)
A = floor(BL × L / 100) + floor(L / 2) L = 공동 통솔력, BL = 공동 전투 레벨
G = min(floor(대포 / 2), floor(floor(선원 × 전투 % / 100) / 2))
Y = floor(G × 화력[d] / 10)
Z = floor(ceil(Y / 20) × A / 100) 포술(Gunnery) 있음
Z = floor(ceil(Y / 40) × A / 100) 포술 없음
W = floor(Z × (50 + random(floor(S / 2))) / 100) S = 공동 검술
D = max(1, min(W, 50 + random(floor(C / 2)))) C = 쏘는 배 선장 본인의 전투 레벨
- 표적의 선장·선체·선원은 공식에 들어가지 않습니다. 용기·항해술도 쓰이지 않습니다.
- 포술 기능은 사실상 피해 ×2.
- 한 번 피해 상한은 50–99.
3.3 표적에 미치는 효과 (확인됨[대조], KO 0x13828 / EN 0x13ADB)
내구 −= min(내구, D)
선원 −= min(선원, floor(D / 2) + random(3))
추가 피해: D < 10이면 1/5 확률로 판정, 10 이상이면 항상. random(19)로 고릅니다.
| random(19) | 추가 피해 |
|---|---|
| 0–2 | 최대 내구 |
| 3–6 | 동력 |
| 7–10 | 조타 |
| 11–12 | 최대 내구 + 동력 |
| 13–14 | 최대 내구 + 조타 |
| 15–16 | 동력 + 조타 |
| 17–18 | 셋 다 |
- D ≥ 20이면
random(7)로 두 개 이상(0–1 내구+동력, 2–3 내구+조타, 4–5 동력+조타, 6 셋 다). - D ≥ 40이면 항상 셋 다.
- 최대 내구는 1 감소(선종 내구의 1/4 아래로는 안 감). 동력·조타는
floor(D/2) + random(3)감소. - 대포는 파괴되지 않습니다. 내구 0이면 침몰(KO 0x1376E), 선원 0이면 무인선(장애물로 남음).
4. 백병전 (확인됨[직접], KO 0x12A56 / EN 0x12D08)
전투 시작 때 정하는 백병 계수(KO 0x1449F 부근; 선장 본인 검술 Sw, 전투 레벨 BL):
M = floor((floor(Sw × BL / 100) + floor(Sw / 2)) × k / 3)
k = 3 (플레이어 배, NPC 함대의 첫 활동 배), 2 (NPC의 나머지 배)
한글판은 피연산자 순서가 달라 보이지만(BL +0x25, Sw +0x21 순으로 읽음) 같은 식입니다.
한 쪽의 살상 수:
F = floor((선원 + random(10)) × 전투 % / 100)
X = floor(M × F / 100)
K = clamp(floor(((X × (50 + random(floor(S / 2)))) mod 65536) / 100), 1, 50)
공격 측이 먼저 min(선원, K)를 죽이고, 줄어든 선원으로 방어 측이 반격합니다. 선원 수 차이 항은 없습니다. 백병전은 내구·동력·조타를 깎지 않습니다.
적 기함이 플레이어 기함에 붙을 때 결투 신청(KO 0x13A5B / EN 0x13D0E, 외부자료 + 대조):
random(15) + 적 선장 검술 ≥ 주인공 검술 그리고 적 선장 운 ≥ random(플레이어 기함 선원)
5. 전투 전 대화: 싸움·도주·항복 (확인됨[대조], KO 0x14A61·0x14B4A / EN 0x14D12·0x14DFB)
- 전력 =
floor((활동 배 현재 내구 합 + 4) / 5)(KO 0x1D07D / EN 0x1D40F), 지원 함대 포함. - 상선 함대(번호 끝자리 1–4)가 플레이어보다 훨씬 약하면(플레이어 전력이 1.5배 초과, 외부자료) 먼저 항복을 제안합니다. 받아들이면 코드 2로 끝나고 전리품·경험치 없음, 해적 명성 ×1.
- 항해사의 판단:
floor(3 × 플레이어 전력 / 2) ≥ 적 전력이면 "걱정 없습니다"(821), 아니면 820. - 도주:
주인공 운 + 주인공 항해 레벨 > random(150)이면 성공(822, 코드 3). (KO 0x14C45 / EN 0x14EF6, 상수 150 확인) - 항복(코드 9):
- 국가 함대: 메시지는 "2/3를 빼앗는다"지만 실제로는 금과 모든 교역품이
floor(2 × 값 / 3), 즉 1/3을 빼앗깁니다. - 해적(60–69): 교역품 전부. 금은 1,000 미만이면 +1,000, 1,000–9,999이면 그대로, 10,000 이상이면 5,000으로.
- 물·식량·목재·포탄은 가져가지 않습니다.
- 국가 함대: 메시지는 "2/3를 빼앗는다"지만 실제로는 금과 모든 교역품이
- 전투가 진행되고 적 전력이 플레이어보다 20 이상 크면, 기함 외 배의 선장 중 충성도 < 40인 사람이 배와 함께 떠납니다(KO 0x1498D / EN 0x14C3E).
6. 종료와 결과 (확인됨[대조], KO 0x15CEE / EN 0x16040)
| 코드 | 결말 | 메시지 |
|---|---|---|
| 4 | 적 기함 선원 0 또는 침몰: 승리 | 833 |
| 6 | 결투 승리: 승리 | 833 |
| 2 | 적 기함 도주 | 565 |
| 1 | 일몰 | 563 |
| 3 | 플레이어 기함 도주 | 564 |
| 9 | 항복 | 566 |
| 5 | 플레이어 기함 선원 0 또는 침몰: 게임 오버 | 1017 |
| 7 | 결투 패배: 게임 오버 | 1017 |
- 짝수 코드(2, 4, 6)이면 각 선장에게 전투 경험치
floor(B / 5)(B = 적 전체 최대 내구 합)와 외교 변화(우호도 하락). 홀수 코드는 없음. - 개별 경험치: 포격·백병이 명중할 때마다 10, 격침·무력화하면 10 × 표적 최대 내구. (character.md)
- 맵 가장자리 헥스에서는 판정 없이 이탈할 수 있습니다. 본대 기함이 이탈하면 바로 종료.
- 패배한 NPC 함대: 기함 침몰·무인, 결투 패배, 또는 선장 플래그 0x20이 없으면 함대를 잃고 무작위 항구로 갑니다(KO 0x15050 / EN 0x15302).
6.1 전리품 (확인됨[대조], KO 0x15616 / EN 0x15912)
- 금
(F + 1) × 100. F = 패배 함대의 금고(함대 기록 +0x24). - 함대 보유 아이템(+0x1D)도 가져옵니다(소지품 20개 미만일 때).
- 금고 =
floor(길드 이익 / 10) + 1 + random(3), 재출항·귀항 때 다시 정해짐(KO 0x1D5A6 / EN 0x1D938). 귀항 때 아이템이 없으면 1/2 확률로 50 + random(20)번 장신구를 얻습니다(KO 0x388E2 / EN 0x3990B). - NPC끼리 싸워 한 척 격침할 때마다 패자 금고의 1/5을 가져갑니다(최대 60,000).
- 나포:
K = min(10 − 활동 배 수, 빈 선장 수, 후보 수)척까지(KO 0x15226 / EN 0x154D8). 후보 = 패배한 본대의 남은 배 중 화면 안에 있거나 무인인 배.
6.2 해적 명성 (외부자료, 대조: KO 0x157F6 / EN 0x15B33)
해적 명성 += 200 + 결과 계수 × 외교 계수 × min(적 BL, 15) × min(적 BL, 30)
결과 계수: 승리 3, 적 기함 도주·상선 항복 1
외교 계수: 외교 등급 2·3·4이면 그 값, 그 외 1 (명성 상한 50,000)
7. NPC 함선 AI (확인됨[대조])
초기 명령(KO 0x141B3 / EN 0x14463):
| 항목 | 값 |
|---|---|
| 전략 | 상선 함대 Flee, 그 외 Pack |
| 전술 | Attack |
| 추격 | 용기 ≥ random(50)이면 Chase, 아니면 Defend |
| 방식 | 포탄이 있고 범선이면 Fire, 아니면 Rush |
| 기함 | 위 값을 0x22로 덮어씀(Pack, Attack, Defend, Rush) |
- 그래서 상선 호위선은 첫 턴부터 도망치고, 기함만 남아 싸웁니다.
- 모든 배가 Attack으로 시작하므로 용기는 전투에 실질 영향이 없습니다(외부자료의 분석).
- 목적지: 이번 턴에 실제로 갈 수 있는 헥스를 깊이 우선으로 모두 찾아 공격 가치·피격 노출 지도로 점수를 매깁니다. 무작위 없음. (EN 0xF857 / KO 0xF529 부근, 자동 대응은 실패했으나 구조 동일)
- 사기(KO 0xED02 / EN 0xEF6A): 자기 함대 기함의 선원 ≤ 최대 선원의 40% 또는 내구 ≤ 40%, 또는 이탈했으면 그 배는 남은 전투 동안 Flee. 플레이어 호위선에도 적용.
8. 결투 (외부자료, 루틴 대조: KO 0x17429 / EN 0x17769)
- 해전 중 주인공이 신청:
플레이어 기함 선원 + random(주인공 운) ≥ 적 기함 선원이면 적이 수락. - 균형값 0–200(시작 100), 20합 교환. 0 또는 200이면 끝, 20합이 지나면 무승부.
- 피해(연구 자료 기호 그대로; S 검술, BL 전투 레벨, W 무기 보정, a·pa·d·pd 선택 관련 값, R 방어구):
기본 위력 = floor(S / 2) + floor(S × BL / 50)
공격 배율 = 25 × a + (무기 있으면 50) + (유리하면 W)
공격력 = floor(floor((기본 위력 + W) × (4 − pa) / 4) × 공격 배율 / 100)
방어 점수 = R + min(DBL, 20) + 5 × (2 − d)
일반 피해 = min(50, trunc((100 − 방어 점수) × 공격력 / 100))
피해 = 일반 피해 + random(floor(BL / 2))
상성표(찌르기↔막기 등)는 곱셈표가 아니라 위 식의 항으로 반영됩니다. 기호의 정확한 의미는 연구 자료 dueling.md 참조.
한글판 필드 대응(확인됨[직접], 피해 KO 0x17429와 장비 준비 KO 0x1758C를 영문판과 나란히 읽음; 두 루틴 모두 명령어 차이 0):
| 기호 | 한글판 | 영문판 |
|---|---|---|
| 양쪽 인물 기록 포인터 | DS:0xA620, DS:0xA622 | DS:0xA1A8, DS:0xA1AA |
| BL, DBL (전투 레벨) | 인물 +0x25 | 인물 +0x1D |
| 장비 고를 때 쓰는 항해 레벨 | 인물 +0x24 | 인물 +0x1C |
| pa·pd (앞 동작 기록, 2비트씩) | DS:0xA626, DS:0xA627 | DS:0xA1AE, DS:0xA1AF |
| 쪽마다 7바이트 결투 기록 | DS:0xA8FA + 쪽 × 7 | DS:0xA482 + 쪽 × 7 |
| 그 안의 무기 계열(유리한 공격 판정) | +2 | +2 |
| 그 안의 W (무기 성능) | +3 (u16) | +3 |
| 그 안의 R (갑옷·방패 성능 합) | +5 (u16) | +5 |
| 장비한 도구 표시 / 분류 / 성능 | 도구 +0x19 비트 0x10 / +0x19 / +0x18 | +0x15 / +0x15 / +0x14 |
무기 계열은 items.md의 분류 번호(1 스트레이트 소드 = 찌르기 유리, 2 커브 소드 = 베기, 3 헤비 소드 = 치기, 0 검 = 없음)입니다(계열 뜻은 확인됨[대조]).
확인하지 못한 것
- 결투 기록
+0,+1바이트의 뜻. - 한글판 대포·명령 이름 표기.
- 상선 항복의 정확한 문턱(1.5배)은 연구 자료 기준이며 한글판 상수를 직접 보지 않았습니다.