mirror of https://github.com/OpenTTD/OpenTTD
Merge 0574fd767c
into 782cbe95d6
commit
169c6d004f
|
@ -276,7 +276,7 @@ struct AIConfigWindow : public Window {
|
||||||
|
|
||||||
case WID_AIC_CONTENT_DOWNLOAD:
|
case WID_AIC_CONTENT_DOWNLOAD:
|
||||||
if (!_network_available) {
|
if (!_network_available) {
|
||||||
ShowErrorMessage(STR_NETWORK_ERROR_NOTAVAILABLE, INVALID_STRING_ID, WL_ERROR);
|
ShowErrorMessage(STR_NETWORK_ERROR_NOTAVAILABLE, INVALID_STRING_ID, MakeParameters(), WL_ERROR);
|
||||||
} else {
|
} else {
|
||||||
ShowNetworkContentListWindow(nullptr, CONTENT_TYPE_AI);
|
ShowNetworkContentListWindow(nullptr, CONTENT_TYPE_AI);
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,7 +68,7 @@ void AIInstance::Died()
|
||||||
|
|
||||||
const AIInfo *info = AIConfig::GetConfig(_current_company, AIConfig::SSS_FORCE_GAME)->GetInfo();
|
const AIInfo *info = AIConfig::GetConfig(_current_company, AIConfig::SSS_FORCE_GAME)->GetInfo();
|
||||||
if (info != nullptr) {
|
if (info != nullptr) {
|
||||||
ShowErrorMessage(STR_ERROR_AI_PLEASE_REPORT_CRASH, INVALID_STRING_ID, WL_WARNING);
|
ShowErrorMessage(STR_ERROR_AI_PLEASE_REPORT_CRASH, INVALID_STRING_ID, MakeParameters(), WL_WARNING);
|
||||||
|
|
||||||
if (!info->GetURL().empty()) {
|
if (!info->GetURL().empty()) {
|
||||||
ScriptLog::Info("Please report the error to the following URL:");
|
ScriptLog::Info("Please report the error to the following URL:");
|
||||||
|
|
|
@ -1350,7 +1350,7 @@ static void CrashAirplane(Aircraft *v)
|
||||||
newstype = NT_ACCIDENT_OTHER;
|
newstype = NT_ACCIDENT_OTHER;
|
||||||
}
|
}
|
||||||
|
|
||||||
AddTileNewsItem(newsitem, newstype, vt, nullptr, st != nullptr ? st->index : INVALID_STATION);
|
AddTileNewsItem(newsitem, MakeParameters(), newstype, vt, nullptr, st != nullptr ? st->index : INVALID_STATION);
|
||||||
|
|
||||||
ModifyStationRatingAround(vt, v->owner, -160, 30);
|
ModifyStationRatingAround(vt, v->owner, -160, 30);
|
||||||
if (_settings_client.sound.disaster) SndPlayVehicleFx(SND_12_EXPLOSION, v);
|
if (_settings_client.sound.disaster) SndPlayVehicleFx(SND_12_EXPLOSION, v);
|
||||||
|
@ -1401,10 +1401,10 @@ static void AircraftEntersTerminal(Aircraft *v)
|
||||||
/* Check if station was ever visited before */
|
/* Check if station was ever visited before */
|
||||||
if (!(st->had_vehicle_of_type & HVOT_AIRCRAFT)) {
|
if (!(st->had_vehicle_of_type & HVOT_AIRCRAFT)) {
|
||||||
st->had_vehicle_of_type |= HVOT_AIRCRAFT;
|
st->had_vehicle_of_type |= HVOT_AIRCRAFT;
|
||||||
SetDParam(0, st->index);
|
|
||||||
/* show newsitem of celebrating citizens */
|
/* show newsitem of celebrating citizens */
|
||||||
AddVehicleNewsItem(
|
AddVehicleNewsItem(
|
||||||
STR_NEWS_FIRST_AIRCRAFT_ARRIVAL,
|
STR_NEWS_FIRST_AIRCRAFT_ARRIVAL,
|
||||||
|
MakeParameters(st->index),
|
||||||
(v->owner == _local_company) ? NT_ARRIVAL_COMPANY : NT_ARRIVAL_OTHER,
|
(v->owner == _local_company) ? NT_ARRIVAL_COMPANY : NT_ARRIVAL_OTHER,
|
||||||
v->index,
|
v->index,
|
||||||
st->index
|
st->index
|
||||||
|
@ -2052,8 +2052,7 @@ static void AircraftHandleDestTooFar(Aircraft *v, bool too_far)
|
||||||
AI::NewEvent(v->owner, new ScriptEventAircraftDestTooFar(v->index));
|
AI::NewEvent(v->owner, new ScriptEventAircraftDestTooFar(v->index));
|
||||||
if (v->owner == _local_company) {
|
if (v->owner == _local_company) {
|
||||||
/* Post a news message. */
|
/* Post a news message. */
|
||||||
SetDParam(0, v->index);
|
AddVehicleAdviceNewsItem(STR_NEWS_AIRCRAFT_DEST_TOO_FAR, MakeParameters(v->index), v->index);
|
||||||
AddVehicleAdviceNewsItem(STR_NEWS_AIRCRAFT_DEST_TOO_FAR, v->index);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -333,20 +333,22 @@ static CommandCost BuildReplacementVehicle(Vehicle *old_veh, Vehicle **new_vehic
|
||||||
if (!IsValidCargoID(refit_cargo)) {
|
if (!IsValidCargoID(refit_cargo)) {
|
||||||
if (!IsLocalCompany()) return CommandCost();
|
if (!IsLocalCompany()) return CommandCost();
|
||||||
|
|
||||||
SetDParam(0, old_veh->index);
|
ArrayStringParameters<3> params;
|
||||||
|
|
||||||
|
params.SetParam(0, old_veh->index);
|
||||||
|
|
||||||
int order_id = GetIncompatibleRefitOrderIdForAutoreplace(old_veh, e);
|
int order_id = GetIncompatibleRefitOrderIdForAutoreplace(old_veh, e);
|
||||||
if (order_id != -1) {
|
if (order_id != -1) {
|
||||||
/* Orders contained a refit order that is incompatible with the new vehicle. */
|
/* Orders contained a refit order that is incompatible with the new vehicle. */
|
||||||
SetDParam(1, STR_ERROR_AUTOREPLACE_INCOMPATIBLE_REFIT);
|
params.SetParam(1, STR_ERROR_AUTOREPLACE_INCOMPATIBLE_REFIT);
|
||||||
SetDParam(2, order_id + 1); // 1-based indexing for display
|
params.SetParam(2, order_id + 1); // 1-based indexing for display
|
||||||
} else {
|
} else {
|
||||||
/* Current cargo is incompatible with the new vehicle. */
|
/* Current cargo is incompatible with the new vehicle. */
|
||||||
SetDParam(1, STR_ERROR_AUTOREPLACE_INCOMPATIBLE_CARGO);
|
params.SetParam(1, STR_ERROR_AUTOREPLACE_INCOMPATIBLE_CARGO);
|
||||||
SetDParam(2, CargoSpec::Get(old_veh->cargo_type)->name);
|
params.SetParam(2, CargoSpec::Get(old_veh->cargo_type)->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
AddVehicleAdviceNewsItem(STR_NEWS_VEHICLE_AUTORENEW_FAILED, old_veh->index);
|
AddVehicleAdviceNewsItem(STR_NEWS_VEHICLE_AUTORENEW_FAILED, std::move(params), old_veh->index);
|
||||||
return CommandCost();
|
return CommandCost();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -702,10 +702,9 @@ public:
|
||||||
if (widget != WID_RV_TRAIN_WAGONREMOVE_TOGGLE) return false;
|
if (widget != WID_RV_TRAIN_WAGONREMOVE_TOGGLE) return false;
|
||||||
|
|
||||||
if (Group::IsValidID(this->sel_group)) {
|
if (Group::IsValidID(this->sel_group)) {
|
||||||
SetDParam(0, STR_REPLACE_REMOVE_WAGON_HELP);
|
GuiShowTooltips(this, STR_REPLACE_REMOVE_WAGON_GROUP_HELP, close_cond, MakeParameters(STR_REPLACE_REMOVE_WAGON_HELP));
|
||||||
GuiShowTooltips(this, STR_REPLACE_REMOVE_WAGON_GROUP_HELP, close_cond, 1);
|
|
||||||
} else {
|
} else {
|
||||||
GuiShowTooltips(this, STR_REPLACE_REMOVE_WAGON_HELP, close_cond);
|
GuiShowTooltips(this, STR_REPLACE_REMOVE_WAGON_HELP, close_cond, MakeParameters());
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -444,6 +444,6 @@ void ShowBuildBridgeWindow(TileIndex start, TileIndex end, TransportType transpo
|
||||||
if (!bl.empty()) {
|
if (!bl.empty()) {
|
||||||
new BuildBridgeWindow(&_build_bridge_desc, start, end, transport_type, road_rail_type, std::move(bl));
|
new BuildBridgeWindow(&_build_bridge_desc, start, end, transport_type, road_rail_type, std::move(bl));
|
||||||
} else {
|
} else {
|
||||||
ShowErrorMessage(STR_ERROR_CAN_T_BUILD_BRIDGE_HERE, errmsg, WL_INFO, TileX(end) * TILE_SIZE, TileY(end) * TILE_SIZE);
|
ShowErrorMessage(STR_ERROR_CAN_T_BUILD_BRIDGE_HERE, errmsg, MakeParameters(), WL_INFO, TileX(end) * TILE_SIZE, TileY(end) * TILE_SIZE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -144,7 +144,7 @@ static int32_t ClickChangeMaxHlCheat(int32_t new_value, int32_t)
|
||||||
* If yes, disallow the change. */
|
* If yes, disallow the change. */
|
||||||
for (TileIndex t = 0; t < Map::Size(); t++) {
|
for (TileIndex t = 0; t < Map::Size(); t++) {
|
||||||
if ((int32_t)TileHeight(t) > new_value) {
|
if ((int32_t)TileHeight(t) > new_value) {
|
||||||
ShowErrorMessage(STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN, INVALID_STRING_ID, WL_ERROR);
|
ShowErrorMessage(STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN, INVALID_STRING_ID, MakeParameters(), WL_ERROR);
|
||||||
/* Return old, unchanged value */
|
/* Return old, unchanged value */
|
||||||
return _settings_game.construction.map_height_limit;
|
return _settings_game.construction.map_height_limit;
|
||||||
}
|
}
|
||||||
|
|
|
@ -218,7 +218,7 @@ std::tuple<bool, bool, bool> CommandHelperBase::InternalPostBefore(Commands cmd,
|
||||||
bool only_sending = _networking && !network_command;
|
bool only_sending = _networking && !network_command;
|
||||||
|
|
||||||
if (_pause_mode != PM_UNPAUSED && !IsCommandAllowedWhilePaused(cmd) && !estimate_only) {
|
if (_pause_mode != PM_UNPAUSED && !IsCommandAllowedWhilePaused(cmd) && !estimate_only) {
|
||||||
ShowErrorMessage(err_message, STR_ERROR_NOT_ALLOWED_WHILE_PAUSED, WL_INFO, TileX(tile) * TILE_SIZE, TileY(tile) * TILE_SIZE);
|
ShowErrorMessage(err_message, STR_ERROR_NOT_ALLOWED_WHILE_PAUSED, MakeParameters(), WL_INFO, TileX(tile) * TILE_SIZE, TileY(tile) * TILE_SIZE);
|
||||||
return { true, estimate_only, only_sending };
|
return { true, estimate_only, only_sending };
|
||||||
} else {
|
} else {
|
||||||
return { false, estimate_only, only_sending };
|
return { false, estimate_only, only_sending };
|
||||||
|
|
|
@ -424,11 +424,13 @@ set_name:;
|
||||||
|
|
||||||
if (c->is_ai) {
|
if (c->is_ai) {
|
||||||
CompanyNewsInformation *cni = new CompanyNewsInformation(c);
|
CompanyNewsInformation *cni = new CompanyNewsInformation(c);
|
||||||
SetDParam(0, STR_NEWS_COMPANY_LAUNCH_TITLE);
|
auto params = MakeParameters(
|
||||||
SetDParam(1, STR_NEWS_COMPANY_LAUNCH_DESCRIPTION);
|
STR_NEWS_COMPANY_LAUNCH_TITLE,
|
||||||
SetDParamStr(2, cni->company_name);
|
STR_NEWS_COMPANY_LAUNCH_DESCRIPTION,
|
||||||
SetDParam(3, t->index);
|
cni->company_name,
|
||||||
AddNewsItem(STR_MESSAGE_NEWS_FORMAT, NT_COMPANY_INFO, NF_COMPANY, NR_TILE, c->last_build_coordinate.base(), NR_NONE, UINT32_MAX, cni);
|
t->index
|
||||||
|
);
|
||||||
|
AddNewsItem(STR_MESSAGE_NEWS_FORMAT, std::move(params), NT_COMPANY_INFO, NF_COMPANY, NR_TILE, c->last_build_coordinate.base(), NR_NONE, UINT32_MAX, cni);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -940,10 +942,7 @@ CommandCost CmdCompanyCtrl(DoCommandFlag flags, CompanyCtrlAction cca, CompanyID
|
||||||
CompanyNewsInformation *cni = new CompanyNewsInformation(c);
|
CompanyNewsInformation *cni = new CompanyNewsInformation(c);
|
||||||
|
|
||||||
/* Show the bankrupt news */
|
/* Show the bankrupt news */
|
||||||
SetDParam(0, STR_NEWS_COMPANY_BANKRUPT_TITLE);
|
AddCompanyNewsItem(STR_MESSAGE_NEWS_FORMAT, MakeParameters(STR_NEWS_COMPANY_BANKRUPT_TITLE, STR_NEWS_COMPANY_BANKRUPT_DESCRIPTION, cni->company_name), cni);
|
||||||
SetDParam(1, STR_NEWS_COMPANY_BANKRUPT_DESCRIPTION);
|
|
||||||
SetDParamStr(2, cni->company_name);
|
|
||||||
AddCompanyNewsItem(STR_MESSAGE_NEWS_FORMAT, cni);
|
|
||||||
|
|
||||||
/* Remove the company */
|
/* Remove the company */
|
||||||
ChangeOwnershipOfCompanyItems(c->index, INVALID_OWNER);
|
ChangeOwnershipOfCompanyItems(c->index, INVALID_OWNER);
|
||||||
|
|
|
@ -1660,7 +1660,7 @@ public:
|
||||||
case WID_SCMF_LOAD:
|
case WID_SCMF_LOAD:
|
||||||
this->face = _company_manager_face;
|
this->face = _company_manager_face;
|
||||||
ScaleAllCompanyManagerFaceBits(this->face);
|
ScaleAllCompanyManagerFaceBits(this->face);
|
||||||
ShowErrorMessage(STR_FACE_LOAD_DONE, INVALID_STRING_ID, WL_INFO);
|
ShowErrorMessage(STR_FACE_LOAD_DONE, INVALID_STRING_ID, MakeParameters(), WL_INFO);
|
||||||
this->UpdateData();
|
this->UpdateData();
|
||||||
this->SetDirty();
|
this->SetDirty();
|
||||||
break;
|
break;
|
||||||
|
@ -1674,7 +1674,7 @@ public:
|
||||||
/* Save button */
|
/* Save button */
|
||||||
case WID_SCMF_SAVE:
|
case WID_SCMF_SAVE:
|
||||||
_company_manager_face = this->face;
|
_company_manager_face = this->face;
|
||||||
ShowErrorMessage(STR_FACE_SAVE_DONE, INVALID_STRING_ID, WL_INFO);
|
ShowErrorMessage(STR_FACE_SAVE_DONE, INVALID_STRING_ID, MakeParameters(), WL_INFO);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Toggle gender (male/female) button */
|
/* Toggle gender (male/female) button */
|
||||||
|
@ -1751,11 +1751,11 @@ public:
|
||||||
if (!StrEmpty(str)) {
|
if (!StrEmpty(str)) {
|
||||||
this->face = std::strtoul(str, nullptr, 10);
|
this->face = std::strtoul(str, nullptr, 10);
|
||||||
ScaleAllCompanyManagerFaceBits(this->face);
|
ScaleAllCompanyManagerFaceBits(this->face);
|
||||||
ShowErrorMessage(STR_FACE_FACECODE_SET, INVALID_STRING_ID, WL_INFO);
|
ShowErrorMessage(STR_FACE_FACECODE_SET, INVALID_STRING_ID, MakeParameters(), WL_INFO);
|
||||||
this->UpdateData();
|
this->UpdateData();
|
||||||
this->SetDirty();
|
this->SetDirty();
|
||||||
} else {
|
} else {
|
||||||
ShowErrorMessage(STR_FACE_FACECODE_ERR, INVALID_STRING_ID, WL_INFO);
|
ShowErrorMessage(STR_FACE_FACECODE_ERR, INVALID_STRING_ID, MakeParameters(), WL_INFO);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -146,7 +146,7 @@ static IntervalTimer<TimerGameCalendar> _check_switch_to_euro({TimerGameCalendar
|
||||||
_currency_specs[_settings_game.locale.currency].to_euro != CF_ISEURO &&
|
_currency_specs[_settings_game.locale.currency].to_euro != CF_ISEURO &&
|
||||||
TimerGameCalendar::year >= _currency_specs[_settings_game.locale.currency].to_euro) {
|
TimerGameCalendar::year >= _currency_specs[_settings_game.locale.currency].to_euro) {
|
||||||
_settings_game.locale.currency = 2; // this is the index of euro above.
|
_settings_game.locale.currency = 2; // this is the index of euro above.
|
||||||
AddNewsItem(STR_NEWS_EURO_INTRODUCTION, NT_ECONOMY, NF_NORMAL);
|
AddNewsItem(STR_NEWS_EURO_INTRODUCTION, MakeParameters(), NT_ECONOMY, NF_NORMAL);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -809,11 +809,10 @@ struct DepotWindow : Window {
|
||||||
case WID_D_SELL_ALL:
|
case WID_D_SELL_ALL:
|
||||||
/* Only open the confirmation window if there are anything to sell */
|
/* Only open the confirmation window if there are anything to sell */
|
||||||
if (!this->vehicle_list.empty() || !this->wagon_list.empty()) {
|
if (!this->vehicle_list.empty() || !this->wagon_list.empty()) {
|
||||||
SetDParam(0, this->type);
|
|
||||||
SetDParam(1, this->GetDepotIndex());
|
|
||||||
ShowQuery(
|
ShowQuery(
|
||||||
STR_DEPOT_CAPTION,
|
STR_DEPOT_CAPTION,
|
||||||
STR_DEPOT_SELL_CONFIRMATION_TEXT,
|
STR_DEPOT_SELL_CONFIRMATION_TEXT,
|
||||||
|
MakeParameters(this->type, this->GetDepotIndex()),
|
||||||
this,
|
this,
|
||||||
DepotSellAllConfirmationCallback
|
DepotSellAllConfirmationCallback
|
||||||
);
|
);
|
||||||
|
@ -885,10 +884,7 @@ struct DepotWindow : Window {
|
||||||
details += GetString(STR_DEPOT_VEHICLE_TOOLTIP_CARGO);
|
details += GetString(STR_DEPOT_VEHICLE_TOOLTIP_CARGO);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Show tooltip window */
|
GuiShowTooltips(this, whole_chain ? STR_DEPOT_VEHICLE_TOOLTIP_CHAIN : STR_DEPOT_VEHICLE_TOOLTIP, TCC_RIGHT_CLICK, MakeParameters(whole_chain ? num : v->engine_type, details));
|
||||||
SetDParam(0, whole_chain ? num : v->engine_type);
|
|
||||||
SetDParamStr(1, details);
|
|
||||||
GuiShowTooltips(this, whole_chain ? STR_DEPOT_VEHICLE_TOOLTIP_CHAIN : STR_DEPOT_VEHICLE_TOOLTIP, TCC_RIGHT_CLICK, 2);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -931,10 +927,10 @@ struct DepotWindow : Window {
|
||||||
})) {
|
})) {
|
||||||
OnVehicleSelect(*begin);
|
OnVehicleSelect(*begin);
|
||||||
} else {
|
} else {
|
||||||
ShowErrorMessage(STR_ERROR_CAN_T_BUY_TRAIN + (*begin)->type, STR_ERROR_CAN_T_COPY_ORDER_VEHICLE_LIST, WL_INFO);
|
ShowErrorMessage(STR_ERROR_CAN_T_BUY_TRAIN + (*begin)->type, STR_ERROR_CAN_T_COPY_ORDER_VEHICLE_LIST, MakeParameters(), WL_INFO);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ShowErrorMessage(STR_ERROR_CAN_T_BUY_TRAIN + (*begin)->type, STR_ERROR_CAN_T_CLONE_VEHICLE_LIST, WL_INFO);
|
ShowErrorMessage(STR_ERROR_CAN_T_BUY_TRAIN + (*begin)->type, STR_ERROR_CAN_T_CLONE_VEHICLE_LIST, MakeParameters(), WL_INFO);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* If CTRL is pressed: If all the vehicles in this list share orders, then copy orders */
|
/* If CTRL is pressed: If all the vehicles in this list share orders, then copy orders */
|
||||||
|
@ -946,10 +942,10 @@ struct DepotWindow : Window {
|
||||||
})) {
|
})) {
|
||||||
OnVehicleSelect(*begin);
|
OnVehicleSelect(*begin);
|
||||||
} else {
|
} else {
|
||||||
ShowErrorMessage(STR_ERROR_CAN_T_BUY_TRAIN + (*begin)->type, STR_ERROR_CAN_T_SHARE_ORDER_VEHICLE_LIST, WL_INFO);
|
ShowErrorMessage(STR_ERROR_CAN_T_BUY_TRAIN + (*begin)->type, STR_ERROR_CAN_T_SHARE_ORDER_VEHICLE_LIST, MakeParameters(), WL_INFO);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ShowErrorMessage(STR_ERROR_CAN_T_BUY_TRAIN + (*begin)->type, STR_ERROR_CAN_T_CLONE_VEHICLE_LIST, WL_INFO);
|
ShowErrorMessage(STR_ERROR_CAN_T_BUY_TRAIN + (*begin)->type, STR_ERROR_CAN_T_CLONE_VEHICLE_LIST, MakeParameters(), WL_INFO);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -245,8 +245,7 @@ static bool DisasterTick_Zeppeliner(DisasterVehicle *v)
|
||||||
v->state = 1;
|
v->state = 1;
|
||||||
v->age = 0;
|
v->age = 0;
|
||||||
|
|
||||||
SetDParam(0, GetStationIndex(v->tile));
|
AddTileNewsItem(STR_NEWS_DISASTER_ZEPPELIN, MakeParameters(GetStationIndex(v->tile)), NT_ACCIDENT, v->tile);
|
||||||
AddTileNewsItem(STR_NEWS_DISASTER_ZEPPELIN, NT_ACCIDENT, v->tile);
|
|
||||||
AI::NewEvent(GetTileOwner(v->tile), new ScriptEventDisasterZeppelinerCrashed(GetStationIndex(v->tile)));
|
AI::NewEvent(GetTileOwner(v->tile), new ScriptEventDisasterZeppelinerCrashed(GetStationIndex(v->tile)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -380,7 +379,7 @@ static bool DisasterTick_Ufo(DisasterVehicle *v)
|
||||||
if (u->crashed_ctr == 0) {
|
if (u->crashed_ctr == 0) {
|
||||||
u->Crash();
|
u->Crash();
|
||||||
|
|
||||||
AddTileNewsItem(STR_NEWS_DISASTER_SMALL_UFO, NT_ACCIDENT, u->tile);
|
AddTileNewsItem(STR_NEWS_DISASTER_SMALL_UFO, MakeParameters(), NT_ACCIDENT, u->tile);
|
||||||
|
|
||||||
AI::NewEvent(u->owner, new ScriptEventVehicleCrashed(u->index, u->tile, ScriptEventVehicleCrashed::CRASH_RV_UFO));
|
AI::NewEvent(u->owner, new ScriptEventVehicleCrashed(u->index, u->tile, ScriptEventVehicleCrashed::CRASH_RV_UFO));
|
||||||
Game::NewEvent(new ScriptEventVehicleCrashed(u->index, u->tile, ScriptEventVehicleCrashed::CRASH_RV_UFO));
|
Game::NewEvent(new ScriptEventVehicleCrashed(u->index, u->tile, ScriptEventVehicleCrashed::CRASH_RV_UFO));
|
||||||
|
@ -458,8 +457,7 @@ static bool DisasterTick_Aircraft(DisasterVehicle *v, uint16_t image_override, b
|
||||||
Industry *i = Industry::Get(v->dest_tile.base()); // Industry destructor calls ReleaseDisastersTargetingIndustry, so this is valid
|
Industry *i = Industry::Get(v->dest_tile.base()); // Industry destructor calls ReleaseDisastersTargetingIndustry, so this is valid
|
||||||
DestructIndustry(i);
|
DestructIndustry(i);
|
||||||
|
|
||||||
SetDParam(0, i->town->index);
|
AddIndustryNewsItem(news_message, MakeParameters(i->town->index), NT_ACCIDENT, i->index);
|
||||||
AddIndustryNewsItem(news_message, NT_ACCIDENT, i->index);
|
|
||||||
if (_settings_client.sound.disaster) SndPlayTileFx(SND_12_EXPLOSION, i->location.tile);
|
if (_settings_client.sound.disaster) SndPlayTileFx(SND_12_EXPLOSION, i->location.tile);
|
||||||
}
|
}
|
||||||
} else if (v->state == 0) {
|
} else if (v->state == 0) {
|
||||||
|
@ -554,8 +552,7 @@ static bool DisasterTick_Big_Ufo(DisasterVehicle *v)
|
||||||
}
|
}
|
||||||
|
|
||||||
Town *t = ClosestTownFromTile(v->dest_tile, UINT_MAX);
|
Town *t = ClosestTownFromTile(v->dest_tile, UINT_MAX);
|
||||||
SetDParam(0, t->index);
|
AddTileNewsItem(STR_NEWS_DISASTER_BIG_UFO, MakeParameters(t->index), NT_ACCIDENT, v->tile);
|
||||||
AddTileNewsItem(STR_NEWS_DISASTER_BIG_UFO, NT_ACCIDENT, v->tile);
|
|
||||||
|
|
||||||
if (!Vehicle::CanAllocateItem(2)) {
|
if (!Vehicle::CanAllocateItem(2)) {
|
||||||
delete v;
|
delete v;
|
||||||
|
@ -880,8 +877,7 @@ static void Disaster_CoalMine_Init()
|
||||||
for (m = 0; m < 15; m++) {
|
for (m = 0; m < 15; m++) {
|
||||||
for (const Industry *i : Industry::Iterate()) {
|
for (const Industry *i : Industry::Iterate()) {
|
||||||
if ((GetIndustrySpec(i->type)->behaviour & INDUSTRYBEH_CAN_SUBSIDENCE) && --index < 0) {
|
if ((GetIndustrySpec(i->type)->behaviour & INDUSTRYBEH_CAN_SUBSIDENCE) && --index < 0) {
|
||||||
SetDParam(0, i->town->index);
|
AddTileNewsItem(STR_NEWS_DISASTER_COAL_MINE_SUBSIDENCE, MakeParameters(i->town->index), NT_ACCIDENT, i->location.tile + TileDiffXY(1, 1)); // keep the news, even when the mine closes
|
||||||
AddTileNewsItem(STR_NEWS_DISASTER_COAL_MINE_SUBSIDENCE, NT_ACCIDENT, i->location.tile + TileDiffXY(1, 1)); // keep the news, even when the mine closes
|
|
||||||
|
|
||||||
{
|
{
|
||||||
TileIndex tile = i->location.tile;
|
TileIndex tile = i->location.tile;
|
||||||
|
|
|
@ -599,10 +599,7 @@ static void CompanyCheckBankrupt(Company *c)
|
||||||
/* Warn about bankruptcy after 3 months */
|
/* Warn about bankruptcy after 3 months */
|
||||||
case 4: {
|
case 4: {
|
||||||
CompanyNewsInformation *cni = new CompanyNewsInformation(c);
|
CompanyNewsInformation *cni = new CompanyNewsInformation(c);
|
||||||
SetDParam(0, STR_NEWS_COMPANY_IN_TROUBLE_TITLE);
|
AddCompanyNewsItem(STR_MESSAGE_NEWS_FORMAT, MakeParameters(STR_NEWS_COMPANY_IN_TROUBLE_TITLE, STR_NEWS_COMPANY_IN_TROUBLE_DESCRIPTION, cni->company_name), cni);
|
||||||
SetDParam(1, STR_NEWS_COMPANY_IN_TROUBLE_DESCRIPTION);
|
|
||||||
SetDParamStr(2, cni->company_name);
|
|
||||||
AddCompanyNewsItem(STR_MESSAGE_NEWS_FORMAT, cni);
|
|
||||||
AI::BroadcastNewEvent(new ScriptEventCompanyInTrouble(c->index));
|
AI::BroadcastNewEvent(new ScriptEventCompanyInTrouble(c->index));
|
||||||
Game::NewEvent(new ScriptEventCompanyInTrouble(c->index));
|
Game::NewEvent(new ScriptEventCompanyInTrouble(c->index));
|
||||||
break;
|
break;
|
||||||
|
@ -877,10 +874,10 @@ static void HandleEconomyFluctuations()
|
||||||
|
|
||||||
if (_economy.fluct == 0) {
|
if (_economy.fluct == 0) {
|
||||||
_economy.fluct = -(int)GB(Random(), 0, 2);
|
_economy.fluct = -(int)GB(Random(), 0, 2);
|
||||||
AddNewsItem(STR_NEWS_BEGIN_OF_RECESSION, NT_ECONOMY, NF_NORMAL);
|
AddNewsItem(STR_NEWS_BEGIN_OF_RECESSION, MakeParameters(), NT_ECONOMY, NF_NORMAL);
|
||||||
} else if (_economy.fluct == -12) {
|
} else if (_economy.fluct == -12) {
|
||||||
_economy.fluct = GB(Random(), 0, 8) + 312;
|
_economy.fluct = GB(Random(), 0, 8) + 312;
|
||||||
AddNewsItem(STR_NEWS_END_OF_RECESSION, NT_ECONOMY, NF_NORMAL);
|
AddNewsItem(STR_NEWS_END_OF_RECESSION, MakeParameters(), NT_ECONOMY, NF_NORMAL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2014,12 +2011,14 @@ static void DoAcquireCompany(Company *c, bool hostile_takeover)
|
||||||
|
|
||||||
CompanyNewsInformation *cni = new CompanyNewsInformation(c, Company::Get(_current_company));
|
CompanyNewsInformation *cni = new CompanyNewsInformation(c, Company::Get(_current_company));
|
||||||
|
|
||||||
SetDParam(0, STR_NEWS_COMPANY_MERGER_TITLE);
|
auto params = MakeParameters(
|
||||||
SetDParam(1, hostile_takeover ? STR_NEWS_MERGER_TAKEOVER_TITLE : STR_NEWS_COMPANY_MERGER_DESCRIPTION);
|
STR_NEWS_COMPANY_MERGER_TITLE,
|
||||||
SetDParamStr(2, cni->company_name);
|
hostile_takeover ? STR_NEWS_MERGER_TAKEOVER_TITLE : STR_NEWS_COMPANY_MERGER_DESCRIPTION,
|
||||||
SetDParamStr(3, cni->other_company_name);
|
cni->company_name,
|
||||||
SetDParam(4, c->bankrupt_value);
|
cni->other_company_name,
|
||||||
AddCompanyNewsItem(STR_MESSAGE_NEWS_FORMAT, cni);
|
c->bankrupt_value
|
||||||
|
);
|
||||||
|
AddCompanyNewsItem(STR_MESSAGE_NEWS_FORMAT, std::move(params), cni);
|
||||||
AI::BroadcastNewEvent(new ScriptEventCompanyMerger(ci, _current_company));
|
AI::BroadcastNewEvent(new ScriptEventCompanyMerger(ci, _current_company));
|
||||||
Game::NewEvent(new ScriptEventCompanyMerger(ci, _current_company));
|
Game::NewEvent(new ScriptEventCompanyMerger(ci, _current_company));
|
||||||
|
|
||||||
|
|
|
@ -1091,9 +1091,7 @@ static void NewVehicleAvailable(Engine *e)
|
||||||
|
|
||||||
/* Only provide the "New Vehicle available" news paper entry, if engine can be built. */
|
/* Only provide the "New Vehicle available" news paper entry, if engine can be built. */
|
||||||
if (!IsVehicleTypeDisabled(e->type, false) && (e->info.extra_flags & ExtraEngineFlags::NoNews) == ExtraEngineFlags::None) {
|
if (!IsVehicleTypeDisabled(e->type, false) && (e->info.extra_flags & ExtraEngineFlags::NoNews) == ExtraEngineFlags::None) {
|
||||||
SetDParam(0, GetEngineCategoryName(index));
|
AddNewsItem(STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE, MakeParameters(GetEngineCategoryName(index), PackEngineNameDParam(index, EngineNameContext::PreviewNews)), NT_NEW_VEHICLES, NF_VEHICLE, NR_ENGINE, index);
|
||||||
SetDParam(1, PackEngineNameDParam(index, EngineNameContext::PreviewNews));
|
|
||||||
AddNewsItem(STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE, NT_NEW_VEHICLES, NF_VEHICLE, NR_ENGINE, index);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update the toolbar. */
|
/* Update the toolbar. */
|
||||||
|
@ -1298,9 +1296,8 @@ void CheckEngines()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (min_date < INT32_MAX) {
|
if (min_date < INT32_MAX) {
|
||||||
SetDParam(0, min_date);
|
ShowErrorMessage(STR_ERROR_NO_VEHICLES_AVAILABLE_YET, STR_ERROR_NO_VEHICLES_AVAILABLE_YET_EXPLANATION, MakeParameters(min_date), WL_WARNING);
|
||||||
ShowErrorMessage(STR_ERROR_NO_VEHICLES_AVAILABLE_YET, STR_ERROR_NO_VEHICLES_AVAILABLE_YET_EXPLANATION, WL_WARNING);
|
|
||||||
} else {
|
} else {
|
||||||
ShowErrorMessage(STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL, STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION, WL_WARNING);
|
ShowErrorMessage(STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL, STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION, MakeParameters(), WL_WARNING);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,7 +55,7 @@ public:
|
||||||
void SetDParamStr(uint n, const char *str);
|
void SetDParamStr(uint n, const char *str);
|
||||||
void SetDParamStr(uint n, const std::string &str);
|
void SetDParamStr(uint n, const std::string &str);
|
||||||
|
|
||||||
void CopyOutDParams();
|
void CopyOutDParams(class StringParameters &¶ms);
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Define a queue with errors. */
|
/** Define a queue with errors. */
|
||||||
|
@ -65,7 +65,7 @@ void ScheduleErrorMessage(ErrorList &datas);
|
||||||
void ScheduleErrorMessage(const ErrorMessageData &data);
|
void ScheduleErrorMessage(const ErrorMessageData &data);
|
||||||
|
|
||||||
void ShowErrorMessage(StringID summary_msg, int x, int y, CommandCost cc);
|
void ShowErrorMessage(StringID summary_msg, int x, int y, CommandCost cc);
|
||||||
void ShowErrorMessage(StringID summary_msg, StringID detailed_msg, WarningLevel wl, int x = 0, int y = 0, const GRFFile *textref_stack_grffile = nullptr, uint textref_stack_size = 0, const uint32_t *textref_stack = nullptr, StringID extra_msg = INVALID_STRING_ID);
|
void ShowErrorMessage(StringID summary_msg, StringID detailed_msg, class StringParameters &¶ms, WarningLevel wl, int x = 0, int y = 0, const GRFFile *textref_stack_grffile = nullptr, uint textref_stack_size = 0, const uint32_t *textref_stack = nullptr, StringID extra_msg = INVALID_STRING_ID);
|
||||||
bool HideActiveErrorMessage();
|
bool HideActiveErrorMessage();
|
||||||
|
|
||||||
void ClearErrorMessages();
|
void ClearErrorMessages();
|
||||||
|
|
|
@ -113,7 +113,7 @@ ErrorMessageData::ErrorMessageData(StringID summary_msg, StringID detailed_msg,
|
||||||
/**
|
/**
|
||||||
* Copy error parameters from current DParams.
|
* Copy error parameters from current DParams.
|
||||||
*/
|
*/
|
||||||
void ErrorMessageData::CopyOutDParams()
|
void ErrorMessageData::CopyOutDParams(StringParameters &¶ms)
|
||||||
{
|
{
|
||||||
if (this->detailed_msg == STR_ERROR_OWNED_BY) {
|
if (this->detailed_msg == STR_ERROR_OWNED_BY) {
|
||||||
/* The parameters are set by SetDParamsForOwnedBy. */
|
/* The parameters are set by SetDParamsForOwnedBy. */
|
||||||
|
@ -123,7 +123,7 @@ void ErrorMessageData::CopyOutDParams()
|
||||||
|
|
||||||
/* Get parameters using type information */
|
/* Get parameters using type information */
|
||||||
if (this->textref_stack_size > 0) StartTextRefStackUsage(this->textref_stack_grffile, this->textref_stack_size, this->textref_stack);
|
if (this->textref_stack_size > 0) StartTextRefStackUsage(this->textref_stack_grffile, this->textref_stack_size, this->textref_stack);
|
||||||
CopyOutDParam(this->params, 20);
|
CopyOutDParam(this->params, std::move(params));
|
||||||
if (this->textref_stack_size > 0) StopTextRefStackUsage();
|
if (this->textref_stack_size > 0) StopTextRefStackUsage();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -366,13 +366,14 @@ void UnshowCriticalError()
|
||||||
*/
|
*/
|
||||||
void ShowErrorMessage(StringID summary_msg, int x, int y, CommandCost cc)
|
void ShowErrorMessage(StringID summary_msg, int x, int y, CommandCost cc)
|
||||||
{
|
{
|
||||||
ShowErrorMessage(summary_msg, cc.GetErrorMessage(), WL_INFO, x, y, cc.GetTextRefStackGRF(), cc.GetTextRefStackSize(), cc.GetTextRefStack(), cc.GetExtraErrorMessage());
|
ShowErrorMessage(summary_msg, cc.GetErrorMessage(), MakeParameters(), WL_INFO, x, y, cc.GetTextRefStackGRF(), cc.GetTextRefStackSize(), cc.GetTextRefStack(), cc.GetExtraErrorMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Display an error message in a window.
|
* Display an error message in a window.
|
||||||
* @param summary_msg General error message showed in first line. Must be valid.
|
* @param summary_msg General error message showed in first line. Must be valid.
|
||||||
* @param detailed_msg Detailed error message showed in second line. Can be INVALID_STRING_ID.
|
* @param detailed_msg Detailed error message showed in second line. Can be INVALID_STRING_ID.
|
||||||
|
* @param params Parameters for the error message.
|
||||||
* @param wl Message severity.
|
* @param wl Message severity.
|
||||||
* @param x World X position (TileVirtX) of the error location. Set both x and y to 0 to just center the message when there is no related error tile.
|
* @param x World X position (TileVirtX) of the error location. Set both x and y to 0 to just center the message when there is no related error tile.
|
||||||
* @param y World Y position (TileVirtY) of the error location. Set both x and y to 0 to just center the message when there is no related error tile.
|
* @param y World Y position (TileVirtY) of the error location. Set both x and y to 0 to just center the message when there is no related error tile.
|
||||||
|
@ -381,7 +382,7 @@ void ShowErrorMessage(StringID summary_msg, int x, int y, CommandCost cc)
|
||||||
* @param textref_stack Values to put on the #TextRefStack.
|
* @param textref_stack Values to put on the #TextRefStack.
|
||||||
* @param extra_msg Extra error message shown in third line. Can be INVALID_STRING_ID.
|
* @param extra_msg Extra error message shown in third line. Can be INVALID_STRING_ID.
|
||||||
*/
|
*/
|
||||||
void ShowErrorMessage(StringID summary_msg, StringID detailed_msg, WarningLevel wl, int x, int y, const GRFFile *textref_stack_grffile, uint textref_stack_size, const uint32_t *textref_stack, StringID extra_msg)
|
void ShowErrorMessage(StringID summary_msg, StringID detailed_msg, StringParameters &¶ms, WarningLevel wl, int x, int y, const GRFFile *textref_stack_grffile, uint textref_stack_size, const uint32_t *textref_stack, StringID extra_msg)
|
||||||
{
|
{
|
||||||
assert(textref_stack_size == 0 || (textref_stack_grffile != nullptr && textref_stack != nullptr));
|
assert(textref_stack_size == 0 || (textref_stack_grffile != nullptr && textref_stack != nullptr));
|
||||||
if (summary_msg == STR_NULL) summary_msg = STR_EMPTY;
|
if (summary_msg == STR_NULL) summary_msg = STR_EMPTY;
|
||||||
|
@ -412,7 +413,7 @@ void ShowErrorMessage(StringID summary_msg, StringID detailed_msg, WarningLevel
|
||||||
if (_settings_client.gui.errmsg_duration == 0 && !is_critical) return;
|
if (_settings_client.gui.errmsg_duration == 0 && !is_critical) return;
|
||||||
|
|
||||||
ErrorMessageData data(summary_msg, detailed_msg, is_critical, x, y, textref_stack_grffile, textref_stack_size, textref_stack, extra_msg);
|
ErrorMessageData data(summary_msg, detailed_msg, is_critical, x, y, textref_stack_grffile, textref_stack_size, textref_stack, extra_msg);
|
||||||
data.CopyOutDParams();
|
data.CopyOutDParams(std::move(params));
|
||||||
|
|
||||||
ErrmsgWindow *w = (ErrmsgWindow*)FindWindowById(WC_ERRMSG, 0);
|
ErrmsgWindow *w = (ErrmsgWindow*)FindWindowById(WC_ERRMSG, 0);
|
||||||
if (w != nullptr) {
|
if (w != nullptr) {
|
||||||
|
|
|
@ -640,7 +640,7 @@ public:
|
||||||
|
|
||||||
case WID_SL_MISSING_NEWGRFS:
|
case WID_SL_MISSING_NEWGRFS:
|
||||||
if (!_network_available) {
|
if (!_network_available) {
|
||||||
ShowErrorMessage(STR_NETWORK_ERROR_NOTAVAILABLE, INVALID_STRING_ID, WL_ERROR);
|
ShowErrorMessage(STR_NETWORK_ERROR_NOTAVAILABLE, INVALID_STRING_ID, MakeParameters(), WL_ERROR);
|
||||||
} else if (_load_check_data.HasNewGrfs()) {
|
} else if (_load_check_data.HasNewGrfs()) {
|
||||||
ShowMissingContentWindow(_load_check_data.grfconfig);
|
ShowMissingContentWindow(_load_check_data.grfconfig);
|
||||||
}
|
}
|
||||||
|
@ -695,7 +695,7 @@ public:
|
||||||
|
|
||||||
case WID_SL_CONTENT_DOWNLOAD:
|
case WID_SL_CONTENT_DOWNLOAD:
|
||||||
if (!_network_available) {
|
if (!_network_available) {
|
||||||
ShowErrorMessage(STR_NETWORK_ERROR_NOTAVAILABLE, INVALID_STRING_ID, WL_ERROR);
|
ShowErrorMessage(STR_NETWORK_ERROR_NOTAVAILABLE, INVALID_STRING_ID, MakeParameters(), WL_ERROR);
|
||||||
} else {
|
} else {
|
||||||
assert(this->fop == SLO_LOAD);
|
assert(this->fop == SLO_LOAD);
|
||||||
switch (this->abstract_filetype) {
|
switch (this->abstract_filetype) {
|
||||||
|
@ -752,7 +752,7 @@ public:
|
||||||
|
|
||||||
if (this->IsWidgetLowered(WID_SL_DELETE_SELECTION)) { // Delete button clicked
|
if (this->IsWidgetLowered(WID_SL_DELETE_SELECTION)) { // Delete button clicked
|
||||||
if (!FiosDelete(this->filename_editbox.text.buf)) {
|
if (!FiosDelete(this->filename_editbox.text.buf)) {
|
||||||
ShowErrorMessage(STR_ERROR_UNABLE_TO_DELETE_FILE, INVALID_STRING_ID, WL_ERROR);
|
ShowErrorMessage(STR_ERROR_UNABLE_TO_DELETE_FILE, INVALID_STRING_ID, MakeParameters(), WL_ERROR);
|
||||||
} else {
|
} else {
|
||||||
this->InvalidateData(SLIWD_RESCAN_FILES);
|
this->InvalidateData(SLIWD_RESCAN_FILES);
|
||||||
/* Reset file name to current date on successful delete */
|
/* Reset file name to current date on successful delete */
|
||||||
|
@ -762,14 +762,14 @@ public:
|
||||||
if (this->abstract_filetype == FT_SAVEGAME || this->abstract_filetype == FT_SCENARIO) {
|
if (this->abstract_filetype == FT_SAVEGAME || this->abstract_filetype == FT_SCENARIO) {
|
||||||
_file_to_saveload.name = FiosMakeSavegameName(this->filename_editbox.text.buf);
|
_file_to_saveload.name = FiosMakeSavegameName(this->filename_editbox.text.buf);
|
||||||
if (FioCheckFileExists(_file_to_saveload.name, Subdirectory::SAVE_DIR)) {
|
if (FioCheckFileExists(_file_to_saveload.name, Subdirectory::SAVE_DIR)) {
|
||||||
ShowQuery(STR_SAVELOAD_OVERWRITE_TITLE, STR_SAVELOAD_OVERWRITE_WARNING, this, SaveLoadWindow::SaveGameConfirmationCallback);
|
ShowQuery(STR_SAVELOAD_OVERWRITE_TITLE, STR_SAVELOAD_OVERWRITE_WARNING, MakeParameters(), this, SaveLoadWindow::SaveGameConfirmationCallback);
|
||||||
} else {
|
} else {
|
||||||
_switch_mode = SM_SAVE_GAME;
|
_switch_mode = SM_SAVE_GAME;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
_file_to_saveload.name = FiosMakeHeightmapName(this->filename_editbox.text.buf);
|
_file_to_saveload.name = FiosMakeHeightmapName(this->filename_editbox.text.buf);
|
||||||
if (FioCheckFileExists(_file_to_saveload.name, Subdirectory::SAVE_DIR)) {
|
if (FioCheckFileExists(_file_to_saveload.name, Subdirectory::SAVE_DIR)) {
|
||||||
ShowQuery(STR_SAVELOAD_OVERWRITE_TITLE, STR_SAVELOAD_OVERWRITE_WARNING, this, SaveLoadWindow::SaveHeightmapConfirmationCallback);
|
ShowQuery(STR_SAVELOAD_OVERWRITE_TITLE, STR_SAVELOAD_OVERWRITE_WARNING, MakeParameters(), this, SaveLoadWindow::SaveHeightmapConfirmationCallback);
|
||||||
} else {
|
} else {
|
||||||
_switch_mode = SM_SAVE_HEIGHTMAP;
|
_switch_mode = SM_SAVE_HEIGHTMAP;
|
||||||
}
|
}
|
||||||
|
|
|
@ -296,7 +296,7 @@ struct GSConfigWindow : public Window {
|
||||||
|
|
||||||
case WID_GSC_CONTENT_DOWNLOAD:
|
case WID_GSC_CONTENT_DOWNLOAD:
|
||||||
if (!_network_available) {
|
if (!_network_available) {
|
||||||
ShowErrorMessage(STR_NETWORK_ERROR_NOTAVAILABLE, INVALID_STRING_ID, WL_ERROR);
|
ShowErrorMessage(STR_NETWORK_ERROR_NOTAVAILABLE, INVALID_STRING_ID, MakeParameters(), WL_ERROR);
|
||||||
} else {
|
} else {
|
||||||
ShowNetworkContentListWindow(nullptr, CONTENT_TYPE_GAME);
|
ShowNetworkContentListWindow(nullptr, CONTENT_TYPE_GAME);
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,7 +71,7 @@ void GameInstance::Died()
|
||||||
|
|
||||||
const GameInfo *info = Game::GetInfo();
|
const GameInfo *info = Game::GetInfo();
|
||||||
if (info != nullptr) {
|
if (info != nullptr) {
|
||||||
ShowErrorMessage(STR_ERROR_AI_PLEASE_REPORT_CRASH, INVALID_STRING_ID, WL_WARNING);
|
ShowErrorMessage(STR_ERROR_AI_PLEASE_REPORT_CRASH, INVALID_STRING_ID, MakeParameters(), WL_WARNING);
|
||||||
|
|
||||||
if (!info->GetURL().empty()) {
|
if (!info->GetURL().empty()) {
|
||||||
ScriptLog::Info("Please report the error to the following URL:");
|
ScriptLog::Info("Please report the error to the following URL:");
|
||||||
|
|
|
@ -718,6 +718,7 @@ struct GenerateLandscapeWindow : public Window {
|
||||||
ShowQuery(
|
ShowQuery(
|
||||||
STR_WARNING_HEIGHTMAP_SCALE_CAPTION,
|
STR_WARNING_HEIGHTMAP_SCALE_CAPTION,
|
||||||
STR_WARNING_HEIGHTMAP_SCALE_MESSAGE,
|
STR_WARNING_HEIGHTMAP_SCALE_MESSAGE,
|
||||||
|
MakeParameters(),
|
||||||
this,
|
this,
|
||||||
LandscapeGenerationCallback);
|
LandscapeGenerationCallback);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1397,6 +1398,7 @@ struct GenerateProgressWindow : public Window {
|
||||||
ShowQuery(
|
ShowQuery(
|
||||||
STR_GENERATION_ABORT_CAPTION,
|
STR_GENERATION_ABORT_CAPTION,
|
||||||
STR_GENERATION_ABORT_MESSAGE,
|
STR_GENERATION_ABORT_MESSAGE,
|
||||||
|
MakeParameters(),
|
||||||
this,
|
this,
|
||||||
AbortGeneratingWorldCallback
|
AbortGeneratingWorldCallback
|
||||||
);
|
);
|
||||||
|
|
|
@ -788,7 +788,7 @@ public:
|
||||||
|
|
||||||
case WID_GL_DELETE_GROUP: { // Delete the selected group
|
case WID_GL_DELETE_GROUP: { // Delete the selected group
|
||||||
this->group_confirm = this->vli.index;
|
this->group_confirm = this->vli.index;
|
||||||
ShowQuery(STR_QUERY_GROUP_DELETE_CAPTION, STR_GROUP_DELETE_QUERY_TEXT, this, DeleteGroupCallback);
|
ShowQuery(STR_QUERY_GROUP_DELETE_CAPTION, STR_GROUP_DELETE_QUERY_TEXT, MakeParameters(), this, DeleteGroupCallback);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -142,20 +142,20 @@ static bool ReadHeightmapPNG(const char *filename, uint *x, uint *y, byte **map)
|
||||||
|
|
||||||
fp = FioFOpenFile(filename, "rb", HEIGHTMAP_DIR);
|
fp = FioFOpenFile(filename, "rb", HEIGHTMAP_DIR);
|
||||||
if (fp == nullptr) {
|
if (fp == nullptr) {
|
||||||
ShowErrorMessage(STR_ERROR_PNGMAP, STR_ERROR_PNGMAP_FILE_NOT_FOUND, WL_ERROR);
|
ShowErrorMessage(STR_ERROR_PNGMAP, STR_ERROR_PNGMAP_FILE_NOT_FOUND, MakeParameters(), WL_ERROR);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
|
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
|
||||||
if (png_ptr == nullptr) {
|
if (png_ptr == nullptr) {
|
||||||
ShowErrorMessage(STR_ERROR_PNGMAP, STR_ERROR_PNGMAP_MISC, WL_ERROR);
|
ShowErrorMessage(STR_ERROR_PNGMAP, STR_ERROR_PNGMAP_MISC, MakeParameters(), WL_ERROR);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
info_ptr = png_create_info_struct(png_ptr);
|
info_ptr = png_create_info_struct(png_ptr);
|
||||||
if (info_ptr == nullptr || setjmp(png_jmpbuf(png_ptr))) {
|
if (info_ptr == nullptr || setjmp(png_jmpbuf(png_ptr))) {
|
||||||
ShowErrorMessage(STR_ERROR_PNGMAP, STR_ERROR_PNGMAP_MISC, WL_ERROR);
|
ShowErrorMessage(STR_ERROR_PNGMAP, STR_ERROR_PNGMAP_MISC, MakeParameters(), WL_ERROR);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
png_destroy_read_struct(&png_ptr, &info_ptr, nullptr);
|
png_destroy_read_struct(&png_ptr, &info_ptr, nullptr);
|
||||||
return false;
|
return false;
|
||||||
|
@ -171,7 +171,7 @@ static bool ReadHeightmapPNG(const char *filename, uint *x, uint *y, byte **map)
|
||||||
/* Maps of wrong colour-depth are not used.
|
/* Maps of wrong colour-depth are not used.
|
||||||
* (this should have been taken care of by stripping alpha and 16-bit samples on load) */
|
* (this should have been taken care of by stripping alpha and 16-bit samples on load) */
|
||||||
if ((png_get_channels(png_ptr, info_ptr) != 1) && (png_get_channels(png_ptr, info_ptr) != 3) && (png_get_bit_depth(png_ptr, info_ptr) != 8)) {
|
if ((png_get_channels(png_ptr, info_ptr) != 1) && (png_get_channels(png_ptr, info_ptr) != 3) && (png_get_bit_depth(png_ptr, info_ptr) != 8)) {
|
||||||
ShowErrorMessage(STR_ERROR_PNGMAP, STR_ERROR_PNGMAP_IMAGE_TYPE, WL_ERROR);
|
ShowErrorMessage(STR_ERROR_PNGMAP, STR_ERROR_PNGMAP_IMAGE_TYPE, MakeParameters(), WL_ERROR);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
png_destroy_read_struct(&png_ptr, &info_ptr, nullptr);
|
png_destroy_read_struct(&png_ptr, &info_ptr, nullptr);
|
||||||
return false;
|
return false;
|
||||||
|
@ -181,7 +181,7 @@ static bool ReadHeightmapPNG(const char *filename, uint *x, uint *y, byte **map)
|
||||||
uint height = png_get_image_height(png_ptr, info_ptr);
|
uint height = png_get_image_height(png_ptr, info_ptr);
|
||||||
|
|
||||||
if (!IsValidHeightmapDimension(width, height)) {
|
if (!IsValidHeightmapDimension(width, height)) {
|
||||||
ShowErrorMessage(STR_ERROR_PNGMAP, STR_ERROR_HEIGHTMAP_TOO_LARGE, WL_ERROR);
|
ShowErrorMessage(STR_ERROR_PNGMAP, STR_ERROR_HEIGHTMAP_TOO_LARGE, MakeParameters(), WL_ERROR);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
png_destroy_read_struct(&png_ptr, &info_ptr, nullptr);
|
png_destroy_read_struct(&png_ptr, &info_ptr, nullptr);
|
||||||
return false;
|
return false;
|
||||||
|
@ -275,21 +275,21 @@ static bool ReadHeightmapBMP(const char *filename, uint *x, uint *y, byte **map)
|
||||||
|
|
||||||
f = FioFOpenFile(filename, "rb", HEIGHTMAP_DIR);
|
f = FioFOpenFile(filename, "rb", HEIGHTMAP_DIR);
|
||||||
if (f == nullptr) {
|
if (f == nullptr) {
|
||||||
ShowErrorMessage(STR_ERROR_BMPMAP, STR_ERROR_PNGMAP_FILE_NOT_FOUND, WL_ERROR);
|
ShowErrorMessage(STR_ERROR_BMPMAP, STR_ERROR_PNGMAP_FILE_NOT_FOUND, MakeParameters(), WL_ERROR);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
BmpInitializeBuffer(&buffer, f);
|
BmpInitializeBuffer(&buffer, f);
|
||||||
|
|
||||||
if (!BmpReadHeader(&buffer, &info, &data)) {
|
if (!BmpReadHeader(&buffer, &info, &data)) {
|
||||||
ShowErrorMessage(STR_ERROR_BMPMAP, STR_ERROR_BMPMAP_IMAGE_TYPE, WL_ERROR);
|
ShowErrorMessage(STR_ERROR_BMPMAP, STR_ERROR_BMPMAP_IMAGE_TYPE, MakeParameters(), WL_ERROR);
|
||||||
fclose(f);
|
fclose(f);
|
||||||
BmpDestroyData(&data);
|
BmpDestroyData(&data);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!IsValidHeightmapDimension(info.width, info.height)) {
|
if (!IsValidHeightmapDimension(info.width, info.height)) {
|
||||||
ShowErrorMessage(STR_ERROR_BMPMAP, STR_ERROR_HEIGHTMAP_TOO_LARGE, WL_ERROR);
|
ShowErrorMessage(STR_ERROR_BMPMAP, STR_ERROR_HEIGHTMAP_TOO_LARGE, MakeParameters(), WL_ERROR);
|
||||||
fclose(f);
|
fclose(f);
|
||||||
BmpDestroyData(&data);
|
BmpDestroyData(&data);
|
||||||
return false;
|
return false;
|
||||||
|
@ -297,7 +297,7 @@ static bool ReadHeightmapBMP(const char *filename, uint *x, uint *y, byte **map)
|
||||||
|
|
||||||
if (map != nullptr) {
|
if (map != nullptr) {
|
||||||
if (!BmpReadBitmap(&buffer, &info, &data)) {
|
if (!BmpReadBitmap(&buffer, &info, &data)) {
|
||||||
ShowErrorMessage(STR_ERROR_BMPMAP, STR_ERROR_BMPMAP_IMAGE_TYPE, WL_ERROR);
|
ShowErrorMessage(STR_ERROR_BMPMAP, STR_ERROR_BMPMAP_IMAGE_TYPE, MakeParameters(), WL_ERROR);
|
||||||
fclose(f);
|
fclose(f);
|
||||||
BmpDestroyData(&data);
|
BmpDestroyData(&data);
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -1728,14 +1728,15 @@ static CommandCost CheckIfFarEnoughFromConflictingIndustry(TileIndex tile, int t
|
||||||
static void AdvertiseIndustryOpening(const Industry *ind)
|
static void AdvertiseIndustryOpening(const Industry *ind)
|
||||||
{
|
{
|
||||||
const IndustrySpec *ind_spc = GetIndustrySpec(ind->type);
|
const IndustrySpec *ind_spc = GetIndustrySpec(ind->type);
|
||||||
SetDParam(0, ind_spc->name);
|
ArrayStringParameters<3> params;
|
||||||
|
params.SetParam(0, ind_spc->name);
|
||||||
if (ind_spc->new_industry_text > STR_LAST_STRINGID) {
|
if (ind_spc->new_industry_text > STR_LAST_STRINGID) {
|
||||||
SetDParam(1, STR_TOWN_NAME);
|
params.SetParam(1, STR_TOWN_NAME);
|
||||||
SetDParam(2, ind->town->index);
|
params.SetParam(2, ind->town->index);
|
||||||
} else {
|
} else {
|
||||||
SetDParam(1, ind->town->index);
|
params.SetParam(1, ind->town->index);
|
||||||
}
|
}
|
||||||
AddIndustryNewsItem(ind_spc->new_industry_text, NT_INDUSTRY_OPEN, ind->index);
|
AddIndustryNewsItem(ind_spc->new_industry_text, std::move(params), NT_INDUSTRY_OPEN, ind->index);
|
||||||
AI::BroadcastNewEvent(new ScriptEventIndustryOpen(ind->index));
|
AI::BroadcastNewEvent(new ScriptEventIndustryOpen(ind->index));
|
||||||
Game::NewEvent(new ScriptEventIndustryOpen(ind->index));
|
Game::NewEvent(new ScriptEventIndustryOpen(ind->index));
|
||||||
}
|
}
|
||||||
|
@ -2096,9 +2097,9 @@ CommandCost CmdBuildIndustry(DoCommandFlag flags, TileIndex tile, IndustryType i
|
||||||
}
|
}
|
||||||
if (ret.Failed() && IsLocalCompany()) {
|
if (ret.Failed() && IsLocalCompany()) {
|
||||||
if (prospect_success) {
|
if (prospect_success) {
|
||||||
ShowErrorMessage(STR_ERROR_CAN_T_PROSPECT_INDUSTRY, STR_ERROR_NO_SUITABLE_PLACES_FOR_PROSPECTING, WL_INFO);
|
ShowErrorMessage(STR_ERROR_CAN_T_PROSPECT_INDUSTRY, STR_ERROR_NO_SUITABLE_PLACES_FOR_PROSPECTING, MakeParameters(), WL_INFO);
|
||||||
} else {
|
} else {
|
||||||
ShowErrorMessage(STR_ERROR_CAN_T_PROSPECT_INDUSTRY, STR_ERROR_PROSPECTING_WAS_UNLUCKY, WL_INFO);
|
ShowErrorMessage(STR_ERROR_CAN_T_PROSPECT_INDUSTRY, STR_ERROR_PROSPECTING_WAS_UNLUCKY, MakeParameters(), WL_INFO);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2185,17 +2186,18 @@ CommandCost CmdIndustrySetProduction(DoCommandFlag flags, IndustryID ind_id, byt
|
||||||
|
|
||||||
/* Set parameters of news string */
|
/* Set parameters of news string */
|
||||||
NewsAllocatedData *data = nullptr;
|
NewsAllocatedData *data = nullptr;
|
||||||
|
ArrayStringParameters<3> params;
|
||||||
if (str == STR_NEWS_CUSTOM_ITEM) {
|
if (str == STR_NEWS_CUSTOM_ITEM) {
|
||||||
NewsStringData *news = new NewsStringData(custom_news);
|
NewsStringData *news = new NewsStringData(custom_news);
|
||||||
SetDParamStr(0, news->string);
|
params.SetParam(0, news->string);
|
||||||
} else if (str > STR_LAST_STRINGID) {
|
} else if (str > STR_LAST_STRINGID) {
|
||||||
SetDParam(0, STR_TOWN_NAME);
|
params.SetParam(0, STR_TOWN_NAME);
|
||||||
SetDParam(1, ind->town->index);
|
params.SetParam(1, ind->town->index);
|
||||||
SetDParam(2, GetIndustrySpec(ind->type)->name);
|
params.SetParam(2, GetIndustrySpec(ind->type)->name);
|
||||||
} else {
|
} else {
|
||||||
SetDParam(0, ind->index);
|
params.SetParam(0, ind->index);
|
||||||
}
|
}
|
||||||
AddIndustryNewsItem(str, nt, ind->index, data);
|
AddIndustryNewsItem(str, std::move(params), nt, ind->index, data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2768,11 +2770,9 @@ static void ReportNewsProductionChangeIndustry(Industry *ind, CargoID type, int
|
||||||
case 2: nt = NT_INDUSTRY_COMPANY; break;
|
case 2: nt = NT_INDUSTRY_COMPANY; break;
|
||||||
default: NOT_REACHED();
|
default: NOT_REACHED();
|
||||||
}
|
}
|
||||||
SetDParam(2, abs(percent));
|
|
||||||
SetDParam(0, CargoSpec::Get(type)->name);
|
|
||||||
SetDParam(1, ind->index);
|
|
||||||
AddIndustryNewsItem(
|
AddIndustryNewsItem(
|
||||||
percent >= 0 ? STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_SMOOTH : STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_SMOOTH,
|
percent >= 0 ? STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_SMOOTH : STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_SMOOTH,
|
||||||
|
MakeParameters(CargoSpec::Get(type)->name, ind->index, abs(percent)),
|
||||||
nt,
|
nt,
|
||||||
ind->index
|
ind->index
|
||||||
);
|
);
|
||||||
|
@ -2974,23 +2974,24 @@ static void ChangeIndustryProduction(Industry *i, bool monthly)
|
||||||
default: NOT_REACHED();
|
default: NOT_REACHED();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
ArrayStringParameters<3> params;
|
||||||
/* Set parameters of news string */
|
/* Set parameters of news string */
|
||||||
if (str > STR_LAST_STRINGID) {
|
if (str > STR_LAST_STRINGID) {
|
||||||
SetDParam(0, STR_TOWN_NAME);
|
params.SetParam(0, STR_TOWN_NAME);
|
||||||
SetDParam(1, i->town->index);
|
params.SetParam(1, i->town->index);
|
||||||
SetDParam(2, indspec->name);
|
params.SetParam(2, indspec->name);
|
||||||
} else if (closeit) {
|
} else if (closeit) {
|
||||||
SetDParam(0, STR_FORMAT_INDUSTRY_NAME);
|
params.SetParam(0, STR_FORMAT_INDUSTRY_NAME);
|
||||||
SetDParam(1, i->town->index);
|
params.SetParam(1, i->town->index);
|
||||||
SetDParam(2, indspec->name);
|
params.SetParam(2, indspec->name);
|
||||||
} else {
|
} else {
|
||||||
SetDParam(0, i->index);
|
params.SetParam(0, i->index);
|
||||||
}
|
}
|
||||||
/* and report the news to the user */
|
/* and report the news to the user */
|
||||||
if (closeit) {
|
if (closeit) {
|
||||||
AddTileNewsItem(str, nt, i->location.tile + TileDiffXY(1, 1));
|
AddTileNewsItem(str, std::move(params), nt, i->location.tile + TileDiffXY(1, 1));
|
||||||
} else {
|
} else {
|
||||||
AddIndustryNewsItem(str, nt, i->index);
|
AddIndustryNewsItem(str, std::move(params), nt, i->index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3087,8 +3088,7 @@ void CheckIndustries()
|
||||||
if (chance == 0 || !force_at_least_one) continue; // Types that are not available can be skipped.
|
if (chance == 0 || !force_at_least_one) continue; // Types that are not available can be skipped.
|
||||||
|
|
||||||
const IndustrySpec *is = GetIndustrySpec(it);
|
const IndustrySpec *is = GetIndustrySpec(it);
|
||||||
SetDParam(0, is->name);
|
ShowErrorMessage(STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES, STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES_EXPLANATION, MakeParameters(is->name), WL_WARNING);
|
||||||
ShowErrorMessage(STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES, STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES_EXPLANATION, WL_WARNING);
|
|
||||||
|
|
||||||
count++;
|
count++;
|
||||||
if (count >= 3) break; // Don't swamp the user with errors.
|
if (count >= 3) break; // Don't swamp the user with errors.
|
||||||
|
|
|
@ -255,8 +255,7 @@ void CcBuildIndustry(Commands, const CommandCost &result, TileIndex tile, Indust
|
||||||
if (indtype < NUM_INDUSTRYTYPES) {
|
if (indtype < NUM_INDUSTRYTYPES) {
|
||||||
const IndustrySpec *indsp = GetIndustrySpec(indtype);
|
const IndustrySpec *indsp = GetIndustrySpec(indtype);
|
||||||
if (indsp->enabled) {
|
if (indsp->enabled) {
|
||||||
SetDParam(0, indsp->name);
|
ShowErrorMessage(STR_ERROR_CAN_T_BUILD_HERE, result.GetErrorMessage(), MakeParameters(indsp->name), WL_INFO, TileX(tile) * TILE_SIZE, TileY(tile) * TILE_SIZE);
|
||||||
ShowErrorMessage(STR_ERROR_CAN_T_BUILD_HERE, result.GetErrorMessage(), WL_INFO, TileX(tile) * TILE_SIZE, TileY(tile) * TILE_SIZE);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -600,7 +599,7 @@ public:
|
||||||
if (!confirmed) return;
|
if (!confirmed) return;
|
||||||
|
|
||||||
if (Town::GetNumItems() == 0) {
|
if (Town::GetNumItems() == 0) {
|
||||||
ShowErrorMessage(STR_ERROR_CAN_T_GENERATE_INDUSTRIES, STR_ERROR_MUST_FOUND_TOWN_FIRST, WL_INFO);
|
ShowErrorMessage(STR_ERROR_CAN_T_GENERATE_INDUSTRIES, STR_ERROR_MUST_FOUND_TOWN_FIRST, MakeParameters(), WL_INFO);
|
||||||
} else {
|
} else {
|
||||||
Backup<bool> old_generating_world(_generating_world, true, FILE_LINE);
|
Backup<bool> old_generating_world(_generating_world, true, FILE_LINE);
|
||||||
BasePersistentStorageArray::SwitchMode(PSM_ENTER_GAMELOOP);
|
BasePersistentStorageArray::SwitchMode(PSM_ENTER_GAMELOOP);
|
||||||
|
@ -632,14 +631,14 @@ public:
|
||||||
case WID_DPI_CREATE_RANDOM_INDUSTRIES_WIDGET: {
|
case WID_DPI_CREATE_RANDOM_INDUSTRIES_WIDGET: {
|
||||||
assert(_game_mode == GM_EDITOR);
|
assert(_game_mode == GM_EDITOR);
|
||||||
this->HandleButtonClick(WID_DPI_CREATE_RANDOM_INDUSTRIES_WIDGET);
|
this->HandleButtonClick(WID_DPI_CREATE_RANDOM_INDUSTRIES_WIDGET);
|
||||||
ShowQuery(STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_CAPTION, STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_QUERY, nullptr, AskManyRandomIndustriesCallback);
|
ShowQuery(STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_CAPTION, STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_QUERY, MakeParameters(), nullptr, AskManyRandomIndustriesCallback);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case WID_DPI_REMOVE_ALL_INDUSTRIES_WIDGET: {
|
case WID_DPI_REMOVE_ALL_INDUSTRIES_WIDGET: {
|
||||||
assert(_game_mode == GM_EDITOR);
|
assert(_game_mode == GM_EDITOR);
|
||||||
this->HandleButtonClick(WID_DPI_REMOVE_ALL_INDUSTRIES_WIDGET);
|
this->HandleButtonClick(WID_DPI_REMOVE_ALL_INDUSTRIES_WIDGET);
|
||||||
ShowQuery(STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_CAPTION, STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_QUERY, nullptr, AskRemoveAllIndustriesCallback);
|
ShowQuery(STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_CAPTION, STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_QUERY, MakeParameters(), nullptr, AskRemoveAllIndustriesCallback);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -701,8 +700,7 @@ public:
|
||||||
if (_game_mode == GM_EDITOR) {
|
if (_game_mode == GM_EDITOR) {
|
||||||
/* Show error if no town exists at all */
|
/* Show error if no town exists at all */
|
||||||
if (Town::GetNumItems() == 0) {
|
if (Town::GetNumItems() == 0) {
|
||||||
SetDParam(0, indsp->name);
|
ShowErrorMessage(STR_ERROR_CAN_T_BUILD_HERE, STR_ERROR_MUST_FOUND_TOWN_FIRST, MakeParameters(indsp->name), WL_INFO, pt.x, pt.y);
|
||||||
ShowErrorMessage(STR_ERROR_CAN_T_BUILD_HERE, STR_ERROR_MUST_FOUND_TOWN_FIRST, WL_INFO, pt.x, pt.y);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3167,7 +3165,7 @@ struct IndustryCargoesWindow : public Window {
|
||||||
|
|
||||||
case CFT_INDUSTRY:
|
case CFT_INDUSTRY:
|
||||||
if (fld->u.industry.ind_type < NUM_INDUSTRYTYPES && (this->ind_cargo >= NUM_INDUSTRYTYPES || fieldxy.x != 2)) {
|
if (fld->u.industry.ind_type < NUM_INDUSTRYTYPES && (this->ind_cargo >= NUM_INDUSTRYTYPES || fieldxy.x != 2)) {
|
||||||
GuiShowTooltips(this, STR_INDUSTRY_CARGOES_INDUSTRY_TOOLTIP, close_cond);
|
GuiShowTooltips(this, STR_INDUSTRY_CARGOES_INDUSTRY_TOOLTIP, close_cond, MakeParameters());
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
@ -3176,8 +3174,7 @@ struct IndustryCargoesWindow : public Window {
|
||||||
}
|
}
|
||||||
if (IsValidCargoID(cid) && (this->ind_cargo < NUM_INDUSTRYTYPES || cid != this->ind_cargo - NUM_INDUSTRYTYPES)) {
|
if (IsValidCargoID(cid) && (this->ind_cargo < NUM_INDUSTRYTYPES || cid != this->ind_cargo - NUM_INDUSTRYTYPES)) {
|
||||||
const CargoSpec *csp = CargoSpec::Get(cid);
|
const CargoSpec *csp = CargoSpec::Get(cid);
|
||||||
SetDParam(0, csp->name);
|
GuiShowTooltips(this, STR_INDUSTRY_CARGOES_CARGO_TOOLTIP, close_cond, MakeParameters(csp->name));
|
||||||
GuiShowTooltips(this, STR_INDUSTRY_CARGOES_CARGO_TOOLTIP, close_cond, 1);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -347,7 +347,7 @@ struct SelectGameWindow : public Window {
|
||||||
|
|
||||||
case WID_SGI_PLAY_NETWORK:
|
case WID_SGI_PLAY_NETWORK:
|
||||||
if (!_network_available) {
|
if (!_network_available) {
|
||||||
ShowErrorMessage(STR_NETWORK_ERROR_NOTAVAILABLE, INVALID_STRING_ID, WL_ERROR);
|
ShowErrorMessage(STR_NETWORK_ERROR_NOTAVAILABLE, INVALID_STRING_ID, MakeParameters(), WL_ERROR);
|
||||||
} else {
|
} else {
|
||||||
ShowNetworkGameWindow();
|
ShowNetworkGameWindow();
|
||||||
}
|
}
|
||||||
|
@ -365,7 +365,7 @@ struct SelectGameWindow : public Window {
|
||||||
case WID_SGI_GRF_SETTINGS: ShowNewGRFSettings(true, true, false, &_grfconfig_newgame); break;
|
case WID_SGI_GRF_SETTINGS: ShowNewGRFSettings(true, true, false, &_grfconfig_newgame); break;
|
||||||
case WID_SGI_CONTENT_DOWNLOAD:
|
case WID_SGI_CONTENT_DOWNLOAD:
|
||||||
if (!_network_available) {
|
if (!_network_available) {
|
||||||
ShowErrorMessage(STR_NETWORK_ERROR_NOTAVAILABLE, INVALID_STRING_ID, WL_ERROR);
|
ShowErrorMessage(STR_NETWORK_ERROR_NOTAVAILABLE, INVALID_STRING_ID, MakeParameters(), WL_ERROR);
|
||||||
} else {
|
} else {
|
||||||
ShowNetworkContentListWindow();
|
ShowNetworkContentListWindow();
|
||||||
}
|
}
|
||||||
|
@ -481,6 +481,7 @@ void AskExitGame()
|
||||||
ShowQuery(
|
ShowQuery(
|
||||||
STR_QUIT_CAPTION,
|
STR_QUIT_CAPTION,
|
||||||
STR_QUIT_ARE_YOU_SURE_YOU_WANT_TO_EXIT_OPENTTD,
|
STR_QUIT_ARE_YOU_SURE_YOU_WANT_TO_EXIT_OPENTTD,
|
||||||
|
MakeParameters(),
|
||||||
nullptr,
|
nullptr,
|
||||||
AskExitGameCallback,
|
AskExitGameCallback,
|
||||||
true
|
true
|
||||||
|
@ -501,6 +502,7 @@ void AskExitToGameMenu()
|
||||||
ShowQuery(
|
ShowQuery(
|
||||||
STR_ABANDON_GAME_CAPTION,
|
STR_ABANDON_GAME_CAPTION,
|
||||||
(_game_mode != GM_EDITOR) ? STR_ABANDON_GAME_QUERY : STR_ABANDON_SCENARIO_QUERY,
|
(_game_mode != GM_EDITOR) ? STR_ABANDON_GAME_QUERY : STR_ABANDON_SCENARIO_QUERY,
|
||||||
|
MakeParameters(),
|
||||||
nullptr,
|
nullptr,
|
||||||
AskExitToGameMenuCallback,
|
AskExitToGameMenuCallback,
|
||||||
true
|
true
|
||||||
|
|
|
@ -401,20 +401,15 @@ bool LinkGraphOverlay::ShowTooltip(Point pt, TooltipCloseCondition close_cond)
|
||||||
SetDParam(0, time);
|
SetDParam(0, time);
|
||||||
tooltip_extension += GetString(STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION);
|
tooltip_extension += GetString(STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION);
|
||||||
}
|
}
|
||||||
SetDParam(0, link.cargo);
|
|
||||||
SetDParam(1, link.Usage());
|
|
||||||
SetDParam(2, i->first);
|
|
||||||
SetDParam(3, j->first);
|
|
||||||
SetDParam(4, link.Usage() * 100 / (link.capacity + 1));
|
|
||||||
SetDParamStr(5, tooltip_extension);
|
|
||||||
GuiShowTooltips(this->window,
|
GuiShowTooltips(this->window,
|
||||||
TimerGameEconomy::UsingWallclockUnits() ? STR_LINKGRAPH_STATS_TOOLTIP_MINUTE : STR_LINKGRAPH_STATS_TOOLTIP_MONTH,
|
TimerGameEconomy::UsingWallclockUnits() ? STR_LINKGRAPH_STATS_TOOLTIP_MINUTE : STR_LINKGRAPH_STATS_TOOLTIP_MONTH,
|
||||||
close_cond, 7);
|
close_cond, MakeParameters(link.cargo, link.Usage(), i->first, j->first, link.Usage() * 100 / (link.capacity + 1), tooltip_extension));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
GuiShowTooltips(this->window, STR_NULL, close_cond);
|
GuiShowTooltips(this->window, STR_NULL, close_cond, MakeParameters());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -646,17 +641,15 @@ bool LinkGraphLegendWindow::OnTooltip([[maybe_unused]] Point, WidgetID widget, T
|
||||||
{
|
{
|
||||||
if (IsInsideMM(widget, WID_LGL_COMPANY_FIRST, WID_LGL_COMPANY_LAST + 1)) {
|
if (IsInsideMM(widget, WID_LGL_COMPANY_FIRST, WID_LGL_COMPANY_LAST + 1)) {
|
||||||
if (this->IsWidgetDisabled(widget)) {
|
if (this->IsWidgetDisabled(widget)) {
|
||||||
GuiShowTooltips(this, STR_LINKGRAPH_LEGEND_SELECT_COMPANIES, close_cond);
|
GuiShowTooltips(this, STR_LINKGRAPH_LEGEND_SELECT_COMPANIES, close_cond, MakeParameters());
|
||||||
} else {
|
} else {
|
||||||
SetDParam(0, STR_LINKGRAPH_LEGEND_SELECT_COMPANIES);
|
GuiShowTooltips(this, STR_LINKGRAPH_LEGEND_COMPANY_TOOLTIP, close_cond, MakeParameters(STR_LINKGRAPH_LEGEND_SELECT_COMPANIES, (CompanyID)(widget - WID_LGL_COMPANY_FIRST)));
|
||||||
SetDParam(1, (CompanyID)(widget - WID_LGL_COMPANY_FIRST));
|
|
||||||
GuiShowTooltips(this, STR_LINKGRAPH_LEGEND_COMPANY_TOOLTIP, close_cond, 2);
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (IsInsideMM(widget, WID_LGL_CARGO_FIRST, WID_LGL_CARGO_LAST + 1)) {
|
if (IsInsideMM(widget, WID_LGL_CARGO_FIRST, WID_LGL_CARGO_LAST + 1)) {
|
||||||
const CargoSpec *cargo = _sorted_cargo_specs[widget - WID_LGL_CARGO_FIRST];
|
const CargoSpec *cargo = _sorted_cargo_specs[widget - WID_LGL_CARGO_FIRST];
|
||||||
GuiShowTooltips(this, cargo->name, close_cond);
|
GuiShowTooltips(this, cargo->name, close_cond, MakeParameters());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -188,6 +188,7 @@ CommandCost CmdPause(DoCommandFlag flags, PauseMode mode, bool pause)
|
||||||
ShowQuery(
|
ShowQuery(
|
||||||
STR_NEWGRF_UNPAUSE_WARNING_TITLE,
|
STR_NEWGRF_UNPAUSE_WARNING_TITLE,
|
||||||
STR_NEWGRF_UNPAUSE_WARNING,
|
STR_NEWGRF_UNPAUSE_WARNING,
|
||||||
|
MakeParameters(),
|
||||||
nullptr,
|
nullptr,
|
||||||
AskUnsafeUnpauseCallback
|
AskUnsafeUnpauseCallback
|
||||||
);
|
);
|
||||||
|
|
|
@ -550,8 +550,7 @@ void ShowEstimatedCostOrIncome(Money cost, int x, int y)
|
||||||
cost = -cost;
|
cost = -cost;
|
||||||
msg = STR_MESSAGE_ESTIMATED_INCOME;
|
msg = STR_MESSAGE_ESTIMATED_INCOME;
|
||||||
}
|
}
|
||||||
SetDParam(0, cost);
|
ShowErrorMessage(msg, INVALID_STRING_ID, MakeParameters(cost), WL_INFO, x, y);
|
||||||
ShowErrorMessage(msg, INVALID_STRING_ID, WL_INFO, x, y);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -573,8 +572,8 @@ void ShowCostOrIncomeAnimation(int x, int y, int z, Money cost)
|
||||||
cost = -cost;
|
cost = -cost;
|
||||||
msg = STR_INCOME_FLOAT_INCOME;
|
msg = STR_INCOME_FLOAT_INCOME;
|
||||||
}
|
}
|
||||||
SetDParam(0, cost);
|
|
||||||
AddTextEffect(msg, pt.x, pt.y, Ticks::DAY_TICKS, TE_RISING);
|
AddTextEffect(msg, MakeParameters(cost), pt.x, pt.y, Ticks::DAY_TICKS, TE_RISING);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -589,17 +588,15 @@ void ShowFeederIncomeAnimation(int x, int y, int z, Money transfer, Money income
|
||||||
{
|
{
|
||||||
Point pt = RemapCoords(x, y, z);
|
Point pt = RemapCoords(x, y, z);
|
||||||
|
|
||||||
SetDParam(0, transfer);
|
|
||||||
if (income == 0) {
|
if (income == 0) {
|
||||||
AddTextEffect(STR_FEEDER, pt.x, pt.y, Ticks::DAY_TICKS, TE_RISING);
|
AddTextEffect(STR_FEEDER, MakeParameters(transfer), pt.x, pt.y, Ticks::DAY_TICKS, TE_RISING);
|
||||||
} else {
|
} else {
|
||||||
StringID msg = STR_FEEDER_COST;
|
StringID msg = STR_FEEDER_COST;
|
||||||
if (income < 0) {
|
if (income < 0) {
|
||||||
income = -income;
|
income = -income;
|
||||||
msg = STR_FEEDER_INCOME;
|
msg = STR_FEEDER_INCOME;
|
||||||
}
|
}
|
||||||
SetDParam(1, income);
|
AddTextEffect(msg, MakeParameters(transfer, income), pt.x, pt.y, Ticks::DAY_TICKS, TE_RISING);
|
||||||
AddTextEffect(msg, pt.x, pt.y, Ticks::DAY_TICKS, TE_RISING);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -618,8 +615,7 @@ TextEffectID ShowFillingPercent(int x, int y, int z, uint8_t percent, StringID s
|
||||||
|
|
||||||
assert(string != STR_NULL);
|
assert(string != STR_NULL);
|
||||||
|
|
||||||
SetDParam(0, percent);
|
return AddTextEffect(string, MakeParameters(percent), pt.x, pt.y, 0, TE_STATIC);
|
||||||
return AddTextEffect(string, pt.x, pt.y, 0, TE_STATIC);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -631,8 +627,9 @@ void UpdateFillingPercent(TextEffectID te_id, uint8_t percent, StringID string)
|
||||||
{
|
{
|
||||||
assert(string != STR_NULL);
|
assert(string != STR_NULL);
|
||||||
|
|
||||||
SetDParam(0, percent);
|
auto params = MakeParameters(1);
|
||||||
UpdateTextEffect(te_id, string);
|
params.SetParam(0, percent);
|
||||||
|
UpdateTextEffect(te_id, string, std::move(params));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -665,13 +662,14 @@ struct TooltipsWindow : public Window
|
||||||
std::vector<StringParameterBackup> params; ///< The string parameters.
|
std::vector<StringParameterBackup> params; ///< The string parameters.
|
||||||
TooltipCloseCondition close_cond; ///< Condition for closing the window.
|
TooltipCloseCondition close_cond; ///< Condition for closing the window.
|
||||||
|
|
||||||
TooltipsWindow(Window *parent, StringID str, uint paramcount, TooltipCloseCondition close_tooltip) : Window(&_tool_tips_desc)
|
TooltipsWindow(Window *parent, StringID str, StringParameters &¶ms, TooltipCloseCondition close_tooltip) : Window(&_tool_tips_desc)
|
||||||
{
|
{
|
||||||
this->parent = parent;
|
this->parent = parent;
|
||||||
this->string_id = str;
|
this->string_id = str;
|
||||||
CopyOutDParam(this->params, paramcount);
|
CopyOutDParam(this->params, std::move(params));
|
||||||
this->close_cond = close_tooltip;
|
this->close_cond = close_tooltip;
|
||||||
|
|
||||||
|
CopyInDParam(this->params);
|
||||||
this->InitNested();
|
this->InitNested();
|
||||||
|
|
||||||
CLRBITS(this->flags, WF_WHITE_BORDER);
|
CLRBITS(this->flags, WF_WHITE_BORDER);
|
||||||
|
@ -749,15 +747,15 @@ struct TooltipsWindow : public Window
|
||||||
* @param parent The window this tooltip is related to.
|
* @param parent The window this tooltip is related to.
|
||||||
* @param str String to be displayed
|
* @param str String to be displayed
|
||||||
* @param close_tooltip the condition under which the tooltip closes
|
* @param close_tooltip the condition under which the tooltip closes
|
||||||
* @param paramcount number of params to deal with
|
* @param params Parameters for the string.
|
||||||
*/
|
*/
|
||||||
void GuiShowTooltips(Window *parent, StringID str, TooltipCloseCondition close_tooltip, uint paramcount)
|
void GuiShowTooltips(Window *parent, StringID str, TooltipCloseCondition close_tooltip, StringParameters &¶ms)
|
||||||
{
|
{
|
||||||
CloseWindowById(WC_TOOLTIPS, 0);
|
CloseWindowById(WC_TOOLTIPS, 0);
|
||||||
|
|
||||||
if (str == STR_NULL || !_cursor.in_window) return;
|
if (str == STR_NULL || !_cursor.in_window) return;
|
||||||
|
|
||||||
new TooltipsWindow(parent, str, paramcount, close_tooltip);
|
new TooltipsWindow(parent, str, std::move(params), close_tooltip);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QueryString::HandleEditBox(Window *w, WidgetID wid)
|
void QueryString::HandleEditBox(Window *w, WidgetID wid)
|
||||||
|
@ -1093,18 +1091,18 @@ void ShowQueryString(StringID str, StringID caption, uint maxsize, Window *paren
|
||||||
*/
|
*/
|
||||||
struct QueryWindow : public Window {
|
struct QueryWindow : public Window {
|
||||||
QueryCallbackProc *proc; ///< callback function executed on closing of popup. Window* points to parent, bool is true if 'yes' clicked, false otherwise
|
QueryCallbackProc *proc; ///< callback function executed on closing of popup. Window* points to parent, bool is true if 'yes' clicked, false otherwise
|
||||||
std::vector<StringParameterBackup> params; ///< local copy of #_global_string_params
|
std::vector<StringParameterBackup> params; ///< Parameters for the message.
|
||||||
StringID message; ///< message shown for query window
|
StringID message; ///< message shown for query window
|
||||||
|
|
||||||
QueryWindow(WindowDesc *desc, StringID caption, StringID message, Window *parent, QueryCallbackProc *callback) : Window(desc)
|
QueryWindow(WindowDesc *desc, StringID caption, StringID message, StringParameters &¶ms, Window *parent, QueryCallbackProc *callback) : Window(desc)
|
||||||
{
|
{
|
||||||
/* Create a backup of the variadic arguments to strings because it will be
|
CopyOutDParam(this->params, std::move(params));
|
||||||
* overridden pretty often. We will copy these back for drawing */
|
|
||||||
CopyOutDParam(this->params, 10);
|
|
||||||
this->message = message;
|
this->message = message;
|
||||||
this->proc = callback;
|
this->proc = callback;
|
||||||
this->parent = parent;
|
this->parent = parent;
|
||||||
|
|
||||||
|
CopyInDParam(this->params);
|
||||||
|
|
||||||
this->CreateNestedTree();
|
this->CreateNestedTree();
|
||||||
this->GetWidget<NWidgetCore>(WID_Q_CAPTION)->SetDataTip(caption, STR_NULL);
|
this->GetWidget<NWidgetCore>(WID_Q_CAPTION)->SetDataTip(caption, STR_NULL);
|
||||||
this->FinishInitNested(WN_CONFIRM_POPUP_QUERY);
|
this->FinishInitNested(WN_CONFIRM_POPUP_QUERY);
|
||||||
|
@ -1219,12 +1217,13 @@ static WindowDesc _query_desc(__FILE__, __LINE__,
|
||||||
* The window is aligned to the centre of its parent.
|
* The window is aligned to the centre of its parent.
|
||||||
* @param caption string shown as window caption
|
* @param caption string shown as window caption
|
||||||
* @param message string that will be shown for the window
|
* @param message string that will be shown for the window
|
||||||
|
* @param params Parameters for the message.
|
||||||
* @param parent pointer to parent window, if this pointer is nullptr the parent becomes
|
* @param parent pointer to parent window, if this pointer is nullptr the parent becomes
|
||||||
* the main window WC_MAIN_WINDOW
|
* the main window WC_MAIN_WINDOW
|
||||||
* @param callback callback function pointer to set in the window descriptor
|
* @param callback callback function pointer to set in the window descriptor
|
||||||
* @param focus whether the window should be focussed (by default false)
|
* @param focus whether the window should be focussed (by default false)
|
||||||
*/
|
*/
|
||||||
void ShowQuery(StringID caption, StringID message, Window *parent, QueryCallbackProc *callback, bool focus)
|
void ShowQuery(StringID caption, StringID message, StringParameters &¶ms, Window *parent, QueryCallbackProc *callback, bool focus)
|
||||||
{
|
{
|
||||||
if (parent == nullptr) parent = GetMainWindow();
|
if (parent == nullptr) parent = GetMainWindow();
|
||||||
|
|
||||||
|
@ -1238,6 +1237,6 @@ void ShowQuery(StringID caption, StringID message, Window *parent, QueryCallback
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
QueryWindow *q = new QueryWindow(&_query_desc, caption, message, parent, callback);
|
QueryWindow *q = new QueryWindow(&_query_desc, caption, message, std::move(params), parent, callback);
|
||||||
if (focus) SetFocusedWindow(q);
|
if (focus) SetFocusedWindow(q);
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,7 +47,7 @@ NetworkRecvStatus NetworkGameSocketHandler::CloseConnection(bool)
|
||||||
ClientNetworkEmergencySave();
|
ClientNetworkEmergencySave();
|
||||||
_switch_mode = SM_MENU;
|
_switch_mode = SM_MENU;
|
||||||
_networking = false;
|
_networking = false;
|
||||||
ShowErrorMessage(STR_NETWORK_ERROR_LOSTCONNECTION, INVALID_STRING_ID, WL_CRITICAL);
|
ShowErrorMessage(STR_NETWORK_ERROR_LOSTCONNECTION, INVALID_STRING_ID, MakeParameters(), WL_CRITICAL);
|
||||||
|
|
||||||
return this->CloseConnection(NETWORK_RECV_STATUS_CLIENT_QUIT);
|
return this->CloseConnection(NETWORK_RECV_STATUS_CLIENT_QUIT);
|
||||||
}
|
}
|
||||||
|
|
|
@ -287,7 +287,7 @@ uint NetworkCalculateLag(const NetworkClientSocket *cs)
|
||||||
void ShowNetworkError(StringID error_string)
|
void ShowNetworkError(StringID error_string)
|
||||||
{
|
{
|
||||||
_switch_mode = SM_MENU;
|
_switch_mode = SM_MENU;
|
||||||
ShowErrorMessage(error_string, INVALID_STRING_ID, WL_CRITICAL);
|
ShowErrorMessage(error_string, INVALID_STRING_ID, MakeParameters(), WL_CRITICAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -845,7 +845,7 @@ bool NetworkValidateServerName(std::string &server_name)
|
||||||
StrTrimInPlace(server_name);
|
StrTrimInPlace(server_name);
|
||||||
if (!server_name.empty()) return true;
|
if (!server_name.empty()) return true;
|
||||||
|
|
||||||
ShowErrorMessage(STR_NETWORK_ERROR_BAD_SERVER_NAME, INVALID_STRING_ID, WL_ERROR);
|
ShowErrorMessage(STR_NETWORK_ERROR_BAD_SERVER_NAME, INVALID_STRING_ID, MakeParameters(), WL_ERROR);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -574,7 +574,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FULL(Packet *)
|
||||||
Debug(net, 9, "Client::Receive_SERVER_FULL()");
|
Debug(net, 9, "Client::Receive_SERVER_FULL()");
|
||||||
|
|
||||||
/* We try to join a server which is full */
|
/* We try to join a server which is full */
|
||||||
ShowErrorMessage(STR_NETWORK_ERROR_SERVER_FULL, INVALID_STRING_ID, WL_CRITICAL);
|
ShowErrorMessage(STR_NETWORK_ERROR_SERVER_FULL, INVALID_STRING_ID, MakeParameters(), WL_CRITICAL);
|
||||||
|
|
||||||
return NETWORK_RECV_STATUS_SERVER_FULL;
|
return NETWORK_RECV_STATUS_SERVER_FULL;
|
||||||
}
|
}
|
||||||
|
@ -584,7 +584,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_BANNED(Packet *
|
||||||
Debug(net, 9, "Client::Receive_SERVER_BANNED()");
|
Debug(net, 9, "Client::Receive_SERVER_BANNED()");
|
||||||
|
|
||||||
/* We try to join a server where we are banned */
|
/* We try to join a server where we are banned */
|
||||||
ShowErrorMessage(STR_NETWORK_ERROR_SERVER_BANNED, INVALID_STRING_ID, WL_CRITICAL);
|
ShowErrorMessage(STR_NETWORK_ERROR_SERVER_BANNED, INVALID_STRING_ID, MakeParameters(), WL_CRITICAL);
|
||||||
|
|
||||||
return NETWORK_RECV_STATUS_SERVER_BANNED;
|
return NETWORK_RECV_STATUS_SERVER_BANNED;
|
||||||
}
|
}
|
||||||
|
@ -685,10 +685,10 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR(Packet *p
|
||||||
if (error < (ptrdiff_t)lengthof(network_error_strings)) err = network_error_strings[error];
|
if (error < (ptrdiff_t)lengthof(network_error_strings)) err = network_error_strings[error];
|
||||||
/* In case of kicking a client, we assume there is a kick message in the packet if we can read one byte */
|
/* In case of kicking a client, we assume there is a kick message in the packet if we can read one byte */
|
||||||
if (error == NETWORK_ERROR_KICKED && p->CanReadFromPacket(1)) {
|
if (error == NETWORK_ERROR_KICKED && p->CanReadFromPacket(1)) {
|
||||||
SetDParamStr(0, p->Recv_string(NETWORK_CHAT_LENGTH));
|
auto message = p->Recv_string(NETWORK_CHAT_LENGTH);
|
||||||
ShowErrorMessage(err, STR_NETWORK_ERROR_KICK_MESSAGE, WL_CRITICAL);
|
ShowErrorMessage(err, STR_NETWORK_ERROR_KICK_MESSAGE, MakeParameters(message), WL_CRITICAL);
|
||||||
} else {
|
} else {
|
||||||
ShowErrorMessage(err, INVALID_STRING_ID, WL_CRITICAL);
|
ShowErrorMessage(err, INVALID_STRING_ID, MakeParameters(), WL_CRITICAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Perform an emergency save if we had already entered the game */
|
/* Perform an emergency save if we had already entered the game */
|
||||||
|
@ -726,7 +726,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CHECK_NEWGRFS(P
|
||||||
}
|
}
|
||||||
|
|
||||||
/* NewGRF mismatch, bail out */
|
/* NewGRF mismatch, bail out */
|
||||||
ShowErrorMessage(STR_NETWORK_ERROR_NEWGRF_MISMATCH, INVALID_STRING_ID, WL_CRITICAL);
|
ShowErrorMessage(STR_NETWORK_ERROR_NEWGRF_MISMATCH, INVALID_STRING_ID, MakeParameters(), WL_CRITICAL);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -883,7 +883,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_DONE(Packet
|
||||||
this->last_packet = std::chrono::steady_clock::now();
|
this->last_packet = std::chrono::steady_clock::now();
|
||||||
|
|
||||||
if (!load_success) {
|
if (!load_success) {
|
||||||
ShowErrorMessage(STR_NETWORK_ERROR_SAVEGAMEERROR, INVALID_STRING_ID, WL_CRITICAL);
|
ShowErrorMessage(STR_NETWORK_ERROR_SAVEGAMEERROR, INVALID_STRING_ID, MakeParameters(), WL_CRITICAL);
|
||||||
return NETWORK_RECV_STATUS_SAVEGAME;
|
return NETWORK_RECV_STATUS_SAVEGAME;
|
||||||
}
|
}
|
||||||
/* If the savegame has successfully loaded, ALL windows have been removed,
|
/* If the savegame has successfully loaded, ALL windows have been removed,
|
||||||
|
@ -1123,7 +1123,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_SHUTDOWN(Packet
|
||||||
/* Only when we're trying to join we really
|
/* Only when we're trying to join we really
|
||||||
* care about the server shutting down. */
|
* care about the server shutting down. */
|
||||||
if (this->status >= STATUS_JOIN) {
|
if (this->status >= STATUS_JOIN) {
|
||||||
ShowErrorMessage(STR_NETWORK_MESSAGE_SERVER_SHUTDOWN, INVALID_STRING_ID, WL_CRITICAL);
|
ShowErrorMessage(STR_NETWORK_MESSAGE_SERVER_SHUTDOWN, INVALID_STRING_ID, MakeParameters(), WL_CRITICAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->status == STATUS_ACTIVE) ClientNetworkEmergencySave();
|
if (this->status == STATUS_ACTIVE) ClientNetworkEmergencySave();
|
||||||
|
@ -1142,7 +1142,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEWGAME(Packet
|
||||||
* Client ID modulo 16 + 1 (value 0 means no reconnect).
|
* Client ID modulo 16 + 1 (value 0 means no reconnect).
|
||||||
* This way reconnects should be spread out a bit. */
|
* This way reconnects should be spread out a bit. */
|
||||||
_network_reconnect = _network_own_client_id % 16 + 1;
|
_network_reconnect = _network_own_client_id % 16 + 1;
|
||||||
ShowErrorMessage(STR_NETWORK_MESSAGE_SERVER_REBOOT, INVALID_STRING_ID, WL_CRITICAL);
|
ShowErrorMessage(STR_NETWORK_MESSAGE_SERVER_REBOOT, INVALID_STRING_ID, MakeParameters(), WL_CRITICAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->status == STATUS_ACTIVE) ClientNetworkEmergencySave();
|
if (this->status == STATUS_ACTIVE) ClientNetworkEmergencySave();
|
||||||
|
@ -1246,8 +1246,8 @@ void ClientNetworkGameSocketHandler::CheckConnection()
|
||||||
if (std::chrono::duration_cast<std::chrono::seconds>(last_lag) == std::chrono::duration_cast<std::chrono::seconds>(lag)) return;
|
if (std::chrono::duration_cast<std::chrono::seconds>(last_lag) == std::chrono::duration_cast<std::chrono::seconds>(lag)) return;
|
||||||
|
|
||||||
last_lag = lag;
|
last_lag = lag;
|
||||||
SetDParam(0, std::chrono::duration_cast<std::chrono::seconds>(lag).count());
|
auto duration = std::chrono::duration_cast<std::chrono::seconds>(lag).count();
|
||||||
ShowErrorMessage(STR_NETWORK_ERROR_CLIENT_GUI_LOST_CONNECTION_CAPTION, STR_NETWORK_ERROR_CLIENT_GUI_LOST_CONNECTION, WL_INFO);
|
ShowErrorMessage(STR_NETWORK_ERROR_CLIENT_GUI_LOST_CONNECTION_CAPTION, STR_NETWORK_ERROR_CLIENT_GUI_LOST_CONNECTION, MakeParameters(duration), WL_INFO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1339,7 +1339,7 @@ bool NetworkValidateClientName(std::string &client_name)
|
||||||
StrTrimInPlace(client_name);
|
StrTrimInPlace(client_name);
|
||||||
if (NetworkIsValidClientName(client_name)) return true;
|
if (NetworkIsValidClientName(client_name)) return true;
|
||||||
|
|
||||||
ShowErrorMessage(STR_NETWORK_ERROR_BAD_PLAYER_NAME, INVALID_STRING_ID, WL_ERROR);
|
ShowErrorMessage(STR_NETWORK_ERROR_BAD_PLAYER_NAME, INVALID_STRING_ID, MakeParameters(), WL_ERROR);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -497,7 +497,7 @@ bool ClientNetworkContentSocketHandler::Receive_SERVER_CONTENT(Packet *p)
|
||||||
size_t toRead = p->RemainingBytesToTransfer();
|
size_t toRead = p->RemainingBytesToTransfer();
|
||||||
if (toRead != 0 && (size_t)p->TransferOut(TransferOutFWrite, this->curFile) != toRead) {
|
if (toRead != 0 && (size_t)p->TransferOut(TransferOutFWrite, this->curFile) != toRead) {
|
||||||
CloseWindowById(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_CONTENT_DOWNLOAD);
|
CloseWindowById(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_CONTENT_DOWNLOAD);
|
||||||
ShowErrorMessage(STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD, STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD_FILE_NOT_WRITABLE, WL_ERROR);
|
ShowErrorMessage(STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD, STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD_FILE_NOT_WRITABLE, MakeParameters(), WL_ERROR);
|
||||||
this->CloseConnection();
|
this->CloseConnection();
|
||||||
fclose(this->curFile);
|
fclose(this->curFile);
|
||||||
this->curFile = nullptr;
|
this->curFile = nullptr;
|
||||||
|
@ -531,7 +531,7 @@ bool ClientNetworkContentSocketHandler::BeforeDownload()
|
||||||
if (filename.empty() || (this->curFile = fopen(filename.c_str(), "wb")) == nullptr) {
|
if (filename.empty() || (this->curFile = fopen(filename.c_str(), "wb")) == nullptr) {
|
||||||
/* Unless that fails of course... */
|
/* Unless that fails of course... */
|
||||||
CloseWindowById(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_CONTENT_DOWNLOAD);
|
CloseWindowById(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_CONTENT_DOWNLOAD);
|
||||||
ShowErrorMessage(STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD, STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD_FILE_NOT_WRITABLE, WL_ERROR);
|
ShowErrorMessage(STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD, STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD_FILE_NOT_WRITABLE, MakeParameters(), WL_ERROR);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -571,7 +571,7 @@ void ClientNetworkContentSocketHandler::AfterDownload()
|
||||||
|
|
||||||
this->OnDownloadComplete(this->curInfo->id);
|
this->OnDownloadComplete(this->curInfo->id);
|
||||||
} else {
|
} else {
|
||||||
ShowErrorMessage(STR_CONTENT_ERROR_COULD_NOT_EXTRACT, INVALID_STRING_ID, WL_ERROR);
|
ShowErrorMessage(STR_CONTENT_ERROR_COULD_NOT_EXTRACT, INVALID_STRING_ID, MakeParameters(), WL_ERROR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -869,7 +869,7 @@ public:
|
||||||
if (_accepted_external_search) {
|
if (_accepted_external_search) {
|
||||||
this->OpenExternalSearch();
|
this->OpenExternalSearch();
|
||||||
} else {
|
} else {
|
||||||
ShowQuery(STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION, STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER, this, ExternalSearchDisclaimerCallback);
|
ShowQuery(STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION, STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER, MakeParameters(), this, ExternalSearchDisclaimerCallback);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -954,7 +954,7 @@ public:
|
||||||
void OnConnect(bool success) override
|
void OnConnect(bool success) override
|
||||||
{
|
{
|
||||||
if (!success) {
|
if (!success) {
|
||||||
ShowErrorMessage(STR_CONTENT_ERROR_COULD_NOT_CONNECT, INVALID_STRING_ID, WL_ERROR);
|
ShowErrorMessage(STR_CONTENT_ERROR_COULD_NOT_CONNECT, INVALID_STRING_ID, MakeParameters(), WL_ERROR);
|
||||||
this->Close();
|
this->Close();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1147,7 +1147,7 @@ void ShowNetworkContentListWindow(ContentVector *cv, ContentType type1, ContentT
|
||||||
CloseWindowById(WC_NETWORK_WINDOW, WN_NETWORK_WINDOW_CONTENT_LIST);
|
CloseWindowById(WC_NETWORK_WINDOW, WN_NETWORK_WINDOW_CONTENT_LIST);
|
||||||
new NetworkContentListWindow(&_network_content_list_desc, cv != nullptr, types);
|
new NetworkContentListWindow(&_network_content_list_desc, cv != nullptr, types);
|
||||||
#else
|
#else
|
||||||
ShowErrorMessage(STR_CONTENT_NO_ZLIB, STR_CONTENT_NO_ZLIB_SUB, WL_ERROR);
|
ShowErrorMessage(STR_CONTENT_NO_ZLIB, STR_CONTENT_NO_ZLIB_SUB, MakeParameters(), WL_ERROR);
|
||||||
/* Connection failed... clean up the mess */
|
/* Connection failed... clean up the mess */
|
||||||
if (cv != nullptr) {
|
if (cv != nullptr) {
|
||||||
for (ContentInfo *ci : *cv) delete ci;
|
for (ContentInfo *ci : *cv) delete ci;
|
||||||
|
|
|
@ -135,7 +135,7 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_ERROR(Packet *p)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
case NETWORK_COORDINATOR_ERROR_REGISTRATION_FAILED:
|
case NETWORK_COORDINATOR_ERROR_REGISTRATION_FAILED:
|
||||||
ShowErrorMessage(STR_NETWORK_ERROR_COORDINATOR_REGISTRATION_FAILED, INVALID_STRING_ID, WL_ERROR);
|
ShowErrorMessage(STR_NETWORK_ERROR_COORDINATOR_REGISTRATION_FAILED, INVALID_STRING_ID, MakeParameters(), WL_ERROR);
|
||||||
|
|
||||||
/* To prevent that we constantly try to reconnect, switch to local game. */
|
/* To prevent that we constantly try to reconnect, switch to local game. */
|
||||||
_settings_client.network.server_game_type = SERVER_GAME_TYPE_LOCAL;
|
_settings_client.network.server_game_type = SERVER_GAME_TYPE_LOCAL;
|
||||||
|
@ -159,7 +159,7 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_ERROR(Packet *p)
|
||||||
}
|
}
|
||||||
|
|
||||||
case NETWORK_COORDINATOR_ERROR_REUSE_OF_INVITE_CODE:
|
case NETWORK_COORDINATOR_ERROR_REUSE_OF_INVITE_CODE:
|
||||||
ShowErrorMessage(STR_NETWORK_ERROR_COORDINATOR_REUSE_OF_INVITE_CODE, INVALID_STRING_ID, WL_ERROR);
|
ShowErrorMessage(STR_NETWORK_ERROR_COORDINATOR_REUSE_OF_INVITE_CODE, INVALID_STRING_ID, MakeParameters(), WL_ERROR);
|
||||||
|
|
||||||
/* To prevent that we constantly battle for the same invite-code, switch to local game. */
|
/* To prevent that we constantly battle for the same invite-code, switch to local game. */
|
||||||
_settings_client.network.server_game_type = SERVER_GAME_TYPE_LOCAL;
|
_settings_client.network.server_game_type = SERVER_GAME_TYPE_LOCAL;
|
||||||
|
@ -184,7 +184,7 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_REGISTER_ACK(Packet *p)
|
||||||
_network_server_connection_type = (ConnectionType)p->Recv_uint8();
|
_network_server_connection_type = (ConnectionType)p->Recv_uint8();
|
||||||
|
|
||||||
if (_network_server_connection_type == CONNECTION_TYPE_ISOLATED) {
|
if (_network_server_connection_type == CONNECTION_TYPE_ISOLATED) {
|
||||||
ShowErrorMessage(STR_NETWORK_ERROR_COORDINATOR_ISOLATED, STR_NETWORK_ERROR_COORDINATOR_ISOLATED_DETAIL, WL_ERROR);
|
ShowErrorMessage(STR_NETWORK_ERROR_COORDINATOR_ISOLATED, STR_NETWORK_ERROR_COORDINATOR_ISOLATED_DETAIL, MakeParameters(), WL_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Users can change the invite code in the settings, but this has no effect
|
/* Users can change the invite code in the settings, but this has no effect
|
||||||
|
|
|
@ -1803,10 +1803,10 @@ public:
|
||||||
|
|
||||||
if (IsInsideMM(pt.x, player_icon_x, player_icon_x + d2.width)) {
|
if (IsInsideMM(pt.x, player_icon_x, player_icon_x + d2.width)) {
|
||||||
if (index == this->player_self_index) {
|
if (index == this->player_self_index) {
|
||||||
GuiShowTooltips(this, STR_NETWORK_CLIENT_LIST_PLAYER_ICON_SELF_TOOLTIP, close_cond);
|
GuiShowTooltips(this, STR_NETWORK_CLIENT_LIST_PLAYER_ICON_SELF_TOOLTIP, close_cond, MakeParameters());
|
||||||
return true;
|
return true;
|
||||||
} else if (index == this->player_host_index) {
|
} else if (index == this->player_host_index) {
|
||||||
GuiShowTooltips(this, STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP, close_cond);
|
GuiShowTooltips(this, STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP, close_cond, MakeParameters());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1814,7 +1814,7 @@ public:
|
||||||
ButtonCommon *button = this->GetButtonAtPoint(pt);
|
ButtonCommon *button = this->GetButtonAtPoint(pt);
|
||||||
if (button == nullptr) return false;
|
if (button == nullptr) return false;
|
||||||
|
|
||||||
GuiShowTooltips(this, button->tooltip, close_cond);
|
GuiShowTooltips(this, button->tooltip, close_cond, MakeParameters());
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -1842,6 +1842,7 @@ public:
|
||||||
|
|
||||||
case WID_CL_MATRIX: {
|
case WID_CL_MATRIX: {
|
||||||
StringID text = STR_NULL;
|
StringID text = STR_NULL;
|
||||||
|
auto params = MakeParameters(0);
|
||||||
QueryCallbackProc *callback = nullptr;
|
QueryCallbackProc *callback = nullptr;
|
||||||
|
|
||||||
switch (index) {
|
switch (index) {
|
||||||
|
@ -1849,28 +1850,28 @@ public:
|
||||||
_admin_client_id = this->dd_client_id;
|
_admin_client_id = this->dd_client_id;
|
||||||
text = STR_NETWORK_CLIENT_LIST_ASK_CLIENT_KICK;
|
text = STR_NETWORK_CLIENT_LIST_ASK_CLIENT_KICK;
|
||||||
callback = AdminClientKickCallback;
|
callback = AdminClientKickCallback;
|
||||||
SetDParamStr(0, NetworkClientInfo::GetByClientID(_admin_client_id)->client_name);
|
params.SetParam(0, NetworkClientInfo::GetByClientID(_admin_client_id)->client_name);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DD_CLIENT_ADMIN_BAN:
|
case DD_CLIENT_ADMIN_BAN:
|
||||||
_admin_client_id = this->dd_client_id;
|
_admin_client_id = this->dd_client_id;
|
||||||
text = STR_NETWORK_CLIENT_LIST_ASK_CLIENT_BAN;
|
text = STR_NETWORK_CLIENT_LIST_ASK_CLIENT_BAN;
|
||||||
callback = AdminClientBanCallback;
|
callback = AdminClientBanCallback;
|
||||||
SetDParamStr(0, NetworkClientInfo::GetByClientID(_admin_client_id)->client_name);
|
params.SetParam(0, NetworkClientInfo::GetByClientID(_admin_client_id)->client_name);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DD_COMPANY_ADMIN_RESET:
|
case DD_COMPANY_ADMIN_RESET:
|
||||||
_admin_company_id = this->dd_company_id;
|
_admin_company_id = this->dd_company_id;
|
||||||
text = STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET;
|
text = STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET;
|
||||||
callback = AdminCompanyResetCallback;
|
callback = AdminCompanyResetCallback;
|
||||||
SetDParam(0, _admin_company_id);
|
params.SetParam(0, _admin_company_id);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DD_COMPANY_ADMIN_UNLOCK:
|
case DD_COMPANY_ADMIN_UNLOCK:
|
||||||
_admin_company_id = this->dd_company_id;
|
_admin_company_id = this->dd_company_id;
|
||||||
text = STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK;
|
text = STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK;
|
||||||
callback = AdminCompanyUnlockCallback;
|
callback = AdminCompanyUnlockCallback;
|
||||||
SetDParam(0, _admin_company_id);
|
params.SetParam(0, _admin_company_id);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -1881,7 +1882,7 @@ public:
|
||||||
assert(callback != nullptr);
|
assert(callback != nullptr);
|
||||||
|
|
||||||
/* Always ask confirmation for all admin actions. */
|
/* Always ask confirmation for all admin actions. */
|
||||||
ShowQuery(STR_NETWORK_CLIENT_LIST_ASK_CAPTION, text, this, callback);
|
ShowQuery(STR_NETWORK_CLIENT_LIST_ASK_CAPTION, text, std::move(params), this, callback);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -502,10 +502,7 @@ void ErrorUnknownCallbackResult(uint32_t grfid, uint16_t cbid, uint16_t cb_res)
|
||||||
|
|
||||||
if (!HasBit(grfconfig->grf_bugs, GBUG_UNKNOWN_CB_RESULT)) {
|
if (!HasBit(grfconfig->grf_bugs, GBUG_UNKNOWN_CB_RESULT)) {
|
||||||
SetBit(grfconfig->grf_bugs, GBUG_UNKNOWN_CB_RESULT);
|
SetBit(grfconfig->grf_bugs, GBUG_UNKNOWN_CB_RESULT);
|
||||||
SetDParamStr(0, grfconfig->GetName());
|
ShowErrorMessage(STR_NEWGRF_BUGGY, STR_NEWGRF_BUGGY_UNKNOWN_CALLBACK_RESULT, MakeParameters(grfconfig->GetName(), cbid, cb_res), WL_CRITICAL);
|
||||||
SetDParam(1, cbid);
|
|
||||||
SetDParam(2, cb_res);
|
|
||||||
ShowErrorMessage(STR_NEWGRF_BUGGY, STR_NEWGRF_BUGGY_UNKNOWN_CALLBACK_RESULT, WL_CRITICAL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* debug output */
|
/* debug output */
|
||||||
|
|
|
@ -51,18 +51,21 @@ void ShowNewGRFError()
|
||||||
/* Only show Fatal and Error level messages */
|
/* Only show Fatal and Error level messages */
|
||||||
if (!c->error.has_value() || (c->error->severity != STR_NEWGRF_ERROR_MSG_FATAL && c->error->severity != STR_NEWGRF_ERROR_MSG_ERROR)) continue;
|
if (!c->error.has_value() || (c->error->severity != STR_NEWGRF_ERROR_MSG_FATAL && c->error->severity != STR_NEWGRF_ERROR_MSG_ERROR)) continue;
|
||||||
|
|
||||||
SetDParamStr(0, c->GetName());
|
ArrayStringParameters<20> params;
|
||||||
SetDParam (1, c->error->message != STR_NULL ? c->error->message : STR_JUST_RAW_STRING);
|
assert(c->error->param_value.size() < 20 - 5);
|
||||||
SetDParamStr(2, c->error->custom_message);
|
|
||||||
SetDParamStr(3, c->filename);
|
params.SetParam(0, c->GetName());
|
||||||
SetDParamStr(4, c->error->data);
|
params.SetParam(1, c->error->message != STR_NULL ? c->error->message : STR_JUST_RAW_STRING);
|
||||||
|
params.SetParam(2, c->error->custom_message);
|
||||||
|
params.SetParam(3, c->filename);
|
||||||
|
params.SetParam(4, c->error->data);
|
||||||
for (uint i = 0; i < c->error->param_value.size(); i++) {
|
for (uint i = 0; i < c->error->param_value.size(); i++) {
|
||||||
SetDParam(5 + i, c->error->param_value[i]);
|
params.SetParam(5 + i, c->error->param_value[i]);
|
||||||
}
|
}
|
||||||
if (c->error->severity == STR_NEWGRF_ERROR_MSG_FATAL) {
|
if (c->error->severity == STR_NEWGRF_ERROR_MSG_FATAL) {
|
||||||
ShowErrorMessage(STR_NEWGRF_ERROR_FATAL_POPUP, INVALID_STRING_ID, WL_CRITICAL);
|
ShowErrorMessage(STR_NEWGRF_ERROR_FATAL_POPUP, INVALID_STRING_ID, std::move(params), WL_CRITICAL);
|
||||||
} else {
|
} else {
|
||||||
ShowErrorMessage(STR_NEWGRF_ERROR_POPUP, INVALID_STRING_ID, WL_ERROR);
|
ShowErrorMessage(STR_NEWGRF_ERROR_POPUP, INVALID_STRING_ID, std::move(params), WL_ERROR);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1121,6 +1124,7 @@ struct NewGRFWindow : public Window, NewGRFScanCallback {
|
||||||
ShowQuery(
|
ShowQuery(
|
||||||
STR_NEWGRF_POPUP_CAUTION_CAPTION,
|
STR_NEWGRF_POPUP_CAUTION_CAPTION,
|
||||||
STR_NEWGRF_CONFIRMATION_TEXT,
|
STR_NEWGRF_CONFIRMATION_TEXT,
|
||||||
|
MakeParameters(),
|
||||||
this,
|
this,
|
||||||
NewGRFConfirmationCallback
|
NewGRFConfirmationCallback
|
||||||
);
|
);
|
||||||
|
@ -1153,7 +1157,7 @@ struct NewGRFWindow : public Window, NewGRFScanCallback {
|
||||||
case WID_NS_CONTENT_DOWNLOAD:
|
case WID_NS_CONTENT_DOWNLOAD:
|
||||||
case WID_NS_CONTENT_DOWNLOAD2:
|
case WID_NS_CONTENT_DOWNLOAD2:
|
||||||
if (!_network_available) {
|
if (!_network_available) {
|
||||||
ShowErrorMessage(STR_NETWORK_ERROR_NOTAVAILABLE, INVALID_STRING_ID, WL_ERROR);
|
ShowErrorMessage(STR_NETWORK_ERROR_NOTAVAILABLE, INVALID_STRING_ID, MakeParameters(), WL_ERROR);
|
||||||
} else {
|
} else {
|
||||||
this->CloseChildWindows(WC_QUERY_STRING); // Remove the parameter query window
|
this->CloseChildWindows(WC_QUERY_STRING); // Remove the parameter query window
|
||||||
|
|
||||||
|
@ -1533,14 +1537,14 @@ private:
|
||||||
for (list = &this->actives; *list != nullptr; list = &(*list)->next, ins_pos--) {
|
for (list = &this->actives; *list != nullptr; list = &(*list)->next, ins_pos--) {
|
||||||
if (ins_pos == 0) entry = list; // Insert position? Save.
|
if (ins_pos == 0) entry = list; // Insert position? Save.
|
||||||
if ((*list)->ident.grfid == this->avail_sel->ident.grfid) {
|
if ((*list)->ident.grfid == this->avail_sel->ident.grfid) {
|
||||||
ShowErrorMessage(STR_NEWGRF_DUPLICATE_GRFID, INVALID_STRING_ID, WL_INFO);
|
ShowErrorMessage(STR_NEWGRF_DUPLICATE_GRFID, INVALID_STRING_ID, MakeParameters(), WL_INFO);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!HasBit((*list)->flags, GCF_STATIC)) count++;
|
if (!HasBit((*list)->flags, GCF_STATIC)) count++;
|
||||||
}
|
}
|
||||||
if (entry == nullptr) entry = list;
|
if (entry == nullptr) entry = list;
|
||||||
if (count >= NETWORK_MAX_GRF_COUNT) {
|
if (count >= NETWORK_MAX_GRF_COUNT) {
|
||||||
ShowErrorMessage(STR_NEWGRF_TOO_MANY_NEWGRFS, INVALID_STRING_ID, WL_INFO);
|
ShowErrorMessage(STR_NEWGRF_TOO_MANY_NEWGRFS, INVALID_STRING_ID, MakeParameters(), WL_INFO);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -614,9 +614,7 @@ void IndustryProductionCallback(Industry *ind, int reason)
|
||||||
* 'loop' is provided as 16 bits to the newgrf, so abort when those are exceeded. */
|
* 'loop' is provided as 16 bits to the newgrf, so abort when those are exceeded. */
|
||||||
if (loop >= 0x10000) {
|
if (loop >= 0x10000) {
|
||||||
/* display error message */
|
/* display error message */
|
||||||
SetDParamStr(0, spec->grf_prop.grffile->filename);
|
ShowErrorMessage(STR_NEWGRF_BUGGY, STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK, MakeParameters(spec->grf_prop.grffile->filename, spec->name), WL_WARNING);
|
||||||
SetDParam(1, spec->name);
|
|
||||||
ShowErrorMessage(STR_NEWGRF_BUGGY, STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK, WL_WARNING);
|
|
||||||
|
|
||||||
/* abort the function early, this error isn't critical and will allow the game to continue to run */
|
/* abort the function early, this error isn't critical and will allow the game to continue to run */
|
||||||
break;
|
break;
|
||||||
|
@ -629,10 +627,12 @@ void IndustryProductionCallback(Industry *ind, int reason)
|
||||||
|
|
||||||
if (group->version == 0xFF) {
|
if (group->version == 0xFF) {
|
||||||
/* Result was marked invalid on load, display error message */
|
/* Result was marked invalid on load, display error message */
|
||||||
SetDParamStr(0, spec->grf_prop.grffile->filename);
|
auto params = MakeParameters(
|
||||||
SetDParam(1, spec->name);
|
spec->grf_prop.grffile->filename,
|
||||||
SetDParam(2, ind->location.tile);
|
spec->name,
|
||||||
ShowErrorMessage(STR_NEWGRF_BUGGY, STR_NEWGRF_BUGGY_INVALID_CARGO_PRODUCTION_CALLBACK, WL_WARNING);
|
ind->location.tile
|
||||||
|
);
|
||||||
|
ShowErrorMessage(STR_NEWGRF_BUGGY, STR_NEWGRF_BUGGY_INVALID_CARGO_PRODUCTION_CALLBACK, std::move(params), WL_WARNING);
|
||||||
|
|
||||||
/* abort the function early, this error isn't critical and will allow the game to continue to run */
|
/* abort the function early, this error isn't critical and will allow the game to continue to run */
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -15,11 +15,11 @@
|
||||||
#include "station_type.h"
|
#include "station_type.h"
|
||||||
#include "industry_type.h"
|
#include "industry_type.h"
|
||||||
|
|
||||||
void AddNewsItem(StringID string, NewsType type, NewsFlag flags, NewsReferenceType reftype1 = NR_NONE, uint32_t ref1 = UINT32_MAX, NewsReferenceType reftype2 = NR_NONE, uint32_t ref2 = UINT32_MAX, const NewsAllocatedData *data = nullptr);
|
void AddNewsItem(StringID string, class StringParameters &¶ms, NewsType type, NewsFlag flags, NewsReferenceType reftype1 = NR_NONE, uint32_t ref1 = UINT32_MAX, NewsReferenceType reftype2 = NR_NONE, uint32_t ref2 = UINT32_MAX, const NewsAllocatedData *data = nullptr);
|
||||||
|
|
||||||
inline void AddCompanyNewsItem(StringID string, CompanyNewsInformation *cni)
|
inline void AddCompanyNewsItem(StringID string, class StringParameters &¶ms, CompanyNewsInformation *cni)
|
||||||
{
|
{
|
||||||
AddNewsItem(string, NT_COMPANY_INFO, NF_COMPANY, NR_NONE, UINT32_MAX, NR_NONE, UINT32_MAX, cni);
|
AddNewsItem(string, std::move(params), NT_COMPANY_INFO, NF_COMPANY, NR_NONE, UINT32_MAX, NR_NONE, UINT32_MAX, cni);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -27,9 +27,9 @@ inline void AddCompanyNewsItem(StringID string, CompanyNewsInformation *cni)
|
||||||
*
|
*
|
||||||
* @warning The DParams may not reference the vehicle due to autoreplace stuff. See AddVehicleAdviceNewsItem for how that can be done.
|
* @warning The DParams may not reference the vehicle due to autoreplace stuff. See AddVehicleAdviceNewsItem for how that can be done.
|
||||||
*/
|
*/
|
||||||
inline void AddVehicleNewsItem(StringID string, NewsType type, VehicleID vehicle, StationID station = INVALID_STATION)
|
inline void AddVehicleNewsItem(StringID string, class StringParameters &¶ms, NewsType type, VehicleID vehicle, StationID station = INVALID_STATION)
|
||||||
{
|
{
|
||||||
AddNewsItem(string, type, NF_NO_TRANSPARENT | NF_SHADE | NF_THIN, NR_VEHICLE, vehicle, station == INVALID_STATION ? NR_NONE : NR_STATION, station);
|
AddNewsItem(string, std::move(params), type, NF_NO_TRANSPARENT | NF_SHADE | NF_THIN, NR_VEHICLE, vehicle, station == INVALID_STATION ? NR_NONE : NR_STATION, station);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -37,19 +37,19 @@ inline void AddVehicleNewsItem(StringID string, NewsType type, VehicleID vehicle
|
||||||
*
|
*
|
||||||
* @warning DParam 0 must reference the vehicle!
|
* @warning DParam 0 must reference the vehicle!
|
||||||
*/
|
*/
|
||||||
inline void AddVehicleAdviceNewsItem(StringID string, VehicleID vehicle)
|
inline void AddVehicleAdviceNewsItem(StringID string, class StringParameters &¶ms, VehicleID vehicle)
|
||||||
{
|
{
|
||||||
AddNewsItem(string, NT_ADVICE, NF_INCOLOUR | NF_SMALL | NF_VEHICLE_PARAM0, NR_VEHICLE, vehicle);
|
AddNewsItem(string, std::move(params), NT_ADVICE, NF_INCOLOUR | NF_SMALL | NF_VEHICLE_PARAM0, NR_VEHICLE, vehicle);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void AddTileNewsItem(StringID string, NewsType type, TileIndex tile, const NewsAllocatedData *data = nullptr, StationID station = INVALID_STATION)
|
inline void AddTileNewsItem(StringID string, class StringParameters &¶ms, NewsType type, TileIndex tile, const NewsAllocatedData *data = nullptr, StationID station = INVALID_STATION)
|
||||||
{
|
{
|
||||||
AddNewsItem(string, type, NF_NO_TRANSPARENT | NF_SHADE | NF_THIN, NR_TILE, tile.base(), station == INVALID_STATION ? NR_NONE : NR_STATION, station, data);
|
AddNewsItem(string, std::move(params), type, NF_NO_TRANSPARENT | NF_SHADE | NF_THIN, NR_TILE, tile.base(), station == INVALID_STATION ? NR_NONE : NR_STATION, station, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void AddIndustryNewsItem(StringID string, NewsType type, IndustryID industry, const NewsAllocatedData *data = nullptr)
|
inline void AddIndustryNewsItem(StringID string, class StringParameters &¶ms, NewsType type, IndustryID industry, const NewsAllocatedData *data = nullptr)
|
||||||
{
|
{
|
||||||
AddNewsItem(string, type, NF_NO_TRANSPARENT | NF_SHADE | NF_THIN, NR_INDUSTRY, industry, NR_NONE, UINT32_MAX, data);
|
AddNewsItem(string, std::move(params), type, NF_NO_TRANSPARENT | NF_SHADE | NF_THIN, NR_INDUSTRY, industry, NR_NONE, UINT32_MAX, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NewsLoop();
|
void NewsLoop();
|
||||||
|
|
|
@ -793,6 +793,7 @@ static void DeleteNewsItem(NewsItem *ni)
|
||||||
/**
|
/**
|
||||||
* Create a new newsitem to be shown.
|
* Create a new newsitem to be shown.
|
||||||
* @param string_id String to display.
|
* @param string_id String to display.
|
||||||
|
* @param params Parameters for the string.
|
||||||
* @param type The type of news.
|
* @param type The type of news.
|
||||||
* @param flags Flags related to how to display the news.
|
* @param flags Flags related to how to display the news.
|
||||||
* @param reftype1 Type of ref1.
|
* @param reftype1 Type of ref1.
|
||||||
|
@ -803,17 +804,18 @@ static void DeleteNewsItem(NewsItem *ni)
|
||||||
*
|
*
|
||||||
* @see NewsSubtype
|
* @see NewsSubtype
|
||||||
*/
|
*/
|
||||||
NewsItem::NewsItem(StringID string_id, NewsType type, NewsFlag flags, NewsReferenceType reftype1, uint32_t ref1, NewsReferenceType reftype2, uint32_t ref2, const NewsAllocatedData *data) :
|
NewsItem::NewsItem(StringID string_id, StringParameters &¶ms, NewsType type, NewsFlag flags, NewsReferenceType reftype1, uint32_t ref1, NewsReferenceType reftype2, uint32_t ref2, const NewsAllocatedData *data) :
|
||||||
string_id(string_id), date(TimerGameCalendar::date), economy_date(TimerGameEconomy::date), type(type), flags(flags), reftype1(reftype1), reftype2(reftype2), ref1(ref1), ref2(ref2), data(data)
|
string_id(string_id), date(TimerGameCalendar::date), economy_date(TimerGameEconomy::date), type(type), flags(flags), reftype1(reftype1), reftype2(reftype2), ref1(ref1), ref2(ref2), data(data)
|
||||||
{
|
{
|
||||||
/* show this news message in colour? */
|
/* show this news message in colour? */
|
||||||
if (TimerGameCalendar::year >= _settings_client.gui.coloured_news_year) this->flags |= NF_INCOLOUR;
|
if (TimerGameCalendar::year >= _settings_client.gui.coloured_news_year) this->flags |= NF_INCOLOUR;
|
||||||
CopyOutDParam(this->params, 10);
|
CopyOutDParam(this->params, std::move(params));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a new newsitem to be shown.
|
* Add a new newsitem to be shown.
|
||||||
* @param string String to display
|
* @param string String to display
|
||||||
|
* @param params Parameters for the string.
|
||||||
* @param type news category
|
* @param type news category
|
||||||
* @param flags display flags for the news
|
* @param flags display flags for the news
|
||||||
* @param reftype1 Type of ref1
|
* @param reftype1 Type of ref1
|
||||||
|
@ -824,12 +826,12 @@ NewsItem::NewsItem(StringID string_id, NewsType type, NewsFlag flags, NewsRefere
|
||||||
*
|
*
|
||||||
* @see NewsSubtype
|
* @see NewsSubtype
|
||||||
*/
|
*/
|
||||||
void AddNewsItem(StringID string, NewsType type, NewsFlag flags, NewsReferenceType reftype1, uint32_t ref1, NewsReferenceType reftype2, uint32_t ref2, const NewsAllocatedData *data)
|
void AddNewsItem(StringID string, StringParameters &¶ms, NewsType type, NewsFlag flags, NewsReferenceType reftype1, uint32_t ref1, NewsReferenceType reftype2, uint32_t ref2, const NewsAllocatedData *data)
|
||||||
{
|
{
|
||||||
if (_game_mode == GM_MENU) return;
|
if (_game_mode == GM_MENU) return;
|
||||||
|
|
||||||
/* Create new news item node */
|
/* Create new news item node */
|
||||||
NewsItem *ni = new NewsItem(string, type, flags, reftype1, ref1, reftype2, ref2, data);
|
NewsItem *ni = new NewsItem(string, std::move(params), type, flags, reftype1, ref1, reftype2, ref2, data);
|
||||||
|
|
||||||
if (_total_news++ == 0) {
|
if (_total_news++ == 0) {
|
||||||
assert(_oldest_news == nullptr);
|
assert(_oldest_news == nullptr);
|
||||||
|
@ -903,8 +905,7 @@ CommandCost CmdCustomNewsItem(DoCommandFlag flags, NewsType type, NewsReferenceT
|
||||||
|
|
||||||
if (flags & DC_EXEC) {
|
if (flags & DC_EXEC) {
|
||||||
NewsStringData *news = new NewsStringData(text);
|
NewsStringData *news = new NewsStringData(text);
|
||||||
SetDParamStr(0, news->string);
|
AddNewsItem(STR_NEWS_CUSTOM_ITEM, MakeParameters(news->string), type, NF_NORMAL, reftype1, reference, NR_NONE, UINT32_MAX, news);
|
||||||
AddNewsItem(STR_NEWS_CUSTOM_ITEM, type, NF_NORMAL, reftype1, reference, NR_NONE, UINT32_MAX, news);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return CommandCost();
|
return CommandCost();
|
||||||
|
|
|
@ -143,7 +143,7 @@ struct NewsItem {
|
||||||
|
|
||||||
std::vector<StringParameterBackup> params; ///< Parameters for string resolving.
|
std::vector<StringParameterBackup> params; ///< Parameters for string resolving.
|
||||||
|
|
||||||
NewsItem(StringID string_id, NewsType type, NewsFlag flags, NewsReferenceType reftype1, uint32_t ref1, NewsReferenceType reftype2, uint32_t ref2, const NewsAllocatedData *data);
|
NewsItem(StringID string_id, class StringParameters &&, NewsType type, NewsFlag flags, NewsReferenceType reftype1, uint32_t ref1, NewsReferenceType reftype2, uint32_t ref2, const NewsAllocatedData *data);
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Container for a single string to be passed as NewsAllocatedData. */
|
/** Container for a single string to be passed as NewsAllocatedData. */
|
||||||
|
|
|
@ -1126,8 +1126,7 @@ void SwitchToMode(SwitchMode new_mode)
|
||||||
ResetWindowSystem();
|
ResetWindowSystem();
|
||||||
|
|
||||||
if (!SafeLoad(_file_to_saveload.name, _file_to_saveload.file_op, _file_to_saveload.detail_ftype, GM_NORMAL, NO_DIRECTORY)) {
|
if (!SafeLoad(_file_to_saveload.name, _file_to_saveload.file_op, _file_to_saveload.detail_ftype, GM_NORMAL, NO_DIRECTORY)) {
|
||||||
SetDParamStr(0, GetSaveLoadErrorString());
|
ShowErrorMessage(STR_JUST_RAW_STRING, INVALID_STRING_ID, MakeParameters(GetSaveLoadErrorString()), WL_CRITICAL);
|
||||||
ShowErrorMessage(STR_JUST_RAW_STRING, INVALID_STRING_ID, WL_CRITICAL);
|
|
||||||
} else {
|
} else {
|
||||||
if (_file_to_saveload.abstract_ftype == FT_SCENARIO) {
|
if (_file_to_saveload.abstract_ftype == FT_SCENARIO) {
|
||||||
OnStartScenario();
|
OnStartScenario();
|
||||||
|
@ -1169,8 +1168,7 @@ void SwitchToMode(SwitchMode new_mode)
|
||||||
/* Cancel the saveload pausing */
|
/* Cancel the saveload pausing */
|
||||||
Command<CMD_PAUSE>::Post(PM_PAUSED_SAVELOAD, false);
|
Command<CMD_PAUSE>::Post(PM_PAUSED_SAVELOAD, false);
|
||||||
} else {
|
} else {
|
||||||
SetDParamStr(0, GetSaveLoadErrorString());
|
ShowErrorMessage(STR_JUST_RAW_STRING, INVALID_STRING_ID, MakeParameters(GetSaveLoadErrorString()), WL_CRITICAL);
|
||||||
ShowErrorMessage(STR_JUST_RAW_STRING, INVALID_STRING_ID, WL_CRITICAL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateSocialIntegration(GM_EDITOR);
|
UpdateSocialIntegration(GM_EDITOR);
|
||||||
|
@ -1187,7 +1185,7 @@ void SwitchToMode(SwitchMode new_mode)
|
||||||
case SM_MENU: // Switch to game intro menu
|
case SM_MENU: // Switch to game intro menu
|
||||||
LoadIntroGame();
|
LoadIntroGame();
|
||||||
if (BaseSounds::ini_set.empty() && BaseSounds::GetUsedSet()->fallback && SoundDriver::GetInstance()->HasOutput()) {
|
if (BaseSounds::ini_set.empty() && BaseSounds::GetUsedSet()->fallback && SoundDriver::GetInstance()->HasOutput()) {
|
||||||
ShowErrorMessage(STR_WARNING_FALLBACK_SOUNDSET, INVALID_STRING_ID, WL_CRITICAL);
|
ShowErrorMessage(STR_WARNING_FALLBACK_SOUNDSET, INVALID_STRING_ID, MakeParameters(), WL_CRITICAL);
|
||||||
BaseSounds::ini_set = BaseSounds::GetUsedSet()->name;
|
BaseSounds::ini_set = BaseSounds::GetUsedSet()->name;
|
||||||
}
|
}
|
||||||
if (_settings_client.network.participate_survey == PS_ASK) {
|
if (_settings_client.network.participate_survey == PS_ASK) {
|
||||||
|
@ -1205,8 +1203,7 @@ void SwitchToMode(SwitchMode new_mode)
|
||||||
case SM_SAVE_GAME: // Save game.
|
case SM_SAVE_GAME: // Save game.
|
||||||
/* Make network saved games on pause compatible to singleplayer mode */
|
/* Make network saved games on pause compatible to singleplayer mode */
|
||||||
if (SaveOrLoad(_file_to_saveload.name, SLO_SAVE, DFT_GAME_FILE, NO_DIRECTORY) != SL_OK) {
|
if (SaveOrLoad(_file_to_saveload.name, SLO_SAVE, DFT_GAME_FILE, NO_DIRECTORY) != SL_OK) {
|
||||||
SetDParamStr(0, GetSaveLoadErrorString());
|
ShowErrorMessage(STR_JUST_RAW_STRING, INVALID_STRING_ID, MakeParameters(GetSaveLoadErrorString()), WL_ERROR);
|
||||||
ShowErrorMessage(STR_JUST_RAW_STRING, INVALID_STRING_ID, WL_ERROR);
|
|
||||||
} else {
|
} else {
|
||||||
CloseWindowById(WC_SAVELOAD, 0);
|
CloseWindowById(WC_SAVELOAD, 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1726,8 +1726,7 @@ void CheckOrders(const Vehicle *v)
|
||||||
/* We don't have a problem */
|
/* We don't have a problem */
|
||||||
if (message == INVALID_STRING_ID) return;
|
if (message == INVALID_STRING_ID) return;
|
||||||
|
|
||||||
SetDParam(0, v->index);
|
AddVehicleAdviceNewsItem(message, MakeParameters(v->index), v->index);
|
||||||
AddVehicleAdviceNewsItem(message, v->index);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1494,7 +1494,7 @@ public:
|
||||||
})) {
|
})) {
|
||||||
OnVehicleSelect(*begin);
|
OnVehicleSelect(*begin);
|
||||||
} else {
|
} else {
|
||||||
ShowErrorMessage(STR_ERROR_CAN_T_COPY_ORDER_LIST, STR_ERROR_CAN_T_COPY_ORDER_VEHICLE_LIST, WL_INFO);
|
ShowErrorMessage(STR_ERROR_CAN_T_COPY_ORDER_LIST, STR_ERROR_CAN_T_COPY_ORDER_VEHICLE_LIST, MakeParameters(), WL_INFO);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* If CTRL is pressed: If all the vehicles in this list share orders, then copy orders */
|
/* If CTRL is pressed: If all the vehicles in this list share orders, then copy orders */
|
||||||
|
@ -1503,7 +1503,7 @@ public:
|
||||||
})) {
|
})) {
|
||||||
OnVehicleSelect(*begin);
|
OnVehicleSelect(*begin);
|
||||||
} else {
|
} else {
|
||||||
ShowErrorMessage(STR_ERROR_CAN_T_SHARE_ORDER_LIST, STR_ERROR_CAN_T_SHARE_ORDER_VEHICLE_LIST, WL_INFO);
|
ShowErrorMessage(STR_ERROR_CAN_T_SHARE_ORDER_LIST, STR_ERROR_CAN_T_SHARE_ORDER_VEHICLE_LIST, MakeParameters(), WL_INFO);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -458,7 +458,7 @@ struct BuildRailToolbarWindow : Window {
|
||||||
|
|
||||||
if (std::find(std::begin(can_build_widgets), std::end(can_build_widgets), widget) == std::end(can_build_widgets)) return false;
|
if (std::find(std::begin(can_build_widgets), std::end(can_build_widgets), widget) == std::end(can_build_widgets)) return false;
|
||||||
|
|
||||||
GuiShowTooltips(this, STR_TOOLBAR_DISABLED_NO_VEHICLE_AVAILABLE, close_cond);
|
GuiShowTooltips(this, STR_TOOLBAR_DISABLED_NO_VEHICLE_AVAILABLE, close_cond, MakeParameters());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -548,7 +548,6 @@ static void RoadVehCrash(RoadVehicle *v)
|
||||||
AI::NewEvent(v->owner, new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_RV_LEVEL_CROSSING));
|
AI::NewEvent(v->owner, new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_RV_LEVEL_CROSSING));
|
||||||
Game::NewEvent(new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_RV_LEVEL_CROSSING));
|
Game::NewEvent(new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_RV_LEVEL_CROSSING));
|
||||||
|
|
||||||
SetDParam(0, pass);
|
|
||||||
StringID newsitem = (pass == 1) ? STR_NEWS_ROAD_VEHICLE_CRASH_DRIVER : STR_NEWS_ROAD_VEHICLE_CRASH;
|
StringID newsitem = (pass == 1) ? STR_NEWS_ROAD_VEHICLE_CRASH_DRIVER : STR_NEWS_ROAD_VEHICLE_CRASH;
|
||||||
NewsType newstype = NT_ACCIDENT;
|
NewsType newstype = NT_ACCIDENT;
|
||||||
|
|
||||||
|
@ -556,7 +555,7 @@ static void RoadVehCrash(RoadVehicle *v)
|
||||||
newstype = NT_ACCIDENT_OTHER;
|
newstype = NT_ACCIDENT_OTHER;
|
||||||
}
|
}
|
||||||
|
|
||||||
AddTileNewsItem(newsitem, newstype, v->tile);
|
AddTileNewsItem(newsitem, MakeParameters(pass), newstype, v->tile);
|
||||||
|
|
||||||
ModifyStationRatingAround(v->tile, v->owner, -160, 22);
|
ModifyStationRatingAround(v->tile, v->owner, -160, 22);
|
||||||
if (_settings_client.sound.disaster) SndPlayVehicleFx(SND_12_EXPLOSION, v);
|
if (_settings_client.sound.disaster) SndPlayVehicleFx(SND_12_EXPLOSION, v);
|
||||||
|
@ -689,9 +688,9 @@ static void RoadVehArrivesAt(const RoadVehicle *v, Station *st)
|
||||||
/* Check if station was ever visited before */
|
/* Check if station was ever visited before */
|
||||||
if (!(st->had_vehicle_of_type & HVOT_BUS)) {
|
if (!(st->had_vehicle_of_type & HVOT_BUS)) {
|
||||||
st->had_vehicle_of_type |= HVOT_BUS;
|
st->had_vehicle_of_type |= HVOT_BUS;
|
||||||
SetDParam(0, st->index);
|
|
||||||
AddVehicleNewsItem(
|
AddVehicleNewsItem(
|
||||||
RoadTypeIsRoad(v->roadtype) ? STR_NEWS_FIRST_BUS_ARRIVAL : STR_NEWS_FIRST_PASSENGER_TRAM_ARRIVAL,
|
RoadTypeIsRoad(v->roadtype) ? STR_NEWS_FIRST_BUS_ARRIVAL : STR_NEWS_FIRST_PASSENGER_TRAM_ARRIVAL,
|
||||||
|
MakeParameters(st->index),
|
||||||
(v->owner == _local_company) ? NT_ARRIVAL_COMPANY : NT_ARRIVAL_OTHER,
|
(v->owner == _local_company) ? NT_ARRIVAL_COMPANY : NT_ARRIVAL_OTHER,
|
||||||
v->index,
|
v->index,
|
||||||
st->index
|
st->index
|
||||||
|
@ -703,9 +702,9 @@ static void RoadVehArrivesAt(const RoadVehicle *v, Station *st)
|
||||||
/* Check if station was ever visited before */
|
/* Check if station was ever visited before */
|
||||||
if (!(st->had_vehicle_of_type & HVOT_TRUCK)) {
|
if (!(st->had_vehicle_of_type & HVOT_TRUCK)) {
|
||||||
st->had_vehicle_of_type |= HVOT_TRUCK;
|
st->had_vehicle_of_type |= HVOT_TRUCK;
|
||||||
SetDParam(0, st->index);
|
|
||||||
AddVehicleNewsItem(
|
AddVehicleNewsItem(
|
||||||
RoadTypeIsRoad(v->roadtype) ? STR_NEWS_FIRST_TRUCK_ARRIVAL : STR_NEWS_FIRST_CARGO_TRAM_ARRIVAL,
|
RoadTypeIsRoad(v->roadtype) ? STR_NEWS_FIRST_TRUCK_ARRIVAL : STR_NEWS_FIRST_CARGO_TRAM_ARRIVAL,
|
||||||
|
MakeParameters(st->index),
|
||||||
(v->owner == _local_company) ? NT_ARRIVAL_COMPANY : NT_ARRIVAL_OTHER,
|
(v->owner == _local_company) ? NT_ARRIVAL_COMPANY : NT_ARRIVAL_OTHER,
|
||||||
v->index,
|
v->index,
|
||||||
st->index
|
st->index
|
||||||
|
|
|
@ -723,8 +723,8 @@ bool AfterLoadGame()
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (gcf_res) {
|
switch (gcf_res) {
|
||||||
case GLC_COMPATIBLE: ShowErrorMessage(STR_NEWGRF_COMPATIBLE_LOAD_WARNING, INVALID_STRING_ID, WL_CRITICAL); break;
|
case GLC_COMPATIBLE: ShowErrorMessage(STR_NEWGRF_COMPATIBLE_LOAD_WARNING, INVALID_STRING_ID, MakeParameters(), WL_CRITICAL); break;
|
||||||
case GLC_NOT_FOUND: ShowErrorMessage(STR_NEWGRF_DISABLED_WARNING, INVALID_STRING_ID, WL_CRITICAL); _pause_mode = PM_PAUSED_ERROR; break;
|
case GLC_NOT_FOUND: ShowErrorMessage(STR_NEWGRF_DISABLED_WARNING, INVALID_STRING_ID, MakeParameters(), WL_CRITICAL); _pause_mode = PM_PAUSED_ERROR; break;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1915,7 +1915,7 @@ bool AfterLoadGame()
|
||||||
* There would be trams without tram track under causing crashes sooner or later. */
|
* There would be trams without tram track under causing crashes sooner or later. */
|
||||||
for (RoadVehicle *v : RoadVehicle::Iterate()) {
|
for (RoadVehicle *v : RoadVehicle::Iterate()) {
|
||||||
if (v->First() == v && HasBit(EngInfo(v->engine_type)->misc_flags, EF_ROAD_TRAM)) {
|
if (v->First() == v && HasBit(EngInfo(v->engine_type)->misc_flags, EF_ROAD_TRAM)) {
|
||||||
ShowErrorMessage(STR_WARNING_LOADGAME_REMOVED_TRAMS, INVALID_STRING_ID, WL_CRITICAL);
|
ShowErrorMessage(STR_WARNING_LOADGAME_REMOVED_TRAMS, INVALID_STRING_ID, MakeParameters(), WL_CRITICAL);
|
||||||
delete v;
|
delete v;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2679,8 +2679,7 @@ static const SaveLoadFormat *GetSavegameFormat(const std::string &full_name, byt
|
||||||
size_t processed;
|
size_t processed;
|
||||||
long level = std::stol(complevel, &processed, 10);
|
long level = std::stol(complevel, &processed, 10);
|
||||||
if (processed == 0 || level != Clamp(level, slf->min_compression, slf->max_compression)) {
|
if (processed == 0 || level != Clamp(level, slf->min_compression, slf->max_compression)) {
|
||||||
SetDParamStr(0, complevel);
|
ShowErrorMessage(STR_CONFIG_ERROR, STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_LEVEL, MakeParameters(complevel), WL_CRITICAL);
|
||||||
ShowErrorMessage(STR_CONFIG_ERROR, STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_LEVEL, WL_CRITICAL);
|
|
||||||
} else {
|
} else {
|
||||||
*compression_level = level;
|
*compression_level = level;
|
||||||
}
|
}
|
||||||
|
@ -2689,9 +2688,7 @@ static const SaveLoadFormat *GetSavegameFormat(const std::string &full_name, byt
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SetDParamStr(0, name);
|
ShowErrorMessage(STR_CONFIG_ERROR, STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_ALGORITHM, MakeParameters(name, def->name), WL_CRITICAL);
|
||||||
SetDParamStr(1, def->name);
|
|
||||||
ShowErrorMessage(STR_CONFIG_ERROR, STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_ALGORITHM, WL_CRITICAL);
|
|
||||||
}
|
}
|
||||||
*compression_level = def->default_compression;
|
*compression_level = def->default_compression;
|
||||||
return def;
|
return def;
|
||||||
|
@ -2772,8 +2769,7 @@ const char *GetSaveLoadErrorString()
|
||||||
/** Show a gui message when saving has failed */
|
/** Show a gui message when saving has failed */
|
||||||
static void SaveFileError()
|
static void SaveFileError()
|
||||||
{
|
{
|
||||||
SetDParamStr(0, GetSaveLoadErrorString());
|
ShowErrorMessage(STR_JUST_RAW_STRING, INVALID_STRING_ID, MakeParameters(GetSaveLoadErrorString()), WL_ERROR);
|
||||||
ShowErrorMessage(STR_JUST_RAW_STRING, INVALID_STRING_ID, WL_ERROR);
|
|
||||||
SaveFileDone();
|
SaveFileDone();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3052,7 +3048,7 @@ SaveOrLoadResult SaveOrLoad(const std::string &filename, SaveLoadOperation fop,
|
||||||
/* An instance of saving is already active, so don't go saving again */
|
/* An instance of saving is already active, so don't go saving again */
|
||||||
if (_sl.saveinprogress && fop == SLO_SAVE && dft == DFT_GAME_FILE && threaded) {
|
if (_sl.saveinprogress && fop == SLO_SAVE && dft == DFT_GAME_FILE && threaded) {
|
||||||
/* if not an autosave, but a user action, show error message */
|
/* if not an autosave, but a user action, show error message */
|
||||||
if (!_do_autosave) ShowErrorMessage(STR_ERROR_SAVE_STILL_IN_PROGRESS, INVALID_STRING_ID, WL_ERROR);
|
if (!_do_autosave) ShowErrorMessage(STR_ERROR_SAVE_STILL_IN_PROGRESS, INVALID_STRING_ID, MakeParameters(), WL_ERROR);
|
||||||
return SL_OK;
|
return SL_OK;
|
||||||
}
|
}
|
||||||
WaitTillSaved();
|
WaitTillSaved();
|
||||||
|
@ -3150,7 +3146,7 @@ void DoAutoOrNetsave(FiosNumberedSaveName &counter)
|
||||||
|
|
||||||
Debug(sl, 2, "Autosaving to '{}'", filename);
|
Debug(sl, 2, "Autosaving to '{}'", filename);
|
||||||
if (SaveOrLoad(filename, SLO_SAVE, DFT_GAME_FILE, AUTOSAVE_DIR) != SL_OK) {
|
if (SaveOrLoad(filename, SLO_SAVE, DFT_GAME_FILE, AUTOSAVE_DIR) != SL_OK) {
|
||||||
ShowErrorMessage(STR_ERROR_AUTOSAVE_FAILED, INVALID_STRING_ID, WL_ERROR);
|
ShowErrorMessage(STR_ERROR_AUTOSAVE_FAILED, INVALID_STRING_ID, MakeParameters(), WL_ERROR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -885,9 +885,7 @@ void MakeScreenshotWithConfirm(ScreenshotType t)
|
||||||
if (width * height > 8192 * 8192) {
|
if (width * height > 8192 * 8192) {
|
||||||
/* Ask for confirmation */
|
/* Ask for confirmation */
|
||||||
_confirmed_screenshot_type = t;
|
_confirmed_screenshot_type = t;
|
||||||
SetDParam(0, width);
|
ShowQuery(STR_WARNING_SCREENSHOT_SIZE_CAPTION, STR_WARNING_SCREENSHOT_SIZE_MESSAGE, MakeParameters(width, height), nullptr, ScreenshotConfirmationCallback);
|
||||||
SetDParam(1, height);
|
|
||||||
ShowQuery(STR_WARNING_SCREENSHOT_SIZE_CAPTION, STR_WARNING_SCREENSHOT_SIZE_MESSAGE, nullptr, ScreenshotConfirmationCallback);
|
|
||||||
} else {
|
} else {
|
||||||
/* Less than 64M pixels, just do it */
|
/* Less than 64M pixels, just do it */
|
||||||
MakeScreenshot(t, {});
|
MakeScreenshot(t, {});
|
||||||
|
@ -952,15 +950,12 @@ static bool RealMakeScreenshot(ScreenshotType t, std::string name, uint32_t widt
|
||||||
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
if (t == SC_HEIGHTMAP) {
|
if (t == SC_HEIGHTMAP) {
|
||||||
SetDParamStr(0, _screenshot_name);
|
ShowErrorMessage(STR_MESSAGE_HEIGHTMAP_SUCCESSFULLY, INVALID_STRING_ID, MakeParameters(_screenshot_name, _heightmap_highest_peak), WL_WARNING);
|
||||||
SetDParam(1, _heightmap_highest_peak);
|
|
||||||
ShowErrorMessage(STR_MESSAGE_HEIGHTMAP_SUCCESSFULLY, INVALID_STRING_ID, WL_WARNING);
|
|
||||||
} else {
|
} else {
|
||||||
SetDParamStr(0, _screenshot_name);
|
ShowErrorMessage(STR_MESSAGE_SCREENSHOT_SUCCESSFULLY, INVALID_STRING_ID, MakeParameters(_screenshot_name), WL_WARNING);
|
||||||
ShowErrorMessage(STR_MESSAGE_SCREENSHOT_SUCCESSFULLY, INVALID_STRING_ID, WL_WARNING);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ShowErrorMessage(STR_ERROR_SCREENSHOT_FAILED, INVALID_STRING_ID, WL_ERROR);
|
ShowErrorMessage(STR_ERROR_SCREENSHOT_FAILED, INVALID_STRING_ID, MakeParameters(), WL_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -1354,7 +1354,7 @@ Window *ShowScriptDebugWindow(CompanyID show_company, bool new_window)
|
||||||
}
|
}
|
||||||
return new ScriptDebugWindow(&_script_debug_desc, i, show_company);
|
return new ScriptDebugWindow(&_script_debug_desc, i, show_company);
|
||||||
} else {
|
} else {
|
||||||
ShowErrorMessage(STR_ERROR_AI_DEBUG_SERVER_ONLY, INVALID_STRING_ID, WL_INFO);
|
ShowErrorMessage(STR_ERROR_AI_DEBUG_SERVER_ONLY, INVALID_STRING_ID, MakeParameters(), WL_INFO);
|
||||||
}
|
}
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
|
@ -1015,8 +1015,7 @@ static void GraphicsSetLoadConfig(IniFile &ini)
|
||||||
extra_params.resize(lengthof(GRFConfig::param));
|
extra_params.resize(lengthof(GRFConfig::param));
|
||||||
int count = ParseIntList(item->value->c_str(), &extra_params.front(), extra_params.size());
|
int count = ParseIntList(item->value->c_str(), &extra_params.front(), extra_params.size());
|
||||||
if (count < 0) {
|
if (count < 0) {
|
||||||
SetDParamStr(0, BaseGraphics::ini_data.name);
|
ShowErrorMessage(STR_CONFIG_ERROR, STR_CONFIG_ERROR_ARRAY, MakeParameters(BaseGraphics::ini_data.name), WL_CRITICAL);
|
||||||
ShowErrorMessage(STR_CONFIG_ERROR, STR_CONFIG_ERROR_ARRAY, WL_CRITICAL);
|
|
||||||
count = 0;
|
count = 0;
|
||||||
}
|
}
|
||||||
extra_params.resize(count);
|
extra_params.resize(count);
|
||||||
|
@ -1082,8 +1081,7 @@ static GRFConfig *GRFLoadConfig(const IniFile &ini, const char *grpname, bool is
|
||||||
if (item.value.has_value() && !item.value->empty()) {
|
if (item.value.has_value() && !item.value->empty()) {
|
||||||
int count = ParseIntList(item.value->c_str(), c->param.data(), c->param.size());
|
int count = ParseIntList(item.value->c_str(), c->param.data(), c->param.size());
|
||||||
if (count < 0) {
|
if (count < 0) {
|
||||||
SetDParamStr(0, filename);
|
ShowErrorMessage(STR_CONFIG_ERROR, STR_CONFIG_ERROR_ARRAY, MakeParameters(filename), WL_CRITICAL);
|
||||||
ShowErrorMessage(STR_CONFIG_ERROR, STR_CONFIG_ERROR_ARRAY, WL_CRITICAL);
|
|
||||||
count = 0;
|
count = 0;
|
||||||
}
|
}
|
||||||
c->num_params = count;
|
c->num_params = count;
|
||||||
|
@ -1103,8 +1101,7 @@ static GRFConfig *GRFLoadConfig(const IniFile &ini, const char *grpname, bool is
|
||||||
SetDParam(1, STR_CONFIG_ERROR_INVALID_GRF_UNKNOWN);
|
SetDParam(1, STR_CONFIG_ERROR_INVALID_GRF_UNKNOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
SetDParamStr(0, filename.empty() ? item.name.c_str() : filename);
|
ShowErrorMessage(STR_CONFIG_ERROR, STR_CONFIG_ERROR_INVALID_GRF, MakeParameters(filename.empty() ? item.name.c_str() : filename), WL_CRITICAL);
|
||||||
ShowErrorMessage(STR_CONFIG_ERROR, STR_CONFIG_ERROR_INVALID_GRF, WL_CRITICAL);
|
|
||||||
delete c;
|
delete c;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -1113,9 +1110,7 @@ static GRFConfig *GRFLoadConfig(const IniFile &ini, const char *grpname, bool is
|
||||||
bool duplicate = false;
|
bool duplicate = false;
|
||||||
for (const GRFConfig *gc = first; gc != nullptr; gc = gc->next) {
|
for (const GRFConfig *gc = first; gc != nullptr; gc = gc->next) {
|
||||||
if (gc->ident.grfid == c->ident.grfid) {
|
if (gc->ident.grfid == c->ident.grfid) {
|
||||||
SetDParamStr(0, c->filename);
|
ShowErrorMessage(STR_CONFIG_ERROR, STR_CONFIG_ERROR_DUPLICATE_GRFID, MakeParameters(c->filename, gc->filename), WL_CRITICAL);
|
||||||
SetDParamStr(1, gc->filename);
|
|
||||||
ShowErrorMessage(STR_CONFIG_ERROR, STR_CONFIG_ERROR_DUPLICATE_GRFID, WL_CRITICAL);
|
|
||||||
duplicate = true;
|
duplicate = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1130,7 +1125,7 @@ static GRFConfig *GRFLoadConfig(const IniFile &ini, const char *grpname, bool is
|
||||||
SetBit(c->flags, GCF_STATIC);
|
SetBit(c->flags, GCF_STATIC);
|
||||||
} else if (++num_grfs > NETWORK_MAX_GRF_COUNT) {
|
} else if (++num_grfs > NETWORK_MAX_GRF_COUNT) {
|
||||||
/* Check we will not load more non-static NewGRFs than allowed. This could trigger issues for game servers. */
|
/* Check we will not load more non-static NewGRFs than allowed. This could trigger issues for game servers. */
|
||||||
ShowErrorMessage(STR_CONFIG_ERROR, STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED, WL_CRITICAL);
|
ShowErrorMessage(STR_CONFIG_ERROR, STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED, MakeParameters(), WL_CRITICAL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -716,7 +716,7 @@ struct GameOptionsWindow : Window {
|
||||||
case WID_GO_FULLSCREEN_BUTTON: // Click fullscreen on/off
|
case WID_GO_FULLSCREEN_BUTTON: // Click fullscreen on/off
|
||||||
/* try to toggle full-screen on/off */
|
/* try to toggle full-screen on/off */
|
||||||
if (!ToggleFullScreen(!_fullscreen)) {
|
if (!ToggleFullScreen(!_fullscreen)) {
|
||||||
ShowErrorMessage(STR_ERROR_FULLSCREEN_FAILED, INVALID_STRING_ID, WL_ERROR);
|
ShowErrorMessage(STR_ERROR_FULLSCREEN_FAILED, INVALID_STRING_ID, MakeParameters(), WL_ERROR);
|
||||||
}
|
}
|
||||||
this->SetWidgetLoweredState(WID_GO_FULLSCREEN_BUTTON, _fullscreen);
|
this->SetWidgetLoweredState(WID_GO_FULLSCREEN_BUTTON, _fullscreen);
|
||||||
this->SetWidgetDirty(WID_GO_FULLSCREEN_BUTTON);
|
this->SetWidgetDirty(WID_GO_FULLSCREEN_BUTTON);
|
||||||
|
@ -724,7 +724,7 @@ struct GameOptionsWindow : Window {
|
||||||
|
|
||||||
case WID_GO_VIDEO_ACCEL_BUTTON:
|
case WID_GO_VIDEO_ACCEL_BUTTON:
|
||||||
_video_hw_accel = !_video_hw_accel;
|
_video_hw_accel = !_video_hw_accel;
|
||||||
ShowErrorMessage(STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART, INVALID_STRING_ID, WL_INFO);
|
ShowErrorMessage(STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART, INVALID_STRING_ID, MakeParameters(), WL_INFO);
|
||||||
this->SetWidgetLoweredState(WID_GO_VIDEO_ACCEL_BUTTON, _video_hw_accel);
|
this->SetWidgetLoweredState(WID_GO_VIDEO_ACCEL_BUTTON, _video_hw_accel);
|
||||||
this->SetWidgetDirty(WID_GO_VIDEO_ACCEL_BUTTON);
|
this->SetWidgetDirty(WID_GO_VIDEO_ACCEL_BUTTON);
|
||||||
#ifndef __APPLE__
|
#ifndef __APPLE__
|
||||||
|
@ -867,7 +867,7 @@ struct GameOptionsWindow : Window {
|
||||||
if (!list.empty()) {
|
if (!list.empty()) {
|
||||||
ShowDropDownList(this, std::move(list), selected, widget);
|
ShowDropDownList(this, std::move(list), selected, widget);
|
||||||
} else {
|
} else {
|
||||||
if (widget == WID_GO_RESOLUTION_DROPDOWN) ShowErrorMessage(STR_ERROR_RESOLUTION_LIST_FAILED, INVALID_STRING_ID, WL_ERROR);
|
if (widget == WID_GO_RESOLUTION_DROPDOWN) ShowErrorMessage(STR_ERROR_RESOLUTION_LIST_FAILED, INVALID_STRING_ID, MakeParameters(), WL_ERROR);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -923,7 +923,7 @@ struct GameOptionsWindow : Window {
|
||||||
if (_settings_client.gui.refresh_rate > 60) {
|
if (_settings_client.gui.refresh_rate > 60) {
|
||||||
/* Show warning to the user that this refresh rate might not be suitable on
|
/* Show warning to the user that this refresh rate might not be suitable on
|
||||||
* larger maps with many NewGRFs and vehicles. */
|
* larger maps with many NewGRFs and vehicles. */
|
||||||
ShowErrorMessage(STR_GAME_OPTIONS_REFRESH_RATE_WARNING, INVALID_STRING_ID, WL_INFO);
|
ShowErrorMessage(STR_GAME_OPTIONS_REFRESH_RATE_WARNING, INVALID_STRING_ID, MakeParameters(), WL_INFO);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -2536,6 +2536,7 @@ struct GameSettingsWindow : Window {
|
||||||
ShowQuery(
|
ShowQuery(
|
||||||
STR_CONFIG_SETTING_RESET_ALL_CONFIRMATION_DIALOG_CAPTION,
|
STR_CONFIG_SETTING_RESET_ALL_CONFIRMATION_DIALOG_CAPTION,
|
||||||
STR_CONFIG_SETTING_RESET_ALL_CONFIRMATION_DIALOG_TEXT,
|
STR_CONFIG_SETTING_RESET_ALL_CONFIRMATION_DIALOG_TEXT,
|
||||||
|
MakeParameters(),
|
||||||
this,
|
this,
|
||||||
ResetAllSettingsConfirmationCallback
|
ResetAllSettingsConfirmationCallback
|
||||||
);
|
);
|
||||||
|
|
|
@ -352,7 +352,7 @@ static void MaxNoAIsChange(int32_t)
|
||||||
if (GetGameSettings().difficulty.max_no_competitors != 0 &&
|
if (GetGameSettings().difficulty.max_no_competitors != 0 &&
|
||||||
AI::GetInfoList()->empty() &&
|
AI::GetInfoList()->empty() &&
|
||||||
(!_networking || _network_server)) {
|
(!_networking || _network_server)) {
|
||||||
ShowErrorMessage(STR_WARNING_NO_SUITABLE_AI, INVALID_STRING_ID, WL_CRITICAL);
|
ShowErrorMessage(STR_WARNING_NO_SUITABLE_AI, INVALID_STRING_ID, MakeParameters(), WL_CRITICAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
InvalidateWindowClassesData(WC_GAME_OPTIONS, 0);
|
InvalidateWindowClassesData(WC_GAME_OPTIONS, 0);
|
||||||
|
@ -388,39 +388,39 @@ static bool CheckFreeformEdges(int32_t &new_value)
|
||||||
for (Ship *s : Ship::Iterate()) {
|
for (Ship *s : Ship::Iterate()) {
|
||||||
/* Check if there is a ship on the northern border. */
|
/* Check if there is a ship on the northern border. */
|
||||||
if (TileX(s->tile) == 0 || TileY(s->tile) == 0) {
|
if (TileX(s->tile) == 0 || TileY(s->tile) == 0) {
|
||||||
ShowErrorMessage(STR_CONFIG_SETTING_EDGES_NOT_EMPTY, INVALID_STRING_ID, WL_ERROR);
|
ShowErrorMessage(STR_CONFIG_SETTING_EDGES_NOT_EMPTY, INVALID_STRING_ID, MakeParameters(), WL_ERROR);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (const BaseStation *st : BaseStation::Iterate()) {
|
for (const BaseStation *st : BaseStation::Iterate()) {
|
||||||
/* Check if there is a non-deleted buoy on the northern border. */
|
/* Check if there is a non-deleted buoy on the northern border. */
|
||||||
if (st->IsInUse() && (TileX(st->xy) == 0 || TileY(st->xy) == 0)) {
|
if (st->IsInUse() && (TileX(st->xy) == 0 || TileY(st->xy) == 0)) {
|
||||||
ShowErrorMessage(STR_CONFIG_SETTING_EDGES_NOT_EMPTY, INVALID_STRING_ID, WL_ERROR);
|
ShowErrorMessage(STR_CONFIG_SETTING_EDGES_NOT_EMPTY, INVALID_STRING_ID, MakeParameters(), WL_ERROR);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (uint i = 0; i < Map::MaxX(); i++) {
|
for (uint i = 0; i < Map::MaxX(); i++) {
|
||||||
if (TileHeight(TileXY(i, 1)) != 0) {
|
if (TileHeight(TileXY(i, 1)) != 0) {
|
||||||
ShowErrorMessage(STR_CONFIG_SETTING_EDGES_NOT_WATER, INVALID_STRING_ID, WL_ERROR);
|
ShowErrorMessage(STR_CONFIG_SETTING_EDGES_NOT_WATER, INVALID_STRING_ID, MakeParameters(), WL_ERROR);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (uint i = 1; i < Map::MaxX(); i++) {
|
for (uint i = 1; i < Map::MaxX(); i++) {
|
||||||
if (!IsTileType(TileXY(i, Map::MaxY() - 1), MP_WATER) || TileHeight(TileXY(1, Map::MaxY())) != 0) {
|
if (!IsTileType(TileXY(i, Map::MaxY() - 1), MP_WATER) || TileHeight(TileXY(1, Map::MaxY())) != 0) {
|
||||||
ShowErrorMessage(STR_CONFIG_SETTING_EDGES_NOT_WATER, INVALID_STRING_ID, WL_ERROR);
|
ShowErrorMessage(STR_CONFIG_SETTING_EDGES_NOT_WATER, INVALID_STRING_ID, MakeParameters(), WL_ERROR);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (uint i = 0; i < Map::MaxY(); i++) {
|
for (uint i = 0; i < Map::MaxY(); i++) {
|
||||||
if (TileHeight(TileXY(1, i)) != 0) {
|
if (TileHeight(TileXY(1, i)) != 0) {
|
||||||
ShowErrorMessage(STR_CONFIG_SETTING_EDGES_NOT_WATER, INVALID_STRING_ID, WL_ERROR);
|
ShowErrorMessage(STR_CONFIG_SETTING_EDGES_NOT_WATER, INVALID_STRING_ID, MakeParameters(), WL_ERROR);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (uint i = 1; i < Map::MaxY(); i++) {
|
for (uint i = 1; i < Map::MaxY(); i++) {
|
||||||
if (!IsTileType(TileXY(Map::MaxX() - 1, i), MP_WATER) || TileHeight(TileXY(Map::MaxX(), i)) != 0) {
|
if (!IsTileType(TileXY(Map::MaxX() - 1, i), MP_WATER) || TileHeight(TileXY(Map::MaxX(), i)) != 0) {
|
||||||
ShowErrorMessage(STR_CONFIG_SETTING_EDGES_NOT_WATER, INVALID_STRING_ID, WL_ERROR);
|
ShowErrorMessage(STR_CONFIG_SETTING_EDGES_NOT_WATER, INVALID_STRING_ID, MakeParameters(), WL_ERROR);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -458,7 +458,7 @@ static bool CheckDynamicEngines(int32_t &)
|
||||||
if (_game_mode == GM_MENU) return true;
|
if (_game_mode == GM_MENU) return true;
|
||||||
|
|
||||||
if (!EngineOverrideManager::ResetToCurrentNewGRFConfig()) {
|
if (!EngineOverrideManager::ResetToCurrentNewGRFConfig()) {
|
||||||
ShowErrorMessage(STR_CONFIG_SETTING_DYNAMIC_ENGINES_EXISTING_VEHICLES, INVALID_STRING_ID, WL_ERROR);
|
ShowErrorMessage(STR_CONFIG_SETTING_DYNAMIC_ENGINES_EXISTING_VEHICLES, INVALID_STRING_ID, MakeParameters(), WL_ERROR);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -474,7 +474,7 @@ static bool CheckMaxHeightLevel(int32_t &new_value)
|
||||||
* If yes, disallow the change. */
|
* If yes, disallow the change. */
|
||||||
for (TileIndex t = 0; t < Map::Size(); t++) {
|
for (TileIndex t = 0; t < Map::Size(); t++) {
|
||||||
if ((int32_t)TileHeight(t) > new_value) {
|
if ((int32_t)TileHeight(t) > new_value) {
|
||||||
ShowErrorMessage(STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN, INVALID_STRING_ID, WL_ERROR);
|
ShowErrorMessage(STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN, INVALID_STRING_ID, MakeParameters(), WL_ERROR);
|
||||||
/* Return old, unchanged value */
|
/* Return old, unchanged value */
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -477,9 +477,9 @@ static void ShipArrivesAt(const Vehicle *v, Station *st)
|
||||||
if (!(st->had_vehicle_of_type & HVOT_SHIP)) {
|
if (!(st->had_vehicle_of_type & HVOT_SHIP)) {
|
||||||
st->had_vehicle_of_type |= HVOT_SHIP;
|
st->had_vehicle_of_type |= HVOT_SHIP;
|
||||||
|
|
||||||
SetDParam(0, st->index);
|
|
||||||
AddVehicleNewsItem(
|
AddVehicleNewsItem(
|
||||||
STR_NEWS_FIRST_SHIP_ARRIVAL,
|
STR_NEWS_FIRST_SHIP_ARRIVAL,
|
||||||
|
MakeParameters(st->index),
|
||||||
(v->owner == _local_company) ? NT_ARRIVAL_COMPANY : NT_ARRIVAL_OTHER,
|
(v->owner == _local_company) ? NT_ARRIVAL_COMPANY : NT_ARRIVAL_OTHER,
|
||||||
v->index,
|
v->index,
|
||||||
st->index
|
st->index
|
||||||
|
|
|
@ -36,8 +36,7 @@ static bool WarnCorruptSprite(const SpriteFile &file, size_t file_pos, int line)
|
||||||
{
|
{
|
||||||
static byte warning_level = 0;
|
static byte warning_level = 0;
|
||||||
if (warning_level == 0) {
|
if (warning_level == 0) {
|
||||||
SetDParamStr(0, file.GetSimplifiedFilename());
|
ShowErrorMessage(STR_NEWGRF_ERROR_CORRUPT_SPRITE, INVALID_STRING_ID, MakeParameters(file.GetSimplifiedFilename()), WL_ERROR);
|
||||||
ShowErrorMessage(STR_NEWGRF_ERROR_CORRUPT_SPRITE, INVALID_STRING_ID, WL_ERROR);
|
|
||||||
}
|
}
|
||||||
Debug(sprite, warning_level, "[{}] Loading corrupted sprite from {} at position {}", line, file.GetSimplifiedFilename(), file_pos);
|
Debug(sprite, warning_level, "[{}] Loading corrupted sprite from {} at position {}", line, file.GetSimplifiedFilename(), file_pos);
|
||||||
warning_level = 6;
|
warning_level = 6;
|
||||||
|
|
|
@ -527,10 +527,8 @@ CargoTypes GetEmptyMask(const Station *st)
|
||||||
*/
|
*/
|
||||||
static void ShowRejectOrAcceptNews(const Station *st, CargoTypes cargoes, bool reject)
|
static void ShowRejectOrAcceptNews(const Station *st, CargoTypes cargoes, bool reject)
|
||||||
{
|
{
|
||||||
SetDParam(0, st->index);
|
|
||||||
SetDParam(1, cargoes);
|
|
||||||
StringID msg = reject ? STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO_LIST : STR_NEWS_STATION_NOW_ACCEPTS_CARGO_LIST;
|
StringID msg = reject ? STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO_LIST : STR_NEWS_STATION_NOW_ACCEPTS_CARGO_LIST;
|
||||||
AddNewsItem(msg, NT_ACCEPTANCE, NF_INCOLOUR | NF_SMALL, NR_STATION, st->index);
|
AddNewsItem(msg, MakeParameters(st->index, cargoes), NT_ACCEPTANCE, NF_INCOLOUR | NF_SMALL, NR_STATION, st->index);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -169,43 +169,26 @@ void CopyInDParam(const std::span<const StringParameterBackup> backup)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Copy \a num string parameters from the global string parameter array to the \a backup.
|
* Copy parameters into StringParameterBackup for long-term storage.
|
||||||
* @param backup The backup to write to.
|
* @param backup The backup to write to.
|
||||||
* @param num Number of string parameters to copy.
|
* @param params The parameters to back up.
|
||||||
*/
|
*/
|
||||||
void CopyOutDParam(std::vector<StringParameterBackup> &backup, size_t num)
|
void CopyOutDParam(std::vector<StringParameterBackup> &backup, StringParameters &¶ms)
|
||||||
{
|
{
|
||||||
backup.resize(num);
|
params.SetOffset(0);
|
||||||
for (size_t i = 0; i < backup.size(); i++) {
|
|
||||||
const char *str = _global_string_params.GetParamStr(i);
|
backup.resize(params.GetDataLeft());
|
||||||
|
|
||||||
|
for (size_t i = 0; i < params.GetDataLeft(); i++) {
|
||||||
|
const char *str = params.GetParamStr(i);
|
||||||
if (str != nullptr) {
|
if (str != nullptr) {
|
||||||
backup[i] = str;
|
backup[i] = str;
|
||||||
} else {
|
} else {
|
||||||
backup[i] = _global_string_params.GetParam(i);
|
backup[i] = params.GetParam(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks whether the global string parameters have changed compared to the given backup.
|
|
||||||
* @param backup The backup to check against.
|
|
||||||
* @return True when the parameters have changed, otherwise false.
|
|
||||||
*/
|
|
||||||
bool HaveDParamChanged(const std::vector<StringParameterBackup> &backup)
|
|
||||||
{
|
|
||||||
bool changed = false;
|
|
||||||
for (size_t i = 0; !changed && i < backup.size(); i++) {
|
|
||||||
bool global_has_string = _global_string_params.GetParamStr(i) != nullptr;
|
|
||||||
if (global_has_string != backup[i].string.has_value()) return true;
|
|
||||||
|
|
||||||
if (global_has_string) {
|
|
||||||
changed = backup[i].string.value() != _global_string_params.GetParamStr(i);
|
|
||||||
} else {
|
|
||||||
changed = backup[i].data != _global_string_params.GetParam(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return changed;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void StationGetSpecialString(StringBuilder &builder, StationFacility x);
|
static void StationGetSpecialString(StringBuilder &builder, StationFacility x);
|
||||||
static void GetSpecialTownNameString(StringBuilder &builder, int ind, uint32_t seed);
|
static void GetSpecialTownNameString(StringBuilder &builder, int ind, uint32_t seed);
|
||||||
|
@ -2293,8 +2276,7 @@ void CheckForMissingGlyphs(bool base_font, MissingGlyphSearcher *searcher)
|
||||||
* with the colour marker. */
|
* with the colour marker. */
|
||||||
static std::string err_str("XXXThe current font is missing some of the characters used in the texts for this language. Using system fallback font instead.");
|
static std::string err_str("XXXThe current font is missing some of the characters used in the texts for this language. Using system fallback font instead.");
|
||||||
Utf8Encode(err_str.data(), SCC_YELLOW);
|
Utf8Encode(err_str.data(), SCC_YELLOW);
|
||||||
SetDParamStr(0, err_str);
|
ShowErrorMessage(STR_JUST_RAW_STRING, INVALID_STRING_ID, MakeParameters(err_str), WL_WARNING);
|
||||||
ShowErrorMessage(STR_JUST_RAW_STRING, INVALID_STRING_ID, WL_WARNING);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bad_font && base_font) {
|
if (bad_font && base_font) {
|
||||||
|
@ -2314,8 +2296,7 @@ void CheckForMissingGlyphs(bool base_font, MissingGlyphSearcher *searcher)
|
||||||
* the string, which takes exactly three characters, so it replaces the "XXX" with the colour marker. */
|
* the string, which takes exactly three characters, so it replaces the "XXX" with the colour marker. */
|
||||||
static std::string err_str("XXXThe current font is missing some of the characters used in the texts for this language. Read the readme to see how to solve this.");
|
static std::string err_str("XXXThe current font is missing some of the characters used in the texts for this language. Read the readme to see how to solve this.");
|
||||||
Utf8Encode(err_str.data(), SCC_YELLOW);
|
Utf8Encode(err_str.data(), SCC_YELLOW);
|
||||||
SetDParamStr(0, err_str);
|
ShowErrorMessage(STR_JUST_RAW_STRING, INVALID_STRING_ID, MakeParameters(err_str), WL_WARNING);
|
||||||
ShowErrorMessage(STR_JUST_RAW_STRING, INVALID_STRING_ID, WL_WARNING);
|
|
||||||
|
|
||||||
/* Reset the font width */
|
/* Reset the font width */
|
||||||
LoadStringWidthTable(searcher->Monospace());
|
LoadStringWidthTable(searcher->Monospace());
|
||||||
|
@ -2342,8 +2323,7 @@ void CheckForMissingGlyphs(bool base_font, MissingGlyphSearcher *searcher)
|
||||||
if (_current_text_dir != TD_LTR) {
|
if (_current_text_dir != TD_LTR) {
|
||||||
static std::string err_str("XXXThis version of OpenTTD does not support right-to-left languages. Recompile with ICU + Harfbuzz enabled.");
|
static std::string err_str("XXXThis version of OpenTTD does not support right-to-left languages. Recompile with ICU + Harfbuzz enabled.");
|
||||||
Utf8Encode(err_str.data(), SCC_YELLOW);
|
Utf8Encode(err_str.data(), SCC_YELLOW);
|
||||||
SetDParamStr(0, err_str);
|
ShowErrorMessage(STR_JUST_RAW_STRING, INVALID_STRING_ID, MakeParameters(err_str), WL_ERROR);
|
||||||
ShowErrorMessage(STR_JUST_RAW_STRING, INVALID_STRING_ID, WL_ERROR);
|
|
||||||
}
|
}
|
||||||
#endif /* !(WITH_ICU_I18N && WITH_HARFBUZZ) && !WITH_UNISCRIBE && !WITH_COCOA */
|
#endif /* !(WITH_ICU_I18N && WITH_HARFBUZZ) && !WITH_UNISCRIBE && !WITH_COCOA */
|
||||||
}
|
}
|
||||||
|
|
|
@ -99,8 +99,7 @@ void SetDParamStr(size_t n, const std::string &str);
|
||||||
void SetDParamStr(size_t n, std::string &&str);
|
void SetDParamStr(size_t n, std::string &&str);
|
||||||
|
|
||||||
void CopyInDParam(const std::span<const StringParameterBackup> backup);
|
void CopyInDParam(const std::span<const StringParameterBackup> backup);
|
||||||
void CopyOutDParam(std::vector<StringParameterBackup> &backup, size_t num);
|
void CopyOutDParam(std::vector<StringParameterBackup> &backup, class StringParameters &¶ms);
|
||||||
bool HaveDParamChanged(const std::vector<StringParameterBackup> &backup);
|
|
||||||
|
|
||||||
uint64_t GetDParam(size_t n);
|
uint64_t GetDParam(size_t n);
|
||||||
|
|
||||||
|
|
|
@ -13,239 +13,6 @@
|
||||||
#include "strings_func.h"
|
#include "strings_func.h"
|
||||||
#include "string_func.h"
|
#include "string_func.h"
|
||||||
|
|
||||||
/** The data required to format and validate a single parameter of a string. */
|
|
||||||
struct StringParameter {
|
|
||||||
uint64_t data; ///< The data of the parameter.
|
|
||||||
const char *string_view; ///< The string value, if it has any.
|
|
||||||
std::unique_ptr<std::string> string; ///< Copied string value, if it has any.
|
|
||||||
char32_t type; ///< The #StringControlCode to interpret this data with when it's the first parameter, otherwise '\0'.
|
|
||||||
};
|
|
||||||
|
|
||||||
class StringParameters {
|
|
||||||
protected:
|
|
||||||
StringParameters *parent = nullptr; ///< If not nullptr, this instance references data from this parent instance.
|
|
||||||
std::span<StringParameter> parameters = {}; ///< Array with the actual parameters.
|
|
||||||
|
|
||||||
size_t offset = 0; ///< Current offset in the parameters span.
|
|
||||||
char32_t next_type = 0; ///< The type of the next data that is retrieved.
|
|
||||||
|
|
||||||
StringParameters(std::span<StringParameter> parameters = {}) :
|
|
||||||
parameters(parameters)
|
|
||||||
{}
|
|
||||||
|
|
||||||
StringParameter *GetNextParameterPointer();
|
|
||||||
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* Create a new StringParameters instance that can reference part of the data of
|
|
||||||
* the given parent instance.
|
|
||||||
*/
|
|
||||||
StringParameters(StringParameters &parent, size_t size) :
|
|
||||||
parent(&parent),
|
|
||||||
parameters(parent.parameters.subspan(parent.offset, size))
|
|
||||||
{}
|
|
||||||
|
|
||||||
void PrepareForNextRun();
|
|
||||||
void SetTypeOfNextParameter(char32_t type) { this->next_type = type; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the current offset, so it can be backed up for certain processing
|
|
||||||
* steps, or be used to offset the argument index within sub strings.
|
|
||||||
* @return The current offset.
|
|
||||||
*/
|
|
||||||
size_t GetOffset() { return this->offset; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the offset within the string from where to return the next result of
|
|
||||||
* \c GetInt64 or \c GetInt32.
|
|
||||||
* @param offset The offset.
|
|
||||||
*/
|
|
||||||
void SetOffset(size_t offset)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* The offset must be fewer than the number of parameters when it is
|
|
||||||
* being set. Unless restoring a backup, then the original value is
|
|
||||||
* correct as well as long as the offset was not changed. In other
|
|
||||||
* words, when the offset was already at the end of the parameters and
|
|
||||||
* the string did not consume any parameters.
|
|
||||||
*/
|
|
||||||
assert(offset < this->parameters.size() || this->offset == offset);
|
|
||||||
this->offset = offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Advance the offset within the string from where to return the next result of
|
|
||||||
* \c GetInt64 or \c GetInt32.
|
|
||||||
* @param advance The amount to advance the offset by.
|
|
||||||
*/
|
|
||||||
void AdvanceOffset(size_t advance)
|
|
||||||
{
|
|
||||||
this->offset += advance;
|
|
||||||
assert(this->offset <= this->parameters.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the next parameter from our parameters.
|
|
||||||
* This updates the offset, so the next time this is called the next parameter
|
|
||||||
* will be read.
|
|
||||||
* @return The next parameter's value.
|
|
||||||
*/
|
|
||||||
template <typename T>
|
|
||||||
T GetNextParameter()
|
|
||||||
{
|
|
||||||
auto ptr = GetNextParameterPointer();
|
|
||||||
return static_cast<T>(ptr->data);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the next string parameter from our parameters.
|
|
||||||
* This updates the offset, so the next time this is called the next parameter
|
|
||||||
* will be read.
|
|
||||||
* @return The next parameter's value.
|
|
||||||
*/
|
|
||||||
const char *GetNextParameterString()
|
|
||||||
{
|
|
||||||
auto ptr = GetNextParameterPointer();
|
|
||||||
return ptr->string != nullptr ? ptr->string->c_str() : ptr->string_view;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a new instance of StringParameters that is a "range" into the
|
|
||||||
* remaining existing parameters. Upon destruction the offset in the parent
|
|
||||||
* is not updated. However, calls to SetDParam do update the parameters.
|
|
||||||
*
|
|
||||||
* The returned StringParameters must not outlive this StringParameters.
|
|
||||||
* @return A "range" of the string parameters.
|
|
||||||
*/
|
|
||||||
StringParameters GetRemainingParameters() { return GetRemainingParameters(this->offset); }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a new instance of StringParameters that is a "range" into the
|
|
||||||
* remaining existing parameters from the given offset. Upon destruction the
|
|
||||||
* offset in the parent is not updated. However, calls to SetDParam do
|
|
||||||
* update the parameters.
|
|
||||||
*
|
|
||||||
* The returned StringParameters must not outlive this StringParameters.
|
|
||||||
* @param offset The offset to get the remaining parameters for.
|
|
||||||
* @return A "range" of the string parameters.
|
|
||||||
*/
|
|
||||||
StringParameters GetRemainingParameters(size_t offset)
|
|
||||||
{
|
|
||||||
return StringParameters(this->parameters.subspan(offset, this->parameters.size() - offset));
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Return the amount of elements which can still be read. */
|
|
||||||
size_t GetDataLeft() const
|
|
||||||
{
|
|
||||||
return this->parameters.size() - this->offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Get the type of a specific element. */
|
|
||||||
char32_t GetTypeAtOffset(size_t offset) const
|
|
||||||
{
|
|
||||||
assert(offset < this->parameters.size());
|
|
||||||
return this->parameters[offset].type;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetParam(size_t n, uint64_t v)
|
|
||||||
{
|
|
||||||
assert(n < this->parameters.size());
|
|
||||||
this->parameters[n].data = v;
|
|
||||||
this->parameters[n].string.reset();
|
|
||||||
this->parameters[n].string_view = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, std::enable_if_t<std::is_base_of<StrongTypedefBase, T>::value, int> = 0>
|
|
||||||
void SetParam(size_t n, T v)
|
|
||||||
{
|
|
||||||
SetParam(n, v.base());
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetParam(size_t n, const char *str)
|
|
||||||
{
|
|
||||||
assert(n < this->parameters.size());
|
|
||||||
this->parameters[n].data = 0;
|
|
||||||
this->parameters[n].string.reset();
|
|
||||||
this->parameters[n].string_view = str;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetParam(size_t n, const std::string &str) { this->SetParam(n, str.c_str()); }
|
|
||||||
|
|
||||||
void SetParam(size_t n, std::string &&str)
|
|
||||||
{
|
|
||||||
assert(n < this->parameters.size());
|
|
||||||
this->parameters[n].data = 0;
|
|
||||||
this->parameters[n].string = std::make_unique<std::string>(std::move(str));
|
|
||||||
this->parameters[n].string_view = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t GetParam(size_t n) const
|
|
||||||
{
|
|
||||||
assert(n < this->parameters.size());
|
|
||||||
assert(this->parameters[n].string_view == nullptr && this->parameters[n].string == nullptr);
|
|
||||||
return this->parameters[n].data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the stored string of the parameter, or \c nullptr when there is none.
|
|
||||||
* @param n The index into the parameters.
|
|
||||||
* @return The stored string.
|
|
||||||
*/
|
|
||||||
const char *GetParamStr(size_t n) const
|
|
||||||
{
|
|
||||||
assert(n < this->parameters.size());
|
|
||||||
auto ¶m = this->parameters[n];
|
|
||||||
return param.string != nullptr ? param.string->c_str() : param.string_view;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extension of StringParameters with its own statically sized buffer for
|
|
||||||
* the parameters.
|
|
||||||
*/
|
|
||||||
template <size_t N>
|
|
||||||
class ArrayStringParameters : public StringParameters {
|
|
||||||
std::array<StringParameter, N> params{}; ///< The actual parameters
|
|
||||||
|
|
||||||
public:
|
|
||||||
ArrayStringParameters()
|
|
||||||
{
|
|
||||||
this->parameters = std::span(params.data(), params.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
ArrayStringParameters(ArrayStringParameters&& other) noexcept
|
|
||||||
{
|
|
||||||
*this = std::move(other);
|
|
||||||
}
|
|
||||||
|
|
||||||
ArrayStringParameters& operator=(ArrayStringParameters &&other) noexcept
|
|
||||||
{
|
|
||||||
this->offset = other.offset;
|
|
||||||
this->next_type = other.next_type;
|
|
||||||
this->params = std::move(other.params);
|
|
||||||
this->parameters = std::span(params.data(), params.size());
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
ArrayStringParameters(const ArrayStringParameters &other) = delete;
|
|
||||||
ArrayStringParameters& operator=(const ArrayStringParameters &other) = delete;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Helper to create the StringParameters with its own buffer with the given
|
|
||||||
* parameter values.
|
|
||||||
* @param args The parameters to set for the to be created StringParameters.
|
|
||||||
* @return The constructed StringParameters.
|
|
||||||
*/
|
|
||||||
template <typename... Args>
|
|
||||||
static auto MakeParameters(const Args&... args)
|
|
||||||
{
|
|
||||||
ArrayStringParameters<sizeof...(args)> parameters;
|
|
||||||
size_t index = 0;
|
|
||||||
(parameters.SetParam(index++, std::forward<const Args&>(args)), ...);
|
|
||||||
return parameters;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Equivalent to the std::back_insert_iterator in function, with some
|
* Equivalent to the std::back_insert_iterator in function, with some
|
||||||
* convenience helpers for string concatenation.
|
* convenience helpers for string concatenation.
|
||||||
|
|
|
@ -10,6 +10,8 @@
|
||||||
#ifndef STRINGS_TYPE_H
|
#ifndef STRINGS_TYPE_H
|
||||||
#define STRINGS_TYPE_H
|
#define STRINGS_TYPE_H
|
||||||
|
|
||||||
|
#include "core/strong_typedef_type.hpp"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Numeric value that represents a string, independent of the selected language.
|
* Numeric value that represents a string, independent of the selected language.
|
||||||
*/
|
*/
|
||||||
|
@ -118,4 +120,237 @@ struct StringParameterBackup {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** The data required to format and validate a single parameter of a string. */
|
||||||
|
struct StringParameter {
|
||||||
|
uint64_t data; ///< The data of the parameter.
|
||||||
|
const char *string_view; ///< The string value, if it has any.
|
||||||
|
std::unique_ptr<std::string> string; ///< Copied string value, if it has any.
|
||||||
|
char32_t type; ///< The #StringControlCode to interpret this data with when it's the first parameter, otherwise '\0'.
|
||||||
|
};
|
||||||
|
|
||||||
|
class StringParameters {
|
||||||
|
protected:
|
||||||
|
StringParameters *parent = nullptr; ///< If not nullptr, this instance references data from this parent instance.
|
||||||
|
std::span<StringParameter> parameters = {}; ///< Array with the actual parameters.
|
||||||
|
|
||||||
|
size_t offset = 0; ///< Current offset in the parameters span.
|
||||||
|
char32_t next_type = 0; ///< The type of the next data that is retrieved.
|
||||||
|
|
||||||
|
StringParameters(std::span<StringParameter> parameters = {}) :
|
||||||
|
parameters(parameters)
|
||||||
|
{}
|
||||||
|
|
||||||
|
StringParameter *GetNextParameterPointer();
|
||||||
|
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Create a new StringParameters instance that can reference part of the data of
|
||||||
|
* the given parent instance.
|
||||||
|
*/
|
||||||
|
StringParameters(StringParameters &parent, size_t size) :
|
||||||
|
parent(&parent),
|
||||||
|
parameters(parent.parameters.subspan(parent.offset, size))
|
||||||
|
{}
|
||||||
|
|
||||||
|
void PrepareForNextRun();
|
||||||
|
void SetTypeOfNextParameter(char32_t type) { this->next_type = type; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the current offset, so it can be backed up for certain processing
|
||||||
|
* steps, or be used to offset the argument index within sub strings.
|
||||||
|
* @return The current offset.
|
||||||
|
*/
|
||||||
|
size_t GetOffset() { return this->offset; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the offset within the string from where to return the next result of
|
||||||
|
* \c GetInt64 or \c GetInt32.
|
||||||
|
* @param offset The offset.
|
||||||
|
*/
|
||||||
|
void SetOffset(size_t offset)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* The offset must be fewer than the number of parameters when it is
|
||||||
|
* being set. Unless restoring a backup, then the original value is
|
||||||
|
* correct as well as long as the offset was not changed. In other
|
||||||
|
* words, when the offset was already at the end of the parameters and
|
||||||
|
* the string did not consume any parameters.
|
||||||
|
*/
|
||||||
|
assert(offset < this->parameters.size() || this->offset == offset);
|
||||||
|
this->offset = offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Advance the offset within the string from where to return the next result of
|
||||||
|
* \c GetInt64 or \c GetInt32.
|
||||||
|
* @param advance The amount to advance the offset by.
|
||||||
|
*/
|
||||||
|
void AdvanceOffset(size_t advance)
|
||||||
|
{
|
||||||
|
this->offset += advance;
|
||||||
|
assert(this->offset <= this->parameters.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the next parameter from our parameters.
|
||||||
|
* This updates the offset, so the next time this is called the next parameter
|
||||||
|
* will be read.
|
||||||
|
* @return The next parameter's value.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
T GetNextParameter()
|
||||||
|
{
|
||||||
|
auto ptr = GetNextParameterPointer();
|
||||||
|
return static_cast<T>(ptr->data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the next string parameter from our parameters.
|
||||||
|
* This updates the offset, so the next time this is called the next parameter
|
||||||
|
* will be read.
|
||||||
|
* @return The next parameter's value.
|
||||||
|
*/
|
||||||
|
const char *GetNextParameterString()
|
||||||
|
{
|
||||||
|
auto ptr = GetNextParameterPointer();
|
||||||
|
return ptr->string != nullptr ? ptr->string->c_str() : ptr->string_view;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a new instance of StringParameters that is a "range" into the
|
||||||
|
* remaining existing parameters. Upon destruction the offset in the parent
|
||||||
|
* is not updated. However, calls to SetDParam do update the parameters.
|
||||||
|
*
|
||||||
|
* The returned StringParameters must not outlive this StringParameters.
|
||||||
|
* @return A "range" of the string parameters.
|
||||||
|
*/
|
||||||
|
StringParameters GetRemainingParameters() { return GetRemainingParameters(this->offset); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a new instance of StringParameters that is a "range" into the
|
||||||
|
* remaining existing parameters from the given offset. Upon destruction the
|
||||||
|
* offset in the parent is not updated. However, calls to SetDParam do
|
||||||
|
* update the parameters.
|
||||||
|
*
|
||||||
|
* The returned StringParameters must not outlive this StringParameters.
|
||||||
|
* @param offset The offset to get the remaining parameters for.
|
||||||
|
* @return A "range" of the string parameters.
|
||||||
|
*/
|
||||||
|
StringParameters GetRemainingParameters(size_t offset)
|
||||||
|
{
|
||||||
|
return StringParameters(this->parameters.subspan(offset, this->parameters.size() - offset));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Return the amount of elements which can still be read. */
|
||||||
|
size_t GetDataLeft() const
|
||||||
|
{
|
||||||
|
return this->parameters.size() - this->offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Get the type of a specific element. */
|
||||||
|
char32_t GetTypeAtOffset(size_t offset) const
|
||||||
|
{
|
||||||
|
assert(offset < this->parameters.size());
|
||||||
|
return this->parameters[offset].type;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetParam(size_t n, uint64_t v)
|
||||||
|
{
|
||||||
|
assert(n < this->parameters.size());
|
||||||
|
this->parameters[n].data = v;
|
||||||
|
this->parameters[n].string.reset();
|
||||||
|
this->parameters[n].string_view = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, std::enable_if_t<std::is_base_of<StrongTypedefBase, T>::value, int> = 0>
|
||||||
|
void SetParam(size_t n, T v)
|
||||||
|
{
|
||||||
|
SetParam(n, v.base());
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetParam(size_t n, const char *str)
|
||||||
|
{
|
||||||
|
assert(n < this->parameters.size());
|
||||||
|
this->parameters[n].data = 0;
|
||||||
|
this->parameters[n].string.reset();
|
||||||
|
this->parameters[n].string_view = str;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetParam(size_t n, const std::string &str) { this->SetParam(n, str.c_str()); }
|
||||||
|
|
||||||
|
void SetParam(size_t n, std::string &&str)
|
||||||
|
{
|
||||||
|
assert(n < this->parameters.size());
|
||||||
|
this->parameters[n].data = 0;
|
||||||
|
this->parameters[n].string = std::make_unique<std::string>(std::move(str));
|
||||||
|
this->parameters[n].string_view = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t GetParam(size_t n) const
|
||||||
|
{
|
||||||
|
assert(n < this->parameters.size());
|
||||||
|
assert(this->parameters[n].string_view == nullptr && this->parameters[n].string == nullptr);
|
||||||
|
return this->parameters[n].data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the stored string of the parameter, or \c nullptr when there is none.
|
||||||
|
* @param n The index into the parameters.
|
||||||
|
* @return The stored string.
|
||||||
|
*/
|
||||||
|
const char *GetParamStr(size_t n) const
|
||||||
|
{
|
||||||
|
assert(n < this->parameters.size());
|
||||||
|
auto ¶m = this->parameters[n];
|
||||||
|
return param.string != nullptr ? param.string->c_str() : param.string_view;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extension of StringParameters with its own statically sized buffer for
|
||||||
|
* the parameters.
|
||||||
|
*/
|
||||||
|
template <size_t N>
|
||||||
|
class ArrayStringParameters : public StringParameters {
|
||||||
|
std::array<StringParameter, N> params{}; ///< The actual parameters
|
||||||
|
|
||||||
|
public:
|
||||||
|
ArrayStringParameters()
|
||||||
|
{
|
||||||
|
this->parameters = std::span(params.data(), params.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
ArrayStringParameters(ArrayStringParameters&& other) noexcept
|
||||||
|
{
|
||||||
|
*this = std::move(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
ArrayStringParameters& operator=(ArrayStringParameters &&other) noexcept
|
||||||
|
{
|
||||||
|
this->offset = other.offset;
|
||||||
|
this->next_type = other.next_type;
|
||||||
|
this->params = std::move(other.params);
|
||||||
|
this->parameters = std::span(params.data(), params.size());
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
ArrayStringParameters(const ArrayStringParameters &other) = delete;
|
||||||
|
ArrayStringParameters& operator=(const ArrayStringParameters &other) = delete;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper to create the StringParameters with its own buffer with the given
|
||||||
|
* parameter values.
|
||||||
|
* @param args The parameters to set for the to be created StringParameters.
|
||||||
|
* @return The constructed StringParameters.
|
||||||
|
*/
|
||||||
|
template <typename... Args>
|
||||||
|
static auto MakeParameters(const Args&... args)
|
||||||
|
{
|
||||||
|
ArrayStringParameters<sizeof...(args)> parameters;
|
||||||
|
size_t index = 0;
|
||||||
|
(parameters.SetParam(index++, std::forward<const Args&>(args)), ...);
|
||||||
|
return parameters;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* STRINGS_TYPE_H */
|
#endif /* STRINGS_TYPE_H */
|
||||||
|
|
|
@ -51,11 +51,13 @@ void Subsidy::AwardTo(CompanyID company)
|
||||||
NewsStringData *company_name = new NewsStringData(GetString(STR_COMPANY_NAME));
|
NewsStringData *company_name = new NewsStringData(GetString(STR_COMPANY_NAME));
|
||||||
|
|
||||||
/* Add a news item */
|
/* Add a news item */
|
||||||
std::pair<NewsReferenceType, NewsReferenceType> reftype = SetupSubsidyDecodeParam(this, SubsidyDecodeParamType::NewsAwarded, 1);
|
ArrayStringParameters<8> params;
|
||||||
|
std::pair<NewsReferenceType, NewsReferenceType> reftype = SetupSubsidyDecodeParam(this, SubsidyDecodeParamType::NewsAwarded, params, 1);
|
||||||
|
params.SetParam(0, company_name->string);
|
||||||
|
|
||||||
SetDParamStr(0, company_name->string);
|
|
||||||
AddNewsItem(
|
AddNewsItem(
|
||||||
STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF + _settings_game.difficulty.subsidy_multiplier,
|
STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF + _settings_game.difficulty.subsidy_multiplier,
|
||||||
|
std::move(params),
|
||||||
NT_SUBSIDIES, NF_NORMAL,
|
NT_SUBSIDIES, NF_NORMAL,
|
||||||
reftype.first, this->src, reftype.second, this->dst,
|
reftype.first, this->src, reftype.second, this->dst,
|
||||||
company_name
|
company_name
|
||||||
|
@ -70,47 +72,48 @@ void Subsidy::AwardTo(CompanyID company)
|
||||||
* Setup the string parameters for printing the subsidy at the screen, and compute the news reference for the subsidy.
|
* Setup the string parameters for printing the subsidy at the screen, and compute the news reference for the subsidy.
|
||||||
* @param s %Subsidy being printed.
|
* @param s %Subsidy being printed.
|
||||||
* @param mode Type of subsidy news message to decide on parameter format.
|
* @param mode Type of subsidy news message to decide on parameter format.
|
||||||
|
* @param params String parameters to be filled. Needs to be able to contain at least 8 + parameter_offset entries.
|
||||||
* @param parameter_offset The location/index in the String DParams to start decoding the subsidy's parameters. Defaults to 0.
|
* @param parameter_offset The location/index in the String DParams to start decoding the subsidy's parameters. Defaults to 0.
|
||||||
* @return Reference of the subsidy in the news system.
|
* @return Reference of the subsidy in the news system.
|
||||||
*/
|
*/
|
||||||
std::pair<NewsReferenceType, NewsReferenceType> SetupSubsidyDecodeParam(const Subsidy *s, SubsidyDecodeParamType mode, uint parameter_offset)
|
std::pair<NewsReferenceType, NewsReferenceType> SetupSubsidyDecodeParam(const Subsidy *s, SubsidyDecodeParamType mode, StringParameters ¶ms, uint parameter_offset)
|
||||||
{
|
{
|
||||||
NewsReferenceType reftype1 = NR_NONE;
|
NewsReferenceType reftype1 = NR_NONE;
|
||||||
NewsReferenceType reftype2 = NR_NONE;
|
NewsReferenceType reftype2 = NR_NONE;
|
||||||
|
|
||||||
/* Always use the plural form of the cargo name - trying to decide between plural or singular causes issues for translations */
|
/* Always use the plural form of the cargo name - trying to decide between plural or singular causes issues for translations */
|
||||||
const CargoSpec *cs = CargoSpec::Get(s->cargo_type);
|
const CargoSpec *cs = CargoSpec::Get(s->cargo_type);
|
||||||
SetDParam(parameter_offset, cs->name);
|
params.SetParam(parameter_offset, cs->name);
|
||||||
|
|
||||||
switch (s->src_type) {
|
switch (s->src_type) {
|
||||||
case SourceType::Industry:
|
case SourceType::Industry:
|
||||||
reftype1 = NR_INDUSTRY;
|
reftype1 = NR_INDUSTRY;
|
||||||
SetDParam(parameter_offset + 1, STR_INDUSTRY_NAME);
|
params.SetParam(parameter_offset + 1, STR_INDUSTRY_NAME);
|
||||||
break;
|
break;
|
||||||
case SourceType::Town:
|
case SourceType::Town:
|
||||||
reftype1 = NR_TOWN;
|
reftype1 = NR_TOWN;
|
||||||
SetDParam(parameter_offset + 1, STR_TOWN_NAME);
|
params.SetParam(parameter_offset + 1, STR_TOWN_NAME);
|
||||||
break;
|
break;
|
||||||
default: NOT_REACHED();
|
default: NOT_REACHED();
|
||||||
}
|
}
|
||||||
SetDParam(parameter_offset + 2, s->src);
|
params.SetParam(parameter_offset + 2, s->src);
|
||||||
|
|
||||||
switch (s->dst_type) {
|
switch (s->dst_type) {
|
||||||
case SourceType::Industry:
|
case SourceType::Industry:
|
||||||
reftype2 = NR_INDUSTRY;
|
reftype2 = NR_INDUSTRY;
|
||||||
SetDParam(parameter_offset + 4, STR_INDUSTRY_NAME);
|
params.SetParam(parameter_offset + 4, STR_INDUSTRY_NAME);
|
||||||
break;
|
break;
|
||||||
case SourceType::Town:
|
case SourceType::Town:
|
||||||
reftype2 = NR_TOWN;
|
reftype2 = NR_TOWN;
|
||||||
SetDParam(parameter_offset + 4, STR_TOWN_NAME);
|
params.SetParam(parameter_offset + 4, STR_TOWN_NAME);
|
||||||
break;
|
break;
|
||||||
default: NOT_REACHED();
|
default: NOT_REACHED();
|
||||||
}
|
}
|
||||||
SetDParam(parameter_offset + 5, s->dst);
|
params.SetParam(parameter_offset + 5, s->dst);
|
||||||
|
|
||||||
/* If the subsidy is being offered or awarded, the news item mentions the subsidy duration. */
|
/* If the subsidy is being offered or awarded, the news item mentions the subsidy duration. */
|
||||||
if (mode == SubsidyDecodeParamType::NewsOffered || mode == SubsidyDecodeParamType::NewsAwarded) {
|
if (mode == SubsidyDecodeParamType::NewsOffered || mode == SubsidyDecodeParamType::NewsAwarded) {
|
||||||
SetDParam(parameter_offset + 7, _settings_game.difficulty.subsidy_duration);
|
params.SetParam(parameter_offset + 7, _settings_game.difficulty.subsidy_duration);
|
||||||
}
|
}
|
||||||
|
|
||||||
return std::pair<NewsReferenceType, NewsReferenceType>(reftype1, reftype2);
|
return std::pair<NewsReferenceType, NewsReferenceType>(reftype1, reftype2);
|
||||||
|
@ -222,8 +225,9 @@ void CreateSubsidy(CargoID cid, SourceType src_type, SourceID src, SourceType ds
|
||||||
s->remaining = SUBSIDY_OFFER_MONTHS;
|
s->remaining = SUBSIDY_OFFER_MONTHS;
|
||||||
s->awarded = INVALID_COMPANY;
|
s->awarded = INVALID_COMPANY;
|
||||||
|
|
||||||
std::pair<NewsReferenceType, NewsReferenceType> reftype = SetupSubsidyDecodeParam(s, SubsidyDecodeParamType::NewsOffered);
|
ArrayStringParameters<8> params;
|
||||||
AddNewsItem(STR_NEWS_SERVICE_SUBSIDY_OFFERED, NT_SUBSIDIES, NF_NORMAL, reftype.first, s->src, reftype.second, s->dst);
|
std::pair<NewsReferenceType, NewsReferenceType> reftype = SetupSubsidyDecodeParam(s, SubsidyDecodeParamType::NewsOffered, params);
|
||||||
|
AddNewsItem(STR_NEWS_SERVICE_SUBSIDY_OFFERED, std::move(params), NT_SUBSIDIES, NF_NORMAL, reftype.first, s->src, reftype.second, s->dst);
|
||||||
SetPartOfSubsidyFlag(s->src_type, s->src, POS_SRC);
|
SetPartOfSubsidyFlag(s->src_type, s->src, POS_SRC);
|
||||||
SetPartOfSubsidyFlag(s->dst_type, s->dst, POS_DST);
|
SetPartOfSubsidyFlag(s->dst_type, s->dst, POS_DST);
|
||||||
AI::BroadcastNewEvent(new ScriptEventSubsidyOffer(s->index));
|
AI::BroadcastNewEvent(new ScriptEventSubsidyOffer(s->index));
|
||||||
|
@ -482,14 +486,16 @@ static IntervalTimer<TimerGameEconomy> _economy_subsidies_monthly({TimerGameEcon
|
||||||
for (Subsidy *s : Subsidy::Iterate()) {
|
for (Subsidy *s : Subsidy::Iterate()) {
|
||||||
if (--s->remaining == 0) {
|
if (--s->remaining == 0) {
|
||||||
if (!s->IsAwarded()) {
|
if (!s->IsAwarded()) {
|
||||||
std::pair<NewsReferenceType, NewsReferenceType> reftype = SetupSubsidyDecodeParam(s, SubsidyDecodeParamType::NewsWithdrawn);
|
ArrayStringParameters<8> params;
|
||||||
AddNewsItem(STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED, NT_SUBSIDIES, NF_NORMAL, reftype.first, s->src, reftype.second, s->dst);
|
std::pair<NewsReferenceType, NewsReferenceType> reftype = SetupSubsidyDecodeParam(s, SubsidyDecodeParamType::NewsWithdrawn, params);
|
||||||
|
AddNewsItem(STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED, std::move(params), NT_SUBSIDIES, NF_NORMAL, reftype.first, s->src, reftype.second, s->dst);
|
||||||
AI::BroadcastNewEvent(new ScriptEventSubsidyOfferExpired(s->index));
|
AI::BroadcastNewEvent(new ScriptEventSubsidyOfferExpired(s->index));
|
||||||
Game::NewEvent(new ScriptEventSubsidyOfferExpired(s->index));
|
Game::NewEvent(new ScriptEventSubsidyOfferExpired(s->index));
|
||||||
} else {
|
} else {
|
||||||
if (s->awarded == _local_company) {
|
if (s->awarded == _local_company) {
|
||||||
std::pair<NewsReferenceType, NewsReferenceType> reftype = SetupSubsidyDecodeParam(s, SubsidyDecodeParamType::NewsWithdrawn);
|
ArrayStringParameters<8> params;
|
||||||
AddNewsItem(STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE, NT_SUBSIDIES, NF_NORMAL, reftype.first, s->src, reftype.second, s->dst);
|
std::pair<NewsReferenceType, NewsReferenceType> reftype = SetupSubsidyDecodeParam(s, SubsidyDecodeParamType::NewsWithdrawn, params);
|
||||||
|
AddNewsItem(STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE, std::move(params), NT_SUBSIDIES, NF_NORMAL, reftype.first, s->src, reftype.second, s->dst);
|
||||||
}
|
}
|
||||||
AI::BroadcastNewEvent(new ScriptEventSubsidyExpired(s->index));
|
AI::BroadcastNewEvent(new ScriptEventSubsidyExpired(s->index));
|
||||||
Game::NewEvent(new ScriptEventSubsidyExpired(s->index));
|
Game::NewEvent(new ScriptEventSubsidyExpired(s->index));
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
#include "news_type.h"
|
#include "news_type.h"
|
||||||
#include "subsidy_base.h"
|
#include "subsidy_base.h"
|
||||||
|
|
||||||
std::pair<NewsReferenceType, NewsReferenceType> SetupSubsidyDecodeParam(const struct Subsidy *s, SubsidyDecodeParamType mode, uint parameter_offset = 0);
|
std::pair<NewsReferenceType, NewsReferenceType> SetupSubsidyDecodeParam(const struct Subsidy *s, SubsidyDecodeParamType mode, StringParameters ¶ms, uint parameter_offset = 0);
|
||||||
void DeleteSubsidyWith(SourceType type, SourceID index);
|
void DeleteSubsidyWith(SourceType type, SourceID index);
|
||||||
bool CheckSubsidised(CargoID cargo_type, CompanyID company, SourceType src_type, SourceID src, const Station *st);
|
bool CheckSubsidised(CargoID cargo_type, CompanyID company, SourceType src_type, SourceID src, const Station *st);
|
||||||
void RebuildSubsidisedSourceAndDestinationCache();
|
void RebuildSubsidisedSourceAndDestinationCache();
|
||||||
|
|
|
@ -158,7 +158,9 @@ struct SubsidyListWindow : Window {
|
||||||
if (!s->IsAwarded()) {
|
if (!s->IsAwarded()) {
|
||||||
if (IsInsideMM(pos, 0, cap)) {
|
if (IsInsideMM(pos, 0, cap)) {
|
||||||
/* Displays the two offered towns */
|
/* Displays the two offered towns */
|
||||||
SetupSubsidyDecodeParam(s, SubsidyDecodeParamType::Gui);
|
extern ArrayStringParameters<20> _global_string_params;
|
||||||
|
SetupSubsidyDecodeParam(s, SubsidyDecodeParamType::Gui, _global_string_params);
|
||||||
|
|
||||||
/* If using wallclock units, show minutes remaining. Otherwise show the date when the subsidy ends. */
|
/* If using wallclock units, show minutes remaining. Otherwise show the date when the subsidy ends. */
|
||||||
if (TimerGameEconomy::UsingWallclockUnits()) {
|
if (TimerGameEconomy::UsingWallclockUnits()) {
|
||||||
SetDParam(7, STR_SUBSIDIES_OFFERED_EXPIRY_TIME);
|
SetDParam(7, STR_SUBSIDIES_OFFERED_EXPIRY_TIME);
|
||||||
|
@ -189,7 +191,9 @@ struct SubsidyListWindow : Window {
|
||||||
for (const Subsidy *s : Subsidy::Iterate()) {
|
for (const Subsidy *s : Subsidy::Iterate()) {
|
||||||
if (s->IsAwarded()) {
|
if (s->IsAwarded()) {
|
||||||
if (IsInsideMM(pos, 0, cap)) {
|
if (IsInsideMM(pos, 0, cap)) {
|
||||||
SetupSubsidyDecodeParam(s, SubsidyDecodeParamType::Gui);
|
extern ArrayStringParameters<20> _global_string_params;
|
||||||
|
SetupSubsidyDecodeParam(s, SubsidyDecodeParamType::Gui, _global_string_params);
|
||||||
|
|
||||||
SetDParam(7, s->awarded);
|
SetDParam(7, s->awarded);
|
||||||
/* If using wallclock units, show minutes remaining. Otherwise show the date when the subsidy ends. */
|
/* If using wallclock units, show minutes remaining. Otherwise show the date when the subsidy ends. */
|
||||||
if (TimerGameEconomy::UsingWallclockUnits()) {
|
if (TimerGameEconomy::UsingWallclockUnits()) {
|
||||||
|
|
|
@ -637,7 +637,7 @@ struct ScenarioEditorLandscapeGenerationWindow : Window {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WID_ETT_RESET_LANDSCAPE: // Reset landscape
|
case WID_ETT_RESET_LANDSCAPE: // Reset landscape
|
||||||
ShowQuery(STR_QUERY_RESET_LANDSCAPE_CAPTION, STR_RESET_LANDSCAPE_CONFIRMATION_TEXT, nullptr, ResetLandscapeConfirmationCallback);
|
ShowQuery(STR_QUERY_RESET_LANDSCAPE_CAPTION, STR_RESET_LANDSCAPE_CONFIRMATION_TEXT, MakeParameters(), nullptr, ResetLandscapeConfirmationCallback);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default: NOT_REACHED();
|
default: NOT_REACHED();
|
||||||
|
|
|
@ -7,7 +7,6 @@ add_test_files(
|
||||||
mock_spritecache.cpp
|
mock_spritecache.cpp
|
||||||
mock_spritecache.h
|
mock_spritecache.h
|
||||||
string_func.cpp
|
string_func.cpp
|
||||||
strings_func.cpp
|
|
||||||
test_main.cpp
|
test_main.cpp
|
||||||
test_script_admin.cpp
|
test_script_admin.cpp
|
||||||
test_window_desc.cpp
|
test_window_desc.cpp
|
||||||
|
|
|
@ -1,52 +0,0 @@
|
||||||
/*
|
|
||||||
* This file is part of OpenTTD.
|
|
||||||
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
|
|
||||||
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @file strings_func.cpp Test functionality from strings_func. */
|
|
||||||
|
|
||||||
#include "../stdafx.h"
|
|
||||||
|
|
||||||
#include "../3rdparty/catch2/catch.hpp"
|
|
||||||
|
|
||||||
#include "../strings_func.h"
|
|
||||||
|
|
||||||
TEST_CASE("HaveDParamChanged")
|
|
||||||
{
|
|
||||||
SetDParam(0, 0);
|
|
||||||
SetDParamStr(1, "some string");
|
|
||||||
|
|
||||||
std::vector<StringParameterBackup> backup;
|
|
||||||
CopyOutDParam(backup, 2);
|
|
||||||
|
|
||||||
CHECK(HaveDParamChanged(backup) == false);
|
|
||||||
|
|
||||||
/* A different parameter 0 (both string and numeric). */
|
|
||||||
SetDParam(0, 1);
|
|
||||||
CHECK(HaveDParamChanged(backup) == true);
|
|
||||||
|
|
||||||
SetDParamStr(0, "some other string");
|
|
||||||
CHECK(HaveDParamChanged(backup) == true);
|
|
||||||
|
|
||||||
/* Back to the original state, nothing should have changed. */
|
|
||||||
SetDParam(0, 0);
|
|
||||||
CHECK(HaveDParamChanged(backup) == false);
|
|
||||||
|
|
||||||
/* A different parameter 1 (both string and numeric). */
|
|
||||||
SetDParamStr(1, "some other string");
|
|
||||||
CHECK(HaveDParamChanged(backup) == true);
|
|
||||||
|
|
||||||
SetDParam(1, 0);
|
|
||||||
CHECK(HaveDParamChanged(backup) == true);
|
|
||||||
|
|
||||||
/* Back to the original state, nothing should have changed. */
|
|
||||||
SetDParamStr(1, "some string");
|
|
||||||
CHECK(HaveDParamChanged(backup) == false);
|
|
||||||
|
|
||||||
/* Changing paramter 2 should not have any effect, as the backup is only 2 long. */
|
|
||||||
SetDParam(2, 3);
|
|
||||||
CHECK(HaveDParamChanged(backup) == false);
|
|
||||||
|
|
||||||
}
|
|
|
@ -29,7 +29,7 @@ DECLARE_ENUM_AS_BIT_SET(QueryStringFlags)
|
||||||
typedef void QueryCallbackProc(Window*, bool);
|
typedef void QueryCallbackProc(Window*, bool);
|
||||||
|
|
||||||
void ShowQueryString(StringID str, StringID caption, uint max_len, Window *parent, CharSetFilter afilter, QueryStringFlags flags);
|
void ShowQueryString(StringID str, StringID caption, uint max_len, Window *parent, CharSetFilter afilter, QueryStringFlags flags);
|
||||||
void ShowQuery(StringID caption, StringID message, Window *w, QueryCallbackProc *callback, bool focus = false);
|
void ShowQuery(StringID caption, StringID message, class StringParameters &¶ms, Window *w, QueryCallbackProc *callback, bool focus = false);
|
||||||
|
|
||||||
/** The number of 'characters' on the on-screen keyboard. */
|
/** The number of 'characters' on the on-screen keyboard. */
|
||||||
static const uint OSK_KEYBOARD_ENTRIES = 50;
|
static const uint OSK_KEYBOARD_ENTRIES = 50;
|
||||||
|
|
|
@ -38,7 +38,7 @@ struct TextEffect : public ViewportSign {
|
||||||
static std::vector<struct TextEffect> _text_effects; ///< Text effects are stored there
|
static std::vector<struct TextEffect> _text_effects; ///< Text effects are stored there
|
||||||
|
|
||||||
/* Text Effects */
|
/* Text Effects */
|
||||||
TextEffectID AddTextEffect(StringID msg, int center, int y, uint8_t duration, TextEffectMode mode)
|
TextEffectID AddTextEffect(StringID msg, StringParameters &¶ms, int center, int y, uint8_t duration, TextEffectMode mode)
|
||||||
{
|
{
|
||||||
if (_game_mode == GM_MENU) return INVALID_TE_ID;
|
if (_game_mode == GM_MENU) return INVALID_TE_ID;
|
||||||
|
|
||||||
|
@ -54,24 +54,25 @@ TextEffectID AddTextEffect(StringID msg, int center, int y, uint8_t duration, Te
|
||||||
/* Start defining this object */
|
/* Start defining this object */
|
||||||
te.string_id = msg;
|
te.string_id = msg;
|
||||||
te.duration = duration;
|
te.duration = duration;
|
||||||
CopyOutDParam(te.params, 2);
|
CopyOutDParam(te.params, std::move(params));
|
||||||
te.mode = mode;
|
te.mode = mode;
|
||||||
|
|
||||||
/* Make sure we only dirty the new area */
|
/* Make sure we only dirty the new area */
|
||||||
te.width_normal = 0;
|
te.width_normal = 0;
|
||||||
|
CopyInDParam(te.params);
|
||||||
te.UpdatePosition(center, y, msg);
|
te.UpdatePosition(center, y, msg);
|
||||||
|
|
||||||
return static_cast<TextEffectID>(it - std::begin(_text_effects));
|
return static_cast<TextEffectID>(it - std::begin(_text_effects));
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateTextEffect(TextEffectID te_id, StringID msg)
|
void UpdateTextEffect(TextEffectID te_id, StringID msg, StringParameters &¶ms)
|
||||||
{
|
{
|
||||||
/* Update details */
|
/* Update details */
|
||||||
TextEffect &te = _text_effects[te_id];
|
TextEffect &te = _text_effects[te_id];
|
||||||
if (msg == te.string_id && !HaveDParamChanged(te.params)) return;
|
|
||||||
te.string_id = msg;
|
te.string_id = msg;
|
||||||
CopyOutDParam(te.params, 2);
|
CopyOutDParam(te.params, std::move(params));
|
||||||
|
|
||||||
|
CopyInDParam(te.params);
|
||||||
te.UpdatePosition(te.center, te.top, te.string_id, te.string_id - 1);
|
te.UpdatePosition(te.center, te.top, te.string_id, te.string_id - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,10 +26,10 @@ using TextEffectID = uint16_t;
|
||||||
|
|
||||||
static const TextEffectID INVALID_TE_ID = UINT16_MAX;
|
static const TextEffectID INVALID_TE_ID = UINT16_MAX;
|
||||||
|
|
||||||
TextEffectID AddTextEffect(StringID msg, int x, int y, uint8_t duration, TextEffectMode mode);
|
TextEffectID AddTextEffect(StringID msg, class StringParameters &¶ms, int x, int y, uint8_t duration, TextEffectMode mode);
|
||||||
void InitTextEffects();
|
void InitTextEffects();
|
||||||
void DrawTextEffects(DrawPixelInfo *dpi);
|
void DrawTextEffects(DrawPixelInfo *dpi);
|
||||||
void UpdateTextEffect(TextEffectID effect_id, StringID msg);
|
void UpdateTextEffect(TextEffectID effect_id, StringID msg, StringParameters &¶ms);
|
||||||
void RemoveTextEffect(TextEffectID effect_id);
|
void RemoveTextEffect(TextEffectID effect_id);
|
||||||
void UpdateAllTextEffectVirtCoords();
|
void UpdateAllTextEffectVirtCoords();
|
||||||
|
|
||||||
|
|
|
@ -2103,16 +2103,12 @@ std::tuple<CommandCost, Money, TownID> CmdFoundTown(DoCommandFlag flags, TileInd
|
||||||
assert(!random_location);
|
assert(!random_location);
|
||||||
|
|
||||||
if (_current_company == OWNER_DEITY) {
|
if (_current_company == OWNER_DEITY) {
|
||||||
SetDParam(0, t->index);
|
AddTileNewsItem(STR_NEWS_NEW_TOWN_UNSPONSORED, MakeParameters(t->index), NT_INDUSTRY_OPEN, tile);
|
||||||
AddTileNewsItem(STR_NEWS_NEW_TOWN_UNSPONSORED, NT_INDUSTRY_OPEN, tile);
|
|
||||||
} else {
|
} else {
|
||||||
SetDParam(0, _current_company);
|
SetDParam(0, _current_company);
|
||||||
NewsStringData *company_name = new NewsStringData(GetString(STR_COMPANY_NAME));
|
NewsStringData *company_name = new NewsStringData(GetString(STR_COMPANY_NAME));
|
||||||
|
|
||||||
SetDParamStr(0, company_name->string);
|
AddTileNewsItem(STR_NEWS_NEW_TOWN, MakeParameters(company_name->string, t->index), NT_INDUSTRY_OPEN, tile, company_name);
|
||||||
SetDParam(1, t->index);
|
|
||||||
|
|
||||||
AddTileNewsItem(STR_NEWS_NEW_TOWN, NT_INDUSTRY_OPEN, tile, company_name);
|
|
||||||
}
|
}
|
||||||
AI::BroadcastNewEvent(new ScriptEventTownFounded(t->index));
|
AI::BroadcastNewEvent(new ScriptEventTownFounded(t->index));
|
||||||
Game::NewEvent(new ScriptEventTownFounded(t->index));
|
Game::NewEvent(new ScriptEventTownFounded(t->index));
|
||||||
|
@ -2338,7 +2334,7 @@ bool GenerateTowns(TownLayout layout)
|
||||||
|
|
||||||
/* If there are no towns at all and we are generating new game, bail out */
|
/* If there are no towns at all and we are generating new game, bail out */
|
||||||
if (Town::GetNumItems() == 0 && _game_mode != GM_EDITOR) {
|
if (Town::GetNumItems() == 0 && _game_mode != GM_EDITOR) {
|
||||||
ShowErrorMessage(STR_ERROR_COULD_NOT_CREATE_TOWN, INVALID_STRING_ID, WL_CRITICAL);
|
ShowErrorMessage(STR_ERROR_COULD_NOT_CREATE_TOWN, INVALID_STRING_ID, MakeParameters(), WL_CRITICAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false; // we are still without a town? we failed, simply
|
return false; // we are still without a town? we failed, simply
|
||||||
|
@ -3199,11 +3195,9 @@ static CommandCost TownActionRoadRebuild(Town *t, DoCommandFlag flags)
|
||||||
SetDParam(0, _current_company);
|
SetDParam(0, _current_company);
|
||||||
NewsStringData *company_name = new NewsStringData(GetString(STR_COMPANY_NAME));
|
NewsStringData *company_name = new NewsStringData(GetString(STR_COMPANY_NAME));
|
||||||
|
|
||||||
SetDParam(0, t->index);
|
|
||||||
SetDParamStr(1, company_name->string);
|
|
||||||
|
|
||||||
AddNewsItem(
|
AddNewsItem(
|
||||||
TimerGameEconomy::UsingWallclockUnits() ? STR_NEWS_ROAD_REBUILDING_MINUTES : STR_NEWS_ROAD_REBUILDING_MONTHS,
|
TimerGameEconomy::UsingWallclockUnits() ? STR_NEWS_ROAD_REBUILDING_MINUTES : STR_NEWS_ROAD_REBUILDING_MONTHS,
|
||||||
|
MakeParameters(t->index, company_name->string),
|
||||||
NT_GENERAL, NF_NORMAL, NR_TOWN, t->index, NR_NONE, UINT32_MAX, company_name);
|
NT_GENERAL, NF_NORMAL, NR_TOWN, t->index, NR_NONE, UINT32_MAX, company_name);
|
||||||
AI::BroadcastNewEvent(new ScriptEventRoadReconstruction((ScriptCompany::CompanyID)(Owner)_current_company, t->index));
|
AI::BroadcastNewEvent(new ScriptEventRoadReconstruction((ScriptCompany::CompanyID)(Owner)_current_company, t->index));
|
||||||
Game::NewEvent(new ScriptEventRoadReconstruction((ScriptCompany::CompanyID)(Owner)_current_company, t->index));
|
Game::NewEvent(new ScriptEventRoadReconstruction((ScriptCompany::CompanyID)(Owner)_current_company, t->index));
|
||||||
|
@ -3355,11 +3349,13 @@ static CommandCost TownActionBuyRights(Town *t, DoCommandFlag flags)
|
||||||
|
|
||||||
/* Spawn news message */
|
/* Spawn news message */
|
||||||
CompanyNewsInformation *cni = new CompanyNewsInformation(Company::Get(_current_company));
|
CompanyNewsInformation *cni = new CompanyNewsInformation(Company::Get(_current_company));
|
||||||
SetDParam(0, STR_NEWS_EXCLUSIVE_RIGHTS_TITLE);
|
auto params = MakeParameters(
|
||||||
SetDParam(1, TimerGameEconomy::UsingWallclockUnits() ? STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MINUTES : STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MONTHS);
|
STR_NEWS_EXCLUSIVE_RIGHTS_TITLE,
|
||||||
SetDParam(2, t->index);
|
TimerGameEconomy::UsingWallclockUnits() ? STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MINUTES : STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MONTHS,
|
||||||
SetDParamStr(3, cni->company_name);
|
t->index,
|
||||||
AddNewsItem(STR_MESSAGE_NEWS_FORMAT, NT_GENERAL, NF_COMPANY, NR_TOWN, t->index, NR_NONE, UINT32_MAX, cni);
|
cni->company_name
|
||||||
|
);
|
||||||
|
AddNewsItem(STR_MESSAGE_NEWS_FORMAT, std::move(params), NT_GENERAL, NF_COMPANY, NR_TOWN, t->index, NR_NONE, UINT32_MAX, cni);
|
||||||
AI::BroadcastNewEvent(new ScriptEventExclusiveTransportRights((ScriptCompany::CompanyID)(Owner)_current_company, t->index));
|
AI::BroadcastNewEvent(new ScriptEventExclusiveTransportRights((ScriptCompany::CompanyID)(Owner)_current_company, t->index));
|
||||||
Game::NewEvent(new ScriptEventExclusiveTransportRights((ScriptCompany::CompanyID)(Owner)_current_company, t->index));
|
Game::NewEvent(new ScriptEventExclusiveTransportRights((ScriptCompany::CompanyID)(Owner)_current_company, t->index));
|
||||||
}
|
}
|
||||||
|
@ -3388,7 +3384,7 @@ static CommandCost TownActionBribe(Town *t, DoCommandFlag flags)
|
||||||
|
|
||||||
/* only show error message to the executing player. All errors are handled command.c
|
/* only show error message to the executing player. All errors are handled command.c
|
||||||
* but this is special, because it can only 'fail' on a DC_EXEC */
|
* but this is special, because it can only 'fail' on a DC_EXEC */
|
||||||
if (IsLocalCompany()) ShowErrorMessage(STR_ERROR_BRIBE_FAILED, INVALID_STRING_ID, WL_INFO);
|
if (IsLocalCompany()) ShowErrorMessage(STR_ERROR_BRIBE_FAILED, INVALID_STRING_ID, MakeParameters(), WL_INFO);
|
||||||
|
|
||||||
/* decrease by a lot!
|
/* decrease by a lot!
|
||||||
* ChangeTownRating is only for stuff in demolishing. Bribe failure should
|
* ChangeTownRating is only for stuff in demolishing. Bribe failure should
|
||||||
|
|
|
@ -1240,7 +1240,7 @@ public:
|
||||||
Backup<bool> old_generating_world(_generating_world, true, FILE_LINE);
|
Backup<bool> old_generating_world(_generating_world, true, FILE_LINE);
|
||||||
UpdateNearestTownForRoadTiles(true);
|
UpdateNearestTownForRoadTiles(true);
|
||||||
if (!GenerateTowns(this->town_layout)) {
|
if (!GenerateTowns(this->town_layout)) {
|
||||||
ShowErrorMessage(STR_ERROR_CAN_T_GENERATE_TOWN, STR_ERROR_NO_SPACE_FOR_TOWN, WL_INFO);
|
ShowErrorMessage(STR_ERROR_CAN_T_GENERATE_TOWN, STR_ERROR_NO_SPACE_FOR_TOWN, MakeParameters(), WL_INFO);
|
||||||
}
|
}
|
||||||
UpdateNearestTownForRoadTiles(false);
|
UpdateNearestTownForRoadTiles(false);
|
||||||
old_generating_world.Restore();
|
old_generating_world.Restore();
|
||||||
|
|
|
@ -85,9 +85,7 @@ void CheckTrainsLengths()
|
||||||
if ((w->track != TRACK_BIT_DEPOT &&
|
if ((w->track != TRACK_BIT_DEPOT &&
|
||||||
std::max(abs(u->x_pos - w->x_pos), abs(u->y_pos - w->y_pos)) != u->CalcNextVehicleOffset()) ||
|
std::max(abs(u->x_pos - w->x_pos), abs(u->y_pos - w->y_pos)) != u->CalcNextVehicleOffset()) ||
|
||||||
(w->track == TRACK_BIT_DEPOT && TicksToLeaveDepot(u) <= 0)) {
|
(w->track == TRACK_BIT_DEPOT && TicksToLeaveDepot(u) <= 0)) {
|
||||||
SetDParam(0, v->index);
|
ShowErrorMessage(STR_BROKEN_VEHICLE_LENGTH, INVALID_STRING_ID, MakeParameters(v->index, v->owner), WL_CRITICAL);
|
||||||
SetDParam(1, v->owner);
|
|
||||||
ShowErrorMessage(STR_BROKEN_VEHICLE_LENGTH, INVALID_STRING_ID, WL_CRITICAL);
|
|
||||||
|
|
||||||
if (!_networking && first) {
|
if (!_networking && first) {
|
||||||
first = false;
|
first = false;
|
||||||
|
@ -2995,9 +2993,9 @@ static void TrainEnterStation(Train *v, StationID station)
|
||||||
Station *st = Station::Get(station);
|
Station *st = Station::Get(station);
|
||||||
if (!(st->had_vehicle_of_type & HVOT_TRAIN)) {
|
if (!(st->had_vehicle_of_type & HVOT_TRAIN)) {
|
||||||
st->had_vehicle_of_type |= HVOT_TRAIN;
|
st->had_vehicle_of_type |= HVOT_TRAIN;
|
||||||
SetDParam(0, st->index);
|
|
||||||
AddVehicleNewsItem(
|
AddVehicleNewsItem(
|
||||||
STR_NEWS_FIRST_TRAIN_ARRIVAL,
|
STR_NEWS_FIRST_TRAIN_ARRIVAL,
|
||||||
|
MakeParameters(st->index),
|
||||||
v->owner == _local_company ? NT_ARRIVAL_COMPANY : NT_ARRIVAL_OTHER,
|
v->owner == _local_company ? NT_ARRIVAL_COMPANY : NT_ARRIVAL_OTHER,
|
||||||
v->index,
|
v->index,
|
||||||
st->index
|
st->index
|
||||||
|
@ -3232,8 +3230,7 @@ static bool CheckTrainCollision(Train *v)
|
||||||
/* any dead -> no crash */
|
/* any dead -> no crash */
|
||||||
if (tcc.num == 0) return false;
|
if (tcc.num == 0) return false;
|
||||||
|
|
||||||
SetDParam(0, tcc.num);
|
AddTileNewsItem(STR_NEWS_TRAIN_CRASH, MakeParameters(tcc.num), NT_ACCIDENT, v->tile);
|
||||||
AddTileNewsItem(STR_NEWS_TRAIN_CRASH, NT_ACCIDENT, v->tile);
|
|
||||||
|
|
||||||
ModifyStationRatingAround(v->tile, v->owner, -160, 30);
|
ModifyStationRatingAround(v->tile, v->owner, -160, 30);
|
||||||
if (_settings_client.sound.disaster) SndPlayVehicleFx(SND_13_TRAIN_COLLISION, v);
|
if (_settings_client.sound.disaster) SndPlayVehicleFx(SND_13_TRAIN_COLLISION, v);
|
||||||
|
@ -3995,8 +3992,7 @@ static bool TrainLocoHandler(Train *v, bool mode)
|
||||||
if (HasBit(v->flags, VRF_TRAIN_STUCK) && v->wait_counter > 2 * _settings_game.pf.wait_for_pbs_path * Ticks::DAY_TICKS) {
|
if (HasBit(v->flags, VRF_TRAIN_STUCK) && v->wait_counter > 2 * _settings_game.pf.wait_for_pbs_path * Ticks::DAY_TICKS) {
|
||||||
/* Show message to player. */
|
/* Show message to player. */
|
||||||
if (_settings_client.gui.lost_vehicle_warn && v->owner == _local_company) {
|
if (_settings_client.gui.lost_vehicle_warn && v->owner == _local_company) {
|
||||||
SetDParam(0, v->index);
|
AddVehicleAdviceNewsItem(STR_NEWS_TRAIN_IS_STUCK, MakeParameters(v->index), v->index);
|
||||||
AddVehicleAdviceNewsItem(STR_NEWS_TRAIN_IS_STUCK, v->index);
|
|
||||||
}
|
}
|
||||||
v->wait_counter = 0;
|
v->wait_counter = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -324,9 +324,7 @@ void ShowNewGrfVehicleError(EngineID engine, StringID part1, StringID part2, GRF
|
||||||
|
|
||||||
if (!HasBit(grfconfig->grf_bugs, bug_type)) {
|
if (!HasBit(grfconfig->grf_bugs, bug_type)) {
|
||||||
SetBit(grfconfig->grf_bugs, bug_type);
|
SetBit(grfconfig->grf_bugs, bug_type);
|
||||||
SetDParamStr(0, grfconfig->GetName());
|
ShowErrorMessage(part1, part2, MakeParameters(grfconfig->GetName(), engine), WL_CRITICAL);
|
||||||
SetDParam(1, engine);
|
|
||||||
ShowErrorMessage(part1, part2, WL_CRITICAL);
|
|
||||||
if (!_networking) Command<CMD_PAUSE>::Do(DC_EXEC, critical ? PM_PAUSED_ERROR : PM_PAUSED_NORMAL, true);
|
if (!_networking) Command<CMD_PAUSE>::Do(DC_EXEC, critical ? PM_PAUSED_ERROR : PM_PAUSED_NORMAL, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -813,8 +811,7 @@ void Vehicle::HandlePathfindingResult(bool path_found)
|
||||||
/* Notify user about the event. */
|
/* Notify user about the event. */
|
||||||
AI::NewEvent(this->owner, new ScriptEventVehicleLost(this->index));
|
AI::NewEvent(this->owner, new ScriptEventVehicleLost(this->index));
|
||||||
if (_settings_client.gui.lost_vehicle_warn && this->owner == _local_company) {
|
if (_settings_client.gui.lost_vehicle_warn && this->owner == _local_company) {
|
||||||
SetDParam(0, this->index);
|
AddVehicleAdviceNewsItem(STR_NEWS_VEHICLE_IS_LOST, MakeParameters(this->index), this->index);
|
||||||
AddVehicleAdviceNewsItem(STR_NEWS_VEHICLE_IS_LOST, this->index);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1099,9 +1096,7 @@ void CallVehicleTicks()
|
||||||
message = STR_NEWS_VEHICLE_AUTORENEW_FAILED;
|
message = STR_NEWS_VEHICLE_AUTORENEW_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
SetDParam(0, v->index);
|
AddVehicleAdviceNewsItem(message, MakeParameters(v->index, error_message), v->index);
|
||||||
SetDParam(1, error_message);
|
|
||||||
AddVehicleAdviceNewsItem(message, v->index);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_company.Restore();
|
cur_company.Restore();
|
||||||
|
@ -1455,8 +1450,7 @@ void AgeVehicle(Vehicle *v)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SetDParam(0, v->index);
|
AddVehicleAdviceNewsItem(str, MakeParameters(v->index), v->index);
|
||||||
AddVehicleAdviceNewsItem(str, v->index);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1611,8 +1605,7 @@ void VehicleEnterDepot(Vehicle *v)
|
||||||
_vehicles_to_autoreplace[v] = false;
|
_vehicles_to_autoreplace[v] = false;
|
||||||
if (v->owner == _local_company) {
|
if (v->owner == _local_company) {
|
||||||
/* Notify the user that we stopped the vehicle */
|
/* Notify the user that we stopped the vehicle */
|
||||||
SetDParam(0, v->index);
|
AddVehicleAdviceNewsItem(STR_NEWS_ORDER_REFIT_FAILED, MakeParameters(v->index), v->index);
|
||||||
AddVehicleAdviceNewsItem(STR_NEWS_ORDER_REFIT_FAILED, v->index);
|
|
||||||
}
|
}
|
||||||
} else if (cost.GetCost() != 0) {
|
} else if (cost.GetCost() != 0) {
|
||||||
v->profit_this_year -= cost.GetCost() << 8;
|
v->profit_this_year -= cost.GetCost() << 8;
|
||||||
|
@ -1636,8 +1629,7 @@ void VehicleEnterDepot(Vehicle *v)
|
||||||
* we shouldn't construct it when the vehicle visits the next stop. */
|
* we shouldn't construct it when the vehicle visits the next stop. */
|
||||||
v->last_loading_station = INVALID_STATION;
|
v->last_loading_station = INVALID_STATION;
|
||||||
if (v->owner == _local_company) {
|
if (v->owner == _local_company) {
|
||||||
SetDParam(0, v->index);
|
AddVehicleAdviceNewsItem(STR_NEWS_TRAIN_IS_WAITING + v->type, MakeParameters(v->index), v->index);
|
||||||
AddVehicleAdviceNewsItem(STR_NEWS_TRAIN_IS_WAITING + v->type, v->index);
|
|
||||||
}
|
}
|
||||||
AI::NewEvent(v->owner, new ScriptEventVehicleWaitingInDepot(v->index));
|
AI::NewEvent(v->owner, new ScriptEventVehicleWaitingInDepot(v->index));
|
||||||
}
|
}
|
||||||
|
@ -2850,10 +2842,9 @@ static IntervalTimer<TimerGameEconomy> _economy_vehicles_yearly({TimerGameEconom
|
||||||
Money profit = v->GetDisplayProfitThisYear();
|
Money profit = v->GetDisplayProfitThisYear();
|
||||||
if (v->age >= 730 && profit < 0) {
|
if (v->age >= 730 && profit < 0) {
|
||||||
if (_settings_client.gui.vehicle_income_warn && v->owner == _local_company) {
|
if (_settings_client.gui.vehicle_income_warn && v->owner == _local_company) {
|
||||||
SetDParam(0, v->index);
|
|
||||||
SetDParam(1, profit);
|
|
||||||
AddVehicleAdviceNewsItem(
|
AddVehicleAdviceNewsItem(
|
||||||
TimerGameEconomy::UsingWallclockUnits() ? STR_NEWS_VEHICLE_UNPROFITABLE_PERIOD : STR_NEWS_VEHICLE_UNPROFITABLE_YEAR,
|
TimerGameEconomy::UsingWallclockUnits() ? STR_NEWS_VEHICLE_UNPROFITABLE_PERIOD : STR_NEWS_VEHICLE_UNPROFITABLE_YEAR,
|
||||||
|
MakeParameters(v->index, profit),
|
||||||
v->index);
|
v->index);
|
||||||
}
|
}
|
||||||
AI::NewEvent(v->owner, new ScriptEventVehicleUnprofitable(v->index));
|
AI::NewEvent(v->owner, new ScriptEventVehicleUnprofitable(v->index));
|
||||||
|
|
|
@ -2736,7 +2736,7 @@ struct VehicleDetailsWindow : Window {
|
||||||
} else {
|
} else {
|
||||||
tool_tip = widget == WID_VD_INCREASE_SERVICING_INTERVAL ? STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_DAYS : STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_DAYS;
|
tool_tip = widget == WID_VD_INCREASE_SERVICING_INTERVAL ? STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_DAYS : STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_DAYS;
|
||||||
}
|
}
|
||||||
GuiShowTooltips(this, tool_tip, close_cond);
|
GuiShowTooltips(this, tool_tip, close_cond, MakeParameters());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2899,7 +2899,8 @@ void CcStartStopVehicle(Commands, const CommandCost &result, VehicleID veh_id, b
|
||||||
|
|
||||||
StringID msg = (v->vehstatus & VS_STOPPED) ? STR_VEHICLE_COMMAND_STOPPED : STR_VEHICLE_COMMAND_STARTED;
|
StringID msg = (v->vehstatus & VS_STOPPED) ? STR_VEHICLE_COMMAND_STOPPED : STR_VEHICLE_COMMAND_STARTED;
|
||||||
Point pt = RemapCoords(v->x_pos, v->y_pos, v->z_pos);
|
Point pt = RemapCoords(v->x_pos, v->y_pos, v->z_pos);
|
||||||
AddTextEffect(msg, pt.x, pt.y, Ticks::DAY_TICKS, TE_RISING);
|
|
||||||
|
AddTextEffect(msg, MakeParameters(), pt.x, pt.y, Ticks::DAY_TICKS, TE_RISING);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -2699,12 +2699,12 @@ void UpdateTileSelection()
|
||||||
/**
|
/**
|
||||||
* Displays the measurement tooltips when selecting multiple tiles
|
* Displays the measurement tooltips when selecting multiple tiles
|
||||||
* @param str String to be displayed
|
* @param str String to be displayed
|
||||||
* @param paramcount number of params to deal with
|
* @param params Parameters of the string.
|
||||||
*/
|
*/
|
||||||
static inline void ShowMeasurementTooltips(StringID str, uint paramcount)
|
static inline void ShowMeasurementTooltips(StringID str, StringParameters &¶ms)
|
||||||
{
|
{
|
||||||
if (!_settings_client.gui.measure_tooltip) return;
|
if (!_settings_client.gui.measure_tooltip) return;
|
||||||
GuiShowTooltips(_thd.GetCallbackWnd(), str, TCC_EXIT_VIEWPORT, paramcount);
|
GuiShowTooltips(_thd.GetCallbackWnd(), str, TCC_EXIT_VIEWPORT, std::move(params));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void HideMeasurementTooltips()
|
static void HideMeasurementTooltips()
|
||||||
|
@ -2780,8 +2780,7 @@ void VpSetPresizeRange(TileIndex from, TileIndex to)
|
||||||
|
|
||||||
/* show measurement only if there is any length to speak of */
|
/* show measurement only if there is any length to speak of */
|
||||||
if (distance > 1) {
|
if (distance > 1) {
|
||||||
SetDParam(0, distance);
|
ShowMeasurementTooltips(STR_MEASURE_LENGTH, MakeParameters(distance));
|
||||||
ShowMeasurementTooltips(STR_MEASURE_LENGTH, 1);
|
|
||||||
} else {
|
} else {
|
||||||
HideMeasurementTooltips();
|
HideMeasurementTooltips();
|
||||||
}
|
}
|
||||||
|
@ -3168,7 +3167,8 @@ static void CalcRaildirsDrawstyle(int x, int y, int method)
|
||||||
TileIndex t0 = TileVirtXY(_thd.selstart.x, _thd.selstart.y);
|
TileIndex t0 = TileVirtXY(_thd.selstart.x, _thd.selstart.y);
|
||||||
TileIndex t1 = TileVirtXY(x, y);
|
TileIndex t1 = TileVirtXY(x, y);
|
||||||
uint distance = DistanceManhattan(t0, t1) + 1;
|
uint distance = DistanceManhattan(t0, t1) + 1;
|
||||||
byte index = 0;
|
auto params = MakeParameters(0, 0);
|
||||||
|
int index = 0;
|
||||||
|
|
||||||
if (distance != 1) {
|
if (distance != 1) {
|
||||||
int heightdiff = CalcHeightdiff(b, distance, t0, t1);
|
int heightdiff = CalcHeightdiff(b, distance, t0, t1);
|
||||||
|
@ -3179,11 +3179,11 @@ static void CalcRaildirsDrawstyle(int x, int y, int method)
|
||||||
distance = CeilDiv(distance, 2);
|
distance = CeilDiv(distance, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
SetDParam(index++, distance);
|
params.SetParam(index++, distance);
|
||||||
if (heightdiff != 0) SetDParam(index++, heightdiff);
|
if (heightdiff != 0) params.SetParam(index++, heightdiff);
|
||||||
}
|
}
|
||||||
|
|
||||||
ShowMeasurementTooltips(measure_strings_length[index], index);
|
ShowMeasurementTooltips(measure_strings_length[index], std::move(params));
|
||||||
}
|
}
|
||||||
|
|
||||||
_thd.selend.x = x;
|
_thd.selend.x = x;
|
||||||
|
@ -3264,6 +3264,7 @@ calc_heightdiff_single_direction:;
|
||||||
TileIndex t0 = TileVirtXY(sx, sy);
|
TileIndex t0 = TileVirtXY(sx, sy);
|
||||||
TileIndex t1 = TileVirtXY(x, y);
|
TileIndex t1 = TileVirtXY(x, y);
|
||||||
uint distance = DistanceManhattan(t0, t1) + 1;
|
uint distance = DistanceManhattan(t0, t1) + 1;
|
||||||
|
auto params = MakeParameters(0, 0);
|
||||||
byte index = 0;
|
byte index = 0;
|
||||||
|
|
||||||
if (distance != 1) {
|
if (distance != 1) {
|
||||||
|
@ -3274,11 +3275,11 @@ calc_heightdiff_single_direction:;
|
||||||
* new_style := (_thd.next_drawstyle & HT_RECT) ? HT_LINE | style : _thd.next_drawstyle; */
|
* new_style := (_thd.next_drawstyle & HT_RECT) ? HT_LINE | style : _thd.next_drawstyle; */
|
||||||
int heightdiff = CalcHeightdiff(HT_LINE | style, 0, t0, t1);
|
int heightdiff = CalcHeightdiff(HT_LINE | style, 0, t0, t1);
|
||||||
|
|
||||||
SetDParam(index++, distance);
|
params.SetParam(index++, distance);
|
||||||
if (heightdiff != 0) SetDParam(index++, heightdiff);
|
if (heightdiff != 0) params.SetParam(index++, heightdiff);
|
||||||
}
|
}
|
||||||
|
|
||||||
ShowMeasurementTooltips(measure_strings_length[index], index);
|
ShowMeasurementTooltips(measure_strings_length[index], std::move(params));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -3298,6 +3299,7 @@ calc_heightdiff_single_direction:;
|
||||||
TileIndex t1 = TileVirtXY(x, y);
|
TileIndex t1 = TileVirtXY(x, y);
|
||||||
uint dx = Delta(TileX(t0), TileX(t1)) + 1;
|
uint dx = Delta(TileX(t0), TileX(t1)) + 1;
|
||||||
uint dy = Delta(TileY(t0), TileY(t1)) + 1;
|
uint dy = Delta(TileY(t0), TileY(t1)) + 1;
|
||||||
|
auto params = MakeParameters(0, 0, 0);
|
||||||
byte index = 0;
|
byte index = 0;
|
||||||
|
|
||||||
/* If dragging an area (eg dynamite tool) and it is actually a single
|
/* If dragging an area (eg dynamite tool) and it is actually a single
|
||||||
|
@ -3343,12 +3345,12 @@ calc_heightdiff_single_direction:;
|
||||||
if (dx != 1 || dy != 1) {
|
if (dx != 1 || dy != 1) {
|
||||||
int heightdiff = CalcHeightdiff(style, 0, t0, t1);
|
int heightdiff = CalcHeightdiff(style, 0, t0, t1);
|
||||||
|
|
||||||
SetDParam(index++, dx - (style & HT_POINT ? 1 : 0));
|
params.SetParam(index++, dx - (style & HT_POINT ? 1 : 0));
|
||||||
SetDParam(index++, dy - (style & HT_POINT ? 1 : 0));
|
params.SetParam(index++, dy - (style & HT_POINT ? 1 : 0));
|
||||||
if (heightdiff != 0) SetDParam(index++, heightdiff);
|
if (heightdiff != 0) params.SetParam(index++, heightdiff);
|
||||||
}
|
}
|
||||||
|
|
||||||
ShowMeasurementTooltips(measure_strings_area[index], index);
|
ShowMeasurementTooltips(measure_strings_area[index], std::move(params));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -993,8 +993,7 @@ static void FloodVehicle(Vehicle *v)
|
||||||
|
|
||||||
AI::NewEvent(v->owner, new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_FLOODED));
|
AI::NewEvent(v->owner, new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_FLOODED));
|
||||||
Game::NewEvent(new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_FLOODED));
|
Game::NewEvent(new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_FLOODED));
|
||||||
SetDParam(0, pass);
|
AddTileNewsItem(STR_NEWS_DISASTER_FLOOD_VEHICLE, MakeParameters(pass), NT_ACCIDENT, v->tile);
|
||||||
AddTileNewsItem(STR_NEWS_DISASTER_FLOOD_VEHICLE, NT_ACCIDENT, v->tile);
|
|
||||||
CreateEffectVehicleRel(v, 4, 4, 8, EV_EXPLOSION_LARGE);
|
CreateEffectVehicleRel(v, 4, 4, 8, EV_EXPLOSION_LARGE);
|
||||||
if (_settings_client.sound.disaster) SndPlayVehicleFx(SND_12_EXPLOSION, v);
|
if (_settings_client.sound.disaster) SndPlayVehicleFx(SND_12_EXPLOSION, v);
|
||||||
}
|
}
|
||||||
|
|
|
@ -758,7 +758,7 @@ static void DispatchRightClickEvent(Window *w, int x, int y)
|
||||||
/* Right-click close is enabled, but excluding sticky windows. */
|
/* Right-click close is enabled, but excluding sticky windows. */
|
||||||
w->Close();
|
w->Close();
|
||||||
} else if (_settings_client.gui.hover_delay_ms == 0 && !w->OnTooltip(pt, wid->index, TCC_RIGHT_CLICK) && wid->tool_tip != 0) {
|
} else if (_settings_client.gui.hover_delay_ms == 0 && !w->OnTooltip(pt, wid->index, TCC_RIGHT_CLICK) && wid->tool_tip != 0) {
|
||||||
GuiShowTooltips(w, wid->tool_tip, TCC_RIGHT_CLICK);
|
GuiShowTooltips(w, wid->tool_tip, TCC_RIGHT_CLICK, MakeParameters());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -779,7 +779,7 @@ static void DispatchHoverEvent(Window *w, int x, int y)
|
||||||
|
|
||||||
/* Show the tooltip if there is any */
|
/* Show the tooltip if there is any */
|
||||||
if (!w->OnTooltip(pt, wid->index, TCC_HOVER) && wid->tool_tip != 0) {
|
if (!w->OnTooltip(pt, wid->index, TCC_HOVER) && wid->tool_tip != 0) {
|
||||||
GuiShowTooltips(w, wid->tool_tip, TCC_HOVER);
|
GuiShowTooltips(w, wid->tool_tip, TCC_HOVER, MakeParameters());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1014,7 +1014,7 @@ Wcls *AllocateWindowDescFront(WindowDesc *desc, int window_number, bool return_e
|
||||||
|
|
||||||
void RelocateAllWindows(int neww, int newh);
|
void RelocateAllWindows(int neww, int newh);
|
||||||
|
|
||||||
void GuiShowTooltips(Window *parent, StringID str, TooltipCloseCondition close_tooltip, uint paramcount = 0);
|
void GuiShowTooltips(Window *parent, StringID str, TooltipCloseCondition close_tooltip, class StringParameters &¶ms);
|
||||||
|
|
||||||
/* widget.cpp */
|
/* widget.cpp */
|
||||||
WidgetID GetWidgetFromPos(const Window *w, int x, int y);
|
WidgetID GetWidgetFromPos(const Window *w, int x, int y);
|
||||||
|
|
Loading…
Reference in New Issue