대항해시대 2 백과 (DOS 한글판)

| 규칙 목록 | 원문 Markdown |

해전과 결투

나눗셈은 모두 버림입니다. 주소는 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캐넌320200 / 180 / – / –
2데미캐넌214140 / – / – / –
3캐넌 페드레로210100 / – / – / –
4컬버린510100 / 90 / 80 / 70
5데미컬버린5440 / 36 / 32 / 28
6세이커2440 / – / – / –
7캐로네이드520200 / 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으로.
    • 물·식량·목재·포탄은 가져가지 않습니다.
  • 전투가 진행되고 적 전력이 플레이어보다 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:0xA622DS:0xA1A8, DS:0xA1AA
BL, DBL (전투 레벨)인물 +0x25인물 +0x1D
장비 고를 때 쓰는 항해 레벨인물 +0x24인물 +0x1C
pa·pd (앞 동작 기록, 2비트씩)DS:0xA626, DS:0xA627DS:0xA1AE, DS:0xA1AF
쪽마다 7바이트 결투 기록DS:0xA8FA + 쪽 × 7DS: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배)은 연구 자료 기준이며 한글판 상수를 직접 보지 않았습니다.

| 규칙 목록 | 원문 Markdown |