# 기타: 은행, 주점, 여관, 조선소, 아이템, 건물 시간, 월간 처리, 이벤트

주소는 `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](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 등).

1. 허가증 만료(4·10월), 바람 표 교체(4·10월) (KO 0x1C432 부근)
2. 은행 이자 (KO 0x1C70D)
3. 투자 → 경제·산업 반영, 가격률 회복 (KO 0x1C7CC, trade.md)
4. 길드 이익 재계산 (KO 0x1C864 / EN 0x1CBE6)
5. 국가 전략 모드 (KO 0x1CB66, npc.md)
6. 관계표 (KO 0x1CFD1 등)
7. 함대 보충·새 지휘관 (KO 0x1D0C3…0x1D762)
8. 인물 재생성·이동, 라이벌, 급여·충성도 (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](scenario.md)).

## 확인하지 못한 것

- 도박 규칙 세부, 점술집 판정.
- 시나리오(SNR) 이벤트 조건과 보상은 [scenario.md](scenario.md)에 정리했습니다.
- 여관 숙박의 효과(바람 재굴림 외). 교회 기부는 [church.md](church.md)에서 해결했습니다.
- C 런타임이 BSS를 0으로 지우는 과정은 직접 읽지 않았습니다.
