# 자료 파일 형식: 게임 파일 전부와 기록 배치

한글판 `dos/` 폴더의 파일마다 무엇이 들었는지와 기록 배치를 정리했습니다. 표시 방법은 [index.md](index.md)를 따릅니다.
크기는 이 폴더의 한글판 파일 기준입니다. 숫자는 따로 적지 않으면 리틀엔디언입니다.

## 1. 실행 파일과 실행 순서

| 파일 | 크기 | 내용 | 근거 |
| --- | --: | --- | --- |
| `PLAY.BAT` | 35 | `FMDRV.COM`을 올린 뒤 `VOYAGE2.COM` 실행 | **확인됨[직접]** |
| `VOYAGE2.COM` | 895 | 실행기. `FMDRV.COM`, `OPEN.EXE`, `MAIN.EXE`, `END.EXE`를 차례로 부름(PKLITE 압축) | **확인됨[직접]**(문자열) |
| `FMDRV.COM` | 5,162 | FM 음원 드라이버. 게임은 인터럽트 `0x66`으로 부름 | **확인됨[대조]** |
| `OPEN.EXE` | 42,167 | 오프닝. `OPGRAPH.LZW`만 엶 | **확인됨[직접]**(문자열) |
| `MAIN.EXE` | 297,783 | 본편. MZ 헤더 `0x5400`, 코드 세그먼트 `0x0000`·`0x0FB8`·`0x1F74`·`0x2DA1`, 데이터 세그먼트 `0x378B`(파일 `0x3CCB0`), 데이터 이미지 `0xBE87`바이트 | **확인됨[직접]** |
| `END.EXE` | 52,241 | 엔딩. `ENDGRP.DAT`, `END_PUT.DAT`, `EVENT*.DAT`, 글꼴 두 개를 엶 | **확인됨[직접]**(문자열) |
| `GRPDRV.EXE` | 22,063 | 그래픽 드라이버(파일 이름 문자열 없음) | **추정** |
| `KOEI.COM` / `KOEI.DAT` | 776 / 33,792 | 회사 로고 표시와 그 그림으로 보임. 세 EXE 모두 `KOEI.DAT`를 이름으로 부르지 않음 | **추정** |

`MAIN.EXE`는 이 폴더에 없는 `DATA2.LZW`, `EVENT.LZW`, `IKKI.LZW`, `SNRDAT.LZW`, `SNRMES.LZW`, `USERNAME.DAT`, `KOUKAI2.COM`, `MOUSE.COM`이라는 이름도 담고 있습니다. 쓰이는지는 확인하지 않았습니다.

## 2. LS10/LS11 묶음 (`.LZW`)

**확인됨[직접]** (편집기의 해독기로 전부 풀어 봄)

이름과 달리 LZW가 아니라 KOEI의 LZSS 변형입니다.

```text
+0x000  "LS10" 또는 "LS11", 12바이트 0
+0x010  256바이트 글자 표(모든 엔트리 공용)
+0x110  엔트리 색인: (압축 크기 u32 BE, 원래 크기 u32 BE, 파일 오프셋 u32 BE) × n, 압축 크기 0으로 끝
```

| 파일 | 형식 | 엔트리 | 내용 |
| --- | --- | --: | --- |
| `DATA1.LZW` | LS11 | 19 | 아래 표 |
| `KAO.LZW` | LS11 | 256 | 얼굴 64 × 80 (엔트리마다 1,920바이트), 128번부터 48 × 48 발견물·도구 그림. 묶음 뒤 173,376바이트는 무작위 얼굴 부품(압축 안 됨) |
| `PORTMAP.LZW` | LS11 | 101 | 항구 마을 지도 96 × 96칸(9,216바이트). 0~99 = 일반 항구, 100 = 보급항 공용 |
| `PORTCHIP.LZW` | LS11 | 14 | 마을 타일 그림 7벌(30,720바이트)과 4바이트 짝 |
| `WORLDMAP.LZW` | LS11 | 3 | 세계 지도 세 조각(각 720 × 1,080칸) |
| `OPGRAPH.LZW` | LS11 | 14 | 오프닝 그림 |
| `CHAR.LZW` | LS10 | 7 | 5,120바이트 6개 + 15,360바이트(글자·기호 그림으로 보임, **추정**) |
| `IAE1.LZW` | LS10 | 35 | 결투 상대 동작 그림 |
| `IAP1.LZW`~`IAP6.LZW` | LS10 | 35 | 주인공별 결투 동작 그림(주인공 번호 + 1) |

