Add road/tram type flag to disallow tunnels
This commit is contained in:
@@ -175,6 +175,8 @@
|
|||||||
<dd>Scripts (AI/GS) may not build this roadtype</dd>
|
<dd>Scripts (AI/GS) may not build this roadtype</dd>
|
||||||
<dt>NO_TOWN_MODIFY</dt>
|
<dt>NO_TOWN_MODIFY</dt>
|
||||||
<dd>Towns may not modify tiles of this roadtype in any way whatsoever</dd>
|
<dd>Towns may not modify tiles of this roadtype in any way whatsoever</dd>
|
||||||
|
<dt>NO_TUNNELS</dt>
|
||||||
|
<dd>Disallow tunnels for this roadtype</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -202,6 +204,8 @@
|
|||||||
<dd>Scripts (AI/GS) may not build this tramtype</dd>
|
<dd>Scripts (AI/GS) may not build this tramtype</dd>
|
||||||
<dt>NO_TOWN_MODIFY</dt>
|
<dt>NO_TOWN_MODIFY</dt>
|
||||||
<dd>Towns may not modify tiles of this tramtype in any way whatsoever</dd>
|
<dd>Towns may not modify tiles of this tramtype in any way whatsoever</dd>
|
||||||
|
<dt>NO_TUNNELS</dt>
|
||||||
|
<dd>Disallow tunnels for this tramtype</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
@@ -327,6 +327,8 @@
|
|||||||
<tr><th>Bit</th><th>Value</th><th>Meaning</th></tr>
|
<tr><th>Bit</th><th>Value</th><th>Meaning</th></tr>
|
||||||
<tr><td>0</td><td>1</td><td>Scripts (AI/GS) may not build this road/tram type</td></tr>
|
<tr><td>0</td><td>1</td><td>Scripts (AI/GS) may not build this road/tram type</td></tr>
|
||||||
<tr><td>1</td><td>2</td><td>Towns may not modify tiles of this road/tram type in any way whatsoever</td></tr>
|
<tr><td>1</td><td>2</td><td>Towns may not modify tiles of this road/tram type in any way whatsoever</td></tr>
|
||||||
|
<tr><td>2</td><td>4</td><td>Disallow tunnels for this road/tram type<br />
|
||||||
|
Support for this bit is indicated by the feature name: <font face="monospace">action0_roadtype_extra_flags</font>, version 2.</td></tr>
|
||||||
</table>
|
</table>
|
||||||
</p>
|
</p>
|
||||||
<p>This is indicated by the feature name: <font face="monospace">action0_roadtype_extra_flags</font>, version 1</p>
|
<p>This is indicated by the feature name: <font face="monospace">action0_roadtype_extra_flags</font>, version 1</p>
|
||||||
|
@@ -2026,3 +2026,5 @@ STR_SHIFT_KEY_NAME :{BLACK}Shift
|
|||||||
STR_CTRL_KEY_NAME :{BLACK}Ctrl
|
STR_CTRL_KEY_NAME :{BLACK}Ctrl
|
||||||
STR_MODIFIER_TOGGLE_SHIFT_TOOLTIP :{BLACK}Click to invert state of Shift key
|
STR_MODIFIER_TOGGLE_SHIFT_TOOLTIP :{BLACK}Click to invert state of Shift key
|
||||||
STR_MODIFIER_TOGGLE_CTRL_TOOLTIP :{BLACK}Click to invert state of Ctrl key
|
STR_MODIFIER_TOGGLE_CTRL_TOOLTIP :{BLACK}Click to invert state of Ctrl key
|
||||||
|
|
||||||
|
STR_ERROR_TUNNEL_DISALLOWED_ROAD :{WHITE}Tunnels not allowed for this road type
|
||||||
|
@@ -38,7 +38,7 @@ extern const GRFFeatureInfo _grf_feature_list[] = {
|
|||||||
GRFFeatureInfo("action0_railtype_disable_realistic_braking", 1),
|
GRFFeatureInfo("action0_railtype_disable_realistic_braking", 1),
|
||||||
GRFFeatureInfo("action0_railtype_recolour", 1),
|
GRFFeatureInfo("action0_railtype_recolour", 1),
|
||||||
GRFFeatureInfo("action0_railtype_extra_aspects", 1),
|
GRFFeatureInfo("action0_railtype_extra_aspects", 1),
|
||||||
GRFFeatureInfo("action0_roadtype_extra_flags", 1),
|
GRFFeatureInfo("action0_roadtype_extra_flags", 2),
|
||||||
GRFFeatureInfo("action0_roadtype_collision_mode", 1),
|
GRFFeatureInfo("action0_roadtype_collision_mode", 1),
|
||||||
GRFFeatureInfo("varaction2_railtype_signal_context", 1),
|
GRFFeatureInfo("varaction2_railtype_signal_context", 1),
|
||||||
GRFFeatureInfo("action0_global_extra_station_names", 2),
|
GRFFeatureInfo("action0_global_extra_station_names", 2),
|
||||||
|
14
src/road.h
14
src/road.h
@@ -55,10 +55,9 @@ DECLARE_ENUM_AS_BIT_SET(RoadTypeFlags)
|
|||||||
enum RoadTypeExtraFlags {
|
enum RoadTypeExtraFlags {
|
||||||
RXTF_NOT_AVAILABLE_AI_GS = 0, ///< Bit number for unavailable for AI/GS
|
RXTF_NOT_AVAILABLE_AI_GS = 0, ///< Bit number for unavailable for AI/GS
|
||||||
RXTF_NO_TOWN_MODIFICATION, ///< Bit number for no town modification
|
RXTF_NO_TOWN_MODIFICATION, ///< Bit number for no town modification
|
||||||
|
RXTF_NO_TUNNELS, ///< Bit number for no tunnels
|
||||||
|
|
||||||
RXTFB_NONE = 0, ///< All flags cleared.
|
RXTFB_NONE = 0, ///< All flags cleared.
|
||||||
RXTFB_NOT_AVAILABLE_AI_GS = 1 << RXTF_NOT_AVAILABLE_AI_GS, ///< Value for unavailable for AI/GS
|
|
||||||
RXTFB_NO_TOWN_MODIFICATION = 1 << RXTF_NO_TOWN_MODIFICATION, ///< Value for no town modification
|
|
||||||
};
|
};
|
||||||
DECLARE_ENUM_AS_BIT_SET(RoadTypeExtraFlags)
|
DECLARE_ENUM_AS_BIT_SET(RoadTypeExtraFlags)
|
||||||
|
|
||||||
@@ -325,6 +324,17 @@ static inline bool RoadNoLevelCrossing(RoadType roadtype)
|
|||||||
return HasBit(GetRoadTypeInfo(roadtype)->flags, ROTF_NO_LEVEL_CROSSING);
|
return HasBit(GetRoadTypeInfo(roadtype)->flags, ROTF_NO_LEVEL_CROSSING);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test if road disallows tunnels
|
||||||
|
* @param roadtype The roadtype we are testing
|
||||||
|
* @return True iff the roadtype disallows tunnels
|
||||||
|
*/
|
||||||
|
static inline bool RoadNoTunnels(RoadType roadtype)
|
||||||
|
{
|
||||||
|
assert(roadtype < ROADTYPE_END);
|
||||||
|
return HasBit(GetRoadTypeInfo(roadtype)->extra_flags, RXTF_NO_TUNNELS);
|
||||||
|
}
|
||||||
|
|
||||||
RoadType GetRoadTypeByLabel(RoadTypeLabel label, bool allow_alternate_labels = true);
|
RoadType GetRoadTypeByLabel(RoadTypeLabel label, bool allow_alternate_labels = true);
|
||||||
|
|
||||||
void ResetRoadTypes();
|
void ResetRoadTypes();
|
||||||
|
@@ -1330,6 +1330,8 @@ CommandCost CmdBuildRoad(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
|
|||||||
/* Only allow building the outer roadbit, so building long roads stops at existing bridges */
|
/* Only allow building the outer roadbit, so building long roads stops at existing bridges */
|
||||||
if (MirrorRoadBits(DiagDirToRoadBits(GetTunnelBridgeDirection(tile))) != pieces) goto do_clear;
|
if (MirrorRoadBits(DiagDirToRoadBits(GetTunnelBridgeDirection(tile))) != pieces) goto do_clear;
|
||||||
if (HasTileRoadType(tile, rtt)) return_cmd_error(STR_ERROR_ALREADY_BUILT);
|
if (HasTileRoadType(tile, rtt)) return_cmd_error(STR_ERROR_ALREADY_BUILT);
|
||||||
|
if (RoadNoTunnels(rt)) return_cmd_error(STR_ERROR_TUNNEL_DISALLOWED_ROAD);
|
||||||
|
|
||||||
/* Don't allow adding roadtype to the bridge/tunnel when vehicles are already driving on it */
|
/* Don't allow adding roadtype to the bridge/tunnel when vehicles are already driving on it */
|
||||||
CommandCost ret = TunnelBridgeIsFree(tile, other_end);
|
CommandCost ret = TunnelBridgeIsFree(tile, other_end);
|
||||||
if (ret.Failed()) return ret;
|
if (ret.Failed()) return ret;
|
||||||
@@ -3054,6 +3056,10 @@ CommandCost CmdConvertRoad(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
|
|||||||
break;
|
break;
|
||||||
case MP_TUNNELBRIDGE:
|
case MP_TUNNELBRIDGE:
|
||||||
if (GetTunnelBridgeTransportType(tile) != TRANSPORT_ROAD) continue;
|
if (GetTunnelBridgeTransportType(tile) != TRANSPORT_ROAD) continue;
|
||||||
|
if (IsTunnel(tile) && RoadNoTunnels(to_type)) {
|
||||||
|
error.MakeError(STR_ERROR_TUNNEL_DISALLOWED_ROAD);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default: continue;
|
default: continue;
|
||||||
}
|
}
|
||||||
|
@@ -443,6 +443,7 @@ struct BuildRoadToolbarWindow : Window {
|
|||||||
}
|
}
|
||||||
this->GetWidget<NWidgetCore>(WID_ROT_CONVERT_ROAD)->widget_data = rti->gui_sprites.convert_road;
|
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;
|
this->GetWidget<NWidgetCore>(WID_ROT_BUILD_TUNNEL)->widget_data = rti->gui_sprites.build_tunnel;
|
||||||
|
if (HasBit(rti->extra_flags, RXTF_NO_TUNNELS)) this->DisableWidget(WID_ROT_BUILD_TUNNEL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -1791,9 +1791,10 @@ class NIHRoadType : public NIHelper {
|
|||||||
HasBit(rti->flags, ROTF_HIDDEN) ? 'h' : '-',
|
HasBit(rti->flags, ROTF_HIDDEN) ? 'h' : '-',
|
||||||
HasBit(rti->flags, ROTF_TOWN_BUILD) ? 'T' : '-');
|
HasBit(rti->flags, ROTF_TOWN_BUILD) ? 'T' : '-');
|
||||||
output.print(buffer);
|
output.print(buffer);
|
||||||
seprintf(buffer, lastof(buffer), " Extra Flags: %c%c",
|
seprintf(buffer, lastof(buffer), " Extra Flags: %c%c%c",
|
||||||
HasBit(rti->extra_flags, RXTF_NOT_AVAILABLE_AI_GS) ? 's' : '-',
|
HasBit(rti->extra_flags, RXTF_NOT_AVAILABLE_AI_GS) ? 's' : '-',
|
||||||
HasBit(rti->extra_flags, RXTF_NO_TOWN_MODIFICATION) ? 't' : '-');
|
HasBit(rti->extra_flags, RXTF_NO_TOWN_MODIFICATION) ? 't' : '-',
|
||||||
|
HasBit(rti->extra_flags, RXTF_NO_TUNNELS) ? 'T' : '-');
|
||||||
output.print(buffer);
|
output.print(buffer);
|
||||||
seprintf(buffer, lastof(buffer), " Collision mode: %u", rti->collision_mode);
|
seprintf(buffer, lastof(buffer), " Collision mode: %u", rti->collision_mode);
|
||||||
output.print(buffer);
|
output.print(buffer);
|
||||||
|
@@ -966,6 +966,7 @@ CommandCost CmdBuildTunnel(TileIndex start_tile, DoCommandFlag flags, uint32 p1,
|
|||||||
case TRANSPORT_ROAD:
|
case TRANSPORT_ROAD:
|
||||||
roadtype = Extract<RoadType, 0, 6>(p1);
|
roadtype = Extract<RoadType, 0, 6>(p1);
|
||||||
if (!ValParamRoadType(roadtype)) return CMD_ERROR;
|
if (!ValParamRoadType(roadtype)) return CMD_ERROR;
|
||||||
|
if (RoadNoTunnels(roadtype)) return_cmd_error(STR_ERROR_TUNNEL_DISALLOWED_ROAD);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default: return CMD_ERROR;
|
default: return CMD_ERROR;
|
||||||
|
Reference in New Issue
Block a user