# 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 이상일 때:
  1. `floor(금고 / 2) × 100` 금을 산업 > 경제이면 시장 투자에, 아니면 조선소 투자에 넣습니다(50,000 상한, 차면 다른 쪽).
  2. 금고를 반으로.
  3. 그 나라 지지도 += `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 확인)

화면 없이 처리됩니다.

1. 낮(틱 18–53, 06:00–18:00)에만.
2. 화면 밖이면 `random(150) < 표적 선장 항해술`일 때 표적이 도망.
3. 목표 7이 아니면 공격 측은 교전 후 귀항(한 출항에 한 번).
4. 서로 `floor(전력 / 10)`의 내구 피해를 마지막 칸 배부터 줍니다.
5. 침몰 한 척마다 짐의 1/5(최대 1,000)과 금고의 1/5(최대 60,000)을 빼앗습니다.
6. 공격국 → 표적국 관계 −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](relations.md)로 옮겼습니다.
