1
0
Fork 0

Compare commits

...

2 Commits

Author SHA1 Message Date
Peter Nelson b96da4d7a0
Change: Automatically push/pop colours when formatting a sub-string.
Reverts 226a44bf86.

This universally prevents the sub-string from changing colours in the outer string.
2025-04-15 19:31:09 +01:00
Peter Nelson ffed3c7f1c
Change: Don't replace stripped control codes with '?' for scripts. 2025-04-15 19:31:08 +01:00
17 changed files with 30 additions and 25 deletions

View File

@ -1226,7 +1226,7 @@ STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}Expand a
STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}Collapse all STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}Collapse all
STR_CONFIG_SETTING_RESET_ALL :{BLACK}Reset all values STR_CONFIG_SETTING_RESET_ALL :{BLACK}Reset all values
STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT :(no explanation available) STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT :(no explanation available)
STR_CONFIG_SETTING_VALUE :{PUSH_COLOUR}{ORANGE}{STRING1}{POP_COLOUR} STR_CONFIG_SETTING_VALUE :{ORANGE}{STRING1}
STR_CONFIG_SETTING_DEFAULT_VALUE :{LTBLUE}Default value: {ORANGE}{STRING1} STR_CONFIG_SETTING_DEFAULT_VALUE :{LTBLUE}Default value: {ORANGE}{STRING1}
STR_CONFIG_SETTING_TYPE :{LTBLUE}Setting type: {ORANGE}{STRING} STR_CONFIG_SETTING_TYPE :{LTBLUE}Setting type: {ORANGE}{STRING}
STR_CONFIG_SETTING_TYPE_CLIENT :Client setting (not stored in saves; affects all games) STR_CONFIG_SETTING_TYPE_CLIENT :Client setting (not stored in saves; affects all games)
@ -3631,17 +3631,17 @@ STR_NEWGRF_LIST_COMPATIBLE :{YELLOW}Found c
STR_NEWGRF_LIST_MISSING :{RED}Missing files STR_NEWGRF_LIST_MISSING :{RED}Missing files
# NewGRF 'it's broken' warnings # NewGRF 'it's broken' warnings
STR_NEWGRF_BROKEN :{WHITE}Behaviour of NewGRF '{PUSH_COLOUR}{0:RAW_STRING}{POP_COLOUR}' is likely to cause desyncs and/or crashes STR_NEWGRF_BROKEN :{WHITE}Behaviour of NewGRF '{0:RAW_STRING}' is likely to cause desyncs and/or crashes
STR_NEWGRF_BROKEN_POWERED_WAGON :{WHITE}It changed powered-wagon state for '{PUSH_COLOUR}{1:ENGINE}{POP_COLOUR}' when not inside a depot STR_NEWGRF_BROKEN_POWERED_WAGON :{WHITE}It changed powered-wagon state for '{1:ENGINE}' when not inside a depot
STR_NEWGRF_BROKEN_VEHICLE_LENGTH :{WHITE}It changed vehicle length for '{PUSH_COLOUR}{1:ENGINE}{POP_COLOUR}' when not inside a depot STR_NEWGRF_BROKEN_VEHICLE_LENGTH :{WHITE}It changed vehicle length for '{1:ENGINE}' when not inside a depot
STR_NEWGRF_BROKEN_CAPACITY :{WHITE}It changed vehicle capacity for '{PUSH_COLOUR}{1:ENGINE}{POP_COLOUR}' when not inside a depot or refitting STR_NEWGRF_BROKEN_CAPACITY :{WHITE}It changed vehicle capacity for '{1:ENGINE}' when not inside a depot or refitting
STR_BROKEN_VEHICLE_LENGTH :{WHITE}Train '{VEHICLE}' belonging to '{COMPANY}' has invalid length. It is probably caused by problems with NewGRFs. Game may desync or crash STR_BROKEN_VEHICLE_LENGTH :{WHITE}Train '{VEHICLE}' belonging to '{COMPANY}' has invalid length. It is probably caused by problems with NewGRFs. Game may desync or crash
STR_NEWGRF_BUGGY :{WHITE}NewGRF '{PUSH_COLOUR}{0:RAW_STRING}{POP_COLOUR}' provides incorrect information STR_NEWGRF_BUGGY :{WHITE}NewGRF '{0:RAW_STRING}' provides incorrect information
STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Cargo/refit information for '{PUSH_COLOUR}{1:ENGINE}{POP_COLOUR}' differs from purchase list after construction. This might cause autorenew/-replace to fail refitting correctly STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Cargo/refit information for '{1:ENGINE}' differs from purchase list after construction. This might cause autorenew/-replace to fail refitting correctly
STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}'{PUSH_COLOUR}{1:STRING}{POP_COLOUR}' caused an endless loop in the production callback STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' caused an endless loop in the production callback
STR_NEWGRF_BUGGY_UNKNOWN_CALLBACK_RESULT :{WHITE}Callback {1:HEX} returned unknown/invalid result {2:HEX} STR_NEWGRF_BUGGY_UNKNOWN_CALLBACK_RESULT :{WHITE}Callback {1:HEX} returned unknown/invalid result {2:HEX}
STR_NEWGRF_BUGGY_INVALID_CARGO_PRODUCTION_CALLBACK :{WHITE}'{PUSH_COLOUR}{1:STRING}{POP_COLOUR}' returned invalid cargo type in the production callback at {2:HEX} STR_NEWGRF_BUGGY_INVALID_CARGO_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' returned invalid cargo type in the production callback at {2:HEX}
# 'User removed essential NewGRFs'-placeholders for stuff without specs # 'User removed essential NewGRFs'-placeholders for stuff without specs
STR_NEWGRF_INVALID_CARGO :<invalid cargo> STR_NEWGRF_INVALID_CARGO :<invalid cargo>

