NPC 함대와 인물
주소는 KO 한글판 파일 오프셋 / EN 영문판 파일 오프셋. [대조] = 한글판 루틴이 영문판 분석 루틴과 명령·상수 단위로 일치(diff 0 또는 구조체 오프셋 차이만).
1. 함대 구성 (외부자료 + 확인됨[대조])
함대 번호는 10개씩 묶입니다. 나라 순서: 포르투갈 0, 스페인 10, 투르크 20, 영국 30, 이탈리아 40, 네덜란드 50, 해적 60.
| 위치 | 나라 함대 | 해적 함대 |
|---|---|---|
| 0 | 그 나라 주인공 | – |
| 1–4 | 상선단 | 버커니어 |
| 5–6 | 호위대 | 코르세어 |
| 7–9 | 원정대 | 사략선 |
함대 기록 0x85바이트. 영문판은 세이브 슬롯 +0x1DE0, 한글판은 세이브 슬롯 +0x2182(DS:0x2DB2) + 번호 × 0x85, 70개입니다(크기·위치 확인됨[직접]: 기록 그룹 08, KO 0x36AF7의 mov al, 0x85 / add si, 0x2DB2). 아래 필드 배치는 루틴들이 diff 0으로 일치하므로 같은 배치로 판단했습니다(확인됨[대조]):
| 오프셋 | 내용 |
|---|---|
| +0x00/+0x02 | 현재 x, y |
| +0x04/+0x06 | 목표 x, y |
| +0x1B | 목표(objective) |
| +0x1C | 목표 인자(항구 또는 인물 번호) |
| +0x1D | 보유 아이템(0xFF 없음) |
| +0x21 | 실은 교역품(0xFF 없음) |
| +0x24 | 금고(×100 금) |
| +0x26 | 모항 |
| +0x27 | 도착 대기 일수 |
| +0x28 | 전력 = floor((내구 합 + 4) / 5) |
| +0x29 | 플래그(0x01 활동, 0x10 정박, 0x40 시나리오 함대) |
2. 목표 (외부자료)
| 값 | 의미 | 인자 |
|---|---|---|
| 0 | 귀항 | 모항 |
| 1 | 투자 | 항구 |
| 2 | 교역 | 항구 |
| 3 | 매복 | 항구 |
| 4 | 상선 습격 | 인물 |
| 5, 6 | 함대 추적 | 인물 |
| 7 | 추적(교전 뒤 귀항하지 않음, 시나리오용) | 인물 |
| 8 | 함대 호위 | 인물 |
| 9 | 항구 경비 | 항구 |
| 10 | 시나리오 추적 | 인물 |
3. 국가 전략과 목표 선택 (확인됨[대조])
3.1 매월 국가 전략 (KO 0x1CB66 / EN 0x1CEFB; 상수 90, 120 확인)
나라마다 공격 대상국 T(국가 기록 +0x02, 7이면 주인공 소속국)와 공격성(+0x09):
r = random(120) T의 길드 이익 ≥ 자기 길드 이익
r = random(90) 그 외
공격성 > r 이면 모드 = (T의 이익 > 자기 이익) ? 4 : 5
아니면 모드 = random(3) (0–2)
해적: 대상이 주인공 나라(7)이면 모드 7, 아니면 8 (무작위 없음)
3.2 목표 표 (KO 0x387D6 / EN 0x397FF, 표 EN 파일 0x47818)
함대가 모항에 돌아와 대기를 마치면 모드와 위치로 목표를 고릅니다.
| 모드 | 상선(1–4) | 호위(5–6) | 원정(7–9) |
|---|---|---|---|
| 0, 1 | 1 투자 | 9 항구 경비 | 8 함대 호위 |
| 2 | 2 교역 | 9 | 8 |
| 3 | 1 | 6 추적 | 6 |
| 4–6 | 1 | 5 추적 | 6 |
| 7 | 6 | 9 | 6 |
| 8 | 6 | 4 상선 습격 | 6 |
- 모항이 수도가 아니면 항상 목표 0(귀항)을 받습니다. 그래서 수도(알제)가 모항이 아닌 해적 7개 함대는 영원히 모항 근처를 맴돌고, 실제로 사냥하는 것은 코르세어 65–66뿐입니다(외부자료의 분석).
- 인자 선택: KO 0x386B9 / EN 0x396DB.
3.3 출항 제한 (확인됨[대조], KO 0x383FC / EN 0x3941E)
같은 나라에서 바다에 나가 있는(정박 비트 0x10이 없는) 같은 종류 함대가 상선 2개 이상, 호위·원정 1개 이상이면 출항하지 못하고 목표 0, 5일 대기. 시나리오 함대(0x40)는 예외. 패배한 함대도 재편성 전까지는 "바다에 있음"으로 셉니다.
3.4 도착 대기
- 항구 도착 시
8 + random(8)일(KO 0x1EFA5 / EN 0x1F440), 재편성 시5 + random(10)일, 출항 제한 시 5일. - 함대 t는 하루 중 틱 t에 한 번 갱신됩니다(KO 0x2008F / EN 0x2052F).
4. 투자와 교역 (확인됨[대조]; 시장 쪽 효과는 trade.md)
상선단만 하며, 자기 나라 수도에서는 하지 않습니다.
- 투자(KO 0x38968 / EN 0x39991), 금고 2 이상일 때:
floor(금고 / 2) × 100금을 산업 > 경제이면 시장 투자에, 아니면 조선소 투자에 넣습니다(50,000 상한, 차면 다른 쪽).- 금고를 반으로.
- 그 나라 지지도 +=
min(100 − 지지도, floor(6 × 금고 / 10)), 같은 만큼 다른 나라에서 1씩 돌아가며 뺍니다.
- 교역(KO 0x38AE4 / EN 0x39B0D): 교역품 10–25 중 무작위 하나를 현재 시세로 금고 한도(최대 1,000개)만큼 사고, 그 품목 가격률 +3–5(최대 100).
- 귀항(KO 0x3885D / EN 0x39886): 짐이 있으면 모항의 모든 가격률 −random(3), 그 품목은 2 더(0 미만 안 됨). 배를 전부 수리하고, 금고 =
floor(길드 이익 / 10) + 1 + random(3), 짐 비움, 아이템이 없으면 1/2로 장신구(50 + random(20)).
5. 추적과 교전 (확인됨[대조])
5.1 접촉 (KO 0x1F854 / EN 0x1FCEF)
목표 4–7 함대와 표적이 같은 24×24 타일 구역에 있으면 접촉. 목표 4는 그 구역 안의 활동 중인 0–59번 함대 가운데 전력이 자기보다 낮은 함대를 찾습니다.
5.2 추적 갱신 (KO 0x1F280 / EN 0x1F71B)
추적 포기 확률 1/15 또는 1/30(상황별), 자기 나라가 공격받으면 호위·원정·해적 경비 함대가 12틱 단위로 반응. 시나리오 함대는 이 단계를 건너뜁니다. (세부 분기는 외부자료)
5.3 NPC끼리의 전투 (KO 0x1F583 / EN 0x1FA1E; 상수 150 확인)
화면 없이 처리됩니다.
- 낮(틱 18–53, 06:00–18:00)에만.
- 화면 밖이면
random(150) < 표적 선장 항해술일 때 표적이 도망. - 목표 7이 아니면 공격 측은 교전 후 귀항(한 출항에 한 번).
- 서로
floor(전력 / 10)의 내구 피해를 마지막 칸 배부터 줍니다. - 침몰 한 척마다 짐의 1/5(최대 1,000)과 금고의 1/5(최대 60,000)을 빼앗습니다.
- 공격국 → 표적국 관계 −2 또는 −3.
5.4 플레이어 습격
- 표적이 주인공이면 해전 화면으로. 단 시나리오 함대가 아니면 주인공 작위가 0(무작위)일 때 귀항합니다. 그래서 코르세어는 작위가 있는 주인공만 습격합니다(EN 0x1FA87, 외부자료 + 대조).
- 습격은 6:00–17:40에만.
- 전투 뒤 살아남은 공격 측은 목표 7이 아니면
random(3) = 0일 때 귀항.
6. NPC 함대 이동 (외부자료, 루틴 일부 대조)
- 세계 항로 그래프: DATA1.LZW 4번(16바이트 × 768, 사용 622개), 5번(노드 수). 가까운 노드로 간 뒤 그래프를 따라갑니다.
- 화면 안 속도: 플레이어 공식(navigation.md 3.2)과 같지만 선원·적재 계수가 없고, 해류는 ±45° 안이면 더하고 135° 이상 역류면 뺍니다.
- 화면 밖: 하루 한 번 경유점으로 바로 점프.
7. 함대 재편성 (확인됨[대조])
매월(misc.md의 월간 순서) 패배해 비활성인 함대만 채웁니다.
- 배 보충(KO 0x1D0C3·0x1D1B7·0x1D2AC / EN 0x1D455·0x1D549·0x1D63E): 길드 이익 G의 등급 0(<500), 1(500–999), 2(≥1000)마다 3가지 선택지 중 random(3). 보충 한도: 상선·호위는
floor(G / 50) + 5척을 나라 전체가 나눠 쓰고, 원정은floor(G / 75) + 5. 대포는 상선4 + random(3)(컬버린·데미컬버린·세이커), 그 외1 + random(3). - 새 지휘관(KO 0x1D762·0x1D608 / EN 0x1DAF4·0x1D99A): 활동 배가
4 + random(2)척 이상이면 동전 던지기로 기존 인물 또는 새 인물을 지휘관으로. 해적 지휘관은 성향 비트& 3 ≥ 2인 인물만. - 재출항(KO 0x1D556 / EN 0x1D8E8): 수도에서, 금고
floor(G / 10) + 1 + random(3), 대기5 + random(10), 플래그 0x31.
7.1 새 일반 인물 (확인됨[대조], KO 0x1D38B / EN 0x1D71D)
| 항목 | 값 |
|---|---|
| 이름 | NAME.TBL의 그 나라 16개에서 이름·성 각각 random(16), 중복이면 다시 |
| 나이 | 20 + random(16) |
| 8개 능력치 | 각 60 + random(35) |
| 항해·전투 레벨 | min(100, max(8 + random(5), 이전 + 2 + random(4))) |
| 기능 | random(16) → 교섭·회계·포술·측량 각 1/2, 천측(0x10)은 주어지지 않음 (한글판 +0x30) |
| 성향 | random(16) × 16 + 호출자 하위 비트 |
매월 빈 인물 기록은 1/3 확률로 새 인물이 되고(나라 random(6), 항구 random(42)), 실업 인물은 1/3 확률로 random(5) − 2만큼 항구 번호를 옮깁니다(비트 0x40이면 고정). (KO 0x1D8D2 / EN 0x1DC64)
7.2 라이벌 주인공 (확인됨[대조], KO 0x1DA3C·0x1D97B·0x1DADF / EN 0x1DDD0·0x1DD0F·0x1DE71)
- 매월, 현재 주인공이 아닌 주인공 0–5와 인물 60: 항해 레벨이 플레이어보다 낮으면
플레이어 + 1 + random(2)로 올리고, 오른 레벨마다 통솔 +random(3), 항해술·지식·직감 각 +random(5). 전투 레벨이 낮으면random(2) + trunc(차이 / 2) + 1오르고, 레벨마다 통솔 +random(3), 용기·검술 각 +random(5). 상한 100. - 영문판 분석: 인물 60 차례에서는 포인터가 이미 넘어가 있어 레벨은 인물 6의 것이 바뀝니다(버그). 한글판 루틴도 명령 단위로 같으므로 같은 버그가 있을 것으로 봅니다(추정).
- 라이벌 함대는 매월 배 한 척을 얻습니다. 이미 플레이어보다 강하면 1/3 확률로만.
8. 관계(외교) (확인됨[대조] 루틴, 수치는 외부자료)
매월 관계표 갱신(KO 0x1CFD1·0x1CDAD·0x1CEB4 / EN 0x1D363·0x1D13F·0x1D246), 해전 승리 시 상대국과의 관계 하락·개인 우호도 변화(KO 0x15A93 / EN 0x15DE5). 세부 수치는 연구 자료 friendship.md에 있으며 이 문서에서 재검증하지 않았습니다.
확인하지 못한 것
- 추적 포기·반응 분기의 정확한 조건, 매복(목표 3)의 실제 동작.
- 국가 공격성 값(+0x09)과 대상국(+0x02)이 처음에 어떻게 정해지는지.
- 관계·우호도 월간 수치표는 relations.md로 옮겼습니다.