# 교역과 시세

시장(교역소)의 가격은 **기준가 × 시세 지수**로 정해집니다. 시장에 재고 수량은 없고, 거래와 시간에 따라 움직이는 것은 항구마다 저장된 10개 분류의 시세 지수뿐입니다.

## 1. 데이터 구조

### 1.1 교역품과 분류 (확인됨[직접])

교역품 46종은 10개 분류로 나뉩니다. 분류 판정 함수(KO 0x291C2)는 `DS:0x07C0`의 경계표 `6,10,17,21,26,31,33,36,40,46`에서 "품목 번호 < 경계"인 첫 칸을 분류로 씁니다.

| 분류 | 품목 번호 | 품목 |
| --- | --- | --- |
| 0 향신료 | 0–5 | 정향, 계피, 후추, 육두구, 피망, 생강 |
| 1 기호품 | 6–9 | 담배, 차, 커피, 카카오 |
| 2 식품 | 10–16 | 설탕, 유제품, 어육, 곡류, 올리브유, 와인, 돌소금 |
| 3 섬유 | 17–20 | 생사, 무명, 양모, 마 |
| 4 직물 | 21–25 | 면직물, 견직물, 모직물, 벨벳, 삼베 |
| 5 보석 | 26–30 | 산호, 호박, 상아, 진주, 구갑 |
| 6 귀금속 | 31–32 | 금, 은 |
| 7 광석 | 33–35 | 동, 주석, 철광석 |
| 8 사치품 | 36–39 | 미술품, 융단, 사향, 향수 |
| 9 기타 | 40–45 | 유리구슬, 염료, 도자기, 유리그릇, 무기, 목재 |

품목 이름은 `MAIN.EXE` 파일 249074부터 빈 문자로 이어져 있습니다(editor/ports.py와 같음).

### 1.2 항구 메타 기록 (37바이트, 정규 항구 100곳) (확인됨[직접])

세이브 슬롯 0x5D4A + 항구번호 × 37 (`DATA1.LZW` 15번 같은 오프셋). 코드는 `DS:0xC6E2`에 이 기록의 `+2` 주소를 넣고 씁니다.

| 오프셋 | 크기 | 내용 |
| --- | --- | --- |
| +0x02 | u16 | 경제(0–1000) |
| +0x04 | u16 | 시장 투자 누적액(이달) |
| +0x06 | u16 | 공업(0–1000) |
| +0x08 | u16 | 조선소 투자 누적액(이달) |
| +0x0A..+0x0F | 6바이트 | 국가별 지지도(포르투갈·에스파냐·터키·영국·이탈리아·네덜란드), 0–100 |
| +0x10..+0x19 | 10바이트 | 분류별 **시세 지수 R**(0–100 저장, 실제 배율은 R+50 %) |
| +0x1A | u16 | 특산품 기준가 |
| +0x1C | u8 | 특산품 품목(0xFF 없음) |
| +0x1D | u8 | 특산품이 나오는 최소 경제 ÷ 10 |
| +0x1E | u8 | 지역(0 유럽 … 7 극동) |
| +0x1F..+0x21 | 3바이트 | 도구점 상품 |
| +0x22 | u8 | 도구점 비밀 상품 |
| +0x23 | u8 | 시장 번호(0–12) |
| +0x24 | u8 | 주점 술 종류 |
| +0x25 | u8 | 조선소 건조 남은 날(0xFF 주문 없음) (외부자료, 대조 미완) |

### 1.3 시장 기록 (13개 × 128바이트) (확인됨[직접])

세이브 슬롯 0x6BC0 + 시장번호 × 0x80. 코드는 `DS:0xC678` 포인터로 읽습니다.

| 오프셋 | 내용 |
| --- | --- |
| +0x00..+0x5B | 품목별 **매각 기준가** u16 × 46 (그 시장이 사 주는 값) |
| +0x5C..+0x6D | 매입 칸 9개의 **매입 기준가** u16 |
| +0x6E..+0x76 | 매입 칸 9개의 품목 번호(0xFF 빈 칸) |
| +0x77..+0x7F | 매입 칸별 최소 경제 ÷ 10 |

## 2. 가격 공식

### 2.1 사는 값 (확인됨[직접], KO 0x29211 / EN 0x29EE3)

```
R   = 그 품목 분류의 저장 시세 지수 (항구 메타 +0x10+분류)
B   = 매입 칸의 매입 기준가 (특산품이면 메타 +0x1A)
보통값 = floor((R + 50) × B / 100)
사는 값 = floor(보통값 × 12 / 10)      … 면세증 없음 (20% 할증)
       = floor(보통값 × 10 / 10)      … 그 항구 지배국의 면세증 소지
```