### `DATA1.LZW` 엔트리

| 엔트리 | 크기 | 내용 | 근거 |
| --: | --: | --- | --- |
| 0, 1 | 23,040 | 결투 배경 띠(바다 / 항구) | **확인됨[대조]** |
| 2, 3 | 4,320 | 결투 화면 양끝 그림 | **확인됨[대조]** |
| 4 | 12,288 | NPC 항로 그래프 노드(16바이트 기록) | **확인됨[대조]** |
| 5 | 2 | 쓰이는 노드 수(622) | **확인됨[직접]**(값 `0x026E`) |
| 6, 7, 8 | 3,840 / 9,216 / 28,406 | 미상 | — |
| 9 | 5,568 | 통째로 버퍼에 읽는 표 | **확인됨[대조]** |
| 10 | 512 | 바다 타일 색인 표 | **확인됨[대조]** |
| 11 | 32,768 | 세계 지도 기본 타일 그림 | **확인됨[대조]** |
| 12 | 512 | 미상 | — |
| 13 | 312 | 8086 기계어 조각(`55 8B EC …`로 시작) | **확인됨[직접]**(바이트), 용도 미상 |
| 14 | 16,032 | 함대 정보·해전 아이콘 그림 | **확인됨[대조]** |
| 15 | 32,573 | **새 게임 자료** = 세이브 슬롯 앞부분(아래 4절) | **확인됨[직접]** |
| 16, 17 | 81 | 작위 이름 9개 × 9바이트(16 유럽식, 17 오스만식) | **확인됨[직접]** |
| 18 | 1,024 | 세계 지도 큰 타일(4칸 묶음) 표 | **확인됨[대조]** |

## 3. 그림 파일

| 파일 | 크기 | 구조 | 근거 |
| --- | --: | --- | --- |
| `GRAPH.DAT` | 441,794 | u32 BE 오프셋 표 + 레코드 65개. 레코드 = u16 너비, u16 높이, u16 × 8 표, 그 뒤 압축 평면 자료 | **확인됨[직접]**(개수·크기) |
| `GRAPH2.DAT` | 78,875 | 같은 형식, 2개(144 × 56, 640 × 400) | **확인됨[직접]** |
| `ENDGRP.DAT` | 394,025 | 같은 형식, 엔딩 그림 59개 | **확인됨[직접]** |
| `EVENT0.DAT`~`EVENT6.DAT` | 8,541~62,878 | 같은 형식, 192 × 144 이벤트 그림 1/5/6/5/5/6/4개 | **확인됨[직접]** |
| `HDAT.PUT` | 31,624 | 해전 그림(배 모양 `+0x1A00 + 0x280 × (6 × 세트 + 방향)`, 포탄 등) | **확인됨[대조]** |
| `TRANSIT.DAT` | 19,200 | 48 × 48 4평면 그림. 함대 정보의 선수상은 `0x1980 + 0x480 × 선수상`(0x480 × 11 = 뒤 12,672바이트) | **확인됨[대조]**(크기 계산은 **확인됨[직접]**) |
| `END_PUT.DAT` | 40,864 | 엔딩 화면 조각 그림 | **확인됨[대조]** |
| `ALL_FONT.16P` | 104,340 | 16 × 16 한글·전각 글꼴 | **추정**(이름과 크기) |
| `HANKAKU.FNT` | 1,536 | 8 × 16 반각 글꼴 96자(16바이트 × 96) | **확인됨[직접]**(크기), 용도는 **추정** |

## 4. 세이브 `KOUKAI2.DAT`와 새 게임 자료

### 파일 전체

**확인됨[직접]**

```text
크기 333,551 = 머리 0x97 + 10칸 × 0x823C
머리: 1바이트 + 칸마다 15바이트 (이 폴더의 파일은 머리가 전부 0 = 저장한 칸 없음)
칸 n의 시작 = 0x97 + n × 0x823C
```

