From ffed3c7f1cd43e1e3f89cc3b6cc9e8e3e4b3c09d Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 15 Apr 2025 19:30:42 +0100 Subject: [PATCH 1/2] Change: Don't replace stripped control codes with '?' for scripts. --- src/script/api/script_basestation.cpp | 2 +- src/script/api/script_bridge.cpp | 2 +- src/script/api/script_cargo.cpp | 2 +- src/script/api/script_company.cpp | 4 ++-- src/script/api/script_engine.cpp | 2 +- src/script/api/script_event_types.cpp | 2 +- src/script/api/script_group.cpp | 2 +- src/script/api/script_industry.cpp | 2 +- src/script/api/script_industrytype.cpp | 2 +- src/script/api/script_objecttype.cpp | 2 +- src/script/api/script_rail.cpp | 2 +- src/script/api/script_road.cpp | 2 +- src/script/api/script_sign.cpp | 2 +- src/script/api/script_town.cpp | 2 +- src/script/api/script_vehicle.cpp | 2 +- 15 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/script/api/script_basestation.cpp b/src/script/api/script_basestation.cpp index 91ff72e152..26a4ca9b45 100644 --- a/src/script/api/script_basestation.cpp +++ b/src/script/api/script_basestation.cpp @@ -32,7 +32,7 @@ { 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) diff --git a/src/script/api/script_bridge.cpp b/src/script/api/script_bridge.cpp index eaf7b8325c..97bd0637f0 100644 --- a/src/script/api/script_bridge.cpp +++ b/src/script/api/script_bridge.cpp @@ -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); 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) diff --git a/src/script/api/script_cargo.cpp b/src/script/api/script_cargo.cpp index 63c86a7695..d38ff9300a 100644 --- a/src/script/api/script_cargo.cpp +++ b/src/script/api/script_cargo.cpp @@ -32,7 +32,7 @@ { 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 ScriptCargo::GetCargoLabel(CargoType cargo_type) diff --git a/src/script/api/script_company.cpp b/src/script/api/script_company.cpp index 577a9a96a2..9def32f0d8 100644 --- a/src/script/api/script_company.cpp +++ b/src/script/api/script_company.cpp @@ -78,7 +78,7 @@ company = ResolveCompanyID(company); 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) @@ -99,7 +99,7 @@ company = ResolveCompanyID(company); 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) diff --git a/src/script/api/script_engine.cpp b/src/script/api/script_engine.cpp index f13cf5654b..e7cf0a025a 100644 --- a/src/script/api/script_engine.cpp +++ b/src/script/api/script_engine.cpp @@ -47,7 +47,7 @@ { 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) diff --git a/src/script/api/script_event_types.cpp b/src/script/api/script_event_types.cpp index 541e124e38..973339675e 100644 --- a/src/script/api/script_event_types.cpp +++ b/src/script/api/script_event_types.cpp @@ -34,7 +34,7 @@ std::optional ScriptEventEnginePreview::GetName() { 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() diff --git a/src/script/api/script_group.cpp b/src/script/api/script_group.cpp index 352e78b28f..486032cd70 100644 --- a/src/script/api/script_group.cpp +++ b/src/script/api/script_group.cpp @@ -73,7 +73,7 @@ { 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) diff --git a/src/script/api/script_industry.cpp b/src/script/api/script_industry.cpp index b04e5a47a9..dfaccb8b40 100644 --- a/src/script/api/script_industry.cpp +++ b/src/script/api/script_industry.cpp @@ -46,7 +46,7 @@ { 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) diff --git a/src/script/api/script_industrytype.cpp b/src/script/api/script_industrytype.cpp index b6a89e86b5..5a6929deec 100644 --- a/src/script/api/script_industrytype.cpp +++ b/src/script/api/script_industrytype.cpp @@ -61,7 +61,7 @@ { 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) diff --git a/src/script/api/script_objecttype.cpp b/src/script/api/script_objecttype.cpp index a0a7ee6e51..82303b331c 100644 --- a/src/script/api/script_objecttype.cpp +++ b/src/script/api/script_objecttype.cpp @@ -28,7 +28,7 @@ { 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) diff --git a/src/script/api/script_rail.cpp b/src/script/api/script_rail.cpp index a1edc6c510..85982b8e5c 100644 --- a/src/script/api/script_rail.cpp +++ b/src/script/api/script_rail.cpp @@ -28,7 +28,7 @@ { 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) diff --git a/src/script/api/script_road.cpp b/src/script/api/script_road.cpp index b6a3cceb14..1a689f8647 100644 --- a/src/script/api/script_road.cpp +++ b/src/script/api/script_road.cpp @@ -30,7 +30,7 @@ { 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) diff --git a/src/script/api/script_sign.cpp b/src/script/api/script_sign.cpp index ea4cfddbb6..10f73adc1f 100644 --- a/src/script/api/script_sign.cpp +++ b/src/script/api/script_sign.cpp @@ -52,7 +52,7 @@ { 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) diff --git a/src/script/api/script_town.cpp b/src/script/api/script_town.cpp index 832851571b..e4e0c12623 100644 --- a/src/script/api/script_town.cpp +++ b/src/script/api/script_town.cpp @@ -37,7 +37,7 @@ { 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) diff --git a/src/script/api/script_vehicle.cpp b/src/script/api/script_vehicle.cpp index 0f491fb966..ccc869fcdc 100644 --- a/src/script/api/script_vehicle.cpp +++ b/src/script/api/script_vehicle.cpp @@ -304,7 +304,7 @@ { 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) From b96da4d7a0e06db19a4ac774a213ab2973e482b2 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 15 Apr 2025 18:57:44 +0100 Subject: [PATCH 2/2] 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. --- src/lang/english.txt | 18 +++++++++--------- src/strings.cpp | 5 +++++ 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/lang/english.txt b/src/lang/english.txt index 811c38810f..400560ea91 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1226,7 +1226,7 @@ STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}Expand a STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}Collapse all STR_CONFIG_SETTING_RESET_ALL :{BLACK}Reset all values 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_TYPE :{LTBLUE}Setting type: {ORANGE}{STRING} 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 # 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_POWERED_WAGON :{WHITE}It changed powered-wagon state for '{PUSH_COLOUR}{1:ENGINE}{POP_COLOUR}' 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_CAPACITY :{WHITE}It changed vehicle capacity for '{PUSH_COLOUR}{1:ENGINE}{POP_COLOUR}' when not inside a depot or refitting +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 '{1:ENGINE}' 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 '{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_NEWGRF_BUGGY :{WHITE}NewGRF '{PUSH_COLOUR}{0:RAW_STRING}{POP_COLOUR}' 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_ENDLESS_PRODUCTION_CALLBACK :{WHITE}'{PUSH_COLOUR}{1:STRING}{POP_COLOUR}' caused an endless loop in the production callback +STR_NEWGRF_BUGGY :{WHITE}NewGRF '{0:RAW_STRING}' provides incorrect information +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}'{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_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 STR_NEWGRF_INVALID_CARGO : diff --git a/src/strings.cpp b/src/strings.cpp index d0d65f9d40..7442aeb7bf 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -1091,6 +1091,9 @@ static void FormatString(StringBuilder &builder, std::string_view str_arg, Strin std::stack> str_stack; str_stack.emplace(str_arg, orig_first_param_offset, orig_case_index); + bool appending = builder.AnyBytesWritten(); + if (appending) builder.PutUtf8(SCC_PUSH_COLOUR); + for (;;) { try { 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)"; } } + + if (appending) builder.PutUtf8(SCC_POP_COLOUR); }