src/engine_gui.cpp
branchcpp_gui
changeset 6285 187e3ef04cc9
parent 6268 4b5241e5dd10
child 6298 c30fe89622df
equal deleted inserted replaced
6284:45d0233e7d79 6285:187e3ef04cc9
    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 }