- 각 칸의 앞 32,573바이트는 `DATA1.LZW` 15번 엔트리와 바이트 단위로 같습니다(이 폴더의 파일은 열 칸 모두 새 게임 상태). 나머지 767바이트는 새 게임 자료에 없는 실행 중 상태입니다.
- 같은 내용이 `MAIN.EXE` 파일 `0x3D8E0`(= `DS:0x0C30`)에 한 벌 더 있습니다. 실행 중 세이브 한 칸은 `DS:0x0C30`부터 놓이므로 `칸 오프셋 = DS 오프셋 − 0xC30`입니다.
- 영문판은 칸 크기 `0x7CC8`(31,944바이트, 전체 319,591)입니다. 한글판은 항해사 기록이 8바이트 길어 960바이트 늘어난 것을 비롯해 구조체가 커졌습니다.
- 머리 15바이트의 뜻(날짜, 주인공 등)은 영문판 연구에 있으나 한글판에서 확인하지 않았습니다(**외부자료**).

### 칸 안의 배치

위치는 **확인됨[직접]**(`KO 0x36A2E` 기록 그룹 분기표와 코드의 고정 주소). 칸 오프셋 기준입니다.

| 칸 오프셋 | DS | 크기 | 내용 |
| --- | --- | --- | --- |
| `0x0000` | `0x0C30` | 1 | 설정 비트(배경음 `0x04`, 효과음 `0x08`) — **확인됨[대조]** |
| `0x000F` | `0x0C3F` | 1 | 이상기상·쥐(`0x10`)·괴혈병(`0x20`) 상태 |
| `0x00BA`~`0x00BB` | `0x0CEA`~ | 2 | 공통 시나리오 섹션·하위 섹션 — **확인됨[대조]** |
| `0x036E` / `0x0396` | `0x0F9E` / `0x0FC6` | 10개 | 해상 이벤트 위치·종류 |
| `0x04D6` | `0x1106` | 32 × 7 | 국가 기록([relations.md](relations.md)) |
| `0x05B6` | `0x11E6` | 14 × 6 | 주인공 명성·우호도·작위 |
| `0x060A` | `0x123A` | 4 | 소지금(u32) |
| `0x0612` | `0x1242` | 50 × 120 | 항해사(아래) |
| `0x1D82` | `0x29B2` | 21 × 20 | 수집가·지도 제작자(개수 20은 다음 표까지의 간격으로 계산) |
| `0x1F26` | `0x2B56` | 17 × n | 주점 아가씨 |
| `0x2124` | `0x2D54` | — | 이번 항해: 일수(`+0`), 물 배급률(`+1`), 식량 배급률(`+2`) |
| `0x2163` | `0x2D93` | 20 | 도구 소지품(도구 번호) |
| `0x2182` | `0x2DB2` | 133 × 70 | 함대(`+0x2B`부터 배 칸 9바이트 × 10) |
| `0x45E0` | `0x5210` | 30 × n | 배 보급 기록(물·식량은 10분의 1 단위, 목재, 포탄, 짐 5칸) |
| `0x4A36` | `0x5666` | 9 × n | 함대 밖 배 칸 |
| `0x4B9E` | `0x57CE` | 25 × n | 배 개체 |
| `0x51F8` | `0x5E28` | 12 × 25 | 배 종류 능력 |
| `0x5322` | `0x5F52` | 20 × 130 | 항구 표시 기록(이름 `+6`, 좌표 `+2`·`+4`; 기록 그룹 0C는 `+2`부터 가리킴) |
| `0x5D4A` | `0x697A` | 37 × 100 | 항구 메타(경제·공업·투자·지지도·시세·특산·지역·시장; 그룹 0D는 `+2`부터) |
| `0x6BC0` | `0x77F0` | 128 × 13 | 시장 기록 |
| `0x7240` | `0x7E70` | 8 × 3 | 미상(기록 그룹 0F) |
| `0x7258` | `0x7E88` | 7 × 98 | 발견물([landing.md](landing.md)) |
| `0x7514` | `0x8144` | 26 × 100 | 도구([items.md](items.md)) |
| `0x7F3C` | `0x8B6C` | — | 새 게임 자료 끝(+1바이트). 여기서 칸 끝 `0x823C`까지는 실행 중 상태 |

배 개체·주점 아가씨 등 `× n`은 개수를 따로 세지 않았습니다.

