# 국가 관계와 우호도: 저장 위치, 처음 값, 월간 변화, 해전 결과, 추방

나라끼리의 관계(외교)와 주인공에 대한 각 나라의 우호도입니다. 표시 방법은 [index.md](index.md)를 따릅니다.
나라 번호: 0 포르투갈, 1 에스파냐, 2 오스만 투르크, 3 잉글랜드, 4 이탈리아, 5 네덜란드, 6 해적.

## 1. 저장 위치

**확인됨[직접]** (기록 그룹 00·01, `KO 0x36A2E`)

| 자료 | 위치 | 크기 |
| --- | --- | --- |
| 국가 기록 7개 | 세이브 슬롯 `0x04D6` (`DS:0x1106`) | 32바이트 |
| 주인공 명성·우호도 6명 | 세이브 슬롯 `0x05B6` (`DS:0x11E6`) | 14바이트 |

국가 기록(32바이트). 필드 뜻은 **확인됨[대조]**, 처음 값은 **확인됨[직접]**(`DATA1.LZW` 15번 엔트리를 직접 읽음):

| 오프셋 | 내용 |
| --- | --- |
| `+0x00` | 길드 이익(u16) |
| `+0x02` | 노리는 나라(7 = 플레이어) |
| `+0x03` | 전략 모드 |
| `+0x04` | 상선대 목적 항구(`0xFF` 없음) |
| `+0x05`~`+0x08` | 왕실 원조(금 천 단위, 미사용, 배 종류, 배 수) |
| `+0x09` | 공격성 |
| `+0x0A` | 수도 |
| `+0x0B`~`+0x11` | 다른 나라 7곳에 대한 관계(저장값 − 30 = 표시값) |
| `+0x12`~`+0x18` | 상태: 동맹 `0x20`, 봉쇄 `0x10`, 하위 4비트는 월간 값 |

주인공 기록(14바이트, **확인됨[직접]**):

| 오프셋 | 내용 |
| --- | --- |
| `+0x00` | 교역 명성(u16) |
| `+0x02` | 해적 명성(u16) |
| `+0x04` | 모험 명성(u16) |
| `+0x06`~`+0x0C` | 나라 7곳의 우호도(저장값 − 100 = 표시값) |
| `+0x0D` | 작위(0 없음 ~ 9) |

명성 세 위치는 시나리오가 읽는 필드로, 작위는 점술가 코드가 읽는 필드로 직접 확인했습니다([scenario.md](scenario.md)). 우호도의 −100 치우침은 **확인됨[대조]**입니다.

## 2. 처음 값 (새 게임 자료)

**확인됨[직접]** (`DATA1.LZW` 15번 엔트리 `0x04D6`부터)

| 나라 | 공격성 | 수도(항구 번호) | 노리는 나라 | 전략 모드 | 상선대 목적 항구 |
| --- | --: | --- | --: | --: | --: |
| 포르투갈 | 60 | 0 리스본 | 2 | 0 | 17 |
| 에스파냐 | 70 | 1 세빌리아 | 6 | 1 | 3 |
| 오스만 | 80 | 2 이스탄불 | 4 | 2 | 61 |
| 잉글랜드 | 90 | 29 런던 | 1 | 5 | 52 |
| 이탈리아 | 50 | 8 제노바 | 2 | 0 | 27 |
| 네덜란드 | 85 | 33 암스테르담 | 0 | 5 | 59 |
| 해적 | 100 | 4 | 1 | 8 | 없음 |

표시 관계(행이 상대를 보는 값):

