12 #include "engine.h" |
12 #include "engine.h" |
13 #include "command.h" |
13 #include "command.h" |
14 #include "news.h" |
14 #include "news.h" |
15 #include "variables.h" |
15 #include "variables.h" |
16 #include "newgrf_engine.h" |
16 #include "newgrf_engine.h" |
|
17 #include "vehicle.h" |
17 |
18 |
18 |
19 |
19 static StringID GetEngineCategoryName(EngineID engine) |
20 static StringID GetEngineCategoryName(EngineID engine) |
20 { |
21 { |
21 if (engine < NUM_TRAIN_ENGINES) { |
22 switch (GetEngine(engine)->type) { |
22 switch (GetEngine(engine)->railtype) { |
23 default: NOT_REACHED(); |
23 case RAILTYPE_RAIL: return STR_8102_RAILROAD_LOCOMOTIVE; |
24 case VEH_Road: return STR_8103_ROAD_VEHICLE; |
24 case RAILTYPE_ELECTRIC: return STR_8102_RAILROAD_LOCOMOTIVE; |
25 case VEH_Aircraft: return STR_8104_AIRCRAFT; |
25 case RAILTYPE_MONO: return STR_8106_MONORAIL_LOCOMOTIVE; |
26 case VEH_Ship: return STR_8105_SHIP; |
26 case RAILTYPE_MAGLEV: return STR_8107_MAGLEV_LOCOMOTIVE; |
27 case VEH_Train: |
27 } |
28 switch (GetEngine(engine)->railtype) { |
28 } |
29 default: NOT_REACHED(); |
29 |
30 case RAILTYPE_RAIL: return STR_8102_RAILROAD_LOCOMOTIVE; |
30 if (engine < NUM_TRAIN_ENGINES + NUM_ROAD_ENGINES) |
31 case RAILTYPE_ELECTRIC: return STR_8102_RAILROAD_LOCOMOTIVE; |
31 return STR_8103_ROAD_VEHICLE; |
32 case RAILTYPE_MONO: return STR_8106_MONORAIL_LOCOMOTIVE; |
32 |
33 case RAILTYPE_MAGLEV: return STR_8107_MAGLEV_LOCOMOTIVE; |
33 if (engine < NUM_TRAIN_ENGINES + NUM_ROAD_ENGINES + NUM_SHIP_ENGINES) |
34 } |
34 return STR_8105_SHIP; |
35 } |
35 |
|
36 return STR_8104_AIRCRAFT; |
|
37 } |
36 } |
38 |
37 |
39 static const Widget _engine_preview_widgets[] = { |
38 static const Widget _engine_preview_widgets[] = { |
40 { WWT_CLOSEBOX, RESIZE_NONE, 5, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, |
39 { WWT_CLOSEBOX, RESIZE_NONE, 5, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, |
41 { WWT_CAPTION, RESIZE_NONE, 5, 11, 299, 0, 13, STR_8100_MESSAGE_FROM_VEHICLE_MANUFACTURE, STR_018C_WINDOW_TITLE_DRAG_THIS}, |
40 { WWT_CAPTION, RESIZE_NONE, 5, 11, 299, 0, 13, STR_8100_MESSAGE_FROM_VEHICLE_MANUFACTURE, STR_018C_WINDOW_TITLE_DRAG_THIS}, |
57 static void DrawRoadVehEngineInfo(EngineID engine, int x, int y, int maxw); |
56 static void DrawRoadVehEngineInfo(EngineID engine, int x, int y, int maxw); |
58 static void DrawShipEngineInfo(EngineID engine, int x, int y, int maxw); |
57 static void DrawShipEngineInfo(EngineID engine, int x, int y, int maxw); |
59 static void DrawAircraftEngineInfo(EngineID engine, int x, int y, int maxw); |
58 static void DrawAircraftEngineInfo(EngineID engine, int x, int y, int maxw); |
60 |
59 |
61 static const DrawEngineInfo _draw_engine_list[4] = { |
60 static const DrawEngineInfo _draw_engine_list[4] = { |
62 {DrawTrainEngine,DrawTrainEngineInfo}, |
61 { DrawTrainEngine, DrawTrainEngineInfo }, |
63 {DrawRoadVehEngine,DrawRoadVehEngineInfo}, |
62 { DrawRoadVehEngine, DrawRoadVehEngineInfo }, |
64 {DrawShipEngine,DrawShipEngineInfo}, |
63 { DrawShipEngine, DrawShipEngineInfo }, |
65 {DrawAircraftEngine,DrawAircraftEngineInfo}, |
64 { DrawAircraftEngine, DrawAircraftEngineInfo }, |
66 }; |
65 }; |
67 |
66 |
68 static void EnginePreviewWndProc(Window *w, WindowEvent *e) |
67 static void EnginePreviewWndProc(Window *w, WindowEvent *e) |
69 { |
68 { |
70 switch (e->event) { |
69 switch (e->event) { |
78 SetDParam(0, GetEngineCategoryName(engine)); |
77 SetDParam(0, GetEngineCategoryName(engine)); |
79 DrawStringMultiCenter(150, 44, STR_8101_WE_HAVE_JUST_DESIGNED_A, 296); |
78 DrawStringMultiCenter(150, 44, STR_8101_WE_HAVE_JUST_DESIGNED_A, 296); |
80 |
79 |
81 DrawStringCentered(w->width >> 1, 80, GetCustomEngineName(engine), 0x10); |
80 DrawStringCentered(w->width >> 1, 80, GetCustomEngineName(engine), 0x10); |
82 |
81 |
83 (dei = _draw_engine_list,engine < NUM_TRAIN_ENGINES) || |
82 dei = &_draw_engine_list[GetEngine(engine)->type]; |
84 (dei++,engine < NUM_TRAIN_ENGINES + NUM_ROAD_ENGINES) || |
|
85 (dei++,engine < NUM_TRAIN_ENGINES + NUM_ROAD_ENGINES + NUM_SHIP_ENGINES) || |
|
86 (dei++, true); |
|
87 |
83 |
88 width = w->width; |
84 width = w->width; |
89 dei->engine_proc(width >> 1, 100, engine, 0); |
85 dei->engine_proc(width >> 1, 100, engine, 0); |
90 dei->info_proc(engine, width >> 1, 130, width - 52); |
86 dei->info_proc(engine, width >> 1, 130, width - 52); |
91 break; |
87 break; |
137 SetDParam(5, CT_INVALID); |
133 SetDParam(5, CT_INVALID); |
138 } |
134 } |
139 DrawStringMultiCenter(x, y, STR_VEHICLE_INFO_COST_WEIGHT_SPEED_POWER, maxw); |
135 DrawStringMultiCenter(x, y, STR_VEHICLE_INFO_COST_WEIGHT_SPEED_POWER, maxw); |
140 } |
136 } |
141 |
137 |
142 void DrawNewsNewTrainAvail(Window *w) |
|
143 { |
|
144 EngineID engine; |
|
145 |
|
146 DrawNewsBorder(w); |
|
147 |
|
148 engine = WP(w,news_d).ni->string_id; |
|
149 SetDParam(0, GetEngineCategoryName(engine)); |
|
150 DrawStringMultiCenter(w->width >> 1, 20, STR_8859_NEW_NOW_AVAILABLE, w->width - 2); |
|
151 |
|
152 GfxFillRect(25, 56, w->width - 25, w->height - 2, 10); |
|
153 |
|
154 SetDParam(0, GetCustomEngineName(engine)); |
|
155 DrawStringMultiCenter(w->width >> 1, 57, STR_885A, w->width - 2); |
|
156 |
|
157 DrawTrainEngine(w->width >> 1, 88, engine, 0); |
|
158 GfxFillRect(25, 56, w->width - 56, 112, 0x323 | USE_COLORTABLE); |
|
159 DrawTrainEngineInfo(engine, w->width >> 1, 129, w->width - 52); |
|
160 } |
|
161 |
|
162 StringID GetNewsStringNewTrainAvail(const NewsItem *ni) |
|
163 { |
|
164 EngineID engine = ni->string_id; |
|
165 SetDParam(0, STR_8859_NEW_NOW_AVAILABLE); |
|
166 SetDParam(1, GetEngineCategoryName(engine)); |
|
167 SetDParam(2, GetCustomEngineName(engine)); |
|
168 return STR_02B6; |
|
169 } |
|
170 |
|
171 static void DrawAircraftEngineInfo(EngineID engine, int x, int y, int maxw) |
138 static void DrawAircraftEngineInfo(EngineID engine, int x, int y, int maxw) |
172 { |
139 { |
173 const AircraftVehicleInfo *avi = AircraftVehInfo(engine); |
140 const AircraftVehicleInfo *avi = AircraftVehInfo(engine); |
174 SetDParam(0, (_price.aircraft_base >> 3) * avi->base_cost >> 5); |
141 SetDParam(0, (_price.aircraft_base >> 3) * avi->base_cost >> 5); |
175 SetDParam(1, avi->max_speed * 128 / 10); |
142 SetDParam(1, avi->max_speed * 128 / 10); |
178 SetDParam(4, avi->running_cost * _price.aircraft_running >> 8); |
145 SetDParam(4, avi->running_cost * _price.aircraft_running >> 8); |
179 |
146 |
180 DrawStringMultiCenter(x, y, STR_A02E_COST_MAX_SPEED_CAPACITY, maxw); |
147 DrawStringMultiCenter(x, y, STR_A02E_COST_MAX_SPEED_CAPACITY, maxw); |
181 } |
148 } |
182 |
149 |
183 void DrawNewsNewAircraftAvail(Window *w) |
|
184 { |
|
185 EngineID engine; |
|
186 |
|
187 DrawNewsBorder(w); |
|
188 |
|
189 engine = WP(w,news_d).ni->string_id; |
|
190 |
|
191 DrawStringMultiCenter(w->width >> 1, 20, STR_A02C_NEW_AIRCRAFT_NOW_AVAILABLE, w->width - 2); |
|
192 GfxFillRect(25, 56, w->width - 25, w->height - 2, 10); |
|
193 |
|
194 SetDParam(0, GetCustomEngineName(engine)); |
|
195 DrawStringMultiCenter(w->width >> 1, 57, STR_A02D, w->width - 2); |
|
196 |
|
197 DrawAircraftEngine(w->width >> 1, 93, engine, 0); |
|
198 GfxFillRect(25, 56, w->width - 56, 110, 0x323 | USE_COLORTABLE); |
|
199 DrawAircraftEngineInfo(engine, w->width >> 1, 131, w->width - 52); |
|
200 } |
|
201 |
|
202 StringID GetNewsStringNewAircraftAvail(const NewsItem *ni) |
|
203 { |
|
204 EngineID engine = ni->string_id; |
|
205 SetDParam(0, STR_A02C_NEW_AIRCRAFT_NOW_AVAILABLE); |
|
206 SetDParam(1, GetCustomEngineName(engine)); |
|
207 return STR_02B6; |
|
208 } |
|
209 |
|
210 static void DrawRoadVehEngineInfo(EngineID engine, int x, int y, int maxw) |
150 static void DrawRoadVehEngineInfo(EngineID engine, int x, int y, int maxw) |
211 { |
151 { |
212 const RoadVehicleInfo *rvi = RoadVehInfo(engine); |
152 const RoadVehicleInfo *rvi = RoadVehInfo(engine); |
213 |
153 |
214 SetDParam(0, (_price.roadveh_base >> 3) * rvi->base_cost >> 5); |
154 SetDParam(0, (_price.roadveh_base >> 3) * rvi->base_cost >> 5); |
216 SetDParam(2, rvi->running_cost * _price.roadveh_running >> 8); |
156 SetDParam(2, rvi->running_cost * _price.roadveh_running >> 8); |
217 SetDParam(3, rvi->cargo_type); |
157 SetDParam(3, rvi->cargo_type); |
218 SetDParam(4, rvi->capacity); |
158 SetDParam(4, rvi->capacity); |
219 |
159 |
220 DrawStringMultiCenter(x, y, STR_902A_COST_SPEED_RUNNING_COST, maxw); |
160 DrawStringMultiCenter(x, y, STR_902A_COST_SPEED_RUNNING_COST, maxw); |
221 } |
|
222 |
|
223 void DrawNewsNewRoadVehAvail(Window *w) |
|
224 { |
|
225 EngineID engine; |
|
226 |
|
227 DrawNewsBorder(w); |
|
228 |
|
229 engine = WP(w,news_d).ni->string_id; |
|
230 DrawStringMultiCenter(w->width >> 1, 20, STR_9028_NEW_ROAD_VEHICLE_NOW_AVAILABLE, w->width - 2); |
|
231 GfxFillRect(25, 56, w->width - 25, w->height - 2, 10); |
|
232 |
|
233 SetDParam(0, GetCustomEngineName(engine)); |
|
234 DrawStringMultiCenter(w->width >> 1, 57, STR_9029, w->width - 2); |
|
235 |
|
236 DrawRoadVehEngine(w->width >> 1, 88, engine, 0); |
|
237 GfxFillRect(25, 56, w->width - 56, 112, 0x323 | USE_COLORTABLE); |
|
238 DrawRoadVehEngineInfo(engine, w->width >> 1, 129, w->width - 52); |
|
239 } |
|
240 |
|
241 StringID GetNewsStringNewRoadVehAvail(const NewsItem *ni) |
|
242 { |
|
243 EngineID engine = ni->string_id; |
|
244 SetDParam(0, STR_9028_NEW_ROAD_VEHICLE_NOW_AVAILABLE); |
|
245 SetDParam(1, GetCustomEngineName(engine)); |
|
246 return STR_02B6; |
|
247 } |
161 } |
248 |
162 |
249 static void DrawShipEngineInfo(EngineID engine, int x, int y, int maxw) |
163 static void DrawShipEngineInfo(EngineID engine, int x, int y, int maxw) |
250 { |
164 { |
251 const ShipVehicleInfo *svi = ShipVehInfo(engine); |
165 const ShipVehicleInfo *svi = ShipVehInfo(engine); |
255 SetDParam(3, svi->capacity); |
169 SetDParam(3, svi->capacity); |
256 SetDParam(4, svi->running_cost * _price.ship_running >> 8); |
170 SetDParam(4, svi->running_cost * _price.ship_running >> 8); |
257 DrawStringMultiCenter(x, y, STR_982E_COST_MAX_SPEED_CAPACITY, maxw); |
171 DrawStringMultiCenter(x, y, STR_982E_COST_MAX_SPEED_CAPACITY, maxw); |
258 } |
172 } |
259 |
173 |
260 void DrawNewsNewShipAvail(Window *w) |
174 StringID GetNewsStringNewVehicleAvail(const NewsItem *ni) |
261 { |
175 { |
262 EngineID engine; |
176 EngineID engine = ni->string_id; |
|
177 SetDParam(0, GetEngineCategoryName(engine)); |
|
178 SetDParam(1, GetCustomEngineName(engine)); |
|
179 return STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE; |
|
180 } |
|
181 |
|
182 void DrawNewsNewVehicleAvail(Window *w) |
|
183 { |
|
184 EngineID engine = WP(w, news_d).ni->string_id; |
|
185 const DrawEngineInfo *dei = &_draw_engine_list[GetEngine(engine)->type]; |
263 |
186 |
264 DrawNewsBorder(w); |
187 DrawNewsBorder(w); |
265 |
188 |
266 engine = WP(w,news_d).ni->string_id; |
189 SetDParam(0, GetEngineCategoryName(engine)); |
267 |
190 DrawStringMultiCenter(w->width >> 1, 20, STR_NEW_VEHICLE_NOW_AVAILABLE, w->width - 2); |
268 DrawStringMultiCenter(w->width >> 1, 20, STR_982C_NEW_SHIP_NOW_AVAILABLE, w->width - 2); |
191 |
269 GfxFillRect(25, 56, w->width - 25, w->height - 2, 10); |
192 GfxFillRect(25, 56, w->width - 25, w->height - 2, 10); |
270 |
193 |
271 SetDParam(0, GetCustomEngineName(engine)); |
194 SetDParam(0, GetCustomEngineName(engine)); |
272 DrawStringMultiCenter(w->width >> 1, 57, STR_982D, w->width - 2); |
195 DrawStringMultiCenter(w->width >> 1, 57, STR_NEW_VEHICLE_TYPE, w->width - 2); |
273 |
196 |
274 DrawShipEngine(w->width >> 1, 93, engine, 0); |
197 dei->engine_proc(w->width >> 1, 88, engine, 0); |
275 GfxFillRect(25, 56, w->width - 56, 110, 0x323 | USE_COLORTABLE); |
198 GfxFillRect(25, 56, w->width - 56, 112, 0x323 | USE_COLORTABLE); |
276 DrawShipEngineInfo(engine, w->width >> 1, 131, w->width - 52); |
199 dei->info_proc(engine, w->width >> 1, 129, w->width - 52); |
277 } |
200 } |
278 |
|
279 StringID GetNewsStringNewShipAvail(const NewsItem *ni) |
|
280 { |
|
281 EngineID engine = ni->string_id; |
|
282 SetDParam(0, STR_982C_NEW_SHIP_NOW_AVAILABLE); |
|
283 SetDParam(1, GetCustomEngineName(engine)); |
|
284 return STR_02B6; |
|
285 } |
|