Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using ModsCommon;
using ModsCommon;
using ModsCommon.Utilities;
using System;
using System.Collections.Generic;
Expand Down Expand Up @@ -31,7 +31,7 @@ public override void OnLoadData()
SingletonMod<Mod>.Logger.Debug($"Import NC2 data");

WasImported = true;
var state = Backward�ompatibility.Loader.Load<Backward�ompatibility.NCState>(data);
var state = BackwardСompatibility.Loader.Load<BackwardСompatibility.NCState>(data);
var config = state.ToXml();
SetLoadData(config);
}
Expand Down
6 changes: 3 additions & 3 deletions NodeControllerRenewal/Manager/SegmentEndData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -765,7 +765,7 @@ public void Render(OverlayData contourData, OverlayData outterData, OverlayData
{
var data = SingletonManager<Manager>.Instance[NodeId];

Render�ontour(contourData);
RenderContour(contourData);
if (data.IsMoveableEnds && IsChangeable)
{
RenderEnd(contourData, LengthXZ(LeftSide.Position - Position) + CircleRadius, 0f);
Expand All @@ -788,7 +788,7 @@ public void Render(OverlayData contourData, OverlayData outterData, OverlayData
}
public void RenderAlign(OverlayData contourData, OverlayData? leftData = null, OverlayData? rightData = null)
{
Render�ontour(contourData);
RenderContour(contourData);
RenderEnd(contourData);

if (leftData != null)
Expand All @@ -813,7 +813,7 @@ public void RenderEnd(OverlayData data, float? leftCut = null, float? rightCut =
line = line.Cut(startT, 1 - endT);
line.Render(data);
}
public void Render�ontour(OverlayData data)
public void RenderContour(OverlayData data)
{
RenderSide(LeftSide, data);
RenderSide(RightSide, data);
Expand Down
7 changes: 5 additions & 2 deletions NodeControllerRenewal/NodeControllerRenewal.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@
<ItemGroup>
<Compile Include="Manager\Extensions\AssetDataExtension.cs" />
<Compile Include="Manager\MainRoad.cs" />
<Compile Include="ToolModes\LaneChange.cs" />
<Compile Include="UI\OptionPanel.cs" />
<Compile Include="UI\SimpleMessageBox.cs" />
<Compile Include="Utilities\BackwardСompatibility.cs" />
Expand Down Expand Up @@ -176,7 +177,9 @@
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Properties\Localize.de.resx" />
<EmbeddedResource Include="Properties\Localize.de.resx">
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Localize.es.resx" />
<EmbeddedResource Include="Properties\Localize.fi.resx" />
<EmbeddedResource Include="Properties\Localize.fr.resx" />
Expand Down Expand Up @@ -254,7 +257,7 @@
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<ProjectExtensions>
<VisualStudio>
<UserProperties BuildVersion_BuildVersioningStyle="None.None.None.Increment" BuildVersion_BuildAction="Both" BuildVersion_StartDate="2000/1/1" BuildVersion_ConfigurationName="Beta Debug" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_UpdateFileVersion="True" />
<UserProperties BuildVersion_UpdateFileVersion="True" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_ConfigurationName="Beta Debug" BuildVersion_StartDate="2000/1/1" BuildVersion_BuildAction="Both" BuildVersion_BuildVersioningStyle="None.None.None.Increment" />
</VisualStudio>
</ProjectExtensions>
<PropertyGroup Condition="'$(Configuration)' == 'Stable Release' OR '$(Configuration)' == 'Stable Debug'">
Expand Down
211 changes: 119 additions & 92 deletions NodeControllerRenewal/Properties/Localize.Designer.cs

Large diffs are not rendered by default.

12 changes: 12 additions & 0 deletions NodeControllerRenewal/Properties/Localize.resx
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,9 @@ Backward compatibility does not provide the transfer of all data, may be require
<data name="Setting_ShortcutSetShiftBetweenIntersections" xml:space="preserve">
<value>Set shift between intersections</value>
</data>
<data name="Settings_ShortcutLaneEdit" xml:space="preserve">
<value>Set to lane edit mode</value>
</data>
<data name="Tool_InfoAlignMode" xml:space="preserve">
<value>Hold {0} to alignment roads</value>
</data>
Expand All @@ -345,6 +348,9 @@ Backward compatibility does not provide the transfer of all data, may be require
<data name="Tool_InfoChangeMainMode" xml:space="preserve">
<value>Hold {0} to change main slope direction</value>
</data>
<data name="Tool_InfoChangeMainMode" xml:space="preserve">
<value>Hold {0} see lane editing</value>
</data>
<data name="Tool_InfoClickNode" xml:space="preserve">
<value>Node #{0}
Click to edit</value>
Expand Down Expand Up @@ -396,4 +402,10 @@ Too close to nearby node</value>
<value>Hold {0} to
underground mode</value>
</data>
<data name="Tool_InfoLaneEdit" xml:space="preserve">
<value>Hold {0} to switch to lane editing mode</value>
</data>
<data name="Tool_InfoClickLaneInversion" xml:space="preserve">
<value>Click to inverse lane direction (full circle outgoing)</value>
</data>
</root>
4 changes: 3 additions & 1 deletion NodeControllerRenewal/Tool.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public class NodeControllerTool : BaseTool<Mod, NodeControllerTool, ToolModeType
public static NodeControllerShortcut ChangeNodeStyleShortcut { get; } = new NodeControllerShortcut(nameof(ChangeNodeStyleShortcut), nameof(Localize.Setting_ShortcutChangeNodeStyle), SavedInputKey.Empty, () => SingletonTool<NodeControllerTool>.Instance.ChangeNodeStyle());
public static NodeControllerShortcut ChangeMainRoadModeShortcut { get; } = new NodeControllerShortcut(nameof(ChangeMainRoadModeShortcut), nameof(Localize.Setting_ShortcutChangeMainRoadMode), SavedInputKey.Empty, () => SingletonTool<NodeControllerTool>.Instance.ChangeMainRoadMode());
public static NodeControllerShortcut SelectionStepOverShortcut { get; } = new NodeControllerShortcut(nameof(SelectionStepOverShortcut), nameof(CommonLocalize.Settings_ShortcutSelectionStepOver), SavedInputKey.Encode(KeyCode.Space, true, false, false), () => SingletonTool<NodeControllerTool>.Instance.SelectionStepOver(), ToolModeType.Select);

public static IEnumerable<Shortcut> ToolShortcuts
{
get
Expand Down Expand Up @@ -65,6 +65,7 @@ protected override IEnumerable<IToolMode<ToolModeType>> GetModes()
yield return CreateToolMode<RotateSegmentEndToolMode>();
yield return CreateToolMode<ChangeMainSlopeDirectionToolMode>();
yield return CreateToolMode<AlignSegmentEndsToolMode>();
yield return CreateToolMode<LaneEditMode>();
}

protected override void InitProcess()
Expand Down Expand Up @@ -244,6 +245,7 @@ public enum ToolModeType
Rotate = 16,
ChangeMain = 32,
Aling = 64,
LaneEdit = 128
}
public class NodeControllerShortcut : ToolShortcut<Mod, NodeControllerTool, ToolModeType>
{
Expand Down
2 changes: 1 addition & 1 deletion NodeControllerRenewal/ToolModes/AlignSegmentEnds.cs
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ public override void RenderOverlay(RenderManager.CameraInfo cameraInfo)
foreach (var segmentData in Tool.Data.SegmentEndDatas)
{
var defaultColor = new OverlayData(cameraInfo) { Color = segmentData.OverlayColor, RenderLimit = underground };
segmentData.RenderСontour(defaultColor);
segmentData.RenderContour(defaultColor);
segmentData.RenderEnd(defaultColor);
}

Expand Down
2 changes: 1 addition & 1 deletion NodeControllerRenewal/ToolModes/DragCorner.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public override void RenderOverlay(RenderManager.CameraInfo cameraInfo)
var forbidden = new OverlayData(cameraInfo) { Color = Colors.Red, RenderLimit = underground };

SegmentEnd[Corner].Render(allow, forbidden, allow);
SegmentEnd.RenderСontour(new OverlayData(cameraInfo) { Color = SegmentEnd.OverlayColor, RenderLimit = underground });
SegmentEnd.RenderContour(new OverlayData(cameraInfo) { Color = SegmentEnd.OverlayColor, RenderLimit = underground });
SegmentEnd.RenderEnd(new OverlayData(cameraInfo) { Color = SegmentEnd.OverlayColor, RenderLimit = underground });
SegmentEnd[Corner].RenderCircle(new OverlayData(cameraInfo) { Color = Colors.Yellow, RenderLimit = underground });
}
Expand Down
4 changes: 4 additions & 0 deletions NodeControllerRenewal/ToolModes/EditNode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ public override void OnToolUpdate()
Tool.SetMode(ToolModeType.ChangeMain);
else if (!Tool.Panel.IsHover && Utility.OnlyShiftIsPressed)
Tool.SetMode(ToolModeType.Aling);
else if (!Tool.Panel.IsHover && Utility.OnlyCtrlIsPressed)
Tool.SetMode(ToolModeType.LaneEdit);
else if (Tool.MouseRayValid && Tool.Data.IsMoveableEnds)
{
foreach (var segmentData in Tool.Data.SegmentEndDatas)
Expand Down Expand Up @@ -100,6 +102,8 @@ public override string GetToolInfo()
info.Add(string.Format(Localize.Tool_InfoAlignMode, LocalizeExtension.Shift.AddInfoColor()));
if (Tool.Data.IsJunction && Tool.Data.IsSlopeJunctions)
info.Add(string.Format(Localize.Tool_InfoChangeMainMode, LocalizeExtension.Alt.AddInfoColor()));
if (Tool.Data.IsJunction)
info.Add(string.Format(Localize.Tool_InfoLaneEdit, LocalizeExtension.Ctrl.AddInfoColor()));

return string.Join("\n", info.ToArray());
}
Expand Down
145 changes: 145 additions & 0 deletions NodeControllerRenewal/ToolModes/LaneChange.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
using ColossalFramework.Plugins;
using ModsCommon;
using ModsCommon.Utilities;
using System.Collections.Generic;
using UnityEngine;

namespace NodeController
{
public class LaneEditMode : NodeControllerToolMode
{
public override ToolModeType Type => ToolModeType.LaneEdit;
public override bool ShowPanel => false;

private SelectionInfo HoverLaneEnd { get; set; }
private bool IsHoverSegmentEnd => HoverLaneEnd != null;
private float Radius => SegmentEndData.CenterDotRadius + 0.5f;

public bool IsValid { get; private set; }

private class SelectionInfo
{
public ushort SegmentId;
public uint LaneId;
public int LaneIndex;
}

protected override void Reset(IToolMode prevMode)
{
HoverLaneEnd = null;
}
public override void OnToolUpdate()
{
if (!Utility.OnlyCtrlIsPressed)
Tool.SetDefaultMode();

else if (Tool.MouseRayValid)
{
var nodePosition = Tool.Data.GetPosition();

foreach (var segmentId in Tool.Data.SegmentIds)
{
var segment = segmentId.GetSegment();
var lanes = segment.GetLanes();

var i = 0;
foreach (var laneId in segment.GetLaneIds())
{
var lane = laneId.GetLane();
var direction = segment.Info.m_lanes[i].m_direction;

if (direction == NetInfo.Direction.Forward || direction == NetInfo.Direction.Backward)
{
lane.GetClosestPosition(nodePosition, out var position, out _);

var hitPos = Tool.Ray.GetRayPosition(nodePosition.y, out _);

if ((position - hitPos).sqrMagnitude < Radius * Radius)
{
HoverLaneEnd = new()
{
SegmentId = segmentId,
LaneId = laneId,
LaneIndex = i
};
return;
}
}
i++;
}
}
}

HoverLaneEnd = null;
}
public override void OnMouseDown(Event e)
{
// TODO MOVE OF LANE
}
public override void OnMouseUp(Event e)
{
// TODO MOVE OF LANE
}
public override void OnPrimaryMouseClicked(Event e)
{
if (IsHoverSegmentEnd)
{
ref var segment = ref HoverLaneEnd.SegmentId.GetSegment();
ref var lane = ref HoverLaneEnd.LaneId.GetLane();
ref var flags = ref lane.m_flags;

flags = (ushort)(flags & ~(ushort)NetLane.Flags.Forward);
if ((flags & (int)NetLane.Flags.Forward) != 0)
flags = (ushort)(flags & ~(ushort)NetLane.Flags.Forward);
else
flags = (ushort)(flags | (ushort)NetLane.Flags.Forward);

segment.UpdateLanes(HoverLaneEnd.SegmentId, true);
}
}

public override void OnSecondaryMouseClicked()
{
Tool.SetDefaultMode();
}

public override string GetToolInfo()
{
return Localize.Tool_InfoClickLaneInversion;
}
public override void RenderOverlay(RenderManager.CameraInfo cameraInfo)
{
var underground = IsUnderground;
var nodePosition = Tool.Data.GetPosition();
var i = 0; // cycling index of lane colors
var iMax = SegmentEndData.OverlayColors.Length;

foreach (var segmentId in Tool.Data.SegmentIds)
{
var segment = segmentId.GetSegment();
var laneIdx = 0;
foreach (var laneId in segment.GetLaneIds())
{
var lane = laneId.GetLane();
var direction = segment.Info.m_lanes[laneIdx].m_direction;
var outgoing = direction == NetInfo.Direction.Forward || (direction == NetInfo.Direction.Backward && segment.IsInvert());
var both = direction == NetInfo.Direction.Both || direction == NetInfo.Direction.None;
lane.GetClosestPosition(nodePosition, out var position, out _);

if (!both)
position.RenderCircle(
new OverlayData(cameraInfo) { Color = SegmentEndData.OverlayColors[i++], RenderLimit = underground },
1.5f, outgoing ? 0.0f : 1.0f);

if (!both && HoverLaneEnd?.LaneId == laneId)
position.RenderCircle(
new OverlayData(cameraInfo) { Color = Color.white, RenderLimit = underground },
2.5f, 2.0f);

if (iMax == i) i = 0;
laneIdx++;
}
}
}
}
}
10 changes: 10 additions & 0 deletions Výstup-Sestavení.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
Zahájilo se sestavování...
1>------ Sestavování zahájeno: Projekt: NodeControllerRenewal, Konfigurace: Beta Debug Any CPU ------
1>S:\git\NodeController30\ModsCommon\TrajectoryShared\Trajectory.cs(174,18,174,36): warning CS0659: StraightTrajectory přepisuje Object.Equals(object o), ale nepřepisuje Object.GetHashCode().
1>S:\git\NodeController30\ModsCommon\TrajectoryShared\Trajectory.cs(174,18,174,36): warning CS0661: StraightTrajectory definuje operátor == nebo !=, ale nepřepisuje funkci Object.GetHashCode().
1>S:\git\NodeController30\ModsCommon\TrajectoryShared\Trajectory.cs(36,18,36,34): warning CS0659: BezierTrajectory přepisuje Object.Equals(object o), ale nepřepisuje Object.GetHashCode().
1>S:\git\NodeController30\ModsCommon\TrajectoryShared\Trajectory.cs(36,18,36,34): warning CS0661: BezierTrajectory definuje operátor == nebo !=, ale nepřepisuje funkci Object.GetHashCode().
1>S:\git\NodeController30\ModsCommon\DependencyShared\DependenciesWatcher.cs(162,34,162,40): warning CS8509: Výraz switch nezachycuje všechny možné hodnoty vstupního typu (není úplný). Nezachycuje například vzor ModsCommon.Utilities.DependenciesWatcher.WatcherState.Valid.
1> NodeControllerRenewal -> S:\git\NodeController30\NodeControllerRenewal\bin\Beta Debug\NodeController.dll
1> AfterBuild event C:\Users\Phanteks\AppData\Local\Colossal Order\Cities_Skylines\Addons\Mods\NodeControllerRenewalBeta C:\Program Files (x86)\Steam\steamapps\workshop\content\255710\2462845270
========== Sestavení: 1 úspěšně, 0 se nezdařilo, 0 aktuální, 0 přeskočeno ==========