1
0
Fork 0
pull/10006/merge
dP 2024-01-30 18:50:14 +01:00 committed by GitHub
commit a976f46725
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
59 changed files with 570 additions and 390 deletions

View File

@ -229,7 +229,7 @@ struct AIConfigWindow : public Window {
case WID_AIC_LIST: { // Select a slot
this->selected_slot = (CompanyID)this->vscroll->GetScrolledRowFromWidget(pt.y, this, widget);
this->InvalidateData();
if (click_count > 1 && this->selected_slot != INVALID_COMPANY) ShowScriptListWindow((CompanyID)this->selected_slot, _ctrl_pressed);
if (click_count > 1 && this->selected_slot != INVALID_COMPANY) ShowScriptListWindow((CompanyID)this->selected_slot, _fn_pressed);
break;
}
@ -259,7 +259,7 @@ struct AIConfigWindow : public Window {
}
case WID_AIC_CHANGE: // choose other AI
ShowScriptListWindow((CompanyID)this->selected_slot, _ctrl_pressed);
ShowScriptListWindow((CompanyID)this->selected_slot, _fn_pressed);
break;
case WID_AIC_CONFIGURE: // change the settings for an AI

View File

@ -65,7 +65,7 @@ static void PlaceAirport(TileIndex tile)
byte airport_type = AirportClass::Get(_selected_airport_class)->GetSpec(_selected_airport_index)->GetIndex();
byte layout = _selected_airport_layout;
bool adjacent = _ctrl_pressed;
bool adjacent = _fn_pressed;
auto proc = [=](bool test, StationID to_join) -> bool {
if (test) {

View File

@ -582,7 +582,7 @@ public:
case WID_RV_TRAIN_WAGONREMOVE_TOGGLE: {
const Group *g = Group::GetIfValid(this->sel_group);
if (g != nullptr) {
Command<CMD_SET_GROUP_FLAG>::Post(this->sel_group, GroupFlags::GF_REPLACE_WAGON_REMOVAL, !HasBit(g->flags, GroupFlags::GF_REPLACE_WAGON_REMOVAL), _ctrl_pressed);
Command<CMD_SET_GROUP_FLAG>::Post(this->sel_group, GroupFlags::GF_REPLACE_WAGON_REMOVAL, !HasBit(g->flags, GroupFlags::GF_REPLACE_WAGON_REMOVAL), _fn_pressed);
} else {
// toggle renew_keep_length
Command<CMD_CHANGE_COMPANY_SETTING>::Post("company.renew_keep_length", Company::Get(_local_company)->settings.renew_keep_length ? 0 : 1);
@ -634,9 +634,9 @@ public:
if ((item.flags & EngineDisplayFlags::Shaded) == EngineDisplayFlags::None) e = item.engine_id;
}
/* If Ctrl is pressed on the left side and we don't have any engines of the selected type, stop autoreplacing.
/* If Fn modifier is pressed on the left side and we don't have any engines of the selected type, stop autoreplacing.
* This is most common when we have finished autoreplacing the engine and want to remove it from the list. */
if (click_side == 0 && _ctrl_pressed && e != INVALID_ENGINE &&
if (click_side == 0 && _fn_pressed && e != INVALID_ENGINE &&
(GetGroupNumEngines(_local_company, sel_group, e) == 0 || GetGroupNumEngines(_local_company, ALL_GROUP, e) == 0)) {
EngineID veh_from = e;
Command<CMD_SET_AUTOREPLACE>::Post(this->sel_group, veh_from, INVALID_ENGINE, false);

View File

@ -376,7 +376,7 @@ void ShowBuildBridgeWindow(TileIndex start, TileIndex end, TransportType transpo
case TRANSPORT_RAIL: last_bridge_type = _last_railbridge_type; break;
default: break; // water ways and air routes don't have bridge types
}
if (_ctrl_pressed && CheckBridgeAvailability(last_bridge_type, bridge_len).Succeeded()) {
if (_fn_pressed && CheckBridgeAvailability(last_bridge_type, bridge_len).Succeeded()) {
Command<CMD_BUILD_BRIDGE>::Post(STR_ERROR_CAN_T_BUILD_BRIDGE_HERE, CcBuildBridge, end, start, transport_type, last_bridge_type, road_rail_type);
return;
}

View File

@ -1620,7 +1620,7 @@ struct BuildVehicleWindow : Window {
}
this->SelectEngine(e);
this->SetDirty();
if (_ctrl_pressed) {
if (_fn_pressed) {
this->OnClick(pt, WID_BV_SHOW_HIDE, 1);
} else if (click_count > 1 && !this->listview_mode) {
this->OnClick(pt, WID_BV_BUILD, 1);

View File

@ -226,7 +226,7 @@ std::tuple<bool, bool, bool> CommandHelperBase::InternalPostBefore(Commands cmd,
* However, in case of incoming network commands,
* map generation or the pause button we do want
* to execute. */
bool estimate_only = _shift_pressed && IsLocalCompany() && !_generating_world && !network_command && !(flags & CMD_NO_EST);
bool estimate_only = _estimate_pressed && IsLocalCompany() && !_generating_world && !network_command && !(flags & CMD_NO_EST);
/* We're only sending the command, so don't do
* fancy things for 'success'. */

View File

@ -497,11 +497,11 @@ struct CompanyFinancesWindow : Window {
break;
case WID_CF_INCREASE_LOAN: // increase loan
Command<CMD_INCREASE_LOAN>::Post(STR_ERROR_CAN_T_BORROW_ANY_MORE_MONEY, _ctrl_pressed ? LoanCommand::Max : LoanCommand::Interval, 0);
Command<CMD_INCREASE_LOAN>::Post(STR_ERROR_CAN_T_BORROW_ANY_MORE_MONEY, _fn_pressed ? LoanCommand::Max : LoanCommand::Interval, 0);
break;
case WID_CF_REPAY_LOAN: // repay loan
Command<CMD_DECREASE_LOAN>::Post(STR_ERROR_CAN_T_REPAY_LOAN, _ctrl_pressed ? LoanCommand::Max : LoanCommand::Interval, 0);
Command<CMD_DECREASE_LOAN>::Post(STR_ERROR_CAN_T_REPAY_LOAN, _fn_pressed ? LoanCommand::Max : LoanCommand::Interval, 0);
break;
case WID_CF_INFRASTRUCTURE: // show infrastructure details
@ -1017,7 +1017,7 @@ public:
}
assert(j < LS_END);
if (_ctrl_pressed) {
if (_fn_pressed) {
ToggleBit(this->sel, j);
} else {
this->sel = 1 << j;
@ -1048,7 +1048,7 @@ public:
/* Set company colour livery */
for (LiveryScheme scheme = LS_DEFAULT; scheme < LS_END; scheme++) {
/* Changed colour for the selected scheme, or all visible schemes if CTRL is pressed. */
if (HasBit(this->sel, scheme) || (_ctrl_pressed && _livery_class[scheme] == this->livery_class && HasBit(_loaded_newgrf_features.used_liveries, scheme))) {
if (HasBit(this->sel, scheme) || (_fn_pressed && _livery_class[scheme] == this->livery_class && HasBit(_loaded_newgrf_features.used_liveries, scheme))) {
Command<CMD_SET_COMPANY_COLOUR>::Post(scheme, widget == WID_SCL_PRI_COL_DROPDOWN, colour);
}
}
@ -2510,7 +2510,7 @@ struct CompanyWindow : Window
case WID_C_VIEW_HQ: {
TileIndex tile = Company::Get((CompanyID)this->window_number)->location_of_HQ;
if (_ctrl_pressed) {
if (_fn_pressed) {
ShowExtraViewportWindow(tile);
} else {
ScrollMainWindowToTile(tile);
@ -2585,7 +2585,7 @@ struct CompanyWindow : Window
void OnPlaceObject([[maybe_unused]] Point pt, TileIndex tile) override
{
if (Command<CMD_BUILD_OBJECT>::Post(STR_ERROR_CAN_T_BUILD_COMPANY_HEADQUARTERS, tile, OBJECT_HQ, 0) && !_shift_pressed) {
if (Command<CMD_BUILD_OBJECT>::Post(STR_ERROR_CAN_T_BUILD_COMPANY_HEADQUARTERS, tile, OBJECT_HQ, 0) && !_estimate_pressed) {
ResetObjectToPlace();
this->RaiseButtons();
}

View File

@ -144,7 +144,7 @@ static void TrainDepotMoveVehicle(const Vehicle *wagon, VehicleID sel, const Veh
if (wagon == v) return;
Command<CMD_MOVE_RAIL_VEHICLE>::Post(STR_ERROR_CAN_T_MOVE_VEHICLE, v->tile, v->index, wagon == nullptr ? INVALID_VEHICLE : wagon->index, _ctrl_pressed);
Command<CMD_MOVE_RAIL_VEHICLE>::Post(STR_ERROR_CAN_T_MOVE_VEHICLE, v->tile, v->index, wagon == nullptr ? INVALID_VEHICLE : wagon->index, _fn_pressed);
}
static VehicleCellSize _base_block_sizes_depot[VEH_COMPANY_END]; ///< Cell size for vehicle images in the depot view.
@ -560,7 +560,7 @@ struct DepotWindow : Window {
} else if (v != nullptr) {
SetObjectToPlaceWnd(SPR_CURSOR_MOUSE, PAL_NONE, HT_DRAG, this);
SetMouseCursorVehicle(v, EIT_IN_DEPOT);
_cursor.vehchain = _ctrl_pressed;
_cursor.vehchain = _fn_pressed;
this->sel = v->index;
this->SetDirty();
@ -786,7 +786,7 @@ struct DepotWindow : Window {
break;
case WID_D_LOCATION:
if (_ctrl_pressed) {
if (_fn_pressed) {
ShowExtraViewportWindow(this->window_number);
} else {
ScrollMainWindowToTile(this->window_number);
@ -854,7 +854,7 @@ struct DepotWindow : Window {
CargoArray capacity{}, loaded{};
/* Display info for single (articulated) vehicle, or for whole chain starting with selected vehicle */
bool whole_chain = (this->type == VEH_TRAIN && _ctrl_pressed);
bool whole_chain = (this->type == VEH_TRAIN && _fn_pressed);
/* loop through vehicle chain and collect cargoes */
uint num = 0;
@ -900,7 +900,7 @@ struct DepotWindow : Window {
*/
bool OnVehicleSelect(const Vehicle *v) override
{
if (_ctrl_pressed) {
if (_fn_pressed) {
/* Share-clone, do not open new viewport, and keep tool active */
Command<CMD_CLONE_VEHICLE>::Post(STR_ERROR_CAN_T_BUY_TRAIN + v->type, this->window_number, v->index, true);
} else {
@ -921,8 +921,8 @@ struct DepotWindow : Window {
*/
bool OnVehicleSelect(VehicleList::const_iterator begin, VehicleList::const_iterator end) override
{
if (!_ctrl_pressed) {
/* If CTRL is not pressed: If all the vehicles in this list have the same orders, then copy orders */
if (!_fn_pressed) {
/* If Fn is not pressed: If all the vehicles in this list have the same orders, then copy orders */
if (AllEqual(begin, end, [](const Vehicle *v1, const Vehicle *v2) {
return VehiclesHaveSameEngineList(v1, v2);
})) {
@ -937,7 +937,7 @@ struct DepotWindow : Window {
ShowErrorMessage(STR_ERROR_CAN_T_BUY_TRAIN + (*begin)->type, STR_ERROR_CAN_T_CLONE_VEHICLE_LIST, WL_INFO);
}
} else {
/* If CTRL is pressed: If all the vehicles in this list share orders, then copy orders */
/* If Fn is pressed: If all the vehicles in this list share orders, then copy orders */
if (AllEqual(begin, end, [](const Vehicle *v1, const Vehicle *v2) {
return VehiclesHaveSameEngineList(v1, v2);
})) {
@ -1039,7 +1039,7 @@ struct DepotWindow : Window {
GetDepotVehiclePtData gdvp = { nullptr, nullptr };
if (this->GetVehicleFromDepotWndPt(pt.x, pt.y, &v, &gdvp) == MODE_DRAG_VEHICLE && sel != INVALID_VEHICLE) {
if (gdvp.wagon != nullptr && gdvp.wagon->index == sel && _ctrl_pressed) {
if (gdvp.wagon != nullptr && gdvp.wagon->index == sel && _fn_pressed) {
Command<CMD_REVERSE_TRAIN_DIRECTION>::Post(STR_ERROR_CAN_T_REVERSE_DIRECTION_RAIL_VEHICLE, Vehicle::Get(sel)->tile, Vehicle::Get(sel)->index, true);
} else if (gdvp.wagon == nullptr || gdvp.wagon->index != sel) {
this->vehicle_over = INVALID_VEHICLE;
@ -1064,7 +1064,7 @@ struct DepotWindow : Window {
this->sel = INVALID_VEHICLE;
this->SetDirty();
bool sell_cmd = (v->type == VEH_TRAIN && (widget == WID_D_SELL_CHAIN || _ctrl_pressed));
bool sell_cmd = (v->type == VEH_TRAIN && (widget == WID_D_SELL_CHAIN || _fn_pressed));
Command<CMD_SELL_VEHICLE>::Post(GetCmdSellVehMsg(v->type), v->tile, v->index, sell_cmd, true, INVALID_CLIENT_ID);
break;
}
@ -1101,10 +1101,10 @@ struct DepotWindow : Window {
}
}
EventState OnCTRLStateChange() override
EventState OnFnStateChange() override
{
if (this->sel != INVALID_VEHICLE) {
_cursor.vehchain = _ctrl_pressed;
_cursor.vehchain = _fn_pressed;
this->SetWidgetDirty(WID_D_MATRIX);
return ES_HANDLED;
}

View File

@ -213,7 +213,7 @@ struct BuildDocksToolbarWindow : Window {
DiagDirection dir = GetInclinedSlopeDirection(GetTileSlope(tile));
TileIndex tile_to = (dir != INVALID_DIAGDIR ? TileAddByDiagDir(tile, ReverseDiagDir(dir)) : tile);
bool adjacent = _ctrl_pressed;
bool adjacent = _fn_pressed;
auto proc = [=](bool test, StationID to_join) -> bool {
if (test) {
return Command<CMD_BUILD_DOCK>::Do(CommandFlagsToDCFlags(GetCommandFlags<CMD_BUILD_DOCK>()), tile, INVALID_STATION, adjacent).Succeeded();
@ -255,10 +255,10 @@ struct BuildDocksToolbarWindow : Window {
GUIPlaceProcDragXY(select_proc, start_tile, end_tile);
break;
case DDSP_CREATE_WATER:
Command<CMD_BUILD_CANAL>::Post(STR_ERROR_CAN_T_BUILD_CANALS, CcPlaySound_CONSTRUCTION_WATER, end_tile, start_tile, (_game_mode == GM_EDITOR && _ctrl_pressed) ? WATER_CLASS_SEA : WATER_CLASS_CANAL, false);
Command<CMD_BUILD_CANAL>::Post(STR_ERROR_CAN_T_BUILD_CANALS, CcPlaySound_CONSTRUCTION_WATER, end_tile, start_tile, (_game_mode == GM_EDITOR && _fn_pressed) ? WATER_CLASS_SEA : WATER_CLASS_CANAL, false);
break;
case DDSP_CREATE_RIVER:
Command<CMD_BUILD_CANAL>::Post(STR_ERROR_CAN_T_PLACE_RIVERS, CcPlaySound_CONSTRUCTION_WATER, end_tile, start_tile, WATER_CLASS_RIVER, _ctrl_pressed);
Command<CMD_BUILD_CANAL>::Post(STR_ERROR_CAN_T_PLACE_RIVERS, CcPlaySound_CONSTRUCTION_WATER, end_tile, start_tile, WATER_CLASS_RIVER, _fn_pressed);
break;
default: break;

View File

@ -130,7 +130,7 @@ struct EnginePreviewWindow : Window {
Command<CMD_WANT_ENGINE_PREVIEW>::Post(this->window_number);
FALLTHROUGH;
case WID_EP_NO:
if (!_shift_pressed) this->Close();
if (!_estimate_pressed) this->Close();
break;
}
}

View File

@ -255,12 +255,12 @@ struct GSConfigWindow : public Window {
switch (widget) {
case WID_GSC_GSLIST: {
this->InvalidateData();
if (click_count > 1 && _game_mode != GM_NORMAL) ShowScriptListWindow((CompanyID)OWNER_DEITY, _ctrl_pressed);
if (click_count > 1 && _game_mode != GM_NORMAL) ShowScriptListWindow((CompanyID)OWNER_DEITY, _fn_pressed);
break;
}
case WID_GSC_CHANGE: // choose other Game Script
ShowScriptListWindow((CompanyID)OWNER_DEITY, _ctrl_pressed);
ShowScriptListWindow((CompanyID)OWNER_DEITY, _fn_pressed);
break;
case WID_GSC_CONTENT_DOWNLOAD:

View File

@ -34,8 +34,10 @@ byte _dirkeys; ///< 1 = left, 2 = up, 4 = right, 8 = down
bool _fullscreen;
byte _support8bpp;
CursorVars _cursor;
bool _ctrl_pressed; ///< Is Ctrl pressed?
bool _shift_pressed; ///< Is Shift pressed?
bool _fn_pressed; ///< Is function modifier pressed?
bool _remove_pressed; ///< Is remove modifier pressed?
bool _estimate_pressed; ///< Is estimate modifier pressed?
uint16_t _game_speed = 100; ///< Current game-speed; 100 is 1x, 0 is infinite.
bool _left_button_down; ///< Is left mouse button pressed?
bool _left_button_clicked; ///< Is left mouse button clicked?

View File

@ -52,8 +52,10 @@ extern byte _dirkeys; ///< 1 = left, 2 = up, 4 = right, 8 = down
extern bool _fullscreen;
extern byte _support8bpp;
extern CursorVars _cursor;
extern bool _ctrl_pressed; ///< Is Ctrl pressed?
extern bool _shift_pressed; ///< Is Shift pressed?
extern bool _fn_pressed; ///< Is function modifier pressed?
extern bool _remove_pressed; ///< Is remove modifier pressed?
extern bool _estimate_pressed; ///< Is esitame modifier pressed?
extern uint16_t _game_speed;
extern bool _left_button_down;
@ -71,7 +73,7 @@ extern Palette _cur_palette; ///< Current palette
void HandleToolbarHotkey(int hotkey);
void HandleKeypress(uint keycode, char32_t key);
void HandleTextInput(const char *str, bool marked = false, const char *caret = nullptr, const char *insert_location = nullptr, const char *replacement_end = nullptr);
void HandleCtrlChanged();
void HandleModifierKeys(bool shift_pressed, bool ctrl_pressed, bool alt_pressed);
void HandleMouseEvents();
void UpdateWindows();
void ChangeGameSpeed(bool enable_fast_forward);

View File

@ -351,4 +351,11 @@ enum StringAlignment {
};
DECLARE_ENUM_AS_BIT_SET(StringAlignment)
enum ModifierKey : byte {
None = 0, ///< No key configured
Shift = 1, ///< Shift key
Ctrl = 2, ///< Ctrl key
Alt = 3, ///< Alt key
};
#endif /* GFX_TYPE_H */

View File

@ -143,7 +143,7 @@ struct GoalListWindow : public Window {
default: NOT_REACHED();
}
if (_ctrl_pressed) {
if (_fn_pressed) {
ShowExtraViewportWindow(xy);
} else {
ScrollMainWindowToTile(xy);

View File

@ -757,12 +757,12 @@ public:
NOT_REACHED();
}
if (v) {
if (_ctrl_pressed && this->grouping == GB_SHARED_ORDERS) {
if (_fn_pressed && this->grouping == GB_SHARED_ORDERS) {
ShowOrdersWindow(v);
} else {
this->vehicle_sel = v->index;
if (_ctrl_pressed && this->grouping == GB_NONE) {
if (_fn_pressed && this->grouping == GB_NONE) {
/*
* It only makes sense to select a group if not using shared orders
* since two vehicles sharing orders can be from different groups.
@ -818,7 +818,7 @@ public:
case WID_GL_REPLACE_PROTECTION: {
const Group *g = Group::GetIfValid(this->vli.index);
if (g != nullptr) {
Command<CMD_SET_GROUP_FLAG>::Post(this->vli.index, GroupFlags::GF_REPLACE_PROTECTION, !HasBit(g->flags, GroupFlags::GF_REPLACE_PROTECTION), _ctrl_pressed);
Command<CMD_SET_GROUP_FLAG>::Post(this->vli.index, GroupFlags::GF_REPLACE_PROTECTION, !HasBit(g->flags, GroupFlags::GF_REPLACE_PROTECTION), _fn_pressed);
}
break;
}
@ -861,7 +861,7 @@ public:
{
switch (widget) {
case WID_GL_DEFAULT_VEHICLES: // Ungrouped vehicles
Command<CMD_ADD_VEHICLE_GROUP>::Post(STR_ERROR_GROUP_CAN_T_ADD_VEHICLE, DEFAULT_GROUP, this->vehicle_sel, _ctrl_pressed || this->grouping == GB_SHARED_ORDERS, VehicleListIdentifier{});
Command<CMD_ADD_VEHICLE_GROUP>::Post(STR_ERROR_GROUP_CAN_T_ADD_VEHICLE, DEFAULT_GROUP, this->vehicle_sel, _fn_pressed || this->grouping == GB_SHARED_ORDERS, VehicleListIdentifier{});
this->vehicle_sel = INVALID_VEHICLE;
this->group_over = INVALID_GROUP;
@ -878,7 +878,7 @@ public:
auto it = this->group_sb->GetScrolledItemFromWidget(this->groups, pt.y, this, WID_GL_LIST_GROUP);
GroupID new_g = it == this->groups.end() ? NEW_GROUP : (*it)->index;
Command<CMD_ADD_VEHICLE_GROUP>::Post(STR_ERROR_GROUP_CAN_T_ADD_VEHICLE, new_g == NEW_GROUP ? CcAddVehicleNewGroup : nullptr, new_g, vindex, _ctrl_pressed || this->grouping == GB_SHARED_ORDERS, VehicleListIdentifier{});
Command<CMD_ADD_VEHICLE_GROUP>::Post(STR_ERROR_GROUP_CAN_T_ADD_VEHICLE, new_g == NEW_GROUP ? CcAddVehicleNewGroup : nullptr, new_g, vindex, _fn_pressed || this->grouping == GB_SHARED_ORDERS, VehicleListIdentifier{});
break;
}

View File

@ -1080,7 +1080,7 @@ public:
case WID_IV_GOTO: {
Industry *i = Industry::Get(this->window_number);
if (_ctrl_pressed) {
if (_fn_pressed) {
ShowExtraViewportWindow(i->location.GetCenterTile());
} else {
ScrollMainWindowToTile(i->location.GetCenterTile());
@ -1778,7 +1778,7 @@ public:
case WID_ID_INDUSTRY_LIST: {
auto it = this->vscroll->GetScrolledItemFromWidget(this->industries, pt.y, this, WID_ID_INDUSTRY_LIST, WidgetDimensions::scaled.framerect.top);
if (it != this->industries.end()) {
if (_ctrl_pressed) {
if (_fn_pressed) {
ShowExtraViewportWindow((*it)->location.tile);
} else {
ScrollMainWindowToTile((*it)->location.tile);

View File

@ -333,7 +333,7 @@ struct SelectGameWindow : public Window {
switch (widget) {
case WID_SGI_GENERATE_GAME:
if (_ctrl_pressed) {
if (_fn_pressed) {
StartNewGameWithoutGUI(GENERATE_NEW_SEED);
} else {
ShowGenerateLandscape();

View File

@ -284,13 +284,13 @@ STR_TOOLTIP_CLOSE_WINDOW :{BLACK}Close wi
STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS :{BLACK}Window title - drag this to move window
STR_TOOLTIP_SHADE :{BLACK}Shade window - only show the title bar
STR_TOOLTIP_DEBUG :{BLACK}Show NewGRF debug information
STR_TOOLTIP_DEFSIZE :{BLACK}Resize window to default size. Ctrl+Click to store current size as default
STR_TOOLTIP_STICKY :{BLACK}Mark this window as uncloseable by the 'Close All Windows' key. Ctrl+Click to also save state as default
STR_TOOLTIP_DEFSIZE :{BLACK}Resize window to default size. {FN_KEY}+Click to store current size as default
STR_TOOLTIP_STICKY :{BLACK}Mark this window as uncloseable by the 'Close All Windows' key. {FN_KEY}+Click to also save state as default
STR_TOOLTIP_RESIZE :{BLACK}Click and drag to resize this window
STR_TOOLTIP_TOGGLE_LARGE_SMALL_WINDOW :{BLACK}Toggle large/small window size
STR_TOOLTIP_VSCROLL_BAR_SCROLLS_LIST :{BLACK}Scroll bar - scrolls list up/down
STR_TOOLTIP_HSCROLL_BAR_SCROLLS_LIST :{BLACK}Scroll bar - scrolls list left/right
STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}Demolish buildings etc. on a square of land. Ctrl+Click+Drag to select the area diagonally. Also press Shift to show cost estimate only
STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}Demolish buildings etc. on a square of land. {FN_KEY}+Click+Drag to select the area diagonally. Also press {ESTIMATE_KEY} to show cost estimate only
# Show engines button
###length VEHICLE_TYPES
@ -315,6 +315,13 @@ STR_WARNING_PASSWORD_SECURITY :{YELLOW}Warning
STR_OSK_KEYBOARD_LAYOUT :`1234567890-=\qwertyuiop[]asdfghjkl;' zxcvbnm,./ .
STR_OSK_KEYBOARD_LAYOUT_CAPS :~!@#$%^&*()_+|QWERTYUIOP{{}}ASDFGHJKL:" ZXCVBNM<>? .
# Modifier key names, must follow order of ModifierKey enum
###length 4
STR_MODIFIER_KEY_UNASSIGNED :{PUSH_COLOUR}{RED}Unassigned{POP_COLOUR}
STR_MODIFIER_KEY_SHIFT :Shift
STR_MODIFIER_KEY_CTRL :Ctrl
STR_MODIFIER_KEY_ALT :Alt
# Measurement tooltip
STR_MEASURE_LENGTH :{BLACK}Length: {NUM}
STR_MEASURE_AREA :{BLACK}Area: {NUM} x {NUM}
@ -395,10 +402,10 @@ STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}Open goa
STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Open company graphs and cargo payment rates
STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Open company league table
STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Open industry directory, industry chain, or fund construction of a new industry
STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}Open list of company's trains. Ctrl+Click to show or hide vehicle groups, opposite of the chosen setting
STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}Open list of company's road vehicles. Ctrl+Click to show or hide vehicle groups, opposite of the chosen setting
STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}Open list of company's ships. Ctrl+Click to show or hide vehicle groups, opposite of the chosen setting
STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT :{BLACK}Open list of company's aircraft. Ctrl+Click to show or hide vehicle groups, opposite of the chosen setting
STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}Open list of company's trains. {FN_KEY}+Click to show or hide vehicle groups, opposite of the chosen setting
STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}Open list of company's road vehicles. {FN_KEY}+Click to show or hide vehicle groups, opposite of the chosen setting
STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}Open list of company's ships. {FN_KEY}+Click to show or hide vehicle groups, opposite of the chosen setting
STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT :{BLACK}Open list of company's aircraft. {FN_KEY}+Click to show or hide vehicle groups, opposite of the chosen setting
STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN :{BLACK}Zoom in
STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}Zoom out
STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Build railway infrastructure
@ -425,9 +432,9 @@ STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Build or
STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Build or generate industries
STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Build road infrastructure
STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Build tramway infrastructure
STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Plant trees. Ctrl+Click+Drag to select the area diagonally. Also press Shift to show cost estimate only
STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Plant trees. {FN_KEY}+Click+Drag to select the area diagonally. Also press {ESTIMATE_KEY} to show cost estimate only
STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Place sign
STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Place object. Ctrl+Click+Drag to select the area diagonally. Also press Shift to show cost estimate only
STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Place object. {FN_KEY}+Click+Drag to select the area diagonally. Also press {ESTIMATE_KEY} to show cost estimate only
# Scenario editor file menu
###length 7
@ -775,9 +782,9 @@ STR_SMALLMAP_TOOLTIP_SHOW_LINK_STATS_ON_MAP :{BLACK}Show car
STR_SMALLMAP_TOOLTIP_SHOW_TRANSPORT_ROUTES_ON :{BLACK}Show transport routes on map
STR_SMALLMAP_TOOLTIP_SHOW_VEGETATION_ON_MAP :{BLACK}Show vegetation on map
STR_SMALLMAP_TOOLTIP_SHOW_LAND_OWNERS_ON_MAP :{BLACK}Show land owners on map
STR_SMALLMAP_TOOLTIP_INDUSTRY_SELECTION :{BLACK}Click on an industry type to toggle displaying it. Ctrl+Click disables all types except the selected one. Ctrl+Click on it again to enable all industry types
STR_SMALLMAP_TOOLTIP_COMPANY_SELECTION :{BLACK}Click on a company to toggle displaying its property. Ctrl+Click disables all companies except the selected one. Ctrl+Click on it again to enable all companies
STR_SMALLMAP_TOOLTIP_CARGO_SELECTION :{BLACK}Click on a cargo to toggle displaying its property. Ctrl+Click disables all cargoes except the selected one. Ctrl+Click on it again to enable all cargoes
STR_SMALLMAP_TOOLTIP_INDUSTRY_SELECTION :{BLACK}Click on an industry type to toggle displaying it. {FN_KEY}+Click disables all types except the selected one. {FN_KEY}+Click on it again to enable all industry types
STR_SMALLMAP_TOOLTIP_COMPANY_SELECTION :{BLACK}Click on a company to toggle displaying its property. {FN_KEY}+Click disables all companies except the selected one. {FN_KEY}+Click on it again to enable all companies
STR_SMALLMAP_TOOLTIP_CARGO_SELECTION :{BLACK}Click on a cargo to toggle displaying its property. {FN_KEY}+Click disables all cargoes except the selected one. {FN_KEY}+Click on it again to enable all cargoes
STR_SMALLMAP_LEGENDA_ROADS :{TINY_FONT}{BLACK}Roads
STR_SMALLMAP_LEGENDA_RAILROADS :{TINY_FONT}{BLACK}Railways
@ -1062,7 +1069,7 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Check th
STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Current driver: {RAW_STRING}
STR_GAME_OPTIONS_GUI_SCALE_FRAME :{BLACK}Interface size
STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Drag slider to set interface size. Ctrl+Drag for continuous adjustment
STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Drag slider to set interface size. {FN_KEY}+Drag for continuous adjustment
STR_GAME_OPTIONS_GUI_SCALE_AUTO :{BLACK}Auto-detect size
STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}Check this box to detect interface size automatically
@ -1375,7 +1382,7 @@ STR_CONFIG_SETTING_FORBID_90_DEG :Forbid trains f
STR_CONFIG_SETTING_FORBID_90_DEG_HELPTEXT :90 degree turns occur when a horizontal track is directly followed by a vertical track piece on the adjacent tile, thus making the train turn by 90 degree when traversing the tile edge instead of the usual 45 degrees for other track combinations.
STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS :Allow to join stations not directly adjacent: {STRING2}
STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT :Allow adding parts to a station without directly touching the existing parts, by Ctrl+Clicking while placing the new parts
STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT :Allow adding parts to a station without directly touching the existing parts, by {FN_KEY}+Clicking while placing the new parts
STR_CONFIG_SETTING_INFLATION :Inflation: {STRING2}
STR_CONFIG_SETTING_INFLATION_HELPTEXT :Enable inflation in the economy, where costs are slightly faster rising than payments
@ -1766,6 +1773,18 @@ STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_VAL :{NUM}% normal g
###setting-zero-is-special
STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_ZERO :No limit (as fast as your computer allows)
STR_CONFIG_SETTING_MODIFIER_FN :Function modifier key: {STRING2}
STR_CONFIG_SETTING_MODIFIER_FN_HELPTEXT :Modifier key for accessing additional functions.
STR_CONFIG_SETTING_MODIFIER_REMOVE :Remove modifier key: {STRING2}
STR_CONFIG_SETTING_MODIFIER_REMOVE_HELPTEXT :Modifier key for removal mode on building tools.
STR_CONFIG_SETTING_MODIFIER_ESTIMATE :Estimate modifier key: {STRING2}
STR_CONFIG_SETTING_MODIFIER_ESTIMATE_HELPTEXT :Modifier key for estimating action cost.
STR_CONFIG_SETTING_MODIFIER_NONE :None
STR_CONFIG_SETTING_MODIFIER_SHIFT :Shift
STR_CONFIG_SETTING_MODIFIER_CTRL :Ctrl
STR_CONFIG_SETTING_MODIFIER_ALT :Alt
STR_CONFIG_SETTING_MODIFIER_ALREADY_IN_USE :{WHITE}This modifier key is already in use.
STR_CONFIG_SETTING_SOUND_TICKER :News ticker: {STRING2}
STR_CONFIG_SETTING_SOUND_TICKER_HELPTEXT :Play sound for summarised news messages
@ -1938,13 +1957,13 @@ STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :When dragging,
STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Set the distance at which signals will be built on a track up to the next obstacle (signal, junction), if signals are dragged
STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} tile{P 0 "" s}
STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :When dragging, keep fixed distance between signals: {STRING2}
STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Select the behaviour of signal placement when Ctrl+dragging signals. If disabled, signals are placed around tunnels or bridges to avoid long stretches without signals. If enabled, signals are placed every n tiles, making alignment of signals at parallel tracks easier
STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Select the behaviour of signal placement when {FN_KEY}+dragging signals. If disabled, signals are placed around tunnels or bridges to avoid long stretches without signals. If enabled, signals are placed every n tiles, making alignment of signals at parallel tracks easier
STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Automatically build semaphores before: {STRING2}
STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Set the year when electric signals will be used for tracks. Before this year, non-electric signals will be used (which have the exact same function, but different looks)
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Cycle through signal types: {STRING2}
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Select which signal types to cycle through when Ctrl+Clicking on a built signal with the signal tool
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Select which signal types to cycle through when {FN_KEY}+Clicking on a built signal with the signal tool
###length 2
STR_CONFIG_SETTING_CYCLE_SIGNAL_PBS :Path signals only
STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :All visible
@ -2205,7 +2224,7 @@ STR_INTRO_AI_SETTINGS :{BLACK}AI Setti
STR_INTRO_GAMESCRIPT_SETTINGS :{BLACK}Game Script Settings
STR_INTRO_QUIT :{BLACK}Exit
STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Start a new game. Ctrl+Click skips map configuration
STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Start a new game. {FN_KEY}+Click skips map configuration
STR_INTRO_TOOLTIP_LOAD_GAME :{BLACK}Load a saved game
STR_INTRO_TOOLTIP_PLAY_HEIGHTMAP :{BLACK}Start a new game, using a heightmap as landscape
STR_INTRO_TOOLTIP_PLAY_SCENARIO :{BLACK}Start a new game, using a customised scenario
@ -2280,9 +2299,9 @@ STR_LIVERY_TRAIN_GROUP_TOOLTIP :{BLACK}Show col
STR_LIVERY_ROAD_VEHICLE_GROUP_TOOLTIP :{BLACK}Show colours of road vehicle groups
STR_LIVERY_SHIP_GROUP_TOOLTIP :{BLACK}Show colours of ship groups
STR_LIVERY_AIRCRAFT_GROUP_TOOLTIP :{BLACK}Show colours of aircraft groups
STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Choose the primary colour for the selected scheme. Ctrl+Click to set this colour for every scheme
STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Choose the secondary colour for the selected scheme. Ctrl+Click to set this colour for every scheme
STR_LIVERY_PANEL_TOOLTIP :{BLACK}Select a colour scheme to change, or multiple schemes with Ctrl+Click. Click on the box to toggle use of the scheme
STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Choose the primary colour for the selected scheme. {FN_KEY}+Click to set this colour for every scheme
STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Choose the secondary colour for the selected scheme. {FN_KEY}+Click to set this colour for every scheme
STR_LIVERY_PANEL_TOOLTIP :{BLACK}Select a colour scheme to change, or multiple schemes with {FN_KEY}+Click. Click on the box to toggle use of the scheme
STR_LIVERY_TRAIN_GROUP_EMPTY :No train groups are set up
STR_LIVERY_ROAD_VEHICLE_GROUP_EMPTY :No road vehicle groups are set up
STR_LIVERY_SHIP_GROUP_EMPTY :No ship groups are set up
@ -2742,15 +2761,15 @@ STR_MISSING_GRAPHICS_ERROR_QUIT :{BLACK}Exit Ope
# Transparency settings window
STR_TRANSPARENCY_CAPTION :{WHITE}Transparency Options
STR_TRANSPARENT_SIGNS_TOOLTIP :{BLACK}Toggle transparency for signs. Ctrl+Click to lock
STR_TRANSPARENT_TREES_TOOLTIP :{BLACK}Toggle transparency for trees. Ctrl+Click to lock
STR_TRANSPARENT_HOUSES_TOOLTIP :{BLACK}Toggle transparency for houses. Ctrl+Click to lock
STR_TRANSPARENT_INDUSTRIES_TOOLTIP :{BLACK}Toggle transparency for industries. Ctrl+Click to lock
STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Toggle transparency for buildables like stations, depots and waypoints. Ctrl+Click to lock
STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Toggle transparency for bridges. Ctrl+Click to lock
STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Toggle transparency for structures like lighthouses and antennas. Ctrl+Click to lock
STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Toggle transparency for catenary. Ctrl+Click to lock
STR_TRANSPARENT_TEXT_TOOLTIP :{BLACK}Toggle transparency for loading and cost/income text. Ctrl+Click to lock
STR_TRANSPARENT_SIGNS_TOOLTIP :{BLACK}Toggle transparency for signs. {FN_KEY}+Click to lock
STR_TRANSPARENT_TREES_TOOLTIP :{BLACK}Toggle transparency for trees. {FN_KEY}+Click to lock
STR_TRANSPARENT_HOUSES_TOOLTIP :{BLACK}Toggle transparency for houses. {FN_KEY}+Click to lock
STR_TRANSPARENT_INDUSTRIES_TOOLTIP :{BLACK}Toggle transparency for industries. {FN_KEY}+Click to lock
STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Toggle transparency for buildables like stations, depots and waypoints. {FN_KEY}+Click to lock
STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Toggle transparency for bridges. {FN_KEY}+Click to lock
STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Toggle transparency for structures like lighthouses and antennas. {FN_KEY}+Click to lock
STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Toggle transparency for catenary. {FN_KEY}+Click to lock
STR_TRANSPARENT_TEXT_TOOLTIP :{BLACK}Toggle transparency for loading and cost/income text. {FN_KEY}+Click to lock
STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Set objects invisible instead of transparent
# Linkgraph legend window
@ -2798,16 +2817,16 @@ STR_RAIL_TOOLBAR_ELRAIL_CONSTRUCTION_CAPTION :Electrified Rai
STR_RAIL_TOOLBAR_MONORAIL_CONSTRUCTION_CAPTION :Monorail Construction
STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :Maglev Construction
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Build railway track. Ctrl+Click to remove railway track. Also press Shift to show cost estimate only
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Build railway track using the Autorail mode. Ctrl+Click to remove railway track. Also press Shift to show cost estimate only
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Build train depot (for buying and servicing trains). Also press Shift to show cost estimate only
STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Build waypoint on railway. Ctrl+Click to select another waypoint to join. Also press Shift to show cost estimate only
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Build railway station. Ctrl+Click to select another station to join. Also press Shift to show cost estimate only
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Build signal on railway. Ctrl+Click to build the alternate signal style{}Click+Drag to fill the selected section of rail with signals at the chosen spacing. Ctrl+Click+Drag to fill signals up to the next junction, station, or signal. Also press Shift to show cost estimate only
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Build railway bridge. Also press Shift to show cost estimate only
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Build railway tunnel. Also press Shift to show cost estimate only
STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Toggle build/remove for railway track, signals, waypoints and stations. Ctrl+Click to also remove the rail of waypoints and stations
STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Convert/Upgrade the type of rail. Also press Shift to show cost estimate only
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Build railway track. {FN_KEY}+Click to remove railway track. Also press {ESTIMATE_KEY} to show cost estimate only
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Build railway track using the Autorail mode. {REMOVE_KEY}+Click to remove railway track. Also press {ESTIMATE_KEY} to show cost estimate only
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Build train depot (for buying and servicing trains). Also press {ESTIMATE_KEY} to show cost estimate only
STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Build waypoint on railway. {FN_KEY}+Click to select another waypoint to join. Also press {ESTIMATE_KEY} to show cost estimate only
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Build railway station. {FN_KEY}+Click to select another station to join. Also press {ESTIMATE_KEY} to show cost estimate only
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Build signal on railway. {FN_KEY}+Click to build the alternate signal style{}Click+Drag to fill the selected section of rail with signals at the chosen spacing. {FN_KEY}+Click+Drag to fill signals up to the next junction, station, or signal. Also press {ESTIMATE_KEY} to show cost estimate only
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Build railway bridge. Also press {ESTIMATE_KEY} to show cost estimate only
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Build railway tunnel. Also press {ESTIMATE_KEY} to show cost estimate only
STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Toggle build/remove for railway track, signals, waypoints and stations. {REMOVE_KEY}+Click to also remove the rail of waypoints and stations
STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Convert/Upgrade the type of rail. Also press {ESTIMATE_KEY} to show cost estimate only
STR_RAIL_NAME_RAILROAD :Railway
STR_RAIL_NAME_ELRAIL :Electrified railway
@ -2857,7 +2876,7 @@ STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP :{BLACK}Exit Sig
STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}Combo Signal (electric){}The combo signal simply acts as both an entry and exit signal. This allows you to build large "trees" of pre-signals
STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP :{BLACK}Path Signal (electric){}A path signal allows more than one train to enter a signal block at the same time, if the train can reserve a path to a safe stopping point. Standard path signals can be passed from the back side
STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP :{BLACK}One-way Path Signal (electric){}A path signal allows more than one train to enter a signal block at the same time, if the train can reserve a path to a safe stopping point. One-way path signals can't be passed from the back side
STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Signal Convert{}Click an existing signal to convert it to the selected signal type and variant. Ctrl+Click to toggle the existing variant. Shift+Click shows estimated conversion cost
STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Signal Convert{}Click an existing signal to convert it to the selected signal type and variant. {FN_KEY}+Click to toggle the existing variant. {ESTIMATE_KEY}+Click shows estimated conversion cost
STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP :{BLACK}Dragging signal distance
STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_DECREASE_TOOLTIP :{BLACK}Decrease dragging signal distance
STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}Increase dragging signal distance
@ -2883,25 +2902,25 @@ STR_BRIDGE_TUBULAR_SILICON :Tubular, Silico
# Road construction toolbar
STR_ROAD_TOOLBAR_ROAD_CONSTRUCTION_CAPTION :{WHITE}Road Construction
STR_ROAD_TOOLBAR_TRAM_CONSTRUCTION_CAPTION :{WHITE}Tramway Construction
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION :{BLACK}Build road section. Ctrl+Click to remove road section. Also press Shift to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}Build tramway section. Ctrl+Click to remove tramway section. Also press Shift to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}Build road section using the Autoroad mode. Ctrl+Click to remove road section. Also press Shift to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Build tramway section using the Autotram mode. Ctrl+Click to remove tramway section. Also press Shift to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Build road vehicle depot (for buying and servicing vehicles). Also press Shift to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Build tram vehicle depot (for buying and servicing vehicles). Also press Shift to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Build bus station. Ctrl+Click to select another station to join. Also press Shift to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Build passenger tram station. Ctrl+Click to select another station to join. Also press Shift to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Build lorry station. Ctrl+Click to select another station to join. Also press Shift to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Build freight tram station. Ctrl+Click to select another station to join. Also press Shift to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION :{BLACK}Build road section. {REMOVE_KEY}+Click to remove road section. Also press {ESTIMATE_KEY} to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}Build tramway section. {REMOVE_KEY}+Click to remove tramway section. Also press {ESTIMATE_KEY} to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}Build road section using the Autoroad mode. {REMOVE_KEY}+Click to remove road section. Also press {ESTIMATE_KEY} to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Build tramway section using the Autotram mode. {REMOVE_KEY}+Click to remove tramway section. Also press {ESTIMATE_KEY} to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Build road vehicle depot (for buying and servicing vehicles). Also press {ESTIMATE_KEY} to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Build tram vehicle depot (for buying and servicing vehicles). Also press {ESTIMATE_KEY} to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Build bus station. {FN_KEY}+Click to select another station to join. Also press {ESTIMATE_KEY} to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Build passenger tram station. {FN_KEY}+Click to select another station to join. Also press {ESTIMATE_KEY} to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Build lorry station. {FN_KEY}+Click to select another station to join. Also press {ESTIMATE_KEY} to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Build freight tram station. {FN_KEY}+Click to select another station to join. Also press {ESTIMATE_KEY} to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD :{BLACK}Activate/Deactivate one way roads
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Build road bridge. Also press Shift to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE :{BLACK}Build tramway bridge. Also press Shift to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Build road tunnel. Also press Shift to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Build tramway tunnel. Also press Shift to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Build road bridge. Also press {ESTIMATE_KEY} to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE :{BLACK}Build tramway bridge. Also press {ESTIMATE_KEY} to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Build road tunnel. Also press {ESTIMATE_KEY} to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Build tramway tunnel. Also press {ESTIMATE_KEY} to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}Toggle build/remove for road construction
STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Toggle build/remove for tramway construction
STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD :{BLACK}Convert/Upgrade the type of road. Also press Shift to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM :{BLACK}Convert/Upgrade the type of tram. Also press Shift to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD :{BLACK}Convert/Upgrade the type of road. Also press {ESTIMATE_KEY} to show cost estimate only
STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM :{BLACK}Convert/Upgrade the type of tram. Also press {ESTIMATE_KEY} to show cost estimate only
STR_ROAD_NAME_ROAD :Road
STR_ROAD_NAME_TRAM :Tramway
@ -2925,14 +2944,14 @@ STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP :{BLACK}Select f
# Waterways toolbar (last two for SE only)
STR_WATERWAYS_TOOLBAR_CAPTION :{WHITE}Waterways Construction
STR_WATERWAYS_TOOLBAR_CAPTION_SE :{WHITE}Waterways
STR_WATERWAYS_TOOLBAR_BUILD_CANALS_TOOLTIP :{BLACK}Build canals. Also press Shift to show cost estimate only
STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP :{BLACK}Build locks. Also press Shift to show cost estimate only
STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP :{BLACK}Build ship depot (for buying and servicing ships). Also press Shift to show cost estimate only
STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Build ship dock. Ctrl+Click to select another station to join. Also press Shift to show cost estimate only
STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP :{BLACK}Place a buoy which can be used as a waypoint. Also press Shift to show cost estimate only
STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP :{BLACK}Build aqueduct. Also press Shift to show cost estimate only
STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP :{BLACK}Build canal. Ctrl+Click at sea level to flood with sea water instead
STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Place rivers. Ctrl+Click to select diagonally
STR_WATERWAYS_TOOLBAR_BUILD_CANALS_TOOLTIP :{BLACK}Build canals. Also press {ESTIMATE_KEY} to show cost estimate only
STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP :{BLACK}Build locks. Also press {ESTIMATE_KEY} to show cost estimate only
STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP :{BLACK}Build ship depot (for buying and servicing ships). Also press {ESTIMATE_KEY} to show cost estimate only
STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Build ship dock. {FN_KEY}+Click to select another station to join. Also press {ESTIMATE_KEY} to show cost estimate only
STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP :{BLACK}Place a buoy which can be used as a waypoint. Also press {ESTIMATE_KEY} to show cost estimate only
STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP :{BLACK}Build aqueduct. Also press {ESTIMATE_KEY} to show cost estimate only
STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP :{BLACK}Build canal. {FN_KEY}+Click at sea level to flood with sea water instead
STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Place rivers. {FN_KEY}+Click to select diagonally
# Ship depot construction window
STR_DEPOT_BUILD_SHIP_CAPTION :{WHITE}Ship Depot Orientation
@ -2943,7 +2962,7 @@ STR_STATION_BUILD_DOCK_CAPTION :{WHITE}Dock
# Airport toolbar
STR_TOOLBAR_AIRCRAFT_CAPTION :{WHITE}Airports
STR_TOOLBAR_AIRCRAFT_BUILD_AIRPORT_TOOLTIP :{BLACK}Build airport. Ctrl+Click to select another station to join. Also press Shift to show cost estimate only
STR_TOOLBAR_AIRCRAFT_BUILD_AIRPORT_TOOLTIP :{BLACK}Build airport. {FN_KEY}+Click to select another station to join. Also press {ESTIMATE_KEY} to show cost estimate only
# Airport construction window
STR_STATION_BUILD_AIRPORT_CAPTION :{WHITE}Airport Selection
@ -2970,14 +2989,14 @@ STR_STATION_BUILD_NOISE :{BLACK}Noise ge
# Landscaping toolbar
STR_LANDSCAPING_TOOLBAR :{WHITE}Landscaping
STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}Lower a corner of land. Click+Drag to lower the first selected corner and level the selected area to the new corner height. Ctrl+Click+Drag to select the area diagonally. Also press Shift to show cost estimate only
STR_LANDSCAPING_TOOLTIP_RAISE_A_CORNER_OF_LAND :{BLACK}Raise a corner of land. Click+Drag to raise the first selected corner and level the selected area to the new corner height. Ctrl+Click+Drag to select the area diagonally. Also press Shift to show cost estimate only
STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Level an area of land to the height of the first selected corner. Ctrl+Click+Drag to select the area diagonally. Also press Shift to show cost estimate only
STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Purchase land for future use. Ctrl+Click+Drag to select the area diagonally. Also press Shift to show cost estimate only
STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}Lower a corner of land. {FN_KEY}+Drag to lower the first selected corner and level the selected area to the new corner height. {FN_KEY}+Click+Drag to select the area diagonally. Also press {ESTIMATE_KEY} to show cost estimate only
STR_LANDSCAPING_TOOLTIP_RAISE_A_CORNER_OF_LAND :{BLACK}Raise a corner of land. {FN_KEY}+Drag to raise the first selected corner and level the selected area to the new corner height. {FN_KEY}+Click+Drag to select the area diagonally. Also press {ESTIMATE_KEY} to show cost estimate only
STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Level an area of land to the height of the first selected corner. Ctrl+Click+Drag to select the area diagonally. Also press {ESTIMATE_KEY} to show cost estimate only
STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Purchase land for future use. {FN_KEY}+Click+Drag to select the area diagonally. Also press {ESTIMATE_KEY} to show cost estimate only
# Object construction window
STR_OBJECT_BUILD_CAPTION :{WHITE}Object Selection
STR_OBJECT_BUILD_TOOLTIP :{BLACK}Select object to build. Ctrl+Click+Drag to select the area diagonally. Also press Shift to show cost estimate only
STR_OBJECT_BUILD_TOOLTIP :{BLACK}Select object to build. {FN_KEY}+Click+Drag to select the area diagonally. Also press {ESTIMATE_KEY} to show cost estimate only
STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}Select class of the object to build
STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}Preview of the object
STR_OBJECT_BUILD_SIZE :{BLACK}Size: {GOLD}{NUM} x {NUM} tiles
@ -2989,7 +3008,7 @@ STR_OBJECT_CLASS_TRNS :Transmitters
STR_PLANT_TREE_CAPTION :{WHITE}Trees
STR_PLANT_TREE_TOOLTIP :{BLACK}Select tree type to plant. If the tile already has a tree, this will add more trees of mixed types independent of the selected type
STR_TREES_RANDOM_TYPE :{BLACK}Trees of random type
STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Place trees of random type. Ctrl+Click+Drag to select the area diagonally. Also press Shift to show cost estimate only
STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Place trees of random type. {FN_KEY}+Click+Drag to select the area diagonally. Also press {ESTIMATE_KEY} to show cost estimate only
STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Random Trees
STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Plant trees randomly throughout the landscape
STR_TREES_MODE_NORMAL_BUTTON :{BLACK}Normal
@ -3002,7 +3021,7 @@ STR_TREES_MODE_FOREST_LG_TOOLTIP :{BLACK}Plant la
# Land generation window (SE)
STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION :{WHITE}Land Generation
STR_TERRAFORM_TOOLTIP_PLACE_ROCKY_AREAS_ON_LANDSCAPE :{BLACK}Place rocky areas on landscape
STR_TERRAFORM_TOOLTIP_DEFINE_DESERT_AREA :{BLACK}Define desert area.{}Ctrl+Click to remove desert area
STR_TERRAFORM_TOOLTIP_DEFINE_DESERT_AREA :{BLACK}Define desert area.{}{FN_KEY}+Click to remove desert area
STR_TERRAFORM_TOOLTIP_INCREASE_SIZE_OF_LAND_AREA :{BLACK}Increase area of land to lower/raise
STR_TERRAFORM_TOOLTIP_DECREASE_SIZE_OF_LAND_AREA :{BLACK}Decrease area of land to lower/raise
STR_TERRAFORM_TOOLTIP_GENERATE_RANDOM_LAND :{BLACK}Generate random land
@ -3016,7 +3035,7 @@ STR_RESET_LANDSCAPE_CONFIRMATION_TEXT :{WHITE}Are you
# Town generation window (SE)
STR_FOUND_TOWN_CAPTION :{WHITE}Town Generation
STR_FOUND_TOWN_NEW_TOWN_BUTTON :{BLACK}New Town
STR_FOUND_TOWN_NEW_TOWN_TOOLTIP :{BLACK}Found new town. Also press Shift to show cost estimate only
STR_FOUND_TOWN_NEW_TOWN_TOOLTIP :{BLACK}Found new town. Also press {ESTIMATE_KEY} to show cost estimate only
STR_FOUND_TOWN_RANDOM_TOWN_BUTTON :{BLACK}Random Town
STR_FOUND_TOWN_RANDOM_TOWN_TOOLTIP :{BLACK}Found town in random location
STR_FOUND_TOWN_MANY_RANDOM_TOWNS :{BLACK}Many random towns
@ -3082,7 +3101,7 @@ STR_INDUSTRY_CARGOES_SELECT_INDUSTRY_TOOLTIP :{BLACK}Select t
# Land area window
STR_LAND_AREA_INFORMATION_CAPTION :{WHITE}Land Area Information
STR_LAND_AREA_INFORMATION_LOCATION_TOOLTIP :{BLACK}Centre the main view on tile location. Ctrl+Click to open a new viewport on tile location
STR_LAND_AREA_INFORMATION_LOCATION_TOOLTIP :{BLACK}Centre the main view on tile location. {FN_KEY}+Click to open a new viewport on tile location
STR_LAND_AREA_INFORMATION_COST_TO_CLEAR_N_A :{BLACK}Cost to clear: {LTBLUE}N/A
STR_LAND_AREA_INFORMATION_COST_TO_CLEAR :{BLACK}Cost to clear: {RED}{CURRENCY_LONG}
STR_LAND_AREA_INFORMATION_REVENUE_WHEN_CLEARED :{BLACK}Revenue when cleared: {LTBLUE}{CURRENCY_LONG}
@ -3507,7 +3526,7 @@ STR_SPRITE_ALIGNER_GOTO_TOOLTIP :{BLACK}Go to th
STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Previous sprite
STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Proceed to the previous normal sprite, skipping any pseudo/recolour/font sprites and wrapping around from the first sprite to the last
STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Representation of the currently selected sprite. The alignment is ignored when drawing this sprite
STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Move the sprite around, changing the X and Y offsets. Ctrl+Click to move the sprite eight units at a time
STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Move the sprite around, changing the X and Y offsets. {FN_KEY}+Click to move the sprite eight units at a time
###length 2
STR_SPRITE_ALIGNER_CENTRE_OFFSET :{BLACK}Offset centred
@ -3609,7 +3628,7 @@ STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Toggle m
# Sign window
STR_EDIT_SIGN_CAPTION :{WHITE}Edit sign text
STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}Centre the main view on sign location. Ctrl+Click to open a new viewport on sign location
STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}Centre the main view on sign location. {FN_KEY}+Click to open a new viewport on sign location
STR_EDIT_SIGN_NEXT_SIGN_TOOLTIP :{BLACK}Go to next sign
STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}Go to previous sign
@ -3620,7 +3639,7 @@ STR_TOWN_DIRECTORY_CAPTION :{WHITE}Towns
STR_TOWN_DIRECTORY_NONE :{ORANGE}- None -
STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA})
STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (City){BLACK} ({COMMA})
STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Town names - click on name to centre main view on town. Ctrl+Click to open a new viewport on town location
STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Town names - click on name to centre main view on town. {FN_KEY}+Click to open a new viewport on town location
STR_TOWN_POPULATION :{BLACK}World population: {COMMA}
# Town view window
@ -3639,7 +3658,7 @@ STR_TOWN_VIEW_TOWN_GROWS_EVERY :{BLACK}Town gro
STR_TOWN_VIEW_TOWN_GROWS_EVERY_FUNDED :{BLACK}Town grows every {ORANGE}{UNITS_DAYS_OR_SECONDS} (funded)
STR_TOWN_VIEW_TOWN_GROW_STOPPED :{BLACK}Town is {RED}not{BLACK} growing
STR_TOWN_VIEW_NOISE_IN_TOWN :{BLACK}Noise limit in town: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA}
STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Centre the main view on town location. Ctrl+Click to open a new viewport on town location
STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Centre the main view on town location. {FN_KEY}+Click to open a new viewport on town location
STR_TOWN_VIEW_LOCAL_AUTHORITY_BUTTON :{BLACK}Local Authority
STR_TOWN_VIEW_LOCAL_AUTHORITY_TOOLTIP :{BLACK}Show information on local authority
STR_TOWN_VIEW_RENAME_TOOLTIP :{BLACK}Change town name
@ -3696,7 +3715,7 @@ STR_GOALS_TEXT :{ORANGE}{RAW_ST
STR_GOALS_NONE :{ORANGE}- None -
STR_GOALS_PROGRESS :{ORANGE}{RAW_STRING}
STR_GOALS_PROGRESS_COMPLETE :{GREEN}{RAW_STRING}
STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Click on goal to centre main view on industry/town/tile. Ctrl+Click to open a new viewport on industry/town/tile location
STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Click on goal to centre main view on industry/town/tile. {FN_KEY}+Click to open a new viewport on industry/town/tile location
# Goal question window
STR_GOAL_QUESTION_CAPTION_QUESTION :{BLACK}Question
@ -3732,7 +3751,7 @@ STR_SUBSIDIES_OFFERED_FROM_TO :{ORANGE}{STRING
STR_SUBSIDIES_NONE :{ORANGE}- None -
STR_SUBSIDIES_SUBSIDISED_TITLE :{BLACK}Services already subsidised:
STR_SUBSIDIES_SUBSIDISED_FROM_TO :{ORANGE}{STRING} from {STRING2} to {STRING2}{YELLOW} ({COMPANY}{YELLOW}, {STRING1})
STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Click on service to centre main view on industry/town. Ctrl+Click to open a new viewport on industry/town location
STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Click on service to centre main view on industry/town. {FN_KEY}+Click to open a new viewport on industry/town location
STR_SUBSIDIES_OFFERED_EXPIRY_DATE :by {DATE_SHORT}
STR_SUBSIDIES_OFFERED_EXPIRY_TIME :within {UNITS_MONTHS_OR_MINUTES}
STR_SUBSIDIES_SUBSIDISED_EXPIRY_DATE :until {DATE_SHORT}
@ -3752,8 +3771,8 @@ STR_STORY_BOOK_NEXT_PAGE_TOOLTIP :{BLACK}Go to ne
STR_STORY_BOOK_INVALID_GOAL_REF :{RED}Invalid goal reference
# Station list window
STR_STATION_LIST_TOOLTIP :{BLACK}Station names - click on name to centre main view on station. Ctrl+Click to open a new viewport on station location
STR_STATION_LIST_USE_CTRL_TO_SELECT_MORE :{BLACK}Ctrl+Click to select multiple items
STR_STATION_LIST_TOOLTIP :{BLACK}Station names - click on name to centre main view on station. {FN_KEY}+Click to open a new viewport on station location
STR_STATION_LIST_USE_CTRL_TO_SELECT_MORE :{BLACK}{FN_KEY}+Click to select multiple items
STR_STATION_LIST_CAPTION :{WHITE}{COMPANY} - {COMMA} Station{P "" s}
STR_STATION_LIST_STATION :{YELLOW}{STATION} {STATION_FEATURES}
STR_STATION_LIST_WAYPOINT :{YELLOW}{WAYPOINT}
@ -3813,7 +3832,7 @@ STR_CARGO_RATING_VERY_GOOD :Very Good
STR_CARGO_RATING_EXCELLENT :Excellent
STR_CARGO_RATING_OUTSTANDING :Outstanding
STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centre main view on station location. Ctrl+Click to open a new viewport on station location
STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centre main view on station location. {FN_KEY}+Click to open a new viewport on station location
STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Change name of station
STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Show all trains which have this station on their schedule
@ -3828,9 +3847,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Prevent
# Waypoint/buoy view window
STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT}
STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centre main view on waypoint location. Ctrl+Click to open a new viewport on waypoint location
STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centre main view on waypoint location. {FN_KEY}+Click to open a new viewport on waypoint location
STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Change waypoint name
STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centre main view on buoy location. Ctrl+Click to open a new viewport on buoy location
STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centre main view on buoy location. {FN_KEY}+Click to open a new viewport on buoy location
STR_BUOY_VIEW_CHANGE_BUOY_NAME :{BLACK}Change buoy name
STR_EDIT_WAYPOINT_NAME :{WHITE}Edit waypoint name
@ -3875,9 +3894,10 @@ STR_FINANCES_MAX_LOAN :{WHITE}Maximum
STR_FINANCES_TOTAL_CURRENCY :{BLACK}{CURRENCY_LONG}
STR_FINANCES_BANK_BALANCE :{WHITE}{CURRENCY_LONG}
STR_FINANCES_BORROW_BUTTON :{BLACK}Borrow {CURRENCY_LONG}
STR_FINANCES_BORROW_TOOLTIP :{BLACK}Increase size of loan. Ctrl+Click to borrow as much as possible
STR_FINANCES_BORROW_TOOLTIP :{BLACK}Increase size of loan. {FN_KEY}+Click to borrow as much as possible
STR_FINANCES_REPAY_BUTTON :{BLACK}Repay {CURRENCY_LONG}
STR_FINANCES_REPAY_TOOLTIP :{BLACK}Repay part of loan. Ctrl+Click to repay as much loan as possible
STR_FINANCES_REPAY_TOOLTIP :{BLACK}Repay part of loan. {FN_KEY}+Click to repay as much loan as possible
STR_FINANCES_INFRASTRUCTURE_BUTTON :{BLACK}Infrastructure
# Company view
@ -3906,7 +3926,7 @@ STR_COMPANY_VIEW_BUILD_HQ_TOOLTIP :{BLACK}Build co
STR_COMPANY_VIEW_VIEW_HQ_BUTTON :{BLACK}View HQ
STR_COMPANY_VIEW_VIEW_HQ_TOOLTIP :{BLACK}View company headquarters
STR_COMPANY_VIEW_RELOCATE_HQ :{BLACK}Relocate HQ
STR_COMPANY_VIEW_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}Rebuild company headquarters elsewhere for 1% cost of company value. Also press Shift to show cost estimate only
STR_COMPANY_VIEW_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}Rebuild company headquarters elsewhere for 1% cost of company value. Also press {ESTIMATE_KEY} to show cost estimate only
STR_COMPANY_VIEW_INFRASTRUCTURE_BUTTON :{BLACK}Details
STR_COMPANY_VIEW_INFRASTRUCTURE_TOOLTIP :{BLACK}View detailed infrastructure counts
STR_COMPANY_VIEW_GIVE_MONEY_BUTTON :{BLACK}Give money
@ -3953,7 +3973,7 @@ STR_INDUSTRY_DIRECTORY_ITEM_PROD1 :{ORANGE}{INDUST
STR_INDUSTRY_DIRECTORY_ITEM_PROD2 :{ORANGE}{INDUSTRY} {STRING4}, {STRING4}
STR_INDUSTRY_DIRECTORY_ITEM_PROD3 :{ORANGE}{INDUSTRY} {STRING4}, {STRING4}, {STRING4}
STR_INDUSTRY_DIRECTORY_ITEM_PRODMORE :{ORANGE}{INDUSTRY} {STRING4}, {STRING4}, {STRING4} and {NUM} more...
STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Industry names - click on name to centre main view on industry. Ctrl+Click to open a new viewport on industry location
STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Industry names - click on name to centre main view on industry. {FN_KEY}+Click to open a new viewport on industry location
STR_INDUSTRY_DIRECTORY_ACCEPTED_CARGO_FILTER :{BLACK}Accepted cargo: {SILVER}{STRING}
STR_INDUSTRY_DIRECTORY_PRODUCED_CARGO_FILTER :{BLACK}Produced cargo: {SILVER}{STRING}
STR_INDUSTRY_DIRECTORY_FILTER_ALL_TYPES :All cargo types
@ -3964,7 +3984,7 @@ STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTR
STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE :{BLACK}Production last month:
STR_INDUSTRY_VIEW_PRODUCTION_LAST_MINUTE_TITLE :{BLACK}Production last minute:
STR_INDUSTRY_VIEW_TRANSPORTED :{YELLOW}{CARGO_LONG}{RAW_STRING}{BLACK} ({COMMA}% transported)
STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}Centre the main view on industry location. Ctrl+Click to open a new viewport on industry location
STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}Centre the main view on industry location. {FN_KEY}+Click to open a new viewport on industry location
STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}Production level: {YELLOW}{COMMA}%
STR_INDUSTRY_VIEW_INDUSTRY_ANNOUNCED_CLOSURE :{YELLOW}The industry has announced imminent closure!
@ -4039,7 +4059,7 @@ STR_GROUP_CREATE_TOOLTIP :{BLACK}Click to
STR_GROUP_DELETE_TOOLTIP :{BLACK}Delete the selected group
STR_GROUP_RENAME_TOOLTIP :{BLACK}Rename the selected group
STR_GROUP_LIVERY_TOOLTIP :{BLACK}Change livery of the selected group
STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Click to protect this group from global autoreplace. Ctrl+Click to also protect sub-groups.
STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Click to protect this group from global autoreplace. {FN_KEY}+Click to also protect sub-groups.
STR_QUERY_GROUP_DELETE_CAPTION :{WHITE}Delete Group
STR_GROUP_DELETE_QUERY_TEXT :{WHITE}Are you sure you want to delete this group and any descendants?
@ -4107,10 +4127,10 @@ STR_CARGO_TYPE_FILTER_FREIGHT :Freight
STR_CARGO_TYPE_FILTER_NONE :None
###length VEHICLE_TYPES
STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Train vehicle selection list. Click on vehicle for information. Ctrl+Click to show/hide this vehicle type
STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Road vehicle selection list. Click on vehicle for information. Ctrl+Click to show/hide this vehicle type
STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Ship selection list. Click on ship for information. Ctrl+Click to show/hide this ship type
STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Aircraft selection list. Click on aircraft for information. Ctrl+Click to show/hide this aircraft type
STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Train vehicle selection list. Click on vehicle for information. {FN_KEY}+Click to show/hide this vehicle type
STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Road vehicle selection list. Click on vehicle for information. {FN_KEY}+Click to show/hide this vehicle type
STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Ship selection list. Click on ship for information. {FN_KEY}+Click to show/hide this ship type
STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Aircraft selection list. Click on aircraft for information. {FN_KEY}+Click to show/hide this aircraft type
###length VEHICLE_TYPES
STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_BUTTON :{BLACK}Buy Vehicle
@ -4125,16 +4145,16 @@ STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Buy and
STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Buy and Refit Aircraft
###length VEHICLE_TYPES
STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Buy the highlighted train vehicle. Also press Shift to show cost estimate only
STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Buy the highlighted road vehicle. Also press Shift to show cost estimate only
STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Buy the highlighted ship. Also press Shift to show cost estimate only
STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Buy the highlighted aircraft. Also press Shift to show cost estimate only
STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Buy the highlighted train vehicle. Also press {ESTIMATE_KEY} to show cost estimate only
STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Buy the highlighted road vehicle. Also press {ESTIMATE_KEY} to show cost estimate only
STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Buy the highlighted ship. Also press {ESTIMATE_KEY} to show cost estimate only
STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Buy the highlighted aircraft. Also press {ESTIMATE_KEY} to show cost estimate only
###length VEHICLE_TYPES
STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Buy and refit the highlighted train vehicle. Also press Shift to show cost estimate only
STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Buy and refit the highlighted road vehicle. Also press Shift to show cost estimate only
STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Buy and refit the highlighted ship. Also press Shift to show cost estimate only
STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Buy and refit the highlighted aircraft. Also press Shift to show cost estimate only
STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Buy and refit the highlighted train vehicle. Also press {ESTIMATE_KEY} to show cost estimate only
STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Buy and refit the highlighted road vehicle. Also press {ESTIMATE_KEY} to show cost estimate only
STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Buy and refit the highlighted ship. Also press {ESTIMATE_KEY} to show cost estimate only
STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Buy and refit the highlighted aircraft. Also press {ESTIMATE_KEY} to show cost estimate only
###length VEHICLE_TYPES
STR_BUY_VEHICLE_TRAIN_RENAME_BUTTON :{BLACK}Rename
@ -4184,7 +4204,7 @@ STR_DEPOT_VEHICLE_TOOLTIP_CHAIN :{BLACK}{NUM} ve
STR_DEPOT_VEHICLE_TOOLTIP_CARGO :{}{CARGO_LONG} ({CARGO_SHORT})
###length VEHICLE_TYPES
STR_DEPOT_TRAIN_LIST_TOOLTIP :{BLACK}Trains - drag vehicle with left-click to add/remove from train, right-click for information. Ctrl+Click to apply either function to the following chain
STR_DEPOT_TRAIN_LIST_TOOLTIP :{BLACK}Trains - drag vehicle with left-click to add/remove from train, right-click for information. {FN_KEY}+Click to apply either function to the following chain
STR_DEPOT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Vehicles - right-click on vehicle for information
STR_DEPOT_SHIP_LIST_TOOLTIP :{BLACK}Ships - right-click on ship for information
STR_DEPOT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Aircraft - right-click on aircraft for information
@ -4226,16 +4246,16 @@ STR_DEPOT_CLONE_SHIP :{BLACK}Clone Sh
STR_DEPOT_CLONE_AIRCRAFT :{BLACK}Clone Aircraft
###length VEHICLE_TYPES
STR_DEPOT_CLONE_TRAIN_DEPOT_INFO :{BLACK}Buy a copy of a train including all cars. Click this button and then on a train inside or outside the depot. Ctrl+Click to share the orders. Also press Shift to show cost estimate only
STR_DEPOT_CLONE_ROAD_VEHICLE_DEPOT_INFO :{BLACK}Buy a copy of a road vehicle. Click this button and then on a road vehicle inside or outside the depot. Ctrl+Click to share the orders. Also press Shift to show cost estimate only
STR_DEPOT_CLONE_SHIP_DEPOT_INFO :{BLACK}Buy a copy of a ship. Click this button and then on a ship inside or outside the depot. Ctrl+Click to share the orders. Also press Shift to show cost estimate only
STR_DEPOT_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW :{BLACK}Buy a copy of an aircraft. Click this button and then on an aircraft inside or outside the hangar. Ctrl+Click to share the orders. Also press Shift to show cost estimate only
STR_DEPOT_CLONE_TRAIN_DEPOT_INFO :{BLACK}Buy a copy of a train including all cars. Click this button and then on a train inside or outside the depot. {FN_KEY}+Click to share the orders. Also press {ESTIMATE_KEY} to show cost estimate only
STR_DEPOT_CLONE_ROAD_VEHICLE_DEPOT_INFO :{BLACK}Buy a copy of a road vehicle. Click this button and then on a road vehicle inside or outside the depot. {FN_KEY}+Click to share the orders. Also press {ESTIMATE_KEY} to show cost estimate only
STR_DEPOT_CLONE_SHIP_DEPOT_INFO :{BLACK}Buy a copy of a ship. Click this button and then on a ship inside or outside the depot. {FN_KEY}+Click to share the orders. Also press {ESTIMATE_KEY} to show cost estimate only
STR_DEPOT_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW :{BLACK}Buy a copy of an aircraft. Click this button and then on an aircraft inside or outside the hangar. {FN_KEY}+Click to share the orders. Also press {ESTIMATE_KEY} to show cost estimate only
###length VEHICLE_TYPES
STR_DEPOT_TRAIN_LOCATION_TOOLTIP :{BLACK}Centre main view on train depot location. Ctrl+Click to open a new viewport on train depot location
STR_DEPOT_ROAD_VEHICLE_LOCATION_TOOLTIP :{BLACK}Centre main view on road vehicle depot location. Ctrl+Click to open a new viewport on road depot location
STR_DEPOT_SHIP_LOCATION_TOOLTIP :{BLACK}Centre main view on ship depot location. Ctrl+Click to open a new viewport on ship depot location
STR_DEPOT_AIRCRAFT_LOCATION_TOOLTIP :{BLACK}Centre main view on hangar location. Ctrl+Click to open a new viewport on hangar location
STR_DEPOT_TRAIN_LOCATION_TOOLTIP :{BLACK}Centre main view on train depot location. {FN_KEY}+Click to open a new viewport on train depot location
STR_DEPOT_ROAD_VEHICLE_LOCATION_TOOLTIP :{BLACK}Centre main view on road vehicle depot location. {FN_KEY}+Click to open a new viewport on road depot location
STR_DEPOT_SHIP_LOCATION_TOOLTIP :{BLACK}Centre main view on ship depot location. {FN_KEY}+Click to open a new viewport on ship depot location
STR_DEPOT_AIRCRAFT_LOCATION_TOOLTIP :{BLACK}Centre main view on hangar location. {FN_KEY}+Click to open a new viewport on hangar location
###length VEHICLE_TYPES
STR_DEPOT_VEHICLE_ORDER_LIST_TRAIN_TOOLTIP :{BLACK}Get a list of all trains with the current depot in their orders
@ -4335,33 +4355,33 @@ STR_REPLACE_TRAM_VEHICLES :Tramway Vehicle
STR_REPLACE_REMOVE_WAGON :{BLACK}Wagon removal ({STRING1}): {ORANGE}{STRING}
STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Make autoreplace keep the length of a train the same by removing wagons (starting at the front), if replacing the engine would make the train longer
STR_REPLACE_REMOVE_WAGON_GROUP_HELP :{STRING}. Ctrl+Click to also apply to sub-groups
STR_REPLACE_REMOVE_WAGON_GROUP_HELP :{STRING}. {FN_KEY}+Click to also apply to sub-groups
# Vehicle view
STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE}
###length VEHICLE_TYPES
STR_VEHICLE_VIEW_TRAIN_CENTER_TOOLTIP :{BLACK}Centre main view on train's location. Double click to follow train in main view. Ctrl+Click to open a new viewport on train's location
STR_VEHICLE_VIEW_ROAD_VEHICLE_CENTER_TOOLTIP :{BLACK}Centre main view on vehicle's location. Double click to follow vehicle in main view. Ctrl+Click to open a new viewport on vehicle's location
STR_VEHICLE_VIEW_SHIP_CENTER_TOOLTIP :{BLACK}Centre main view on ship's location. Double click to follow ship in main view. Ctrl+Click to open a new viewport on ship's location
STR_VEHICLE_VIEW_AIRCRAFT_CENTER_TOOLTIP :{BLACK}Centre main view on aircraft's location. Double click to follow aircraft in main view. Ctrl+Click to open a new viewport on aircraft's location
STR_VEHICLE_VIEW_TRAIN_CENTER_TOOLTIP :{BLACK}Centre main view on train's location. Double click to follow train in main view. {FN_KEY}+Click to open a new viewport on train's location
STR_VEHICLE_VIEW_ROAD_VEHICLE_CENTER_TOOLTIP :{BLACK}Centre main view on vehicle's location. Double click to follow vehicle in main view. {FN_KEY}+Click to open a new viewport on vehicle's location
STR_VEHICLE_VIEW_SHIP_CENTER_TOOLTIP :{BLACK}Centre main view on ship's location. Double click to follow ship in main view. {FN_KEY}+Click to open a new viewport on ship's location
STR_VEHICLE_VIEW_AIRCRAFT_CENTER_TOOLTIP :{BLACK}Centre main view on aircraft's location. Double click to follow aircraft in main view. {FN_KEY}+Click to open a new viewport on aircraft's location
###length VEHICLE_TYPES
STR_VEHICLE_VIEW_TRAIN_SEND_TO_DEPOT_TOOLTIP :{BLACK}Send train to depot. Ctrl+Click to only service
STR_VEHICLE_VIEW_ROAD_VEHICLE_SEND_TO_DEPOT_TOOLTIP :{BLACK}Send vehicle to depot. Ctrl+Click to only service
STR_VEHICLE_VIEW_SHIP_SEND_TO_DEPOT_TOOLTIP :{BLACK}Send ship to depot. Ctrl+Click to only service
STR_VEHICLE_VIEW_AIRCRAFT_SEND_TO_DEPOT_TOOLTIP :{BLACK}Send aircraft to hangar. Ctrl+Click to only service
STR_VEHICLE_VIEW_TRAIN_SEND_TO_DEPOT_TOOLTIP :{BLACK}Send train to depot. {FN_KEY}+Click to only service
STR_VEHICLE_VIEW_ROAD_VEHICLE_SEND_TO_DEPOT_TOOLTIP :{BLACK}Send vehicle to depot. {FN_KEY}+Click to only service
STR_VEHICLE_VIEW_SHIP_SEND_TO_DEPOT_TOOLTIP :{BLACK}Send ship to depot. {FN_KEY}+Click to only service
STR_VEHICLE_VIEW_AIRCRAFT_SEND_TO_DEPOT_TOOLTIP :{BLACK}Send aircraft to hangar. {FN_KEY}+Click to only service
###length VEHICLE_TYPES
STR_VEHICLE_VIEW_CLONE_TRAIN_INFO :{BLACK}Buy a copy of the train including all cars. Ctrl+Click to share orders. Also press Shift to show cost estimate only
STR_VEHICLE_VIEW_CLONE_ROAD_VEHICLE_INFO :{BLACK}Buy a copy of the road vehicle. Ctrl+Click to share orders. Also press Shift to show cost estimate only
STR_VEHICLE_VIEW_CLONE_SHIP_INFO :{BLACK}Buy a copy of the ship. Ctrl+Click to share orders. Also press Shift to show cost estimate only
STR_VEHICLE_VIEW_CLONE_AIRCRAFT_INFO :{BLACK}Buy a copy of the aircraft. Ctrl+Click to share orders. Also press Shift to show cost estimate only
STR_VEHICLE_VIEW_CLONE_TRAIN_INFO :{BLACK}Buy a copy of the train including all cars. {FN_KEY}+Click to share orders. Also press {ESTIMATE_KEY} to show cost estimate only
STR_VEHICLE_VIEW_CLONE_ROAD_VEHICLE_INFO :{BLACK}Buy a copy of the road vehicle. {FN_KEY}+Click to share orders. Also press {ESTIMATE_KEY} to show cost estimate only
STR_VEHICLE_VIEW_CLONE_SHIP_INFO :{BLACK}Buy a copy of the ship. {FN_KEY}+Click to share orders. Also press {ESTIMATE_KEY} to show cost estimate only
STR_VEHICLE_VIEW_CLONE_AIRCRAFT_INFO :{BLACK}Buy a copy of the aircraft. {FN_KEY}+Click to share orders. Also press {ESTIMATE_KEY} to show cost estimate only
STR_VEHICLE_VIEW_TRAIN_IGNORE_SIGNAL_TOOLTIP :{BLACK}Force train to proceed without waiting for signal to clear it
STR_VEHICLE_VIEW_TRAIN_REVERSE_TOOLTIP :{BLACK}Reverse direction of train
STR_VEHICLE_VIEW_ROAD_VEHICLE_REVERSE_TOOLTIP :{BLACK}Force vehicle to turn around
STR_VEHICLE_VIEW_ORDER_LOCATION_TOOLTIP :{BLACK}Centre main view on order destination. Ctrl+Click to open a new viewport on the order destination's location
STR_VEHICLE_VIEW_ORDER_LOCATION_TOOLTIP :{BLACK}Centre main view on order destination. {FN_KEY}+Click to open a new viewport on the order destination's location
###length VEHICLE_TYPES
STR_VEHICLE_VIEW_TRAIN_REFIT_TOOLTIP :{BLACK}Refit train to carry a different cargo type
@ -4370,10 +4390,10 @@ STR_VEHICLE_VIEW_SHIP_REFIT_TOOLTIP :{BLACK}Refit sh
STR_VEHICLE_VIEW_AIRCRAFT_REFIT_TOOLTIP :{BLACK}Refit aircraft to carry a different cargo type
###length VEHICLE_TYPES
STR_VEHICLE_VIEW_TRAIN_ORDERS_TOOLTIP :{BLACK}Show train's orders. Ctrl+Click to show train's timetable
STR_VEHICLE_VIEW_ROAD_VEHICLE_ORDERS_TOOLTIP :{BLACK}Show vehicle's orders. Ctrl+Click to show vehicle's timetable
STR_VEHICLE_VIEW_SHIP_ORDERS_TOOLTIP :{BLACK}Show ship's orders. Ctrl+Click to show ship's timetable
STR_VEHICLE_VIEW_AIRCRAFT_ORDERS_TOOLTIP :{BLACK}Show aircraft's orders. Ctrl+Click to show aircraft's timetable
STR_VEHICLE_VIEW_TRAIN_ORDERS_TOOLTIP :{BLACK}Show train's orders. {FN_KEY}+Click to show train's timetable
STR_VEHICLE_VIEW_ROAD_VEHICLE_ORDERS_TOOLTIP :{BLACK}Show vehicle's orders. {FN_KEY}+Click to show vehicle's timetable
STR_VEHICLE_VIEW_SHIP_ORDERS_TOOLTIP :{BLACK}Show ship's orders. {FN_KEY}+Click to show ship's timetable
STR_VEHICLE_VIEW_AIRCRAFT_ORDERS_TOOLTIP :{BLACK}Show aircraft's orders. {FN_KEY}+Click to show aircraft's timetable
###length VEHICLE_TYPES
STR_VEHICLE_VIEW_TRAIN_SHOW_DETAILS_TOOLTIP :{BLACK}Show train details
@ -4457,12 +4477,12 @@ STR_VEHICLE_DETAILS_SERVICING_INTERVAL_MINUTES :{BLACK}Servicin
STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}Servicing interval: {LTBLUE}{COMMA}%{BLACK} {STRING1}
STR_VEHICLE_DETAILS_LAST_SERVICE_DATE :Last service: {LTBLUE}{DATE_LONG}
STR_VEHICLE_DETAILS_LAST_SERVICE_MINUTES_AGO :Last service: {LTBLUE}{NUM} minutes ago
STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}Increase servicing interval by 10 days. Ctrl+Click to increase servicing interval by 5 days
STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}Increase servicing interval by 5 minutes. Ctrl+Click to increase servicing interval by 1 minute
STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}Increase servicing interval by 10 percent. Ctrl+Click to increase servicing interval by 5 percent
STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}Decrease servicing interval by 10 days. Ctrl+Click to decrease servicing interval by 5 days
STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}Decrease servicing interval by 5 minutes. Ctrl+Click to decrease servicing interval by 1 minute
STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}Decrease servicing interval by 10 percent. Ctrl+Click to decrease servicing interval by 5 percent
STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}Increase servicing interval by 10 days. {FN_KEY}+Click to increase servicing interval by 5 days
STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}Increase servicing interval by 5 minutes. {FN_KEY}+Click to increase servicing interval by 1 minute
STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}Increase servicing interval by 10 percent. {FN_KEY}+Click to increase servicing interval by 5 percent
STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}Decrease servicing interval by 10 days. {FN_KEY}+Click to decrease servicing interval by 5 days
STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}Decrease servicing interval by 5 minutes. {FN_KEY}+Click to decrease servicing interval by 1 minute
STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}Decrease servicing interval by 10 percent. {FN_KEY}+Click to decrease servicing interval by 5 percent
STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}Change servicing interval type
STR_VEHICLE_DETAILS_DEFAULT :Default
@ -4506,7 +4526,7 @@ STR_REFIT_NEW_CAPACITY_COST_OF_REFIT :{BLACK}New capa
STR_REFIT_NEW_CAPACITY_INCOME_FROM_REFIT :{BLACK}New capacity: {GOLD}{CARGO_LONG}{}{BLACK}Income from refit: {GREEN}{CURRENCY_LONG}
STR_REFIT_NEW_CAPACITY_COST_OF_AIRCRAFT_REFIT :{BLACK}New capacity: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Cost of refit: {RED}{CURRENCY_LONG}
STR_REFIT_NEW_CAPACITY_INCOME_FROM_AIRCRAFT_REFIT :{BLACK}New capacity: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Income from refit: {GREEN}{CURRENCY_LONG}
STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Select the vehicles to refit. Click+Drag to select multiple vehicles. Click on an empty space to select the whole vehicle. Ctrl+Click to select a vehicle and the following chain
STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Select the vehicles to refit. {FN_KEY}+Drag to select multiple vehicles. Click on an empty space to select the whole vehicle. {FN_KEY}+Click to select a vehicle and the following chain
###length VEHICLE_TYPES
STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Select type of cargo for train to carry
@ -4531,7 +4551,7 @@ STR_ORDERS_CAPTION :{WHITE}{VEHICLE
STR_ORDERS_TIMETABLE_VIEW :{BLACK}Timetable
STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Switch to the timetable view
STR_ORDERS_LIST_TOOLTIP :{BLACK}Order list - click on an order to highlight it. Ctrl+Click to scroll to the order's destination
STR_ORDERS_LIST_TOOLTIP :{BLACK}Order list - click on an order to highlight it. {FN_KEY}+Click to scroll to the order's destination
STR_ORDER_INDEX :{COMMA}:{NBSP}
STR_ORDER_TEXT :{STRING4} {STRING2} {STRING}
@ -4561,9 +4581,9 @@ STR_ORDER_DROP_NO_UNLOADING :No unloading
STR_ORDER_TOOLTIP_UNLOAD :{BLACK}Change the unloading behaviour of the highlighted order
STR_ORDER_REFIT :{BLACK}Refit
STR_ORDER_REFIT_TOOLTIP :{BLACK}Select what cargo type to refit to in this order. Ctrl+Click to remove refit instruction
STR_ORDER_REFIT_TOOLTIP :{BLACK}Select what cargo type to refit to in this order. {FN_KEY}+Click to remove refit instruction
STR_ORDER_REFIT_AUTO :{BLACK}Refit at station
STR_ORDER_REFIT_AUTO_TOOLTIP :{BLACK}Select what cargo type to refit to in this order. Ctrl+Click to remove refit instruction. Refitting at stations will only be done if the vehicle allows it
STR_ORDER_REFIT_AUTO_TOOLTIP :{BLACK}Select what cargo type to refit to in this order. {FN_KEY}+Click to remove refit instruction. Refitting at stations will only be done if the vehicle allows it
STR_ORDER_DROP_REFIT_AUTO :Fixed cargo
STR_ORDER_DROP_REFIT_AUTO_ANY :Available cargo
@ -4601,20 +4621,20 @@ STR_ORDER_CONDITIONAL_VALUE_TOOLTIP :{BLACK}The valu
STR_ORDER_CONDITIONAL_VALUE_CAPT :{WHITE}Enter value to compare against
STR_ORDERS_SKIP_BUTTON :{BLACK}Skip
STR_ORDERS_SKIP_TOOLTIP :{BLACK}Skip the current order, and start the next. Ctrl+Click to skip to the selected order
STR_ORDERS_SKIP_TOOLTIP :{BLACK}Skip the current order, and start the next. {FN_KEY}+Click to skip to the selected order
STR_ORDERS_DELETE_BUTTON :{BLACK}Delete
STR_ORDERS_DELETE_TOOLTIP :{BLACK}Delete the highlighted order
STR_ORDERS_DELETE_ALL_TOOLTIP :{BLACK}Delete all orders
STR_ORDERS_STOP_SHARING_BUTTON :{BLACK}Stop sharing
STR_ORDERS_STOP_SHARING_TOOLTIP :{BLACK}Stop sharing the order list. Ctrl+Click to additionally delete all orders for this vehicle
STR_ORDERS_STOP_SHARING_TOOLTIP :{BLACK}Stop sharing the order list. {FN_KEY}+Click to additionally delete all orders for this vehicle
STR_ORDERS_GO_TO_BUTTON :{BLACK}Go To
STR_ORDER_GO_TO_NEAREST_DEPOT :Go to nearest depot
STR_ORDER_GO_TO_NEAREST_HANGAR :Go to nearest hangar
STR_ORDER_CONDITIONAL :Conditional order jump
STR_ORDER_SHARE :Share orders
STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Insert a new order before the highlighted order, or add to end of list. Ctrl+Click on a station for 'full load any cargo', on a waypoint for 'non-stop', or on a depot for 'service'. Click on another vehicle to copy its orders or Ctrl+Click to share orders. A depot order disables automatic servicing of the vehicle
STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Insert a new order before the highlighted order, or add to end of list. {FN_KEY}+Click on a station for 'full load any cargo', on a waypoint for 'non-stop', or on a depot for 'service'. Click on another vehicle to copy its orders or {FN_KEY}+Click to share orders. A depot order disables automatic servicing of the vehicle
STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP :{BLACK}Show all vehicles that share this schedule
@ -4720,27 +4740,27 @@ STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}This tim
STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}This timetable will start in {COMMA} seconds
STR_TIMETABLE_START :{BLACK}Start Timetable
STR_TIMETABLE_START_TOOLTIP :{BLACK}Select when this timetable starts. Ctrl+Click to evenly distribute the start of all vehicles sharing this order based on their relative order, if the order is completely timetabled
STR_TIMETABLE_START_TOOLTIP :{BLACK}Select when this timetable starts. {FN_KEY}+Click to evenly distribute the start of all vehicles sharing this order based on their relative order, if the order is completely timetabled
STR_TIMETABLE_START_SECONDS_QUERY :Seconds until timetable starts
STR_TIMETABLE_CHANGE_TIME :{BLACK}Change Time
STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Change the amount of time that the highlighted order should take. Ctrl+Click to set the time for all orders
STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Change the amount of time that the highlighted order should take. {FN_KEY}+Click to set the time for all orders
STR_TIMETABLE_CLEAR_TIME :{BLACK}Clear Time
STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Clear the amount of time for the highlighted order. Ctrl+Click to clear the time for all orders
STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Clear the amount of time for the highlighted order. {FN_KEY}+Click to clear the time for all orders
STR_TIMETABLE_CHANGE_SPEED :{BLACK}Change Speed Limit
STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Change the maximum travel speed of the highlighted order. Ctrl+Click to set the speed for all orders
STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Change the maximum travel speed of the highlighted order. {FN_KEY}+Click to set the speed for all orders
STR_TIMETABLE_CLEAR_SPEED :{BLACK}Clear Speed Limit
STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Clear the maximum travel speed of the highlighted order. Ctrl+Click to clear the speed for all orders
STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Clear the maximum travel speed of the highlighted order. {FN_KEY}+Click to clear the speed for all orders
STR_TIMETABLE_RESET_LATENESS :{BLACK}Reset Late Counter
STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Reset the lateness counter, so the vehicle will be on time. Ctrl+Click to reset the entire group so the latest vehicle will be on time and all others will be early
STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Reset the lateness counter, so the vehicle will be on time. {FN_KEY}+Click to reset the entire group so the latest vehicle will be on time and all others will be early
STR_TIMETABLE_AUTOFILL :{BLACK}Autofill
STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Fill the timetable automatically with the values from the next journey. Ctrl+Click to try to keep waiting times
STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Fill the timetable automatically with the values from the next journey. {FN_KEY}+Click to try to keep waiting times
STR_TIMETABLE_EXPECTED :{BLACK}Expected
STR_TIMETABLE_SCHEDULED :{BLACK}Scheduled
@ -4777,9 +4797,9 @@ STR_AI_DEBUG_MATCH_CASE :{BLACK}Match ca
STR_AI_DEBUG_MATCH_CASE_TOOLTIP :{BLACK}Toggle matching case when comparing AI log messages against the break string
STR_AI_DEBUG_CONTINUE :{BLACK}Continue
STR_AI_DEBUG_CONTINUE_TOOLTIP :{BLACK}Unpause and continue the AI
STR_AI_DEBUG_SELECT_AI_TOOLTIP :{BLACK}View debug output of this AI. Ctrl-Click to open in a new window
STR_AI_DEBUG_SELECT_AI_TOOLTIP :{BLACK}View debug output of this AI. {FN_KEY}-Click to open in a new window
STR_AI_GAME_SCRIPT :{BLACK}Game Script
STR_AI_GAME_SCRIPT_TOOLTIP :{BLACK}Check the Game Script log. Ctrl-Click to open in a new window
STR_AI_GAME_SCRIPT_TOOLTIP :{BLACK}Check the Game Script log. {FN_KEY}-Click to open in a new window
STR_ERROR_AI_NO_AI_FOUND :No suitable AI found to load.{}This AI is a dummy AI and won't do anything.{}You can download several AIs via the 'Online Content' system
STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}One of the running scripts crashed. Please report this to the script author with a screenshot of the AI/Game Script Debug Window
@ -4808,7 +4828,7 @@ STR_AI_CONFIG_AI :{SILVER}AIs
STR_AI_CONFIG_CHANGE_AI :{BLACK}Select AI
STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}Select Game Script
STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Load another script. Ctrl+Click to show all available versions
STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Load another script. {FN_KEY}+Click to show all available versions
STR_AI_CONFIG_CONFIGURE :{BLACK}Configure
STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Configure the parameters of the Script

View File

@ -244,7 +244,7 @@ static void HandleLinkClick(Link link)
default: NOT_REACHED();
}
if (_ctrl_pressed) {
if (_fn_pressed) {
ShowExtraViewportWindow(xy);
} else {
ScrollMainWindowToTile(xy);

View File

@ -344,7 +344,7 @@ public:
{
switch (widget) {
case WID_LI_LOCATION:
if (_ctrl_pressed) {
if (_fn_pressed) {
ShowExtraViewportWindow(this->tile);
} else {
ScrollMainWindowToTile(this->tile);

View File

@ -1082,7 +1082,7 @@ struct NetworkStartServerWindow : public Window {
case WID_NSS_GENERATE_GAME: // Start game
if (!CheckServerName()) return;
_is_network_server = true;
if (_ctrl_pressed) {
if (_fn_pressed) {
StartNewGameWithoutGUI(GENERATE_NEW_SEED);
} else {
ShowGenerateLandscape();

View File

@ -1007,7 +1007,7 @@ struct SpriteAlignerWindow : Window {
if (this->offs_start_map.count(this->current_sprite) == 0) {
this->offs_start_map[this->current_sprite] = XyOffs(spr->x_offs, spr->y_offs);
}
int amt = ScaleByZoom(_ctrl_pressed ? 8 : 1, SpriteAlignerWindow::zoom);
int amt = ScaleByZoom(_fn_pressed ? 8 : 1, SpriteAlignerWindow::zoom);
switch (widget) {
/* Move eight units at a time if ctrl is pressed. */
case WID_SA_UP: spr->y_offs -= amt; break;

View File

@ -510,7 +510,7 @@ struct NewsWindow : Window {
} else {
TileIndex tile1 = GetReferenceTile(this->ni->reftype1, this->ni->ref1);
TileIndex tile2 = GetReferenceTile(this->ni->reftype2, this->ni->ref2);
if (_ctrl_pressed) {
if (_fn_pressed) {
if (tile1 != INVALID_TILE) ShowExtraViewportWindow(tile1);
if (tile2 != INVALID_TILE) ShowExtraViewportWindow(tile2);
} else {

View File

@ -553,7 +553,7 @@ public:
}
const ObjectSpec *spec = ObjectClass::Get(_selected_object_class)->GetSpec(_selected_object_index);
Command<CMD_BUILD_OBJECT_AREA>::Post(STR_ERROR_CAN_T_BUILD_OBJECT, CcPlaySound_CONSTRUCTION_OTHER,
end_tile, start_tile, spec->Index(), _selected_object_view, (_ctrl_pressed ? true : false));
end_tile, start_tile, spec->Index(), _selected_object_view, (_fn_pressed ? true : false));
}
void OnPlaceObjectAbort() override

View File

@ -388,7 +388,7 @@ static Order GetOrderCmdFromTile(const Vehicle *v, TileIndex tile)
ODTFB_PART_OF_ORDERS,
(_settings_client.gui.new_nonstop && v->IsGroundVehicle()) ? ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS : ONSF_STOP_EVERYWHERE);
if (_ctrl_pressed) order.SetDepotOrderType((OrderDepotTypeFlags)(order.GetDepotOrderType() ^ ODTFB_SERVICE));
if (_fn_pressed) order.SetDepotOrderType((OrderDepotTypeFlags)(order.GetDepotOrderType() ^ ODTFB_SERVICE));
return order;
}
@ -398,7 +398,7 @@ static Order GetOrderCmdFromTile(const Vehicle *v, TileIndex tile)
v->type == VEH_TRAIN &&
IsTileOwner(tile, _local_company)) {
order.MakeGoToWaypoint(GetStationIndex(tile));
if (_settings_client.gui.new_nonstop != _ctrl_pressed) order.SetNonStopType(ONSF_NO_STOP_AT_ANY_STATION);
if (_settings_client.gui.new_nonstop != _fn_pressed) order.SetNonStopType(ONSF_NO_STOP_AT_ANY_STATION);
return order;
}
@ -429,7 +429,7 @@ static Order GetOrderCmdFromTile(const Vehicle *v, TileIndex tile)
}
if (st->facilities & facil) {
order.MakeGoToStation(st->index);
if (_ctrl_pressed) order.SetLoadType(OLF_FULL_LOAD_ANY);
if (_fn_pressed) order.SetLoadType(OLF_FULL_LOAD_ANY);
if (_settings_client.gui.new_nonstop && v->IsGroundVehicle()) order.SetNonStopType(ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS);
order.SetStopLocation(v->type == VEH_TRAIN ? (OrderStopLocation)(_settings_client.gui.stop_location) : OSL_PLATFORM_FAR_END);
return order;
@ -689,16 +689,16 @@ private:
/**
* Handle the click on the skip button.
* If ctrl is pressed, skip to selected order, else skip to current order + 1
* If Fn is pressed, skip to selected order, else skip to current order + 1
*/
void OrderClick_Skip()
{
/* Don't skip when there's nothing to skip */
if (_ctrl_pressed && this->vehicle->cur_implicit_order_index == this->OrderGetSel()) return;
if (_fn_pressed && this->vehicle->cur_implicit_order_index == this->OrderGetSel()) return;
if (this->vehicle->GetNumOrders() <= 1) return;
Command<CMD_SKIP_TO_ORDER>::Post(_ctrl_pressed ? STR_ERROR_CAN_T_SKIP_TO_ORDER : STR_ERROR_CAN_T_SKIP_ORDER,
this->vehicle->tile, this->vehicle->index, _ctrl_pressed ? this->OrderGetSel() : ((this->vehicle->cur_implicit_order_index + 1) % this->vehicle->GetNumOrders()));
Command<CMD_SKIP_TO_ORDER>::Post(_fn_pressed ? STR_ERROR_CAN_T_SKIP_TO_ORDER : STR_ERROR_CAN_T_SKIP_ORDER,
this->vehicle->tile, this->vehicle->index, _fn_pressed ? this->OrderGetSel() : ((this->vehicle->cur_implicit_order_index + 1) % this->vehicle->GetNumOrders()));
}
/**
@ -717,7 +717,7 @@ private:
/**
* Handle the click on the 'stop sharing' button.
* If 'End of Shared Orders' isn't selected, do nothing. If Ctrl is pressed, call OrderClick_Delete and exit.
* If 'End of Shared Orders' isn't selected, do nothing. If Fn is pressed, call OrderClick_Delete and exit.
* To stop sharing this vehicle order list, we copy the orders of a vehicle that share this order list. That way we
* exit the group of shared vehicles while keeping the same order list.
*/
@ -725,8 +725,8 @@ private:
{
/* Don't try to stop sharing orders if 'End of Shared Orders' isn't selected. */
if (!this->vehicle->IsOrderListShared() || this->selected_order != this->vehicle->GetNumOrders()) return;
/* If Ctrl is pressed, delete the order list as if we clicked the 'Delete' button. */
if (_ctrl_pressed) {
/* If Fn is pressed, delete the order list as if we clicked the 'Delete' button. */
if (_fn_pressed) {
this->OrderClick_Delete();
return;
}
@ -741,13 +741,13 @@ private:
/**
* Handle the click on the refit button.
* If ctrl is pressed, cancel refitting, else show the refit window.
* If Fn is pressed, cancel refitting, else show the refit window.
* @param i Selected refit command.
* @param auto_refit Select refit for auto-refitting.
*/
void OrderClick_Refit(int i, bool auto_refit)
{
if (_ctrl_pressed) {
if (_fn_pressed) {
/* Cancel refitting */
Command<CMD_ORDER_REFIT>::Post(this->vehicle->tile, this->vehicle->index, this->OrderGetSel(), CARGO_NO_REFIT);
} else {
@ -1023,7 +1023,7 @@ public:
this->SetWidgetLoweredState(WID_O_NON_STOP, order->GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS);
}
/* Disable refit button if the order is no 'always go' order.
* However, keep the service button enabled for refit-orders to allow clearing refits (without knowing about ctrl). */
* However, keep the service button enabled for refit-orders to allow clearing refits (without knowing about Fn). */
this->SetWidgetDisabledState(WID_O_REFIT,
(order->GetDepotOrderType() & ODTFB_SERVICE) || (order->GetDepotActionType() & ODATFB_HALT) ||
(!this->can_do_refit && !order->IsRefit()));
@ -1178,7 +1178,7 @@ public:
VehicleOrderID sel = this->GetOrderFromPt(pt.y);
if (_ctrl_pressed && sel < this->vehicle->GetNumOrders()) {
if (_fn_pressed && sel < this->vehicle->GetNumOrders()) {
TileIndex xy = this->vehicle->GetOrder(sel)->GetLocation(this->vehicle);
if (xy != INVALID_TILE) ScrollMainWindowToTile(xy);
return;
@ -1463,9 +1463,9 @@ public:
/* v is vehicle getting orders. Only copy/clone orders if vehicle doesn't have any orders yet.
* We disallow copying orders of other vehicles if we already have at least one order entry
* ourself as it easily copies orders of vehicles within a station when we mean the station.
* Obviously if you press CTRL on a non-empty orders vehicle you know what you are doing
* Obviously if you press Fn on a non-empty orders vehicle you know what you are doing
* TODO: give a warning message */
bool share_order = _ctrl_pressed || this->goto_type == OPOS_SHARE;
bool share_order = _fn_pressed || this->goto_type == OPOS_SHARE;
if (this->vehicle->GetNumOrders() != 0 && !share_order) return false;
if (Command<CMD_CLONE_ORDER>::Post(share_order ? STR_ERROR_CAN_T_SHARE_ORDER_LIST : STR_ERROR_CAN_T_COPY_ORDER_LIST,
@ -1484,11 +1484,11 @@ public:
*/
bool OnVehicleSelect(VehicleList::const_iterator begin, VehicleList::const_iterator end) override
{
bool share_order = _ctrl_pressed || this->goto_type == OPOS_SHARE;
bool share_order = _fn_pressed || this->goto_type == OPOS_SHARE;
if (this->vehicle->GetNumOrders() != 0 && !share_order) return false;
if (!share_order) {
/* If CTRL is not pressed: If all the vehicles in this list have the same orders, then copy orders */
/* If Fn is not pressed: If all the vehicles in this list have the same orders, then copy orders */
if (AllEqual(begin, end, [](const Vehicle *v1, const Vehicle *v2) {
return VehiclesHaveSameOrderList(v1, v2);
})) {
@ -1497,7 +1497,7 @@ public:
ShowErrorMessage(STR_ERROR_CAN_T_COPY_ORDER_LIST, STR_ERROR_CAN_T_COPY_ORDER_VEHICLE_LIST, WL_INFO);
}
} else {
/* If CTRL is pressed: If all the vehicles in this list share orders, then copy orders */
/* If Fn is pressed: If all the vehicles in this list share orders, then copy orders */
if (AllEqual(begin, end, [](const Vehicle *v1, const Vehicle *v2) {
return v1->FirstShared() == v2->FirstShared();
})) {

View File

@ -1039,7 +1039,7 @@ CommandCost CmdBuildTrainDepot(DoCommandFlag flags, TileIndex tile, RailType rai
* @param track track-orientation
* @param sigtype type of the signal
* @param sigvar variant of signal type (normal/semaphore)
* @param ctrl_pressed true = override signal/semaphore, or pre/exit/combo signal or toggle variant (CTRL-toggle)
* @param fn_pressed true = override signal/semaphore, or pre/exit/combo signal or toggle variant (Fn-toggle)
* @param convert_signal convert the present signal type and variant
* @param cycle_start start cycle from this signal type
* @param cycle_stop wrap around after this signal type
@ -1049,12 +1049,12 @@ CommandCost CmdBuildTrainDepot(DoCommandFlag flags, TileIndex tile, RailType rai
* @return the cost of this operation or an error
* @todo p2 should be replaced by two bits for "along" and "against" the track.
*/
CommandCost CmdBuildSingleSignal(DoCommandFlag flags, TileIndex tile, Track track, SignalType sigtype, SignalVariant sigvar, bool convert_signal, bool skip_existing_signals, bool ctrl_pressed, SignalType cycle_start, SignalType cycle_stop, uint8_t num_dir_cycle, byte signals_copy)
CommandCost CmdBuildSingleSignal(DoCommandFlag flags, TileIndex tile, Track track, SignalType sigtype, SignalVariant sigvar, bool convert_signal, bool skip_existing_signals, bool fn_pressed, SignalType cycle_start, SignalType cycle_stop, uint8_t num_dir_cycle, byte signals_copy)
{
if (sigtype > SIGTYPE_LAST || sigvar > SIG_SEMAPHORE) return CMD_ERROR;
if (cycle_start > cycle_stop || cycle_stop > SIGTYPE_LAST) return CMD_ERROR;
if (ctrl_pressed) sigvar = (SignalVariant)(sigvar ^ SIG_SEMAPHORE);
if (fn_pressed) sigvar = (SignalVariant)(sigvar ^ SIG_SEMAPHORE);
/* You can only build signals on plain rail tiles, and the selected track must exist */
if (!ValParamTrackOrientation(track) || !IsPlainRailTile(tile) ||
@ -1087,7 +1087,7 @@ CommandCost CmdBuildSingleSignal(DoCommandFlag flags, TileIndex tile, Track trac
} else if (convert_signal) {
/* convert button pressed */
if (ctrl_pressed || GetSignalVariant(tile, track) != sigvar) {
if (fn_pressed || GetSignalVariant(tile, track) != sigvar) {
/* it costs money to change signal variant (light or semaphore) */
cost = CommandCost(EXPENSES_CONSTRUCTION, _price[PR_BUILD_SIGNALS] + _price[PR_CLEAR_SIGNALS]);
} else {
@ -1133,7 +1133,7 @@ CommandCost CmdBuildSingleSignal(DoCommandFlag flags, TileIndex tile, Track trac
} else {
if (convert_signal) {
/* convert signal button pressed */
if (ctrl_pressed) {
if (fn_pressed) {
/* toggle the present signal variant: SIG_ELECTRIC <-> SIG_SEMAPHORE */
SetSignalVariant(tile, track, (GetSignalVariant(tile, track) == SIG_ELECTRIC) ? SIG_SEMAPHORE : SIG_ELECTRIC);
/* Query current signal type so the check for PBS signals below works. */
@ -1147,7 +1147,7 @@ CommandCost CmdBuildSingleSignal(DoCommandFlag flags, TileIndex tile, Track trac
}
}
} else if (ctrl_pressed) {
} else if (fn_pressed) {
/* cycle between cycle_start and cycle_end */
sigtype = (SignalType)(GetSignalType(tile, track) + 1);

View File

@ -20,7 +20,7 @@ CommandCost CmdRemoveRailroadTrack(DoCommandFlag flags, TileIndex end_tile, Tile
CommandCost CmdBuildSingleRail(DoCommandFlag flags, TileIndex tile, RailType railtype, Track track, bool auto_remove_signals);
CommandCost CmdRemoveSingleRail(DoCommandFlag flags, TileIndex tile, Track track);
CommandCost CmdBuildTrainDepot(DoCommandFlag flags, TileIndex tile, RailType railtype, DiagDirection dir);
CommandCost CmdBuildSingleSignal(DoCommandFlag flags, TileIndex tile, Track track, SignalType sigtype, SignalVariant sigvar, bool convert_signal, bool skip_existing_signals, bool ctrl_pressed, SignalType cycle_start, SignalType cycle_stop, uint8_t num_dir_cycle, byte signals_copy);
CommandCost CmdBuildSingleSignal(DoCommandFlag flags, TileIndex tile, Track track, SignalType sigtype, SignalVariant sigvar, bool convert_signal, bool skip_existing_signals, bool fn_pressed, SignalType cycle_start, SignalType cycle_stop, uint8_t num_dir_cycle, byte signals_copy);
CommandCost CmdRemoveSingleSignal(DoCommandFlag flags, TileIndex tile, Track track);
CommandCost CmdConvertRail(DoCommandFlag flags, TileIndex tile, TileIndex area_start, RailType totype, bool diagonal);
CommandCost CmdBuildSignalTrack(DoCommandFlag flags, TileIndex tile, TileIndex end_tile, Track track, SignalType sigtype, SignalVariant sigvar, bool mode, bool autofill, bool minimise_gaps, byte signal_density);

View File

@ -204,7 +204,7 @@ static void PlaceRail_Station(TileIndex tile)
RailType rt = _cur_railtype;
byte numtracks = _settings_client.gui.station_numtracks;
byte platlength = _settings_client.gui.station_platlength;
bool adjacent = _ctrl_pressed;
bool adjacent = _fn_pressed;
auto proc = [=](bool test, StationID to_join) -> bool {
if (test) {
@ -246,11 +246,11 @@ static void GenericPlaceSignals(TileIndex tile)
if (FindWindowById(WC_BUILD_SIGNAL, 0) != nullptr) {
/* signal GUI is used */
Command<CMD_BUILD_SINGLE_SIGNAL>::Post(_convert_signal_button ? STR_ERROR_SIGNAL_CAN_T_CONVERT_SIGNALS_HERE : STR_ERROR_CAN_T_BUILD_SIGNALS_HERE, CcPlaySound_CONSTRUCTION_RAIL,
tile, track, _cur_signal_type, _cur_signal_variant, _convert_signal_button, false, _ctrl_pressed, cycle_start, SIGTYPE_LAST, 0, 0);
tile, track, _cur_signal_type, _cur_signal_variant, _convert_signal_button, false, _fn_pressed, cycle_start, SIGTYPE_LAST, 0, 0);
} else {
SignalVariant sigvar = TimerGameCalendar::year < _settings_client.gui.semaphore_build_before ? SIG_SEMAPHORE : SIG_ELECTRIC;
Command<CMD_BUILD_SINGLE_SIGNAL>::Post(STR_ERROR_CAN_T_BUILD_SIGNALS_HERE, CcPlaySound_CONSTRUCTION_RAIL,
tile, track, _settings_client.gui.default_signal_type, sigvar, false, false, _ctrl_pressed, cycle_start, SIGTYPE_LAST, 0, 0);
tile, track, _settings_client.gui.default_signal_type, sigvar, false, false, _fn_pressed, cycle_start, SIGTYPE_LAST, 0, 0);
}
}
@ -294,39 +294,6 @@ static void ToggleRailButton_Remove(Window *w)
w->SetWidgetDirty(WID_RAT_REMOVE);
_remove_button_clicked = w->IsWidgetLowered(WID_RAT_REMOVE);
SetSelectionRed(_remove_button_clicked);
}
/**
* Updates the Remove button because of Ctrl state change
* @param w window the button belongs to
* @return true iff the remove button was changed
*/
static bool RailToolbar_CtrlChanged(Window *w)
{
if (w->IsWidgetDisabled(WID_RAT_REMOVE)) return false;
/* allow ctrl to switch remove mode only for these widgets */
for (WidgetID i = WID_RAT_BUILD_NS; i <= WID_RAT_BUILD_STATION; i++) {
if ((i <= WID_RAT_AUTORAIL || i >= WID_RAT_BUILD_WAYPOINT) && w->IsWidgetLowered(i)) {
ToggleRailButton_Remove(w);
return true;
}
}
return false;
}
/**
* The "remove"-button click proc of the build-rail toolbar.
* @param w Build-rail toolbar window
* @see BuildRailToolbarWindow::OnClick()
*/
static void BuildRailClick_Remove(Window *w)
{
if (w->IsWidgetDisabled(WID_RAT_REMOVE)) return;
ToggleRailButton_Remove(w);
if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
/* handle station builder */
if (w->IsWidgetLowered(WID_RAT_BUILD_STATION)) {
@ -351,6 +318,38 @@ static void BuildRailClick_Remove(Window *w)
}
}
/**
* Updates the Remove button because of remove modifer state change
* @param w window the button belongs to
* @return true iff the remove button was changed
*/
static bool RailToolbar_RemoveChanged(Window *w)
{
if (w->IsWidgetDisabled(WID_RAT_REMOVE)) return false;
for (WidgetID i = WID_RAT_BUILD_NS; i <= WID_RAT_BUILD_SIGNALS; i++) {
if (w->IsWidgetLowered(i)) {
ToggleRailButton_Remove(w);
return true;
}
}
return false;
}
/**
* The "remove"-button click proc of the build-rail toolbar.
* @param w Build-rail toolbar window
* @see BuildRailToolbarWindow::OnClick()
*/
static void BuildRailClick_Remove(Window *w)
{
if (w->IsWidgetDisabled(WID_RAT_REMOVE)) return;
ToggleRailButton_Remove(w);
if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
}
static void DoRailroadTrack(Track track)
{
if (_remove_button_clicked) {
@ -393,13 +392,13 @@ static void HandleAutoSignalPlacement()
* in a network game can specify their own signal density */
if (_remove_button_clicked) {
Command<CMD_REMOVE_SIGNAL_TRACK>::Post(STR_ERROR_CAN_T_REMOVE_SIGNALS_FROM, CcPlaySound_CONSTRUCTION_RAIL,
TileVirtXY(_thd.selstart.x, _thd.selstart.y), TileVirtXY(_thd.selend.x, _thd.selend.y), track, _ctrl_pressed);
TileVirtXY(_thd.selstart.x, _thd.selstart.y), TileVirtXY(_thd.selend.x, _thd.selend.y), track, _fn_pressed);
} else {
bool sig_gui = FindWindowById(WC_BUILD_SIGNAL, 0) != nullptr;
SignalType sigtype = sig_gui ? _cur_signal_type : _settings_client.gui.default_signal_type;
SignalVariant sigvar = sig_gui ? _cur_signal_variant : (TimerGameCalendar::year < _settings_client.gui.semaphore_build_before ? SIG_SEMAPHORE : SIG_ELECTRIC);
Command<CMD_BUILD_SIGNAL_TRACK>::Post(STR_ERROR_CAN_T_BUILD_SIGNALS_HERE, CcPlaySound_CONSTRUCTION_RAIL,
TileVirtXY(_thd.selstart.x, _thd.selstart.y), TileVirtXY(_thd.selend.x, _thd.selend.y), track, sigtype, sigvar, false, _ctrl_pressed, !_settings_client.gui.drag_signals_fixed_distance, _settings_client.gui.drag_signals_density);
TileVirtXY(_thd.selstart.x, _thd.selstart.y), TileVirtXY(_thd.selend.x, _thd.selend.y), track, sigtype, sigvar, false, _fn_pressed, !_settings_client.gui.drag_signals_fixed_distance, _settings_client.gui.drag_signals_density);
}
}
@ -596,7 +595,7 @@ struct BuildRailToolbarWindow : Window {
case WID_RAT_BUILD_SIGNALS: {
this->last_user_action = widget;
bool started = HandlePlacePushButton(this, WID_RAT_BUILD_SIGNALS, ANIMCURSOR_BUILDSIGNALS, HT_RECT);
if (started != _ctrl_pressed) {
if (started != _fn_pressed) {
ShowSignalBuilder(this);
}
break;
@ -624,7 +623,7 @@ struct BuildRailToolbarWindow : Window {
default: NOT_REACHED();
}
this->UpdateRemoveWidgetStatus(widget);
if (_ctrl_pressed) RailToolbar_CtrlChanged(this);
if (_remove_pressed) RailToolbar_RemoveChanged(this);
}
EventState OnHotkey(int hotkey) override
@ -723,7 +722,7 @@ struct BuildRailToolbarWindow : Window {
break;
case DDSP_CONVERT_RAIL:
Command<CMD_CONVERT_RAIL>::Post(STR_ERROR_CAN_T_CONVERT_RAIL, CcPlaySound_CONSTRUCTION_RAIL, end_tile, start_tile, _cur_railtype, _ctrl_pressed);
Command<CMD_CONVERT_RAIL>::Post(STR_ERROR_CAN_T_CONVERT_RAIL, CcPlaySound_CONSTRUCTION_RAIL, end_tile, start_tile, _cur_railtype, _fn_pressed);
break;
case DDSP_REMOVE_STATION:
@ -731,7 +730,7 @@ struct BuildRailToolbarWindow : Window {
if (this->IsWidgetLowered(WID_RAT_BUILD_STATION)) {
/* Station */
if (_remove_button_clicked) {
bool keep_rail = !_ctrl_pressed;
bool keep_rail = !_fn_pressed;
Command<CMD_REMOVE_FROM_RAIL_STATION>::Post(STR_ERROR_CAN_T_REMOVE_PART_OF_STATION, CcPlaySound_CONSTRUCTION_RAIL, end_tile, start_tile, keep_rail);
} else {
HandleStationPlacement(start_tile, end_tile);
@ -739,12 +738,12 @@ struct BuildRailToolbarWindow : Window {
} else {
/* Waypoint */
if (_remove_button_clicked) {
bool keep_rail = !_ctrl_pressed;
bool keep_rail = !_fn_pressed;
Command<CMD_REMOVE_FROM_RAIL_WAYPOINT>::Post(STR_ERROR_CAN_T_REMOVE_TRAIN_WAYPOINT, CcPlaySound_CONSTRUCTION_RAIL, end_tile, start_tile, keep_rail);
} else {
TileArea ta(start_tile, end_tile);
Axis axis = select_method == VPM_X_LIMITED ? AXIS_X : AXIS_Y;
bool adjacent = _ctrl_pressed;
bool adjacent = _fn_pressed;
uint16_t waypoint_type = _cur_waypoint_type;
auto proc = [=](bool test, StationID to_join) -> bool {
@ -786,10 +785,9 @@ struct BuildRailToolbarWindow : Window {
VpSetPresizeRange(tile, _build_tunnel_endtile == 0 ? tile : _build_tunnel_endtile);
}
EventState OnCTRLStateChange() override
EventState OnRemoveStateChange() override
{
/* do not toggle Remove button by Ctrl when placing station */
if (!this->IsWidgetLowered(WID_RAT_BUILD_STATION) && !this->IsWidgetLowered(WID_RAT_BUILD_WAYPOINT) && RailToolbar_CtrlChanged(this)) return ES_HANDLED;
if (RailToolbar_RemoveChanged(this)) return ES_HANDLED;
return ES_NOT_HANDLED;
}
@ -912,7 +910,7 @@ static void HandleStationPlacement(TileIndex start, TileIndex end)
RailStationGUISettings params = _railstation;
RailType rt = _cur_railtype;
bool adjacent = _ctrl_pressed;
bool adjacent = _fn_pressed;
auto proc = [=](bool test, StationID to_join) -> bool {
if (test) {

View File

@ -285,16 +285,15 @@ static void ToggleRoadButton_Remove(Window *w)
}
/**
* Updates the Remove button because of Ctrl state change
* Updates the Remove button because of remove modifer state change
* @param w window the button belongs to
* @return true iff the remove button was changed
*/
static bool RoadToolbar_CtrlChanged(Window *w)
static bool RoadToolbar_RemoveChanged(Window *w)
{
if (w->IsWidgetDisabled(WID_ROT_REMOVE)) return false;
/* allow ctrl to switch remove mode only for these widgets */
for (WidgetID i = WID_ROT_ROAD_X; i <= WID_ROT_AUTOROAD; i++) {
for (WidgetID i = WID_ROT_ROAD_X; i <= WID_ROT_TRUCK_STATION; i++) {
if (w->IsWidgetLowered(i)) {
ToggleRoadButton_Remove(w);
return true;
@ -549,7 +548,7 @@ struct BuildRoadToolbarWindow : Window {
default: NOT_REACHED();
}
this->UpdateOptionWidgetStatus((RoadToolbarWidgets)widget);
if (_ctrl_pressed) RoadToolbar_CtrlChanged(this);
if (_remove_pressed) RoadToolbar_RemoveChanged(this);
}
EventState OnHotkey(int hotkey) override
@ -709,9 +708,9 @@ struct BuildRoadToolbarWindow : Window {
if (this->IsWidgetLowered(WID_ROT_BUS_STATION) && GetIfClassHasNewStopsByType(RoadStopClass::Get(_roadstop_gui_settings.roadstop_class), ROADSTOP_BUS, _cur_roadtype)) {
if (_remove_button_clicked) {
TileArea ta(start_tile, end_tile);
Command<CMD_REMOVE_ROAD_STOP>::Post(this->rti->strings.err_remove_station[ROADSTOP_BUS], CcPlaySound_CONSTRUCTION_OTHER, ta.tile, ta.w, ta.h, ROADSTOP_BUS, _ctrl_pressed);
Command<CMD_REMOVE_ROAD_STOP>::Post(this->rti->strings.err_remove_station[ROADSTOP_BUS], CcPlaySound_CONSTRUCTION_OTHER, ta.tile, ta.w, ta.h, ROADSTOP_BUS, _fn_pressed);
} else {
PlaceRoadStop(start_tile, end_tile, ROADSTOP_BUS, _ctrl_pressed, _cur_roadtype, this->rti->strings.err_build_station[ROADSTOP_BUS]);
PlaceRoadStop(start_tile, end_tile, ROADSTOP_BUS, _fn_pressed, _cur_roadtype, this->rti->strings.err_build_station[ROADSTOP_BUS]);
}
}
break;
@ -721,9 +720,9 @@ struct BuildRoadToolbarWindow : Window {
if (this->IsWidgetLowered(WID_ROT_TRUCK_STATION) && GetIfClassHasNewStopsByType(RoadStopClass::Get(_roadstop_gui_settings.roadstop_class), ROADSTOP_TRUCK, _cur_roadtype)) {
if (_remove_button_clicked) {
TileArea ta(start_tile, end_tile);
Command<CMD_REMOVE_ROAD_STOP>::Post(this->rti->strings.err_remove_station[ROADSTOP_TRUCK], CcPlaySound_CONSTRUCTION_OTHER, ta.tile, ta.w, ta.h, ROADSTOP_TRUCK, _ctrl_pressed);
Command<CMD_REMOVE_ROAD_STOP>::Post(this->rti->strings.err_remove_station[ROADSTOP_TRUCK], CcPlaySound_CONSTRUCTION_OTHER, ta.tile, ta.w, ta.h, ROADSTOP_TRUCK, _fn_pressed);
} else {
PlaceRoadStop(start_tile, end_tile, ROADSTOP_TRUCK, _ctrl_pressed, _cur_roadtype, this->rti->strings.err_build_station[ROADSTOP_TRUCK]);
PlaceRoadStop(start_tile, end_tile, ROADSTOP_TRUCK, _fn_pressed, _cur_roadtype, this->rti->strings.err_build_station[ROADSTOP_TRUCK]);
}
}
break;
@ -741,9 +740,9 @@ struct BuildRoadToolbarWindow : Window {
VpSetPresizeRange(tile, _build_tunnel_endtile == 0 ? tile : _build_tunnel_endtile);
}
EventState OnCTRLStateChange() override
EventState OnRemoveStateChange() override
{
if (RoadToolbar_CtrlChanged(this)) return ES_HANDLED;
if (RoadToolbar_RemoveChanged(this)) return ES_HANDLED;
return ES_NOT_HANDLED;
}

View File

@ -1042,12 +1042,12 @@ struct ScriptDebugWindow : public Window {
/* Check which button is clicked */
if (IsInsideMM(widget, WID_SCRD_COMPANY_BUTTON_START, WID_SCRD_COMPANY_BUTTON_END + 1)) {
ChangeToScript((CompanyID)(widget - WID_SCRD_COMPANY_BUTTON_START), _ctrl_pressed);
ChangeToScript((CompanyID)(widget - WID_SCRD_COMPANY_BUTTON_START), _fn_pressed);
}
switch (widget) {
case WID_SCRD_SCRIPT_GAME:
ChangeToScript(OWNER_DEITY, _ctrl_pressed);
ChangeToScript(OWNER_DEITY, _fn_pressed);
break;
case WID_SCRD_RELOAD_TOGGLE:

View File

@ -785,7 +785,7 @@ struct GameOptionsWindow : Window {
case WID_GO_GUI_SCALE:
if (ClickSliderWidget(this->GetWidget<NWidgetBase>(widget)->GetCurrentRect(), pt, MIN_INTERFACE_SCALE, MAX_INTERFACE_SCALE, this->gui_scale)) {
if (!_ctrl_pressed) this->gui_scale = ((this->gui_scale + 12) / 25) * 25;
if (!_fn_pressed) this->gui_scale = ((this->gui_scale + 12) / 25) * 25;
this->SetWidgetDirty(widget);
}
@ -2041,6 +2041,9 @@ static SettingsContainer &GetSettingsTree()
interface->Add(new SettingEntry("gui.timetable_arrival_departure"));
interface->Add(new SettingEntry("gui.show_newgrf_name"));
interface->Add(new SettingEntry("gui.show_cargo_in_vehicle_lists"));
viewports->Add(new SettingEntry("gui.fn_modifier"));
viewports->Add(new SettingEntry("gui.remove_modifier"));
viewports->Add(new SettingEntry("gui.estimate_modifier"));
}
SettingsPage *advisors = main->Add(new SettingsPage(STR_CONFIG_SETTING_ADVISORS));

View File

@ -483,6 +483,33 @@ static bool CheckMaxHeightLevel(int32_t &new_value)
return true;
}
static bool CheckModifier(int32_t new_value, ModifierKey other1, ModifierKey other2)
{
ModifierKey key = (ModifierKey)new_value;
if (key == ModifierKey::None) return true;
if (other1 == key || other2 == key) {
ShowErrorMessage(STR_CONFIG_SETTING_MODIFIER_ALREADY_IN_USE, INVALID_STRING_ID, WL_ERROR);
return false;
}
return true;
}
static bool CheckFnModifier(int32_t &new_value)
{
return CheckModifier(new_value, _settings_client.gui.remove_modifier, _settings_client.gui.estimate_modifier);
}
static bool CheckRemoveModifier(int32_t &new_value)
{
return CheckModifier(new_value, _settings_client.gui.fn_modifier, _settings_client.gui.estimate_modifier);
}
static bool CheckEstimateModifier(int32_t &new_value)
{
return CheckModifier(new_value, _settings_client.gui.fn_modifier, _settings_client.gui.remove_modifier);
}
static void StationCatchmentChanged(int32_t)
{
Station::RecomputeCatchmentForAll();

View File

@ -23,6 +23,7 @@
#include "rail_gui.h"
#include "signal_type.h"
#include "timetable.h"
#include "gfx_type.h"
/* Used to validate sizes of "max" value in settings. */
const size_t MAX_SLE_UINT8 = UINT8_MAX;
@ -220,6 +221,9 @@ struct GUISettings {
uint8_t newgrf_default_palette; ///< default palette to use for NewGRFs without action 14 palette information
bool scale_bevels; ///< bevels are scaled with GUI scale.
ModifierKey fn_modifier; ///< function modifier key
ModifierKey remove_modifier; ///< remove modifier key
ModifierKey estimate_modifier; ///< estimate modifier key
/**
* Returns true when the user has sufficient privileges to edit newgrfs on a running game

View File

@ -489,7 +489,7 @@ struct SignWindow : Window, SignList {
case WID_QES_LOCATION: {
const Sign *si = Sign::Get(this->cur_sign);
TileIndex tile = TileVirtXY(si->x, si->y);
if (_ctrl_pressed) {
if (_fn_pressed) {
ShowExtraViewportWindow(tile);
} else {
ScrollMainWindowToTile(tile);
@ -565,7 +565,7 @@ void HandleClickOnSign(const Sign *si)
/* If we can't rename the sign, don't even open the rename GUI. */
if (!CompanyCanRenameSign(si)) return;
if (_ctrl_pressed && (si->owner == _local_company || (si->owner == OWNER_DEITY && _game_mode == GM_EDITOR))) {
if (_fn_pressed && (si->owner == _local_company || (si->owner == OWNER_DEITY && _game_mode == GM_EDITOR))) {
RenameSign(si->index, "");
return;
}

View File

@ -792,7 +792,7 @@ protected:
*/
void SelectLegendItem(int click_pos, LegendAndColour *legend, int end_legend_item, int begin_legend_item = 0)
{
if (_ctrl_pressed) {
if (_fn_pressed) {
/* Disable all, except the clicked one */
bool changes = false;
for (int i = begin_legend_item; i != end_legend_item; i++) {

View File

@ -84,7 +84,7 @@ template <typename T>
void FindStationsAroundSelection()
{
/* With distant join we don't know which station will be selected, so don't show any */
if (_ctrl_pressed) {
if (_fn_pressed) {
SetViewportCatchmentSpecializedStation<T>(nullptr, true);
return;
}
@ -125,11 +125,11 @@ void FindStationsAroundSelection()
*/
void CheckRedrawStationCoverage(const Window *w)
{
/* Test if ctrl state changed */
static bool _last_ctrl_pressed;
if (_ctrl_pressed != _last_ctrl_pressed) {
/* Test if fn modifer state changed */
static bool _last_fn_pressed;
if (_fn_pressed != _last_fn_pressed) {
_thd.dirty = 0xff;
_last_ctrl_pressed = _ctrl_pressed;
_last_fn_pressed = _fn_pressed;
}
if (_thd.dirty & 1) {
@ -145,10 +145,10 @@ void CheckRedrawStationCoverage(const Window *w)
void CheckRedrawWaypointCoverage(const Window *)
{
/* Test if ctrl state changed */
static bool _last_ctrl_pressed;
if (_ctrl_pressed != _last_ctrl_pressed) {
static bool _last_fn_pressed;
if (_fn_pressed != _last_fn_pressed) {
_thd.dirty = 0xff;
_last_ctrl_pressed = _ctrl_pressed;
_last_fn_pressed = _fn_pressed;
}
if (_thd.dirty & 1) {
@ -544,7 +544,7 @@ public:
/* do not check HasStationInUse - it is slow and may be invalid */
assert(st->owner == (Owner)this->window_number || st->owner == OWNER_NONE);
if (_ctrl_pressed) {
if (_fn_pressed) {
ShowExtraViewportWindow(st->xy);
} else {
ScrollMainWindowToTile(st->xy);
@ -557,7 +557,7 @@ public:
case WID_STL_BUS:
case WID_STL_AIRPLANE:
case WID_STL_SHIP:
if (_ctrl_pressed) {
if (_fn_pressed) {
ToggleBit(this->filter.facilities, widget - WID_STL_TRAIN);
this->ToggleWidgetLoweredState(widget);
} else {
@ -604,7 +604,7 @@ public:
break;
case WID_STL_NOCARGOWAITING:
if (_ctrl_pressed) {
if (_fn_pressed) {
this->filter.include_empty = !this->filter.include_empty;
this->ToggleWidgetLoweredState(WID_STL_NOCARGOWAITING);
} else {
@ -626,8 +626,9 @@ public:
/* Determine the selected cargo type */
const CargoSpec *cs = _sorted_cargo_specs[widget - WID_STL_CARGOSTART];
if (_ctrl_pressed) {
if (_fn_pressed) {
ToggleBit(this->filter.cargoes, cs->Index());
this->ToggleWidgetLoweredState(widget);
} else {
for (uint i = 0; i < _sorted_standard_cargo_specs.size(); i++) {
@ -1901,7 +1902,7 @@ struct StationViewWindow : public Window {
void HandleCargoWaitingClick(int row)
{
if (row < 0 || (uint)row >= this->displayed_rows.size()) return;
if (_ctrl_pressed) {
if (_fn_pressed) {
this->scroll_to_row = row;
} else {
RowDisplay &display = this->displayed_rows[row];
@ -1926,7 +1927,7 @@ struct StationViewWindow : public Window {
break;
case WID_SV_LOCATION:
if (_ctrl_pressed) {
if (_fn_pressed) {
ShowExtraViewportWindow(Station::Get(this->window_number)->xy);
} else {
ScrollMainWindowToTile(Station::Get(this->window_number)->xy);
@ -2423,7 +2424,7 @@ static bool StationJoinerNeeded(TileArea ta, const StationPickerCmdProc &proc)
}
/* only show the popup, if we press ctrl */
if (!_ctrl_pressed) return false;
if (!_fn_pressed) return false;
/* Now check if we could build there */
if (!proc(true, INVALID_STATION)) return false;

View File

@ -542,7 +542,7 @@ protected:
break;
case SPET_LOCATION:
if (_ctrl_pressed) {
if (_fn_pressed) {
ShowExtraViewportWindow((TileIndex)pe.referenced_id);
} else {
ScrollMainWindowToTile((TileIndex)pe.referenced_id);

View File

@ -566,6 +566,12 @@ static void FormatGenericCurrency(StringBuilder &builder, const CurrencySpec *sp
}
}
static void FormatModifierKey(StringBuilder &builder, ModifierKey key)
{
auto tmp_params = MakeParameters();
return FormatString(builder, GetStringPtr(STR_MODIFIER_KEY_UNASSIGNED + key), tmp_params);
}
/**
* Determine the "plural" index given a plural form and a number.
* @param count The number to get the plural index of.
@ -1705,6 +1711,21 @@ static void FormatString(StringBuilder &builder, const char *str_arg, StringPara
break;
}
case SCC_FN_KEY: { // {FN_KEY}
FormatModifierKey(builder, _settings_client.gui.fn_modifier);
break;
}
case SCC_REMOVE_KEY: { // {REMOVE_KEY}
FormatModifierKey(builder, _settings_client.gui.remove_modifier);
break;
}
case SCC_ESTIMATE_KEY: { // {ESTIMATE_KEY}
FormatModifierKey(builder, _settings_client.gui.estimate_modifier);
break;
}
default:
builder.Utf8Encode(b);
break;

View File

@ -82,8 +82,8 @@ struct SubsidyListWindow : Window {
default: NOT_REACHED();
}
if (_ctrl_pressed || !ScrollMainWindowToTile(xy)) {
if (_ctrl_pressed) ShowExtraViewportWindow(xy);
if (_fn_pressed || !ScrollMainWindowToTile(xy)) {
if (_fn_pressed) ShowExtraViewportWindow(xy);
/* otherwise determine dst coordinate for subsidy and scroll to it */
switch (s->dst_type) {
@ -92,7 +92,7 @@ struct SubsidyListWindow : Window {
default: NOT_REACHED();
}
if (_ctrl_pressed) {
if (_fn_pressed) {
ShowExtraViewportWindow(xy);
} else {
ScrollMainWindowToTile(xy);

View File

@ -101,6 +101,11 @@ enum StringControlCode {
SCC_SET_CASE,
SCC_SWITCH_CASE,
/* Modifier keys */
SCC_FN_KEY,
SCC_REMOVE_KEY,
SCC_ESTIMATE_KEY,
/* Colour codes */
SCC_BLUE,
SCC_SILVER,

View File

@ -16,10 +16,14 @@ static void InvalidateCompanyLiveryWindow(int32_t new_value);
static void InvalidateNewGRFChangeWindows(int32_t new_value);
static void ZoomMinMaxChanged(int32_t new_value);
static void SpriteZoomMinChanged(int32_t new_value);
static bool CheckFnModifier(int32_t &new_value);
static bool CheckRemoveModifier(int32_t &new_value);
static bool CheckEstimateModifier(int32_t &new_value);
static constexpr std::initializer_list<const char*> _osk_activation{"disabled", "double", "single", "immediately"};
static constexpr std::initializer_list<const char*> _savegame_date{"long", "short", "iso"};
static constexpr std::initializer_list<const char*> _right_click_close{"no", "yes", "except sticky"};
static constexpr std::initializer_list<const char*> _mod_keys{"none", "shift", "ctrl", "alt"};
static const SettingVariant _gui_settings_table[] = {
[post-amble]
@ -903,3 +907,44 @@ post_cb = [](auto) { SetupWidgetDimensions(); ReInitAllWindows(true); }
cat = SC_BASIC
startup = true
[SDTC_OMANY]
var = gui.fn_modifier
type = SLE_UINT8
flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
full = _mod_keys
def = 2
min = 0
max = 3
str = STR_CONFIG_SETTING_MODIFIER_FN
strhelp = STR_CONFIG_SETTING_MODIFIER_FN_HELPTEXT
strval = STR_CONFIG_SETTING_MODIFIER_NONE
pre_cb = CheckFnModifier
cat = SC_ADVANCED
[SDTC_OMANY]
var = gui.remove_modifier
type = SLE_UINT8
flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
full = _mod_keys
def = 3
min = 0
max = 3
str = STR_CONFIG_SETTING_MODIFIER_REMOVE
strhelp = STR_CONFIG_SETTING_MODIFIER_REMOVE_HELPTEXT
strval = STR_CONFIG_SETTING_MODIFIER_NONE
pre_cb = CheckRemoveModifier
cat = SC_ADVANCED
[SDTC_OMANY]
var = gui.estimate_modifier
type = SLE_UINT8
flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
full = _mod_keys
def = 1
min = 0
max = 3
str = STR_CONFIG_SETTING_MODIFIER_ESTIMATE
strhelp = STR_CONFIG_SETTING_MODIFIER_ESTIMATE_HELPTEXT
strval = STR_CONFIG_SETTING_MODIFIER_NONE
pre_cb = CheckEstimateModifier
cat = SC_ADVANCED

View File

@ -155,6 +155,11 @@ static const CmdStruct _cmd_structs[] = {
{"LRO", EmitSingleChar, CHAR_TD_LRO, 0, -1, C_DONTCOUNT},
{"RLO", EmitSingleChar, CHAR_TD_RLO, 0, -1, C_DONTCOUNT},
{"PDF", EmitSingleChar, CHAR_TD_PDF, 0, -1, C_DONTCOUNT},
/* Control codes to insert the name of a modifier key. */
{"FN_KEY", EmitSingleChar, SCC_FN_KEY, 0, -1, C_NONE},
{"REMOVE_KEY", EmitSingleChar, SCC_REMOVE_KEY, 0, -1, C_NONE},
{"ESTIMATE_KEY", EmitSingleChar, SCC_ESTIMATE_KEY, 0, -1, C_NONE},
};
/** Description of a plural form */

View File

@ -63,7 +63,7 @@ static void GenerateDesertArea(TileIndex end, TileIndex start)
TileArea ta(start, end);
for (TileIndex tile : ta) {
SetTropicZone(tile, (_ctrl_pressed) ? TROPICZONE_NORMAL : TROPICZONE_DESERT);
SetTropicZone(tile, (_remove_pressed) ? TROPICZONE_NORMAL : TROPICZONE_DESERT);
Command<CMD_LANDSCAPE_CLEAR>::Post(tile);
MarkTileDirtyByTile(tile);
}
@ -119,16 +119,16 @@ bool GUIPlaceProcDragXY(ViewportDragDropSelectionProcess proc, TileIndex start_t
switch (proc) {
case DDSP_DEMOLISH_AREA:
Command<CMD_CLEAR_AREA>::Post(STR_ERROR_CAN_T_CLEAR_THIS_AREA, CcPlaySound_EXPLOSION, end_tile, start_tile, _ctrl_pressed);
Command<CMD_CLEAR_AREA>::Post(STR_ERROR_CAN_T_CLEAR_THIS_AREA, CcPlaySound_EXPLOSION, end_tile, start_tile, _fn_pressed);
break;
case DDSP_RAISE_AND_LEVEL_AREA:
Command<CMD_LEVEL_LAND>::Post(STR_ERROR_CAN_T_RAISE_LAND_HERE, CcTerraform, end_tile, start_tile, _ctrl_pressed, LM_RAISE);
Command<CMD_LEVEL_LAND>::Post(STR_ERROR_CAN_T_RAISE_LAND_HERE, CcTerraform, end_tile, start_tile, _fn_pressed, LM_RAISE);
break;
case DDSP_LOWER_AND_LEVEL_AREA:
Command<CMD_LEVEL_LAND>::Post(STR_ERROR_CAN_T_LOWER_LAND_HERE, CcTerraform, end_tile, start_tile, _ctrl_pressed, LM_LOWER);
Command<CMD_LEVEL_LAND>::Post(STR_ERROR_CAN_T_LOWER_LAND_HERE, CcTerraform, end_tile, start_tile, _fn_pressed, LM_LOWER);
break;
case DDSP_LEVEL_AREA:
Command<CMD_LEVEL_LAND>::Post(STR_ERROR_CAN_T_LEVEL_LAND_HERE, CcTerraform, end_tile, start_tile, _ctrl_pressed, LM_LEVEL);
Command<CMD_LEVEL_LAND>::Post(STR_ERROR_CAN_T_LEVEL_LAND_HERE, CcTerraform, end_tile, start_tile, _fn_pressed, LM_LEVEL);
break;
case DDSP_CREATE_ROCKS:
GenerateRockyArea(end_tile, start_tile);
@ -284,7 +284,7 @@ struct TerraformToolbarWindow : Window {
if (TileY(end_tile) == Map::MaxY()) end_tile += TileDiffXY(0, -1);
}
Command<CMD_BUILD_OBJECT_AREA>::Post(STR_ERROR_CAN_T_PURCHASE_THIS_LAND, CcPlaySound_CONSTRUCTION_RAIL,
end_tile, start_tile, OBJECT_OWNED_LAND, 0, (_ctrl_pressed ? true : false));
end_tile, start_tile, OBJECT_OWNED_LAND, 0, (_fn_pressed ? true : false));
break;
}
}

View File

@ -204,8 +204,8 @@ struct TimetableWindow : Window {
const Vehicle *vehicle; ///< Vehicle monitored by the window.
bool show_expected; ///< Whether we show expected arrival or scheduled.
Scrollbar *vscroll; ///< The scrollbar.
bool set_start_date_all; ///< Set start date using minutes text entry for all timetable entries (ctrl-click) action.
bool change_timetable_all; ///< Set wait time or speed for all timetable entries (ctrl-click) action.
bool set_start_date_all; ///< Set start date using minutes text entry for all timetable entries (Fn-click) action.
bool change_timetable_all; ///< Set wait time or speed for all timetable entries (Fn-click) action.
TimetableWindow(WindowDesc *desc, WindowNumber window_number) :
Window(desc),
@ -646,10 +646,10 @@ struct TimetableWindow : Window {
case WID_VT_START_DATE: // Change the date that the timetable starts.
if (_settings_client.gui.timetable_mode == TimetableMode::Seconds) {
this->query_widget = WID_VT_START_DATE;
this->change_timetable_all = _ctrl_pressed;
this->change_timetable_all = _fn_pressed;
ShowQueryString(STR_EMPTY, STR_TIMETABLE_START_SECONDS_QUERY, 6, this, CS_NUMERAL, QSF_ACCEPT_UNCHANGED);
} else {
ShowSetDateWindow(this, v->index, TimerGameEconomy::date, TimerGameEconomy::year, TimerGameEconomy::year + MAX_TIMETABLE_START_YEARS, ChangeTimetableStartCallback, reinterpret_cast<void*>(static_cast<uintptr_t>(_ctrl_pressed)));
ShowSetDateWindow(this, v->index, TimerGameEconomy::date, TimerGameEconomy::year, TimerGameEconomy::year + MAX_TIMETABLE_START_YEARS, ChangeTimetableStartCallback, reinterpret_cast<void*>(static_cast<uintptr_t>(_fn_pressed)));
}
break;
@ -673,7 +673,7 @@ struct TimetableWindow : Window {
}
}
this->change_timetable_all = _ctrl_pressed && (order != nullptr);
this->change_timetable_all = _fn_pressed && (order != nullptr);
ShowQueryString(current, STR_TIMETABLE_CHANGE_TIME, 31, this, CS_NUMERAL, QSF_ACCEPT_UNCHANGED);
break;
}
@ -694,14 +694,14 @@ struct TimetableWindow : Window {
}
}
this->change_timetable_all = _ctrl_pressed && (order != nullptr);
this->change_timetable_all = _fn_pressed && (order != nullptr);
ShowQueryString(current, STR_TIMETABLE_CHANGE_SPEED, 31, this, CS_NUMERAL, QSF_NONE);
break;
}
case WID_VT_CLEAR_TIME: { // Clear waiting time.
auto [order_id, mtf] = PackTimetableArgs(v, this->sel_index, false);
if (_ctrl_pressed) {
if (_fn_pressed) {
Command<CMD_BULK_CHANGE_TIMETABLE>::Post(STR_ERROR_CAN_T_TIMETABLE_VEHICLE, v->index, mtf, 0);
} else {
Command<CMD_CHANGE_TIMETABLE>::Post(STR_ERROR_CAN_T_TIMETABLE_VEHICLE, v->index, order_id, mtf, 0);
@ -711,7 +711,7 @@ struct TimetableWindow : Window {
case WID_VT_CLEAR_SPEED: { // Clear max speed button.
auto [order_id, mtf] = PackTimetableArgs(v, this->sel_index, true);
if (_ctrl_pressed) {
if (_fn_pressed) {
Command<CMD_BULK_CHANGE_TIMETABLE>::Post(STR_ERROR_CAN_T_TIMETABLE_VEHICLE, v->index, mtf, UINT16_MAX);
} else {
Command<CMD_CHANGE_TIMETABLE>::Post(STR_ERROR_CAN_T_TIMETABLE_VEHICLE, v->index, order_id, mtf, UINT16_MAX);
@ -720,11 +720,11 @@ struct TimetableWindow : Window {
}
case WID_VT_RESET_LATENESS: // Reset the vehicle's late counter.
Command<CMD_SET_VEHICLE_ON_TIME>::Post(STR_ERROR_CAN_T_TIMETABLE_VEHICLE, v->index, _ctrl_pressed);
Command<CMD_SET_VEHICLE_ON_TIME>::Post(STR_ERROR_CAN_T_TIMETABLE_VEHICLE, v->index, _fn_pressed);
break;
case WID_VT_AUTOFILL: { // Autofill the timetable.
Command<CMD_AUTOFILL_TIMETABLE>::Post(STR_ERROR_CAN_T_TIMETABLE_VEHICLE, v->index, !HasBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE), _ctrl_pressed);
Command<CMD_AUTOFILL_TIMETABLE>::Post(STR_ERROR_CAN_T_TIMETABLE_VEHICLE, v->index, !HasBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE), _fn_pressed);
break;
}

View File

@ -1133,7 +1133,7 @@ static CallBackFunction MenuClickHelp(int index)
case 0: return PlaceLandBlockInfo();
case 1: ShowHelpWindow(); break;
case 2: IConsoleSwitch(); break;
case 3: ShowScriptDebugWindow(INVALID_COMPANY, _ctrl_pressed); break;
case 3: ShowScriptDebugWindow(INVALID_COMPANY, _fn_pressed); break;
case 4: ShowScreenshotWindow(); break;
case 5: ShowFramerateWindow(); break;
case 6: ShowAboutWindow(); break;

View File

@ -493,7 +493,7 @@ public:
{
switch (widget) {
case WID_TV_CENTER_VIEW: // scroll to location
if (_ctrl_pressed) {
if (_fn_pressed) {
ShowExtraViewportWindow(this->town->xy);
} else {
ScrollMainWindowToTile(this->town->xy);
@ -958,7 +958,7 @@ public:
const Town *t = *it;
assert(t != nullptr);
if (_ctrl_pressed) {
if (_fn_pressed) {
ShowExtraViewportWindow(t->xy);
} else {
ScrollMainWindowToTile(t->xy);
@ -1217,7 +1217,7 @@ public:
tile, this->town_size, this->city, this->town_layout, random, townnameparts, name);
/* Rerandomise name, if success and no cost-estimation. */
if (success && !_shift_pressed) this->RandomTownName();
if (success && !_estimate_pressed) this->RandomTownName();
}
void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override

View File

@ -72,7 +72,7 @@ public:
void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
{
if (widget >= WID_TT_BEGIN && widget < WID_TT_END) {
if (_ctrl_pressed) {
if (_fn_pressed) {
/* toggle the bit of the transparencies lock variable */
ToggleTransparencyLock((TransparencyOption)(widget - WID_TT_BEGIN));
this->SetDirty();

View File

@ -239,7 +239,7 @@ public:
void OnPlaceMouseUp([[maybe_unused]] ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, [[maybe_unused]] Point pt, TileIndex start_tile, TileIndex end_tile) override
{
if (_game_mode != GM_EDITOR && this->mode == PM_NORMAL && pt.x != -1 && select_proc == DDSP_PLANT_TREES) {
Command<CMD_PLANT_TREE>::Post(STR_ERROR_CAN_T_PLANT_TREE_HERE, end_tile, start_tile, this->tree_to_plant, _ctrl_pressed);
Command<CMD_PLANT_TREE>::Post(STR_ERROR_CAN_T_PLANT_TREE_HERE, end_tile, start_tile, this->tree_to_plant, _fn_pressed);
}
}

View File

@ -1155,7 +1155,7 @@ struct RefitWindow : public Window {
/* If the selection is not correct, clear it. */
if (this->num_vehicles != 0) {
if (_ctrl_pressed) this->num_vehicles = UINT8_MAX;
if (_fn_pressed) this->num_vehicles = UINT8_MAX;
break;
}
FALLTHROUGH;
@ -1178,7 +1178,7 @@ struct RefitWindow : public Window {
this->click_x = GetClickPosition(pt.x - nwi->pos_x);
this->SetSelectedVehicles(pt.x - nwi->pos_x);
this->SetWidgetDirty(WID_VR_VEHICLE_PANEL_DISPLAY);
if (!_ctrl_pressed) {
if (!_fn_pressed) {
SetObjectToPlaceWnd(SPR_CURSOR_MOUSE, PAL_NONE, HT_DRAG, this);
} else {
/* The vehicle selection has changed. */
@ -2074,7 +2074,7 @@ public:
case GB_NONE: {
const Vehicle *v = vehgroup.GetSingleVehicle();
if (!VehicleClicked(v)) {
if (_ctrl_pressed) {
if (_fn_pressed) {
ShowCompanyGroupForVehicle(v);
} else {
ShowVehicleViewWindow(v);
@ -2087,7 +2087,7 @@ public:
assert(vehgroup.NumVehicles() > 0);
if (!VehicleClicked(vehgroup)) {
const Vehicle *v = vehgroup.vehicles_begin[0];
if (_ctrl_pressed) {
if (_fn_pressed) {
ShowOrdersWindow(v);
} else {
if (vehgroup.NumVehicles() == 1) {
@ -2232,10 +2232,10 @@ void ShowVehicleListWindow(CompanyID company, VehicleType vehicle_type)
{
/* If _settings_client.gui.advanced_vehicle_list > 1, display the Advanced list
* if _settings_client.gui.advanced_vehicle_list == 1, display Advanced list only for local company
* if _ctrl_pressed, do the opposite action (Advanced list x Normal list)
* if _fn_pressed, do the opposite action (Advanced list x Normal list)
*/
if ((_settings_client.gui.advanced_vehicle_list > (uint)(company != _local_company)) != _ctrl_pressed) {
if ((_settings_client.gui.advanced_vehicle_list > (uint)(company != _local_company)) != _fn_pressed) {
ShowCompanyGroup(company, vehicle_type);
} else {
ShowVehicleListWindowLocal(company, VL_STANDARD, vehicle_type, company);
@ -2687,9 +2687,9 @@ struct VehicleDetailsWindow : Window {
const Vehicle *v = Vehicle::Get(this->window_number);
int mod;
if (!v->ServiceIntervalIsPercent() && TimerGameEconomy::UsingWallclockUnits()) {
mod = _ctrl_pressed ? 1 : 5;
mod = _fn_pressed ? 1 : 5;
} else {
mod = _ctrl_pressed ? 5 : 10;
mod = _fn_pressed ? 5 : 10;
}
mod = (widget == WID_VD_DECREASE_SERVICING_INTERVAL) ? -mod : mod;
@ -3209,7 +3209,7 @@ public:
TileIndex tile = v->current_order.GetLocation(v);
if (tile == INVALID_TILE) break;
if (_ctrl_pressed) {
if (_fn_pressed) {
ShowExtraViewportWindow(tile);
} else {
ScrollMainWindowToTile(tile);
@ -3218,7 +3218,7 @@ public:
}
case WID_VV_LOCATION: // center main view
if (_ctrl_pressed) {
if (_fn_pressed) {
ShowExtraViewportWindow(TileVirtXY(v->x_pos, v->y_pos));
} else {
const Window *mainwindow = GetMainWindow();
@ -3232,20 +3232,20 @@ public:
break;
case WID_VV_GOTO_DEPOT: // goto hangar
Command<CMD_SEND_VEHICLE_TO_DEPOT>::Post(GetCmdSendToDepotMsg(v), v->index, _ctrl_pressed ? DepotCommand::Service : DepotCommand::None, {});
Command<CMD_SEND_VEHICLE_TO_DEPOT>::Post(GetCmdSendToDepotMsg(v), v->index, _fn_pressed ? DepotCommand::Service : DepotCommand::None, {});
break;
case WID_VV_REFIT: // refit
ShowVehicleRefitWindow(v, INVALID_VEH_ORDER_ID, this);
break;
case WID_VV_SHOW_ORDERS: // show orders
if (_ctrl_pressed) {
if (_fn_pressed) {
ShowTimetableWindow(v);
} else {
ShowOrdersWindow(v);
}
break;
case WID_VV_SHOW_DETAILS: // show details
if (_ctrl_pressed) {
if (_fn_pressed) {
ShowCompanyGroupForVehicle(v);
} else {
ShowVehicleDetailsWindow(v);
@ -3257,8 +3257,8 @@ public:
* For starting the vehicle the player has to open the depot GUI, which is
* most likely already open, but is also visible in the vehicle viewport. */
Command<CMD_CLONE_VEHICLE>::Post(_vehicle_msg_translation_table[VCT_CMD_CLONE_VEH][v->type],
_ctrl_pressed ? nullptr : CcCloneVehicle,
v->tile, v->index, _ctrl_pressed);
_fn_pressed ? nullptr : CcCloneVehicle,
v->tile, v->index, _fn_pressed);
break;
case WID_VV_TURN_AROUND: // turn around
assert(v->IsGroundVehicle());

View File

@ -461,10 +461,9 @@ void VideoDriver_Allegro::Stop()
void VideoDriver_Allegro::InputLoop()
{
bool old_ctrl_pressed = _ctrl_pressed;
_ctrl_pressed = !!(key_shifts & KB_CTRL_FLAG);
_shift_pressed = !!(key_shifts & KB_SHIFT_FLAG);
bool ctrl_pressed = !!(key_shifts & KB_CTRL_FLAG);
bool shift_pressed = !!(key_shifts & KB_SHIFT_FLAG);
bool alt_pressed = !!(key_shifts & KB_ALT_FLAG);
/* Speedup when pressing tab, except when using ALT+TAB
* to switch to another application. */
@ -477,7 +476,7 @@ void VideoDriver_Allegro::InputLoop()
(key[KEY_RIGHT] ? 4 : 0) |
(key[KEY_DOWN] ? 8 : 0);
if (old_ctrl_pressed != _ctrl_pressed) HandleCtrlChanged();
HandleModifierKeys(shift_pressed, ctrl_pressed, alt_pressed);
}
void VideoDriver_Allegro::MainLoop()

View File

@ -472,14 +472,13 @@ void VideoDriver_Cocoa::InputLoop()
{
NSUInteger cur_mods = [ NSEvent modifierFlags ];
bool old_ctrl_pressed = _ctrl_pressed;
_ctrl_pressed = (cur_mods & ( _settings_client.gui.right_mouse_btn_emulation != RMBE_CONTROL ? NSEventModifierFlagControl : NSEventModifierFlagCommand)) != 0;
_shift_pressed = (cur_mods & NSEventModifierFlagShift) != 0;
bool ctrl_pressed = (cur_mods & ( _settings_client.gui.right_mouse_btn_emulation != RMBE_CONTROL ? NSEventModifierFlagControl : NSEventModifierFlagCommand)) != 0;
bool shift_pressed = (cur_mods & NSEventModifierFlagShift) != 0;
bool alt_pressed = (cur_mods & NSEventModifierFlagOption) != 0;
this->fast_forward_key_pressed = _tab_is_down;
if (old_ctrl_pressed != _ctrl_pressed) HandleCtrlChanged();
HandleModifierKeys(shift_pressed, ctrl_pressed, alt_pressed);
}
/** Main game loop. */

View File

@ -575,10 +575,9 @@ void VideoDriver_SDL_Base::InputLoop()
uint32_t mod = SDL_GetModState();
const Uint8 *keys = SDL_GetKeyboardState(nullptr);
bool old_ctrl_pressed = _ctrl_pressed;
_ctrl_pressed = !!(mod & KMOD_CTRL);
_shift_pressed = !!(mod & KMOD_SHIFT);
bool ctrl_pressed = !!(mod & KMOD_CTRL);
bool shift_pressed = !!(mod & KMOD_SHIFT);
bool alt_pressed = !!(mod & KMOD_ALT);
/* Speedup when pressing tab, except when using ALT+TAB
* to switch to another application. */
@ -591,7 +590,7 @@ void VideoDriver_SDL_Base::InputLoop()
(keys[SDL_SCANCODE_RIGHT] ? 4 : 0) |
(keys[SDL_SCANCODE_DOWN] ? 8 : 0);
if (old_ctrl_pressed != _ctrl_pressed) HandleCtrlChanged();
HandleModifierKeys(shift_pressed, ctrl_pressed, alt_pressed);
}
void VideoDriver_SDL_Base::LoopOnce()

View File

@ -631,10 +631,9 @@ void VideoDriver_SDL::InputLoop()
int numkeys;
Uint8 *keys = SDL_GetKeyState(&numkeys);
bool old_ctrl_pressed = _ctrl_pressed;
_ctrl_pressed = !!(mod & KMOD_CTRL);
_shift_pressed = !!(mod & KMOD_SHIFT);
bool ctrl_pressed = !!(mod & KMOD_CTRL);
bool shift_pressed = !!(mod & KMOD_SHIFT);
bool alt_pressed = !!(mod & KMOD_ALT);
/* Speedup when pressing tab, except when using ALT+TAB
* to switch to another application. */
@ -647,7 +646,7 @@ void VideoDriver_SDL::InputLoop()
(keys[SDLK_RIGHT] ? 4 : 0) |
(keys[SDLK_DOWN] ? 8 : 0);
if (old_ctrl_pressed != _ctrl_pressed) HandleCtrlChanged();
HandleModifierKeys(shift_pressed, ctrl_pressed, alt_pressed);
}
void VideoDriver_SDL::MainLoop()

View File

@ -848,10 +848,9 @@ void VideoDriver_Win32Base::CheckPaletteAnim()
void VideoDriver_Win32Base::InputLoop()
{
bool old_ctrl_pressed = _ctrl_pressed;
_ctrl_pressed = this->has_focus && GetAsyncKeyState(VK_CONTROL) < 0;
_shift_pressed = this->has_focus && GetAsyncKeyState(VK_SHIFT) < 0;
bool ctrl_pressed = this->has_focus && GetAsyncKeyState(VK_CONTROL) < 0;
bool shift_pressed = this->has_focus && GetAsyncKeyState(VK_SHIFT) < 0;
bool alt_pressed = this->has_focus && GetAsyncKeyState(VK_MENU) < 0;
/* Speedup when pressing tab, except when using ALT+TAB
* to switch to another application. */
@ -868,7 +867,7 @@ void VideoDriver_Win32Base::InputLoop()
_dirkeys = 0;
}
if (old_ctrl_pressed != _ctrl_pressed) HandleCtrlChanged();
HandleModifierKeys(shift_pressed, ctrl_pressed, alt_pressed);
}
bool VideoDriver_Win32Base::PollEvent()

View File

@ -2430,7 +2430,7 @@ bool HandleViewportClicked(const Viewport *vp, int x, int y)
Debug(misc, 2, "Vehicle {} (index {}) at {}", v->unitnumber, v->index, fmt::ptr(v));
if (IsCompanyBuildableVehicleType(v)) {
v = v->First();
if (_ctrl_pressed && v->owner == _local_company) {
if (_fn_pressed && v->owner == _local_company) {
StartStopVehicle(v, true);
} else {
ShowVehicleViewWindow(v);
@ -2572,7 +2572,7 @@ void TileHighlightData::Reset()
*/
bool TileHighlightData::IsDraggingDiagonal()
{
return (this->place_mode & HT_DIAGONAL) != 0 && _ctrl_pressed && _left_button_down;
return (this->place_mode & HT_DIAGONAL) != 0 && _fn_pressed && _left_button_down;
}
/**

View File

@ -101,7 +101,7 @@ public:
{
switch (widget) {
case WID_W_CENTER_VIEW: // scroll to location
if (_ctrl_pressed) {
if (_fn_pressed) {
ShowExtraViewportWindow(this->GetCenterTile());
} else {
ScrollMainWindowToTile(this->GetCenterTile());

View File

@ -680,7 +680,7 @@ static void DispatchLeftClickEvent(Window *w, int x, int y, int click_count)
return;
case WWT_DEFSIZEBOX: {
if (_ctrl_pressed) {
if (_fn_pressed) {
w->window_desc->pref_width = w->width;
w->window_desc->pref_height = w->height;
} else {
@ -714,7 +714,7 @@ static void DispatchLeftClickEvent(Window *w, int x, int y, int click_count)
case WWT_STICKYBOX:
w->flags ^= WF_STICKY;
nw->SetDirty(w);
if (_ctrl_pressed) w->window_desc->pref_sticky = (w->flags & WF_STICKY) != 0;
if (_fn_pressed) w->window_desc->pref_sticky = (w->flags & WF_STICKY) != 0;
return;
default:
@ -2614,14 +2614,54 @@ void HandleKeypress(uint keycode, char32_t key)
}
/**
* State of CONTROL key has changed
* Select the right state for the requested modifier key.
*/
void HandleCtrlChanged()
static bool SelectModifierKey(ModifierKey key, bool shift_pressed, bool ctrl_pressed, bool alt_pressed)
{
switch (key) {
case ModifierKey::None:
return false;
case ModifierKey::Shift:
return shift_pressed;
case ModifierKey::Ctrl:
return ctrl_pressed;
case ModifierKey::Alt:
return alt_pressed;
default:
NOT_REACHED();
}
}
/**
* Handle the modifier key state changes.
*/
void HandleModifierKeys(bool shift_pressed, bool ctrl_pressed, bool alt_pressed)
{
bool old_fn_pressed = _fn_pressed;
bool old_remove_pressed = _remove_pressed;
_shift_pressed = shift_pressed;
_fn_pressed = SelectModifierKey(_settings_client.gui.fn_modifier, shift_pressed, ctrl_pressed, alt_pressed);
_remove_pressed = SelectModifierKey(_settings_client.gui.remove_modifier, shift_pressed, ctrl_pressed, alt_pressed);
_estimate_pressed = SelectModifierKey(_settings_client.gui.estimate_modifier, shift_pressed, ctrl_pressed, alt_pressed);
if (old_fn_pressed != _fn_pressed) {
/* Call the event, start with the uppermost window. */
for (Window *w : Window::IterateFromFront()) {
if (w->OnCTRLStateChange() == ES_HANDLED) return;
if (w->OnFnStateChange() == ES_HANDLED) return;
}
}
if (old_remove_pressed != _remove_pressed) {
/* Call the event, start with the uppermost window. */
for (Window *w : Window::IterateFromFront()) {
if (w->OnRemoveStateChange() == ES_HANDLED) return;
}
}
old_fn_pressed = _fn_pressed;
old_remove_pressed = _remove_pressed;
}
/**

View File

@ -647,12 +647,18 @@ public:
virtual EventState OnHotkey(int hotkey);
/**
* The state of the control key has changed
* The state of the function modifier key has changed
* @return #ES_HANDLED if the change has been handled and no other
* window should receive the event.
*/
virtual EventState OnCTRLStateChange() { return ES_NOT_HANDLED; }
virtual EventState OnFnStateChange() { return ES_NOT_HANDLED; }
/**
* The state of the remove modifier key has changed
* @return #ES_HANDLED if the change has been handled and no other
* window should receive the event.
*/
virtual EventState OnRemoveStateChange() { return ES_NOT_HANDLED; }
/**
* A click with the left mouse button has been made on the window.