Skip to content

Commit 080f448

Browse files
author
BuildTools
committed
Added Navigation feature (needs improvement)
1 parent eedcd4b commit 080f448

9 files changed

Lines changed: 625 additions & 33 deletions

File tree

TsMap.Canvas/SetupForm.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ public SetupForm()
1010
InitializeComponent();
1111
folderBrowserDialog1.Description = "Please select the game directory\nE.g. D:/Games/steamapps/common/Euro Truck Simulator 2/";
1212
folderBrowserDialog1.ShowNewFolderButton = false;
13+
// Being bored of putting always my game directory for testing
14+
label1.Text = "Auto selected path (C:/Program Files (x86)/Steam/SteamApps/common/Euro Truck Simulator 2)";
15+
folderBrowserDialog1.SelectedPath = "C:/Program Files (x86)/Steam/SteamApps/common/Euro Truck Simulator 2";
16+
NextBtn.Enabled = true;
1317
}
1418

1519
private void BrowseBtn_Click(object sender, EventArgs e)

TsMap.Canvas/SimpleMapPalette.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@ public SimpleMapPalette()
1212
PrefabLight = new SolidBrush(Color.FromArgb(236, 203, 153));
1313
PrefabDark = new SolidBrush(Color.FromArgb(225, 163, 56));
1414
PrefabGreen = new SolidBrush(Color.FromArgb(170, 203, 150)); // TODO: Check if green has a specific z-index
15-
15+
1616
CityName = Brushes.LightCoral;
1717

1818
FerryLines = new SolidBrush(Color.FromArgb(80, 255, 255, 255));
1919

2020
Error = Brushes.LightCoral;
21+
22+
NavColor = new SolidBrush(Color.Red);
2123
}
2224
}
2325
}

TsMap/MapPalette.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,5 +48,10 @@ public class MapPalette
4848
/// Brush for error text
4949
/// </summary>
5050
public Brush Error;
51+
52+
/// <summary>
53+
/// Selected road/prefab for navigation
54+
/// </summary>
55+
public Brush NavColor;
5156
}
5257
}

TsMap/TsItem.cs

Lines changed: 55 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ public class TsItem
1313

1414
protected readonly TsSector Sector;
1515
public ulong Uid { get; }
16-
protected ulong StartNodeUid;
17-
protected ulong EndNodeUid;
18-
protected TsNode StartNode;
19-
protected TsNode EndNode;
16+
public ulong StartNodeUid;
17+
public ulong EndNodeUid;
18+
public TsNode StartNode;
19+
public TsNode EndNode;
2020

2121
public List<ulong> Nodes { get; protected set; }
2222

@@ -111,11 +111,14 @@ public class TsPrefabItem : TsItem
111111
private const int PrefabVegetaionBlockSize = 0x20;
112112
public int Origin { get; }
113113
public TsPrefab Prefab { get; }
114+
115+
public Dictionary<TsPrefabItem, Tuple<float, List<TsItem>>> Navigation {get;set;}
114116

