이 매뉴얼에서는 OpenTTD 내부에서 도시의 회사에 대한 평판이나 역 등급, 차량 속력, 도시 성장 속도, 화물 생산량 등의 수치가 어떻게 계산되는지를 알려드릴 것입니다.
즉, 다시 말해서 이러한 수치를 올리거나 내리기 위해선 어떻게 해야하는 지에 대한 정보를 얻을 수 있습니다.
한 계산 주기, 즉 매 2.5일마다 산업시설은 각 화물별로 최대 2개의 역에만 화물을 옮겨다 놓습니다.
만약 한 화물 종류에 대해서 똑같이 최대 등급 값을 가진 역이 2개 이상 존재하는 경우, 어떤 역이 화물을 받을지는 내부적으로 순서를 매깁니다.
만약 화물을 받을 역이 하나 뿐이라면, 역에 적재되는 화물의 양은 (생산량) × (역의 화물 등급, 단위: %)을 소숫점 첫째 자리에서 반올림한 값이 됩니다.
만약 화물을 받을 역이 두 개라면 계산이 조금 더 복잡해집니다.
먼저, 향후 지역 계산을 위해 역 2의 화물 등급을 반으로 나눕니다. 그러면 역 1에 적재될 수 있는 최대 화물량은 다음과 같이 계산합니다:
\(Y\) : 역 1에 적재 가능한 최대 화물량,
\(P_1\) : 역 1의 화물 등급 (단위: 점), \(P_2\) : 역 2의 화물 등급 (단위: 점), \(A\) : 산업시설의 생산량
{{{#math
Y = \frac {P_1} {P_1 + \frac{P_{2}}{2}} \cdot (A + 1) = \frac {2P_1} {2P_1 + P_{2}} \cdot (A + 1)
}}}
따라서 만약 두 역의 화물 등급이 비슷하다면, 역 1에 최대 생산량의 \( \frac23 \) 정도가 배정됩니다. 화물 등급의 차이가 커질 수록 이 비율은 늘어납니다.
그 결과값을 가지고 역이 하나인 경우의 계산 방식을 이용하여 실제 화물 적재량을 결정한 뒤, 역 1에 적재합니다.
만약 역 1이 적재될 수 있는 최대 화물량을 받지 못했다면 그 부분은 산업시설의 수송량에 전혀 반영되지 않습니다.
남은 최대 생산량을 갖고 역 2에 "역이 하나 일 때의 계산 방식"을 이용하여 화물을 적재합니다.
회사에 대한 지역 당국의 평가에 따라 플레이어가 할 수 있는 행동에 제약이 걸리기도 합니다.
기본적으로 지역 당국의 평가는 500점에서 시작해서 회사의 행동에 따라 그 수치가 변하게 됩니다.
도시의 영향권 안에 있는 200칸 이상의 칸에 나무를 심으면 지역 당국의 평가가 올라갑니다. 하지만 나무를 심는 행위로는 최소 평가 점수인 -1000점에서 220점까지밖에는 올릴 수 없습니다. 만약 지역 당국의 평가가 보통 이하라면 30칸 규모의 나무를 심으면 역 하나를 짓는 데 필요한 지역 당국 평가 점수를 얻을 수 있습니다. 단, 지역 당국의 평가가 매우 좋음 이상이라면 나무 심기는 더 이상 효과가 없습니다.
한 회사의 평가 점수가 -300(매우 나쁨)이고, 2개의 운영 중인 역과 하나의 방치된 역이 있다고 가정하면그 상태에서 가만히 있을 경우 5 + 2 × 12 - 15 = 14점이 매월 오르게 됩니다.\(\left( -200 - (-300) 점 \right) / \left(14 점/개월 \right) = 8개월\) 뒤에 다른 역을 건설할 수 있게 될 것입니다.
도시 평판에 대한 코드는 town.h, town_cmd.c, tree_cmd.c, road_cmd.c에 있습니다.
256x256 칸의 지도에서는 한 달에 (산업 시설 딱 하나가) 한 번만 변할 수 있습니다. 개발 버전(r14332)에서 "일일 생산량 변화"가 도입된 이후부터는 이 수치가 지도 크기에 비례하여 증가하게 되었습니다.
부드러운 경제 변화 옵션을 켠 상황이라면, 산업 시설은 역에 한 달에 8, 9번 또는 10번(생산량이 높은 '숲' 한정, 400t 이상) 화물을 적재해줍니다.
생산량은 6가지 생산 등급인 가장 낮음, 낮음, 보통[2], 높음, 2배 높음, 가장 높음 중에 하나를 따르게 되는데,
생산량은 50% 감소되거나(생산량이 절반으로 감소) 100% 증가되는(생산량이 두 배로 증가) 식으로 등급 사이를 왔다갔다합니다.
예시:
탄광 : 가장 낮음(32 또는 40t/월), 낮음(64 또는 72), 보통(120 또는 135), 높음(240 또는 270), 2배 높음(480 또는 540), 가장 높음(960 또는 1080)
숲 : 가장 낮음(32 또는 64t/월), 낮음(35 또는 70), 보통(78 또는 117), 높음(208 또는 260), 2배 높음(416 또는 468 또는 520(=x10인 경우)), 가장 높음(832 또는 936 또는 1040)
금광 : 가장 낮음(12 또는 18자루/월), 낮음(32 또는 40), 보통(56 또는 63), 높음(112 또는 126), 2배 높음(224 또는 252), 가장 높음(448 또는 504)
간단하게 설명하기 위해서 256x256 크기의 지도에서 플레이를 하고 있다고 가정해보겠습니다. (1개월당 최대 1번의 변화 = 최대 1개의 산업 시설 생산량만 바뀜)
매월마다 생산량이 변화할 확률:
only_decrease가 설정된 산업 시설인 경우에는 50% (지금은 온대 기후의 유정만 해당됨)
그 외의 산업 시설은 1/3의 확률(=16.7%)로 50%
만약 1/3의 확률을 뚫고 산업 시설의 생산량이 변화하는 경우:
수송이 원활하게 되지 않거나 아예 없는[3] 산업 시설: 33% 확률로 증가, 67% 확률로 감소
즉, 어떤 산업 시설의 생산량이 변화할 확률을 계산해보면 \(50\% \times \frac13 \times 33\% = 5.56\%\) 입니다.
수송이 잘 안 되는 경우: 산업 시설 하나의 생산량은 매월 1.5%의 확률로 증가하고, 3.0%의 확률로 감소합니다.
수송이 잘 되는 경우: 산업 시설 하나의 생산량은 매월 3.0%의 확률로 증가하고, 1.5%의 확률로 감소합니다.
수송이 특히 잘 되는 경우: 산업 시설 하나의 생산량은 매월 3.75%의 확률로 증가하고, 0.75%의 확률로 감소합니다.
부드러운 경제 설정을 켜면, 매월 생산량이 3 ~ 23% 사이에서 변합니다.
생산량이 매우 낮은(12 ~ 40t/월) 산업 시설은 더 변화량이 많습니다.
1차 산업 시설은 1개월에 8번 또는 9번 화물을 생산합니다. (숲은 10번도 가능) 월 생산량은 산업시설의 '기반 값'에 8이나 9를(생산량이 많은 숲에선 10을) 곱해서 나온 값입니다. 예를 들어서, 탄광의 기반 값은 15톤이므로 월 생산량은 120톤이나 135톤이 됩니다.
이 기반 값은 최대 255까지만 가능하므로 산업시설의 최대 월 생산량은 2040이나 2295입니다. (생산량이 많은 숲에선 2550)
내부적으로 OpenTTD의 속력은 기본적으로 시간당 시속 마일(mph) 값을 1.6으로 나눈 것과 같은 유사km/h(km/h-ish)를 사용합니다. 유사km/h는 km/h와 거의 비슷하지만 정확하게 같지는 않은 단위입니다.
유사km/h를 (실제로 우리가 쓰는 정확한) km/h로 변환하려면 1.00584를 곱하면 됩니다. (\(1 \; km/h = 1.00584 \; 유사km/h\))
또, 유사km/h를 mph로 변환하려면 1.6을 곱하면 됩니다. (( 1 \; mph = 1.6 \; 유사km/h ))
변환표(*: 근삿값)
-
km/h
유사km/h
mph
1 km/h
1
1.00584
1.609344
1 유사km/h
0.99419*
1
0.625
1 mph
0.62137*
1.6
1
속력을 계산하기 위해 필요한 게임 맵의 한 칸 길이는 약 664 유사km로 계산합니다. 정확하게는 664.216 유사km = 668 km = 415 마일입니다. 이는 다음 사실을 기반으로 계산한 것입니다.
한 칸은 X/Y축에 대하여 16개의 방향을 가지고 있습니다.
차량은 한 칸에서 앞으로 진행하기 위해 남은 거리를 서브속력이라는 1바이트 값으로 저장하고 있습니다. 따라서 256개의 다른 값을 가질 수 있습니다.
차량의 (단순) 속력을 서브속력에 더한 뒤, 결과값을 256으로 나누면 그 나머지 값이 차량의 서브속력으로 저장되고 몫 값만큼 차량이 앞으로 전진합니다.
열차와 항공기의 (단순) 속력은 유사km/h를 그대로 더하고, 자동차와 선박은 유사km/h의 절반을 더합니다. 자동차와 선박은 이 작업이 1틱 당 한 번 이루어지지만, 열차와 항공기는 이 작업이 1틱당 두 번 일어납니다.
OpenTTD의 1일은 74틱이고 하루는 24시간입니다.
따라서 위 사실에 의해 1 유사km/h는 다음과 같이 계산할 수 있습니다: (1×16×256) / (74×2)×24 = 664.216
예를 들자면 100 km/h의 속력을 가진 차량이 하루에 3.6칸 진행하게 됩니다.
같은 방향으로 꺾인 45˚ 각도 선로를 두 번 이상 통과할 때에는 아래와 같이 최대 속력이 제한됩니다:
곡률
최대 속력(km/h)
곡률
최대 속력(mph)
일반선로
모노레일
자기부상
일반선로
모노레일
자기부상
0 (90˚ 꺾기)
61
91
121
0
37
56
75
1
88
132
176
1
54
82
109
2
111
166
22
2
68
103
137
3
132
198
264
3
82
123
164
4
151
226
301
4
93
140
187
5
168
252
336
5
104
156
208
6
183
274
365
6
113
170
226
7
196
294
392
7
121
182
243
8
207
310
413
8
128
192
256
9
216
324
432
9
134
201
268
10
223
334
445
10
138
207
276
11
228
342
456
11
141
212
283
12 이상
231
346
461
12+
143
214
286
위 표에서 "곡률"이란, 각 선로 꺾임 사이에 들어오는 평균 객차의 개수를 말합니다. 하지만 급커브(곡률이 0 또는 1)의 경우에는 평균을 내지 않습니다.
NewGRF으로 추가한 선로 종류의 경우에는 위 표에 나온 수치 간격을 기반으로 최대 속력이 조정되어 있을 수 있습니다.
틸팅 열차는 최대 속력보다 20%만큼 더 빨리 커브를 돌 수 있습니다.
기차의 가속도와 최대 속력은 한 열차 편성에 구성된 모든 기관차의 출력과 최대 견인력, 현재 속도, 공기 저항, 전체 열차 중량, 언덕에 있는 기관차/객차의 수 등에 의해 결정됩니다.
감속하는 경우에는 차량기지나 역에 진입하는 게 아니라면 평소의 2배의 가속도로 감속합니다.
관련 코드는 aircraft_cmd.c, roadveh_cmd.c, ship_cmd.c, train_cmd.c, vehicle.c에 있습니다.
OpenTTD 1.4.2 기준으로, 자기부상열차가 아닌 열차의 가속도는
출력(power, 단위: 마력), 최대 견인력(max_te, 단위: kN), 열차의 전체 중량(total_weight, 단위: t), 열차의 편성량수(number_of_parts),
기차의 첫 번째 기관차가 받는 공기 저항값(air_drag_coefficient)[9],
오르막 언덕 위에 있는 열차 부분(기관차나 객차)의 합계 중량(weight_on_upslope), 내리막 언덕 위에 있는 열차 부분(기관차나 객차)의 합계 중량(weight_on_downslope),
경사도 설정값(slope_steepness)[10],
현재 속력(current_speed, 단위: km/h)을 갖고 다음과 같이 계산합니다: force = min((max_te * 1000), floor((power * 746) / (current_speed * 5/18))) [단위: N]
slope_force = weight_on_upslope * slope_steepness * 100 - weight_on_downslope * slope_steepness * 100 [단위: N]
axle_friction = total_weight * 10 [단위: N]
rolling_friction = total_weight * 15 * (1 + floor(current_speed / 512)) [단위: N]
air_drag_coefficient = 14 * floor(air_drag_value * 1 + number_of_parts * 3/20) / 1000
air_drag = floor(air_drag_coefficient * current_speed^2) [단위: N]
acceleration = (force - (slope_force + axle_friction + rolling_friction + air_drag)) / (total_weight * 4) [단위: 0.5틱당 1/256 km/h]
air_drag_coefficient값은 열차의 일부분이 터널 안에 한 량이라도 들어있으면 2배로 적용됩니다.
위와 같은 조건이 주어졌을 때, 열차의 순항 속도, 즉 동일한 조건이 계속해서 유지될 때 열차가 달리게 되는 속력은 다음과 같이 계산됩니다. [``rolling_friction``은 상수로 간주하고 (즉 속력이 항상 512km/h 이하로 유지됨), ``force``와 ``air_drag`` 값의 버림은 계산에서 무시합니다.] p = (slope_force + axle_friction + rolling_friction) / air_drag_coefficient
q = (-power * 746 * 18/5) / air_drag_coefficient
C = (27/2*q + ((27/2*q)^2 + 27*p^3)^(1/2))^(1/3)
equilibrium = min(max_speed, p/C - C/3, max(0, max_te * 1000 / air_drag_coefficient - p)^(1/2))