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