Changeset - r23571:154370618e18
[Not reviewed]
master
0 3 0
PeterN - 5 years ago 2019-03-31 01:05:23
peter@fuzzle.org
Change: Shorten engine rail type drop down in autoreplace window. (#7448)

In the autoreplace window, the rail type drop down is for choosing engines
of the given time. Many rail types do not have engines specifically designed for them,
and are merely compatible with other rail types. This list is thus unwieldy and many
options have no engines available.

As this drop down is for choosing _engine_ rail type rather than compatible rail types,
we can list just the rail types explicitly listed by engines.
3 files changed with 53 insertions and 17 deletions:
0 comments (0 inline, 0 general)
src/rail.cpp
Show inline comments
 
@@ -262,13 +262,14 @@ RailTypes AddDateIntroducedRailTypes(Rai
 
/**
 
 * Get the rail types the given company can build.
 
 * @param company the company to get the rail types for.
 
 * @param introduces If true, include rail types introduced by other rail types
 
 * @return the rail types.
 
 */
 
RailTypes GetCompanyRailtypes(CompanyID company)
 
RailTypes GetCompanyRailtypes(CompanyID company, bool introduces)
 
{
 
	RailTypes rts = RAILTYPES_NONE;
 

	
 
	Engine *e;
 
	const Engine *e;
 
	FOR_ALL_ENGINES_OF_TYPE(e, VEH_TRAIN) {
 
		const EngineInfo *ei = &e->info;
 

	
 
@@ -278,12 +279,46 @@ RailTypes GetCompanyRailtypes(CompanyID 
 

	
 
			if (rvi->railveh_type != RAILVEH_WAGON) {
 
				assert(rvi->railtype < RAILTYPE_END);
 
				rts |= GetRailTypeInfo(rvi->railtype)->introduces_railtypes;
 
				if (introduces) {
 
					rts |= GetRailTypeInfo(rvi->railtype)->introduces_railtypes;
 
				} else {
 
					SetBit(rts, rvi->railtype);
 
				}
 
			}
 
		}
 
	}
 

	
 
	return AddDateIntroducedRailTypes(rts, _date);
 
	if (introduces) return AddDateIntroducedRailTypes(rts, _date);
 
	return rts;
 
}
 

	
 
/**
 
 * Get list of rail types, regardless of company availability.
 
 * @param introduces If true, include rail types introduced by other rail types
 
 * @return the rail types.
 
 */
 
RailTypes GetRailTypes(bool introduces)
 
{
 
	RailTypes rts = RAILTYPES_NONE;
 

	
 
	const Engine *e;
 
	FOR_ALL_ENGINES_OF_TYPE(e, VEH_TRAIN) {
 
		const EngineInfo *ei = &e->info;
 
		if (!HasBit(ei->climates, _settings_game.game_creation.landscape)) continue;
 

	
 
		const RailVehicleInfo *rvi = &e->u.rail;
 
		if (rvi->railveh_type != RAILVEH_WAGON) {
 
			assert(rvi->railtype < RAILTYPE_END);
 
			if (introduces) {
 
				rts |= GetRailTypeInfo(rvi->railtype)->introduces_railtypes;
 
			} else {
 
				SetBit(rts, rvi->railtype);
 
			}
 
		}
 
	}
 

	
 
	if (introduces) return AddDateIntroducedRailTypes(rts, MAX_DAY);
 
	return rts;
 
}
 

	
 
/**
src/rail.h
Show inline comments
 
@@ -455,7 +455,8 @@ bool ValParamRailtype(const RailType rai
 
RailTypes AddDateIntroducedRailTypes(RailTypes current, Date date);
 

	
 
RailType GetBestRailtype(const CompanyID company);
 
RailTypes GetCompanyRailtypes(const CompanyID c);
 
RailTypes GetCompanyRailtypes(CompanyID company, bool introduces = true);
 
RailTypes GetRailTypes(bool introduces);
 

	
 
RailType GetRailTypeByLabel(RailTypeLabel label, bool allow_alternate_labels = true);
 

	
src/rail_gui.cpp
Show inline comments
 
@@ -1989,20 +1989,20 @@ void InitializeRailGUI()
 
 */
 
DropDownList *GetRailTypeDropDownList(bool for_replacement, bool all_option)
 
{
 
	RailTypes used_railtypes = RAILTYPES_NONE;
 
	RailTypes used_railtypes;
 
	RailTypes avail_railtypes;
 

	
 
	const Company *c = Company::Get(_local_company);
 

	
 
	/* Find the used railtypes. */
 
	Engine *e;
 
	FOR_ALL_ENGINES_OF_TYPE(e, VEH_TRAIN) {
 
		if (!HasBit(e->info.climates, _settings_game.game_creation.landscape)) continue;
 

	
 
		used_railtypes |= GetRailTypeInfo(e->u.rail.railtype)->introduces_railtypes;
 
	if (for_replacement) {
 
		avail_railtypes = GetCompanyRailtypes(c->index, false);
 
		used_railtypes  = GetRailTypes(false);
 
	} else {
 
		avail_railtypes = c->avail_railtypes;
 
		used_railtypes  = GetRailTypes(true);
 
	}
 

	
 
	/* Get the date introduced railtypes as well. */
 
	used_railtypes = AddDateIntroducedRailTypes(used_railtypes, MAX_DAY);
 

	
 
	const Company *c = Company::Get(_local_company);
 
	DropDownList *list = new DropDownList();
 

	
 
	if (all_option) {
 
@@ -2030,9 +2030,9 @@ DropDownList *GetRailTypeDropDownList(bo
 
		StringID str = for_replacement ? rti->strings.replace_text : (rti->max_speed > 0 ? STR_TOOLBAR_RAILTYPE_VELOCITY : STR_JUST_STRING);
 
		DropDownListParamStringItem *item;
 
		if (for_replacement) {
 
			item = new DropDownListParamStringItem(str, rt, !HasBit(c->avail_railtypes, rt));
 
			item = new DropDownListParamStringItem(str, rt, !HasBit(avail_railtypes, rt));
 
		} else {
 
			DropDownListIconItem *iconitem = new DropDownListIconItem(rti->gui_sprites.build_x_rail, PAL_NONE, str, rt, !HasBit(c->avail_railtypes, rt));
 
			DropDownListIconItem *iconitem = new DropDownListIconItem(rti->gui_sprites.build_x_rail, PAL_NONE, str, rt, !HasBit(avail_railtypes, rt));
 
			iconitem->SetDimension(d);
 
			item = iconitem;
 
		}
0 comments (0 inline, 0 general)