| 에서 / 에게 | 포 | 에 | 오 | 잉 | 이 | 네 | 해 |
| --- | --: | --: | --: | --: | --: | --: | --: |
| 포르투갈 | 70 | 55 동맹 | 0 | 20 | 40 | 20 | 10 |
| 에스파냐 | 55 동맹 | 70 | 5 | 15 | 35 | 20 | −10 |
| 오스만 | 0 | 5 | 70 | 25 | −5 봉쇄 | 20 | 40 |
| 잉글랜드 | 20 | 15 | 25 | 70 | 20 | 30 | 30 |
| 이탈리아 | 40 | 35 | −5 봉쇄 | 20 | 70 | 20 | 0 |
| 네덜란드 | 20 | 20 | 20 | 30 | 20 | 70 | 30 |
| 해적 | 10 | −10 | 40 | 30 | 0 | 30 | 70 |

새 게임 자료에서 길드 이익과 주인공 기록(명성, 우호도, 작위)은 모두 0입니다. 게임 시작 때 다른 값으로 채우는지는 확인하지 않았습니다.

## 3. 월간 변화

**확인됨[대조]** (`KO 0x1CFD1` 월간 반복, `KO 0x1CDAD` 값 계산, `KO 0x1CF46` 실행, `KO 0x1CEB4` 항구 빼앗기; 영문판 `EN 0x1D363`/`0x1D13F`/`0x1D2D8`/`0x1D246`과 명령어 차이 0~9, 상수 차이 없음)

매달 여섯 나라의 모든 순서쌍(i가 j를 봄)에 대해 i의 j에 대한 상태 바이트 하위 4비트에 값을 쓰고, 그 값에 따라 행동합니다.

값 표는 **확인됨[직접]** (`DS:0xAC74` = 파일 `0x47924`, 36바이트; 첨자 = 관계 구간 × 12 + 이익 비교 × 3 + 상태):

```text
관계 구간 = floor((저장 관계 + 9) / 40)      0: 저장 0~30, 1: 31~70, 2: 71~110
이익 비교 0: i 이익/2 > j 이익   1: j 이익/2 > i 이익   2: i > j   3: 그 밖(j ≥ i)
상태     0: 동맹   1: 봉쇄   2: 둘 다 아님
```

| 관계 구간 | 이익 비교 | 동맹 | 봉쇄 | 둘 다 아님 |
| --- | --- | --: | --: | --: |
| 0 | i가 j의 두 배 넘음 | 0 | 3 | 0 |
| 0 | j가 i의 두 배 넘음 | 1 | 3 | 5 |
| 0 | i가 더 큼 | 0 | 3 | 1 |
| 0 | j가 같거나 큼 | 1 | 3 | 5 |
| 1 | i가 j의 두 배 넘음 | 6 | 4 | 규칙 9 |
| 1 | j가 i의 두 배 넘음 | 1 | 3 | 규칙 10 |
| 1 | i가 더 큼 | 6 | 규칙 7 | 규칙 9 |
| 1 | j가 같거나 큼 | 0 | 3 | 규칙 10 |
| 2 | i가 j의 두 배 넘음 | 6 | 4 | 2 |
| 2 | j가 i의 두 배 넘음 | 6 | 3 | 1 |
| 2 | i가 더 큼 | 6 | 규칙 7 | 규칙 8 |
| 2 | j가 같거나 큼 | 6 | 규칙 7 | 규칙 8 |

규칙(**확인됨[직접]**, `KO 0x1CE5D`~`0x1CEA1`; R = 저장 관계):

- 규칙 7: `random(100) < R`이면 3, 아니면 0.
- 규칙 8: `random(100) > R`이면 2, 아니면 0.
- 규칙 9: `30 + random(20) > R`이면 2, 아니면 0.
- 규칙 10: `30 + random(10) > R`이면 2, 아니면 0.

값에 따른 행동(**확인됨[대조]**, 상태 바이트 전체로 비교하므로 동맹·봉쇄 비트가 없는 쌍만 해당):

- **1**: j가 i를 보는 관계가 `3 + random(5)` 오르고, i의 값도 같은 값으로 맞춥니다. 상한이 없습니다. 이것이 플레이어 없이 관계가 오르는 유일한 길입니다.
- **4**: i가 j의 항구를 빼앗는 처리지만, 4는 봉쇄 칸에서만 나오므로 실제로는 일어나지 않습니다.
- 0, 2, 3, 5, 6은 다른 곳에서 읽지 않습니다.