View File

@ -32,7 +32,7 @@
{ {
if (!IsValidBaseStation(station_id)) return std::nullopt; if (!IsValidBaseStation(station_id)) return std::nullopt;
return ::StrMakeValid(::GetString(::Station::IsValidID(station_id) ? STR_STATION_NAME : STR_WAYPOINT_NAME, station_id)); return ::StrMakeValid(::GetString(::Station::IsValidID(station_id) ? STR_STATION_NAME : STR_WAYPOINT_NAME, station_id), {});
} }
/* static */ bool ScriptBaseStation::SetName(StationID station_id, Text *name) /* static */ bool ScriptBaseStation::SetName(StationID station_id, Text *name)

View File

@ -135,7 +135,7 @@ static void _DoCommandReturnBuildBridge1(class ScriptInstance *instance)
EnforcePrecondition(std::nullopt, vehicle_type == ScriptVehicle::VT_ROAD || vehicle_type == ScriptVehicle::VT_RAIL || vehicle_type == ScriptVehicle::VT_WATER); EnforcePrecondition(std::nullopt, vehicle_type == ScriptVehicle::VT_ROAD || vehicle_type == ScriptVehicle::VT_RAIL || vehicle_type == ScriptVehicle::VT_WATER);
if (!IsValidBridge(bridge_type)) return std::nullopt; if (!IsValidBridge(bridge_type)) return std::nullopt;
return ::StrMakeValid(::GetString(vehicle_type == ScriptVehicle::VT_WATER ? STR_LAI_BRIDGE_DESCRIPTION_AQUEDUCT : ::GetBridgeSpec(bridge_type)->transport_name[vehicle_type])); return ::StrMakeValid(::GetString(vehicle_type == ScriptVehicle::VT_WATER ? STR_LAI_BRIDGE_DESCRIPTION_AQUEDUCT : ::GetBridgeSpec(bridge_type)->transport_name[vehicle_type]), {});
} }
/* static */ SQInteger ScriptBridge::GetMaxSpeed(BridgeType bridge_type) /* static */ SQInteger ScriptBridge::GetMaxSpeed(BridgeType bridge_type)

View File

@ -32,7 +32,7 @@
{ {
if (!IsValidCargo(cargo_type)) return std::nullopt; if (!IsValidCargo(cargo_type)) return std::nullopt;
return ::StrMakeValid(::GetString(STR_JUST_CARGO_LIST, 1ULL << cargo_type)); return ::StrMakeValid(::GetString(STR_JUST_CARGO_LIST, 1ULL << cargo_type), {});
} }
/* static */ std::optional<std::string> ScriptCargo::GetCargoLabel(CargoType cargo_type) /* static */ std::optional<std::string> ScriptCargo::GetCargoLabel(CargoType cargo_type)

View File

