기타: 은행, 주점, 여관, 조선소, 아이템, 건물 시간, 월간 처리, 이벤트
주소는 KO 한글판 파일 오프셋 / EN 영문판 파일 오프셋. 조선소 가격·투자 공식은 trade.md에 있습니다.
1. 은행 (확인됨[대조], KO 0x2DDCF·0x2DB54 / EN 0x2EE8F·0x2EBF2; 이자 KO 0x1C70D / EN 0x1CA8F, 상수 3·10 확인)
- 잔고 B(금 단위, 부호 있음). 음수면 빚.
- 매월 이자:
이율 = 3 (B ≥ 0, 예금)
이율 = 10 (B < 0, 빚)
B = B + trunc(B × 이율 / 100) (0 쪽으로 버림)
B = clamp(B, −1,000,000, 1,000,000)
- 대출 한도 =
10,000 × 작위² + 잔고 + 1,000. (외부자료) - 예금 3%는 복리로 쌓이며 상한 1,000,000에서 멈춥니다. 빚 10%는 매월 커집니다.
2. 주점 (외부자료, 루틴 대조)
2.1 선원 모집
모집 가능 = min(floor(E × P / 500), (R + 1) × E)
1인 가격 = floor(P / 20) + 5
최대 구매 = min(모집 가능, 함대 빈 선원 자리, floor(소지금 / 1인 가격))
새 건강 = floor((기존 선원 × 건강 + (새 선원 − 기존 선원) × 60) / 새 선원)
E = 이번 방문의 주점 의욕(입장 시 floor(주인공 매력 / 3), KO 0x2C3FC / EN 0x2D417), P = 항구 경제(메타 +0x02), R = 주인공 작위. 모집 선원은 건강 60으로 섞입니다.
2.2 접대와 아가씨
접대 세기 = floor(B × 200 / P) B = 산 술병 수(최대 50), P = 항구 경제
의욕 증가 = floor(접대 세기 × 주인공 매력 / 10)
새 의욕 = min(100, 이전 + 증가)
같은 접대로 손님 항해사의 충성도 +6 × P × M(character.md 4.1; KO 0x2B1A7 / EN 0x2C1F1).
2.3 항해사 고용 (확인됨[대조], KO 0x2B53C / EN 0x2C58B)
A = 후보의 통솔~매력 중 최고값, i = 그 능력치 번호
후보 점수 = (후보 항해 레벨 + 후보 전투 레벨) × A
주인공 점수 = (주인공 항해 레벨 + 주인공 전투 레벨) × 주인공 능력치 i
문턱 = 주인공 점수 + floor(주인공 점수 × 작위 / 10)
고용 제안 조건: random(20) + 후보 점수 < 문턱
월급 = 10 × min(20, floor(후보 점수 / 400) + random(3) + 1) (금)
- 확률 =
clamp(문턱 − 후보 점수, 0, 20) / 20. 작위마다 주인공 점수 +10%. - 주점 고용은 후보 충성도 > 30 필요, 고용 시 충성도 +10(KO 0x2B3BF / EN 0x2C40E).
2.4 도박
연구 자료의 시뮬레이션: 주사위 기대 수익 약 −0.3%, 블랙잭 기본 전략 약 −16%(첫 카드가 에이스면 +41%). (외부자료, 직접 검증 안 함)
2.5 교회·모스크 (확인됨[직접], KO 0x3184E / EN 0x32AF0)
기부 문턱은 floor(소지금 / 기부액) ≤ 10(기부액이 소지금의 1/11 초과), 운 증가는 11 − floor(소지금 / 기부액)(1~10, 상한 100), 기부액이 (random(5)+1) × 100 이상일 때만 오릅니다. 기도는 방문마다 첫 번만 운 +random(2). 자세한 표와 운이 쓰이는 곳은 church.md에 있습니다.
3. 조선소 (확인됨[대조])
- 수리:
수리 단위 = 최대 내구 − 현재 내구 − 현재 조타 − 현재 동력 + 기본 조타 + 기본 동력, 비용20 × 수리 단위. (외부자료) - 재료(KO 0x308D1 / EN 0x31AF1): 가격 배율 ×0.8–1.3 구간을
(조선소 지수 + 8) / 10으로 고르며 상한 100(세부는 trade.md 조선소 지수). 참나무는 산업 700, 구리는 900부터. (외부자료 + 대조) - 건조 일수(KO 0x30AAC / EN 0x31CD2):
일수 = (100 − floor(산업 / 50)) × 기본 일수 / 100
- 판매(KO 0x2FA01 / EN 0x30B86): 최저 제시가 =
견적 × (500 − 매력) / 500, 회계 담당 추천(95 + r) / 100(회계 기능이면 r = 5, 아니면 random(10)). (확인됨[직접], trade.md) - 중고 보상: 판매가의 1/2이 구매 가능 금에 더해집니다. (코드 사실은 확인됨[직접], 게임상 의미는 추정)
4. 아이템 가게 (확인됨[대조], 구매 KO 0x2E8A2 / EN 0x2F9CC, 판매 KO 0x2E9F7 / EN 0x2FB03)
- 낮 영업: 항구 메타 +0x1F..+0x21의 아이템 3개. 새벽 2:00–3:00: 비밀 아이템(+0x22)만.
- 소지품 20칸. 종류 하위 니블 < 7인 아이템은 하나만 가질 수 있습니다.
- 판매 흥정: 첫 제시가를 거절하면
(min(운, 99) + 1) / 100확률로 다시 제시, 그 값은첫 제시가 + floor(첫 제시가 × 매력 / 200). (공식은 외부자료, 한글판 루틴은 메시지 출력 부분만 다르고 계산 부분은 일치) - 면세 허가증(왕궁, KO 0x2F146 / EN 0x302B3): 가격
10,000 × 단위. 자기 나라: 작위 < 6이면7 − 작위, 6 이상이면 0(무료). 외국 수도:11 − 작위. 4월·10월에 갱신(만료). (외부자료 + 대조)
5. 건물 영업 시간 (확인됨[대조], KO 0x2048E / EN 0x20930)
틱 = 20분, 0 = 자정.
| 건물 | 영업 |
|---|---|
| 시장, 조선소, 왕궁, 길드, 은행 | 4:00–20:00 (틱 12–59) |
| 주점 | 0:00–4:00, 8:00–24:00 (틱 < 12 또는 ≥ 24) |
| 항구, 여관, 특수 NPC 거처 | 항상 |
| 아이템 가게 | 2:00–3:00, 8:00–20:00 |
| 교회·모스크 | 4:00 이후 |
| 점술집 | 16:00 이후 |
판정식은 코드의 비교값을 그대로 시간으로 바꾼 것이며, 게임 안에서 직접 확인하지는 않았습니다.
건물 한 곳 방문에 2 + random(3)틱이 지납니다(40–80분). (외부자료)
6. 월간 처리 순서 (확인됨[대조] 각 단계, 순서는 외부자료)
매월 1일에 다음 순서로 실행됩니다(월간 묶음 KO 0x1D7DA / EN 0x1DB6C 등).
- 허가증 만료(4·10월), 바람 표 교체(4·10월) (KO 0x1C432 부근)
- 은행 이자 (KO 0x1C70D)
- 투자 → 경제·산업 반영, 가격률 회복 (KO 0x1C7CC, trade.md)
- 길드 이익 재계산 (KO 0x1C864 / EN 0x1CBE6)
- 국가 전략 모드 (KO 0x1CB66, npc.md)
- 관계표 (KO 0x1CFD1 등)
- 함대 보충·새 지휘관 (KO 0x1D0C3…0x1D762)
- 인물 재생성·이동, 라이벌, 급여·충성도 (KO 0x1D8D2, 0x1DA3C, 0x1DC64)
연말(12월 다음)에 나이 +1 (KO 0x1AE79).
7. 이벤트
- 해상 이벤트(괴물 등): navigation.md 7.
- 이상기상·실종선: navigation.md 6.
- 시나리오 이벤트: 주인공별 SNR*.DAT 바이트코드로 처리됩니다. 이번 작업에서는 해석하지 않았습니다(연구 자료 game-details/scenarios 참조).
- 길드 의뢰 보상·기한: character.md 3.
8. 난수 (확인됨[직접], KO 0:4D86)
seed = seed × 0x41C64E6D + 0x3039 (mod 2³², seed는 DS:0xC138)
random(n) = ((seed >> 16) & 0x7FFF) mod n
영문판과 같은 선형 합동 생성기입니다. random(0)은 0입니다.
시드(확인됨[직접]): DS:0xC138은 데이터 이미지(0xBE87바이트) 밖의 BSS 영역이라 프로그램 시작 때 0이고, 세이브에도 들어가지 않습니다. 시드를 정하는 함수 0:4D7C(KO 0xA17C, seed = ax)는 있지만 한글판 코드 어디에서도 부르지 않습니다(전체 코드에서 [0xC138]에 쓰는 곳은 이 두 함수뿐). 그래서 난수열은 매번 0에서 시작하고, 결과가 달라지는 것은 플레이어 입력에 따라 난수를 부르는 횟수가 달라지기 때문입니다. 실행 중 BSS를 0으로 지우는지는 C 런타임 시작 코드를 따로 읽지 않았으나, 영문판 연구도 0으로 시작한다고 봅니다(외부자료).
시나리오 바이트코드는 이와 별개인 난수를 씁니다(scenario.md).
확인하지 못한 것
- 도박 규칙 세부, 점술집 판정.
- 시나리오(SNR) 이벤트 조건과 보상은 scenario.md에 정리했습니다.
- 여관 숙박의 효과(바람 재굴림 외). 교회 기부는 church.md에서 해결했습니다.
- C 런타임이 BSS를 0으로 지우는 과정은 직접 읽지 않았습니다.