항해
1. 시간 (확인됨[대조], 일과 루프 KO 0x2008F / EN 0x2052F)
- 하루는 72틱, 1틱 = 20분. 바다에서는 매 틱 함대가 한 걸음 움직입니다.
- NPC 함대는 하루 한 번씩 갱신됩니다(틱 t에 함대 t). (npc.md)
- 자정마다 식량·물 소비, 쥐·괴혈병 판정, 지배국 캐시 갱신, 조선소 건조일 감소가 일어납니다. (외부자료, 대조: 자정 루틴 EN 0x1E764)
- 건물 한 곳 방문은
2 + random(3)틱(40/60/80분)이 걸립니다. (misc.md)
2. 바람과 해류
2.1 지역 표 (외부자료 + 확인됨[직접] 일부)
WINDCUR.DAT(1,350바이트) = 여름 바람(4–9월) 450 + 겨울 바람(10–3월) 450 + 해류(연중) 450. 세계 지도 2160×1080 타일을 72×72 타일 지역 30×15개로 나눕니다. 지역 번호 =(y / 72) × 30 + x / 72(확인됨[대조], KO 0x27E0D).- 한 바이트: 비트 0–2 세기(0–7), 비트 3–5 방향(0 북, 1 북동 … 7 북서, 흘러가는 쪽), 비트 6–7 이상기상 표시.
- 3월 말과 9월 말에 바람 표를 바꿉니다(월말 루틴, KO 0x1C432 부근; 대조 시 날짜 메시지 형식만 다름).
2.2 4시간마다 바람 다시 굴리기 (확인됨[대조], KO 0x1EDEC / EN 0x1F282)
틱 0, 12, 24, 36, 48, 60마다 현재 지역의 기본값에서:
세기 = min(7, 기본 세기 + random(2))
방향 = (기본 방향 + (random(3) − 1) × floor(random(5) / 4)) mod 8
방향은 1/15 확률로 왼쪽, 1/15로 오른쪽으로 45° 틀어집니다. 매번 기본값에서 다시 시작하므로 변화가 쌓이지 않습니다. 해류는 변하지 않습니다. 이상기상 중에는 바람이 고정됩니다.
(외부자료) 저장·불러오기 직후나 여관에서 묵은 다음 날에는 자정까지 매 틱 다시 굴립니다.
3. 함대 속도
3.1 한 걸음 (확인됨[대조], KO 0x3626E / EN 0x3723A)
속도 벡터 = 진행 방향 단위 × 함대 속도 S + 해류 방향 단위 × 해류 세기
x, y 누적값이 60에 이르면 한 타일 이동합니다. 즉 속도 S는 하루 1.2 × S 타일(대각선은 두 축 모두). 화면 표시 노트 = floor((S + 1) / 2) (외부자료). 해류는 항상 더해지며 정지(방향 8)일 때만 안 움직입니다. 육지에 막히면 오른쪽 45°, 왼쪽 45° 순으로 다시 시도합니다.
3.2 배 한 척의 속도 (확인됨[직접], KO 0x3602F / EN 0x36FFB)
함대 속도 = 활동 중인 배 가운데 가장 느린 배의 속도, 최소 2. 단 노 젓는 배가 없고 바람이 0이면 0.
모든 나눗셈은 버림입니다.
각 행 = |바람 방향 − 진행 방향| (0–7, 0 = 순풍, 4 = 정면 역풍)
w = 바람 세기 (노 젓는 배는 max(3, 바람 세기))
f = 바람표[각 행 × 8 + 돛 종류] × 동력 × w / 150
f = f × min(100, floor(항해 담당 % × 선원 / 최소 선원)) / 100
적재 계수 = min(150, 180 − floor(100 × 적재량 / 적재 한도))
f = f × 적재 계수 / 100
f = min(30, f + floor(f × 선장 항해 레벨 / 10))
f = min(40, floor(f × 선장 항해술 / 75))
각 행이 3, 4, 5(135° 이상 역풍)이면 f = floor(조타 × f / 100)
- 바람표(
DS:0x0714, 한글판 파일 0x3D3C4; 영문판과 같은 값):
| 각 행 | 각도 | 돛 종류 0–7 |
|---|---|---|
| 0 | 0° | 10, 8, 10, 9, 9, 8, 10, 10 |
| 1 | 45° | 10, 9, 10, 10, 10, 10, 10, 10 |
| 2 | 90° | 8, 9, 10, 10, 10, 10, 10, 10 |
| 3 | 135° | 6, 7, 8, 9, 9, 10, 9, 10 |
| 4 | 180° | 4, 6, 6, 7, 7, 8, 9, 10 |
| 5–7 | 3–1행과 같음 |
- 동력·조타는 그 배의 현재값, 최소 선원·적재 한도·돛 종류는 선박 종류 능력표 값(editor/ships.py의 +5, +6, +9).
- 적재 계수: 짐이 적을수록 빨라져 최대 150%.
−100 × 적재량을 16비트로 계산하므로 적재량이 327을 넘으면 엉뚱한 값(대개 최대 150)이 됩니다. (외부자료의 분석; 한글판도 같은 16비트 연산 구조) - 선장 = 그 배 보급 기록 +0x1B의 인물. 항해 레벨이 10이면 +100%, 항해술 75가 기준(75 미만이면 감속).
- 노 젓는 배(선박 인스턴스 +0x13 비트 0x10이 0; 한글판은 영문 +0x12에서 1바이트 밀림): 경갤리, 플랑드르 갤리온, 베네치아 갈레아스, 라 레알, 철갑선, 아타케부네, 관선. (배 목록은 외부자료)
- 상한: 한 배 40(= 20노트).
예: 돛 종류 5, 동력 75, 조타 90, 최소 선원 10, 적재 한도 120인 배에 선원 30(항해 50%), 짐 60, 선장 항해 레벨 5·항해술 60, 북풍 세기 2: 북쪽으로 12, 동쪽 15, 남쪽 10. (외부자료의 예시)
4. 식량, 물, 건강
4.1 하루 소비 (확인됨[직접], 식량 KO 0x1DE3C / 물 KO 0x1DEEE)
물·식량은 배마다 0.1통 단위(보급 기록 +0x00 물, +0x02 식량). 배급률은 함대 전체 공통(DS:0x2D56 식량, DS:0x2D55 물, 0–100%).
D = 100, 상륙대가 육지에 있으면 200 (DS:0x0F91 & 0x18)
소비 = floor(선원 × 배급률 / D) + 1 (0.1통 단위), 실제 차감은 min(소비, 재고)
예: 선원 10명, 배급 100%이면 floor(10×100/100)+1 = 11, 즉 하루 1.1통입니다.
4.2 건강 (확인됨[직접], 같은 루틴)
배마다 건강(보급 기록 +0x1C, 0–100). 식량 차감 뒤 한 번, 물 차감 뒤 한 번:
t = 100 − floor(선장 통솔력 / 5) − 배급률
t > 0 이면 건강 −= floor(t / 5)
t ≤ 0 이면 건강 −= t / 10 (0 쪽으로 버림, 즉 건강이 오름)
건강 = 0–100으로 자름
건강 < 20 이면 선원 손실 = min(선원, floor((20 − 건강) × 선원 / 100) + 1) (KO 0x1DDFC)
- 건강이 변하지 않는 최저 배급률 =
96 − floor(통솔력 / 5). 통솔력 50이면 86%, 100이면 76%. - 배급률은 함대 공통이므로 통솔력이 가장 낮은 선장의 배가 먼저 아픕니다.
- 건강은 선원 손실 판정에만 쓰입니다. 속도·전투에는 영향이 없습니다. (외부자료: 연구가 모든 참조를 조사한 결론)
- 항구에서 건강을 회복시키는 루틴은 없습니다. 주점에서 새로 뽑은 선원은 건강 60으로 들어와 인원 비례로 평균됩니다. (외부자료, 대조)
4.3 재고가 없는 배 (외부자료, 대조 부분: KO 0x1E008)
자기 재고가 0인 배는 번호가 가장 낮은, 재고가 남은 배에서 가져다 씁니다. 이때 준 배의 건강이 변하고, 준 배의 건강이 20 미만이면 받은 배의 선원이 줄어드는데, 받은 배의 건강이 20을 크게 넘으면 부호 처리 버그로 받은 배의 선원 전원이 사라질 수 있습니다(연구 자료의 분석).
4.4 전부 떨어졌을 때 (확인됨[직접], KO 0x1DF9E)
함대 어디에도 그 자원이 없으면 배마다 건강 −min(16, 건강), 그 뒤 20 미만이면 위 선원 손실. 모든 배의 선원이 0이 되면 게임 오버(메시지 442/577, 외부자료).
4.5 출항 조건 (확인됨[대조], KO 0x2C576 / EN 0x2D593)
항해 가능 일수 = min(전체 물, 전체 식량) / max(전체 선원, 1) (0.1통 단위, 16비트 합)
0이면 출항 불가(메시지 59), 1–9일·10–180일·180일 초과에 따라 다른 확인 대사. 항해 담당 선원이 0인 배가 있으면 출항 불가(57). 배급률은 이 계산에 안 들어갑니다.
5. 쥐와 괴혈병 (확인됨[직접], KO 0x1E13C, 0x1E1BE, 0x1E220, 0x1E284)
자정에 식량·물 다음에 판정합니다. 항구에 들어가면 둘 다 낫습니다(외부자료).
- 쥐: 항해 31일째 이후, 소지품에 고양이가 없을 때,
random(floor(주인공 항해 레벨 / 5) + 2) = 0이고random(105) > 주인공 운이면 발생(메시지 473). 이후 매일 배마다 식량 1통(10) 손실. 쥐약으로 제거(확인됨[대조], items.md). - 괴혈병: 항해 61일째 이후,
random(105) > 주인공 운이면 발생(474). 배급·건강과 무관. 이후 매일 배마다
선원 손실 = min(선원, floor((100 − 선장 지식) / 5) + random(2))
라임 주스로 치료(외부자료). 항해 일수는 1바이트(DS:0x2D54)라 255일 뒤 0으로 돌아갑니다.
- 운 100이면 매일 발생 확률 4/105, 운 0이면 104/105(일수 조건 충족 시).
6. 이상기상 (폭풍·무풍·안개)
6.1 발생 판정 (확인됨[대조], KO 0x1E874 / EN 0x1ECD8)
바람 바이트 비트 7이 있는 지역에서만 생깁니다. 종류는 해류 바이트 비트 6–7(1 폭풍, 2 무풍, 3 안개). 이상기상이 없을 때 4시간마다:
- L = 주인공, 부선장(직책 3), 수석항해사(직책 5) 중 최고 운.
L + 50 ≥ random(155)이면 끝. - F = 활동 중인 배 선수상 값의 평균(0 없음, 1 해마 … 10 여신).
random(11) ≤ F이면 끝(평균 10이면 완전 면역). - 실종선 지역이면 실종선 판정(6.4).
- 종류 판정(바람 세기 S):
| 종류 | 시작 조건 | 확률 |
|---|---|---|
| 폭풍 | random(7) + 3 ≥ S, 진정제(Balm) 효과 없음 | S ≤ 3이면 1, 이후 (10 − S)/7 |
| 무풍 | random(6) ≥ S | (6 − S)/6 |
| 안개 | random(10) = 0 그리고 random(6) ≥ S | (6 − S)/60 |
경고: 부선장·수석항해사 중 직감 높은 사람이 random(100) ≤ 직감이면 미리 알립니다(KO 0x1E777).
6.2 폭풍 피해 (확인됨[대조], KO 0x1E9AC / EN 0x1EE10; 상수 5, 3, 100, 10, 2 확인)
4시간마다 배마다(상륙대가 육지에 있으면 없음):
n = (100 − 선장 항해술) / (floor(선장 항해 레벨 / 5) + 3) + 1
D = min(10, n) + random(2)
선박 인스턴스 비트 0x40이 없는 배(한자 코그, 버스, 탈레트, 경갤리, 플랑드르 갤리온, 베네치아 갈레아스, 아타케부네, 관선)는 D × 5
내구 −= D, 조타·동력 −= D / 2, 최대 내구 = max(종류 내구 / 4, 최대 내구 − 1)
내구 0이면 침몰(358). 일반 선장은 배와 함께 사라지고, 이름 있는 선장은 구조돼 대기 항해사가 됩니다(809). 기함이 가라앉으면 게임 오버. 폭풍 중 바람은 세기 7, random(8) = 0이거나 지역을 벗어나면 끝납니다.
6.3 무풍·안개 (확인됨[대조], KO 0x1EC5F)
- 무풍: 바람 0(노 젓는 배만 움직임).
random(20) = 0이고 지역 기본 바람이 0이 아니면 끝. 지역을 벗어나도 계속됩니다. - 안개: 바람 고정, 다른 함대가 안 보이고 원거리 망보기 판정이 꺼집니다.
random(30) = 0이거나 지역을 벗어나면 끝. - 평균 지속: 폭풍 약 32시간, 무풍 약 80시간, 안개 약 5일(지역을 빠져나가면 짧아짐). (계산)
- 진정제(Balm): 진행 중인 폭풍을 끝내고
10 + random(6)일 동안 새 폭풍을 막습니다. (외부자료)
6.4 실종선 (확인됨[대조], KO 0x1E66E / EN 0x1EAD2)
지역 206(서대서양)과 223(서태평양). 주인공이 선장이 아닌 배를 순서대로 보며 random(100) > 선장 운이고 선장이 일반 항해사(얼굴 비트 6–7)면 그 배가 사라지고 판정을 멈춥니다(한 번에 최대 1척). 이름 있는 항해사의 배는 사라지지 않습니다.
7. 해상 이벤트 (확인됨[대조], KO 0x35B0D·0x359DE / EN 0x36AD9·0x369A3)
지도 위 40개 고정 타일 중 10개가 활성(세이브 슬롯 0x36E 위치, 0x396 종류). 함대가 정확히 그 타일에 서면 발동하고 MONSTER.DAT(5바이트 × 30: x, y, 종류)의 다음 기록으로 바뀝니다.
| 종류 | 이벤트 | 효과 (외부자료, 루틴 대조) |
|---|---|---|
| 0 | 세이렌 | 모든 배 선원 1/4 손실 |
| 1 | 크라켄 | 주인공과 모든 항해사 용기 최대 −10 |
| 2 | 사라지는 배 | 주인공이 지휘하지 않는 마지막 배가 이탈(선장은 대기 항해사로) |
| 3 | 만타 | 효과 없음 |
| 4 | 세인트 엘모의 불 | 모든 배 건강 최대 +10 |
| 5 | 불사조 | 마지막 배 동력 절반 |
| 6 | 회오리 | 모든 배의 교역품 전부 소실(물·식량·목재·포탄은 남음) |
| 7 | 용 | 모든 배 건강 최대 −10 (이 종류를 쓰는 타일 없음) |
| 8 | 고래 | 마지막 배 현재 내구 절반 |
| 9 | 유령선 | 주인공 운 최대 −30 |
메시지는 MESSAGE.DAT 510 + 2 × 종류와 그 다음 번호.
8. 항구·마을 발견 (확인됨[대조], KO 0x35B0D / EN 0x36AD9)
매 틱(바다):
- 아직 모르는 항구가 체비셰프 거리 2 이내면 바로 발견.
- 아니면 망보기 범위 안의 후보에 대해
random(200) < 최고 직감(주인공과 항해사 중)이면 발견. 한 틱에 판정은 한 번뿐(번호가 가장 낮은 후보). - 망보기 범위 =
min(12, floor(최고 망보기 % × 선원 / 100)), 망원경이 있으면 ×2, 최소 2. (외부자료, 대조: KO 0x0D558) - 모험 명성: 정규 항구 25 × 지역번호(유럽 0 … 극동 175), 보급항·마을 50. (character.md)
확인하지 못한 것
- 자정 루틴 전체(EN 0x1E764)는 한글판에서 자동 대응이 실패해 순서를 직접 확인하지 못했습니다(개별 하위 루틴은 확인).
- 상륙·마을 탐색·약탈·물 찾기는 landing.md, 도구 효과와 보물 지도는 items.md로 옮겨 확인했습니다.
- 표시 노트 환산.