Skip to content

Commit

Permalink
1.9.0-alpha2
Browse files Browse the repository at this point in the history
  • Loading branch information
VictorPhilipp committed Apr 15, 2017
1 parent c604666 commit c815ac1
Show file tree
Hide file tree
Showing 118 changed files with 4,510 additions and 1,483 deletions.
76 changes: 76 additions & 0 deletions TLM/CitiesGameBridge/CitiesGameBridge.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{3F2F7926-5D51-4880-A2B7-4594A10D7E54}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>CitiesGameBridge</RootNamespace>
<AssemblyName>CitiesGameBridge</AssemblyName>
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Assembly-CSharp">
<HintPath>..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Cities_Skylines\Cities_Data\Managed\Assembly-CSharp.dll</HintPath>
</Reference>
<Reference Include="ColossalManaged">
<HintPath>..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Cities_Skylines\Cities_Data\Managed\ColossalManaged.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
<Reference Include="UnityEngine">
<HintPath>..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Cities_Skylines\Cities_Data\Managed\UnityEngine.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Factory\ServiceFactory.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Service\NetService.cs" />
<Compile Include="Service\SimulationService.cs" />
<Compile Include="Service\VehicleService.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\GenericGameBridge\GenericGameBridge.csproj">
<Project>{663B991F-32A1-46E1-A4D3-540F8EA7F386}</Project>
<Name>GenericGameBridge</Name>
</ProjectReference>
<ProjectReference Include="..\Util\Util.csproj">
<Project>{D3ADE06E-F493-4819-865A-3BB44FEEDF01}</Project>
<Name>Util</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
36 changes: 36 additions & 0 deletions TLM/CitiesGameBridge/Factory/ServiceFactory.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using GenericGameBridge.Factory;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using GenericGameBridge.Service;
using CitiesGameBridge.Service;

namespace CitiesGameBridge.Factory {
public class ServiceFactory : IServiceFactory {
public static readonly IServiceFactory Instance = new ServiceFactory();

private ServiceFactory() {

}

public INetService NetService {
get {
return Service.NetService.Instance;
}
}

public ISimulationService SimulationService {
get {
return Service.SimulationService.Instance;
}
}

public IVehicleService VehicleService {
get {
return Service.VehicleService.Instance;
}
}
}
}
36 changes: 36 additions & 0 deletions TLM/CitiesGameBridge/Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("CitiesGameBridge")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("CitiesGameBridge")]
[assembly: AssemblyCopyright("Copyright © 2017")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]

// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("3f2f7926-5d51-4880-a2b7-4594a10d7e54")]

// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
104 changes: 58 additions & 46 deletions TLM/TLM/Util/NetUtil.cs → TLM/CitiesGameBridge/Service/NetService.cs
Original file line number Diff line number Diff line change
@@ -1,74 +1,99 @@
using ColossalFramework;
using GenericGameBridge.Service;
using System;
using System.Collections.Generic;
using System.Text;
using TrafficManager.Manager;