115117
public TsPrefabItem(TsSector sector, int startOffset) : base(sector, startOffset)
116118
{
117119
Valid = true;
118120
Nodes = new List<ulong>();
121+
Navigation = new Dictionary<TsPrefabItem, Tuple<float, List<TsItem>>>();
119122
var fileOffset = startOffset + 0x34; // Set position at start of flags
120123

121124
Hidden = (Sector.Stream[fileOffset += 0x02] & 0x02) != 0;
@@ -165,6 +168,54 @@ public TsPrefabItem(TsSector sector, int startOffset) : base(sector, startOffset
165168

166169
BlockSize = fileOffset - startOffset;
167170
}
171+
172+
public TsPrefabNode GetNearestNode(TsMapper _mapper,TsNode item,int mode) {
173+
// Mode: 0 -> Only Input Points ; 1 -> Only Output Points ; whatever else -> All Points
174+
TsPrefabNode node = default(TsPrefabNode);
175+
node.id = -1;
176+
float min = float.MaxValue;
177+
var originNode = _mapper.GetNodeByUid(this.Nodes[0]);
178+
var mapPointOrigin = this.Prefab.PrefabNodes[this.Origin];
179+
var prefabStartX = originNode.X - mapPointOrigin.X;
180+
var prefabStartZ = originNode.Z - mapPointOrigin.Z;
181+
var rot = (float)(originNode.Rotation - Math.PI - Math.Atan2(mapPointOrigin.RotZ, mapPointOrigin.RotX) + Math.PI / 2);
182+
foreach (var nod in this.Prefab.PrefabNodes)
183+
{
184+
if (nod.InputPoints.Count <= 0 && mode == 0) continue;
185+
if (nod.OutputPoints.Count <= 0 && mode == 1) continue;
186+
var newPoint = TsMapRenderer.RotatePoint(prefabStartX + nod.X, prefabStartZ + nod.Z, rot, originNode.X, originNode.Z);
187+
float dist = (float)Math.Sqrt(Math.Pow(item.X - (newPoint.X), 2) + Math.Pow(item.Z - (newPoint.Y), 2));
188+
if (dist < min && dist < 0.2) {
189+
node = nod;
190+
min = dist;
191+
}
192+
}
193+
return node;
194+
}
195+
196+
public TsNode NodeIteminPrefab(TsMapper _mapper,TsItem item) {
197+
foreach (var nodePId in this.Nodes) {
198+
var nodeP = _mapper.GetNodeByUid(nodePId);
199+
if (nodeP.ForwardItem == item) return nodeP;
200+
if (nodeP.BackwardItem == item) return nodeP;
201+
}
202+
return null;
203+
}
204+
205+
public List<Tuple<TsNode,TsPrefabItem>> NodePrefabinPrefab(TsMapper _mapper) {
206+
List<Tuple<TsNode,TsPrefabItem>> prefabs = new List<Tuple<TsNode,TsPrefabItem>>();
207+
foreach (var nodePId in this.Nodes) {
208+
var nodeP = _mapper.GetNodeByUid(nodePId);
209+
if (nodeP.ForwardItem != null && nodeP.ForwardItem.Type == TsItemType.Prefab && nodeP.ForwardItem != this) prefabs.Add(new Tuple<TsNode,TsPrefabItem>(nodeP,(TsPrefabItem)nodeP.ForwardItem));
210+
if (nodeP.BackwardItem != null && nodeP.BackwardItem.Type == TsItemType.Prefab && nodeP.BackwardItem != this) prefabs.Add(new Tuple<TsNode,TsPrefabItem>(nodeP,(TsPrefabItem)nodeP.BackwardItem));
211+
}
212+
return prefabs;
213+
}
214+
215+
// Can be useful for A* Algorithm
216+
public float HeuristicDistance(TsItem item) {
217+
return Math.Abs(this.X - item.X) + Math.Abs(this.Z - item.Z);
218+
}
168219
}
169220

170221
public class TsCompanyItem : TsItem

TsMap/TsMapRenderer.cs

Lines changed: 51 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public TsMapRenderer(TsMapper mapper, MapPalette palette)
1717
_palette = palette;
1818
}
1919