@ -78,7 +78,7 @@
company = ResolveCompanyID(company); company = ResolveCompanyID(company);
if (company == ScriptCompany::COMPANY_INVALID) return std::nullopt; if (company == ScriptCompany::COMPANY_INVALID) return std::nullopt;
return ::StrMakeValid(::GetString(STR_COMPANY_NAME, ScriptCompany::FromScriptCompanyID(company))); return ::StrMakeValid(::GetString(STR_COMPANY_NAME, ScriptCompany::FromScriptCompanyID(company)), {});
} }
/* static */ bool ScriptCompany::SetPresidentName(Text *name) /* static */ bool ScriptCompany::SetPresidentName(Text *name)
@ -99,7 +99,7 @@
company = ResolveCompanyID(company); company = ResolveCompanyID(company);
if (company == ScriptCompany::COMPANY_INVALID) return std::nullopt; if (company == ScriptCompany::COMPANY_INVALID) return std::nullopt;
return ::StrMakeValid(::GetString(STR_PRESIDENT_NAME, ScriptCompany::FromScriptCompanyID(company))); return ::StrMakeValid(::GetString(STR_PRESIDENT_NAME, ScriptCompany::FromScriptCompanyID(company)), {});
} }
/* static */ bool ScriptCompany::SetPresidentGender(Gender gender) /* static */ bool ScriptCompany::SetPresidentGender(Gender gender)

View File

@ -47,7 +47,7 @@
{ {
if (!IsValidEngine(engine_id)) return std::nullopt; if (!IsValidEngine(engine_id)) return std::nullopt;
return ::StrMakeValid(::GetString(STR_ENGINE_NAME, engine_id)); return ::StrMakeValid(::GetString(STR_ENGINE_NAME, engine_id), {});
} }
/* static */ CargoType ScriptEngine::GetCargoType(EngineID engine_id) /* static */ CargoType ScriptEngine::GetCargoType(EngineID engine_id)

View File

@ -34,7 +34,7 @@ std::optional<std::string> ScriptEventEnginePreview::GetName()
{ {
if (!this->IsEngineValid()) return std::nullopt; if (!this->IsEngineValid()) return std::nullopt;
return ::StrMakeValid(::GetString(STR_ENGINE_NAME, this->engine)); return ::StrMakeValid(::GetString(STR_ENGINE_NAME, this->engine), {});
} }
CargoType ScriptEventEnginePreview::GetCargoType() CargoType ScriptEventEnginePreview::GetCargoType()

View File

@ -73,7 +73,7 @@
{ {
if (!IsValidGroup(group_id)) return std::nullopt; if (!IsValidGroup(group_id)) return std::nullopt;
return ::StrMakeValid(::GetString(STR_GROUP_NAME, group_id)); return ::StrMakeValid(::GetString(STR_GROUP_NAME, group_id), {});
} }
/* static */ bool ScriptGroup::SetParent(GroupID group_id, GroupID parent_group_id) /* static */ bool ScriptGroup::SetParent(GroupID group_id, GroupID parent_group_id)

View File

@ -46,7 +46,7 @@
{ {
if (!IsValidIndustry(industry_id)) return std::nullopt; if (!IsValidIndustry(industry_id)) return std::nullopt;
return ::StrMakeValid(::GetString(STR_INDUSTRY_NAME, industry_id)); return ::StrMakeValid(::GetString(STR_INDUSTRY_NAME, industry_id), {});
} }
/* static */ ScriptDate::Date ScriptIndustry::GetConstructionDate(IndustryID industry_id) /* static */ ScriptDate::Date ScriptIndustry::GetConstructionDate(IndustryID industry_id)

View File

@ -61,7 +61,7 @@
{ {
if (!IsValidIndustryType(industry_type)) return std::nullopt; if (!IsValidIndustryType(industry_type)) return std::nullopt;
return ::StrMakeValid(::GetString(::GetIndustrySpec(industry_type)->name)); return ::StrMakeValid(::GetString(::GetIndustrySpec(industry_type)->name), {});
} }
/* static */ ScriptList *ScriptIndustryType::GetProducedCargo(IndustryType industry_type) /* static */ ScriptList *ScriptIndustryType::GetProducedCargo(IndustryType industry_type)

View File