namespace TrafficManager.Util {
// TODO Make separate classes for segments, nodes, lanes, etc. and create an abstraction layer for game interfacing utilities
public static class NetUtil {
public delegate void NetSegmentHandler(ushort segmentId, ref NetSegment segment);
public delegate void NetNodeHandler(ushort nodeId, ref NetNode node);
public delegate void NetLaneHandler(uint laneId, ref NetLane lane);
public delegate void NetSegmentLaneHandler(uint laneId, ref NetLane lane, NetInfo.Lane laneInfo, ushort segmentId, ref NetSegment segment, byte laneIndex);

public static bool IsSegmentValid(ushort segmentId) {
using Util;

namespace CitiesGameBridge.Service {
public class NetService : INetService {
public static readonly INetService Instance = new NetService();

private NetService() {

}

public bool IsSegmentValid(ushort segmentId) {
return CheckSegmentFlags(segmentId, NetSegment.Flags.Created | NetSegment.Flags.Deleted, NetSegment.Flags.Created);
}

public static void ProcessSegment(ushort segmentId, NetSegmentHandler handler) {
public void ProcessSegment(ushort segmentId, NetSegmentHandler handler) {
ProcessSegment(segmentId, ref Singleton<NetManager>.instance.m_segments.m_buffer[segmentId], handler);
}

public static void ProcessSegment(ushort segmentId, ref NetSegment segment, NetSegmentHandler handler) {
public void ProcessSegment(ushort segmentId, ref NetSegment segment, NetSegmentHandler handler) {
handler(segmentId, ref segment);
}

public static bool IsNodeValid(ushort nodeId) {
public bool IsNodeValid(ushort nodeId) {
return CheckNodeFlags(nodeId, NetNode.Flags.Created | NetNode.Flags.Deleted, NetNode.Flags.Created);
}

public static void ProcessNode(ushort nodeId, NetNodeHandler handler) {
public void ProcessNode(ushort nodeId, NetNodeHandler handler) {
ProcessNode(nodeId, ref Singleton<NetManager>.instance.m_nodes.m_buffer[nodeId], handler);
}

public static void ProcessNode(ushort nodeId, ref NetNode node, NetNodeHandler handler) {
public void ProcessNode(ushort nodeId, ref NetNode node, NetNodeHandler handler) {
handler(nodeId, ref node);
}

[Obsolete]
static bool IsLaneValid(ref NetLane lane) {
bool IsLaneValid(ref NetLane lane) {
if ((lane.m_flags & (uint)(NetLane.Flags.Created | NetLane.Flags.Deleted)) != (uint)NetLane.Flags.Created) {
return false;
}
return IsSegmentValid(lane.m_segment);
}

public static bool IsLaneValid(uint laneId) {
public bool IsLaneValid(uint laneId) {
if (!CheckLaneFlags(laneId, NetLane.Flags.Created | NetLane.Flags.Deleted, NetLane.Flags.Created)) {
return false;
}

bool ret = false;
ProcessLane(laneId, delegate(uint lId, ref NetLane lane) {
ret = IsSegmentValid(lane.m_segment);
return true;
});
return ret;
}

public static void ProcessLane(uint laneId, NetLaneHandler handler) {
public void ProcessLane(uint laneId, NetLaneHandler handler) {
ProcessLane(laneId, ref Singleton<NetManager>.instance.m_lanes.m_buffer[laneId], handler);
}

public static void ProcessLane(uint laneId, ref NetLane lane, NetLaneHandler handler) {
public void ProcessLane(uint laneId, ref NetLane lane, NetLaneHandler handler) {
handler(laneId, ref lane);
}

public static void IterateSegmentLanes(ushort segmentId, NetSegmentLaneHandler handler) {
public ushort GetSegmentNodeId(ushort segmentId, bool startNode) {
ushort nodeId = 0;
ProcessSegment(segmentId, delegate(ushort segId, ref NetSegment segment) {
nodeId = startNode ? segment.m_startNode : segment.m_endNode;
return true;
});
return nodeId;
}

public void IterateNodeSegments(ushort nodeId, NetSegmentHandler handler) {
ProcessNode(nodeId, delegate (ushort nId, ref NetNode node) {
for (byte s = 0; s < 8; s++) {
ushort segmentId = node.GetSegment(s);
if (segmentId <= 0)
continue;

if (! handler(segmentId, ref Singleton<NetManager>.instance.m_segments.m_buffer[segmentId])) {
break;
}
}
return true;
});
}

public void IterateSegmentLanes(ushort segmentId, NetSegmentLaneHandler handler) {
IterateSegmentLanes(segmentId, ref Singleton<NetManager>.instance.m_segments.m_buffer[segmentId], handler);
}

public static void IterateSegmentLanes(ushort segmentId, ref NetSegment segment, NetSegmentLaneHandler handler) {
public void IterateSegmentLanes(ushort segmentId, ref NetSegment segment, NetSegmentLaneHandler handler) {
NetInfo segmentInfo = segment.Info;
if (segmentInfo == null)
return;
Expand All @@ -84,60 +109,47 @@ public static void IterateSegmentLanes(ushort segmentId, ref NetSegment segment,
}
}

public static NetInfo.Direction GetSegmentEndDirection(ushort segmentId, bool startNode) {
public NetInfo.Direction GetSegmentEndDirection(ushort segmentId, bool startNode) {
return GetSegmentEndDirection(segmentId, ref Singleton<NetManager>.instance.m_segments.m_buffer[segmentId], startNode);
}

public static NetInfo.Direction GetSegmentEndDirection(ushort segmentId, ref NetSegment segment, bool startNode) {
public NetInfo.Direction GetSegmentEndDirection(ushort segmentId, ref NetSegment segment, bool startNode) {
NetInfo segmentInfo = segment.Info;

var dir = startNode ? NetInfo.Direction.Backward : NetInfo.Direction.Forward;
if ((segment.m_flags & NetSegment.Flags.Invert) != NetSegment.Flags.None ^ TrafficPriorityManager.IsLeftHandDrive())
if ((segment.m_flags & NetSegment.Flags.Invert) != NetSegment.Flags.None ^ SimulationService.Instance.LeftHandDrive)
dir = NetInfo.InvertDirection(dir);

return dir;
}

public static bool CheckNodeFlags(ushort nodeId, NetNode.Flags flagMask, NetNode.Flags? expectedResult=null) {
public bool CheckNodeFlags(ushort nodeId, NetNode.Flags flagMask, NetNode.Flags? expectedResult=null) {
bool ret = false;
ProcessNode(nodeId, delegate (ushort nId, ref NetNode node) {
ret = LogicUtil.CheckFlags((uint)node.m_flags, (uint)flagMask, (uint?)expectedResult);
return true;
});
return ret;
}

public static bool CheckSegmentFlags(ushort segmentId, NetSegment.Flags flagMask, NetSegment.Flags? expectedResult=null) {
public bool CheckSegmentFlags(ushort segmentId, NetSegment.Flags flagMask, NetSegment.Flags? expectedResult=null) {
bool ret = false;
ProcessSegment(segmentId, delegate (ushort sId, ref NetSegment segment) {
ret = LogicUtil.CheckFlags((uint)segment.m_flags, (uint)flagMask, (uint?)expectedResult);
return true;
});
return ret;
}

public static bool CheckLaneFlags(uint laneId, NetLane.Flags flagMask, NetLane.Flags? expectedResult=null) {
public bool CheckLaneFlags(uint laneId, NetLane.Flags flagMask, NetLane.Flags? expectedResult=null) {
bool ret = false;
ProcessLane(laneId, delegate (uint lId, ref NetLane lane) {
ret = LogicUtil.CheckFlags((uint)lane.m_flags, (uint)flagMask, (uint?)expectedResult);
return true;
});
return ret;
}

public struct LanePos {
public uint laneId;
public byte laneIndex;
public float position;
public VehicleInfo.VehicleType vehicleType;
public NetInfo.LaneType laneType;

public LanePos(uint laneId, byte laneIndex, float position, VehicleInfo.VehicleType vehicleType, NetInfo.LaneType laneType) {
this.laneId = laneId;
this.laneIndex = laneIndex;
this.position = position;
this.vehicleType = vehicleType;
this.laneType = laneType;
}
}

/// <summary>
/// Assembles a geometrically sorted list of lanes for the given segment.
/// If the <paramref name="startNode"/> parameter is set only lanes supporting traffic to flow towards the given node are added to the list, otherwise all matched lanes are added.
Expand All @@ -149,7 +161,7 @@ public LanePos(uint laneId, byte laneIndex, float position, VehicleInfo.VehicleT
/// <param name="vehicleTypeFilter">vehicle type filter, lanes must match this filter mask</param>
/// <param name="reverse">if true, lanes are ordered from right to left (relative to the segment's start node / the given node), otherwise from left to right</param>
/// <returns>sorted list of lanes for the given segment</returns>
public static IList<LanePos> GetSortedVehicleLanes(ushort segmentId, ref NetSegment segment, bool? startNode, NetInfo.LaneType? laneTypeFilter = null, VehicleInfo.VehicleType? vehicleTypeFilter = null, bool reverse = false) { // TODO refactor together with getSegmentNumVehicleLanes, especially the vehicle type and lane type checks
public IList<LanePos> GetSortedVehicleLanes(ushort segmentId, ref NetSegment segment, bool? startNode, NetInfo.LaneType? laneTypeFilter = null, VehicleInfo.VehicleType? vehicleTypeFilter = null, bool reverse = false) { // TODO refactor together with getSegmentNumVehicleLanes, especially the vehicle type and lane type checks
NetManager netManager = Singleton<NetManager>.instance;
var laneList = new List<LanePos>();

Expand Down
29 changes: 29 additions & 0 deletions TLM/CitiesGameBridge/Service/SimulationService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using ColossalFramework;
using GenericGameBridge.Service;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CitiesGameBridge.Service {
public class SimulationService : ISimulationService {
public static readonly ISimulationService Instance = new SimulationService();

private SimulationService() {

}

public bool LeftHandDrive {
get {
return Singleton<SimulationManager>.instance.m_metaData.m_invertTraffic == SimulationMetaData.MetaBool.True;
}
}

public uint CurrentFrameIndex {
get {
return Singleton<SimulationManager>.instance.m_currentFrameIndex;
}
}
}
}
Loading

0 comments on commit c815ac1

Please sign in to comment.