20-
private static PointF RotatePoint(float x, float z, float angle, float rotX, float rotZ)
20+
public static PointF RotatePoint(float x, float z, float angle, float rotX, float rotZ)
2121
{
2222
var s = Math.Sin(angle);
2323
var c = Math.Cos(angle);
@@ -159,33 +159,60 @@ public void Render(Graphics g, Rectangle clip, float baseScale, PointF pos)
159159
drawingQueue.Add(prefabLook);
160160
continue;
161161
}
162-
162+
// This part is now made by prefab curves
163+
/*
163164
foreach (var neighbourPointIndex in mapPoint.Neighbours) // TODO: Fix connection between road segments
164165
{
165-
if (pointsDrawn.Contains(neighbourPointIndex)) continue;
166-
var neighbourPoint = prefabItem.Prefab.MapPoints[neighbourPointIndex];
166+
if (pointsDrawn.Contains(neighbourPointIndex)) continue;
167+
var neighbourPoint = prefabItem.Prefab.MapPoints[neighbourPointIndex];
167168
168-
if ((mapPoint.Hidden || neighbourPoint.Hidden) && prefabItem.Prefab.PrefabNodes.Count + 1 <
169-
prefabItem.Prefab.MapPoints.Count) continue;
169+
if ((mapPoint.Hidden || neighbourPoint.Hidden) && prefabItem.Prefab.PrefabNodes.Count + 1 <
170+
prefabItem.Prefab.MapPoints.Count) continue;
170171
171-
var newPointStart = RotatePoint(prefabStartX + mapPoint.X,
172-
prefabStartZ + mapPoint.Z, rot, originNode.X, originNode.Z);
172+
var newPointStart = RotatePoint(prefabStartX + mapPoint.X,
173+
prefabStartZ + mapPoint.Z, rot, originNode.X, originNode.Z);
173174
174-
var newPointEnd = RotatePoint(prefabStartX + neighbourPoint.X,
175-
prefabStartZ + neighbourPoint.Z, rot, originNode.X, originNode.Z);
176-
177-
TsPrefabLook prefabLook = new TsPrefabRoadLook()
178-
{
179-
Color = _palette.PrefabRoad,
180-
ZIndex = 4,
181-
Width = 10f * scaleX,
182-
};
175+
var newPointEnd = RotatePoint(prefabStartX + neighbourPoint.X,
176+
prefabStartZ + neighbourPoint.Z, rot, originNode.X, originNode.Z);
177+
178+
TsPrefabLook prefabLook = new TsPrefabRoadLook()
179+
{
180+
Color = _palette.PrefabRoad,
181+
ZIndex = 4,
182+
Width = 10f * scaleX,
183+
};
183184
184-
prefabLook.AddPoint((newPointStart.X - startX) * scaleX, (newPointStart.Y - startY) * scaleY);
185-
prefabLook.AddPoint((newPointEnd.X - startX) * scaleX, (newPointEnd.Y - startY) * scaleY);
185+
prefabLook.AddPoint((newPointStart.X - startX) * scaleX, (newPointStart.Y - startY) * scaleY);
186+
prefabLook.AddPoint((newPointEnd.X - startX) * scaleX, (newPointEnd.Y - startY) * scaleY);
186187
187-
drawingQueue.Add(prefabLook);
188+
drawingQueue.Add(prefabLook);
188189
}
190+
*/
191+
}
192+
193+
for (int i = 0; i < prefabItem.Prefab.PrefabCurves.Count; i++)
194+
{
195+
var newPointStart = RotatePoint(prefabStartX + prefabItem.Prefab.PrefabCurves[i].start_X, prefabStartZ + prefabItem.Prefab.PrefabCurves[i].start_Z, rot, originNode.X, originNode.Z);
196+
var newPointEnd = RotatePoint(prefabStartX + prefabItem.Prefab.PrefabCurves[i].end_X, prefabStartZ + prefabItem.Prefab.PrefabCurves[i].end_Z, rot, originNode.X, originNode.Z);
197+
var color = _palette.PrefabRoad;
198+
var zind = 4;
199+
200+
if ((_mapper.PrefabNav.ContainsKey(prefabItem) && _mapper.PrefabNav.ContainsKey(prefabItem) && _mapper.PrefabNav[prefabItem].Contains(prefabItem.Prefab.PrefabCurves[i])) || _mapper.RoutePrefabs.Contains(prefabItem)) {
201+
color = _palette.NavColor;
202+
zind = 1000;
203+
}
204+
205+
TsPrefabLook prefabLook = new TsPrefabRoadLook()
206+
{
207+
Color = color,
208+
Width = 10f * scaleX,
209+
ZIndex = zind
210+
};
211+
212+
prefabLook.AddPoint((newPointStart.X - startX) * scaleX, (newPointStart.Y - startY) * scaleY);
213+
prefabLook.AddPoint((newPointEnd.X - startX) * scaleX, (newPointEnd.Y - startY) * scaleY);
214+
215+
drawingQueue.Add(prefabLook);
189216
}
190217
}
191218

@@ -240,7 +267,10 @@ public void Render(Graphics g, Rectangle clip, float baseScale, PointF pos)
240267

241268
var roadWidth = road.RoadLook.GetWidth() * scaleX;
242269

243-
g.DrawCurve(new Pen(_palette.Road, roadWidth), points.ToArray());
270+
var color = _palette.Road;
271+
if (_mapper.RouteRoads.Contains(road)) color = _palette.NavColor;
272+
273+
g.DrawCurve(new Pen(color, roadWidth), points.ToArray());
244274
}
245275

246276

0 commit comments

Comments
 (0)