@ -28,7 +28,7 @@
{ {
EnforcePrecondition(std::nullopt, IsValidObjectType(object_type)); EnforcePrecondition(std::nullopt, IsValidObjectType(object_type));
return ::StrMakeValid(::GetString(ObjectSpec::Get(object_type)->name)); return ::StrMakeValid(::GetString(ObjectSpec::Get(object_type)->name), {});
} }
/* static */ SQInteger ScriptObjectType::GetViews(ObjectType object_type) /* static */ SQInteger ScriptObjectType::GetViews(ObjectType object_type)

View File

@ -28,7 +28,7 @@
{ {
if (!IsRailTypeAvailable(rail_type)) return std::nullopt; if (!IsRailTypeAvailable(rail_type)) return std::nullopt;
return ::StrMakeValid(::GetString(GetRailTypeInfo((::RailType)rail_type)->strings.menu_text)); return ::StrMakeValid(::GetString(GetRailTypeInfo((::RailType)rail_type)->strings.menu_text), {});
} }
/* static */ bool ScriptRail::IsRailTile(TileIndex tile) /* static */ bool ScriptRail::IsRailTile(TileIndex tile)

View File

@ -30,7 +30,7 @@
{ {
if (!IsRoadTypeAvailable(road_type)) return std::nullopt; if (!IsRoadTypeAvailable(road_type)) return std::nullopt;
return ::StrMakeValid(::GetString(GetRoadTypeInfo((::RoadType)road_type)->strings.name)); return ::StrMakeValid(::GetString(GetRoadTypeInfo((::RoadType)road_type)->strings.name), {});
} }
/* static */ bool ScriptRoad::IsRoadTile(TileIndex tile) /* static */ bool ScriptRoad::IsRoadTile(TileIndex tile)

View File

@ -52,7 +52,7 @@
{ {
if (!IsValidSign(sign_id)) return std::nullopt; if (!IsValidSign(sign_id)) return std::nullopt;
return ::StrMakeValid(::GetString(STR_SIGN_NAME, sign_id)); return ::StrMakeValid(::GetString(STR_SIGN_NAME, sign_id), {});
} }
/* static */ TileIndex ScriptSign::GetLocation(SignID sign_id) /* static */ TileIndex ScriptSign::GetLocation(SignID sign_id)

View File

@ -37,7 +37,7 @@
{ {
if (!IsValidTown(town_id)) return std::nullopt; if (!IsValidTown(town_id)) return std::nullopt;
return ::StrMakeValid(::GetString(STR_TOWN_NAME, town_id)); return ::StrMakeValid(::GetString(STR_TOWN_NAME, town_id), {});
} }
/* static */ bool ScriptTown::SetName(TownID town_id, Text *name) /* static */ bool ScriptTown::SetName(TownID town_id, Text *name)

View File

@ -304,7 +304,7 @@
{ {
if (!IsPrimaryVehicle(vehicle_id)) return std::nullopt; if (!IsPrimaryVehicle(vehicle_id)) return std::nullopt;
return ::StrMakeValid(::GetString(STR_VEHICLE_NAME, vehicle_id)); return ::StrMakeValid(::GetString(STR_VEHICLE_NAME, vehicle_id), {});
} }
/* static */ SQInteger ScriptVehicle::GetAge(VehicleID vehicle_id) /* static */ SQInteger ScriptVehicle::GetAge(VehicleID vehicle_id)

View File

@ -1091,6 +1091,9 @@ static void FormatString(StringBuilder &builder, std::string_view str_arg, Strin
std::stack<StrStackItem, std::vector<StrStackItem>> str_stack; std::stack<StrStackItem, std::vector<StrStackItem>> str_stack;
str_stack.emplace(str_arg, orig_first_param_offset, orig_case_index); str_stack.emplace(str_arg, orig_first_param_offset, orig_case_index);
bool appending = builder.AnyBytesWritten();
if (appending) builder.PutUtf8(SCC_PUSH_COLOUR);
for (;;) { for (;;) {
try { try {
while (!str_stack.empty() && !str_stack.top().consumer.AnyBytesLeft()) { while (!str_stack.empty() && !str_stack.top().consumer.AnyBytesLeft()) {
@ -1802,6 +1805,8 @@ static void FormatString(StringBuilder &builder, std::string_view str_arg, Strin
builder += "(invalid parameter)"; builder += "(invalid parameter)";
} }
} }
if (appending) builder.PutUtf8(SCC_POP_COLOUR);
} }