- 면세증 판정(KO 0x291E5): 항구 표시 기록 `+0x13`의 아래 3비트(캐시된 지배국)를 읽어, 6(지배국 없음)이면 할증이 항상 붙습니다. 0–5면 소지품 20칸(`DS:0x2D93`)에서 도구 번호 `0x23 + 국가`(포르투갈 면세증 … 네덜란드 면세증)를 찾습니다. (확인됨[직접])
- 지지도 값이 아니라 **캐시된 지배국**을 씁니다. 캐시는 매일 자정 갱신됩니다(4.3절).

### 2.2 매입 목록에 나오는 조건 (확인됨[직접], KO 0x29614 부근)

- 매입 칸 9개를 앞에서부터 보며 `최소경제 × 10 ≤ 항구 경제`인 칸만 올립니다. 빈 칸(0xFF)에서 멈춥니다.
- 특산품은 `메타+0x1D × 10 ≤ 경제` 이고 **그 분류의 저장 시세 R < 90**(배율 140% 미만)일 때만 9번째 칸으로 나옵니다. 많이 사서 R이 90 이상이 되면 "품절"이 되고, R이 90 아래로 내려오면 다시 나옵니다.
- 재고 개념은 없습니다. 한 번의 거래 수량 상한은 `min(소지금 ÷ 가격, 선택한 배의 빈 짐칸)`뿐입니다. (외부자료, 대조: EN 0x29FCA)

### 2.3 파는 값 (확인됨[직접], KO 0x29A28)

```
일반 품목: 파는 값 = floor((R + 50) × 매각기준가[품목] / 100)
특산품을 그 항구에 되팔 때: floor((R + 50) × 특산품기준가 / 200)   … 절반
```

매각에는 세금 할증도 흥정도 없습니다. (확인됨[직접])

### 2.4 예시 (리스본, 새 게임 값)

리스본(항구 0)은 시장 0, 경제 780. 식품(분류 2) 저장 시세 R = 52.
- 유제품 매입 기준가 30 → 보통값 floor(102 × 30 / 100) = 30, 면세증 없으면 36.
- 같은 시장에서 와인은 경제 300 이상, 벨벳 500, 염료 600, 무기 750 이상에서 매입 목록에 나옵니다.
- 특산품 돌소금(기준가 38, 경제 100 이상)은 식품 시세가 90 미만일 때만 팝니다.

## 3. 흥정 (확인됨[직접], KO 0x29464 / EN 0x2A152)

매입 확인에서 "아니오"를 고르면 흥정이 열립니다. 난수는 쓰지 않습니다.

```
P = 사는 값(2.1)
N = 주인공의 작위 단계(명성 기록 +0x0D, 0 무작위 … 9 공작)
    단, 그 항구의 캐시 지배국이 주인공 국적과 같을 때만. 다르면 N = 0
F = floor(P × (19 − N) / 20)     … 최저 가능가
T = P − floor((P − F) / 2)       … 그대로 받아들이는 최저 제시가
C = P − floor((T − F) / 2)       … 상인이 되부르는 값
```

- 제시가 ≥ T: 제시가로 거래(메시지 10).
- 제시가 < T이고 `T − F ≤ 1`: 거절(메시지 11).
- 그 외: 상인이 C를 부르고(메시지 12) 다시 묻습니다. 이때 **협상자**가 "교섭" 기술(기술 비트 0x01)을 가졌으면 F를 제시하고(메시지 851) 상인이 F로 양보합니다(852).
- 협상자는 처음엔 주인공. 주인공에게 교섭이 없으면 경리주임(직책 4)이 협상자가 되며, 경리주임은 **회계**(비트 0x02)가 있어야 851을 말합니다.
- 결론: 교섭(주인공) 또는 회계(경리주임)가 있으면 아무리 낮게 불러도 F에 살 수 있고, 없으면 최저 T입니다. 자국 항구에서 작위가 높을수록 F가 5%씩 내려갑니다(공작이면 P의 50%).

기타 (외부자료, 대조): 흥정 전에 경리주임이 시세 R로 가격을 평가합니다(R ≤ 40 "싸다", 41–60 "적당", 60 초과 "비싸다"). 소지금이 값의 절반 미만이면 살 수 없다는 말만 나옵니다.

## 4. 시세 변동

### 4.1 사면 오른다 (확인됨[직접], KO 0x293C9 / EN 0x2A0B7)

