Merge branch 'master' into jgrpp-nrt
Merge NRT feature # Conflicts: # docs/landscape.html # docs/landscape_grid.html # src/bridge_map.h # src/build_vehicle_gui.cpp # src/company_base.h # src/company_cmd.cpp # src/misc_gui.cpp # src/newgrf.cpp # src/newgrf_engine.cpp # src/pathfinder/follow_track.hpp # src/pathfinder/npf/npf.cpp # src/road_cmd.cpp # src/road_func.h # src/road_gui.cpp # src/road_map.h # src/road_type.h # src/roadveh_cmd.cpp # src/saveload/afterload.cpp # src/saveload/company_sl.cpp # src/script/api/script_bridge.cpp # src/table/newgrf_debug_data.h # src/tile_cmd.h # src/town_cmd.cpp # src/tunnel_map.h # src/tunnelbridge_cmd.cpp
This commit is contained in:
@@ -62,6 +62,7 @@
|
||||
#include "../script/api/ai/ai_rail.hpp.sq"
|
||||
#include "../script/api/ai/ai_railtypelist.hpp.sq"
|
||||
#include "../script/api/ai/ai_road.hpp.sq"
|
||||
#include "../script/api/ai/ai_roadtypelist.hpp.sq"
|
||||
#include "../script/api/ai/ai_sign.hpp.sq"
|
||||
#include "../script/api/ai/ai_signlist.hpp.sq"
|
||||
#include "../script/api/ai/ai_station.hpp.sq"
|
||||
@@ -167,6 +168,7 @@ void AIInstance::RegisterAPI()
|
||||
SQAIRail_Register(this->engine);
|
||||
SQAIRailTypeList_Register(this->engine);
|
||||
SQAIRoad_Register(this->engine);
|
||||
SQAIRoadTypeList_Register(this->engine);
|
||||
SQAISign_Register(this->engine);
|
||||
SQAISignList_Register(this->engine);
|
||||
SQAIStation_Register(this->engine);
|
||||
|
@@ -21,6 +21,7 @@
|
||||
#include "tracerestrict.h"
|
||||
#include "core/random_func.hpp"
|
||||
#include "vehiclelist.h"
|
||||
#include "road.h"
|
||||
|
||||
#include "table/strings.h"
|
||||
|
||||
@@ -75,6 +76,9 @@ bool CheckAutoreplaceValidity(EngineID from, EngineID to, CompanyID company)
|
||||
}
|
||||
|
||||
case VEH_ROAD:
|
||||
/* make sure the roadtypes are compatible */
|
||||
if ((GetRoadTypeInfo(e_from->u.road.roadtype)->powered_roadtypes & GetRoadTypeInfo(e_to->u.road.roadtype)->powered_roadtypes) == ROADTYPES_NONE) return false;
|
||||
|
||||
/* make sure that we do not replace a tram with a normal road vehicles or vice versa */
|
||||
if (HasBit(e_from->info.misc_flags, EF_ROAD_TRAM) != HasBit(e_to->info.misc_flags, EF_ROAD_TRAM)) return false;
|
||||
break;
|
||||
|
@@ -14,6 +14,7 @@
|
||||
#include "vehicle_gui.h"
|
||||
#include "newgrf_engine.h"
|
||||
#include "rail.h"
|
||||
#include "road.h"
|
||||
#include "strings_func.h"
|
||||
#include "window_func.h"
|
||||
#include "autoreplace_func.h"
|
||||
@@ -24,6 +25,7 @@
|
||||
#include "settings_func.h"
|
||||
#include "core/geometry_func.hpp"
|
||||
#include "rail_gui.h"
|
||||
#include "road_gui.h"
|
||||
#include "widgets/dropdown_func.h"
|
||||
|
||||
#include "widgets/autoreplace_widget.h"
|
||||
@@ -86,6 +88,7 @@ class ReplaceVehicleWindow : public Window {
|
||||
bool descending_sort_order; ///< Order of sorting vehicles.
|
||||
bool show_hidden_engines; ///< Whether to show the hidden engines.
|
||||
RailType sel_railtype; ///< Type of rail tracks selected. #INVALID_RAILTYPE to show all.
|
||||
RoadType sel_roadtype; ///< Type of road selected. #INVALID_ROADTYPE to show all.
|
||||
Scrollbar *vscroll[2];
|
||||
|
||||
/**
|
||||
@@ -127,7 +130,21 @@ class ReplaceVehicleWindow : public Window {
|
||||
FOR_ALL_ENGINES_OF_TYPE(e, type) {
|
||||
if (!draw_left && !this->show_hidden_engines && e->IsHidden(_local_company)) continue;
|
||||
EngineID eid = e->index;
|
||||
if (type == VEH_TRAIN && !this->GenerateReplaceRailList(eid, draw_left, this->replace_engines)) continue; // special rules for trains
|
||||
switch (type) {
|
||||
case VEH_TRAIN:
|
||||
if (!this->GenerateReplaceRailList(eid, draw_left, this->replace_engines)) continue; // special rules for trains
|
||||
break;
|
||||
|
||||
case VEH_ROAD:
|
||||
if (draw_left && this->sel_roadtype != INVALID_ROADTYPE) {
|
||||
/* Ensure that the roadtype is specific to the selected one */
|
||||
if (e->u.road.roadtype != this->sel_roadtype) continue;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (draw_left) {
|
||||
const uint num_engines = GetGroupNumEngines(_local_company, this->sel_group, eid);
|
||||
@@ -210,6 +227,7 @@ public:
|
||||
ReplaceVehicleWindow(WindowDesc *desc, VehicleType vehicletype, GroupID id_g) : Window(desc)
|
||||
{
|
||||
this->sel_railtype = INVALID_RAILTYPE;
|
||||
this->sel_roadtype = INVALID_ROADTYPE;
|
||||
this->replace_engines = true; // start with locomotives (all other vehicles will not read this bool)
|
||||
this->engines[0].ForceRebuild();
|
||||
this->engines[1].ForceRebuild();
|
||||
@@ -229,6 +247,11 @@ public:
|
||||
widget->SetLowered(this->show_hidden_engines);
|
||||
this->FinishInitNested(vehicletype);
|
||||
|
||||
if (vehicletype == VEH_TRAIN || vehicletype == VEH_ROAD) {
|
||||
widget = this->GetWidget<NWidgetCore>(WID_RV_RAIL_ROAD_TYPE_DROPDOWN);
|
||||
widget->tool_tip = STR_REPLACE_HELP_RAILTYPE + vehicletype;
|
||||
}
|
||||
|
||||
this->sort_criteria = _engine_sort_last_criteria[vehicletype];
|
||||
this->descending_sort_order = _engine_sort_last_order[vehicletype];
|
||||
this->owner = _local_company;
|
||||
@@ -287,13 +310,28 @@ public:
|
||||
break;
|
||||
}
|
||||
|
||||
case WID_RV_TRAIN_RAILTYPE_DROPDOWN: {
|
||||
case WID_RV_RAIL_ROAD_TYPE_DROPDOWN: {
|
||||
Dimension d = {0, 0};
|
||||
for (RailType rt = RAILTYPE_BEGIN; rt != RAILTYPE_END; rt++) {
|
||||
const RailtypeInfo *rti = GetRailTypeInfo(rt);
|
||||
/* Skip rail type if it has no label */
|
||||
if (rti->label == 0) continue;
|
||||
d = maxdim(d, GetStringBoundingBox(rti->strings.replace_text));
|
||||
switch (this->window_number) {
|
||||
case VEH_TRAIN:
|
||||
for (RailType rt = RAILTYPE_BEGIN; rt != RAILTYPE_END; rt++) {
|
||||
const RailtypeInfo *rti = GetRailTypeInfo(rt);
|
||||
/* Skip rail type if it has no label */
|
||||
if (rti->label == 0) continue;
|
||||
d = maxdim(d, GetStringBoundingBox(rti->strings.replace_text));
|
||||
}
|
||||
break;
|
||||
|
||||
case VEH_ROAD:
|
||||
for (RoadType rt = ROADTYPE_BEGIN; rt < ROADTYPE_END; rt++) {
|
||||
const RoadTypeInfo *rti = GetRoadTypeInfo(rt);
|
||||
/* Skip road type if it has no label */
|
||||
if (rti->label == 0) continue;
|
||||
d = maxdim(d, GetStringBoundingBox(rti->strings.replace_text));
|
||||
}
|
||||
break;
|
||||
|
||||
default: NOT_REACHED();
|
||||
}
|
||||
d.width += padding.width;
|
||||
d.height += padding.height;
|
||||
@@ -409,9 +447,18 @@ public:
|
||||
* or The selected vehicle has no replacement set up */
|
||||
this->SetWidgetDisabledState(WID_RV_STOP_REPLACE, this->sel_engine[0] == INVALID_ENGINE || !EngineHasReplacementForCompany(c, this->sel_engine[0], this->sel_group));
|
||||
|
||||
if (this->window_number == VEH_TRAIN) {
|
||||
/* Show the selected railtype in the pulldown menu */
|
||||
this->GetWidget<NWidgetCore>(WID_RV_TRAIN_RAILTYPE_DROPDOWN)->widget_data = sel_railtype == INVALID_RAILTYPE ? STR_REPLACE_ALL_RAILTYPE : GetRailTypeInfo(sel_railtype)->strings.replace_text;
|
||||
switch (this->window_number) {
|
||||
case VEH_TRAIN:
|
||||
/* Show the selected railtype in the pulldown menu */
|
||||
this->GetWidget<NWidgetCore>(WID_RV_RAIL_ROAD_TYPE_DROPDOWN)->widget_data = sel_railtype == INVALID_RAILTYPE ? STR_REPLACE_ALL_RAILTYPE : GetRailTypeInfo(sel_railtype)->strings.replace_text;
|
||||
break;
|
||||
|
||||
case VEH_ROAD:
|
||||
/* Show the selected roadtype in the pulldown menu */
|
||||
this->GetWidget<NWidgetCore>(WID_RV_RAIL_ROAD_TYPE_DROPDOWN)->widget_data = sel_roadtype == INVALID_ROADTYPE ? STR_REPLACE_ALL_ROADTYPE : GetRoadTypeInfo(sel_roadtype)->strings.replace_text;
|
||||
break;
|
||||
|
||||
default: break;
|
||||
}
|
||||
|
||||
this->DrawWidgets();
|
||||
@@ -472,8 +519,16 @@ public:
|
||||
break;
|
||||
}
|
||||
|
||||
case WID_RV_TRAIN_RAILTYPE_DROPDOWN: // Railtype selection dropdown menu
|
||||
ShowDropDownList(this, GetRailTypeDropDownList(true, true), sel_railtype, WID_RV_TRAIN_RAILTYPE_DROPDOWN);
|
||||
case WID_RV_RAIL_ROAD_TYPE_DROPDOWN: // Rail/roadtype selection dropdown menu
|
||||
switch (this->window_number) {
|
||||
case VEH_TRAIN:
|
||||
ShowDropDownList(this, GetRailTypeDropDownList(true, true), sel_railtype, WID_RV_RAIL_ROAD_TYPE_DROPDOWN);
|
||||
break;
|
||||
|
||||
case VEH_ROAD:
|
||||
ShowDropDownList(this, GetRoadTypeDropDownList(RTTB_ROAD | RTTB_TRAM, true, true), sel_roadtype, WID_RV_RAIL_ROAD_TYPE_DROPDOWN);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case WID_RV_TRAIN_WAGONREMOVE_TOGGLE: // toggle renew_keep_length
|
||||
@@ -533,10 +588,25 @@ public:
|
||||
}
|
||||
break;
|
||||
|
||||
case WID_RV_TRAIN_RAILTYPE_DROPDOWN: {
|
||||
RailType temp = (RailType)index;
|
||||
if (temp == sel_railtype) return; // we didn't select a new one. No need to change anything
|
||||
sel_railtype = temp;
|
||||
case WID_RV_RAIL_ROAD_TYPE_DROPDOWN:
|
||||
switch (this->window_number) {
|
||||
case VEH_TRAIN: {
|
||||
RailType temp = (RailType)index;
|
||||
if (temp == sel_railtype) return; // we didn't select a new one. No need to change anything
|
||||
sel_railtype = temp;
|
||||
break;
|
||||
}
|
||||
|
||||
case VEH_ROAD: {
|
||||
RoadType temp = (RoadType)index;
|
||||
if (temp == sel_roadtype) return; // we didn't select a new one. No need to change anything
|
||||
sel_roadtype = temp;
|
||||
break;
|
||||
}
|
||||
|
||||
default: NOT_REACHED();
|
||||
}
|
||||
|
||||
/* Reset scrollbar positions */
|
||||
this->vscroll[0]->SetPosition(0);
|
||||
this->vscroll[1]->SetPosition(0);
|
||||
@@ -546,7 +616,6 @@ public:
|
||||
this->reset_sel_engine = true;
|
||||
this->SetDirty();
|
||||
break;
|
||||
}
|
||||
|
||||
case WID_RV_TRAIN_ENGINEWAGON_DROPDOWN: {
|
||||
this->replace_engines = index != 0;
|
||||
@@ -603,7 +672,7 @@ static const NWidgetPart _nested_replace_rail_vehicle_widgets[] = {
|
||||
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
|
||||
NWidget(NWID_VERTICAL),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_RV_TRAIN_RAILTYPE_DROPDOWN), SetMinimalSize(136, 12), SetDataTip(0x0, STR_REPLACE_HELP_RAILTYPE), SetFill(1, 0), SetResize(1, 0),
|
||||
NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_RV_RAIL_ROAD_TYPE_DROPDOWN), SetMinimalSize(136, 12), SetDataTip(0x0, STR_REPLACE_HELP_RAILTYPE), SetFill(1, 0), SetResize(1, 0),
|
||||
NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_RV_TRAIN_ENGINEWAGON_DROPDOWN), SetDataTip(STR_BLACK_STRING, STR_REPLACE_ENGINE_WAGON_SELECT_HELP),
|
||||
EndContainer(),
|
||||
NWidget(WWT_PANEL, COLOUR_GREY), SetResize(1, 0), EndContainer(),
|
||||
@@ -648,6 +717,64 @@ static WindowDesc _replace_rail_vehicle_desc(
|
||||
_nested_replace_rail_vehicle_widgets, lengthof(_nested_replace_rail_vehicle_widgets)
|
||||
);
|
||||
|
||||
static const NWidgetPart _nested_replace_road_vehicle_widgets[] = {
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_CLOSEBOX, COLOUR_GREY),
|
||||
NWidget(WWT_CAPTION, COLOUR_GREY, WID_RV_CAPTION), SetDataTip(STR_REPLACE_VEHICLES_WHITE, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
|
||||
NWidget(WWT_SHADEBOX, COLOUR_GREY),
|
||||
NWidget(WWT_DEFSIZEBOX, COLOUR_GREY),
|
||||
NWidget(WWT_STICKYBOX, COLOUR_GREY),
|
||||
EndContainer(),
|
||||
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
|
||||
NWidget(WWT_PANEL, COLOUR_GREY),
|
||||
NWidget(WWT_LABEL, COLOUR_GREY), SetDataTip(STR_REPLACE_VEHICLE_VEHICLES_IN_USE, STR_REPLACE_VEHICLE_VEHICLES_IN_USE_TOOLTIP), SetFill(1, 1), SetMinimalSize(0, 12), SetResize(1, 0),
|
||||
EndContainer(),
|
||||
NWidget(WWT_PANEL, COLOUR_GREY),
|
||||
NWidget(WWT_LABEL, COLOUR_GREY), SetDataTip(STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES, STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES_TOOLTIP), SetFill(1, 1), SetMinimalSize(0, 12), SetResize(1, 0),
|
||||
EndContainer(),
|
||||
EndContainer(),
|
||||
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
|
||||
NWidget(NWID_VERTICAL),
|
||||
NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_RV_RAIL_ROAD_TYPE_DROPDOWN), SetMinimalSize(136, 12), SetDataTip(0x0, STR_REPLACE_HELP_RAILTYPE), SetFill(1, 0), SetResize(1, 0),
|
||||
NWidget(WWT_PANEL, COLOUR_GREY), SetResize(1, 0), EndContainer(),
|
||||
EndContainer(),
|
||||
NWidget(NWID_VERTICAL),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_RV_SORT_ASCENDING_DESCENDING), SetDataTip(STR_BUTTON_SORT_BY, STR_TOOLTIP_SORT_ORDER), SetFill(1, 1),
|
||||
NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_RV_SORT_DROPDOWN), SetResize(1, 0), SetFill(1, 1), SetDataTip(STR_JUST_STRING, STR_TOOLTIP_SORT_CRITERIA),
|
||||
EndContainer(),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_RV_SHOW_HIDDEN_ENGINES), SetDataTip(STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN, STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN_TOOLTIP),
|
||||
NWidget(WWT_PANEL, COLOUR_GREY), SetResize(1, 0), SetFill(1, 1), EndContainer(),
|
||||
EndContainer(),
|
||||
EndContainer(),
|
||||
EndContainer(),
|
||||
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
|
||||
NWidget(WWT_MATRIX, COLOUR_GREY, WID_RV_LEFT_MATRIX), SetMinimalSize(216, 0), SetFill(1, 1), SetMatrixDataTip(1, 0, STR_REPLACE_HELP_LEFT_ARRAY), SetResize(1, 1), SetScrollbar(WID_RV_LEFT_SCROLLBAR),
|
||||
NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_RV_LEFT_SCROLLBAR),
|
||||
NWidget(WWT_MATRIX, COLOUR_GREY, WID_RV_RIGHT_MATRIX), SetMinimalSize(216, 0), SetFill(1, 1), SetMatrixDataTip(1, 0, STR_REPLACE_HELP_RIGHT_ARRAY), SetResize(1, 1), SetScrollbar(WID_RV_RIGHT_SCROLLBAR),
|
||||
NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_RV_RIGHT_SCROLLBAR),
|
||||
EndContainer(),
|
||||
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
|
||||
NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_LEFT_DETAILS), SetMinimalSize(240, 122), SetResize(1, 0), EndContainer(),
|
||||
NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_RIGHT_DETAILS), SetMinimalSize(240, 122), SetResize(1, 0), EndContainer(),
|
||||
EndContainer(),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(NWID_PUSHBUTTON_DROPDOWN, COLOUR_GREY, WID_RV_START_REPLACE), SetMinimalSize(139, 12), SetDataTip(STR_REPLACE_VEHICLES_START, STR_REPLACE_HELP_START_BUTTON),
|
||||
NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_INFO_TAB), SetMinimalSize(167, 12), SetDataTip(0x0, STR_REPLACE_HELP_REPLACE_INFO_TAB), SetResize(1, 0),
|
||||
EndContainer(),
|
||||
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_RV_STOP_REPLACE), SetMinimalSize(150, 12), SetDataTip(STR_REPLACE_VEHICLES_STOP, STR_REPLACE_HELP_STOP_BUTTON),
|
||||
NWidget(WWT_RESIZEBOX, COLOUR_GREY),
|
||||
EndContainer(),
|
||||
};
|
||||
|
||||
static WindowDesc _replace_road_vehicle_desc(
|
||||
WDP_AUTO, "replace_vehicle_road", 500, 140,
|
||||
WC_REPLACE_VEHICLE, WC_NONE,
|
||||
WDF_CONSTRUCTION,
|
||||
_nested_replace_road_vehicle_widgets, lengthof(_nested_replace_road_vehicle_widgets)
|
||||
);
|
||||
|
||||
static const NWidgetPart _nested_replace_vehicle_widgets[] = {
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_CLOSEBOX, COLOUR_GREY),
|
||||
@@ -710,5 +837,11 @@ static WindowDesc _replace_vehicle_desc(
|
||||
void ShowReplaceGroupVehicleWindow(GroupID id_g, VehicleType vehicletype)
|
||||
{
|
||||
DeleteWindowById(WC_REPLACE_VEHICLE, vehicletype);
|
||||
new ReplaceVehicleWindow(vehicletype == VEH_TRAIN ? &_replace_rail_vehicle_desc : &_replace_vehicle_desc, vehicletype, id_g);
|
||||
WindowDesc *desc;
|
||||
switch (vehicletype) {
|
||||
case VEH_TRAIN: desc = &_replace_rail_vehicle_desc; break;
|
||||
case VEH_ROAD: desc = &_replace_road_vehicle_desc; break;
|
||||
default: desc = &_replace_vehicle_desc; break;
|
||||
}
|
||||
new ReplaceVehicleWindow(desc, vehicletype, id_g);
|
||||
}
|
||||
|
@@ -13,6 +13,7 @@
|
||||
#include "error.h"
|
||||
#include "command_func.h"
|
||||
#include "rail.h"
|
||||
#include "road.h"
|
||||
#include "strings_func.h"
|
||||
#include "window_func.h"
|
||||
#include "sound_func.h"
|
||||
@@ -410,11 +411,25 @@ void ShowBuildBridgeWindow(TileIndex start, TileIndex end, TransportType transpo
|
||||
|
||||
Money infra_cost = 0;
|
||||
switch (transport_type) {
|
||||
case TRANSPORT_ROAD:
|
||||
infra_cost = (bridge_len + 2) * _price[PR_BUILD_ROAD] * 2;
|
||||
case TRANSPORT_ROAD: {
|
||||
/* In case we add a new road type as well, we must be aware of those costs. */
|
||||
if (IsBridgeTile(start)) infra_cost *= CountBits(GetRoadTypes(start) | (RoadTypes)road_rail_type);
|
||||
RoadType road_rt = INVALID_ROADTYPE;
|
||||
RoadType tram_rt = INVALID_ROADTYPE;
|
||||
if (IsBridgeTile(start)) {
|
||||
road_rt = GetRoadTypeRoad(start);
|
||||
tram_rt = GetRoadTypeTram(start);
|
||||
}
|
||||
if (RoadTypeIsRoad((RoadType)road_rail_type)) {
|
||||
road_rt = (RoadType)road_rail_type;
|
||||
} else {
|
||||
tram_rt = (RoadType)road_rail_type;
|
||||
}
|
||||
|
||||
if (road_rt != INVALID_ROADTYPE) infra_cost += (bridge_len + 2) * 2 * RoadBuildCost(road_rt);
|
||||
if (tram_rt != INVALID_ROADTYPE) infra_cost += (bridge_len + 2) * 2 * RoadBuildCost(tram_rt);
|
||||
|
||||
break;
|
||||
}
|
||||
case TRANSPORT_RAIL: infra_cost = (bridge_len + 2) * RailBuildCost((RailType)road_rail_type); break;
|
||||
default: break;
|
||||
}
|
||||
|
@@ -131,11 +131,11 @@ static inline void MakeBridgeRamp(TileIndex t, Owner o, BridgeType bridgetype, D
|
||||
SetTileOwner(t, o);
|
||||
_m[t].m2 = 0;
|
||||
_m[t].m3 = 0;
|
||||
_m[t].m4 = 0;
|
||||
_m[t].m4 = INVALID_ROADTYPE;
|
||||
_m[t].m5 = 1 << 7 | tt << 2 | d;
|
||||
SB(_me[t].m6, 2, 4, bridgetype);
|
||||
_me[t].m7 = 0;
|
||||
_me[t].m8 = 0;
|
||||
_me[t].m8 = INVALID_ROADTYPE << 6;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -146,18 +146,19 @@ static inline void MakeBridgeRamp(TileIndex t, Owner o, BridgeType bridgetype, D
|
||||
* @param owner_tram the new owner of the tram on the bridge
|
||||
* @param bridgetype the type of bridge this bridge ramp belongs to
|
||||
* @param d the direction this ramp must be facing
|
||||
* @param rts the road types of the bridge
|
||||
* @param road_rt the road type of the bridge
|
||||
* @param tram_rt the tram type of the bridge
|
||||
* @param upgrade whether the bridge is an upgrade instead of a totally new bridge
|
||||
*/
|
||||
static inline void MakeRoadBridgeRamp(TileIndex t, Owner o, Owner owner_road, Owner owner_tram, BridgeType bridgetype, DiagDirection d, RoadTypes rts, bool upgrade)
|
||||
static inline void MakeRoadBridgeRamp(TileIndex t, Owner o, Owner owner_road, Owner owner_tram, BridgeType bridgetype, DiagDirection d, RoadType road_rt, RoadType tram_rt, bool upgrade)
|
||||
{
|
||||
// Backup custom bridgehead data.
|
||||
uint custom_bridge_head_backup = GB(_m[t].m2, 0, 8);
|
||||
|
||||
MakeBridgeRamp(t, o, bridgetype, d, TRANSPORT_ROAD);
|
||||
SetRoadOwner(t, ROADTYPE_ROAD, owner_road);
|
||||
if (owner_tram != OWNER_TOWN) SetRoadOwner(t, ROADTYPE_TRAM, owner_tram);
|
||||
SetRoadTypes(t, rts);
|
||||
SetRoadOwner(t, RTT_ROAD, owner_road);
|
||||
if (owner_tram != OWNER_TOWN) SetRoadOwner(t, RTT_TRAM, owner_tram);
|
||||
SetRoadTypes(t, road_rt, tram_rt);
|
||||
|
||||
// Restore custom bridgehead data if we're upgrading an existing bridge.
|
||||
if (upgrade) SB(_m[t].m2, 0, 8, custom_bridge_head_backup);
|
||||
@@ -182,6 +183,7 @@ static inline void MakeRailBridgeRamp(TileIndex t, Owner o, BridgeType bridgetyp
|
||||
auto m8_backup = _me[t].m8;
|
||||
|
||||
MakeBridgeRamp(t, o, bridgetype, d, TRANSPORT_RAIL);
|
||||
_m[t].m4 = 0;
|
||||
_me[t].m8 = rt;
|
||||
|
||||
if (upgrade) {
|
||||
@@ -234,15 +236,15 @@ static inline bool IsRoadCustomBridgeHeadTile(TileIndex t)
|
||||
/**
|
||||
* Returns the road bits for a (possibly custom) road bridge head
|
||||
* @param t The tile to analyze
|
||||
* @param rt Road type.
|
||||
* @param rtt Road/tram type.
|
||||
* @pre IsBridgeTile(t) && GetTunnelBridgeTransportType(t) == TRANSPORT_ROAD
|
||||
* @return road bits for the bridge head
|
||||
*/
|
||||
static inline RoadBits GetCustomBridgeHeadRoadBits(TileIndex t, RoadType rt)
|
||||
static inline RoadBits GetCustomBridgeHeadRoadBits(TileIndex t, RoadTramType rtt)
|
||||
{
|
||||
assert_tile(IsBridgeTile(t), t);
|
||||
if (!HasTileRoadType(t, rt)) return (RoadBits) 0;
|
||||
RoadBits bits = (GB(_m[t].m5, 0, 1) ? ROAD_Y : ROAD_X) ^ (RoadBits) GB(_m[t].m2, rt == ROADTYPE_TRAM ? 4 : 0, 4);
|
||||
if (!HasTileRoadType(t, rtt)) return (RoadBits) 0;
|
||||
RoadBits bits = (GB(_m[t].m5, 0, 1) ? ROAD_Y : ROAD_X) ^ (RoadBits) GB(_m[t].m2, rtt == RTT_TRAM ? 4 : 0, 4);
|
||||
return bits;
|
||||
}
|
||||
|
||||
@@ -254,26 +256,26 @@ static inline RoadBits GetCustomBridgeHeadRoadBits(TileIndex t, RoadType rt)
|
||||
*/
|
||||
static inline RoadBits GetCustomBridgeHeadAllRoadBits(TileIndex t)
|
||||
{
|
||||
return GetCustomBridgeHeadRoadBits(t, ROADTYPE_ROAD) | GetCustomBridgeHeadRoadBits(t, ROADTYPE_TRAM);
|
||||
return GetCustomBridgeHeadRoadBits(t, RTT_ROAD) | GetCustomBridgeHeadRoadBits(t, RTT_TRAM);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the road bits for a (possibly custom) road bridge head
|
||||
* @param t The tile to modify
|
||||
* @param rt Road type.
|
||||
* @param rtt Road/tram type.
|
||||
* @param bits The road bits.
|
||||
* @pre IsBridgeTile(t) && GetTunnelBridgeTransportType(t) == TRANSPORT_ROAD
|
||||
* @pre HasTileRoadType() must be set correctly before calling this
|
||||
*/
|
||||
static inline void SetCustomBridgeHeadRoadBits(TileIndex t, RoadType rt, RoadBits bits)
|
||||
static inline void SetCustomBridgeHeadRoadBits(TileIndex t, RoadTramType rtt, RoadBits bits)
|
||||
{
|
||||
assert_tile(IsBridgeTile(t), t);
|
||||
if (HasTileRoadType(t, rt)) {
|
||||
if (HasTileRoadType(t, rtt)) {
|
||||
assert(bits != ROAD_NONE);
|
||||
SB(_m[t].m2, rt == ROADTYPE_TRAM ? 4 : 0, 4, bits ^ (GB(_m[t].m5, 0, 1) ? ROAD_Y : ROAD_X));
|
||||
SB(_m[t].m2, rtt == RTT_TRAM ? 4 : 0, 4, bits ^ (GB(_m[t].m5, 0, 1) ? ROAD_Y : ROAD_X));
|
||||
} else {
|
||||
assert(bits == ROAD_NONE);
|
||||
SB(_m[t].m2, rt == ROADTYPE_TRAM ? 4 : 0, 4, 0);
|
||||
SB(_m[t].m2, rtt == RTT_TRAM ? 4 : 0, 4, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1015,8 +1015,8 @@ void DisplayVehicleSortDropDown(Window *w, VehicleType vehicle_type, int selecte
|
||||
struct BuildVehicleWindow : Window {
|
||||
VehicleType vehicle_type; ///< Type of vehicles shown in the window.
|
||||
union {
|
||||
RailType railtype; ///< Rail type to show, or #RAILTYPE_END.
|
||||
RoadTypes roadtypes; ///< Road type to show, or #ROADTYPES_ALL.
|
||||
RailType railtype; ///< Rail type to show, or #INVALID_RAILTYPE.
|
||||
RoadType roadtype; ///< Road type to show, or #INVALID_ROADTYPE.
|
||||
} filter; ///< Filter to apply.
|
||||
bool descending_sort_order; ///< Sort direction, @see _engine_sort_direction
|
||||
byte sort_criteria; ///< Current sort criterium.
|
||||
@@ -1062,6 +1062,7 @@ struct BuildVehicleWindow : Window {
|
||||
this->virtual_train_out = virtual_train_out;
|
||||
this->virtual_train_mode = (virtual_train_out != nullptr);
|
||||
if (this->virtual_train_mode) this->window_number = 0;
|
||||
this->listview_mode = (tile == INVALID_TILE) && !virtual_train_mode;
|
||||
|
||||
this->sel_engine = INVALID_ENGINE;
|
||||
|
||||
@@ -1069,19 +1070,7 @@ struct BuildVehicleWindow : Window {
|
||||
this->descending_sort_order = _engine_sort_last_order[type];
|
||||
this->show_hidden_engines = _engine_sort_show_hidden_engines[type];
|
||||
|
||||
switch (type) {
|
||||
default: NOT_REACHED();
|
||||
case VEH_TRAIN:
|
||||
this->filter.railtype = (tile == INVALID_TILE) ? RAILTYPE_END : GetRailType(tile);
|
||||
break;
|
||||
case VEH_ROAD:
|
||||
this->filter.roadtypes = (tile == INVALID_TILE) ? ROADTYPES_ALL : GetRoadTypes(tile);
|
||||
case VEH_SHIP:
|
||||
case VEH_AIRCRAFT:
|
||||
break;
|
||||
}
|
||||
|
||||
this->listview_mode = !(this->virtual_train_mode) && (this->window_number <= VEH_END);
|
||||
this->UpdateFilterByTile();
|
||||
|
||||
this->CreateNestedTree();
|
||||
|
||||
@@ -1127,6 +1116,36 @@ struct BuildVehicleWindow : Window {
|
||||
}
|
||||
}
|
||||
|
||||
/** Set the filter type according to the depot type */
|
||||
void UpdateFilterByTile()
|
||||
{
|
||||
switch (this->vehicle_type) {
|
||||
default: NOT_REACHED();
|
||||
case VEH_TRAIN:
|
||||
if (this->listview_mode || this->virtual_train_mode) {
|
||||
this->filter.railtype = INVALID_RAILTYPE;
|
||||
} else {
|
||||
this->filter.railtype = GetRailType(this->window_number);
|
||||
}
|
||||
break;
|
||||
|
||||
case VEH_ROAD:
|
||||
if (this->listview_mode || this->virtual_train_mode) {
|
||||
this->filter.roadtype = INVALID_ROADTYPE;
|
||||
} else {
|
||||
this->filter.roadtype = GetRoadTypeRoad(this->window_number);
|
||||
if (this->filter.roadtype == INVALID_ROADTYPE) {
|
||||
this->filter.roadtype = GetRoadTypeTram(this->window_number);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case VEH_SHIP:
|
||||
case VEH_AIRCRAFT:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/** Populate the filter list and set the cargo filter criteria. */
|
||||
void SetCargoFilterArray()
|
||||
{
|
||||
@@ -1236,8 +1255,6 @@ struct BuildVehicleWindow : Window {
|
||||
int num_engines = 0;
|
||||
int num_wagons = 0;
|
||||
|
||||
this->filter.railtype = (this->listview_mode || this->virtual_train_mode) ? RAILTYPE_END : GetRailType(this->window_number);
|
||||
|
||||
this->eng_list.clear();
|
||||
|
||||
/* Make list of all available train engines and wagons.
|
||||
@@ -1250,7 +1267,7 @@ struct BuildVehicleWindow : Window {
|
||||
EngineID eid = e->index;
|
||||
const RailVehicleInfo *rvi = &e->u.rail;
|
||||
|
||||
if (this->filter.railtype != RAILTYPE_END && !HasPowerOnRail(rvi->railtype, this->filter.railtype)) continue;
|
||||
if (this->filter.railtype != INVALID_RAILTYPE && !HasPowerOnRail(rvi->railtype, this->filter.railtype)) continue;
|
||||
if (!IsEngineBuildable(eid, VEH_TRAIN, _local_company)) continue;
|
||||
|
||||
/* Filter now! So num_engines and num_wagons is valid */
|
||||
@@ -1293,7 +1310,8 @@ struct BuildVehicleWindow : Window {
|
||||
if (!this->show_hidden_engines && e->IsHidden(_local_company)) continue;
|
||||
EngineID eid = e->index;
|
||||
if (!IsEngineBuildable(eid, VEH_ROAD, _local_company)) continue;
|
||||
if (!HasBit(this->filter.roadtypes, HasBit(EngInfo(eid)->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD)) continue;
|
||||
if (this->filter.roadtype != INVALID_ROADTYPE && !HasPowerOnRoad(e->u.road.roadtype, this->filter.roadtype)) continue;
|
||||
|
||||
this->eng_list.push_back(eid);
|
||||
|
||||
if (eid == this->sel_engine) sel_id = eid;
|
||||
@@ -1351,6 +1369,10 @@ struct BuildVehicleWindow : Window {
|
||||
void GenerateBuildList()
|
||||
{
|
||||
if (!this->eng_list.NeedRebuild()) return;
|
||||
|
||||
/* Update filter type in case the road/railtype of the depot got converted */
|
||||
this->UpdateFilterByTile();
|
||||
|
||||
switch (this->vehicle_type) {
|
||||
default: NOT_REACHED();
|
||||
case VEH_TRAIN:
|
||||
@@ -1482,6 +1504,9 @@ struct BuildVehicleWindow : Window {
|
||||
if (this->vehicle_type == VEH_TRAIN && !this->listview_mode && !this->virtual_train_mode) {
|
||||
const RailtypeInfo *rti = GetRailTypeInfo(this->filter.railtype);
|
||||
SetDParam(0, rti->strings.build_caption);
|
||||
} else if (this->vehicle_type == VEH_ROAD && !this->listview_mode) {
|
||||
const RoadTypeInfo *rti = GetRoadTypeInfo(this->filter.roadtype);
|
||||
SetDParam(0, rti->strings.build_caption);
|
||||
} else {
|
||||
SetDParam(0, (this->listview_mode ? STR_VEHICLE_LIST_AVAILABLE_TRAINS : STR_BUY_VEHICLE_TRAIN_ALL_CAPTION) + this->vehicle_type);
|
||||
}
|
||||
|
@@ -75,6 +75,8 @@ CommandProc CmdBuildRoad;
|
||||
|
||||
CommandProc CmdBuildRoadDepot;
|
||||
|
||||
CommandProc CmdConvertRoad;
|
||||
|
||||
CommandProc CmdBuildAirport;
|
||||
|
||||
CommandProc CmdBuildDock;
|
||||
@@ -298,6 +300,7 @@ static const Command _command_proc_table[] = {
|
||||
DEF_CMD(CmdRemoveLongRoad, CMD_NO_TEST | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_REMOVE_LONG_ROAD; towns may disallow removing road bits (as they are connected) in test, but in exec they're removed and thus removing is allowed.
|
||||
DEF_CMD(CmdBuildRoad, CMD_DEITY | CMD_NO_WATER | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_ROAD
|
||||
DEF_CMD(CmdBuildRoadDepot, CMD_NO_WATER | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_ROAD_DEPOT
|
||||
DEF_CMD(CmdConvertRoad, 0, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_CONVERT_ROAD
|
||||
|
||||
DEF_CMD(CmdBuildAirport, CMD_NO_WATER | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_AIRPORT
|
||||
DEF_CMD(CmdBuildDock, CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_DOCK
|
||||
|
@@ -242,6 +242,7 @@ enum Commands {
|
||||
CMD_REMOVE_LONG_ROAD, ///< remove a complete road (not a "half" one)
|
||||
CMD_BUILD_ROAD, ///< build a "half" road
|
||||
CMD_BUILD_ROAD_DEPOT, ///< build a road depot
|
||||
CMD_CONVERT_ROAD, ///< convert a road type
|
||||
|
||||
CMD_BUILD_AIRPORT, ///< build an airport
|
||||
|
||||
|
@@ -44,6 +44,9 @@ struct CompanyInfrastructure {
|
||||
return total;
|
||||
}
|
||||
|
||||
uint32 GetRoadTotal() const;
|
||||
uint32 GetTramTotal() const;
|
||||
|
||||
char *Dump(char *buffer, const char *last) const;
|
||||
};
|
||||
|
||||
|
@@ -568,7 +568,7 @@ Company *DoStartupNewCompany(bool is_ai, CompanyID company = INVALID_COMPANY)
|
||||
c->share_owners[0] = c->share_owners[1] = c->share_owners[2] = c->share_owners[3] = INVALID_OWNER;
|
||||
|
||||
c->avail_railtypes = GetCompanyRailtypes(c->index);
|
||||
c->avail_roadtypes = GetCompanyRoadtypes(c->index);
|
||||
c->avail_roadtypes = GetCompanyRoadTypes(c->index);
|
||||
c->inaugurated_year = _cur_year;
|
||||
RandomCompanyManagerFaceBits(c->face, (GenderEthnicity)Random(), false, false); // create a random company manager face
|
||||
|
||||
@@ -1183,11 +1183,40 @@ int CompanyServiceInterval(const Company *c, VehicleType type)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get total sum of all owned road bits.
|
||||
* @return Combined total road road bits.
|
||||
*/
|
||||
uint32 CompanyInfrastructure::GetRoadTotal() const
|
||||
{
|
||||
uint32 total = 0;
|
||||
for (RoadType rt = ROADTYPE_BEGIN; rt != ROADTYPE_END; rt++) {
|
||||
if (RoadTypeIsRoad(rt)) total += this->road[rt];
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get total sum of all owned tram bits.
|
||||
* @return Combined total of tram road bits.
|
||||
*/
|
||||
uint32 CompanyInfrastructure::GetTramTotal() const
|
||||
{
|
||||
uint32 total = 0;
|
||||
for (RoadType rt = ROADTYPE_BEGIN; rt != ROADTYPE_END; rt++) {
|
||||
if (RoadTypeIsTram(rt)) total += this->road[rt];
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
char *CompanyInfrastructure::Dump(char *buffer, const char *last) const
|
||||
{
|
||||
for (RailType rt = RAILTYPE_BEGIN; rt != RAILTYPE_END; rt++) {
|
||||
if (rail[rt]) buffer += seprintf(buffer, last, "Rail: %s: %u\n", GetStringPtr(GetRailTypeInfo(rt)->strings.name), rail[rt]);
|
||||
}
|
||||
for (RoadType rt = ROADTYPE_BEGIN; rt != ROADTYPE_END; rt++) {
|
||||
if (road[rt]) buffer += seprintf(buffer, last, "%s: %s: %u\n", RoadTypeIsTram(rt) ? "Tram" : "Road", GetStringPtr(GetRoadTypeInfo(rt)->strings.name), road[rt]);
|
||||
}
|
||||
buffer += seprintf(buffer, last, "Signal: %u\n", signal);
|
||||
buffer += seprintf(buffer, last, "Road: %u\n", road[ROADTYPE_ROAD]);
|
||||
buffer += seprintf(buffer, last, "Tram: %u\n", road[ROADTYPE_TRAM]);
|
||||
|
@@ -31,6 +31,7 @@
|
||||
#include "core/geometry_func.hpp"
|
||||
#include "object_type.h"
|
||||
#include "rail.h"
|
||||
#include "road.h"
|
||||
#include "engine_base.h"
|
||||
#include "window_func.h"
|
||||
#include "road_func.h"
|
||||
@@ -1786,6 +1787,10 @@ static const NWidgetPart _nested_company_infrastructure_widgets[] = {
|
||||
NWidget(WWT_EMPTY, COLOUR_GREY, WID_CI_ROAD_DESC), SetMinimalTextLines(2, 0), SetFill(1, 0),
|
||||
NWidget(WWT_EMPTY, COLOUR_GREY, WID_CI_ROAD_COUNT), SetMinimalTextLines(2, 0), SetFill(0, 1),
|
||||
EndContainer(),
|
||||
NWidget(NWID_HORIZONTAL), SetPIP(2, 4, 2),
|
||||
NWidget(WWT_EMPTY, COLOUR_GREY, WID_CI_TRAM_DESC), SetMinimalTextLines(2, 0), SetFill(1, 0),
|
||||
NWidget(WWT_EMPTY, COLOUR_GREY, WID_CI_TRAM_COUNT), SetMinimalTextLines(2, 0), SetFill(0, 1),
|
||||
EndContainer(),
|
||||
NWidget(NWID_HORIZONTAL), SetPIP(2, 4, 2),
|
||||
NWidget(WWT_EMPTY, COLOUR_GREY, WID_CI_WATER_DESC), SetMinimalTextLines(2, 0), SetFill(1, 0),
|
||||
NWidget(WWT_EMPTY, COLOUR_GREY, WID_CI_WATER_COUNT), SetMinimalTextLines(2, 0), SetFill(0, 1),
|
||||
@@ -1823,7 +1828,7 @@ struct CompanyInfrastructureWindow : Window
|
||||
void UpdateRailRoadTypes()
|
||||
{
|
||||
this->railtypes = RAILTYPES_NONE;
|
||||
this->roadtypes = ROADTYPES_ROAD; // Road is always available.
|
||||
this->roadtypes = ROADTYPES_NONE;
|
||||
|
||||
/* Find the used railtypes. */
|
||||
Engine *e;
|
||||
@@ -1836,14 +1841,16 @@ struct CompanyInfrastructureWindow : Window
|
||||
/* Get the date introduced railtypes as well. */
|
||||
this->railtypes = AddDateIntroducedRailTypes(this->railtypes, MAX_DAY);
|
||||
|
||||
/* Tram is only visible when there will be a tram. */
|
||||
/* Find the used roadtypes. */
|
||||
FOR_ALL_ENGINES_OF_TYPE(e, VEH_ROAD) {
|
||||
if (!HasBit(e->info.climates, _settings_game.game_creation.landscape)) continue;
|
||||
if (!HasBit(e->info.misc_flags, EF_ROAD_TRAM)) continue;
|
||||
|
||||
this->roadtypes |= ROADTYPES_TRAM;
|
||||
break;
|
||||
this->roadtypes |= GetRoadTypeInfo(e->u.road.roadtype)->introduces_roadtypes;
|
||||
}
|
||||
|
||||
/* Get the date introduced roadtypes as well. */
|
||||
this->roadtypes = AddDateIntroducedRoadTypes(this->roadtypes, MAX_DAY);
|
||||
this->roadtypes &= ~_roadtypes_hidden_mask;
|
||||
}
|
||||
|
||||
/** Get total infrastructure maintenance cost. */
|
||||
@@ -1858,8 +1865,11 @@ struct CompanyInfrastructureWindow : Window
|
||||
}
|
||||
total += SignalMaintenanceCost(c->infrastructure.signal);
|
||||
|
||||
if (HasBit(this->roadtypes, ROADTYPE_ROAD)) total += RoadMaintenanceCost(ROADTYPE_ROAD, c->infrastructure.road[ROADTYPE_ROAD]);
|
||||
if (HasBit(this->roadtypes, ROADTYPE_TRAM)) total += RoadMaintenanceCost(ROADTYPE_TRAM, c->infrastructure.road[ROADTYPE_TRAM]);
|
||||
uint32 road_total = c->infrastructure.GetRoadTotal();
|
||||
uint32 tram_total = c->infrastructure.GetTramTotal();
|
||||
for (RoadType rt = ROADTYPE_BEGIN; rt != ROADTYPE_END; rt++) {
|
||||
if (HasBit(this->roadtypes, rt)) total += RoadMaintenanceCost(rt, c->infrastructure.road[rt], RoadTypeIsRoad(rt) ? road_total : tram_total);
|
||||
}
|
||||
|
||||
total += CanalMaintenanceCost(c->infrastructure.water);
|
||||
total += StationMaintenanceCost(c->infrastructure.station);
|
||||
@@ -1887,7 +1897,8 @@ struct CompanyInfrastructureWindow : Window
|
||||
|
||||
size->width = max(size->width, GetStringBoundingBox(STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT).width);
|
||||
|
||||
for (RailType rt = RAILTYPE_BEGIN; rt < RAILTYPE_END; rt++) {
|
||||
RailType rt;
|
||||
FOR_ALL_SORTED_RAILTYPES(rt) {
|
||||
if (HasBit(this->railtypes, rt)) {
|
||||
lines++;
|
||||
SetDParam(0, GetRailTypeInfo(rt)->strings.name);
|
||||
@@ -1903,18 +1914,19 @@ struct CompanyInfrastructureWindow : Window
|
||||
break;
|
||||
}
|
||||
|
||||
case WID_CI_ROAD_DESC: {
|
||||
uint lines = 1;
|
||||
case WID_CI_ROAD_DESC:
|
||||
case WID_CI_TRAM_DESC: {
|
||||
uint lines = 0;
|
||||
|
||||
size->width = max(size->width, GetStringBoundingBox(STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT).width);
|
||||
size->width = max(size->width, GetStringBoundingBox(widget == WID_CI_ROAD_DESC ? STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT : STR_COMPANY_INFRASTRUCTURE_VIEW_TRAM_SECT).width);
|
||||
|
||||
if (HasBit(this->roadtypes, ROADTYPE_ROAD)) {
|
||||
lines++;
|
||||
size->width = max(size->width, GetStringBoundingBox(STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD).width + WD_FRAMERECT_LEFT);
|
||||
}
|
||||
if (HasBit(this->roadtypes, ROADTYPE_TRAM)) {
|
||||
lines++;
|
||||
size->width = max(size->width, GetStringBoundingBox(STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY).width + WD_FRAMERECT_LEFT);
|
||||
RoadType rt;
|
||||
FOR_ALL_SORTED_ROADTYPES(rt) {
|
||||
if (HasBit(this->roadtypes, rt) && RoadTypeIsRoad(rt) == (widget == WID_CI_ROAD_DESC)) {
|
||||
lines++;
|
||||
SetDParam(0, GetRoadTypeInfo(rt)->strings.name);
|
||||
size->width = max(size->width, GetStringBoundingBox(STR_WHITE_STRING).width + WD_FRAMERECT_LEFT);
|
||||
}
|
||||
}
|
||||
|
||||
size->height = max(size->height, lines * FONT_HEIGHT_NORMAL);
|
||||
@@ -1934,6 +1946,7 @@ struct CompanyInfrastructureWindow : Window
|
||||
|
||||
case WID_CI_RAIL_COUNT:
|
||||
case WID_CI_ROAD_COUNT:
|
||||
case WID_CI_TRAM_COUNT:
|
||||
case WID_CI_WATER_COUNT:
|
||||
case WID_CI_STATION_COUNT:
|
||||
case WID_CI_TOTAL: {
|
||||
@@ -1947,9 +1960,12 @@ struct CompanyInfrastructureWindow : Window
|
||||
}
|
||||
max_val = max(max_val, c->infrastructure.signal);
|
||||
max_cost = max(max_cost, SignalMaintenanceCost(c->infrastructure.signal));
|
||||
uint32 road_total = c->infrastructure.GetRoadTotal();
|
||||
uint32 tram_total = c->infrastructure.GetTramTotal();
|
||||
for (RoadType rt = ROADTYPE_BEGIN; rt < ROADTYPE_END; rt++) {
|
||||
max_val = max(max_val, c->infrastructure.road[rt]);
|
||||
max_cost = max(max_cost, RoadMaintenanceCost(rt, c->infrastructure.road[rt]));
|
||||
max_cost = max(max_cost, RoadMaintenanceCost(rt, c->infrastructure.road[rt], RoadTypeIsRoad(rt) ? road_total : tram_total));
|
||||
|
||||
}
|
||||
max_val = max(max_val, c->infrastructure.water);
|
||||
max_cost = max(max_cost, CanalMaintenanceCost(c->infrastructure.water));
|
||||
@@ -2045,26 +2061,32 @@ struct CompanyInfrastructureWindow : Window
|
||||
}
|
||||
|
||||
case WID_CI_ROAD_DESC:
|
||||
DrawString(r.left, r.right, y, STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT);
|
||||
case WID_CI_TRAM_DESC: {
|
||||
DrawString(r.left, r.right, y, widget == WID_CI_ROAD_DESC ? STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT : STR_COMPANY_INFRASTRUCTURE_VIEW_TRAM_SECT);
|
||||
|
||||
if (this->roadtypes != ROADTYPES_NONE) {
|
||||
if (HasBit(this->roadtypes, ROADTYPE_ROAD)) DrawString(r.left + offs_left, r.right - offs_right, y += FONT_HEIGHT_NORMAL, STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD);
|
||||
if (HasBit(this->roadtypes, ROADTYPE_TRAM)) DrawString(r.left + offs_left, r.right - offs_right, y += FONT_HEIGHT_NORMAL, STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY);
|
||||
} else {
|
||||
/* No valid roadtypes. */
|
||||
DrawString(r.left + offs_left, r.right - offs_right, y += FONT_HEIGHT_NORMAL, STR_COMPANY_VIEW_INFRASTRUCTURE_NONE);
|
||||
/* Draw name of each valid roadtype. */
|
||||
RoadType rt;
|
||||
FOR_ALL_SORTED_ROADTYPES(rt) {
|
||||
if (HasBit(this->roadtypes, rt) && RoadTypeIsRoad(rt) == (widget == WID_CI_ROAD_DESC)) {
|
||||
SetDParam(0, GetRoadTypeInfo(rt)->strings.name);
|
||||
DrawString(r.left + offs_left, r.right - offs_right, y += FONT_HEIGHT_NORMAL, STR_WHITE_STRING);
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case WID_CI_ROAD_COUNT:
|
||||
if (HasBit(this->roadtypes, ROADTYPE_ROAD)) {
|
||||
this->DrawCountLine(r, y, c->infrastructure.road[ROADTYPE_ROAD], RoadMaintenanceCost(ROADTYPE_ROAD, c->infrastructure.road[ROADTYPE_ROAD]));
|
||||
}
|
||||
if (HasBit(this->roadtypes, ROADTYPE_TRAM)) {
|
||||
this->DrawCountLine(r, y, c->infrastructure.road[ROADTYPE_TRAM], RoadMaintenanceCost(ROADTYPE_TRAM, c->infrastructure.road[ROADTYPE_TRAM]));
|
||||
case WID_CI_TRAM_COUNT: {
|
||||
uint32 road_tram_total = widget == WID_CI_ROAD_COUNT ? c->infrastructure.GetRoadTotal() : c->infrastructure.GetTramTotal();
|
||||
RoadType rt;
|
||||
FOR_ALL_SORTED_ROADTYPES(rt) {
|
||||
if (HasBit(this->roadtypes, rt) && RoadTypeIsRoad(rt) == (widget == WID_CI_ROAD_COUNT)) {
|
||||
this->DrawCountLine(r, y, c->infrastructure.road[rt], RoadMaintenanceCost(rt, c->infrastructure.road[rt], road_tram_total));
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case WID_CI_WATER_DESC:
|
||||
DrawString(r.left, r.right, y, STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT);
|
||||
|
@@ -729,8 +729,10 @@ static void CompaniesGenStatistics()
|
||||
if (c->infrastructure.rail[rt] != 0) cost.AddCost(RailMaintenanceCost(rt, c->infrastructure.rail[rt], rail_total));
|
||||
}
|
||||
cost.AddCost(SignalMaintenanceCost(c->infrastructure.signal));
|
||||
uint32 road_total = c->infrastructure.GetRoadTotal();
|
||||
uint32 tram_total = c->infrastructure.GetTramTotal();
|
||||
for (RoadType rt = ROADTYPE_BEGIN; rt < ROADTYPE_END; rt++) {
|
||||
if (c->infrastructure.road[rt] != 0) cost.AddCost(RoadMaintenanceCost(rt, c->infrastructure.road[rt]));
|
||||
if (c->infrastructure.road[rt] != 0) cost.AddCost(RoadMaintenanceCost(rt, c->infrastructure.road[rt], RoadTypeIsRoad(rt) ? road_total : tram_total));
|
||||
}
|
||||
cost.AddCost(CanalMaintenanceCost(c->infrastructure.water));
|
||||
cost.AddCost(StationMaintenanceCost(c->infrastructure.station));
|
||||
|
@@ -718,7 +718,7 @@ void StartupEngines()
|
||||
Company *c;
|
||||
FOR_ALL_COMPANIES(c) {
|
||||
c->avail_railtypes = GetCompanyRailtypes(c->index);
|
||||
c->avail_roadtypes = GetCompanyRoadtypes(c->index);
|
||||
c->avail_roadtypes = GetCompanyRoadTypes(c->index);
|
||||
}
|
||||
|
||||
/* Invalidate any open purchase lists */
|
||||
@@ -740,7 +740,8 @@ static void AcceptEnginePreview(EngineID eid, CompanyID company)
|
||||
assert(e->u.rail.railtype < RAILTYPE_END);
|
||||
c->avail_railtypes = AddDateIntroducedRailTypes(c->avail_railtypes | GetRailTypeInfo(e->u.rail.railtype)->introduces_railtypes, _date);
|
||||
} else if (e->type == VEH_ROAD) {
|
||||
SetBit(c->avail_roadtypes, HasBit(e->info.misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD);
|
||||
assert(e->u.road.roadtype < ROADTYPE_END);
|
||||
c->avail_roadtypes = AddDateIntroducedRoadTypes(c->avail_roadtypes | GetRoadTypeInfo(e->u.road.roadtype)->introduces_roadtypes, _date);
|
||||
}
|
||||
|
||||
e->preview_company = INVALID_COMPANY;
|
||||
@@ -820,6 +821,7 @@ void EnginesDailyLoop()
|
||||
Company *c;
|
||||
FOR_ALL_COMPANIES(c) {
|
||||
c->avail_railtypes = AddDateIntroducedRailTypes(c->avail_railtypes, _date);
|
||||
c->avail_roadtypes = AddDateIntroducedRoadTypes(c->avail_roadtypes, _date);
|
||||
}
|
||||
|
||||
if (_cur_year >= _year_engine_aging_stops) return;
|
||||
@@ -961,7 +963,8 @@ static void NewVehicleAvailable(Engine *e)
|
||||
FOR_ALL_COMPANIES(c) c->avail_railtypes = AddDateIntroducedRailTypes(c->avail_railtypes | GetRailTypeInfo(e->u.rail.railtype)->introduces_railtypes, _date);
|
||||
} else if (e->type == VEH_ROAD) {
|
||||
/* maybe make another road type available */
|
||||
FOR_ALL_COMPANIES(c) SetBit(c->avail_roadtypes, HasBit(e->info.misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD);
|
||||
assert(e->u.road.roadtype < ROADTYPE_END);
|
||||
FOR_ALL_COMPANIES(c) c->avail_roadtypes = AddDateIntroducedRoadTypes(c->avail_roadtypes | GetRoadTypeInfo(e->u.road.roadtype)->introduces_roadtypes, _date);
|
||||
}
|
||||
|
||||
/* Only broadcast event if AIs are able to build this vehicle type. */
|
||||
@@ -1108,6 +1111,11 @@ bool IsEngineBuildable(EngineID engine, VehicleType type, CompanyID company)
|
||||
const Company *c = Company::Get(company);
|
||||
if (((GetRailTypeInfo(e->u.rail.railtype))->compatible_railtypes & c->avail_railtypes) == 0) return false;
|
||||
}
|
||||
if (type == VEH_ROAD && company != OWNER_DEITY) {
|
||||
/* Check if the road type is available to this company */
|
||||
const Company *c = Company::Get(company);
|
||||
if ((GetRoadTypeInfo(e->u.road.roadtype)->powered_roadtypes & c->avail_roadtypes) == ROADTYPES_NONE) return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@@ -19,6 +19,7 @@
|
||||
#include "vehicle_func.h"
|
||||
#include "company_func.h"
|
||||
#include "rail.h"
|
||||
#include "road.h"
|
||||
#include "settings_type.h"
|
||||
#include "train.h"
|
||||
#include "roadveh.h"
|
||||
@@ -41,7 +42,8 @@ StringID GetEngineCategoryName(EngineID engine)
|
||||
const Engine *e = Engine::Get(engine);
|
||||
switch (e->type) {
|
||||
default: NOT_REACHED();
|
||||
case VEH_ROAD: return STR_ENGINE_PREVIEW_ROAD_VEHICLE;
|
||||
case VEH_ROAD:
|
||||
return GetRoadTypeInfo(e->u.road.roadtype)->strings.new_engine;
|
||||
case VEH_AIRCRAFT: return STR_ENGINE_PREVIEW_AIRCRAFT;
|
||||
case VEH_SHIP: return STR_ENGINE_PREVIEW_SHIP;
|
||||
case VEH_TRAIN:
|
||||
|
@@ -14,6 +14,7 @@
|
||||
|
||||
#include "economy_type.h"
|
||||
#include "rail_type.h"
|
||||
#include "road_type.h"
|
||||
#include "cargo_type.h"
|
||||
#include "date_type.h"
|
||||
#include "sound_type.h"
|
||||
@@ -123,6 +124,7 @@ struct RoadVehicleInfo {
|
||||
uint8 air_drag; ///< Coefficient of air drag
|
||||
byte visual_effect; ///< Bitstuffed NewGRF visual effect data
|
||||
byte shorten_factor; ///< length on main map for this type is 8 - shorten_factor
|
||||
RoadType roadtype; ///< Road type
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -64,6 +64,7 @@
|
||||
#include "../script/api/game/game_rail.hpp.sq"
|
||||
#include "../script/api/game/game_railtypelist.hpp.sq"
|
||||
#include "../script/api/game/game_road.hpp.sq"
|
||||
#include "../script/api/game/game_roadtypelist.hpp.sq"
|
||||
#include "../script/api/game/game_sign.hpp.sq"
|
||||
#include "../script/api/game/game_signlist.hpp.sq"
|
||||
#include "../script/api/game/game_station.hpp.sq"
|
||||
@@ -174,6 +175,7 @@ void GameInstance::RegisterAPI()
|
||||
SQGSRail_Register(this->engine);
|
||||
SQGSRailTypeList_Register(this->engine);
|
||||
SQGSRoad_Register(this->engine);
|
||||
SQGSRoadTypeList_Register(this->engine);
|
||||
SQGSSign_Register(this->engine);
|
||||
SQGSSignList_Register(this->engine);
|
||||
SQGSStation_Register(this->engine);
|
||||
|
@@ -30,7 +30,7 @@ void GroundVehicle<T, Type>::PowerChanged()
|
||||
uint32 total_power = 0;
|
||||
uint32 max_te = 0;
|
||||
uint32 number_of_parts = 0;
|
||||
uint16 max_track_speed = v->GetDisplayMaxSpeed();
|
||||
uint16 max_track_speed = this->vcache.cached_max_speed; // Max track speed in internal units.
|
||||
|
||||
this->CalculatePower(total_power, max_te, false);
|
||||
|
||||
|
@@ -37,7 +37,7 @@ struct GroundVehicleCache {
|
||||
uint16 cached_axle_resistance; ///< Resistance caused by the axles of the vehicle (valid only for the first engine).
|
||||
|
||||
/* Cached acceleration values, recalculated on load and each time a vehicle is added to/removed from the consist. */
|
||||
uint16 cached_max_track_speed; ///< Maximum consist speed limited by track type (valid only for the first engine).
|
||||
uint16 cached_max_track_speed; ///< Maximum consist speed (in internal units) limited by track type (valid only for the first engine).
|
||||
uint32 cached_power; ///< Total power of the consist (valid only for the first engine).
|
||||
uint32 cached_air_drag; ///< Air drag coefficient of the vehicle (valid only for the first engine).
|
||||
|
||||
|
@@ -3255,8 +3255,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}{COMPANY
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Spoorstukke:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Seine
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Padstukke:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Pad
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Tremweg
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Waterteëls:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanale
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stasies:
|
||||
@@ -4268,7 +4266,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Moet eer
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Geen geskikte treinspoor
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Moet eers spoor verwyder
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Pad is een rigting of geblok
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Vlak kruisings word nie toegelaat vir die spoor tipe nie
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Vlak kruisings word nie toegelaat vir die spoor tipe nie
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Kan nie seinligte hier bou nie...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Kan nie spore hier bou nie...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Kan nie spore hier verwyder nie...
|
||||
|
@@ -3733,7 +3733,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}يجب
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}... مسار السكة الحديدية غير مناسب
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}يجب إزاله السكه الحديديه اولاً
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}الطريق باتجاه واحد او ربما يكون مسدوداً
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}التقاطع المتعدد غير متاح لهذا النوع من السكك
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}التقاطع المتعدد غير متاح لهذا النوع من السكك
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}تعذر بناء اﻹشارات هنا...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}تعذر بناء السكه الحديديه هنا...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}تعذر إزاله السكه الحديديه من هنا...
|
||||
|
@@ -3143,8 +3143,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}{COMPANY
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Trenbide sailak:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Seinaleak
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Errepide sailak:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Errepidea
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Tranbia sailak
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Urbide sailak:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanalak
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Geltokiak:
|
||||
@@ -4140,7 +4138,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Lehendab
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Ez dago trenbide egokirik
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Lehendabizi trenbidea ezabatu
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Errepidea norabide bakarrekoa da edo blokeatua dago
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Ezin dira maila bereko pasaguneak egin trenbide mota honetan
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Ezin dira maila bereko pasaguneak egin trenbide mota honetan
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Ezin da seinalerik hemen eraiki...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Ezin da trenbiderik hemen eraiki...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Ezin da hemengo trenbidea ezabatu...
|
||||
|
@@ -3604,8 +3604,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Iнфр
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Чыгуначныя элемэнты:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Сыґналы
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Дарожныя элемэнты:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Дарогi
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Трамваi
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Водныя клеткi:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Каналы
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Станцыi:
|
||||
@@ -4653,7 +4651,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Спач
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Няма прыдатных рэйкаў
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Спачатку выдаліце чыгунку
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Дарога аднабаковая або блякаваная
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Праз гэты від рэйкаў забаронена будаваць пераезды
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Праз гэты від рэйкаў забаронена будаваць пераезды
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Тут немагчыма паставіць сьветлафор...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Тут немагчыма пракласьцi рэйкі...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Не атрымалася выдаліць чыгунку...
|
||||
|
@@ -3314,8 +3314,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infraest
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Partes de ferrovias:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Sinais
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Partes de rodovias:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Rodovia
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Linha de bonde
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Partes d'água:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Canais
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Estações:
|
||||
@@ -4343,7 +4341,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Remova o
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Tipo de linha não apropriado
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Remova a ferrovia antes
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Rua é mão única ou está bloqueada
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Cruzamentos de nível não são permitidos para esse tipo de trilho
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Cruzamentos de nível não são permitidos para esse tipo de trilho
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Impossível construir sinais aqui...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Impossível construir ferrovia aqui...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Impossível remover a ferrovia daqui...
|
||||
|
@@ -3184,8 +3184,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Инфр
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Релсови части:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Сигнали
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Пътни части:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Път
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Трамвай
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Водни части:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Канали
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Станции:
|
||||
@@ -4197,7 +4195,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Първ
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Неподходящ за употреба релсов път
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Първо трябва да бъде премахнат релсовия път
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Пътят е еднопосочен или блокиран
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Пресичането на различни видове ЖП линии не е позволено.
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Пресичането на различни видове ЖП линии не е позволено.
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Тук не може да бъдат поставени сигнали...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Тук не могат да бъдат построени ЖП релси...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Не може да премахнеш тези ЖП релси...
|
||||
|
@@ -3353,8 +3353,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infraest
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Trossos de vies:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Senyals
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Trossos de carretera:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Carretera
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Tramvia
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Cel·les d'aigua:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Canals
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Estacions:
|
||||
@@ -4388,7 +4386,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}...abans
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Via de tren no apropiada
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}...abans s'ha de treure la via.
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}La carretera és un d'un sol sentit o està bloquejada
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Els passos a nivell no estan permesos en aquest tipus de via
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Els passos a nivell no estan permesos en aquest tipus de via
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Aquí no es poden construir senyals...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Aquí no es pot construir la via de tren...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Aquí no es pot treure la via de tren...
|
||||
|
@@ -3454,8 +3454,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infrastr
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Dijelovi pruge:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Signali
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Dijelovi ceste:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Cesta
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Tramvajska pruga
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Polje s vodom:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanali
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Postaje:
|
||||
@@ -4501,7 +4499,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Najprije
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Nije prikladno za želježnicku prugu
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Najprije je potrebno ukloniti željezničku prugu
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Cesta je jednosmjerna ili je blokirana
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Pružni prijelazi nisu dopušteni za ovu vrstu pruge
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Pružni prijelazi nisu dopušteni za ovu vrstu pruge
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Ovdje nije moguće postaviti signale...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Ovdje nije moguće izgraditi željezničke tračnice...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Nije moguće ukloniti željezničku prugu odavde...
|
||||
|
@@ -3374,8 +3374,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infrastr
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Železniční oblasti:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Semafory
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Silniční oblasti:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Silnice
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Tramvajové koleje
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Vodní oblasti:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Průplavy
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stanice:
|
||||
@@ -4406,7 +4404,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Je nutn
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Žádné použitelné koleje
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Je nutné nejprve odstranit koleje
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Silnice je jednosměrná nebo zablokovaná
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Železniční přejezd není povolen pro tento typ kolejí
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Železniční přejezd není povolen pro tento typ kolejí
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Zde nelze postavit semafory...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Zde nelze postavit koleje...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Odsud nelze odstranit koleje...
|
||||
|
@@ -3356,8 +3356,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infrastr
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Spor-stykker:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Signaler
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Vej-stykker:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Vej
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Sporvogne
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Vand-felter:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanaler
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stationer:
|
||||
@@ -4391,7 +4389,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Det er n
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Ingen brugbar jernbane
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Det er nødvendigt at fjerne jernbaneskinnerne først
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Vejen er ensrettet eller blokeret
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Niveaukrydsning ikke tilladt for denne type skinner
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Niveaukrydsning ikke tilladt for denne type skinner
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Kan ikke bygge signaler her...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Kan ikke bygge jernbane her...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Kan ikke fjerne jernbane herfra...
|
||||
|
@@ -3358,8 +3358,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infrastr
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Spoordelen:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Seinen
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Wegdelen:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Weg
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Tramsporen
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Watertegels:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanalen
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stations:
|
||||
@@ -4405,7 +4403,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Verwijde
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Geen bruikbaar spoor
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Moet spoor eerst verwijderen
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Weg is eenrichtingsverkeer of geblokkeerd
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Gelijkvloerse kruisingen zijn niet toegestaan voor dit type spoor
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Gelijkvloerse kruisingen zijn niet toegestaan voor dit type spoor
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Kan hier geen seinen plaatsen...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Kan hier geen spoor leggen...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Kan hier geen spoor verwijderen...
|
||||
|
@@ -344,6 +344,7 @@ STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN :{BLACK}Zoom the
|
||||
STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}Zoom the view out
|
||||
STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Build railway track
|
||||
STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}Build roads
|
||||
STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}Build tramways
|
||||
STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}Build ship docks
|
||||
STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}Build airports
|
||||
STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}Open the landscaping toolbar to raise/lower land, plant trees, etc.
|
||||
@@ -364,6 +365,7 @@ STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}Landscap
|
||||
STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Town generation
|
||||
STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Industry generation
|
||||
STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Road construction
|
||||
STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Tramway construction
|
||||
STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Plant trees. Shift toggles building/showing cost estimate
|
||||
STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Place sign
|
||||
STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Place object. Shift toggles building/showing cost estimate
|
||||
@@ -2930,6 +2932,11 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Build ro
|
||||
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Build tramway tunnel. Shift toggles building/showing cost estimate
|
||||
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. Shift toggles building/showing cost estimate
|
||||
STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM :{BLACK}Convert/Upgrade the type of tram. Shift toggles building/showing cost estimate
|
||||
|
||||
STR_ROAD_NAME_ROAD :Road
|
||||
STR_ROAD_NAME_TRAM :Tramway
|
||||
|
||||
# Road depot construction window
|
||||
STR_BUILD_DEPOT_ROAD_ORIENTATION_CAPTION :{WHITE}Road Depot Orientation
|
||||
@@ -3147,8 +3154,11 @@ STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF:
|
||||
STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Cargo accepted: {LTBLUE}
|
||||
STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING})
|
||||
STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Rail type: {LTBLUE}{STRING}
|
||||
STR_LANG_AREA_INFORMATION_ROAD_TYPE :{BLACK}Road type: {LTBLUE}{STRING}
|
||||
STR_LANG_AREA_INFORMATION_TRAM_TYPE :{BLACK}Tram type: {LTBLUE}{STRING}
|
||||
STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Rail speed limit: {LTBLUE}{VELOCITY}
|
||||
STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Road speed limit: {LTBLUE}{VELOCITY}
|
||||
STR_LANG_AREA_INFORMATION_TRAM_SPEED_LIMIT :{BLACK}Tram speed limit: {LTBLUE}{VELOCITY}
|
||||
|
||||
# Description of land area of different tiles
|
||||
STR_LAI_CLEAR_DESCRIPTION_ROCKS :Rocks
|
||||
@@ -4016,8 +4026,7 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infrastr
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Rail pieces:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Signals
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Road pieces:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Road
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Tramway
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAM_SECT :{GOLD}Tram pieces:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Water tiles:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Canals
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stations:
|
||||
@@ -4165,10 +4174,15 @@ STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :New Electric Ra
|
||||
STR_BUY_VEHICLE_TRAIN_MONORAIL_CAPTION :New Monorail Vehicles
|
||||
STR_BUY_VEHICLE_TRAIN_MAGLEV_CAPTION :New Maglev Vehicles
|
||||
|
||||
STR_BUY_VEHICLE_TRAIN_ALL_CAPTION :New Rail Vehicles
|
||||
STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :New Road Vehicles
|
||||
STR_BUY_VEHICLE_TRAM_VEHICLE_CAPTION :New Tram Vehicles
|
||||
|
||||
############ range for vehicle availability starts
|
||||
STR_BUY_VEHICLE_TRAIN_ALL_CAPTION :New Rail Vehicles
|
||||
STR_BUY_VEHICLE_ROAD_VEHICLE_ALL_CAPTION :New Road Vehicles
|
||||
STR_BUY_VEHICLE_SHIP_CAPTION :New Ships
|
||||
STR_BUY_VEHICLE_AIRCRAFT_CAPTION :New Aircraft
|
||||
############ range for vehicle availability ends
|
||||
|
||||
STR_PURCHASE_INFO_COST_WEIGHT :{BLACK}Cost: {GOLD}{CURRENCY_LONG}{BLACK} Weight: {GOLD}{WEIGHT_SHORT}
|
||||
STR_PURCHASE_INFO_COST_REFIT_WEIGHT :{BLACK}Cost: {GOLD}{CURRENCY_LONG}{BLACK} (Refit Cost: {GOLD}{CURRENCY_LONG}{BLACK}) Weight: {GOLD}{WEIGHT_SHORT}
|
||||
@@ -4334,13 +4348,18 @@ STR_DEPOT_SELL_CONFIRMATION_TEXT :{YELLOW}You are
|
||||
# Engine preview window
|
||||
STR_ENGINE_PREVIEW_CAPTION :{WHITE}Message from vehicle manufacturer
|
||||
STR_ENGINE_PREVIEW_MESSAGE :{GOLD}We have just designed a new {STRING} - would you be interested in a year's exclusive use of this vehicle, so we can see how it performs before making it universally available?
|
||||
|
||||
STR_ENGINE_PREVIEW_RAILROAD_LOCOMOTIVE :railway locomotive
|
||||
STR_ENGINE_PREVIEW_ROAD_VEHICLE :road vehicle
|
||||
STR_ENGINE_PREVIEW_AIRCRAFT :aircraft
|
||||
STR_ENGINE_PREVIEW_SHIP :ship
|
||||
STR_ENGINE_PREVIEW_ELRAIL_LOCOMOTIVE :electrified railway locomotive
|
||||
STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :monorail locomotive
|
||||
STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :maglev locomotive
|
||||
|
||||
STR_ENGINE_PREVIEW_ROAD_VEHICLE :road vehicle
|
||||
STR_ENGINE_PREVIEW_TRAM_VEHICLE :tramway vehicle
|
||||
|
||||
STR_ENGINE_PREVIEW_AIRCRAFT :aircraft
|
||||
STR_ENGINE_PREVIEW_SHIP :ship
|
||||
|
||||
STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Cost: {CURRENCY_LONG} Weight: {WEIGHT_SHORT}{}Speed: {VELOCITY} Power: {POWER}{}Running Cost: {CURRENCY_LONG}/yr{}Capacity: {CARGO_LONG}
|
||||
STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Cost: {CURRENCY_LONG} Weight: {WEIGHT_SHORT}{}Speed: {VELOCITY} Power: {POWER} Max. T.E.: {6:FORCE}{}Running Cost: {4:CURRENCY_LONG}/yr{}Capacity: {5:CARGO_LONG}
|
||||
STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Max. Speed: {VELOCITY}{}Capacity: {CARGO_LONG}{}Running Cost: {CURRENCY_LONG}/yr
|
||||
@@ -4378,14 +4397,19 @@ STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Switch b
|
||||
STR_REPLACE_ENGINES :Engines
|
||||
STR_REPLACE_WAGONS :Wagons
|
||||
STR_REPLACE_ALL_RAILTYPE :All rail vehicles
|
||||
STR_REPLACE_ALL_ROADTYPE :All road vehicles
|
||||
|
||||
STR_REPLACE_HELP_RAILTYPE :{BLACK}Choose the rail type you want to replace engines for
|
||||
STR_REPLACE_HELP_ROADTYPE :{BLACK}Choose the road type you want to replace engines for
|
||||
STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Displays which engine the left selected engine is being replaced with, if any
|
||||
STR_REPLACE_RAIL_VEHICLES :Rail Vehicles
|
||||
STR_REPLACE_ELRAIL_VEHICLES :Electrified Rail Vehicles
|
||||
STR_REPLACE_MONORAIL_VEHICLES :Monorail Vehicles
|
||||
STR_REPLACE_MAGLEV_VEHICLES :Maglev Vehicles
|
||||
|
||||
STR_REPLACE_ROAD_VEHICLES :Road Vehicles
|
||||
STR_REPLACE_TRAM_VEHICLES :Tramway Vehicles
|
||||
|
||||
STR_REPLACE_REMOVE_WAGON :{BLACK}Wagon removal: {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
|
||||
|
||||
@@ -5290,7 +5314,8 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Must rem
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}No suitable railway track
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Must remove railway track first
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Road is one way or blocked
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Level crossings not allowed for this rail type
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Level crossings not allowed for this rail type
|
||||
STR_ERROR_CROSSING_DISALLOWED_ROAD :{WHITE}Level crossings not allowed for this road type
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Can't build signals here...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Can't build railway track here...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Can't remove railway track from here...
|
||||
@@ -5312,6 +5337,12 @@ STR_ERROR_CAN_T_REMOVE_ROAD_FROM :{WHITE}Can't re
|
||||
STR_ERROR_CAN_T_REMOVE_TRAMWAY_FROM :{WHITE}Can't remove tramway from here...
|
||||
STR_ERROR_THERE_IS_NO_ROAD :{WHITE}... there is no road
|
||||
STR_ERROR_THERE_IS_NO_TRAMWAY :{WHITE}... there is no tramway
|
||||
STR_ERROR_CAN_T_CONVERT_ROAD :{WHITE}Can't convert road type here...
|
||||
STR_ERROR_CAN_T_CONVERT_TRAMWAY :{WHITE}Can't convert tram type here...
|
||||
STR_ERROR_NO_SUITABLE_ROAD :{WHITE}No suitable road
|
||||
STR_ERROR_NO_SUITABLE_TRAMWAY :{WHITE}No suitable tramway
|
||||
STR_ERROR_INCOMPATIBLE_ROAD :{WHITE}... incompatible road
|
||||
STR_ERROR_INCOMPATIBLE_TRAMWAY :{WHITE}... incompatible tramway
|
||||
|
||||
# Waterway construction errors
|
||||
STR_ERROR_CAN_T_BUILD_CANALS :{WHITE}Can't build canals here...
|
||||
|
@@ -3221,8 +3221,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infrastr
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Rail pieces:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Signals
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Road pieces:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Road
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Tramway
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Water tiles:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Canals
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stations:
|
||||
@@ -4217,7 +4215,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Must rem
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}No suitable railway track
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Must remove railway track first
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Road is one way or blocked
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Level crossings not allowed for this rail type
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Level crossings not allowed for this rail type
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Can't build signals here...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Can't build railway track here...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Can't remove railway track from here...
|
||||
|
@@ -3355,8 +3355,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infrastr
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Rail pieces:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Signals
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Road pieces:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Road
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Streetcar
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Water tiles:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Canals
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stations:
|
||||
@@ -4402,7 +4400,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Must rem
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}No suitable railroad track
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Must remove railroad track first
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Road is one way or blocked
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Grade crossings not allowed for this rail type
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Grade crossings not allowed for this rail type
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Can't build signals here...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Can't build railroad track here...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Can't remove railroad track from here...
|
||||
|
@@ -3645,7 +3645,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Unue vi
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Nekonvena fervojtrako
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Antaŭe devas la trako esti detruita
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Strato estas unudirekta aŭ blokita
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Traknivelaj pasejoj ne permesa por ĉi tio fervojtipo
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Traknivelaj pasejoj ne permesa por ĉi tio fervojtipo
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Ne povas konstrui signalojn ĉi tie...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Ne povas konstrui trakon ĉi tie...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Ne povas forigi trakon de ĉi tie...
|
||||
|
@@ -3332,8 +3332,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE} {COMPAN
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Raudtee tükid:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Signaalid
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Tee tükid:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Tee
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Trammitee
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Veekogu ruudud:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanalid
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Jaamad:
|
||||
@@ -4351,7 +4349,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Signaali
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Sobiv rongitee puudub
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Rööbastee tuleb eelnevalt lammutada
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Läbipääsmatu või ühesuunaline maantee
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Ülesõidukohad on selle raudteetüübi puhul keelatud
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Ülesõidukohad on selle raudteetüübi puhul keelatud
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Siia ei saa signaale rajada...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Siia ei saa raudteed ehitada...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Siit ei saa raudteed lammutada...
|
||||
|
@@ -2889,8 +2889,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Innanker
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Jarnbreyta pettir:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Tekin
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Vega pettir:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Vegur
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Sporvognur
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Vatn puntar:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Siglingarennir
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Støðir:
|
||||
@@ -3790,7 +3788,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Neyðugt
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Ikki hóskandi jarnbreyt
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Neyðugt at beina burtur jarnbreyt fyrst
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Vegur er einvegis ella blokeraður
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Javnir krossvegir ikki loyvdir fyri hetta slagi av tok bana
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Javnir krossvegir ikki loyvdir fyri hetta slagi av tok bana
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Kann ikki byggja jarnbreytatekin her...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Kann ikki byggja jarnbreyt her...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Kann ikki beina burtur jarnbreyt hagani...
|
||||
|
@@ -3358,8 +3358,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}{COMPANY
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Rautatiepalat:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Opastimet
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Teiden palat:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Tie
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Raitiotie
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Vesiruudut:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanavat
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Asemat:
|
||||
@@ -4405,7 +4403,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Opastime
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Ei kelvollista rautatietä.
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Rautatie pitää poistaa ensin.
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Tie on yksisuuntainen tai suljettu
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Tasoristeykset eivät ole sallittu tälle raidetyypille
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Tasoristeykset eivät ole sallittu tälle raidetyypille
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Opastinta ei voi rakentaa.
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Rautatietä ei voi rakentaa.
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Rautatietä ei voi poistaa.
|
||||
|
@@ -3356,8 +3356,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infrastr
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Morceaux de voie ferrée{NBSP}:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Signaux
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Morceaux de route{NBSP}:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Route
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Tramway
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Cases d'eau{NBSP}:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Canaux
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stations{NBSP}:
|
||||
@@ -4403,7 +4401,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Vous dev
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Aucuns rails convenables
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Vous devez d'abord enlever les rails
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}La route est à sens unique ou bloquée
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Les passages à niveau ne sont pas authorisés pour ce type de rails
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Les passages à niveau ne sont pas authorisés pour ce type de rails
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Impossible de construire des signaux ici...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Impossible de construire des rails ici...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Impossible de retirer les rails d'ici...
|
||||
|
@@ -3533,8 +3533,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Am bun-s
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Earrannan rèile:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Comharran
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Earrannan rathaid:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Rathad
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Slighe-trama
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Leacan uisge:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Canalan
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stèiseanan:
|
||||
@@ -4563,7 +4561,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Feumaidh
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Chan eil slighe rèile iomchaidh ann
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Feumaidh tu an t-slighe rèile a thoirt air falbh an toiseach
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Rathad aon-shligheach no bacte
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Chan eil staranan-rèile ceadaichte leis an t-seòrsa dhe rèile seo
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Chan eil staranan-rèile ceadaichte leis an t-seòrsa dhe rèile seo
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Cha ghabh comharran togail an-seo...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Cha ghabh slighe-rèile togail an-seo...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Cha ghabh an t-slighe-rèile toirt air falbh an-seo...
|
||||
|
@@ -3259,8 +3259,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infraest
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Segmentos de vía de ferrocarril:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Sinais
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Segmentos de estrada:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Estrada
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE} Tranvía
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Cadros de auga:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Canles
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Estacións:
|
||||
@@ -4287,7 +4285,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Debes re
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Non hay vía de ferrocarril adecuada
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Debes elimina-la vía de ferrocarril primeiro
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}A estrada é de sentido único ou está bloqueada
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Non se permiten pasos a nivel con este tipo de carril
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Non se permiten pasos a nivel con este tipo de carril
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Non se poden construír sinais aquí...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Non se pode construír vía ferroviaria aquí...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Non se pode elimina-la vía ferroviaria de aquí...
|
||||
|
@@ -3884,8 +3884,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infrastr
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Schienenfelder:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Signale
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Straßenfelder:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Straße
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Straßenbahnfelder
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Wasserfelder:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanäle
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stationen:
|
||||
@@ -5075,7 +5073,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Signal m
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Keine geeigneten Gleise
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Gleise müssen erst abgerissen werden
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Einbahnstraße oder blockierter Weg
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Bahnübergänge sind für diesen Schienentyp nicht erlaubt
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Bahnübergänge sind für diesen Schienentyp nicht erlaubt
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Signal kann hier nicht aufgestellt werden...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Gleise können hier nicht verlegt werden...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Gleise können nicht abgerissen werden...
|
||||
|
@@ -3462,8 +3462,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Υποδ
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Κομμάτια σιδηροτροχιάς:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Σήματα
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Κομμάτια δρόμου:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Δρόμος
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Τροχιόδρομος
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Τετραγωνίδια νερού:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Κανάλια
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Σταθμοί:
|
||||
@@ -4514,7 +4512,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Πρέπ
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Μη συμβατή σιδηροτροχιά
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Πρέπει να αφαιρεθεί ο σιδηρόδρομος πρώτα
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Η δρόμος είναι μονόδρομος ή μπλοκαρισμένος
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Δεν επιτρέπονται ισόπεδες διασταυρώσεις για αυτόν τον τύπο σιδηροδρόμου
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Δεν επιτρέπονται ισόπεδες διασταυρώσεις για αυτόν τον τύπο σιδηροδρόμου
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Δεν μπορούν να τοποθετοηθούν σηματοδότες εδώ...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Δεν μπορεί να κτιστεί σιδηρόδρομος εδώ...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Δεν μπορεί να αφαιρεθεί σιδηρόδρομος από εδώ...
|
||||
|
@@ -3312,8 +3312,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}תתיו
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}חלקי מסילה:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}רמזורים
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}חלקי כביש:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}כביש
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}מסילת רכבת קלה
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}משבצות מים:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}תעלות
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}תחנות:
|
||||
@@ -4342,7 +4340,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}יש ל
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}אין מסילת רכבת מתאימה
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}יש להסיר את המסילה הקיימת תחילה
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}כביש חד סיטרי או חסום
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}מפגשי כביש/מסילה אין אפשריים עבור סוג מסילה זה
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}מפגשי כביש/מסילה אין אפשריים עבור סוג מסילה זה
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}לא ניתן למקם רמזורים כאן...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}לא ניתן להניח פסי רכבת כאן...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}לא ניתן להסיר פסי רכבת ממשבצת זו...
|
||||
|
@@ -3419,8 +3419,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}{COMPANY
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Vasúti elemek:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Vasúti jelzők
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Közúti elemek:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Út
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Villamospálya
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Vízi elemek:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Csatornák
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Állomások:
|
||||
@@ -4466,7 +4464,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Előszö
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Nincs megfelelő vasúti pálya
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Előbb le kell rombolnod a vasúti pályát
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}... az út egyirányú vagy blokkolt
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Ehhez a síntipushoz nem megengedett vasúti átjárók építése
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Ehhez a síntipushoz nem megengedett vasúti átjárók építése
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Nem helyezhetsz ide jelzőt...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Nem építhetsz ide vasúti pályát...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Nem szedheted fel innen a vasúti pályát...
|
||||
|
@@ -3045,8 +3045,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Innviði
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Járnbrautarspor:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Umferðarmerki
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Vegir:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Vegir
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Sporvagnaspor
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Vatns reitir:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Skipaskurðir
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stöðvar:
|
||||
@@ -4030,7 +4028,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Verður
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Ekkert hentugt járnbrautarspor
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Verður að fjarlægja járnbrautarspor fyrst
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Vegurinn er einstefnuvegur eða stíflaður
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Gatnamót ekki leyfð fyrir þessa tegund járnbrautarspora
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Gatnamót ekki leyfð fyrir þessa tegund járnbrautarspora
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Get ekki byggt umferðarmerki hér...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Get ekki byggt járnbrautarspor hér...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Get ekki fjarlægt járnbrautarspor héðan...
|
||||
|
@@ -3301,8 +3301,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infrastr
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Bagian rel:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Sinyal
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Bagian jalan:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Jalan raya
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Rel Trem
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Perairan:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanal
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stasiun:
|
||||
@@ -4333,7 +4331,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Sinyal h
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Tidak tersedia rel yang sesuai
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Harus membongkar rel terlebih dahulu
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Jalannya satu arah atau terhalang
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Perlintasan tingkat tidak diperbolehkan pada tipe rel ini
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Perlintasan tingkat tidak diperbolehkan pada tipe rel ini
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Tidak dapat membangun sinyal disini
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Tidak dapat membangun jalur rel disini
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Tidak dapat menghapus jalur rel dari sini
|
||||
|
@@ -3254,8 +3254,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Bonneaga
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Píosaí iarnróid:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Comharthaí
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Píosaí bóthair:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Bóthar
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Trambhealach
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Tíleanna uisce:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Canálacha
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stáisiúin:
|
||||
@@ -4267,7 +4265,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Ní mór
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Níl ráillí iarnróid feiliúnacha ann
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Ní mór na ráillí iarnróid a bhaint ar dtús
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Is bóthar aonbhealaigh nó blocáilte é
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Ní cheadaítear crosairí comhréidh don chineál ráille seo
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Ní cheadaítear crosairí comhréidh don chineál ráille seo
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Ní féidir comharthaí a thógáil anseo...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Ní féidir ráillí iarnróid a thógáil anseo...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Ní féidir ráillí iarnróid a bhaint as seo...
|
||||
|
@@ -3388,8 +3388,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infrastr
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Segmenti ferroviari:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Segnali
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Segmenti stradali:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Strada
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Tranvia
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Riquadri d'acqua:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Canali
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stazioni:
|
||||
@@ -4435,7 +4433,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Bisogna
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Tipo di binari non adatti
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Bisogna rimuovere i binari prima
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}La strada è bloccata o a senso unico
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Passaggi a livello non consentiti per questo tipo di rotaia
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Passaggi a livello non consentiti per questo tipo di rotaia
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Impossibile costruire i segnali qui...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Impossibile costruire i binari qui...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Impossibile rimuovere i binari da qui...
|
||||
|
@@ -3319,8 +3319,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}{COMPANY
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}線路長:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}信号
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}道路長(含軌道):
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}道路
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}軌道
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}水運長:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}運河
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}停留施設数:
|
||||
@@ -4334,7 +4332,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}先に
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}適当な線路がありません
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}先に線路を撤去しなければなりません
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}道路は一方通行または進入禁止です
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}このレール種別との平面交差はできません
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}このレール種別との平面交差はできません
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}ここには信号を設置できません
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}ここには線路を建設できません
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}ここから線路を撤去できません
|
||||
|
@@ -4016,8 +4016,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}{COMPANY
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}철도 기반시설:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}신호기
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}도로 기반시설:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}도로
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}전찻길
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}해운 기반시설:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}운하
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}정거장 시설:
|
||||
@@ -5290,7 +5288,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}신호
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}알맞지 않은 선로입니다.
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}선로를 먼저 제거하십시오.
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}도로가 일방통행이거나 막혔습니다
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}이 철도 타입에서는 건널목을 만들 수 없습니다.
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}이 철도 타입에서는 건널목을 만들 수 없습니다.
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}여기에 신호기를 건설할 수 없습니다...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}여기에 선로를 건설할 수 없습니다...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}이 선로를 철거할 수 없습니다...
|
||||
|
@@ -3514,8 +3514,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infrastr
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Partes ferriviariae:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Signalia
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Partes viariae:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Viariae
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Ferriviae stratariae
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Tegulae aquariae:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Canales
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stationes:
|
||||
@@ -4563,7 +4561,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Necesse
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Nulla astaria idonea
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Necesse est ferriviam removere
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Via est monodromus vel obstructa
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Non licet huic typo ferriviae habere transitus
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Non licet huic typo ferriviae habere transitus
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Non licet signalia hic struere...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Non licet ferriviam hic struere...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Non licet ferriviam removere hic...
|
||||
|
@@ -3197,8 +3197,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}{COMPANY
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Sliežu gabali:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Signālierīces
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Ceļa gabali:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Ceļš
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Tramvajs
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Ūdens lauciņi:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanāli
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stacijas:
|
||||
@@ -4198,7 +4196,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Vispirms
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Nav piemērota sliežu ceļa
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Vispirms ir jānoņem dzelzceļa sliedes
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Ceļs ir bloķēts vai vienvirziena
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Vienlīmeņa krustojumi šīm sliedēm nav atļauti
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Vienlīmeņa krustojumi šīm sliedēm nav atļauti
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Šeit nevar būvēt signālierīces...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Šeit nevar būvēt dzelzceļa posmu...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Šeit nevar nojaukt dzelzceļa posmu...
|
||||
|
@@ -3473,8 +3473,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}{COMPANY
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Bėgių dalys:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Signalai
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Kelio dalys:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Kelias
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Tramvajus
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Vandens langeliai:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanalai
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stotys:
|
||||
@@ -4542,7 +4540,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Pirma re
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Netinkamas bėgis
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Pirmiau pašalinkite geležinkelio bėgius
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Kelias vienpusis ar užblokuotas
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Sankryžos tame pačiame aukštyje neleidžiamos šiam bėgių tipui
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Sankryžos tame pačiame aukštyje neleidžiamos šiam bėgių tipui
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Šviesoforo čia statyti negalima ...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Begių čia statyti negalima...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Šių bėgių pašalinti negalima...
|
||||
|
@@ -3334,8 +3334,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infrastr
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Schinnestécker:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Signaler
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Stroossestécker:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Strooss
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Tram
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Waasserfelder:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanäl
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Statiounen:
|
||||
@@ -4377,7 +4375,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Signaler
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Keng gëeegent Schinnen
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}D'Schinne musse fir d'éischt ewech
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}D'Strooss ass eng Einbahn oder blockéiert
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Barrièren si fir dësen Schinnentyp net erlaabt
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Barrièren si fir dësen Schinnentyp net erlaabt
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Kann d'Signaler hei net bauen...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Kann d'Schinnen hei net bauen...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Kann d'Schinnen hei net ewech huelen...
|
||||
|
@@ -2955,8 +2955,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infrastr
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Cebisan landasan:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Isyarat
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Cebisan jalanraya:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Jalanraya
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Laluan Trem
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Petak air:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Terusan
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stesen:
|
||||
@@ -3944,7 +3942,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Tanda-ta
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Tiada landasan keretapi yang sesuai
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Landasan keretapi mesti dibuang terlebih dahulu
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Jalanraya adalah sehala atau telah disekat
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Persimpangan bertingkat adalah tidak dibenarkan untuk jenis landasan ini
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Persimpangan bertingkat adalah tidak dibenarkan untuk jenis landasan ini
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Isyarat tidak dapat dibina di sini...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Landasan keretapi tidak dapat dibina di sini...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Landasan keretapi tidak dapat dibuang...
|
||||
|
@@ -3359,8 +3359,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infrastr
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Jernbanebiter:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Signaler
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Veibiter:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Vei
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Trikkespor
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Vannruter:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanaler
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stasjoner:
|
||||
@@ -4407,7 +4405,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Må fjer
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Ingen passende jernbanespor
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Må fjerne jernbanespor først
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Veien er enveiskjørt eller blokkert
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Denne jernbanetypen tillater ikke planoverganger
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Denne jernbanetypen tillater ikke planoverganger
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Kan ikke bygge signaler her...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Kan ikke bygge jernbanespor her...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Kan ikke fjerne jernbanespor herfra...
|
||||
|
@@ -3173,8 +3173,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infrastr
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Togsporbitar:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Signal
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Vegstubbar:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Veg
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Trikkespor
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Vannruter:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanalar
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stasjonar:
|
||||
@@ -4183,7 +4181,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Må fjer
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Upassande jernbanespor
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Må fjerne jernbanespor først
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Vegen er einvegskøyrd eller blokkert
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Overgang ikkje tillate for denne typen jernbane
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Overgang ikkje tillate for denne typen jernbane
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Kan ikkje byggje signaler her...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Kan ikkje byggje jernbanespor her...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Kan ikkje fjerne jernbanespor herfrå...
|
||||
|
@@ -3696,8 +3696,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infrastr
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Elementy kolei:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Sygnalizatory
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Elementy dróg:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Droga
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Tramwaj
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Pola wody:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanały
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stacje:
|
||||
@@ -4734,7 +4732,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Należy
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Nieodpowiednie tory/brak torów
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Należy najpierw usunąć tory
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Droga jest jednokierunkowa lub zablokowana
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Przejazd kolejowy nie dozwolony dla tego typu torów
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Przejazd kolejowy nie dozwolony dla tego typu torów
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Nie można tutaj postawić sygnałów...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Nie można tutaj ułożyć torów...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Nie można stąd usunąć torów...
|
||||
|
@@ -3356,8 +3356,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infraest
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Secções de caminho-de-ferro:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Sinais
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Secções de estrada:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Estrada
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Via para elétricos
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Blocos de água:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Canais
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Estações:
|
||||
@@ -4403,7 +4401,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Deverá
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Tipo de linha não apropriado
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Deverá remover a linha férrea primeiro
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Estrada de sentido único ou bloqueada
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Passagens de nível não são permitidas para este tipo de linha
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Passagens de nível não são permitidas para este tipo de linha
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Não é possível construir sinais aqui...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Não é possível construir linha férrea aqui...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Não é possível remover linha férrea daqui...
|
||||
|
@@ -3238,8 +3238,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infrastr
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Pătrățele de cale ferată:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Semnale
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Pătrățele cu drumuri:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Drumuri
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Tramvaie
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Suprafață apă:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Canale
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stații:
|
||||
@@ -4252,7 +4250,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Trebuie
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Cale ferată nepotrivită
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Mai întâi trebuie înlăturată calea ferată
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Drum cu sens unic sau blocat
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Trecerea la nivel nu este permisă pentru acest tip de cale ferată
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Trecerea la nivel nu este permisă pentru acest tip de cale ferată
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Nu se pot plasa semafoare aici...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Nu se poate construi cale ferată aici...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Nu se poate înlătura calea ferată...
|
||||
|
@@ -3544,8 +3544,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Инфр
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Ж/д участки:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Сигналы
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Дорожные участки:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Автодороги
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Трамвайные пути
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Водные участки:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Каналы
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Станции:
|
||||
@@ -4614,7 +4612,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Снач
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Нет подходящих рельсов
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Сначала удалите рельсы
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Дорога односторонняя или заблокирована
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Через этот вид рельсов запрещено строить переезды
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Через этот вид рельсов запрещено строить переезды
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Здесь невозможно поставить сигнал...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Здесь невозможно проложить рельсы...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Не удалось удалить рельсы...
|
||||
|
@@ -3465,8 +3465,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infrastr
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Delova pruge:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Signalizacija
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Delova druma:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Drum
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Tramvajska pruga
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Pločica sa vodom:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanali
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stanice:
|
||||
@@ -4510,7 +4508,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Neophodn
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Nedostaje odgovarajuća železnička pruga
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Potrebno je prvo ukloniti železničku prugu
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Put je jednosmeran ili je blokiran
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Putni prelaz nije dozvoljen za ovu vrstu pruge
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Putni prelaz nije dozvoljen za ovu vrstu pruge
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Izgradnja signalizacije ovde nije moguća...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Izgradnja železničke pruge ovde nije moguća...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Nemoguće je ukloniti železničku prugu odatle...
|
||||
|
@@ -3279,8 +3279,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}{COMPANY
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}铁路:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}信号灯
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}道路:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}普通道路
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}电车线路
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}水运:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}运河
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}站台:
|
||||
@@ -4305,7 +4303,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}必须
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}没有合适的轨道
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}必须先拆除轨道
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}这是单行道或这条路被堵死了
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}该轨道类型不允许建设平交道
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}该轨道类型不允许建设平交道
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}不能在这里设置信号灯……
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}不能在这里铺设轨道……
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}不能从这里拆除轨道……
|
||||
|
@@ -3322,8 +3322,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infrašt
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Políčka železnice:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Semafóry
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Políčka cesty:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Cesta
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Električka
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Vodné políčka:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanále
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stanice:
|
||||
@@ -4335,7 +4333,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Najprv j
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Žiadne použiteľné železničné koľaje
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Musíš najskôr odstrániť železničné koľaje
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Cesta je jednosmerná alebo blokovaná.
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Nie sú povolené priecestia pre tento typ železníc
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Nie sú povolené priecestia pre tento typ železníc
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Nemôžeš tu stavať návestidlá...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Nemôžeš tu stavať železničné koľaje...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Nemôžeš tu odstrániť železničné koľaje...
|
||||
|
@@ -3408,8 +3408,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infrastr
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Kosi tirov:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Signali
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Odseki cest:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Cesta
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Tramvaj
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Polja vode:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanali
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Postaje:
|
||||
@@ -4422,7 +4420,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Najprej
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Ni primernih tračnic
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Najprej moraš odstraniti tračnice
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Cesta je enosmerna ali blokirana
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Istonivojna križišča niso dovoljena za ta tip železnice
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Istonivojna križišča niso dovoljena za ta tip železnice
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Tukaj ni mogoče zgraditi signalov...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Tukaj ni mogoče zgraditi železniških tirov...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Tukaj ni mogoče odstraniti železniških tirov...
|
||||
|
@@ -3303,8 +3303,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infraest
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Trozos de ferrocarril:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Señales
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Trozos de carretera:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Carretera
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Tranvía
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Casillas de agua:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Canales
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Estaciones:
|
||||
@@ -4335,7 +4333,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Primero
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Tramo de ferrocarril no apropiado
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Primero se debe retirar tramo de ferrocarril
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Carretera de un solo sentido o bloqueada
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}No se permiten pasos a nivel para este tipo de ferrocarril
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}No se permiten pasos a nivel para este tipo de ferrocarril
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}No se pueden construir señales aquí...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}No se pueden construir ferrocarriles aquí...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}No se pueden retirar ferrocarriles aquí...
|
||||
|
@@ -3357,8 +3357,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infraest
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Tramos de vías férreas:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Señales
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Tramos de carretera:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Carretera
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Tranvía
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Casillas de agua:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Canales
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Estaciones:
|
||||
@@ -4404,7 +4402,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Primero
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Tramo de vías férreas no apropiado
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Primero se debe quitar el tramo de vías férreas
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Carretera de un solo sentido o bloqueada
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}No se permiten pasos a nivel para este tipo de vías férreas
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}No se permiten pasos a nivel para este tipo de vías férreas
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}No se pueden instalar señales aquí...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}No se pueden construir vías férreas aquí...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}No se pueden quitar vías férreas de aquí...
|
||||
|
@@ -3333,8 +3333,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infrastr
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Järnvägsbitar:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Signaler
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Vägbitar:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Väg
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Spårväg
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Vattenrutor:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanaler
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stationer:
|
||||
@@ -4368,7 +4366,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Måste t
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Inget passande järnvägsspår
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Måste ta bort järnväg först
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Vägen är enkelriktad eller blockerad
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Plankorsningar är inte tillåtna för denna typ av spår
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Plankorsningar är inte tillåtna för denna typ av spår
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Kan inte bygga signaler här...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Kan inte bygga järnvägsspår här...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Kan inte ta bort järnvägspår här...
|
||||
|
@@ -2879,8 +2879,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}{COMPANY
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}இரயில் பாகங்கள்:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}சிக்னல்கள்
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}சாலை பாகங்கள்:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}சாலை
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}ட்ராம்வே
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}தண்ணீர் வட்டங்கள்:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}கால்வாய்கள்
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}நிலையங்கள்:
|
||||
@@ -3821,7 +3819,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}மு
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}தக்க இரயில் தடம் ஏதும் இல்லை
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}முதலில் இரயில்வே தடத்தினை எடுக்க வேண்டும்
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}சாலை ஒருவழிப்பாதை அல்லது மறிக்கப்பட்டுள்ளது
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}இந்த வகையிலான இரயில்களுக்கு இருப்புப்பாதை சந்திக் கடவுகள் கிடையாது
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}இந்த வகையிலான இரயில்களுக்கு இருப்புப்பாதை சந்திக் கடவுகள் கிடையாது
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}இங்கே சிக்னல்களை நிறுவ இயலாது...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}இங்கே இரயில்வே தடங்களை பதிய முடியாது...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}இங்கிருந்து இரயில்வே தடங்களை அகற்ற முடியாது...
|
||||
|
@@ -3186,8 +3186,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}โค
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}ชิ้นส่วนทางรถไฟ:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}เสาอาณัติสัญญาณ
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}ชิ้นส่วนถนน:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}ถนน
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}ทางรถราง
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}คลอง:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}คลอง
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}สถานี:
|
||||
@@ -4180,7 +4178,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}ต้
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}ไม่มีรางรถไฟที่เหมาะสม
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}ต้องทำลายทางรถไฟทิ้งเสียก่อน
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}ถนนเป็นทางเดียวหรือถูกปิดกั้น
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}ทางตัดเสมอระดับทางไม่อนุญาตให้ตัดผ่านทางประเภทนี้
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}ทางตัดเสมอระดับทางไม่อนุญาตให้ตัดผ่านทางประเภทนี้
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}ไม่สามารถสร้างเสาอาณัติสัญญาณได้...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}บริเวณนี้ไม่สามารถสร้างรางรถไฟได้...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}ตรงนี้ไม่สามารถลบรางรถไฟออกไปได้
|
||||
|
@@ -3254,8 +3254,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}{COMPANY
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}鐵路區塊:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}號誌
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}道路區塊:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}道路
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}路面電車
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}水道或海運設施:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}運河
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}車站:
|
||||
@@ -4267,7 +4265,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}必須
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}沒有適合的鐵軌
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}必須先移除鐵路
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}道路是單行道或已封閉
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}這種軌道不能建設平交道
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}這種軌道不能建設平交道
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}無法在此興建號誌...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}無法在此鋪設鐵路...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}不能從這邊移除鐵路...
|
||||
|
@@ -3342,8 +3342,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}{COMPANY
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Demiryolu parçaları:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Sinyaller
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Karayolu parçaları:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Karayolu
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Tramvay
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Su kareleri:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanallar
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}İstasyonlar:
|
||||
@@ -4377,7 +4375,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Önce i
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Uygun ray yok
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Önce ray kaldırılmalı
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Yol tek yönlü veya kapalı
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Bu ray türü için hemzemin geçit yapılamaz
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Bu ray türü için hemzemin geçit yapılamaz
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Buraya sinyal yapılamıyor...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Buraya ray yapılamıyor...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Buradan ray kaldırılamıyor...
|
||||
|
@@ -3484,8 +3484,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Інфр
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Залізничні ділянки:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}З сигналами
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Дорожні ділянки:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Автомобільні
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Трамвайні
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Судноплавні ділянки:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Канали
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Станції:
|
||||
@@ -4519,7 +4517,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Споч
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Невідповідний тип колії
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Спочатку приберіть колію
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Дорога з одностороннім рухом або блокована
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Переїзди для такого виду колії є забороненими
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Переїзди для такого виду колії є забороненими
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Неможливо будувати сигнали тут...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Неможливо будувати колію тут...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Неможливо прибрати колію звідси...
|
||||
|
@@ -3009,8 +3009,6 @@ STR_BUY_COMPANY_MESSAGE :{WHITE}Wy sykje
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Ynfrastruktuer fan {COMPANY}
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Seinen
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Stikjes dyk:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Dyk
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Tramwei
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stasjons:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATIONS :{WHITE}Stasjontegels
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_AIRPORTS :{WHITE}Fleanfjilden
|
||||
@@ -3821,7 +3819,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Stopljoc
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Spoar is net geskikt
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Spoar moat der earst wei
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Dyk is in ienrjochtingsdyk of blokearre
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}In oergong is net tastien foar dit type spoar
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}In oergong is net tastien foar dit type spoar
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Kin hjir gjin stopljochten boue...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Kin hjir gjin spoarwei boue
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Kin hjir gjin spoar fuorthelje...
|
||||
|
@@ -1399,8 +1399,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Инфр
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}железнички парчиња:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}сигнали
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Патот парчиња:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}патот
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}трамвај
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Вода плочки:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}каналите
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}станици:
|
||||
@@ -1768,7 +1766,7 @@ STR_ERROR_AUTOREPLACE_NOTHING_TO_DO :{WHITE}Не а
|
||||
STR_ERROR_AUTOREPLACE_MONEY_LIMIT :(лимит на пари)
|
||||
|
||||
# Rail construction errors
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Ниво, нема премини се дозволени за овој вид железнички
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Ниво, нема премини се дозволени за овој вид железнички
|
||||
STR_ERROR_THERE_IS_NO_RAILROAD_TRACK :{WHITE}... не постои железничка пруга
|
||||
STR_ERROR_THERE_ARE_NO_SIGNALS :{WHITE}... постојат никакви сигнали
|
||||
|
||||
|
@@ -2875,8 +2875,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}زیرس
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}قطعه های ریل:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}نشانگرها
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}قطعه های راه:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}راه
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}تراموا
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}قسمتهای زیر آب:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}کانال ها
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}ایستگاه ها:
|
||||
|
@@ -2302,8 +2302,6 @@ STR_COMPANY_VIEW_GIVE_MONEY_QUERY_CAPTION :بتائیں آ
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}ریل کے ٹکڑے
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}اشارے
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}سڑک کے ٹکرے
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}سڑک
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}ٹرام وے
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}پانی کی ٹائل
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}نہریں
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD} اسٹیشن:
|
||||
|
@@ -3317,8 +3317,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Hạ t
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Ô đường ray:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Tín hiệu
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Ô đường bộ:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Đường bộ
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Xe điện
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Ô là nước:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kênh đào
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Ga, bến:
|
||||
@@ -4346,7 +4344,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Phải b
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Không có đường ray thích hợp
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Phải phá bỏ đường ray trước
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Đường một chiều hoặc bị chặn
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Đường giao nhau không cho phép với loại ray này
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Đường giao nhau không cho phép với loại ray này
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Không thể xây đèn hiệu ở đây...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Không thể xây đường ray ở đây...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Không thể phá bỏ đường ray ở đây...
|
||||
|
@@ -3258,8 +3258,6 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Tanadeil
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Darnau rheilffordd:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Signalau
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Darnau ffordd:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD :{WHITE}Ffordd
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY :{WHITE}Tramffordd
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Teiliau dŵr:
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Camlesi
|
||||
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Gorsafoedd:
|
||||
@@ -4286,7 +4284,7 @@ STR_ERROR_MUST_REMOVE_SIGNALS_FIRST :{WHITE}Rhaid ty
|
||||
STR_ERROR_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Dim trac rheilffordd addas
|
||||
STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Rhaid tynnu'r trac rheilffordd yn gyntaf
|
||||
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Mae'r ffordd yn ffordd un-ffordd, neu wedi'i blocio
|
||||
STR_ERROR_CROSSING_DISALLOWED :{WHITE}Ni chaniateir croesfannau ar y cledrau yma
|
||||
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Ni chaniateir croesfannau ar y cledrau yma
|
||||
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Methu adeiladu signalau yma...
|
||||
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Methu adeiladu trac rheilffordd yma...
|
||||
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Methu tynnu trac rheilffordd oddi yma...
|
||||
|
@@ -519,8 +519,8 @@ void DumpMapStats(char *b, const char *last)
|
||||
if (IsTunnelBridgeSignalSimulationBidirectional(t)) bucket |= TBB_SIGNALLED_BIDI;
|
||||
}
|
||||
if (GetTunnelBridgeTransportType(t) == TRANSPORT_ROAD) {
|
||||
if (HasTileRoadType(t, ROADTYPE_ROAD)) bucket |= TBB_ROAD;
|
||||
if (HasTileRoadType(t, ROADTYPE_TRAM)) bucket |= TBB_TRAM;
|
||||
if (HasTileRoadType(t, RTT_ROAD)) bucket |= TBB_ROAD;
|
||||
if (HasTileRoadType(t, RTT_TRAM)) bucket |= TBB_TRAM;
|
||||
}
|
||||
if (GetTunnelBridgeTransportType(t) == TRANSPORT_RAIL) bucket |= TBB_RAIL;
|
||||
if (GetTunnelBridgeTransportType(t) == TRANSPORT_WATER) bucket |= TBB_WATER;
|
||||
|
@@ -177,7 +177,10 @@ public:
|
||||
td.railtype2 = STR_NULL;
|
||||
td.rail_speed = 0;
|
||||
td.rail_speed2 = 0;
|
||||
td.roadtype = STR_NULL;
|
||||
td.road_speed = 0;
|
||||
td.tramtype = STR_NULL;
|
||||
td.tram_speed = 0;
|
||||
|
||||
td.grf = nullptr;
|
||||
|
||||
@@ -312,6 +315,13 @@ public:
|
||||
line_nr++;
|
||||
}
|
||||
|
||||
/* Road type name */
|
||||
if (td.roadtype != STR_NULL) {
|
||||
SetDParam(0, td.roadtype);
|
||||
GetString(this->landinfo_data[line_nr], STR_LANG_AREA_INFORMATION_ROAD_TYPE, lastof(this->landinfo_data[line_nr]));
|
||||
line_nr++;
|
||||
}
|
||||
|
||||
/* Road speed limit */
|
||||
if (td.road_speed != 0) {
|
||||
SetDParam(0, td.road_speed);
|
||||
@@ -319,6 +329,20 @@ public:
|
||||
line_nr++;
|
||||
}
|
||||
|
||||
/* Tram type name */
|
||||
if (td.tramtype != STR_NULL) {
|
||||
SetDParam(0, td.tramtype);
|
||||
GetString(this->landinfo_data[line_nr], STR_LANG_AREA_INFORMATION_TRAM_TYPE, lastof(this->landinfo_data[line_nr]));
|
||||
line_nr++;
|
||||
}
|
||||
|
||||
/* Tram speed limit */
|
||||
if (td.tram_speed != 0) {
|
||||
SetDParam(0, td.tram_speed);
|
||||
GetString(this->landinfo_data[line_nr], STR_LANG_AREA_INFORMATION_TRAM_SPEED_LIMIT, lastof(this->landinfo_data[line_nr]));
|
||||
line_nr++;
|
||||
}
|
||||
|
||||
/* NewGRF name */
|
||||
if (td.grf != nullptr) {
|
||||
SetDParamStr(0, td.grf);
|
||||
|
372
src/newgrf.cpp
372
src/newgrf.cpp
@@ -48,6 +48,7 @@
|
||||
#include "vehicle_func.h"
|
||||
#include "language.h"
|
||||
#include "vehicle_base.h"
|
||||
#include "road.h"
|
||||
|
||||
#include "table/strings.h"
|
||||
#include "table/build_industry.h"
|
||||
@@ -313,6 +314,7 @@ struct GRFTempEngineData {
|
||||
uint16 cargo_allowed;
|
||||
uint16 cargo_disallowed;
|
||||
RailTypeLabel railtypelabel;
|
||||
uint8 roadtramtype;
|
||||
const GRFFile *defaultcargo_grf; ///< GRF defining the cargo translation table to use if the default cargo is the 'first refittable'.
|
||||
Refittability refittability; ///< Did the newgrf set any refittability property? If not, default refittability will be applied.
|
||||
bool prop27_set; ///< Did the NewGRF set property 27 (misc flags)?
|
||||
@@ -1380,6 +1382,12 @@ static ChangeInfoResult RoadVehicleChangeInfo(uint engine, int numinfo, int prop
|
||||
RoadVehicleInfo *rvi = &e->u.road;
|
||||
|
||||
switch (prop) {
|
||||
case 0x05: // Road/tram type
|
||||
/* RoadTypeLabel is looked up later after the engine's road/tram
|
||||
* flag is set, however 0 means the value has not been set. */
|
||||
_gted[e->index].roadtramtype = buf->ReadByte() + 1;
|
||||
break;
|
||||
|
||||
case 0x08: // Speed (1 unit is 0.5 kmh)
|
||||
rvi->max_speed = buf->ReadByte();
|
||||
break;
|
||||
@@ -2686,6 +2694,12 @@ static ChangeInfoResult GlobalVarChangeInfo(uint gvid, int numinfo, int prop, co
|
||||
case 0x12: // Rail type translation table; loading during both reservation and activation stage (in case it is selected depending on defined railtypes)
|
||||
return LoadTranslationTable(gvid, numinfo, buf, _cur.grffile->railtype_list, "Rail type");
|
||||
|
||||
case 0x16: // Road type translation table; loading during both reservation and activation stage (in case it is selected depending on defined railtypes)
|
||||
return LoadTranslationTable(gvid, numinfo, buf, _cur.grffile->roadtype_list, "Road type");
|
||||
|
||||
case 0x17: // Tram type translation table; loading during both reservation and activation stage (in case it is selected depending on defined railtypes)
|
||||
return LoadTranslationTable(gvid, numinfo, buf, _cur.grffile->tramtype_list, "Tram type");
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -2901,6 +2915,12 @@ static ChangeInfoResult GlobalVarReserveInfo(uint gvid, int numinfo, int prop, c
|
||||
case 0x12: // Rail type translation table; loading during both reservation and activation stage (in case it is selected depending on defined railtypes)
|
||||
return LoadTranslationTable(gvid, numinfo, buf, _cur.grffile->railtype_list, "Rail type");
|
||||
|
||||
case 0x16: // Road type translation table; loading during both reservation and activation stage (in case it is selected depending on defined roadtypes)
|
||||
return LoadTranslationTable(gvid, numinfo, buf, _cur.grffile->roadtype_list, "Road type");
|
||||
|
||||
case 0x17: // Tram type translation table; loading during both reservation and activation stage (in case it is selected depending on defined tramtypes)
|
||||
return LoadTranslationTable(gvid, numinfo, buf, _cur.grffile->tramtype_list, "Tram type");
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -4442,6 +4462,228 @@ static ChangeInfoResult RailTypeReserveInfo(uint id, int numinfo, int prop, cons
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Define properties for roadtypes
|
||||
* @param id ID of the roadtype.
|
||||
* @param numinfo Number of subsequent IDs to change the property for.
|
||||
* @param prop The property to change.
|
||||
* @param buf The property value.
|
||||
* @return ChangeInfoResult.
|
||||
*/
|
||||
static ChangeInfoResult RoadTypeChangeInfo(uint id, int numinfo, int prop, const GRFFilePropertyRemapEntry *mapping_entry, ByteReader *buf, RoadTramType rtt)
|
||||
{
|
||||
ChangeInfoResult ret = CIR_SUCCESS;
|
||||
|
||||
extern RoadTypeInfo _roadtypes[ROADTYPE_END];
|
||||
RoadType *type_map = (rtt == RTT_TRAM) ? _cur.grffile->tramtype_map : _cur.grffile->roadtype_map;
|
||||
|
||||
if (id + numinfo > ROADTYPE_END) {
|
||||
grfmsg(1, "RoadTypeChangeInfo: Road type %u is invalid, max %u, ignoring", id + numinfo, ROADTYPE_END);
|
||||
return CIR_INVALID_ID;
|
||||
}
|
||||
|
||||
for (int i = 0; i < numinfo; i++) {
|
||||
RoadType rt = type_map[id + i];
|
||||
if (rt == INVALID_ROADTYPE) return CIR_INVALID_ID;
|
||||
|
||||
RoadTypeInfo *rti = &_roadtypes[rt];
|
||||
|
||||
switch (prop) {
|
||||
case 0x08: // Label of road type
|
||||
/* Skipped here as this is loaded during reservation stage. */
|
||||
buf->ReadDWord();
|
||||
break;
|
||||
|
||||
case 0x09: { // Toolbar caption of roadtype (sets name as well for backwards compatibility for grf ver < 8)
|
||||
uint16 str = buf->ReadWord();
|
||||
AddStringForMapping(str, &rti->strings.toolbar_caption);
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x0A: // Menu text of roadtype
|
||||
AddStringForMapping(buf->ReadWord(), &rti->strings.menu_text);
|
||||
break;
|
||||
|
||||
case 0x0B: // Build window caption
|
||||
AddStringForMapping(buf->ReadWord(), &rti->strings.build_caption);
|
||||
break;
|
||||
|
||||
case 0x0C: // Autoreplace text
|
||||
AddStringForMapping(buf->ReadWord(), &rti->strings.replace_text);
|
||||
break;
|
||||
|
||||
case 0x0D: // New engine text
|
||||
AddStringForMapping(buf->ReadWord(), &rti->strings.new_engine);
|
||||
break;
|
||||
|
||||
case 0x0F: // Powered roadtype list
|
||||
case 0x18: // Roadtype list required for date introduction
|
||||
case 0x19: { // Introduced roadtype list
|
||||
/* Road type compatibility bits are added to the existing bits
|
||||
* to allow multiple GRFs to modify compatibility with the
|
||||
* default road types. */
|
||||
int n = buf->ReadByte();
|
||||
for (int j = 0; j != n; j++) {
|
||||
RoadTypeLabel label = buf->ReadDWord();
|
||||
RoadType rt = GetRoadTypeByLabel(BSWAP32(label), false);
|
||||
if (rt != INVALID_ROADTYPE) {
|
||||
switch (prop) {
|
||||
case 0x0F: SetBit(rti->powered_roadtypes, rt); break;
|
||||
case 0x18: SetBit(rti->introduction_required_roadtypes, rt); break;
|
||||
case 0x19: SetBit(rti->introduces_roadtypes, rt); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x10: // Road Type flags
|
||||
rti->flags = (RoadTypeFlags)buf->ReadByte();
|
||||
break;
|
||||
|
||||
case 0x13: // Construction cost factor
|
||||
rti->cost_multiplier = buf->ReadWord();
|
||||
break;
|
||||
|
||||
case 0x14: // Speed limit
|
||||
rti->max_speed = buf->ReadWord();
|
||||
break;
|
||||
|
||||
case 0x16: // Map colour
|
||||
rti->map_colour = buf->ReadByte();
|
||||
break;
|
||||
|
||||
case 0x17: // Introduction date
|
||||
rti->introduction_date = buf->ReadDWord();
|
||||
break;
|
||||
|
||||
case 0x1A: // Sort order
|
||||
rti->sorting_order = buf->ReadByte();
|
||||
break;
|
||||
|
||||
case 0x1B: // Name of roadtype
|
||||
AddStringForMapping(buf->ReadWord(), &rti->strings.name);
|
||||
break;
|
||||
|
||||
case 0x1C: // Maintenance cost factor
|
||||
rti->maintenance_multiplier = buf->ReadWord();
|
||||
break;
|
||||
|
||||
case 0x1D: // Alternate road type label list
|
||||
/* Skipped here as this is loaded during reservation stage. */
|
||||
for (int j = buf->ReadByte(); j != 0; j--) buf->ReadDWord();
|
||||
break;
|
||||
|
||||
default:
|
||||
ret = CIR_UNKNOWN;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ChangeInfoResult RoadTypeChangeInfo(uint id, int numinfo, int prop, const GRFFilePropertyRemapEntry *mapping_entry, ByteReader *buf)
|
||||
{
|
||||
return RoadTypeChangeInfo(id, numinfo, prop, mapping_entry, buf, RTT_ROAD);
|
||||
}
|
||||
|
||||
static ChangeInfoResult TramTypeChangeInfo(uint id, int numinfo, int prop, const GRFFilePropertyRemapEntry *mapping_entry, ByteReader *buf)
|
||||
{
|
||||
return RoadTypeChangeInfo(id, numinfo, prop, mapping_entry, buf, RTT_TRAM);
|
||||
}
|
||||
|
||||
|
||||
static ChangeInfoResult RoadTypeReserveInfo(uint id, int numinfo, int prop, const GRFFilePropertyRemapEntry *mapping_entry, ByteReader *buf, RoadTramType rtt)
|
||||
{
|
||||
ChangeInfoResult ret = CIR_SUCCESS;
|
||||
|
||||
extern RoadTypeInfo _roadtypes[ROADTYPE_END];
|
||||
RoadType *type_map = (rtt == RTT_TRAM) ? _cur.grffile->tramtype_map : _cur.grffile->roadtype_map;
|
||||
|
||||
if (id + numinfo > ROADTYPE_END) {
|
||||
grfmsg(1, "RoadTypeReserveInfo: Road type %u is invalid, max %u, ignoring", id + numinfo, ROADTYPE_END);
|
||||
return CIR_INVALID_ID;
|
||||
}
|
||||
|
||||
for (int i = 0; i < numinfo; i++) {
|
||||
switch (prop) {
|
||||
case 0x08: { // Label of road type
|
||||
RoadTypeLabel rtl = buf->ReadDWord();
|
||||
rtl = BSWAP32(rtl);
|
||||
|
||||
RoadType rt = GetRoadTypeByLabel(rtl, false);
|
||||
if (rt == INVALID_ROADTYPE) {
|
||||
/* Set up new road type */
|
||||
rt = AllocateRoadType(rtl, rtt);
|
||||
} else if (GetRoadTramType(rt) != rtt) {
|
||||
grfmsg(1, "RoadTypeReserveInfo: Road type %u is invalid type (road/tram), ignoring", id + numinfo);
|
||||
return CIR_INVALID_ID;
|
||||
}
|
||||
|
||||
type_map[id + i] = rt;
|
||||
break;
|
||||
}
|
||||
case 0x09: // Toolbar caption of roadtype
|
||||
case 0x0A: // Menu text
|
||||
case 0x0B: // Build window caption
|
||||
case 0x0C: // Autoreplace text
|
||||
case 0x0D: // New loco
|
||||
case 0x13: // Construction cost
|
||||
case 0x14: // Speed limit
|
||||
case 0x1B: // Name of roadtype
|
||||
case 0x1C: // Maintenance cost factor
|
||||
buf->ReadWord();
|
||||
break;
|
||||
|
||||
case 0x1D: // Alternate road type label list
|
||||
if (type_map[id + i] != INVALID_ROADTYPE) {
|
||||
int n = buf->ReadByte();
|
||||
for (int j = 0; j != n; j++) {
|
||||
_roadtypes[type_map[id + i]].alternate_labels.push_back(BSWAP32(buf->ReadDWord()));
|
||||
}
|
||||
break;
|
||||
}
|
||||
grfmsg(1, "RoadTypeReserveInfo: Ignoring property 1D for road type %u because no label was set", id + i);
|
||||
/* FALL THROUGH */
|
||||
|
||||
case 0x0F: // Powered roadtype list
|
||||
case 0x18: // Roadtype list required for date introduction
|
||||
case 0x19: // Introduced roadtype list
|
||||
for (int j = buf->ReadByte(); j != 0; j--) buf->ReadDWord();
|
||||
break;
|
||||
|
||||
case 0x10: // Road Type flags
|
||||
case 0x12: // Station graphic
|
||||
case 0x15: // Acceleration model
|
||||
case 0x16: // Map colour
|
||||
case 0x1A: // Sort order
|
||||
buf->ReadByte();
|
||||
break;
|
||||
|
||||
case 0x17: // Introduction date
|
||||
buf->ReadDWord();
|
||||
break;
|
||||
|
||||
default:
|
||||
ret = CIR_UNKNOWN;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ChangeInfoResult RoadTypeReserveInfo(uint id, int numinfo, int prop, const GRFFilePropertyRemapEntry *mapping_entry, ByteReader *buf)
|
||||
{
|
||||
return RoadTypeReserveInfo(id, numinfo, prop, mapping_entry, buf, RTT_ROAD);
|
||||
}
|
||||
|
||||
static ChangeInfoResult TramTypeReserveInfo(uint id, int numinfo, int prop, const GRFFilePropertyRemapEntry *mapping_entry, ByteReader *buf)
|
||||
{
|
||||
return RoadTypeReserveInfo(id, numinfo, prop, mapping_entry, buf, RTT_TRAM);
|
||||
}
|
||||
|
||||
static ChangeInfoResult AirportTilesChangeInfo(uint airtid, int numinfo, int prop, const GRFFilePropertyRemapEntry *mapping_entry, ByteReader *buf)
|
||||
{
|
||||
ChangeInfoResult ret = CIR_SUCCESS;
|
||||
@@ -4626,6 +4868,8 @@ static void FeatureChangeInfo(ByteReader *buf)
|
||||
/* GSF_OBJECTS */ ObjectChangeInfo,
|
||||
/* GSF_RAILTYPES */ RailTypeChangeInfo,
|
||||
/* GSF_AIRPORTTILES */ AirportTilesChangeInfo,
|
||||
/* GSF_ROADTYPES */ RoadTypeChangeInfo,
|
||||
/* GSF_TRAMTYPES */ TramTypeChangeInfo,
|
||||
};
|
||||
static_assert(lengthof(handler) == lengthof(_cur.grffile->action0_property_remaps), "Action 0 feature list length mismatch");
|
||||
|
||||
@@ -4700,7 +4944,7 @@ static void ReserveChangeInfo(ByteReader *buf)
|
||||
{
|
||||
uint8 feature = buf->ReadByte();
|
||||
|
||||
if (feature != GSF_CARGOES && feature != GSF_GLOBALVAR && feature != GSF_RAILTYPES) return;
|
||||
if (feature != GSF_CARGOES && feature != GSF_GLOBALVAR && feature != GSF_RAILTYPES && feature != GSF_ROADTYPES && feature != GSF_TRAMTYPES) return;
|
||||
|
||||
uint8 numprops = buf->ReadByte();
|
||||
uint8 numinfo = buf->ReadByte();
|
||||
@@ -4723,6 +4967,14 @@ static void ReserveChangeInfo(ByteReader *buf)
|
||||
case GSF_RAILTYPES:
|
||||
cir = RailTypeReserveInfo(index, numinfo, desc.prop, desc.entry, buf);
|
||||
break;
|
||||
|
||||
case GSF_ROADTYPES:
|
||||
cir = RoadTypeReserveInfo(index, numinfo, desc.prop, desc.entry, buf);
|
||||
break;
|
||||
|
||||
case GSF_TRAMTYPES:
|
||||
cir = TramTypeReserveInfo(index, numinfo, desc.prop, desc.entry, buf);
|
||||
break;
|
||||
}
|
||||
|
||||
if (HandleChangeInfoResult("ReserveChangeInfo", cir, feature, desc.prop)) return;
|
||||
@@ -5035,6 +5287,8 @@ static void NewSpriteGroup(ByteReader *buf)
|
||||
case GSF_CARGOES:
|
||||
case GSF_AIRPORTS:
|
||||
case GSF_RAILTYPES:
|
||||
case GSF_ROADTYPES:
|
||||
case GSF_TRAMTYPES:
|
||||
{
|
||||
byte num_loaded = type;
|
||||
byte num_loading = buf->ReadByte();
|
||||
@@ -5612,6 +5866,39 @@ static void RailTypeMapSpriteGroup(ByteReader *buf, uint8 idcount)
|
||||
buf->ReadWord();
|
||||
}
|
||||
|
||||
static void RoadTypeMapSpriteGroup(ByteReader *buf, uint8 idcount, RoadTramType rtt)
|
||||
{
|
||||
RoadType *type_map = (rtt == RTT_TRAM) ? _cur.grffile->tramtype_map : _cur.grffile->roadtype_map;
|
||||
|
||||
uint8 *roadtypes = AllocaM(uint8, idcount);
|
||||
for (uint i = 0; i < idcount; i++) {
|
||||
uint8 id = buf->ReadByte();
|
||||
roadtypes[i] = id < ROADTYPE_END ? type_map[id] : INVALID_ROADTYPE;
|
||||
}
|
||||
|
||||
uint8 cidcount = buf->ReadByte();
|
||||
for (uint c = 0; c < cidcount; c++) {
|
||||
uint8 ctype = buf->ReadByte();
|
||||
uint16 groupid = buf->ReadWord();
|
||||
if (!IsValidGroupID(groupid, "RoadTypeMapSpriteGroup")) continue;
|
||||
|
||||
if (ctype >= ROTSG_END) continue;
|
||||
|
||||
extern RoadTypeInfo _roadtypes[ROADTYPE_END];
|
||||
for (uint i = 0; i < idcount; i++) {
|
||||
if (roadtypes[i] != INVALID_ROADTYPE) {
|
||||
RoadTypeInfo *rti = &_roadtypes[roadtypes[i]];
|
||||
|
||||
rti->grffile[ctype] = _cur.grffile;
|
||||
rti->group[ctype] = _cur.spritegroups[groupid];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Roadtypes do not use the default group. */
|
||||
buf->ReadWord();
|
||||
}
|
||||
|
||||
static void AirportMapSpriteGroup(ByteReader *buf, uint8 idcount)
|
||||
{
|
||||
uint8 *airports = AllocaM(uint8, idcount);
|
||||
@@ -5762,6 +6049,14 @@ static void FeatureMapSpriteGroup(ByteReader *buf)
|
||||
RailTypeMapSpriteGroup(buf, idcount);
|
||||
break;
|
||||
|
||||
case GSF_ROADTYPES:
|
||||
RoadTypeMapSpriteGroup(buf, idcount, RTT_ROAD);
|
||||
break;
|
||||
|
||||
case GSF_TRAMTYPES:
|
||||
RoadTypeMapSpriteGroup(buf, idcount, RTT_TRAM);
|
||||
break;
|
||||
|
||||
case GSF_AIRPORTTILES:
|
||||
AirportTileMapSpriteGroup(buf, idcount);
|
||||
return;
|
||||
@@ -6030,6 +6325,15 @@ static void GraphicsNew(ByteReader *buf)
|
||||
/* Load <num> sprites starting from <replace>, then skip <skip_num> sprites. */
|
||||
grfmsg(2, "GraphicsNew: Replacing sprites %d to %d of %s (type 0x%02X) at SpriteID 0x%04X", offset, offset + num - 1, action5_type->name, type, replace);
|
||||
|
||||
if (type == 0x0D) _loaded_newgrf_features.shore = SHORE_REPLACE_ACTION_5;
|
||||
|
||||
if (type == 0x0B) {
|
||||
static const SpriteID depot_with_track_offset = SPR_TRAMWAY_DEPOT_WITH_TRACK - SPR_TRAMWAY_BASE;
|
||||
static const SpriteID depot_no_track_offset = SPR_TRAMWAY_DEPOT_NO_TRACK - SPR_TRAMWAY_BASE;
|
||||
if (offset <= depot_with_track_offset && offset + num > depot_with_track_offset) _loaded_newgrf_features.tram = TRAMWAY_REPLACE_DEPOT_WITH_TRACK;
|
||||
if (offset <= depot_no_track_offset && offset + num > depot_no_track_offset) _loaded_newgrf_features.tram = TRAMWAY_REPLACE_DEPOT_NO_TRACK;
|
||||
}
|
||||
|
||||
for (uint16 n = num; n > 0; n--) {
|
||||
_cur.nfo_line++;
|
||||
LoadNextSprite(replace == 0 ? _cur.spriteid++ : replace++, _cur.file_index, _cur.nfo_line, _cur.grf_container_ver);
|
||||
@@ -6043,8 +6347,6 @@ static void GraphicsNew(ByteReader *buf)
|
||||
}
|
||||
}
|
||||
|
||||
if (type == 0x0D) _loaded_newgrf_features.shore = SHORE_REPLACE_ACTION_5;
|
||||
|
||||
_cur.skip_sprites = skip_num;
|
||||
}
|
||||
|
||||
@@ -6468,6 +6770,14 @@ static void SkipIf(ByteReader *buf)
|
||||
break;
|
||||
case 0x0E: result = GetRailTypeByLabel(BSWAP32(cond_val)) != INVALID_RAILTYPE;
|
||||
break;
|
||||
case 0x0F: result = GetRoadTypeByLabel(BSWAP32(cond_val)) == INVALID_ROADTYPE;
|
||||
break;
|
||||
case 0x10: result = GetRoadTypeByLabel(BSWAP32(cond_val)) != INVALID_ROADTYPE;
|
||||
break;
|
||||
case 0x11: result = GetRoadTypeByLabel(BSWAP32(cond_val)) == INVALID_ROADTYPE;
|
||||
break;
|
||||
case 0x12: result = GetRoadTypeByLabel(BSWAP32(cond_val)) != INVALID_ROADTYPE;
|
||||
break;
|
||||
|
||||
default: grfmsg(1, "SkipIf: Unsupported condition type %02X. Ignoring", condtype); return;
|
||||
}
|
||||
@@ -8830,6 +9140,9 @@ void ResetNewGRFData()
|
||||
/* Reset rail type information */
|
||||
ResetRailTypes();
|
||||
|
||||
/* Copy/reset original road type info data */
|
||||
ResetRoadTypes();
|
||||
|
||||
/* Allocate temporary refit/cargo class data */
|
||||
_gted = CallocT<GRFTempEngineData>(Engine::GetPoolSize());
|
||||
|
||||
@@ -8898,6 +9211,7 @@ void ResetNewGRFData()
|
||||
_loaded_newgrf_features.has_newhouses = false;
|
||||
_loaded_newgrf_features.has_newindustries = false;
|
||||
_loaded_newgrf_features.shore = SHORE_REPLACE_NONE;
|
||||
_loaded_newgrf_features.tram = TRAMWAY_REPLACE_DEPOT_NONE;
|
||||
|
||||
/* Clear all GRF overrides */
|
||||
_grf_id_overrides.clear();
|
||||
@@ -8985,6 +9299,14 @@ GRFFile::GRFFile(const GRFConfig *config)
|
||||
this->railtype_map[2] = RAILTYPE_MONO;
|
||||
this->railtype_map[3] = RAILTYPE_MAGLEV;
|
||||
|
||||
/* Initialise road type map with default road types */
|
||||
memset(this->roadtype_map, INVALID_ROADTYPE, sizeof(this->roadtype_map));
|
||||
this->roadtype_map[0] = ROADTYPE_ROAD;
|
||||
|
||||
/* Initialise tram type map with default tram types */
|
||||
memset(this->tramtype_map, INVALID_ROADTYPE, sizeof(this->tramtype_map));
|
||||
this->tramtype_map[0] = ROADTYPE_TRAM;
|
||||
|
||||
/* Copy the initial parameter list
|
||||
* 'Uninitialised' parameters are zeroed as that is their default value when dynamically creating them. */
|
||||
assert_compile(lengthof(this->param) == lengthof(config->param) && lengthof(this->param) == 0x80);
|
||||
@@ -9754,6 +10076,21 @@ static void ActivateOldShore()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Replocate the old tram depot sprites to the new position, if no new ones were loaded.
|
||||
*/
|
||||
static void ActivateOldTramDepot()
|
||||
{
|
||||
if (_loaded_newgrf_features.tram == TRAMWAY_REPLACE_DEPOT_WITH_TRACK) {
|
||||
DupSprite(SPR_ROAD_DEPOT + 0, SPR_TRAMWAY_DEPOT_NO_TRACK + 0); // use road depot graphics for "no tracks"
|
||||
DupSprite(SPR_TRAMWAY_DEPOT_WITH_TRACK + 1, SPR_TRAMWAY_DEPOT_NO_TRACK + 1);
|
||||
DupSprite(SPR_ROAD_DEPOT + 2, SPR_TRAMWAY_DEPOT_NO_TRACK + 2); // use road depot graphics for "no tracks"
|
||||
DupSprite(SPR_TRAMWAY_DEPOT_WITH_TRACK + 3, SPR_TRAMWAY_DEPOT_NO_TRACK + 3);
|
||||
DupSprite(SPR_TRAMWAY_DEPOT_WITH_TRACK + 4, SPR_TRAMWAY_DEPOT_NO_TRACK + 4);
|
||||
DupSprite(SPR_TRAMWAY_DEPOT_WITH_TRACK + 5, SPR_TRAMWAY_DEPOT_NO_TRACK + 5);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Decide whether price base multipliers of grfs shall apply globally or only to the grf specifying them
|
||||
*/
|
||||
@@ -9932,8 +10269,12 @@ static void AfterLoadGRFs()
|
||||
/* Load old shore sprites in new position, if they were replaced by ActionA */
|
||||
ActivateOldShore();
|
||||
|
||||
/* Load old tram depot sprites in new position, if no new ones are present */
|
||||
ActivateOldTramDepot();
|
||||
|
||||
/* Set up custom rail types */
|
||||
InitRailTypes();
|
||||
InitRoadTypes();
|
||||
|
||||
Engine *e;
|
||||
FOR_ALL_ENGINES_OF_TYPE(e, VEH_ROAD) {
|
||||
@@ -9941,6 +10282,31 @@ static void AfterLoadGRFs()
|
||||
/* Set RV maximum speed from the mph/0.8 unit value */
|
||||
e->u.road.max_speed = _gted[e->index].rv_max_speed * 4;
|
||||
}
|
||||
|
||||
RoadTramType rtt = HasBit(e->info.misc_flags, EF_ROAD_TRAM) ? RTT_TRAM : RTT_ROAD;
|
||||
|
||||
const GRFFile *file = e->GetGRF();
|
||||
if (file == nullptr || _gted[e->index].roadtramtype == 0) {
|
||||
e->u.road.roadtype = (rtt == RTT_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Remove +1 offset. */
|
||||
_gted[e->index].roadtramtype--;
|
||||
|
||||
const std::vector<RoadTypeLabel> *list = (rtt == RTT_TRAM) ? &file->tramtype_list : &file->roadtype_list;
|
||||
if (_gted[e->index].roadtramtype < list->size())
|
||||
{
|
||||
RoadTypeLabel rtl = (*list)[_gted[e->index].roadtramtype];
|
||||
RoadType rt = GetRoadTypeByLabel(rtl);
|
||||
if (rt != INVALID_ROADTYPE && GetRoadTramType(rt) == rtt) {
|
||||
e->u.road.roadtype = rt;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/* Road type is not available, so disable this engine */
|
||||
e->info.climates = 0;
|
||||
}
|
||||
|
||||
FOR_ALL_ENGINES_OF_TYPE(e, VEH_TRAIN) {
|
||||
|
16
src/newgrf.h
16
src/newgrf.h
@@ -14,6 +14,7 @@
|
||||
|
||||
#include "cargotype.h"
|
||||
#include "rail_type.h"
|
||||
#include "road_type.h"
|
||||
#include "fileio_type.h"
|
||||
#include "debug.h"
|
||||
#include "core/bitmath_func.hpp"
|
||||
@@ -86,6 +87,8 @@ enum GrfSpecFeature {
|
||||
GSF_OBJECTS,
|
||||
GSF_RAILTYPES,
|
||||
GSF_AIRPORTTILES,
|
||||
GSF_ROADTYPES,
|
||||
GSF_TRAMTYPES,
|
||||
GSF_END,
|
||||
|
||||
GSF_FAKE_TOWNS = GSF_END, ///< Fake town GrfSpecFeature for NewGRF debugging (parent scope)
|
||||
@@ -240,6 +243,12 @@ struct GRFFile : ZeroedMemoryAllocator {
|
||||
std::vector<RailTypeLabel> railtype_list; ///< Railtype translation table
|
||||
RailType railtype_map[RAILTYPE_END];
|
||||
|
||||
std::vector<RoadTypeLabel> roadtype_list; ///< Roadtype translation table (road)
|
||||
RoadType roadtype_map[ROADTYPE_END];
|
||||
|
||||
std::vector<RoadTypeLabel> tramtype_list; ///, Roadtype translation table (tram)
|
||||
RoadType tramtype_map[ROADTYPE_END];
|
||||
|
||||
CanalProperties canal_local_properties[CF_END]; ///< Canal properties as set by this NewGRF
|
||||
|
||||
struct LanguageMap *language_map; ///< Mappings related to the languages.
|
||||
@@ -273,12 +282,19 @@ enum ShoreReplacement {
|
||||
SHORE_REPLACE_ONLY_NEW, ///< Only corner-shores were loaded by Action5 (openttd(w/d).grf only).
|
||||
};
|
||||
|
||||
enum TramReplacement {
|
||||
TRAMWAY_REPLACE_DEPOT_NONE, ///< No tram depot graphics were loaded.
|
||||
TRAMWAY_REPLACE_DEPOT_WITH_TRACK, ///< Electrified depot graphics with tram track were loaded.
|
||||
TRAMWAY_REPLACE_DEPOT_NO_TRACK, ///< Electrified depot graphics without tram track were loaded.
|
||||
};
|
||||
|
||||
struct GRFLoadedFeatures {
|
||||
bool has_2CC; ///< Set if any vehicle is loaded which uses 2cc (two company colours).
|
||||
uint64 used_liveries; ///< Bitmask of #LiveryScheme used by the defined engines.
|
||||
bool has_newhouses; ///< Set if there are any newhouses loaded.
|
||||
bool has_newindustries; ///< Set if there are any newindustries loaded.
|
||||
ShoreReplacement shore; ///< In which way shore sprites were replaced.
|
||||
TramReplacement tram; ///< In which way tram depots were replaced.
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -23,6 +23,7 @@
|
||||
#include "station_base.h"
|
||||
#include "company_base.h"
|
||||
#include "newgrf_railtype.h"
|
||||
#include "newgrf_roadtype.h"
|
||||
#include "ship.h"
|
||||
|
||||
#include "safeguards.h"
|
||||
@@ -606,12 +607,22 @@ static uint32 VehicleGetVariable(Vehicle *v, const VehicleScopeResolver *object,
|
||||
case 0x48: return v->GetEngine()->flags; // Vehicle Type Info
|
||||
case 0x49: return v->build_year;
|
||||
|
||||
case 0x4A: {
|
||||
if (v->type != VEH_TRAIN) return 0;
|
||||
if (Train::From(v)->IsVirtual()) return 0x1FF;
|
||||
RailType rt = GetTileRailTypeByTrackBit(v->tile, Train::From(v)->track);
|
||||
return (HasPowerOnRail(Train::From(v)->railtype, rt) ? 0x100 : 0) | GetReverseRailTypeTranslation(rt, object->ro.grffile);
|
||||
}
|
||||
case 0x4A:
|
||||
switch (v->type) {
|
||||
case VEH_TRAIN: {
|
||||
if (Train::From(v)->IsVirtual()) return 0x1FF;
|
||||
RailType rt = GetTileRailTypeByTrackBit(v->tile, Train::From(v)->track);
|
||||
return (HasPowerOnRail(Train::From(v)->railtype, rt) ? 0x100 : 0) | GetReverseRailTypeTranslation(rt, object->ro.grffile);
|
||||
}
|
||||
|
||||
case VEH_ROAD: {
|
||||
RoadType rt = GetRoadType(v->tile, GetRoadTramType(RoadVehicle::From(v)->roadtype));
|
||||
return 0x100 | GetReverseRoadTypeTranslation(rt, object->ro.grffile);
|
||||
}
|
||||
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
case 0x4B: // Long date of last service
|
||||
return v->date_of_last_service;
|
||||
|
143
src/newgrf_roadtype.cpp
Normal file
143
src/newgrf_roadtype.cpp
Normal file
@@ -0,0 +1,143 @@
|
||||
/* $Id$ */
|
||||
|
||||
/*
|
||||
* This file is part of OpenTTD.
|
||||
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
|
||||
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/** @file newgrf_roadtype.cpp NewGRF handling of road types. */
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "debug.h"
|
||||
#include "newgrf_roadtype.h"
|
||||
#include "date_func.h"
|
||||
#include "depot_base.h"
|
||||
#include "town.h"
|
||||
|
||||
#include "safeguards.h"
|
||||
|
||||
/* virtual */ uint32 RoadTypeScopeResolver::GetRandomBits() const
|
||||
{
|
||||
uint tmp = CountBits(this->tile + (TileX(this->tile) + TileY(this->tile)) * TILE_SIZE);
|
||||
return GB(tmp, 0, 2);
|
||||
}
|
||||
|
||||
/* virtual */ uint32 RoadTypeScopeResolver::GetVariable(byte variable, uint32 parameter, bool *available) const
|
||||
{
|
||||
if (this->tile == INVALID_TILE) {
|
||||
switch (variable) {
|
||||
case 0x40: return 0;
|
||||
case 0x41: return 0;
|
||||
case 0x42: return 0;
|
||||
case 0x43: return _date;
|
||||
case 0x44: return HZB_TOWN_EDGE;
|
||||
}
|
||||
}
|
||||
|
||||
switch (variable) {
|
||||
case 0x40: return GetTerrainType(this->tile, this->context);
|
||||
case 0x41: return 0;
|
||||
case 0x42: return IsLevelCrossingTile(this->tile) && IsCrossingBarred(this->tile);
|
||||
case 0x43:
|
||||
if (IsRoadDepotTile(this->tile)) return Depot::GetByTile(this->tile)->build_date;
|
||||
return _date;
|
||||
case 0x44: {
|
||||
const Town *t = nullptr;
|
||||
if (IsRoadDepotTile(this->tile)) {
|
||||
t = Depot::GetByTile(this->tile)->town;
|
||||
} else if (IsTileType(this->tile, MP_ROAD)) {
|
||||
t = ClosestTownFromTile(this->tile, UINT_MAX);
|
||||
}
|
||||
return t != nullptr ? GetTownRadiusGroup(t, this->tile) : HZB_TOWN_EDGE;
|
||||
}
|
||||
}
|
||||
|
||||
DEBUG(grf, 1, "Unhandled road type tile variable 0x%X", variable);
|
||||
|
||||
*available = false;
|
||||
return UINT_MAX;
|
||||
}
|
||||
|
||||
/* virtual */ const SpriteGroup *RoadTypeResolverObject::ResolveReal(const RealSpriteGroup *group) const
|
||||
{
|
||||
if (group->num_loading > 0) return group->loading[0];
|
||||
if (group->num_loaded > 0) return group->loaded[0];
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor of the roadtype scope resolvers.
|
||||
* @param ro Surrounding resolver.
|
||||
* @param tile %Tile containing the track. For track on a bridge this is the southern bridgehead.
|
||||
* @param context Are we resolving sprites for the upper halftile, or on a bridge?
|
||||
*/
|
||||
RoadTypeScopeResolver::RoadTypeScopeResolver(ResolverObject &ro, TileIndex tile, TileContext context) : ScopeResolver(ro)
|
||||
{
|
||||
this->tile = tile;
|
||||
this->context = context;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolver object for road types.
|
||||
* @param rti Roadtype. nullptr in NewGRF Inspect window.
|
||||
* @param tile %Tile containing the track. For track on a bridge this is the southern bridgehead.
|
||||
* @param context Are we resolving sprites for the upper halftile, or on a bridge?
|
||||
* @param rtsg Roadpart of interest
|
||||
* @param param1 Extra parameter (first parameter of the callback, except roadtypes do not have callbacks).
|
||||
* @param param2 Extra parameter (second parameter of the callback, except roadtypes do not have callbacks).
|
||||
*/
|
||||
RoadTypeResolverObject::RoadTypeResolverObject(const RoadTypeInfo *rti, TileIndex tile, TileContext context, RoadTypeSpriteGroup rtsg, uint32 param1, uint32 param2)
|
||||
: ResolverObject(rti != nullptr ? rti->grffile[rtsg] : nullptr, CBID_NO_CALLBACK, param1, param2), roadtype_scope(*this, tile, context)
|
||||
{
|
||||
this->root_spritegroup = rti != nullptr ? rti->group[rtsg] : nullptr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the sprite to draw for the given tile.
|
||||
* @param rti The road type data (spec).
|
||||
* @param tile The tile to get the sprite for.
|
||||
* @param rtsg The type of sprite to draw.
|
||||
* @param content Where are we drawing the tile?
|
||||
* @param [out] num_results If not nullptr, return the number of sprites in the spriteset.
|
||||
* @return The sprite to draw.
|
||||
*/
|
||||
SpriteID GetCustomRoadSprite(const RoadTypeInfo *rti, TileIndex tile, RoadTypeSpriteGroup rtsg, TileContext context, uint *num_results)
|
||||
{
|
||||
assert(rtsg < ROTSG_END);
|
||||
|
||||
if (rti->group[rtsg] == nullptr) return 0;
|
||||
|
||||
RoadTypeResolverObject object(rti, tile, context, rtsg);
|
||||
const SpriteGroup *group = object.Resolve();
|
||||
if (group == nullptr || group->GetNumResults() == 0) return 0;
|
||||
|
||||
if (num_results) *num_results = group->GetNumResults();
|
||||
|
||||
return group->GetResult();
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform a reverse roadtype lookup to get the GRF internal ID.
|
||||
* @param roadtype The global (OpenTTD) roadtype.
|
||||
* @param grffile The GRF to do the lookup for.
|
||||
* @return the GRF internal ID.
|
||||
*/
|
||||
uint8 GetReverseRoadTypeTranslation(RoadType roadtype, const GRFFile *grffile)
|
||||
{
|
||||
/* No road type table present, return road type as-is */
|
||||
if (grffile == nullptr) return roadtype;
|
||||
|
||||
const std::vector<RoadTypeLabel> *list = RoadTypeIsRoad(roadtype) ? &grffile->roadtype_list : &grffile->tramtype_list;
|
||||
if (list->size() == 0) return roadtype;
|
||||
|
||||
/* Look for a matching road type label in the table */
|
||||
RoadTypeLabel label = GetRoadTypeInfo(roadtype)->label;
|
||||
|
||||
int index = find_index(*list, label);
|
||||
if (index >= 0) return index;
|
||||
|
||||
/* If not found, return as invalid */
|
||||
return 0xFF;
|
||||
}
|
51
src/newgrf_roadtype.h
Normal file
51
src/newgrf_roadtype.h
Normal file
@@ -0,0 +1,51 @@
|
||||
/* $Id$ */
|
||||
|
||||
/*
|
||||
* This file is part of OpenTTD.
|
||||
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
|
||||
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/** @file newgrf_roadtype.h NewGRF handling of road types. */
|
||||
|
||||
#ifndef NEWGRF_ROADTYPE_H
|
||||
#define NEWGRF_ROADTYPE_H
|
||||
|
||||
#include "road.h"
|
||||
#include "newgrf_commons.h"
|
||||
#include "newgrf_spritegroup.h"
|
||||
|
||||
/** Resolver for the railtype scope. */
|
||||
struct RoadTypeScopeResolver : public ScopeResolver {
|
||||
TileIndex tile; ///< Tracktile. For track on a bridge this is the southern bridgehead.
|
||||
TileContext context; ///< Are we resolving sprites for the upper halftile, or on a bridge?
|
||||
|
||||
RoadTypeScopeResolver(ResolverObject &ro, TileIndex tile, TileContext context);
|
||||
|
||||
/* virtual */ uint32 GetRandomBits() const;
|
||||
/* virtual */ uint32 GetVariable(byte variable, uint32 parameter, bool *available) const;
|
||||
};
|
||||
|
||||
/** Resolver object for road types. */
|
||||
struct RoadTypeResolverObject : public ResolverObject {
|
||||
RoadTypeScopeResolver roadtype_scope; ///< Resolver for the roadtype scope.
|
||||
|
||||
RoadTypeResolverObject(const RoadTypeInfo *rti, TileIndex tile, TileContext context, RoadTypeSpriteGroup rtsg, uint32 param1 = 0, uint32 param2 = 0);
|
||||
|
||||
/* virtual */ ScopeResolver *GetScope(VarSpriteGroupScope scope = VSG_SCOPE_SELF, byte relative = 0)
|
||||
{
|
||||
switch (scope) {
|
||||
case VSG_SCOPE_SELF: return &this->roadtype_scope;
|
||||
default: return ResolverObject::GetScope(scope, relative);
|
||||
}
|
||||
}
|
||||
|
||||
/* virtual */ const SpriteGroup *ResolveReal(const RealSpriteGroup *group) const;
|
||||
};
|
||||
|
||||
SpriteID GetCustomRoadSprite(const RoadTypeInfo *rti, TileIndex tile, RoadTypeSpriteGroup rtsg, TileContext context = TCX_NORMAL, uint *num_results = nullptr);
|
||||
|
||||
uint8 GetReverseRoadTypeTranslation(RoadType roadtype, const GRFFile *grffile);
|
||||
|
||||
#endif /* NEWGRF_ROADTYPE_H */
|
@@ -53,6 +53,7 @@
|
||||
#include "engine_func.h"
|
||||
#include "core/random_func.hpp"
|
||||
#include "rail_gui.h"
|
||||
#include "road_gui.h"
|
||||
#include "core/backup_type.hpp"
|
||||
#include "hotkeys.h"
|
||||
#include "newgrf.h"
|
||||
@@ -1040,6 +1041,7 @@ static void MakeNewGameDone()
|
||||
SetLocalCompany(COMPANY_FIRST);
|
||||
|
||||
InitializeRailGUI();
|
||||
InitializeRoadGUI();
|
||||
|
||||
/* We are the server, we start a new company (not dedicated),
|
||||
* so set the default password *if* needed. */
|
||||
|
@@ -33,7 +33,7 @@ struct CFollowTrackT
|
||||
enum ErrorCode {
|
||||
EC_NONE,
|
||||
EC_OWNER,
|
||||
EC_RAIL_TYPE,
|
||||
EC_RAIL_ROAD_TYPE,
|
||||
EC_90DEG,
|
||||
EC_NO_WAY,
|
||||
EC_RESERVED,
|
||||
@@ -61,6 +61,7 @@ struct CFollowTrackT
|
||||
|
||||
inline CFollowTrackT(Owner o, RailTypes railtype_override = INVALID_RAILTYPES, CPerformanceTimer *pPerf = nullptr)
|
||||
{
|
||||
assert(IsRailTT());
|
||||
m_veh = nullptr;
|
||||
Init(o, railtype_override, pPerf);
|
||||
}
|
||||
@@ -93,7 +94,7 @@ struct CFollowTrackT
|
||||
inline static TransportType TT() { return Ttr_type_; }
|
||||
inline static bool IsWaterTT() { return TT() == TRANSPORT_WATER; }
|
||||
inline static bool IsRailTT() { return TT() == TRANSPORT_RAIL; }
|
||||
inline bool IsTram() { return IsRoadTT() && HasBit(RoadVehicle::From(m_veh)->compatible_roadtypes, ROADTYPE_TRAM); }
|
||||
inline bool IsTram() { return IsRoadTT() && RoadTypeIsTram(RoadVehicle::From(m_veh)->roadtype); }
|
||||
inline static bool IsRoadTT() { return TT() == TRANSPORT_ROAD; }
|
||||
inline static bool Allow90degTurns() { return T90deg_turns_allowed_; }
|
||||
inline static bool DoTrackMasking() { return Tmask_reserved_tracks; }
|
||||
@@ -105,7 +106,7 @@ struct CFollowTrackT
|
||||
|
||||
const bool is_bridge = IsRoadCustomBridgeHeadTile(tile);
|
||||
if (is_bridge || IsNormalRoadTile(tile)) {
|
||||
RoadBits rb = is_bridge ? GetCustomBridgeHeadRoadBits(tile, ROADTYPE_TRAM) : GetRoadBits(tile, ROADTYPE_TRAM);
|
||||
RoadBits rb = is_bridge ? GetCustomBridgeHeadRoadBits(tile, RTT_TRAM) : GetRoadBits(tile, RTT_TRAM);
|
||||
switch (rb) {
|
||||
case ROAD_NW: return DIAGDIR_NW;
|
||||
case ROAD_SW: return DIAGDIR_SW;
|
||||
@@ -128,7 +129,7 @@ struct CFollowTrackT
|
||||
m_err = EC_NONE;
|
||||
assert_tile(
|
||||
((TrackStatusToTrackdirBits(
|
||||
GetTileTrackStatus(m_old_tile, TT(), (IsRoadTT() && m_veh != nullptr) ? RoadVehicle::From(m_veh)->compatible_roadtypes : 0)
|
||||
GetTileTrackStatus(m_old_tile, TT(), (IsRoadTT() && m_veh != nullptr) ? (this->IsTram() ? RTT_TRAM : RTT_ROAD) : 0)
|
||||
) & TrackdirToTrackdirBits(m_old_td)) != 0) ||
|
||||
(IsTram() && GetSingleTramBit(m_old_tile) != INVALID_DIAGDIR), // Disable the assertion for single tram bits
|
||||
m_old_tile
|
||||
@@ -154,7 +155,7 @@ struct CFollowTrackT
|
||||
if (IsRoadTT() && !IsTram() && TryReverse()) return true;
|
||||
|
||||
/* CanEnterNewTile already set a reason.
|
||||
* Do NOT overwrite it (important for example for EC_RAIL_TYPE).
|
||||
* Do NOT overwrite it (important for example for EC_RAIL_ROAD_TYPE).
|
||||
* Only set a reason if CanEnterNewTile was not called */
|
||||
if (m_new_td_bits == TRACKDIR_BIT_NONE) m_err = EC_NO_WAY;
|
||||
|
||||
@@ -244,7 +245,7 @@ protected:
|
||||
if (IsRailTT() && IsPlainRailTile(m_new_tile)) {
|
||||
m_new_td_bits = (TrackdirBits)(GetTrackBits(m_new_tile) * 0x101);
|
||||
} else {
|
||||
m_new_td_bits = TrackStatusToTrackdirBits(GetTileTrackStatus(m_new_tile, TT(), IsRoadTT() ? RoadVehicle::From(m_veh)->compatible_roadtypes : 0));
|
||||
m_new_td_bits = TrackStatusToTrackdirBits(GetTileTrackStatus(m_new_tile, TT(), IsRoadTT() ? (this->IsTram() ? RTT_TRAM : RTT_ROAD) : 0));
|
||||
|
||||
if (IsTram() && m_new_td_bits == TRACKDIR_BIT_NONE) {
|
||||
/* GetTileTrackStatus() returns 0 for single tram bits.
|
||||
@@ -358,7 +359,18 @@ protected:
|
||||
RailType rail_type = GetTileRailTypeByEntryDir(m_new_tile, m_exitdir);
|
||||
if (!HasBit(m_railtypes, rail_type)) {
|
||||
/* incompatible rail type */
|
||||
m_err = EC_RAIL_TYPE;
|
||||
m_err = EC_RAIL_ROAD_TYPE;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/* road transport is possible only on compatible road types */
|
||||
if (IsRoadTT()) {
|
||||
const RoadVehicle *v = RoadVehicle::From(m_veh);
|
||||
RoadType roadtype = GetRoadType(m_new_tile, GetRoadTramType(v->roadtype));
|
||||
if (!HasBit(v->compatible_roadtypes, roadtype)) {
|
||||
/* incompatible road type */
|
||||
m_err = EC_RAIL_ROAD_TYPE;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -380,7 +392,7 @@ protected:
|
||||
return false;
|
||||
}
|
||||
if (!m_is_bridge && IsRoadTT() && IsRoadCustomBridgeHeadTile(m_new_tile)) {
|
||||
if (!(DiagDirToRoadBits(ReverseDiagDir(m_exitdir)) & GetCustomBridgeHeadRoadBits(m_new_tile, IsTram() ? ROADTYPE_TRAM : ROADTYPE_ROAD))) {
|
||||
if (!(DiagDirToRoadBits(ReverseDiagDir(m_exitdir)) & GetCustomBridgeHeadRoadBits(m_new_tile, IsTram() ? RTT_TRAM : RTT_ROAD))) {
|
||||
m_err = EC_NO_WAY;
|
||||
return false;
|
||||
}
|
||||
|
@@ -44,6 +44,7 @@ struct AyStarUserData {
|
||||
TransportType type;
|
||||
RailTypes railtypes;
|
||||
RoadTypes roadtypes;
|
||||
uint subtype;
|
||||
};
|
||||
|
||||
/** Indices into AyStarNode.userdata[] */
|
||||
@@ -726,7 +727,7 @@ static DiagDirection GetDepotDirection(TileIndex tile, TransportType type)
|
||||
static DiagDirection GetSingleTramBit(TileIndex tile)
|
||||
{
|
||||
if (IsNormalRoadTile(tile)) {
|
||||
RoadBits rb = GetRoadBits(tile, ROADTYPE_TRAM);
|
||||
RoadBits rb = GetRoadBits(tile, RTT_TRAM);
|
||||
switch (rb) {
|
||||
case ROAD_NW: return DIAGDIR_NW;
|
||||
case ROAD_SW: return DIAGDIR_SW;
|
||||
@@ -754,7 +755,7 @@ static DiagDirection GetTileSingleEntry(TileIndex tile, TransportType type, uint
|
||||
|
||||
if (type == TRANSPORT_ROAD) {
|
||||
if (IsStandardRoadStopTile(tile)) return GetRoadStopDir(tile);
|
||||
if (HasBit(subtype, ROADTYPE_TRAM)) return GetSingleTramBit(tile);
|
||||
if ((RoadTramType)subtype == RTT_TRAM) return GetSingleTramBit(tile);
|
||||
}
|
||||
|
||||
return INVALID_DIAGDIR;
|
||||
@@ -792,13 +793,24 @@ static bool CanEnterTile(TileIndex tile, DiagDirection dir, AyStarUserData *user
|
||||
if (!CanEnterTileOwnerCheck(user->owner, tile, dir)) return false;
|
||||
|
||||
/* check correct rail type (mono, maglev, etc) */
|
||||
if (user->type == TRANSPORT_RAIL) {
|
||||
RailType rail_type = GetTileRailTypeByEntryDir(tile, dir);
|
||||
if (!HasBit(user->railtypes, rail_type)) return false;
|
||||
switch (user->type) {
|
||||
case TRANSPORT_RAIL: {
|
||||
RailType rail_type = GetTileRailTypeByEntryDir(tile, dir);
|
||||
if (!HasBit(user->railtypes, rail_type)) return false;
|
||||
break;
|
||||
}
|
||||
|
||||
case TRANSPORT_ROAD: {
|
||||
RoadType road_type = GetRoadType(tile, (RoadTramType)user->subtype);
|
||||
if (!HasBit(user->roadtypes, road_type)) return false;
|
||||
break;
|
||||
}
|
||||
|
||||
default: break;
|
||||
}
|
||||
|
||||
/* Depots, standard roadstops and single tram bits can only be entered from one direction */
|
||||
DiagDirection single_entry = GetTileSingleEntry(tile, user->type, user->roadtypes);
|
||||
DiagDirection single_entry = GetTileSingleEntry(tile, user->type, user->subtype);
|
||||
if (single_entry != INVALID_DIAGDIR && single_entry != ReverseDiagDir(dir)) return false;
|
||||
|
||||
return true;
|
||||
@@ -820,7 +832,7 @@ static TrackdirBits GetDriveableTrackdirBits(TileIndex dst_tile, TileIndex src_t
|
||||
{
|
||||
TrackdirBits trackdirbits = TrackStatusToTrackdirBits(GetTileTrackStatus(dst_tile, type, subtype));
|
||||
|
||||
if (trackdirbits == TRACKDIR_BIT_NONE && type == TRANSPORT_ROAD && HasBit(subtype, ROADTYPE_TRAM)) {
|
||||
if (trackdirbits == TRACKDIR_BIT_NONE && type == TRANSPORT_ROAD && (RoadTramType)subtype == RTT_TRAM) {
|
||||
/* GetTileTrackStatus() returns 0 for single tram bits.
|
||||
* As we cannot change it there (easily) without breaking something, change it here */
|
||||
switch (GetSingleTramBit(dst_tile)) {
|
||||
@@ -870,7 +882,7 @@ static void NPFFollowTrack(AyStar *aystar, OpenListNode *current)
|
||||
|
||||
/* Information about the vehicle: TransportType (road/rail/water) and SubType (compatible rail/road types) */
|
||||
TransportType type = user->type;
|
||||
uint subtype = user->roadtypes;
|
||||
uint subtype = user->subtype;
|
||||
|
||||
/* Initialize to 0, so we can jump out (return) somewhere an have no neighbours */
|
||||
aystar->num_neighbours = 0;
|
||||
@@ -901,11 +913,11 @@ static void NPFFollowTrack(AyStar *aystar, OpenListNode *current)
|
||||
/* We leave src_tile in src_exitdir and reach dst_tile */
|
||||
dst_tile = AddTileIndexDiffCWrap(src_tile, TileIndexDiffCByDiagDir(src_exitdir));
|
||||
|
||||
if (dst_tile != INVALID_TILE && !CanEnterTile(dst_tile, src_exitdir, user)) dst_tile = INVALID_TILE;
|
||||
if (dst_tile != INVALID_TILE && IsNormalRoadTile(dst_tile) && !CanEnterTile(dst_tile, src_exitdir, user)) dst_tile = INVALID_TILE;
|
||||
|
||||
if (dst_tile == INVALID_TILE) {
|
||||
/* We cannot enter the next tile. Road vehicles can reverse, others reach dead end */
|
||||
if (type != TRANSPORT_ROAD || HasBit(subtype, ROADTYPE_TRAM)) return;
|
||||
if (type != TRANSPORT_ROAD || (RoadTramType)subtype == RTT_TRAM) return;
|
||||
|
||||
dst_tile = src_tile;
|
||||
src_trackdir = ReverseTrackdir(src_trackdir);
|
||||
@@ -915,7 +927,7 @@ static void NPFFollowTrack(AyStar *aystar, OpenListNode *current)
|
||||
|
||||
if (trackdirbits == TRACKDIR_BIT_NONE) {
|
||||
/* We cannot enter the next tile. Road vehicles can reverse, others reach dead end */
|
||||
if (type != TRANSPORT_ROAD || HasBit(subtype, ROADTYPE_TRAM)) return;
|
||||
if (type != TRANSPORT_ROAD || (RoadTramType)subtype == RTT_TRAM) return;
|
||||
|
||||
dst_tile = src_tile;
|
||||
src_trackdir = ReverseTrackdir(src_trackdir);
|
||||
@@ -1127,7 +1139,7 @@ FindDepotData NPFRoadVehicleFindNearestDepot(const RoadVehicle *v, int max_penal
|
||||
{
|
||||
Trackdir trackdir = v->GetVehicleTrackdir();
|
||||
|
||||
AyStarUserData user = { v->owner, TRANSPORT_ROAD, RAILTYPES_NONE, v->compatible_roadtypes };
|
||||
AyStarUserData user = { v->owner, TRANSPORT_ROAD, RAILTYPES_NONE, v->compatible_roadtypes, GetRoadTramType(v->roadtype) };
|
||||
NPFFoundTargetData ftd = NPFRouteToDepotBreadthFirstTwoWay(v->tile, trackdir, false, INVALID_TILE, INVALID_TRACKDIR, false, nullptr, &user, 0, max_penalty);
|
||||
|
||||
if (ftd.best_bird_dist != 0) return FindDepotData();
|
||||
@@ -1147,7 +1159,7 @@ Trackdir NPFRoadVehicleChooseTrack(const RoadVehicle *v, TileIndex tile, DiagDir
|
||||
NPFFillWithOrderData(&fstd, v);
|
||||
Trackdir trackdir = DiagDirToDiagTrackdir(enterdir);
|
||||
|
||||
AyStarUserData user = { v->owner, TRANSPORT_ROAD, RAILTYPES_NONE, v->compatible_roadtypes };
|
||||
AyStarUserData user = { v->owner, TRANSPORT_ROAD, RAILTYPES_NONE, v->compatible_roadtypes, GetRoadTramType(v->roadtype) };
|
||||
NPFFoundTargetData ftd = NPFRouteToStationOrTile(tile - TileOffsByDiagDir(enterdir), trackdir, true, &fstd, &user);
|
||||
|
||||
assert(ftd.best_trackdir != INVALID_TRACKDIR);
|
||||
@@ -1170,7 +1182,7 @@ Track NPFShipChooseTrack(const Ship *v, bool &path_found)
|
||||
|
||||
NPFFillWithOrderData(&fstd, v);
|
||||
|
||||
AyStarUserData user = { v->owner, TRANSPORT_WATER, RAILTYPES_NONE, ROADTYPES_NONE };
|
||||
AyStarUserData user = { v->owner, TRANSPORT_WATER, RAILTYPES_NONE, ROADTYPES_NONE, 0 };
|
||||
NPFFoundTargetData ftd = NPFRouteToStationOrTile(v->tile, trackdir, true, &fstd, &user);
|
||||
|
||||
/* If ftd.best_bird_dist is 0, we found our target and ftd.best_trackdir contains
|
||||
@@ -1194,7 +1206,7 @@ bool NPFShipCheckReverse(const Ship *v)
|
||||
assert(trackdir != INVALID_TRACKDIR);
|
||||
assert(trackdir_rev != INVALID_TRACKDIR);
|
||||
|
||||
AyStarUserData user = { v->owner, TRANSPORT_WATER, RAILTYPES_NONE, ROADTYPES_NONE };
|
||||
AyStarUserData user = { v->owner, TRANSPORT_WATER, RAILTYPES_NONE, ROADTYPES_NONE, 0 };
|
||||
ftd = NPFRouteToStationOrTileTwoWay(v->tile, trackdir, false, v->tile, trackdir_rev, false, &fstd, &user);
|
||||
/* If we didn't find anything, just keep on going straight ahead, otherwise take the reverse flag */
|
||||
return ftd.best_bird_dist == 0 && NPFGetFlag(&ftd.node, NPF_FLAG_REVERSE);
|
||||
@@ -1212,7 +1224,7 @@ FindDepotData NPFTrainFindNearestDepot(const Train *v, int max_penalty)
|
||||
fstd.reserve_path = false;
|
||||
|
||||
assert(trackdir != INVALID_TRACKDIR);
|
||||
AyStarUserData user = { v->owner, TRANSPORT_RAIL, v->compatible_railtypes, ROADTYPES_NONE };
|
||||
AyStarUserData user = { v->owner, TRANSPORT_RAIL, v->compatible_railtypes, ROADTYPES_NONE, 0 };
|
||||
NPFFoundTargetData ftd = NPFRouteToDepotBreadthFirstTwoWay(v->tile, trackdir, false, last->tile, trackdir_rev, false, &fstd, &user, NPF_INFINITE_PENALTY, max_penalty);
|
||||
if (ftd.best_bird_dist != 0) return FindDepotData();
|
||||
|
||||
@@ -1241,7 +1253,7 @@ bool NPFTrainFindNearestSafeTile(const Train *v, TileIndex tile, Trackdir trackd
|
||||
|
||||
/* perform a breadth first search. Target is nullptr,
|
||||
* since we are just looking for any safe tile...*/
|
||||
AyStarUserData user = { v->owner, TRANSPORT_RAIL, railtypes, ROADTYPES_NONE };
|
||||
AyStarUserData user = { v->owner, TRANSPORT_RAIL, railtypes, ROADTYPES_NONE, 0 };
|
||||
return NPFRouteInternal(&start1, true, nullptr, false, &fstd, NPFFindSafeTile, NPFCalcZero, &user, 0, true).res_okay;
|
||||
}
|
||||
|
||||
@@ -1258,7 +1270,7 @@ bool NPFTrainCheckReverse(const Train *v)
|
||||
assert(trackdir != INVALID_TRACKDIR);
|
||||
assert(trackdir_rev != INVALID_TRACKDIR);
|
||||
|
||||
AyStarUserData user = { v->owner, TRANSPORT_RAIL, v->compatible_railtypes, ROADTYPES_NONE };
|
||||
AyStarUserData user = { v->owner, TRANSPORT_RAIL, v->compatible_railtypes, ROADTYPES_NONE, 0 };
|
||||
ftd = NPFRouteToStationOrTileTwoWay(v->tile, trackdir, false, last->tile, trackdir_rev, false, &fstd, &user);
|
||||
/* If we didn't find anything, just keep on going straight ahead, otherwise take the reverse flag */
|
||||
return ftd.best_bird_dist == 0 && NPFGetFlag(&ftd.node, NPF_FLAG_REVERSE);
|
||||
@@ -1272,7 +1284,7 @@ Track NPFTrainChooseTrack(const Train *v, bool &path_found, bool reserve_track,
|
||||
PBSTileInfo origin = FollowTrainReservation(v);
|
||||
assert(IsValidTrackdir(origin.trackdir));
|
||||
|
||||
AyStarUserData user = { v->owner, TRANSPORT_RAIL, v->compatible_railtypes, ROADTYPES_NONE };
|
||||
AyStarUserData user = { v->owner, TRANSPORT_RAIL, v->compatible_railtypes, ROADTYPES_NONE, 0 };
|
||||
NPFFoundTargetData ftd = NPFRouteToStationOrTile(origin.tile, origin.trackdir, true, &fstd, &user);
|
||||
|
||||
if (target != nullptr) {
|
||||
|
@@ -652,7 +652,7 @@ no_entry_cost: // jump here at the beginning if the node has no parent (it is th
|
||||
if (!tf_local.Follow(cur.tile, cur.td)) {
|
||||
assert(tf_local.m_err != TrackFollower::EC_NONE);
|
||||
/* Can't move to the next tile (EOL?). */
|
||||
if (tf_local.m_err == TrackFollower::EC_RAIL_TYPE) {
|
||||
if (tf_local.m_err == TrackFollower::EC_RAIL_ROAD_TYPE) {
|
||||
end_segment_reason |= ESRB_RAIL_TYPE;
|
||||
} else {
|
||||
end_segment_reason |= ESRB_DEAD_END;
|
||||
|
@@ -263,7 +263,7 @@ public:
|
||||
} else {
|
||||
m_dest_station = INVALID_STATION;
|
||||
m_destTile = v->dest_tile;
|
||||
m_destTrackdirs = TrackStatusToTrackdirBits(GetTileTrackStatus(v->dest_tile, TRANSPORT_ROAD, v->compatible_roadtypes));
|
||||
m_destTrackdirs = TrackStatusToTrackdirBits(GetTileTrackStatus(v->dest_tile, TRANSPORT_ROAD, GetRoadTramType(v->roadtype)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -386,7 +386,7 @@ public:
|
||||
/* our source tile will be the next vehicle tile (should be the given one) */
|
||||
TileIndex src_tile = tile;
|
||||
/* get available trackdirs on the start tile */
|
||||
TrackdirBits src_trackdirs = TrackStatusToTrackdirBits(GetTileTrackStatus(tile, TRANSPORT_ROAD, v->compatible_roadtypes));
|
||||
TrackdirBits src_trackdirs = TrackStatusToTrackdirBits(GetTileTrackStatus(tile, TRANSPORT_ROAD, GetRoadTramType(v->roadtype)));
|
||||
/* select reachable trackdirs only */
|
||||
src_trackdirs &= DiagdirReachesTrackdirs(enterdir);
|
||||
|
||||
@@ -485,7 +485,7 @@ public:
|
||||
/* set origin (tile, trackdir) */
|
||||
TileIndex src_tile = v->tile;
|
||||
Trackdir src_td = v->GetVehicleTrackdir();
|
||||
if (!HasTrackdir(TrackStatusToTrackdirBits(GetTileTrackStatus(src_tile, TRANSPORT_ROAD, v->compatible_roadtypes)), src_td)) {
|
||||
if (!HasTrackdir(TrackStatusToTrackdirBits(GetTileTrackStatus(src_tile, TRANSPORT_ROAD, this->IsTram() ? RTT_TRAM : RTT_ROAD)), src_td)) {
|
||||
/* sometimes the roadveh is not on the road (it resides on non-existing track)
|
||||
* how should we handle that situation? */
|
||||
return false;
|
||||
@@ -565,7 +565,7 @@ FindDepotData YapfRoadVehicleFindNearestDepot(const RoadVehicle *v, int max_dist
|
||||
{
|
||||
TileIndex tile = v->tile;
|
||||
Trackdir trackdir = v->GetVehicleTrackdir();
|
||||
if (!HasTrackdir(TrackStatusToTrackdirBits(GetTileTrackStatus(tile, TRANSPORT_ROAD, v->compatible_roadtypes)), trackdir)) {
|
||||
if (!HasTrackdir(TrackStatusToTrackdirBits(GetTileTrackStatus(tile, TRANSPORT_ROAD, GetRoadTramType(v->roadtype))), trackdir)) {
|
||||
return FindDepotData();
|
||||
}
|
||||
|
||||
|
@@ -675,41 +675,48 @@ CommandCost CmdBuildSingleRail(TileIndex tile, DoCommandFlag flags, uint32 p1, u
|
||||
|
||||
if (GetDisallowedRoadDirections(tile) != DRD_NONE) return_cmd_error(STR_ERROR_CROSSING_ON_ONEWAY_ROAD);
|
||||
|
||||
if (RailNoLevelCrossings(railtype)) return_cmd_error(STR_ERROR_CROSSING_DISALLOWED);
|
||||
if (RailNoLevelCrossings(railtype)) return_cmd_error(STR_ERROR_CROSSING_DISALLOWED_RAIL);
|
||||
|
||||
RoadTypes roadtypes = GetRoadTypes(tile);
|
||||
RoadBits road = GetRoadBits(tile, ROADTYPE_ROAD);
|
||||
RoadBits tram = GetRoadBits(tile, ROADTYPE_TRAM);
|
||||
RoadType roadtype_road = GetRoadTypeRoad(tile);
|
||||
RoadType roadtype_tram = GetRoadTypeTram(tile);
|
||||
|
||||
if (roadtype_road != INVALID_ROADTYPE && RoadNoLevelCrossing(roadtype_road)) return_cmd_error(STR_ERROR_CROSSING_DISALLOWED_ROAD);
|
||||
if (roadtype_tram != INVALID_ROADTYPE && RoadNoLevelCrossing(roadtype_tram)) return_cmd_error(STR_ERROR_CROSSING_DISALLOWED_ROAD);
|
||||
|
||||
RoadBits road = GetRoadBits(tile, RTT_ROAD);
|
||||
RoadBits tram = GetRoadBits(tile, RTT_TRAM);
|
||||
if ((track == TRACK_X && ((road | tram) & ROAD_X) == 0) ||
|
||||
(track == TRACK_Y && ((road | tram) & ROAD_Y) == 0)) {
|
||||
Owner road_owner = GetRoadOwner(tile, ROADTYPE_ROAD);
|
||||
Owner tram_owner = GetRoadOwner(tile, ROADTYPE_TRAM);
|
||||
Owner road_owner = GetRoadOwner(tile, RTT_ROAD);
|
||||
Owner tram_owner = GetRoadOwner(tile, RTT_TRAM);
|
||||
/* Disallow breaking end-of-line of someone else
|
||||
* so trams can still reverse on this tile. */
|
||||
if (Company::IsValidID(tram_owner) && HasExactlyOneBit(tram)) {
|
||||
CommandCost ret = CheckOwnership(tram_owner);
|
||||
if (ret.Failed()) return ret;
|
||||
}
|
||||
/* Crossings must always have a road... */
|
||||
uint num_new_road_pieces = 2 - CountBits(road);
|
||||
if (road == ROAD_NONE) road_owner = _current_company;
|
||||
roadtypes |= ROADTYPES_ROAD;
|
||||
/* ...but tram is not required. */
|
||||
uint num_new_tram_pieces = (tram != ROAD_NONE) ? 2 - CountBits(tram) : 0;
|
||||
|
||||
cost.AddCost((num_new_road_pieces + num_new_tram_pieces) * _price[PR_BUILD_ROAD]);
|
||||
uint num_new_road_pieces = (road != ROAD_NONE) ? 2 - CountBits(road) : 0;
|
||||
if (num_new_road_pieces > 0) {
|
||||
cost.AddCost(num_new_road_pieces * RoadBuildCost(roadtype_road));
|
||||
}
|
||||
|
||||
uint num_new_tram_pieces = (tram != ROAD_NONE) ? 2 - CountBits(tram) : 0;
|
||||
if (num_new_tram_pieces > 0) {
|
||||
cost.AddCost(num_new_tram_pieces * RoadBuildCost(roadtype_tram));
|
||||
}
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
MakeRoadCrossing(tile, road_owner, tram_owner, _current_company, (track == TRACK_X ? AXIS_Y : AXIS_X), railtype, roadtypes, GetTownIndex(tile));
|
||||
MakeRoadCrossing(tile, road_owner, tram_owner, _current_company, (track == TRACK_X ? AXIS_Y : AXIS_X), railtype, roadtype_road, roadtype_tram, GetTownIndex(tile));
|
||||
UpdateLevelCrossing(tile, false);
|
||||
Company::Get(_current_company)->infrastructure.rail[railtype] += LEVELCROSSING_TRACKBIT_FACTOR;
|
||||
DirtyCompanyInfrastructureWindows(_current_company);
|
||||
if (num_new_road_pieces > 0 && Company::IsValidID(road_owner)) {
|
||||
Company::Get(road_owner)->infrastructure.road[ROADTYPE_ROAD] += num_new_road_pieces;
|
||||
Company::Get(road_owner)->infrastructure.road[roadtype_road] += num_new_road_pieces;
|
||||
DirtyCompanyInfrastructureWindows(road_owner);
|
||||
}
|
||||
if (num_new_tram_pieces > 0 && Company::IsValidID(tram_owner)) {
|
||||
Company::Get(tram_owner)->infrastructure.road[ROADTYPE_TRAM] += num_new_tram_pieces;
|
||||
Company::Get(tram_owner)->infrastructure.road[roadtype_tram] += num_new_tram_pieces;
|
||||
DirtyCompanyInfrastructureWindows(tram_owner);
|
||||
}
|
||||
}
|
||||
@@ -811,10 +818,11 @@ CommandCost CmdRemoveSingleRail(TileIndex tile, DoCommandFlag flags, uint32 p1,
|
||||
v = GetTrainForReservation(tile, track);
|
||||
if (v != nullptr) FreeTrainTrackReservation(v);
|
||||
}
|
||||
|
||||
owner = GetTileOwner(tile);
|
||||
Company::Get(owner)->infrastructure.rail[GetRailType(tile)] -= LEVELCROSSING_TRACKBIT_FACTOR;
|
||||
DirtyCompanyInfrastructureWindows(owner);
|
||||
MakeRoadNormal(tile, GetCrossingRoadBits(tile), GetRoadTypes(tile), GetTownIndex(tile), GetRoadOwner(tile, ROADTYPE_ROAD), GetRoadOwner(tile, ROADTYPE_TRAM));
|
||||
MakeRoadNormal(tile, GetCrossingRoadBits(tile), GetRoadTypeRoad(tile), GetRoadTypeTram(tile), GetTownIndex(tile), GetRoadOwner(tile, RTT_ROAD), GetRoadOwner(tile, RTT_TRAM));
|
||||
DeleteNewGRFInspectWindow(GSF_RAILTYPES, tile);
|
||||
}
|
||||
break;
|
||||
@@ -2048,7 +2056,7 @@ CommandCost CmdConvertRail(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
|
||||
case MP_ROAD:
|
||||
if (!IsLevelCrossing(tile)) continue;
|
||||
if (RailNoLevelCrossings(totype)) {
|
||||
error.MakeError(STR_ERROR_CROSSING_DISALLOWED);
|
||||
error.MakeError(STR_ERROR_CROSSING_DISALLOWED_RAIL);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
|
@@ -2235,5 +2235,11 @@ DropDownList GetRailTypeDropDownList(bool for_replacement, bool all_option)
|
||||
item->SetParam(1, rti->max_speed);
|
||||
list.emplace_back(item);
|
||||
}
|
||||
|
||||
if (list.size() == 0) {
|
||||
/* Empty dropdowns are not allowed */
|
||||
list.emplace_back(new DropDownListStringItem(STR_NONE, INVALID_RAILTYPE, true));
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
226
src/road.cpp
226
src/road.cpp
@@ -19,6 +19,9 @@
|
||||
#include "engine_base.h"
|
||||
#include "date_func.h"
|
||||
#include "landscape.h"
|
||||
#include "road.h"
|
||||
#include "road_func.h"
|
||||
#include "roadveh.h"
|
||||
|
||||
#include "safeguards.h"
|
||||
|
||||
@@ -75,7 +78,7 @@ RoadBits CleanUpRoadBits(const TileIndex tile, RoadBits org_rb)
|
||||
/* Always connective */
|
||||
connective = true;
|
||||
} else {
|
||||
const RoadBits neighbor_rb = GetAnyRoadBits(neighbor_tile, ROADTYPE_ROAD) | GetAnyRoadBits(neighbor_tile, ROADTYPE_TRAM);
|
||||
const RoadBits neighbor_rb = GetAnyRoadBits(neighbor_tile, RTT_ROAD) | GetAnyRoadBits(neighbor_tile, RTT_TRAM);
|
||||
|
||||
/* Accept only connective tiles */
|
||||
connective = (neighbor_rb & mirrored_rb) != ROAD_NONE;
|
||||
@@ -110,53 +113,236 @@ RoadBits CleanUpRoadBits(const TileIndex tile, RoadBits org_rb)
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds out, whether given company has all given RoadTypes available
|
||||
* Finds out, whether given company has a given RoadType available for construction.
|
||||
* @param company ID of company
|
||||
* @param rts RoadTypes to test
|
||||
* @return true if company has all requested RoadTypes available
|
||||
* @param roadtypet RoadType to test
|
||||
* @return true if company has the requested RoadType available
|
||||
*/
|
||||
bool HasRoadTypesAvail(const CompanyID company, const RoadTypes rts)
|
||||
bool HasRoadTypeAvail(const CompanyID company, RoadType roadtype)
|
||||
{
|
||||
RoadTypes avail_roadtypes;
|
||||
|
||||
if (company == OWNER_DEITY || company == OWNER_TOWN || _game_mode == GM_EDITOR || _generating_world) {
|
||||
avail_roadtypes = ROADTYPES_ROAD;
|
||||
return true; // TODO: should there be a proper check?
|
||||
} else {
|
||||
Company *c = Company::GetIfValid(company);
|
||||
const Company *c = Company::GetIfValid(company);
|
||||
if (c == nullptr) return false;
|
||||
avail_roadtypes = (RoadTypes)c->avail_roadtypes | ROADTYPES_ROAD; // road is available for always for everybody
|
||||
return HasBit(c->avail_roadtypes & ~_roadtypes_hidden_mask, roadtype);
|
||||
}
|
||||
return (rts & ~avail_roadtypes) == 0;
|
||||
}
|
||||
|
||||
static RoadTypes GetMaskForRoadTramType(RoadTramType rtt)
|
||||
{
|
||||
return rtt == RTT_TRAM ? _roadtypes_type : ~_roadtypes_type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Test if any buildable RoadType is available for a company.
|
||||
* @param company the company in question
|
||||
* @return true if company has any RoadTypes available
|
||||
*/
|
||||
bool HasAnyRoadTypesAvail(CompanyID company, RoadTramType rtt)
|
||||
{
|
||||
return (Company::Get(company)->avail_roadtypes & ~_roadtypes_hidden_mask & GetMaskForRoadTramType(rtt)) != ROADTYPES_NONE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate functions for rail building.
|
||||
* @param rt road type to check.
|
||||
* @param roadtype road type to check.
|
||||
* @return true if the current company may build the road.
|
||||
*/
|
||||
bool ValParamRoadType(const RoadType rt)
|
||||
bool ValParamRoadType(RoadType roadtype)
|
||||
{
|
||||
return HasRoadTypesAvail(_current_company, RoadTypeToRoadTypes(rt));
|
||||
return roadtype != INVALID_ROADTYPE && HasRoadTypeAvail(_current_company, roadtype);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the road types that are to be introduced at the given date.
|
||||
* @param rt Roadtype
|
||||
* @param current The currently available roadtypes.
|
||||
* @param date The date for the introduction comparisons.
|
||||
* @return The road types that should be available when date
|
||||
* introduced road types are taken into account as well.
|
||||
*/
|
||||
RoadTypes AddDateIntroducedRoadTypes(RoadTypes current, Date date)
|
||||
{
|
||||
RoadTypes rts = current;
|
||||
|
||||
for (RoadType rt = ROADTYPE_BEGIN; rt != ROADTYPE_END; rt++) {
|
||||
const RoadTypeInfo *rti = GetRoadTypeInfo(rt);
|
||||
/* Unused road type. */
|
||||
if (rti->label == 0) continue;
|
||||
|
||||
/* Not date introduced. */
|
||||
if (!IsInsideMM(rti->introduction_date, 0, MAX_DAY)) continue;
|
||||
|
||||
/* Not yet introduced at this date. */
|
||||
if (rti->introduction_date > date) continue;
|
||||
|
||||
/* Have we introduced all required roadtypes? */
|
||||
RoadTypes required = rti->introduction_required_roadtypes;
|
||||
if ((rts & required) != required) continue;
|
||||
|
||||
rts |= rti->introduces_roadtypes;
|
||||
}
|
||||
|
||||
/* When we added roadtypes we need to run this method again; the added
|
||||
* roadtypes might enable more rail types to become introduced. */
|
||||
return rts == current ? rts : AddDateIntroducedRoadTypes(rts, date);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the road types the given company can build.
|
||||
* @param company the company to get the roadtypes for.
|
||||
* @param company the company to get the road types for.
|
||||
* @param introduces If true, include road types introduced by other road types
|
||||
* @return the road types.
|
||||
*/
|
||||
RoadTypes GetCompanyRoadtypes(CompanyID company)
|
||||
RoadTypes GetCompanyRoadTypes(CompanyID company, bool introduces)
|
||||
{
|
||||
RoadTypes rt = ROADTYPES_NONE;
|
||||
RoadTypes rts = ROADTYPES_NONE;
|
||||
|
||||
Engine *e;
|
||||
const Engine *e;
|
||||
FOR_ALL_ENGINES_OF_TYPE(e, VEH_ROAD) {
|
||||
const EngineInfo *ei = &e->info;
|
||||
|
||||
if (HasBit(ei->climates, _settings_game.game_creation.landscape) &&
|
||||
(HasBit(e->company_avail, company) || _date >= e->intro_date + DAYS_IN_YEAR)) {
|
||||
SetBit(rt, HasBit(ei->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD);
|
||||
const RoadVehicleInfo *rvi = &e->u.road;
|
||||
assert(rvi->roadtype < ROADTYPE_END);
|
||||
if (introduces) {
|
||||
rts |= GetRoadTypeInfo(rvi->roadtype)->introduces_roadtypes;
|
||||
} else {
|
||||
SetBit(rts, rvi->roadtype);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return rt;
|
||||
if (introduces) return AddDateIntroducedRoadTypes(rts, _date);
|
||||
return rts;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get list of road types, regardless of company availability.
|
||||
* @param introduces If true, include road types introduced by other road types
|
||||
* @return the road types.
|
||||
*/
|
||||
RoadTypes GetRoadTypes(bool introduces)
|
||||
{
|
||||
RoadTypes rts = ROADTYPES_NONE;
|
||||
|
||||
const Engine *e;
|
||||
FOR_ALL_ENGINES_OF_TYPE(e, VEH_ROAD) {
|
||||
const EngineInfo *ei = &e->info;
|
||||
if (!HasBit(ei->climates, _settings_game.game_creation.landscape)) continue;
|
||||
|
||||
const RoadVehicleInfo *rvi = &e->u.road;
|
||||
assert(rvi->roadtype < ROADTYPE_END);
|
||||
if (introduces) {
|
||||
rts |= GetRoadTypeInfo(rvi->roadtype)->introduces_roadtypes;
|
||||
} else {
|
||||
SetBit(rts, rvi->roadtype);
|
||||
}
|
||||
}
|
||||
|
||||
if (introduces) return AddDateIntroducedRoadTypes(rts, MAX_DAY);
|
||||
return rts;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the road type for a given label.
|
||||
* @param label the roadtype label.
|
||||
* @param allow_alternate_labels Search in the alternate label lists as well.
|
||||
* @return the roadtype.
|
||||
*/
|
||||
RoadType GetRoadTypeByLabel(RoadTypeLabel label, bool allow_alternate_labels)
|
||||
{
|
||||
/* Loop through each road type until the label is found */
|
||||
for (RoadType r = ROADTYPE_BEGIN; r != ROADTYPE_END; r++) {
|
||||
const RoadTypeInfo *rti = GetRoadTypeInfo(r);
|
||||
if (rti->label == label) return r;
|
||||
}
|
||||
|
||||
if (allow_alternate_labels) {
|
||||
/* Test if any road type defines the label as an alternate. */
|
||||
for (RoadType r = ROADTYPE_BEGIN; r != ROADTYPE_END; r++) {
|
||||
const RoadTypeInfo *rti = GetRoadTypeInfo(r);
|
||||
if (std::find(rti->alternate_labels.begin(), rti->alternate_labels.end(), label) != rti->alternate_labels.end()) return r;
|
||||
}
|
||||
}
|
||||
|
||||
/* No matching label was found, so it is invalid */
|
||||
return INVALID_ROADTYPE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the available RoadSubTypes for the provided RoadType
|
||||
* If the given company is valid then will be returned a list of the available sub types at the current date, while passing
|
||||
* a deity company will make all the sub types available
|
||||
* @param rt the RoadType to filter
|
||||
* @param c the company ID to check the roadtype against
|
||||
* @param any_date whether to return only currently introduced roadtypes or also future ones
|
||||
* @returns the existing RoadSubTypes
|
||||
*/
|
||||
RoadTypes ExistingRoadTypes(CompanyID c)
|
||||
{
|
||||
/* Check only players which can actually own vehicles, editor and gamescripts are considered deities */
|
||||
if (c < OWNER_END) {
|
||||
const Company *company = Company::GetIfValid(c);
|
||||
if (company != nullptr) return company->avail_roadtypes;
|
||||
}
|
||||
|
||||
RoadTypes known_roadtypes = ROADTYPES_NONE;
|
||||
|
||||
/* Find used roadtypes */
|
||||
Engine *e;
|
||||
FOR_ALL_ENGINES_OF_TYPE(e, VEH_ROAD) {
|
||||
/* Check if the roadtype can be used in the current climate */
|
||||
if (!HasBit(e->info.climates, _settings_game.game_creation.landscape)) continue;
|
||||
|
||||
/* Check whether available for all potential companies */
|
||||
if (e->company_avail != (CompanyMask)-1) continue;
|
||||
|
||||
known_roadtypes |= GetRoadTypeInfo(e->u.road.roadtype)->introduces_roadtypes;
|
||||
}
|
||||
|
||||
/* Get the date introduced roadtypes as well. */
|
||||
known_roadtypes = AddDateIntroducedRoadTypes(known_roadtypes, MAX_DAY);
|
||||
|
||||
return known_roadtypes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether we can build infrastructure for the given RoadType. This to disable building stations etc. when
|
||||
* you are not allowed/able to have the RoadType yet.
|
||||
* @param roadtype the roadtype to check this for
|
||||
* @param company the company id to check this for
|
||||
* @param any_date to check only existing vehicles or if it is possible to build them in the future
|
||||
* @return true if there is any reason why you may build the infrastructure for the given roadtype
|
||||
*/
|
||||
bool CanBuildRoadTypeInfrastructure(RoadType roadtype, CompanyID company)
|
||||
{
|
||||
if (_game_mode != GM_EDITOR && !Company::IsValidID(company)) return false;
|
||||
if (!_settings_client.gui.disable_unsuitable_building) return true;
|
||||
if (!HasAnyRoadTypesAvail(company, GetRoadTramType(roadtype))) return false;
|
||||
|
||||
RoadTypes roadtypes = ExistingRoadTypes(company);
|
||||
|
||||
/* Check if the filtered roadtypes does have the roadtype we are checking for
|
||||
* and if we can build new ones */
|
||||
if (_settings_game.vehicle.max_roadveh > 0 && HasBit(roadtypes, roadtype)) {
|
||||
/* Can we actually build the vehicle type? */
|
||||
const Engine *e;
|
||||
FOR_ALL_ENGINES_OF_TYPE(e, VEH_ROAD) {
|
||||
if (!HasBit(e->company_avail, company)) continue;
|
||||
if (HasPowerOnRoad(e->u.road.roadtype, roadtype) || HasPowerOnRoad(roadtype, e->u.road.roadtype)) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/* We should be able to build infrastructure when we have the actual vehicle type */
|
||||
const Vehicle *v;
|
||||
FOR_ALL_VEHICLES(v) {
|
||||
if (v->type == VEH_ROAD && (company == OWNER_DEITY || v->owner == company) &&
|
||||
HasBit(roadtypes, RoadVehicle::From(v)->roadtype) && HasPowerOnRoad(RoadVehicle::From(v)->roadtype, roadtype)) return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
316
src/road.h
Normal file
316
src/road.h
Normal file
@@ -0,0 +1,316 @@
|
||||
/* $Id$ */
|
||||
|
||||
/*
|
||||
* This file is part of OpenTTD.
|
||||
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
|
||||
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/** @file road.h Road specific functions. */
|
||||
|
||||
#ifndef ROAD_H
|
||||
#define ROAD_H
|
||||
|
||||
#include "road_type.h"
|
||||
#include "gfx_type.h"
|
||||
#include "core/bitmath_func.hpp"
|
||||
#include "strings_type.h"
|
||||
#include "date_type.h"
|
||||
#include "core/enum_type.hpp"
|
||||
#include "newgrf.h"
|
||||
#include "economy_func.h"
|
||||
|
||||
#include <vector>
|
||||
|
||||
enum RoadTramType : bool {
|
||||
RTT_ROAD,
|
||||
RTT_TRAM,
|
||||
};
|
||||
|
||||
enum RoadTramTypes : uint8 {
|
||||
RTTB_ROAD = 1 << RTT_ROAD,
|
||||
RTTB_TRAM = 1 << RTT_TRAM,
|
||||
};
|
||||
DECLARE_ENUM_AS_BIT_SET(RoadTramTypes)
|
||||
|
||||
#define FOR_ALL_ROADTRAMTYPES(x) for (RoadTramType x : { RTT_ROAD, RTT_TRAM })
|
||||
|
||||
/** Roadtype flags. Starts with RO instead of R because R is used for rails */
|
||||
enum RoadTypeFlags {
|
||||
ROTF_CATENARY = 0, ///< Bit number for adding catenary
|
||||
ROTF_NO_LEVEL_CROSSING, ///< Bit number for disabling level crossing
|
||||
ROTF_NO_HOUSES, ///< Bit number for setting this roadtype as not house friendly
|
||||
ROTF_HIDDEN, ///< Bit number for hidden from construction.
|
||||
ROTF_TOWN_BUILD, ///< Bit number for allowing towns to build this roadtype.
|
||||
|
||||
ROTFB_NONE = 0, ///< All flags cleared.
|
||||
ROTFB_CATENARY = 1 << ROTF_CATENARY, ///< Value for drawing a catenary.
|
||||
ROTFB_NO_LEVEL_CROSSING = 1 << ROTF_NO_LEVEL_CROSSING, ///< Value for disabling a level crossing.
|
||||
ROTFB_NO_HOUSES = 1 << ROTF_NO_HOUSES, ///< Value for for setting this roadtype as not house friendly.
|
||||
ROTFB_HIDDEN = 1 << ROTF_HIDDEN, ///< Value for hidden from construction.
|
||||
ROTFB_TOWN_BUILD = 1 << ROTF_TOWN_BUILD, ///< Value for allowing towns to build this roadtype.
|
||||
};
|
||||
DECLARE_ENUM_AS_BIT_SET(RoadTypeFlags)
|
||||
|
||||
struct SpriteGroup;
|
||||
|
||||
/** Sprite groups for a roadtype. */
|
||||
enum RoadTypeSpriteGroup {
|
||||
ROTSG_CURSORS, ///< Optional: Cursor and toolbar icon images
|
||||
ROTSG_OVERLAY, ///< Optional: Images for overlaying track
|
||||
ROTSG_GROUND, ///< Required: Main group of ground images
|
||||
ROTSG_reserved1, ///< Placeholder, if we need specific tunnel sprites.
|
||||
ROTSG_CATENARY_FRONT, ///< Optional: Catenary front
|
||||
ROTSG_CATENARY_BACK, ///< Optional: Catenary back
|
||||
ROTSG_BRIDGE, ///< Required: Bridge surface images
|
||||
ROTSG_reserved2, ///< Placeholder, if we need specific level crossing sprites.
|
||||
ROTSG_DEPOT, ///< Optional: Depot images
|
||||
ROTSG_reserved3, ///< Placeholder, if we add road fences (for highways).
|
||||
ROTSG_ROADSTOP, ///< Required: Drive-in stop surface
|
||||
ROTSG_END,
|
||||
};
|
||||
|
||||
/** List of road type labels. */
|
||||
typedef std::vector<RoadTypeLabel> RoadTypeLabelList;
|
||||
|
||||
class RoadTypeInfo {
|
||||
public:
|
||||
/**
|
||||
* struct containing the sprites for the road GUI. @note only sprites referred to
|
||||
* directly in the code are listed
|
||||
*/
|
||||
struct {
|
||||
SpriteID build_x_road; ///< button for building single rail in X direction
|
||||
SpriteID build_y_road; ///< button for building single rail in Y direction
|
||||
SpriteID auto_road; ///< button for the autoroad construction
|
||||
SpriteID build_depot; ///< button for building depots
|
||||
SpriteID build_tunnel; ///< button for building a tunnel
|
||||
SpriteID convert_road; ///< button for converting road types
|
||||
} gui_sprites;
|
||||
|
||||
struct {
|
||||
CursorID road_swne; ///< Cursor for building rail in X direction
|
||||
CursorID road_nwse; ///< Cursor for building rail in Y direction
|
||||
CursorID autoroad; ///< Cursor for autorail tool
|
||||
CursorID depot; ///< Cursor for building a depot
|
||||
CursorID tunnel; ///< Cursor for building a tunnel
|
||||
SpriteID convert_road; ///< Cursor for converting road types
|
||||
} cursor; ///< Cursors associated with the road type.
|
||||
|
||||
struct {
|
||||
StringID name; ///< Name of this rail type.
|
||||
StringID toolbar_caption; ///< Caption in the construction toolbar GUI for this rail type.
|
||||
StringID menu_text; ///< Name of this rail type in the main toolbar dropdown.
|
||||
StringID build_caption; ///< Caption of the build vehicle GUI for this rail type.
|
||||
StringID replace_text; ///< Text used in the autoreplace GUI.
|
||||
StringID new_engine; ///< Name of an engine for this type of road in the engine preview GUI.
|
||||
|
||||
StringID err_build_road; ///< Building a normal piece of road
|
||||
StringID err_remove_road; ///< Removing a normal piece of road
|
||||
StringID err_depot; ///< Building a depot
|
||||
StringID err_build_station[2]; ///< Building a bus or truck station
|
||||
StringID err_remove_station[2]; ///< Removing of a bus or truck station
|
||||
StringID err_convert_road; ///< Converting a road type
|
||||
|
||||
StringID picker_title[2]; ///< Title for the station picker for bus or truck stations
|
||||
StringID picker_tooltip[2]; ///< Tooltip for the station picker for bus or truck stations
|
||||
} strings; ///< Strings associated with the rail type.
|
||||
|
||||
/** bitmask to the OTHER roadtypes on which a vehicle of THIS roadtype generates power */
|
||||
RoadTypes powered_roadtypes;
|
||||
|
||||
/**
|
||||
* Bit mask of road type flags
|
||||
*/
|
||||
RoadTypeFlags flags;
|
||||
|
||||
/**
|
||||
* Cost multiplier for building this road type
|
||||
*/
|
||||
uint16 cost_multiplier;
|
||||
|
||||
/**
|
||||
* Cost multiplier for maintenance of this road type
|
||||
*/
|
||||
uint16 maintenance_multiplier;
|
||||
|
||||
/**
|
||||
* Maximum speed for vehicles travelling on this road type
|
||||
*/
|
||||
uint16 max_speed;
|
||||
|
||||
/**
|
||||
* Unique 32 bit road type identifier
|
||||
*/
|
||||
RoadTypeLabel label;
|
||||
|
||||
/**
|
||||
* Road type labels this type provides in addition to the main label.
|
||||
*/
|
||||
RoadTypeLabelList alternate_labels;
|
||||
|
||||
/**
|
||||
* Colour on mini-map
|
||||
*/
|
||||
byte map_colour;
|
||||
|
||||
/**
|
||||
* Introduction date.
|
||||
* When #INVALID_DATE or a vehicle using this roadtype gets introduced earlier,
|
||||
* the vehicle's introduction date will be used instead for this roadtype.
|
||||
* The introduction at this date is furthermore limited by the
|
||||
* #introduction_required_types.
|
||||
*/
|
||||
Date introduction_date;
|
||||
|
||||
/**
|
||||
* Bitmask of roadtypes that are required for this roadtype to be introduced
|
||||
* at a given #introduction_date.
|
||||
*/
|
||||
RoadTypes introduction_required_roadtypes;
|
||||
|
||||
/**
|
||||
* Bitmask of which other roadtypes are introduced when this roadtype is introduced.
|
||||
*/
|
||||
RoadTypes introduces_roadtypes;
|
||||
|
||||
/**
|
||||
* The sorting order of this roadtype for the toolbar dropdown.
|
||||
*/
|
||||
byte sorting_order;
|
||||
|
||||
/**
|
||||
* NewGRF providing the Action3 for the roadtype. nullptr if not available.
|
||||
*/
|
||||
const GRFFile *grffile[ROTSG_END];
|
||||
|
||||
/**
|
||||
* Sprite groups for resolving sprites
|
||||
*/
|
||||
const SpriteGroup *group[ROTSG_END];
|
||||
|
||||
inline bool UsesOverlay() const
|
||||
{
|
||||
return this->group[ROTSG_GROUND] != nullptr;
|
||||
}
|
||||
};
|
||||
|
||||
extern RoadTypes _roadtypes_type;
|
||||
|
||||
static inline bool RoadTypeIsRoad(RoadType roadtype)
|
||||
{
|
||||
return !HasBit(_roadtypes_type, roadtype);
|
||||
}
|
||||
|
||||
static inline bool RoadTypeIsTram(RoadType roadtype)
|
||||
{
|
||||
return HasBit(_roadtypes_type, roadtype);
|
||||
}
|
||||
|
||||
static inline RoadTramType GetRoadTramType(RoadType roadtype)
|
||||
{
|
||||
return RoadTypeIsTram(roadtype) ? RTT_TRAM : RTT_ROAD;
|
||||
}
|
||||
|
||||
static inline RoadTramType OtherRoadTramType(RoadTramType rtt)
|
||||
{
|
||||
return rtt == RTT_ROAD ? RTT_TRAM : RTT_ROAD;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a pointer to the Roadtype information for a given roadtype
|
||||
* @param roadtype the road type which the information is requested for
|
||||
* @return The pointer to the RoadTypeInfo
|
||||
*/
|
||||
static inline const RoadTypeInfo *GetRoadTypeInfo(RoadType roadtype)
|
||||
{
|
||||
extern RoadTypeInfo _roadtypes[ROADTYPE_END];
|
||||
assert(roadtype < ROADTYPE_END);
|
||||
return &_roadtypes[roadtype];
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if an engine of the given RoadType got power on a tile with a given
|
||||
* RoadType. This would normally just be an equality check, but for electrified
|
||||
* roads (which also support non-electric vehicles).
|
||||
* @return Whether the engine got power on this tile.
|
||||
* @param enginetype The RoadType of the engine we are considering.
|
||||
* @param tiletype The RoadType of the tile we are considering.
|
||||
*/
|
||||
static inline bool HasPowerOnRoad(RoadType enginetype, RoadType tiletype)
|
||||
{
|
||||
return HasBit(GetRoadTypeInfo(enginetype)->powered_roadtypes, tiletype);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the cost of building the specified roadtype.
|
||||
* @param roadtype The roadtype being built.
|
||||
* @return The cost multiplier.
|
||||
*/
|
||||
static inline Money RoadBuildCost(RoadType roadtype)
|
||||
{
|
||||
assert(roadtype < ROADTYPE_END);
|
||||
return (_price[PR_BUILD_ROAD] * GetRoadTypeInfo(roadtype)->cost_multiplier) >> 3;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the cost of clearing the specified roadtype.
|
||||
* @param roadtype The roadtype being removed.
|
||||
* @return The cost.
|
||||
*/
|
||||
static inline Money RoadClearCost(RoadType roadtype)
|
||||
{
|
||||
assert(roadtype < ROADTYPE_END);
|
||||
|
||||
/* Flat fee for removing road. */
|
||||
if (RoadTypeIsRoad(roadtype)) return _price[PR_CLEAR_ROAD];
|
||||
|
||||
/* Clearing tram earns a little money, but also incurs the standard clear road cost,
|
||||
* so no profit can be made. */
|
||||
return _price[PR_CLEAR_ROAD] - RoadBuildCost(roadtype) * 3 / 4;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the cost of road conversion
|
||||
* @param from The roadtype we are converting from
|
||||
* @param to The roadtype we are converting to
|
||||
* @return Cost per RoadBit
|
||||
*/
|
||||
static inline Money RoadConvertCost(RoadType from, RoadType to)
|
||||
{
|
||||
/* Don't apply convert costs when converting to the same roadtype (ex. building a roadstop over existing road) */
|
||||
if (from == to) return (Money)0;
|
||||
|
||||
/* Same cost as removing and then building. */
|
||||
return RoadBuildCost(to) + RoadClearCost(from);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test if road disallows level crossings
|
||||
* @param roadtype The roadtype we are testing
|
||||
* @return True iff the roadtype disallows level crossings
|
||||
*/
|
||||
static inline bool RoadNoLevelCrossing(RoadType roadtype)
|
||||
{
|
||||
assert(roadtype < ROADTYPE_END);
|
||||
return HasBit(GetRoadTypeInfo(roadtype)->flags, ROTF_NO_LEVEL_CROSSING);
|
||||
}
|
||||
|
||||
RoadType GetRoadTypeByLabel(RoadTypeLabel label, bool allow_alternate_labels = true);
|
||||
|
||||
void ResetRoadTypes();
|
||||
void InitRoadTypes();
|
||||
RoadType AllocateRoadType(RoadTypeLabel label, RoadTramType rtt);
|
||||
bool HasAnyRoadTypesAvail(CompanyID company, RoadTramType rtt);
|
||||
|
||||
extern std::vector<RoadType> _sorted_roadtypes;
|
||||
extern RoadTypes _roadtypes_hidden_mask;
|
||||
|
||||
/**
|
||||
* Loop header for iterating over roadtypes, sorted by sortorder.
|
||||
* @param var Roadtype.
|
||||
*/
|
||||
#define FOR_ALL_SORTED_ROADTYPES(var) for (uint8 index = 0; index < _sorted_roadtypes.size() && (var = _sorted_roadtypes[index], true) ; index++)
|
||||
|
||||
#endif /* ROAD_H */
|
1231
src/road_cmd.cpp
1231
src/road_cmd.cpp
File diff suppressed because it is too large
Load Diff
@@ -13,29 +13,9 @@
|
||||
#define ROAD_FUNC_H
|
||||
|
||||
#include "core/bitmath_func.hpp"
|
||||
#include "road_type.h"
|
||||
#include "road.h"
|
||||
#include "economy_func.h"
|
||||
|
||||
/**
|
||||
* Iterate through each set RoadType in a RoadTypes value.
|
||||
* For more informations see FOR_EACH_SET_BIT_EX.
|
||||
*
|
||||
* @param var Loop index variable that stores fallowing set road type. Must be of type RoadType.
|
||||
* @param road_types The value to iterate through (any expression).
|
||||
*
|
||||
* @see FOR_EACH_SET_BIT_EX
|
||||
*/
|
||||
#define FOR_EACH_SET_ROADTYPE(var, road_types) FOR_EACH_SET_BIT_EX(RoadType, var, RoadTypes, road_types)
|
||||
|
||||
/**
|
||||
* Whether the given roadtype is valid.
|
||||
* @param rt the roadtype to check for validness
|
||||
* @return true if and only if valid
|
||||
*/
|
||||
static inline bool IsValidRoadType(RoadType rt)
|
||||
{
|
||||
return rt == ROADTYPE_ROAD || rt == ROADTYPE_TRAM;
|
||||
}
|
||||
#include "transparency.h"
|
||||
|
||||
/**
|
||||
* Whether the given roadtype is valid.
|
||||
@@ -47,32 +27,6 @@ static inline bool IsValidRoadBits(RoadBits r)
|
||||
return r < ROAD_END;
|
||||
}
|
||||
|
||||
/**
|
||||
* Maps a RoadType to the corresponding RoadTypes value
|
||||
*
|
||||
* @param rt the roadtype to get the roadtypes from
|
||||
* @return the roadtypes with the given roadtype
|
||||
*/
|
||||
static inline RoadTypes RoadTypeToRoadTypes(RoadType rt)
|
||||
{
|
||||
assert(IsValidRoadType(rt));
|
||||
return (RoadTypes)(1 << rt);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the RoadTypes which are not present in the given RoadTypes
|
||||
*
|
||||
* This function returns the complement of a given RoadTypes.
|
||||
*
|
||||
* @param r The given RoadTypes
|
||||
* @return The complement of the given RoadTypes
|
||||
*/
|
||||
static inline RoadTypes ComplementRoadTypes(RoadTypes r)
|
||||
{
|
||||
return (RoadTypes)(ROADTYPES_ALL ^ r);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Calculate the complement of a RoadBits value
|
||||
*
|
||||
@@ -167,27 +121,53 @@ static inline RoadBits AxisToRoadBits(Axis a)
|
||||
* Calculates the maintenance cost of a number of road bits.
|
||||
* @param roadtype Road type to get the cost for.
|
||||
* @param num Number of road bits.
|
||||
* @param total_num Total number of road bits of all road/tram-types.
|
||||
* @return Total cost.
|
||||
*/
|
||||
static inline Money RoadMaintenanceCost(RoadType roadtype, uint32 num)
|
||||
static inline Money RoadMaintenanceCost(RoadType roadtype, uint32 num, uint32 total_num)
|
||||
{
|
||||
assert(IsValidRoadType(roadtype));
|
||||
return (_price[PR_INFRASTRUCTURE_ROAD] * (roadtype == ROADTYPE_TRAM ? 3 : 2) * num * (1 + IntSqrt(num))) >> 9; // 2 bits fraction for the multiplier and 7 bits scaling.
|
||||
assert(roadtype < ROADTYPE_END);
|
||||
return (_price[PR_INFRASTRUCTURE_ROAD] * GetRoadTypeInfo(roadtype)->maintenance_multiplier * num * (1 + IntSqrt(total_num))) >> 12;
|
||||
}
|
||||
|
||||
bool HasRoadTypesAvail(const CompanyID company, const RoadTypes rts);
|
||||
bool ValParamRoadType(const RoadType rt);
|
||||
RoadTypes GetCompanyRoadtypes(const CompanyID company);
|
||||
/**
|
||||
* Test if a road type has catenary
|
||||
* @param roadtype Road type to test
|
||||
*/
|
||||
static inline bool HasRoadCatenary(RoadType roadtype)
|
||||
{
|
||||
assert(roadtype < ROADTYPE_END);
|
||||
return HasBit(GetRoadTypeInfo(roadtype)->flags, ROTF_CATENARY);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test if we should draw road catenary
|
||||
* @param roadtype Road type to test
|
||||
*/
|
||||
static inline bool HasRoadCatenaryDrawn(RoadType roadtype)
|
||||
{
|
||||
return HasRoadCatenary(roadtype) && !IsInvisibilitySet(TO_CATENARY);
|
||||
}
|
||||
|
||||
bool HasRoadTypeAvail(CompanyID company, RoadType roadtype);
|
||||
bool ValParamRoadType(RoadType roadtype);
|
||||
RoadTypes GetCompanyRoadTypes(CompanyID company, bool introduces = true);
|
||||
RoadTypes GetRoadTypes(bool introduces);
|
||||
RoadTypes AddDateIntroducedRoadTypes(RoadTypes current, Date date);
|
||||
|
||||
void UpdateLevelCrossing(TileIndex tile, bool sound = true, bool force_close = false);
|
||||
bool IsCrossingOccupiedByRoadVehicle(TileIndex t);
|
||||
void UpdateCompanyRoadInfrastructure(RoadType rt, Owner o, int count);
|
||||
|
||||
struct TileInfo;
|
||||
void DrawRoadOverlays(const TileInfo *ti, PaletteID pal, const RoadTypeInfo *road_rti, const RoadTypeInfo *tram_rit, uint road_offset, uint tram_offset);
|
||||
|
||||
inline void NotifyRoadLayoutChanged()
|
||||
{
|
||||
_road_layout_change_counter++;
|
||||
}
|
||||
|
||||
void NotifyRoadLayoutChangedIfTileNonLeaf(TileIndex tile, RoadType rt, RoadBits present_bits);
|
||||
void NotifyRoadLayoutChangedIfSimpleTunnelBridgeNonLeaf(TileIndex start, TileIndex end, DiagDirection start_dir, RoadType rt);
|
||||
void NotifyRoadLayoutChangedIfTileNonLeaf(TileIndex tile, RoadTramType rtt, RoadBits present_bits);
|
||||
void NotifyRoadLayoutChangedIfSimpleTunnelBridgeNonLeaf(TileIndex start, TileIndex end, DiagDirection start_dir, RoadTramType rtt);
|
||||
|
||||
#endif /* ROAD_FUNC_H */
|
||||
|
488
src/road_gui.cpp
488
src/road_gui.cpp
@@ -29,6 +29,10 @@
|
||||
#include "hotkeys.h"
|
||||
#include "road_gui.h"
|
||||
#include "zoom_func.h"
|
||||
#include "engine_base.h"
|
||||
#include "strings_func.h"
|
||||
#include "core/geometry_func.hpp"
|
||||
#include "date_func.h"
|
||||
|
||||
#include "widgets/road_widget.h"
|
||||
|
||||
@@ -110,52 +114,6 @@ void CcBuildRoadTunnel(const CommandCost &result, TileIndex start_tile, uint32 p
|
||||
}
|
||||
}
|
||||
|
||||
/** Structure holding information per roadtype for several functions */
|
||||
struct RoadTypeInfo {
|
||||
StringID err_build_road; ///< Building a normal piece of road
|
||||
StringID err_remove_road; ///< Removing a normal piece of road
|
||||
StringID err_depot; ///< Building a depot
|
||||
StringID err_build_station[2]; ///< Building a bus or truck station
|
||||
StringID err_remove_station[2]; ///< Removing of a bus or truck station
|
||||
|
||||
StringID picker_title[2]; ///< Title for the station picker for bus or truck stations
|
||||
StringID picker_tooltip[2]; ///< Tooltip for the station picker for bus or truck stations
|
||||
|
||||
SpriteID cursor_nesw; ///< Cursor for building NE and SW bits
|
||||
SpriteID cursor_nwse; ///< Cursor for building NW and SE bits
|
||||
SpriteID cursor_autoroad; ///< Cursor for building autoroad
|
||||
};
|
||||
|
||||
/** What errors/cursors must be shown for several types of roads */
|
||||
static const RoadTypeInfo _road_type_infos[] = {
|
||||
{
|
||||
STR_ERROR_CAN_T_BUILD_ROAD_HERE,
|
||||
STR_ERROR_CAN_T_REMOVE_ROAD_FROM,
|
||||
STR_ERROR_CAN_T_BUILD_ROAD_DEPOT,
|
||||
{ STR_ERROR_CAN_T_BUILD_BUS_STATION, STR_ERROR_CAN_T_BUILD_TRUCK_STATION },
|
||||
{ STR_ERROR_CAN_T_REMOVE_BUS_STATION, STR_ERROR_CAN_T_REMOVE_TRUCK_STATION },
|
||||
{ STR_STATION_BUILD_BUS_ORIENTATION, STR_STATION_BUILD_TRUCK_ORIENTATION },
|
||||
{ STR_STATION_BUILD_BUS_ORIENTATION_TOOLTIP, STR_STATION_BUILD_TRUCK_ORIENTATION_TOOLTIP },
|
||||
|
||||
SPR_CURSOR_ROAD_NESW,
|
||||
SPR_CURSOR_ROAD_NWSE,
|
||||
SPR_CURSOR_AUTOROAD,
|
||||
},
|
||||
{
|
||||
STR_ERROR_CAN_T_BUILD_TRAMWAY_HERE,
|
||||
STR_ERROR_CAN_T_REMOVE_TRAMWAY_FROM,
|
||||
STR_ERROR_CAN_T_BUILD_TRAM_DEPOT,
|
||||
{ STR_ERROR_CAN_T_BUILD_PASSENGER_TRAM_STATION, STR_ERROR_CAN_T_BUILD_CARGO_TRAM_STATION },
|
||||
{ STR_ERROR_CAN_T_REMOVE_PASSENGER_TRAM_STATION, STR_ERROR_CAN_T_REMOVE_CARGO_TRAM_STATION },
|
||||
{ STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION, STR_STATION_BUILD_CARGO_TRAM_ORIENTATION },
|
||||
{ STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION_TOOLTIP, STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP },
|
||||
|
||||
SPR_CURSOR_TRAMWAY_NESW,
|
||||
SPR_CURSOR_TRAMWAY_NWSE,
|
||||
SPR_CURSOR_AUTOTRAM,
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* If required, connects a new structure to an existing road or tram by building the missing roadbit.
|
||||
* @param tile Tile containing the structure to connect.
|
||||
@@ -166,7 +124,7 @@ void ConnectRoadToStructure(TileIndex tile, DiagDirection direction)
|
||||
tile += TileOffsByDiagDir(direction);
|
||||
/* if there is a roadpiece just outside of the station entrance, build a connecting route */
|
||||
if (IsNormalRoadTile(tile)) {
|
||||
if (GetRoadBits(tile, _cur_roadtype) != ROAD_NONE) {
|
||||
if (GetRoadBits(tile, GetRoadTramType(_cur_roadtype)) != ROAD_NONE) {
|
||||
DoCommandP(tile, _cur_roadtype << 4 | DiagDirToRoadBits(ReverseDiagDir(direction)), 0, CMD_BUILD_ROAD);
|
||||
}
|
||||
}
|
||||
@@ -190,9 +148,10 @@ void CcRoadDepot(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2
|
||||
* bit 8..15: Length of the road stop.
|
||||
* @param p2 bit 0: 0 For bus stops, 1 for truck stops.
|
||||
* bit 1: 0 For normal stops, 1 for drive-through.
|
||||
* bit 2..3: The roadtypes.
|
||||
* bit 5: Allow stations directly adjacent to other stations.
|
||||
* bit 6..7: Entrance direction (#DiagDirection).
|
||||
* bit 2: Allow stations directly adjacent to other stations.
|
||||
* bit 3..4: Entrance direction (#DiagDirection) for normal stops.
|
||||
* bit 3: #Axis of the road for drive-through stops.
|
||||
* bit 5..9: The roadtype.
|
||||
* bit 16..31: Station ID to join (NEW_STATION if build new one).
|
||||
* @see CmdBuildRoadStop
|
||||
*/
|
||||
@@ -200,7 +159,7 @@ void CcRoadStop(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2)
|
||||
{
|
||||
if (result.Failed()) return;
|
||||
|
||||
DiagDirection dir = (DiagDirection)GB(p2, 6, 2);
|
||||
DiagDirection dir = (DiagDirection)GB(p2, 3, 2);
|
||||
if (_settings_client.sound.confirm) SndPlayTileFx(SND_1F_SPLAT_OTHER, tile);
|
||||
if (!_settings_client.gui.persistent_buildingtools) ResetObjectToPlace();
|
||||
TileArea roadstop_area(tile, GB(p1, 0, 8), GB(p1, 8, 8));
|
||||
@@ -216,8 +175,8 @@ void CcRoadStop(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2)
|
||||
* @param start_tile First tile of the area.
|
||||
* @param end_tile Last tile of the area.
|
||||
* @param p2 bit 0: 0 For bus stops, 1 for truck stops.
|
||||
* bit 2..3: The roadtypes.
|
||||
* bit 5: Allow stations directly adjacent to other stations.
|
||||
* bit 2: Allow stations directly adjacent to other stations.
|
||||
* bit 5..10: The roadtypes.
|
||||
* @param cmd Command to use.
|
||||
* @see CcRoadStop()
|
||||
*/
|
||||
@@ -230,7 +189,7 @@ static void PlaceRoadStop(TileIndex start_tile, TileIndex end_tile, uint32 p2, u
|
||||
SetBit(p2, 1); // It's a drive-through stop.
|
||||
ddir -= DIAGDIR_END; // Adjust picker result to actual direction.
|
||||
}
|
||||
p2 |= ddir << 6; // Set the DiagDirecion into p2 bits 6 and 7.
|
||||
p2 |= ddir << 3; // Set the DiagDirecion into p2 bits 3 and 4.
|
||||
|
||||
TileArea ta(start_tile, end_tile);
|
||||
CommandContainer cmdcont = { ta.tile, (uint32)(ta.w | ta.h << 8), p2, cmd, CcRoadStop, 0, "" };
|
||||
@@ -309,15 +268,20 @@ static bool RoadToolbar_CtrlChanged(Window *w)
|
||||
|
||||
/** Road toolbar window handler. */
|
||||
struct BuildRoadToolbarWindow : Window {
|
||||
int last_started_action; ///< Last started user action.
|
||||
RoadType roadtype; ///< Road type to build.
|
||||
const RoadTypeInfo *rti; ///< Informations about current road type
|
||||
int last_started_action; ///< Last started user action.
|
||||
|
||||
BuildRoadToolbarWindow(WindowDesc *desc, WindowNumber window_number) : Window(desc)
|
||||
{
|
||||
this->Initialize(_cur_roadtype);
|
||||
this->InitNested(window_number);
|
||||
this->SetWidgetsDisabledState(true,
|
||||
WID_ROT_REMOVE,
|
||||
WID_ROT_ONE_WAY,
|
||||
WIDGET_LIST_END);
|
||||
this->SetupRoadToolbar();
|
||||
this->SetWidgetDisabledState(WID_ROT_REMOVE, true);
|
||||
|
||||
if (RoadTypeIsRoad(this->roadtype)) {
|
||||
this->SetWidgetDisabledState(WID_ROT_ONE_WAY, true);
|
||||
}
|
||||
|
||||
this->OnInvalidateData();
|
||||
this->last_started_action = WIDGET_LIST_END;
|
||||
@@ -340,7 +304,8 @@ struct BuildRoadToolbarWindow : Window {
|
||||
{
|
||||
if (!gui_scope) return;
|
||||
|
||||
bool can_build = CanBuildVehicleInfrastructure(VEH_ROAD);
|
||||
if (_game_mode != GM_EDITOR && !CanBuildVehicleInfrastructure(VEH_ROAD, GetRoadTramType(this->roadtype))) delete this;
|
||||
bool can_build = _game_mode != GM_EDITOR;
|
||||
this->SetWidgetsDisabledState(!can_build,
|
||||
WID_ROT_DEPOT,
|
||||
WID_ROT_BUS_STATION,
|
||||
@@ -353,6 +318,53 @@ struct BuildRoadToolbarWindow : Window {
|
||||
}
|
||||
}
|
||||
|
||||
void Initialize(RoadType roadtype)
|
||||
{
|
||||
assert(roadtype < ROADTYPE_END);
|
||||
this->roadtype = roadtype;
|
||||
this->rti = GetRoadTypeInfo(this->roadtype);
|
||||
}
|
||||
|
||||
/**
|
||||
* Configures the road toolbar for roadtype given
|
||||
* @param roadtype the roadtype to display
|
||||
*/
|
||||
void SetupRoadToolbar()
|
||||
{
|
||||
this->GetWidget<NWidgetCore>(WID_ROT_ROAD_X)->widget_data = rti->gui_sprites.build_x_road;
|
||||
this->GetWidget<NWidgetCore>(WID_ROT_ROAD_Y)->widget_data = rti->gui_sprites.build_y_road;
|
||||
this->GetWidget<NWidgetCore>(WID_ROT_AUTOROAD)->widget_data = rti->gui_sprites.auto_road;
|
||||
if (_game_mode != GM_EDITOR) {
|
||||
this->GetWidget<NWidgetCore>(WID_ROT_DEPOT)->widget_data = rti->gui_sprites.build_depot;
|
||||
}
|
||||
this->GetWidget<NWidgetCore>(WID_ROT_CONVERT_ROAD)->widget_data = rti->gui_sprites.convert_road;
|
||||
this->GetWidget<NWidgetCore>(WID_ROT_BUILD_TUNNEL)->widget_data = rti->gui_sprites.build_tunnel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Switch to another road type.
|
||||
* @param roadtype New road type.
|
||||
*/
|
||||
void ModifyRoadType(RoadType roadtype)
|
||||
{
|
||||
this->Initialize(roadtype);
|
||||
this->SetupRoadToolbar();
|
||||
this->ReInit();
|
||||
}
|
||||
|
||||
void SetStringParameters(int widget) const override
|
||||
{
|
||||
if (widget == WID_ROT_CAPTION) {
|
||||
if (this->rti->max_speed > 0) {
|
||||
SetDParam(0, STR_TOOLBAR_RAILTYPE_VELOCITY);
|
||||
SetDParam(1, this->rti->strings.toolbar_caption);
|
||||
SetDParam(2, this->rti->max_speed / 2);
|
||||
} else {
|
||||
SetDParam(0, this->rti->strings.toolbar_caption);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the remove button lowered state of the road toolbar
|
||||
*
|
||||
@@ -365,8 +377,11 @@ struct BuildRoadToolbarWindow : Window {
|
||||
* Both are only valid if they are able to apply as options. */
|
||||
switch (clicked_widget) {
|
||||
case WID_ROT_REMOVE:
|
||||
this->RaiseWidget(WID_ROT_ONE_WAY);
|
||||
this->SetWidgetDirty(WID_ROT_ONE_WAY);
|
||||
if (RoadTypeIsRoad(this->roadtype)) {
|
||||
this->RaiseWidget(WID_ROT_ONE_WAY);
|
||||
this->SetWidgetDirty(WID_ROT_ONE_WAY);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case WID_ROT_ONE_WAY:
|
||||
@@ -376,30 +391,30 @@ struct BuildRoadToolbarWindow : Window {
|
||||
|
||||
case WID_ROT_BUS_STATION:
|
||||
case WID_ROT_TRUCK_STATION:
|
||||
this->DisableWidget(WID_ROT_ONE_WAY);
|
||||
if (RoadTypeIsRoad(this->roadtype)) this->DisableWidget(WID_ROT_ONE_WAY);
|
||||
this->SetWidgetDisabledState(WID_ROT_REMOVE, !this->IsWidgetLowered(clicked_widget));
|
||||
break;
|
||||
|
||||
case WID_ROT_ROAD_X:
|
||||
case WID_ROT_ROAD_Y:
|
||||
case WID_ROT_AUTOROAD:
|
||||
this->SetWidgetsDisabledState(!this->IsWidgetLowered(clicked_widget),
|
||||
WID_ROT_REMOVE,
|
||||
WID_ROT_ONE_WAY,
|
||||
WIDGET_LIST_END);
|
||||
this->SetWidgetDisabledState(WID_ROT_REMOVE, !this->IsWidgetLowered(clicked_widget));
|
||||
if (RoadTypeIsRoad(this->roadtype)) {
|
||||
this->SetWidgetDisabledState(WID_ROT_ONE_WAY, !this->IsWidgetLowered(clicked_widget));
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
/* When any other buttons than road/station, raise and
|
||||
* disable the removal button */
|
||||
this->SetWidgetsDisabledState(true,
|
||||
WID_ROT_REMOVE,
|
||||
WID_ROT_ONE_WAY,
|
||||
WIDGET_LIST_END);
|
||||
this->SetWidgetsLoweredState(false,
|
||||
WID_ROT_REMOVE,
|
||||
WID_ROT_ONE_WAY,
|
||||
WIDGET_LIST_END);
|
||||
this->SetWidgetDisabledState(WID_ROT_REMOVE, true);
|
||||
this->SetWidgetLoweredState(WID_ROT_REMOVE, false);
|
||||
|
||||
if (RoadTypeIsRoad(this->roadtype)) {
|
||||
this->SetWidgetDisabledState(WID_ROT_ONE_WAY, true);
|
||||
this->SetWidgetLoweredState(WID_ROT_ONE_WAY, false);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -410,17 +425,17 @@ struct BuildRoadToolbarWindow : Window {
|
||||
_one_way_button_clicked = false;
|
||||
switch (widget) {
|
||||
case WID_ROT_ROAD_X:
|
||||
HandlePlacePushButton(this, WID_ROT_ROAD_X, _road_type_infos[_cur_roadtype].cursor_nwse, HT_RECT);
|
||||
HandlePlacePushButton(this, WID_ROT_ROAD_X, this->rti->cursor.road_nwse, HT_RECT);
|
||||
this->last_started_action = widget;
|
||||
break;
|
||||
|
||||
case WID_ROT_ROAD_Y:
|
||||
HandlePlacePushButton(this, WID_ROT_ROAD_Y, _road_type_infos[_cur_roadtype].cursor_nesw, HT_RECT);
|
||||
HandlePlacePushButton(this, WID_ROT_ROAD_Y, this->rti->cursor.road_swne, HT_RECT);
|
||||
this->last_started_action = widget;
|
||||
break;
|
||||
|
||||
case WID_ROT_AUTOROAD:
|
||||
HandlePlacePushButton(this, WID_ROT_AUTOROAD, _road_type_infos[_cur_roadtype].cursor_autoroad, HT_RECT);
|
||||
HandlePlacePushButton(this, WID_ROT_AUTOROAD, this->rti->cursor.autoroad, HT_RECT);
|
||||
this->last_started_action = widget;
|
||||
break;
|
||||
|
||||
@@ -430,15 +445,15 @@ struct BuildRoadToolbarWindow : Window {
|
||||
break;
|
||||
|
||||
case WID_ROT_DEPOT:
|
||||
if (_game_mode == GM_EDITOR || !CanBuildVehicleInfrastructure(VEH_ROAD)) return;
|
||||
if (HandlePlacePushButton(this, WID_ROT_DEPOT, SPR_CURSOR_ROAD_DEPOT, HT_RECT)) {
|
||||
if (_game_mode == GM_EDITOR || !CanBuildVehicleInfrastructure(VEH_ROAD, GetRoadTramType(this->roadtype))) return;
|
||||
if (HandlePlacePushButton(this, WID_ROT_DEPOT, this->rti->cursor.depot, HT_RECT)) {
|
||||
ShowRoadDepotPicker(this);
|
||||
this->last_started_action = widget;
|
||||
}
|
||||
break;
|
||||
|
||||
case WID_ROT_BUS_STATION:
|
||||
if (_game_mode == GM_EDITOR || !CanBuildVehicleInfrastructure(VEH_ROAD)) return;
|
||||
if (_game_mode == GM_EDITOR || !CanBuildVehicleInfrastructure(VEH_ROAD, GetRoadTramType(this->roadtype))) return;
|
||||
if (HandlePlacePushButton(this, WID_ROT_BUS_STATION, SPR_CURSOR_BUS_STATION, HT_RECT)) {
|
||||
ShowRVStationPicker(this, ROADSTOP_BUS);
|
||||
this->last_started_action = widget;
|
||||
@@ -446,7 +461,7 @@ struct BuildRoadToolbarWindow : Window {
|
||||
break;
|
||||
|
||||
case WID_ROT_TRUCK_STATION:
|
||||
if (_game_mode == GM_EDITOR || !CanBuildVehicleInfrastructure(VEH_ROAD)) return;
|
||||
if (_game_mode == GM_EDITOR || !CanBuildVehicleInfrastructure(VEH_ROAD, GetRoadTramType(this->roadtype))) return;
|
||||
if (HandlePlacePushButton(this, WID_ROT_TRUCK_STATION, SPR_CURSOR_TRUCK_STATION, HT_RECT)) {
|
||||
ShowRVStationPicker(this, ROADSTOP_TRUCK);
|
||||
this->last_started_action = widget;
|
||||
@@ -466,7 +481,7 @@ struct BuildRoadToolbarWindow : Window {
|
||||
break;
|
||||
|
||||
case WID_ROT_BUILD_TUNNEL:
|
||||
HandlePlacePushButton(this, WID_ROT_BUILD_TUNNEL, SPR_CURSOR_ROAD_TUNNEL, HT_SPECIAL | HT_TUNNEL);
|
||||
HandlePlacePushButton(this, WID_ROT_BUILD_TUNNEL, this->rti->cursor.tunnel, HT_SPECIAL | HT_TUNNEL);
|
||||
this->last_started_action = widget;
|
||||
break;
|
||||
|
||||
@@ -478,6 +493,11 @@ struct BuildRoadToolbarWindow : Window {
|
||||
if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
|
||||
break;
|
||||
|
||||
case WID_ROT_CONVERT_ROAD:
|
||||
HandlePlacePushButton(this, WID_ROT_CONVERT_ROAD, this->rti->cursor.convert_road, HT_RECT);
|
||||
this->last_started_action = widget;
|
||||
break;
|
||||
|
||||
default: NOT_REACHED();
|
||||
}
|
||||
this->UpdateOptionWidgetStatus((RoadToolbarWidgets)widget);
|
||||
@@ -493,7 +513,7 @@ struct BuildRoadToolbarWindow : Window {
|
||||
void OnPlaceObject(Point pt, TileIndex tile) override
|
||||
{
|
||||
_remove_button_clicked = this->IsWidgetLowered(WID_ROT_REMOVE);
|
||||
_one_way_button_clicked = this->IsWidgetLowered(WID_ROT_ONE_WAY);
|
||||
_one_way_button_clicked = RoadTypeIsRoad(this->roadtype) ? this->IsWidgetLowered(WID_ROT_ONE_WAY) : false;
|
||||
switch (this->last_started_action) {
|
||||
case WID_ROT_ROAD_X:
|
||||
_place_road_flag = RF_DIR_X;
|
||||
@@ -520,7 +540,7 @@ struct BuildRoadToolbarWindow : Window {
|
||||
|
||||
case WID_ROT_DEPOT:
|
||||
DoCommandP(tile, _cur_roadtype << 2 | _road_depot_orientation, 0,
|
||||
CMD_BUILD_ROAD_DEPOT | CMD_MSG(_road_type_infos[_cur_roadtype].err_depot), CcRoadDepot);
|
||||
CMD_BUILD_ROAD_DEPOT | CMD_MSG(this->rti->strings.err_depot), CcRoadDepot);
|
||||
break;
|
||||
|
||||
case WID_ROT_BUS_STATION:
|
||||
@@ -536,10 +556,14 @@ struct BuildRoadToolbarWindow : Window {
|
||||
break;
|
||||
|
||||
case WID_ROT_BUILD_TUNNEL:
|
||||
DoCommandP(tile, RoadTypeToRoadTypes(_cur_roadtype) | (TRANSPORT_ROAD << 8), 0,
|
||||
DoCommandP(tile, _cur_roadtype | (TRANSPORT_ROAD << 8), 0,
|
||||
CMD_BUILD_TUNNEL | CMD_MSG(STR_ERROR_CAN_T_BUILD_TUNNEL_HERE), CcBuildRoadTunnel);
|
||||
break;
|
||||
|
||||
case WID_ROT_CONVERT_ROAD:
|
||||
VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_CONVERT_ROAD);
|
||||
break;
|
||||
|
||||
default: NOT_REACHED();
|
||||
}
|
||||
}
|
||||
@@ -549,12 +573,13 @@ struct BuildRoadToolbarWindow : Window {
|
||||
if (_game_mode != GM_EDITOR && (this->IsWidgetLowered(WID_ROT_BUS_STATION) || this->IsWidgetLowered(WID_ROT_TRUCK_STATION))) SetViewportCatchmentStation(nullptr, true);
|
||||
|
||||
this->RaiseButtons();
|
||||
this->SetWidgetsDisabledState(true,
|
||||
WID_ROT_REMOVE,
|
||||
WID_ROT_ONE_WAY,
|
||||
WIDGET_LIST_END);
|
||||
this->SetWidgetDisabledState(WID_ROT_REMOVE, true);
|
||||
this->SetWidgetDirty(WID_ROT_REMOVE);
|
||||
this->SetWidgetDirty(WID_ROT_ONE_WAY);
|
||||
|
||||
if (RoadTypeIsRoad(this->roadtype)) {
|
||||
this->SetWidgetDisabledState(WID_ROT_ONE_WAY, true);
|
||||
this->SetWidgetDirty(WID_ROT_ONE_WAY);
|
||||
}
|
||||
|
||||
DeleteWindowById(WC_BUS_STATION, TRANSPORT_ROAD);
|
||||
DeleteWindowById(WC_TRUCK_STATION, TRANSPORT_ROAD);
|
||||
@@ -613,7 +638,7 @@ struct BuildRoadToolbarWindow : Window {
|
||||
default: NOT_REACHED();
|
||||
case DDSP_BUILD_BRIDGE:
|
||||
if (!_settings_client.gui.persistent_buildingtools) ResetObjectToPlace();
|
||||
ShowBuildBridgeWindow(start_tile, end_tile, TRANSPORT_ROAD, RoadTypeToRoadTypes(_cur_roadtype));
|
||||
ShowBuildBridgeWindow(start_tile, end_tile, TRANSPORT_ROAD, _cur_roadtype);
|
||||
break;
|
||||
|
||||
case DDSP_DEMOLISH_AREA:
|
||||
@@ -627,12 +652,16 @@ struct BuildRoadToolbarWindow : Window {
|
||||
* Use the first three bits (0x07) if dir == Y
|
||||
* else use the last 2 bits (X dir has
|
||||
* not the 3rd bit set) */
|
||||
|
||||
/* Even if _cur_roadtype_id is a uint8 we only use 5 bits so
|
||||
* we could ignore the last 3 bits and reuse them for other
|
||||
* flags */
|
||||
_place_road_flag = (RoadFlags)((_place_road_flag & RF_DIR_Y) ? (_place_road_flag & 0x07) : (_place_road_flag >> 3));
|
||||
|
||||
DoCommandP(start_tile, end_tile, _place_road_flag | (_cur_roadtype << 3) | (_one_way_button_clicked << 5),
|
||||
DoCommandP(start_tile, end_tile, _place_road_flag | (_cur_roadtype << 3) | (_one_way_button_clicked << 10),
|
||||
_remove_button_clicked ?
|
||||
CMD_REMOVE_LONG_ROAD | CMD_MSG(_road_type_infos[_cur_roadtype].err_remove_road) :
|
||||
CMD_BUILD_LONG_ROAD | CMD_MSG(_road_type_infos[_cur_roadtype].err_build_road), CcPlaySound_SPLAT_OTHER);
|
||||
CMD_REMOVE_LONG_ROAD | CMD_MSG(this->rti->strings.err_remove_road) :
|
||||
CMD_BUILD_LONG_ROAD | CMD_MSG(this->rti->strings.err_build_road), CcPlaySound_SPLAT_OTHER);
|
||||
break;
|
||||
|
||||
case DDSP_BUILD_BUSSTOP:
|
||||
@@ -640,9 +669,9 @@ struct BuildRoadToolbarWindow : Window {
|
||||
if (this->IsWidgetLowered(WID_ROT_BUS_STATION)) {
|
||||
if (_remove_button_clicked) {
|
||||
TileArea ta(start_tile, end_tile);
|
||||
DoCommandP(ta.tile, ta.w | ta.h << 8, (_ctrl_pressed << 1) | ROADSTOP_BUS, CMD_REMOVE_ROAD_STOP | CMD_MSG(_road_type_infos[_cur_roadtype].err_remove_station[ROADSTOP_BUS]), CcPlaySound_SPLAT_OTHER);
|
||||
DoCommandP(ta.tile, ta.w | ta.h << 8, (_ctrl_pressed << 1) | ROADSTOP_BUS, CMD_REMOVE_ROAD_STOP | CMD_MSG(this->rti->strings.err_remove_station[ROADSTOP_BUS]), CcPlaySound_SPLAT_OTHER);
|
||||
} else {
|
||||
PlaceRoadStop(start_tile, end_tile, (_ctrl_pressed << 5) | RoadTypeToRoadTypes(_cur_roadtype) << 2 | ROADSTOP_BUS, CMD_BUILD_ROAD_STOP | CMD_MSG(_road_type_infos[_cur_roadtype].err_build_station[ROADSTOP_BUS]));
|
||||
PlaceRoadStop(start_tile, end_tile, _cur_roadtype << 5 | (_ctrl_pressed << 2) | ROADSTOP_BUS, CMD_BUILD_ROAD_STOP | CMD_MSG(this->rti->strings.err_build_station[ROADSTOP_BUS]));
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -652,19 +681,23 @@ struct BuildRoadToolbarWindow : Window {
|
||||
if (this->IsWidgetLowered(WID_ROT_TRUCK_STATION)) {
|
||||
if (_remove_button_clicked) {
|
||||
TileArea ta(start_tile, end_tile);
|
||||
DoCommandP(ta.tile, ta.w | ta.h << 8, (_ctrl_pressed << 1) | ROADSTOP_TRUCK, CMD_REMOVE_ROAD_STOP | CMD_MSG(_road_type_infos[_cur_roadtype].err_remove_station[ROADSTOP_TRUCK]), CcPlaySound_SPLAT_OTHER);
|
||||
DoCommandP(ta.tile, ta.w | ta.h << 8, (_ctrl_pressed << 1) | ROADSTOP_TRUCK, CMD_REMOVE_ROAD_STOP | CMD_MSG(this->rti->strings.err_remove_station[ROADSTOP_TRUCK]), CcPlaySound_SPLAT_OTHER);
|
||||
} else {
|
||||
PlaceRoadStop(start_tile, end_tile, (_ctrl_pressed << 5) | RoadTypeToRoadTypes(_cur_roadtype) << 2 | ROADSTOP_TRUCK, CMD_BUILD_ROAD_STOP | CMD_MSG(_road_type_infos[_cur_roadtype].err_build_station[ROADSTOP_TRUCK]));
|
||||
PlaceRoadStop(start_tile, end_tile, _cur_roadtype << 5 | (_ctrl_pressed << 2) | ROADSTOP_TRUCK, CMD_BUILD_ROAD_STOP | CMD_MSG(this->rti->strings.err_build_station[ROADSTOP_TRUCK]));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case DDSP_CONVERT_ROAD:
|
||||
DoCommandP(end_tile, start_tile, _cur_roadtype, CMD_CONVERT_ROAD | CMD_MSG(rti->strings.err_convert_road), CcPlaySound_SPLAT_OTHER);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void OnPlacePresize(Point pt, TileIndex tile) override
|
||||
{
|
||||
DoCommand(tile, RoadTypeToRoadTypes(_cur_roadtype) | (TRANSPORT_ROAD << 8), 0, DC_AUTO, CMD_BUILD_TUNNEL);
|
||||
DoCommand(tile, _cur_roadtype | (TRANSPORT_ROAD << 8), 0, DC_AUTO, CMD_BUILD_TUNNEL);
|
||||
VpSetPresizeRange(tile, _build_tunnel_endtile == 0 ? tile : _build_tunnel_endtile);
|
||||
}
|
||||
|
||||
@@ -674,36 +707,38 @@ struct BuildRoadToolbarWindow : Window {
|
||||
return ES_NOT_HANDLED;
|
||||
}
|
||||
|
||||
static HotkeyList hotkeys;
|
||||
static HotkeyList road_hotkeys;
|
||||
static HotkeyList tram_hotkeys;
|
||||
};
|
||||
|
||||
/**
|
||||
* Handler for global hotkeys of the BuildRoadToolbarWindow.
|
||||
* @param hotkey Hotkey
|
||||
* @param last_build Last build road type
|
||||
* @return ES_HANDLED if hotkey was accepted.
|
||||
*/
|
||||
static EventState RoadToolbarGlobalHotkeys(int hotkey)
|
||||
static EventState RoadTramToolbarGlobalHotkeys(int hotkey, RoadType last_build)
|
||||
{
|
||||
Window *w = nullptr;
|
||||
switch (_game_mode) {
|
||||
case GM_NORMAL: {
|
||||
extern RoadType _last_built_roadtype;
|
||||
w = ShowBuildRoadToolbar(_last_built_roadtype);
|
||||
break;
|
||||
}
|
||||
|
||||
case GM_EDITOR:
|
||||
w = ShowBuildRoadScenToolbar();
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
Window *w = (_game_mode == GM_NORMAL) ? ShowBuildRoadToolbar(last_build) : ShowBuildRoadScenToolbar(last_build);
|
||||
if (w == nullptr) return ES_NOT_HANDLED;
|
||||
return w->OnHotkey(hotkey);
|
||||
}
|
||||
|
||||
static EventState RoadToolbarGlobalHotkeys(int hotkey)
|
||||
{
|
||||
if (_game_mode == GM_NORMAL && !CanBuildVehicleInfrastructure(VEH_ROAD, RTT_ROAD)) return ES_NOT_HANDLED;
|
||||
|
||||
extern RoadType _last_built_roadtype;
|
||||
return RoadTramToolbarGlobalHotkeys(hotkey, _last_built_roadtype);
|
||||
}
|
||||
|
||||
static EventState TramToolbarGlobalHotkeys(int hotkey)
|
||||
{
|
||||
if (_game_mode != GM_NORMAL || !CanBuildVehicleInfrastructure(VEH_ROAD, RTT_TRAM)) return ES_NOT_HANDLED;
|
||||
extern RoadType _last_built_tramtype;
|
||||
return RoadTramToolbarGlobalHotkeys(hotkey, _last_built_tramtype);
|
||||
}
|
||||
|
||||
static Hotkey roadtoolbar_hotkeys[] = {
|
||||
Hotkey('1', "build_x", WID_ROT_ROAD_X),
|
||||
Hotkey('2', "build_y", WID_ROT_ROAD_Y),
|
||||
@@ -716,15 +751,32 @@ static Hotkey roadtoolbar_hotkeys[] = {
|
||||
Hotkey('B', "bridge", WID_ROT_BUILD_BRIDGE),
|
||||
Hotkey('T', "tunnel", WID_ROT_BUILD_TUNNEL),
|
||||
Hotkey('R', "remove", WID_ROT_REMOVE),
|
||||
Hotkey('C', "convert", WID_ROT_CONVERT_ROAD),
|
||||
HOTKEY_LIST_END
|
||||
};
|
||||
HotkeyList BuildRoadToolbarWindow::hotkeys("roadtoolbar", roadtoolbar_hotkeys, RoadToolbarGlobalHotkeys);
|
||||
HotkeyList BuildRoadToolbarWindow::road_hotkeys("roadtoolbar", roadtoolbar_hotkeys, RoadToolbarGlobalHotkeys);
|
||||
|
||||
static Hotkey tramtoolbar_hotkeys[] = {
|
||||
Hotkey('1', "build_x", WID_ROT_ROAD_X),
|
||||
Hotkey('2', "build_y", WID_ROT_ROAD_Y),
|
||||
Hotkey('3', "autoroad", WID_ROT_AUTOROAD),
|
||||
Hotkey('4', "demolish", WID_ROT_DEMOLISH),
|
||||
Hotkey('5', "depot", WID_ROT_DEPOT),
|
||||
Hotkey('6', "bus_station", WID_ROT_BUS_STATION),
|
||||
Hotkey('7', "truck_station", WID_ROT_TRUCK_STATION),
|
||||
Hotkey('B', "bridge", WID_ROT_BUILD_BRIDGE),
|
||||
Hotkey('T', "tunnel", WID_ROT_BUILD_TUNNEL),
|
||||
Hotkey('R', "remove", WID_ROT_REMOVE),
|
||||
Hotkey('C', "convert", WID_ROT_CONVERT_ROAD),
|
||||
HOTKEY_LIST_END
|
||||
};
|
||||
HotkeyList BuildRoadToolbarWindow::tram_hotkeys("tramtoolbar", tramtoolbar_hotkeys, TramToolbarGlobalHotkeys);
|
||||
|
||||
|
||||
static const NWidgetPart _nested_build_road_widgets[] = {
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
|
||||
NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetDataTip(STR_ROAD_TOOLBAR_ROAD_CONSTRUCTION_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
|
||||
NWidget(WWT_CAPTION, COLOUR_DARK_GREEN, WID_ROT_CAPTION), SetDataTip(STR_WHITE_STRING, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
|
||||
NWidget(WWT_STICKYBOX, COLOUR_DARK_GREEN),
|
||||
EndContainer(),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
@@ -751,6 +803,8 @@ static const NWidgetPart _nested_build_road_widgets[] = {
|
||||
SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_ROAD_TUNNEL, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL),
|
||||
NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_REMOVE),
|
||||
SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_REMOVE, STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD),
|
||||
NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_CONVERT_ROAD),
|
||||
SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_CONVERT_ROAD, STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD),
|
||||
EndContainer(),
|
||||
};
|
||||
|
||||
@@ -759,13 +813,13 @@ static WindowDesc _build_road_desc(
|
||||
WC_BUILD_TOOLBAR, WC_NONE,
|
||||
WDF_CONSTRUCTION,
|
||||
_nested_build_road_widgets, lengthof(_nested_build_road_widgets),
|
||||
&BuildRoadToolbarWindow::hotkeys
|
||||
&BuildRoadToolbarWindow::road_hotkeys
|
||||
);
|
||||
|
||||
static const NWidgetPart _nested_build_tramway_widgets[] = {
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
|
||||
NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetDataTip(STR_ROAD_TOOLBAR_TRAM_CONSTRUCTION_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
|
||||
NWidget(WWT_CAPTION, COLOUR_DARK_GREEN, WID_ROT_CAPTION), SetDataTip(STR_WHITE_STRING, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
|
||||
NWidget(WWT_STICKYBOX, COLOUR_DARK_GREEN),
|
||||
EndContainer(),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
@@ -784,13 +838,14 @@ static const NWidgetPart _nested_build_tramway_widgets[] = {
|
||||
NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_TRUCK_STATION),
|
||||
SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_TRUCK_BAY, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION),
|
||||
NWidget(WWT_PANEL, COLOUR_DARK_GREEN, -1), SetMinimalSize(0, 22), SetFill(1, 1), EndContainer(),
|
||||
NWidget(WWT_EMPTY, COLOUR_DARK_GREEN, WID_ROT_ONE_WAY), SetMinimalSize(0, 0),
|
||||
NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_BUILD_BRIDGE),
|
||||
SetFill(0, 1), SetMinimalSize(43, 22), SetDataTip(SPR_IMG_BRIDGE, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE),
|
||||
NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_BUILD_TUNNEL),
|
||||
SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_ROAD_TUNNEL, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL),
|
||||
NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_REMOVE),
|
||||
SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_REMOVE, STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS),
|
||||
NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_CONVERT_ROAD),
|
||||
SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_CONVERT_ROAD, STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM),
|
||||
EndContainer(),
|
||||
};
|
||||
|
||||
@@ -799,7 +854,7 @@ static WindowDesc _build_tramway_desc(
|
||||
WC_BUILD_TOOLBAR, WC_NONE,
|
||||
WDF_CONSTRUCTION,
|
||||
_nested_build_tramway_widgets, lengthof(_nested_build_tramway_widgets),
|
||||
&BuildRoadToolbarWindow::hotkeys
|
||||
&BuildRoadToolbarWindow::tram_hotkeys
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -812,16 +867,18 @@ static WindowDesc _build_tramway_desc(
|
||||
Window *ShowBuildRoadToolbar(RoadType roadtype)
|
||||
{
|
||||
if (!Company::IsValidID(_local_company)) return nullptr;
|
||||
_cur_roadtype = roadtype;
|
||||
if (!ValParamRoadType(roadtype)) return nullptr;
|
||||
|
||||
DeleteWindowByClass(WC_BUILD_TOOLBAR);
|
||||
return AllocateWindowDescFront<BuildRoadToolbarWindow>(roadtype == ROADTYPE_ROAD ? &_build_road_desc : &_build_tramway_desc, TRANSPORT_ROAD);
|
||||
_cur_roadtype = roadtype;
|
||||
|
||||
return AllocateWindowDescFront<BuildRoadToolbarWindow>(RoadTypeIsRoad(_cur_roadtype) ? &_build_road_desc : &_build_tramway_desc, TRANSPORT_ROAD);
|
||||
}
|
||||
|
||||
static const NWidgetPart _nested_build_road_scen_widgets[] = {
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
|
||||
NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetDataTip(STR_ROAD_TOOLBAR_ROAD_CONSTRUCTION_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
|
||||
NWidget(WWT_CAPTION, COLOUR_DARK_GREEN, WID_ROT_CAPTION), SetDataTip(STR_WHITE_STRING, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
|
||||
NWidget(WWT_STICKYBOX, COLOUR_DARK_GREEN),
|
||||
EndContainer(),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
@@ -842,6 +899,8 @@ static const NWidgetPart _nested_build_road_scen_widgets[] = {
|
||||
SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_ROAD_TUNNEL, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL),
|
||||
NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_REMOVE),
|
||||
SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_REMOVE, STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD),
|
||||
NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_CONVERT_ROAD),
|
||||
SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_CONVERT_ROAD, STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD),
|
||||
EndContainer(),
|
||||
};
|
||||
|
||||
@@ -850,17 +909,54 @@ static WindowDesc _build_road_scen_desc(
|
||||
WC_SCEN_BUILD_TOOLBAR, WC_NONE,
|
||||
WDF_CONSTRUCTION,
|
||||
_nested_build_road_scen_widgets, lengthof(_nested_build_road_scen_widgets),
|
||||
&BuildRoadToolbarWindow::hotkeys
|
||||
&BuildRoadToolbarWindow::road_hotkeys
|
||||
);
|
||||
|
||||
static const NWidgetPart _nested_build_tramway_scen_widgets[] = {
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
|
||||
NWidget(WWT_CAPTION, COLOUR_DARK_GREEN, WID_ROT_CAPTION), SetDataTip(STR_WHITE_STRING, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
|
||||
NWidget(WWT_STICKYBOX, COLOUR_DARK_GREEN),
|
||||
EndContainer(),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_ROAD_X),
|
||||
SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_TRAMWAY_X_DIR, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION),
|
||||
NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_ROAD_Y),
|
||||
SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_TRAMWAY_Y_DIR, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION),
|
||||
NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_AUTOROAD),
|
||||
SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_AUTOTRAM, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM),
|
||||
NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_DEMOLISH),
|
||||
SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_DYNAMITE, STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC),
|
||||
NWidget(WWT_PANEL, COLOUR_DARK_GREEN, -1), SetMinimalSize(0, 22), SetFill(1, 1), EndContainer(),
|
||||
NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_BUILD_BRIDGE),
|
||||
SetFill(0, 1), SetMinimalSize(43, 22), SetDataTip(SPR_IMG_BRIDGE, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE),
|
||||
NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_BUILD_TUNNEL),
|
||||
SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_ROAD_TUNNEL, STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL),
|
||||
NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_REMOVE),
|
||||
SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_REMOVE, STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS),
|
||||
NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_ROT_CONVERT_ROAD),
|
||||
SetFill(0, 1), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_CONVERT_ROAD, STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM),
|
||||
EndContainer(),
|
||||
};
|
||||
|
||||
static WindowDesc _build_tramway_scen_desc(
|
||||
WDP_AUTO, "toolbar_tram_scen", 0, 0,
|
||||
WC_SCEN_BUILD_TOOLBAR, WC_NONE,
|
||||
WDF_CONSTRUCTION,
|
||||
_nested_build_tramway_scen_widgets, lengthof(_nested_build_tramway_scen_widgets),
|
||||
&BuildRoadToolbarWindow::tram_hotkeys
|
||||
);
|
||||
|
||||
/**
|
||||
* Show the road building toolbar in the scenario editor.
|
||||
* @return The just opened toolbar, or \c nullptr if the toolbar was already open.
|
||||
*/
|
||||
Window *ShowBuildRoadScenToolbar()
|
||||
Window *ShowBuildRoadScenToolbar(RoadType roadtype)
|
||||
{
|
||||
_cur_roadtype = ROADTYPE_ROAD;
|
||||
return AllocateWindowDescFront<BuildRoadToolbarWindow>(&_build_road_scen_desc, TRANSPORT_ROAD);
|
||||
DeleteWindowById(WC_SCEN_BUILD_TOOLBAR, TRANSPORT_ROAD);
|
||||
_cur_roadtype = roadtype;
|
||||
|
||||
return AllocateWindowDescFront<BuildRoadToolbarWindow>(RoadTypeIsRoad(_cur_roadtype) ? &_build_road_scen_desc : &_build_tramway_scen_desc, TRANSPORT_ROAD);
|
||||
}
|
||||
|
||||
struct BuildRoadDepotWindow : public PickerWindowBase {
|
||||
@@ -869,7 +965,7 @@ struct BuildRoadDepotWindow : public PickerWindowBase {
|
||||
this->CreateNestedTree();
|
||||
|
||||
this->LowerWidget(_road_depot_orientation + WID_BROD_DEPOT_NE);
|
||||
if ( _cur_roadtype == ROADTYPE_TRAM) {
|
||||
if (RoadTypeIsTram(_cur_roadtype)) {
|
||||
this->GetWidget<NWidgetCore>(WID_BROD_CAPTION)->widget_data = STR_BUILD_DEPOT_TRAM_ORIENTATION_CAPTION;
|
||||
for (int i = WID_BROD_DEPOT_NE; i <= WID_BROD_DEPOT_NW; i++) this->GetWidget<NWidgetCore>(i)->tool_tip = STR_BUILD_DEPOT_TRAM_ORIENTATION_SELECT_TOOLTIP;
|
||||
}
|
||||
@@ -960,13 +1056,14 @@ struct BuildRoadStationWindow : public PickerWindowBase {
|
||||
this->CreateNestedTree();
|
||||
|
||||
/* Trams don't have non-drivethrough stations */
|
||||
if (_cur_roadtype == ROADTYPE_TRAM && _road_station_picker_orientation < DIAGDIR_END) {
|
||||
if (RoadTypeIsTram(_cur_roadtype) && _road_station_picker_orientation < DIAGDIR_END) {
|
||||
_road_station_picker_orientation = DIAGDIR_END;
|
||||
}
|
||||
const RoadTypeInfo *rti = GetRoadTypeInfo(_cur_roadtype);
|
||||
this->GetWidget<NWidgetCore>(WID_BROS_CAPTION)->widget_data = rti->strings.picker_title[rs];
|
||||
|
||||
this->GetWidget<NWidgetCore>(WID_BROS_CAPTION)->widget_data = _road_type_infos[_cur_roadtype].picker_title[rs];
|
||||
for (uint i = (_cur_roadtype == ROADTYPE_TRAM ? WID_BROS_STATION_X : WID_BROS_STATION_NE); i < WID_BROS_LT_OFF; i++) {
|
||||
this->GetWidget<NWidgetCore>(i)->tool_tip = _road_type_infos[_cur_roadtype].picker_tooltip[rs];
|
||||
for (uint i = RoadTypeIsTram(_cur_roadtype) ? WID_BROS_STATION_X : WID_BROS_STATION_NE; i < WID_BROS_LT_OFF; i++) {
|
||||
this->GetWidget<NWidgetCore>(i)->tool_tip = rti->strings.picker_tooltip[rs];
|
||||
}
|
||||
|
||||
this->LowerWidget(_road_station_picker_orientation + WID_BROS_STATION_NE);
|
||||
@@ -1023,7 +1120,7 @@ struct BuildRoadStationWindow : public PickerWindowBase {
|
||||
if (!IsInsideMM(widget, WID_BROS_STATION_NE, WID_BROS_STATION_Y + 1)) return;
|
||||
|
||||
StationType st = (this->window_class == WC_BUS_STATION) ? STATION_BUS : STATION_TRUCK;
|
||||
StationPickerDrawSprite(r.left + 1 + ScaleGUITrad(31), r.bottom - ScaleGUITrad(31), st, INVALID_RAILTYPE, widget < WID_BROS_STATION_X ? ROADTYPE_ROAD : _cur_roadtype, widget - WID_BROS_STATION_NE);
|
||||
StationPickerDrawSprite(r.left + 1 + ScaleGUITrad(31), r.bottom - ScaleGUITrad(31), st, INVALID_RAILTYPE, _cur_roadtype, widget - WID_BROS_STATION_NE);
|
||||
}
|
||||
|
||||
void OnClick(Point pt, int widget, int click_count) override
|
||||
@@ -1150,7 +1247,7 @@ static WindowDesc _tram_station_picker_desc(
|
||||
|
||||
static void ShowRVStationPicker(Window *parent, RoadStopType rs)
|
||||
{
|
||||
new BuildRoadStationWindow(_cur_roadtype == ROADTYPE_ROAD ? &_road_station_picker_desc : &_tram_station_picker_desc, parent, rs);
|
||||
new BuildRoadStationWindow(RoadTypeIsRoad(_cur_roadtype) ? &_road_station_picker_desc : &_tram_station_picker_desc, parent, rs);
|
||||
}
|
||||
|
||||
void InitializeRoadGui()
|
||||
@@ -1158,3 +1255,118 @@ void InitializeRoadGui()
|
||||
_road_depot_orientation = DIAGDIR_NW;
|
||||
_road_station_picker_orientation = DIAGDIR_NW;
|
||||
}
|
||||
|
||||
/**
|
||||
* I really don't know why rail_gui.cpp has this too, shouldn't be included in the other one?
|
||||
*/
|
||||
void InitializeRoadGUI()
|
||||
{
|
||||
BuildRoadToolbarWindow *w = dynamic_cast<BuildRoadToolbarWindow *>(FindWindowById(WC_BUILD_TOOLBAR, TRANSPORT_ROAD));
|
||||
if (w != nullptr) w->ModifyRoadType(_cur_roadtype);
|
||||
}
|
||||
|
||||
DropDownList GetRoadTypeDropDownList(RoadTramTypes rtts, bool for_replacement, bool all_option)
|
||||
{
|
||||
RoadTypes used_roadtypes;
|
||||
RoadTypes avail_roadtypes;
|
||||
|
||||
const Company *c = Company::Get(_local_company);
|
||||
|
||||
/* Find the used roadtypes. */
|
||||
if (for_replacement) {
|
||||
avail_roadtypes = GetCompanyRoadTypes(c->index, false);
|
||||
used_roadtypes = GetRoadTypes(false);
|
||||
} else {
|
||||
avail_roadtypes = c->avail_roadtypes;
|
||||
used_roadtypes = GetRoadTypes(true);
|
||||
}
|
||||
|
||||
/* Filter listed road types */
|
||||
if (!HasBit(rtts, RTT_ROAD)) used_roadtypes &= _roadtypes_type;
|
||||
if (!HasBit(rtts, RTT_TRAM)) used_roadtypes &= ~_roadtypes_type;
|
||||
|
||||
DropDownList list;
|
||||
|
||||
if (all_option) {
|
||||
list.emplace_back(new DropDownListStringItem(STR_REPLACE_ALL_ROADTYPE, INVALID_ROADTYPE, false));
|
||||
}
|
||||
|
||||
Dimension d = { 0, 0 };
|
||||
RoadType rt;
|
||||
/* Get largest icon size, to ensure text is aligned on each menu item. */
|
||||
if (!for_replacement) {
|
||||
FOR_ALL_SORTED_ROADTYPES(rt) {
|
||||
if (!HasBit(used_roadtypes, rt)) continue;
|
||||
const RoadTypeInfo *rti = GetRoadTypeInfo(rt);
|
||||
d = maxdim(d, GetSpriteSize(rti->gui_sprites.build_x_road));
|
||||
}
|
||||
}
|
||||
|
||||
FOR_ALL_SORTED_ROADTYPES(rt) {
|
||||
/* If it's not used ever, don't show it to the user. */
|
||||
if (!HasBit(used_roadtypes, rt)) continue;
|
||||
|
||||
const RoadTypeInfo *rti = GetRoadTypeInfo(rt);
|
||||
|
||||
DropDownListParamStringItem *item;
|
||||
if (for_replacement) {
|
||||
item = new DropDownListParamStringItem(rti->strings.replace_text, rt, !HasBit(avail_roadtypes, rt));
|
||||
} else {
|
||||
StringID str = rti->max_speed > 0 ? STR_TOOLBAR_RAILTYPE_VELOCITY : STR_JUST_STRING;
|
||||
DropDownListIconItem *iconitem = new DropDownListIconItem(rti->gui_sprites.build_x_road, PAL_NONE, str, rt, !HasBit(avail_roadtypes, rt));
|
||||
iconitem->SetDimension(d);
|
||||
item = iconitem;
|
||||
}
|
||||
item->SetParam(0, rti->strings.menu_text);
|
||||
item->SetParam(1, rti->max_speed / 2);
|
||||
list.emplace_back(item);
|
||||
}
|
||||
|
||||
if (list.size() == 0) {
|
||||
/* Empty dropdowns are not allowed */
|
||||
list.emplace_back(new DropDownListStringItem(STR_NONE, INVALID_ROADTYPE, true));
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
DropDownList GetScenRoadTypeDropDownList(RoadTramTypes rtts)
|
||||
{
|
||||
RoadTypes avail_roadtypes = GetRoadTypes(false);
|
||||
avail_roadtypes = AddDateIntroducedRoadTypes(avail_roadtypes, _date);
|
||||
RoadTypes used_roadtypes = GetRoadTypes(true);
|
||||
|
||||
/* Filter listed road types */
|
||||
if (!HasBit(rtts, RTT_ROAD)) used_roadtypes &= _roadtypes_type;
|
||||
if (!HasBit(rtts, RTT_TRAM)) used_roadtypes &= ~_roadtypes_type;
|
||||
|
||||
DropDownList list;
|
||||
|
||||
/* If it's not used ever, don't show it to the user. */
|
||||
Dimension d = { 0, 0 };
|
||||
RoadType rt;
|
||||
FOR_ALL_SORTED_ROADTYPES(rt) {
|
||||
if (!HasBit(used_roadtypes, rt)) continue;
|
||||
const RoadTypeInfo *rti = GetRoadTypeInfo(rt);
|
||||
d = maxdim(d, GetSpriteSize(rti->gui_sprites.build_x_road));
|
||||
}
|
||||
FOR_ALL_SORTED_ROADTYPES(rt) {
|
||||
if (!HasBit(used_roadtypes, rt)) continue;
|
||||
|
||||
const RoadTypeInfo *rti = GetRoadTypeInfo(rt);
|
||||
|
||||
StringID str = rti->max_speed > 0 ? STR_TOOLBAR_RAILTYPE_VELOCITY : STR_JUST_STRING;
|
||||
DropDownListIconItem *item = new DropDownListIconItem(rti->gui_sprites.build_x_road, PAL_NONE, str, rt, !HasBit(avail_roadtypes, rt));
|
||||
item->SetDimension(d);
|
||||
item->SetParam(0, rti->strings.menu_text);
|
||||
item->SetParam(1, rti->max_speed);
|
||||
list.emplace_back(item);
|
||||
}
|
||||
|
||||
if (list.size() == 0) {
|
||||
/* Empty dropdowns are not allowed */
|
||||
list.emplace_back(new DropDownListStringItem(STR_NONE, -1, true));
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
@@ -15,9 +15,13 @@
|
||||
#include "road_type.h"
|
||||
#include "tile_type.h"
|
||||
#include "direction_type.h"
|
||||
#include "widgets/dropdown_type.h"
|
||||
|
||||
struct Window *ShowBuildRoadToolbar(RoadType roadtype);
|
||||
struct Window *ShowBuildRoadScenToolbar();
|
||||
struct Window *ShowBuildRoadScenToolbar(RoadType roadtype);
|
||||
void ConnectRoadToStructure(TileIndex tile, DiagDirection direction);
|
||||
DropDownList GetRoadTypeDropDownList(RoadTramTypes rtts, bool for_replacement = false, bool all_option = false);
|
||||
DropDownList GetScenRoadTypeDropDownList(RoadTramTypes rtts);
|
||||
void InitializeRoadGUI();
|
||||
|
||||
#endif /* ROAD_GUI_H */
|
||||
|
@@ -17,8 +17,8 @@
|
||||
|
||||
RoadBits CleanUpRoadBits(const TileIndex tile, RoadBits org_rb);
|
||||
|
||||
CommandCost CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, Owner owner, RoadType rt, DoCommandFlag flags, bool town_check = true);
|
||||
CommandCost CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, Owner owner, RoadTramType rtt, DoCommandFlag flags, bool town_check = true);
|
||||
|
||||
void DrawRoadCatenary(const TileInfo *ti, RoadBits tram);
|
||||
void DrawRoadCatenary(const TileInfo *ti);
|
||||
|
||||
#endif /* ROAD_INTERNAL_H */
|
||||
|
@@ -32,15 +32,15 @@
|
||||
* @param straight_tunnel_bridge_entrance whether to return straight road bits for tunnels/bridges.
|
||||
* @return the road bits of the given tile
|
||||
*/
|
||||
RoadBits GetAnyRoadBits(TileIndex tile, RoadType rt, bool straight_tunnel_bridge_entrance)
|
||||
RoadBits GetAnyRoadBits(TileIndex tile, RoadTramType rtt, bool straight_tunnel_bridge_entrance)
|
||||
{
|
||||
if (!HasTileRoadType(tile, rt)) return ROAD_NONE;
|
||||
if (!MayHaveRoad(tile) || !HasTileRoadType(tile, rtt)) return ROAD_NONE;
|
||||
|
||||
switch (GetTileType(tile)) {
|
||||
case MP_ROAD:
|
||||
switch (GetRoadTileType(tile)) {
|
||||
default:
|
||||
case ROAD_TILE_NORMAL: return GetRoadBits(tile, rt);
|
||||
case ROAD_TILE_NORMAL: return GetRoadBits(tile, rtt);
|
||||
case ROAD_TILE_CROSSING: return GetCrossingRoadBits(tile);
|
||||
case ROAD_TILE_DEPOT: return DiagDirToRoadBits(GetRoadDepotDirection(tile));
|
||||
}
|
||||
@@ -52,7 +52,7 @@ RoadBits GetAnyRoadBits(TileIndex tile, RoadType rt, bool straight_tunnel_bridge
|
||||
|
||||
case MP_TUNNELBRIDGE:
|
||||
if (GetTunnelBridgeTransportType(tile) != TRANSPORT_ROAD) return ROAD_NONE;
|
||||
if (IsRoadCustomBridgeHeadTile(tile)) return GetCustomBridgeHeadRoadBits(tile, rt);
|
||||
if (IsRoadCustomBridgeHeadTile(tile)) return GetCustomBridgeHeadRoadBits(tile, rtt);
|
||||
return straight_tunnel_bridge_entrance ?
|
||||
AxisToRoadBits(DiagDirToAxis(GetTunnelBridgeDirection(tile))) :
|
||||
DiagDirToRoadBits(ReverseDiagDir(GetTunnelBridgeDirection(tile)));
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user