## 4. 관계가 바뀌는 다른 경우

**확인됨[대조]**

| 원인 | 변화 |
| --- | --- |
| 왕명: 문서 전달 | 두 방향 +5, 저장 100 상한 |
| 왕명: 조약 교섭 | 두 방향 +10, 저장 100 상한 |
| 플레이어가 해전에서 이김(결과 코드가 짝수) | 내 나라→상대 `random(5) + 3`(3~7) 감소, 0 하한, 반대 방향도 같은 값으로 |
| 컴퓨터 함대끼리 싸움 | −2 또는 −3([npc.md](npc.md)) |

## 5. 해전 승리 뒤 우호도

**확인됨[대조]** (`KO 0x15A93`, 영문판 `EN 0x15DE5`와 명령어 차이 0; 등급 고르기 `KO 0x14F8D`, 영문판 `EN 0x15240`과 2개 차이, 소지품 주소만 다름)

결과 코드가 짝수(적 기함 도주 2, 승리 4·6, 시나리오 취소 8)일 때만 적용됩니다. 밤이 되거나 도주·항복이면 적용하지 않습니다.

외교 등급(처음 0). 내 나라의 사략허가서(도구 `0x1D + 나라`)를 가지고 있으면 1로 시작하고, 그때만 아래 검사를 차례로 덮어씁니다.

```text
저장 관계 ≤ 40                    → 2
상대→나 상태에 봉쇄 비트           → 3
내 나라 기록 +2(노리는 나라) = 상대 → 4
저장 관계 ≥ 60                    → 5
나→상대 상태에 동맹 비트           → 6
```

| 등급 | 모국 배수 | 상대 배율 |
| --: | --: | --: |
| 0, 1 | +1 | 30 |
| 2 | +2 | 10 |
| 3 | +3 | 6 |
| 4 | +4 | 3 |
| 5 | −1 | 90 |
| 6 | −1 | 60 |

```text
모국 우호도 변화 = 모국 배수 × (5~9 사이 무작위)
상대 우호도 감소 = floor(상대 배율 × (10~14 사이 무작위) / 30)
```

우호도 저장값은 0~200(표시 −100~+100)으로 묶입니다.

### 같은 나라 배를 친 경우와 추방

**확인됨[대조]**

- 상대가 내 나라이면 위 감소에 더해 `10~14`를 더 빼고, 모국 증가는 없습니다. 관계도 3~7 내려갑니다.
- 그 뒤 모국 우호도 저장값이 40 이하(표시 −60 이하)이면 **추방**: 작위를 잃고 소속이 해적이 됩니다(공통 대사 568).
- 41~70(표시 −59~−30)이고 작위가 있으면 **작위 박탈**: 소속은 유지(569).
- 둘 다 작위를 0으로, 공통 시나리오를 섹션 0으로 되돌리고 플래그 16~18을 지워 진행 중인 왕명·길드 의뢰를 취소합니다(`KO 0x15CD0`, 영문판 `EN 0x16020`). 명성은 줄지 않습니다.

## 확인하지 못한 것

- 우호도·명성의 게임 시작 때 초기화 코드.
- 길드 정보(국가가 노리는 나라를 매달 다시 고르는 공식)는 영문판 연구에 있으나 한글판 루틴을 따로 맞추지 않았습니다(**외부자료**): 나라 n은 `floor(나라 m의 길드 이익 × n의 m에 대한 관계 / 100)`가 가장 작은 m을 고르고, `100 + random(180 − 공격성) < |200 − 플레이어 우호도|`이고 플레이어가 n 소속이 아니면 플레이어(7)를 노립니다.
- 투자에 따른 항구 지지도 변화는 [trade.md](trade.md)에 있습니다.