### 항해사 기록 (50바이트)

**확인됨[직접]**

| 오프셋 | 내용 |
| --- | --- |
| `+0x00` | 이름 13바이트 |
| `+0x0D` | 성 13바이트 |
| `+0x1A` | 얼굴 u16(위 두 비트 0이면 `KAO.LZW` 고정 초상 번호) |
| `+0x1C`~`+0x23` | 통솔력, 항해술, 지식, 직감, 용기, 검술, 매력, 운 |
| `+0x24` / `+0x25` | 항해 레벨 / 전투 레벨 |
| `+0x26` / `+0x28` | 항해 경험 / 전투 경험(u16) |
| `+0x2A`~`+0x2F` | 나이, 충성도, 함대, 머무는 항구, 직책, 성격 |
| `+0x30` | 기술: `0x01` 교섭, `0x02` 회계, `0x04` 포술, `0x08` 지도 제작, `0x10` 측량 |
| `+0x31` | 하위 4비트 국적(6 = 해적), 상위 비트 등장 조건 |

0~5번이 주인공입니다. 영문판은 42바이트(이름·성이 짧음)이고 능력치가 `+0x14`부터입니다.

## 5. 표 파일

| 파일 | 크기 | 구조 | 근거 |
| --- | --: | --- | --- |
| `COLONY.DAT` | 21,800 | 발견물 100개 × 218바이트: 이름 18, 그림 번호 1(`KAO.LZW` 128+n), 설명 199 | **확인됨[직접]** |
| `ITEM.MES` | 14,500 | 도구 설명 100개 × 124바이트(뒤 2,100바이트는 다른 자료) | **확인됨[직접]**(크기·첫 기록) |
| `NAME.TBL` | 2,496 | 새로 생기는 항해사 이름표: 나라 6 × 16쌍 × (이름 13 + 성 13) | **확인됨[직접]**(2,496 = 6 × 16 × 26) |
| `MENU.DAT` | 2,579 | 메뉴 61개. u16 BE 오프셋 표, 항목은 NUL로 구분(예: 0번 "예금/출금/대출/상환") | **확인됨[직접]** |
| `MESSAGE.DAT` | 45,384 | 공통 대사 1,179개. u16 BE 오프셋 표, CP949, NUL로 끝 | **확인됨[직접]** |
| `SNRn.DAT`, `SNRn.MES` | — | 시나리오 바이트코드와 대사([scenario.md](scenario.md)) | **확인됨[직접]** |
| `ZA_DAT.DAT` | 2,424 | 마을 지도 101개 × 건물 12곳 × (x, y) 바이트. `(0,0)`·`(0xFF,0xFF)`는 없음 | **확인됨[직접]**(2,424 = 101 × 24) |
| `CHIP_NO.DAT` | 100 | 일반 항구 100곳의 마을 타일 세트 번호(0~3) | **확인됨[직접]**(값), 뜻은 **확인됨[대조]** |
| `WINDCUR.DAT` | 1,350 | 세계를 30 × 15 구역(72 × 72칸)으로 나눈 표 3개: 바람(4~9월), 바람(10~3월), 해류(1년). 구역 = `(y/72) × 30 + x/72` | **확인됨[대조]**(1,350 = 3 × 450은 **확인됨[직접]**) |
| `MONSTER.DAT` | 200 | 해상 이벤트 대기열 5바이트 × 40: x u16, y u16, 종류. 30개만 쓰이고 나머지 0 | **확인됨[직접]**(값), 뜻은 **확인됨[대조]** |
| `D2.MML` | 27,866 | 배경음 악보(FM 음원용) | **추정**(이름) |

`MONSTER.DAT`의 처음 다섯 기록(한글판): (1771, 513, 6), (1905, 538, 9), (1953, 684, 5), (714, 484, 6), (1897, 1011, 4).

## 확인하지 못한 것

- `DATA1.LZW` 6·7·8·12·13번 엔트리의 용도.
- 세이브 머리 15바이트, 칸 뒤쪽 767바이트 실행 중 상태의 배치.
- 기록 그룹 0F(8바이트 × 3)의 뜻.
- `KOEI.DAT`, `CHAR.LZW`, 글꼴 파일의 정확한 형식.
