src/engine_gui.cpp
changeset 6209 3a1a90cd67f3
parent 6208 e1f3320d2410
child 6248 e4a2ed7e5613
equal deleted inserted replaced
6208:e1f3320d2410 6209:3a1a90cd67f3
    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 }