```
V  = 수량 × 단가        (16비트 곱셈: V mod 65536만 씀)
E  = 항구 경제
그 분류 R  ← min(100, R + min(10, floor((V mod 65536) / (E + 500))))
모든 10분류 R ← min(100, R + min(3, floor((V mod 65536) / 1000)))
```

선택 분류에는 두 증가가 모두 적용됩니다.

### 4.2 팔면 내린다 (확인됨[직접], KO 0x29C0D / EN 0x2A97C)

```
V  = 수량 × 파는 값     (그 분류용은 32비트, 전체용은 16비트)
그 분류 R  ← R − min(R, min(10, floor(V / (E + 500))))
모든 10분류 R ← R − min(R, min(3, floor((V mod 65536) / 1000)))
```

R은 0 아래로 내려가지 않습니다.

**실전 결과** (추정이 아닌 계산 결과):
- 한 번의 거래액이 1,000 미만이면서 `E + 500` 미만이면 시세가 전혀 변하지 않습니다. 같은 물건을 여러 번 잘게 나눠 사고팔면 시세를 거의 움직이지 않습니다.
- 매입 쪽은 거래액의 하위 16비트만 보므로, 거래액이 65,536의 배수를 막 넘으면(예: 262,449 = 4 × 65,536 + 305) 시세가 오르지 않습니다.
- 가격은 거래 **전** 시세로 정해지므로, 한 번에 크게 팔아 시세를 떨어뜨린 뒤 같은 항구에서 다른 분류 물건을 싸게 살 수 있습니다(전 분류 −3).
- 한 번에 움직이는 폭은 선택 분류 최대 +13/−13, 다른 분류 ±3입니다.

### 4.3 월말 회복 (확인됨[직접], KO 0x1C7CC / EN 0x1CB4E)

매달 말 정규 항구 100곳 각각에 대해:

```
각 분류마다 r = random(5) + 1     (1–5)
R > 50 이면 R ← R − r,  R ≤ 50 이면 R ← R + r
```

즉 시세는 한 달에 평균 3씩 기준(50 = 100%)으로 돌아갑니다. R이 50 근처면 매달 50±5 안에서 흔들립니다. 같은 루틴이 투자액을 경제·공업으로 바꿉니다(5.1절).

### 4.4 NPC 상선의 영향 (확인됨[대조], KO 0x38AE4·0x3885D / EN 0x39B0D·0x39886)

- **교역 출항**(국가 전략 모드 2일 때 상선): 목적 항구에서 품목 `10 + random(16)`(설탕~삼베, 식품·섬유·직물) 하나를 `min(1000, floor(100 × 자금 / 가격))`개 사고, 그 분류 시세를 `min(100 − R, 3 + random(3))`만큼 올립니다.
- **귀항**: 화물이 있으면 모항의 모든 분류 시세가 `random(3)`(0–2)씩, 화물 분류는 2를 더 내립니다(0 미만 없음).
- 그래서 각국 수도(NPC 모항)의 시세는 상선이 돌아올 때마다 내려가고, 상선이 교역하러 간 항구의 식품·섬유·직물 시세는 오릅니다. (추정: 실제 체감 정도는 시뮬레이션하지 않음)

## 5. 투자, 지지도, 동맹항

### 5.1 투자 (확인됨[직접], 시장 KO 0x29E58 부근 / 조선소는 KO 0x3161x 부근)

- 국가 수도에서는 투자할 수 없습니다(메시지 2).
- 이달 누적 투자액(시장 메타+0x04, 조선소 +0x08)이 50,000이면 거절(메시지 7).
- 입력 상한 = `min(min(소지금, 50,000), 50,000 − 누적액)`.
- 금액별 대사: 0 → 13, 1–499 → 14("이것뿐이야?"), 500–9,999 → 15, 10,000 이상 → 16.
- 투자 즉시 경제·공업은 오르지 **않습니다**. 월말에(KO 0x1C7CC):

```
경제 ← min(1000, 경제 + floor(시장 투자 누적 / 300))
공업 ← min(1000, 공업 + floor(조선소 투자 누적 / 300))
두 누적액 ← 0
```

  50,000을 넣으면 한 달에 최대 +166. 경제·공업을 낮추는 코드는 없습니다(외부자료, 연구 결론).

### 5.2 지지도 변화 (확인됨[직접], KO 0x29D36 / 조선소 KO 0x3144A[대조])

```
E' = 경제(시장 투자) 또는 공업(조선소 투자)        (0으로 나누기 검사 없음)
얻는 지지 g = min(100 − 내 나라 지지도, floor(투자액 / E'))
해적 주인공: g = min(100, floor(투자액 / E')) 만큼 다른 나라에서 깎기만 함
```

