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 OldWidget _engine_preview_widgets[] = { |
39 static const OldWidget _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(BaseWindow *w, WindowEvent *e) |
68 static void EnginePreviewWndProc(BaseWindow *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(BaseWindow *w) |
|
146 { |
|
147 int width = w->Width(); |
|
148 EngineID engine; |
|
149 |
|
150 DrawNewsBorder(w); |
|
151 |
|
152 engine = WP(w,news_d).ni->string_id; |
|
153 SetDParam(0, GetEngineCategoryName(engine)); |
|
154 DrawStringMultiCenter(width >> 1, 20, STR_8859_NEW_NOW_AVAILABLE, width - 2); |
|
155 |
|
156 GfxFillRect(25, 56, width - 25, w->Height() - 2, 10); |
|
157 |
|
158 SetDParam(0, GetCustomEngineName(engine)); |
|
159 DrawStringMultiCenter(width >> 1, 57, STR_885A, width - 2); |
|
160 |
|
161 DrawTrainEngine(width >> 1, 88, engine, 0); |
|
162 GfxFillRect(25, 56, width - 56, 112, PALETTE_TO_STRUCT_GREY | (1 << USE_COLORTABLE)); |
|
163 DrawTrainEngineInfo(engine, width >> 1, 129, width - 52); |
|
164 } |
|
165 |
|
166 StringID GetNewsStringNewTrainAvail(const NewsItem *ni) |
|
167 { |
|
168 EngineID engine = ni->string_id; |
|
169 SetDParam(0, STR_8859_NEW_NOW_AVAILABLE); |
|
170 SetDParam(1, GetEngineCategoryName(engine)); |
|
171 SetDParam(2, GetCustomEngineName(engine)); |
|
172 return STR_02B6; |
|
173 } |
|
174 |
|
175 static void DrawAircraftEngineInfo(EngineID engine, int x, int y, int maxw) |
139 static void DrawAircraftEngineInfo(EngineID engine, int x, int y, int maxw) |
176 { |
140 { |
177 const AircraftVehicleInfo *avi = AircraftVehInfo(engine); |
141 const AircraftVehicleInfo *avi = AircraftVehInfo(engine); |
178 SetDParam(0, (_price.aircraft_base >> 3) * avi->base_cost >> 5); |
142 SetDParam(0, (_price.aircraft_base >> 3) * avi->base_cost >> 5); |
179 SetDParam(1, avi->max_speed * 8); |
143 SetDParam(1, avi->max_speed); |
180 SetDParam(2, avi->passenger_capacity); |
144 SetDParam(2, avi->passenger_capacity); |
181 SetDParam(3, avi->mail_capacity); |
145 SetDParam(3, avi->mail_capacity); |
182 SetDParam(4, avi->running_cost * _price.aircraft_running >> 8); |
146 SetDParam(4, avi->running_cost * _price.aircraft_running >> 8); |
183 |
147 |
184 DrawStringMultiCenter(x, y, STR_A02E_COST_MAX_SPEED_CAPACITY, maxw); |
148 DrawStringMultiCenter(x, y, STR_A02E_COST_MAX_SPEED_CAPACITY, maxw); |
185 } |
|
186 |
|
187 void DrawNewsNewAircraftAvail(BaseWindow *w) |
|
188 { |
|
189 int width = w->Width(); |
|
190 EngineID engine; |
|
191 |
|
192 DrawNewsBorder(w); |
|
193 |
|
194 engine = WP(w,news_d).ni->string_id; |
|
195 |
|
196 DrawStringMultiCenter(width >> 1, 20, STR_A02C_NEW_AIRCRAFT_NOW_AVAILABLE, width - 2); |
|
197 GfxFillRect(25, 56, width - 25, w->Height() - 2, 10); |
|
198 |
|
199 SetDParam(0, GetCustomEngineName(engine)); |
|
200 DrawStringMultiCenter(width >> 1, 57, STR_A02D, width - 2); |
|
201 |
|
202 DrawAircraftEngine(width >> 1, 93, engine, 0); |
|
203 GfxFillRect(25, 56, width - 56, 110, PALETTE_TO_STRUCT_GREY | (1 << USE_COLORTABLE)); |
|
204 DrawAircraftEngineInfo(engine, width >> 1, 131, width - 52); |
|
205 } |
|
206 |
|
207 StringID GetNewsStringNewAircraftAvail(const NewsItem *ni) |
|
208 { |
|
209 EngineID engine = ni->string_id; |
|
210 SetDParam(0, STR_A02C_NEW_AIRCRAFT_NOW_AVAILABLE); |
|
211 SetDParam(1, GetCustomEngineName(engine)); |
|
212 return STR_02B6; |
|
213 } |
149 } |
214 |
150 |
215 static void DrawRoadVehEngineInfo(EngineID engine, int x, int y, int maxw) |
151 static void DrawRoadVehEngineInfo(EngineID engine, int x, int y, int maxw) |
216 { |
152 { |
217 const RoadVehicleInfo *rvi = RoadVehInfo(engine); |
153 const RoadVehicleInfo *rvi = RoadVehInfo(engine); |
221 SetDParam(2, rvi->running_cost * _price.roadveh_running >> 8); |
157 SetDParam(2, rvi->running_cost * _price.roadveh_running >> 8); |
222 SetDParam(3, rvi->cargo_type); |
158 SetDParam(3, rvi->cargo_type); |
223 SetDParam(4, rvi->capacity); |
159 SetDParam(4, rvi->capacity); |
224 |
160 |
225 DrawStringMultiCenter(x, y, STR_902A_COST_SPEED_RUNNING_COST, maxw); |
161 DrawStringMultiCenter(x, y, STR_902A_COST_SPEED_RUNNING_COST, maxw); |
226 } |
|
227 |
|
228 void DrawNewsNewRoadVehAvail(BaseWindow *w) |
|
229 { |
|
230 int width = w->Width(); |
|
231 EngineID engine; |
|
232 |
|
233 DrawNewsBorder(w); |
|
234 |
|
235 engine = WP(w,news_d).ni->string_id; |
|
236 DrawStringMultiCenter(width >> 1, 20, STR_9028_NEW_ROAD_VEHICLE_NOW_AVAILABLE, width - 2); |
|
237 GfxFillRect(25, 56, width - 25, w->Height() - 2, 10); |
|
238 |
|
239 SetDParam(0, GetCustomEngineName(engine)); |
|
240 DrawStringMultiCenter(width >> 1, 57, STR_9029, width - 2); |
|
241 |
|
242 DrawRoadVehEngine(width >> 1, 88, engine, 0); |
|
243 GfxFillRect(25, 56, width - 56, 112, PALETTE_TO_STRUCT_GREY | (1 << USE_COLORTABLE)); |
|
244 DrawRoadVehEngineInfo(engine, width >> 1, 129, width - 52); |
|
245 } |
|
246 |
|
247 StringID GetNewsStringNewRoadVehAvail(const NewsItem *ni) |
|
248 { |
|
249 EngineID engine = ni->string_id; |
|
250 SetDParam(0, STR_9028_NEW_ROAD_VEHICLE_NOW_AVAILABLE); |
|
251 SetDParam(1, GetCustomEngineName(engine)); |
|
252 return STR_02B6; |
|
253 } |
162 } |
254 |
163 |
255 static void DrawShipEngineInfo(EngineID engine, int x, int y, int maxw) |
164 static void DrawShipEngineInfo(EngineID engine, int x, int y, int maxw) |
256 { |
165 { |
257 const ShipVehicleInfo *svi = ShipVehInfo(engine); |
166 const ShipVehicleInfo *svi = ShipVehInfo(engine); |
261 SetDParam(3, svi->capacity); |
170 SetDParam(3, svi->capacity); |
262 SetDParam(4, svi->running_cost * _price.ship_running >> 8); |
171 SetDParam(4, svi->running_cost * _price.ship_running >> 8); |
263 DrawStringMultiCenter(x, y, STR_982E_COST_MAX_SPEED_CAPACITY, maxw); |
172 DrawStringMultiCenter(x, y, STR_982E_COST_MAX_SPEED_CAPACITY, maxw); |
264 } |
173 } |
265 |
174 |
266 void DrawNewsNewShipAvail(BaseWindow *w) |
175 |
267 { |
176 StringID GetNewsStringNewVehicleAvail(const NewsItem *ni) |
268 int width = w->Width(); |
177 { |
269 EngineID engine; |
178 EngineID engine = ni->string_id; |
270 |
179 SetDParam(0, GetEngineCategoryName(engine)); |
|
180 SetDParam(1, GetCustomEngineName(engine)); |
|
181 return STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE; |
|
182 } |
|
183 |
|
184 void DrawNewsNewVehicleAvail(BaseWindow *w) |
|
185 { |
271 DrawNewsBorder(w); |
186 DrawNewsBorder(w); |
272 |
187 |
273 engine = WP(w,news_d).ni->string_id; |
188 EngineID engine = WP(w, news_d).ni->string_id; |
274 |
189 const DrawEngineInfo *dei = &_draw_engine_list[GetEngine(engine)->type]; |
275 DrawStringMultiCenter(width >> 1, 20, STR_982C_NEW_SHIP_NOW_AVAILABLE, width - 2); |
190 |
276 GfxFillRect(25, 56, width - 25, w->Height() - 2, 10); |
191 SetDParam(0, GetEngineCategoryName(engine)); |
|
192 DrawStringMultiCenter(w->Width() >> 1, 20, STR_NEW_VEHICLE_NOW_AVAILABLE, w->Width() - 2); |
|
193 |
|
194 GfxFillRect(25, 56, w->Width() - 25, w->Height() - 2, 10); |
277 |
195 |
278 SetDParam(0, GetCustomEngineName(engine)); |
196 SetDParam(0, GetCustomEngineName(engine)); |
279 DrawStringMultiCenter(width >> 1, 57, STR_982D, width - 2); |
197 DrawStringMultiCenter(w->Width() >> 1, 57, STR_NEW_VEHICLE_TYPE, w->Width() - 2); |
280 |
198 |
281 DrawShipEngine(width >> 1, 93, engine, 0); |
199 dei->engine_proc(w->Width() >> 1, 88, engine, 0); |
282 GfxFillRect(25, 56, 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)); |
283 DrawShipEngineInfo(engine, width >> 1, 131, width - 52); |
201 dei->info_proc(engine, w->Width() >> 1, 129, w->Width() - 52); |
284 } |
202 } |
285 |
|
286 StringID GetNewsStringNewShipAvail(const NewsItem *ni) |
|
287 { |
|
288 EngineID engine = ni->string_id; |
|
289 SetDParam(0, STR_982C_NEW_SHIP_NOW_AVAILABLE); |
|
290 SetDParam(1, GetCustomEngineName(engine)); |
|
291 return STR_02B6; |
|
292 } |
|