g는 지지도가 0이 아닌 다른 나라 n곳에서 `floor(g / n)`씩 고르게 빼고(0 아래면 모자란 만큼 나머지에 합침), 나머지는 국가 순서대로 1점씩 뺍니다.

예: 경제 500 항구에 10,000을 넣으면 +20, 경제 900이면 +11. 경제가 낮은 항구일수록 지지도를 사기 쉽습니다.

### 5.3 지배국 결정과 동맹항 (확인됨[대조], KO 0x3156E·0x1E42A / EN 0x327C3·0x1E88F)

- 지배국 = 지지도 **75 이상**인 나라(여럿이면 번호가 큰 쪽), 없으면 6(중립). 투자 직후와 매일 자정에 갱신됩니다.
- 투자로 지배국이 내 나라로 바뀌면: **교역 명성 += 경제 + 공업**(최대 50,000), 내 나라 우호도 +5.
- 내 나라가 아닌 옛 지배국에서 다른 나라로 넘어가면 옛 지배국 우호도 −5.

### 5.4 국가 경제력(길드 수익) (확인됨[대조], KO 0x1C864 / EN 0x1CBE6)

매달 초 각국에 대해, 그 나라가 지배하는 항구의 경제·공업을 지역별로 합산합니다.

```
지역 경제력 = floor(지역 경제 합 / 지역 제수)
제수: 유럽 4, 신대륙 3, 서아프리카 3, 동아프리카 2, 중동 3, 인도·동남아·극동 1
길드 수익 = 활성 지역 경제력의 합,  해적의 값 = 6개국 평균
```

지역이 활성이려면 그 지역 동맹항 공업 합이 300 이상이어야 하고, 동쪽 지역은 보급로가 필요합니다(동아프리카: 서아프리카 또는 중동도 300 이상, 인도: 중동, 동남아: 중동·인도, 극동: 중동·인도·동남아도 각각 300 이상). (외부자료, 지역 조건 세부는 EN 0x2FFB7–0x300B3; 한글판 함수 구조 일치)

이 값은 NPC 함대 자금, 함대 재생성, 국가 공격 성향에 쓰입니다(npc.md).

## 6. 그 밖의 가격

### 6.1 항구 보급품 (외부자료, 대조 부분 일치: KO 0x2C7FA, 메시지 처리 차이 있음)

```
물 = 무료
식량 = floor( 20 × (식품 분류 R + 50) / 100)
목재 = floor( 90 × (기타 분류 R + 50) / 100)
포탄 = floor(120 × (식품 분류 R + 50) / 100)     ← 연구 자료 그대로(식품 시세 사용)
```

### 6.2 조선소 가격 지수 (확인됨[직접], KO 0x3060A)

```
조선소 지수 I = 50 + floor(그 항구 10개 분류 R의 합 / 10)     (보통 50–150%)
견적 = 10 × floor(기준가(10 단위) × I / 100)
최저 수락가 = floor(견적 × (500 − 주인공 매력) / 500)
```

- 경리주임이 있으면 추천가를 말합니다: 회계 기술이 있으면 정확히 최저 수락가, 없으면 `최저 수락가 × (95 + random(10)) / 100`.
- 교역으로 시세를 내리면 그 항구의 배값도 내려갑니다(시세 합이 조선소 지수를 만들기 때문).
- 교환(중고 구입 시 현재 배를 넘김)에서는 넘기는 배의 매각가를 **2로 나눈 값**을 소지금에 더해 구매 가능 여부를 봅니다(KO 0x30673–0x3068A, 영문판도 같음). (확인됨[직접] 코드, 의미 해석은 추정)

## 7. 교역 명성

일반 매매로는 교역 명성이 오르지 않습니다. 오르는 길은 투자로 항구를 동맹항으로 만들기(경제+공업)와 길드 의뢰(편지 50, 운송·구매 200/700/1,500, 빚 받기 150/500)입니다. (동맹항 부분 확인됨[대조]; 길드 의뢰 수치는 외부자료: SNR0 스크립트)

## 확인하지 못한 것

- 시장 메뉴의 "시세" 화면 세부 출력, 경리주임 평가 대사 문턱값은 대조만 했고 직접 읽지 않았습니다.
- 보급품 가격의 정확한 분류 바이트(+0x12, +0x19)는 한글판 Supply 루틴이 메시지 처리 차이로 자동 대조되지 않아 연구 값을 그대로 옮겼습니다.
- NPC 교역·귀항이 장기적으로 시세에 주는 영향의 크기는 시뮬레이션하지 않았습니다.
