private static void InitializeRailLibrary() { if (RailInitialized) { return; } RailInitialized = true; RailPieces = FileUtils.LoadJsonListFromMultipleSources <RailPiece>(ContentPaths.rail_pieces, null, p => p.Name); RailPatterns = FileUtils.LoadJsonListFromMultipleSources <JunctionPattern>(ContentPaths.rail_patterns, null, p => p.Name); RailCombinationTable = new CombinationTable(); RailCombinationTable.LoadConfiguration(ContentPaths.rail_combinations); foreach (var piece in RailPieces) { piece.ComputeConnections(); } for (var i = 0; i < RailPatterns.Count; ++i) { RailPatterns[i].Icon = i; } RailChainPatterns = RailPatterns // Only pieces with well defined entrance and exits can be used in chains. .Where(p => p.Entrance != null && p.Exit != null) // We need them in every orientation - not worried about redundancies. .SelectMany(p => { return(new JunctionPattern[] { p.Rotate(PieceOrientation.North), p.Rotate(PieceOrientation.East), p.Rotate(PieceOrientation.South), p.Rotate(PieceOrientation.West) }); }) // We need them with the endpoints switched as well. .SelectMany(p => { return(new JunctionPattern[] { p, new JunctionPattern { Pieces = p.Pieces, Entrance = p.Exit, Exit = p.Entrance, } }); }) // And they must be positioned so the entrance is at 0,0 .Select(p => { if (p.Entrance.Offset.X == 0 && p.Entrance.Offset.Y == 0) { return(p); } else { return new JunctionPattern { Entrance = new JunctionPortal { Direction = p.Entrance.Direction, Offset = Point.Zero }, Exit = new JunctionPortal { Direction = p.Exit.Direction, Offset = new Point(p.Exit.Offset.X - p.Entrance.Offset.X, p.Exit.Offset.Y - p.Entrance.Offset.Y) }, Pieces = p.Pieces.Select(piece => new JunctionPiece { RailPiece = piece.RailPiece, Orientation = piece.Orientation, Offset = new Point(piece.Offset.X - p.Entrance.Offset.X, piece.Offset.Y - p.Entrance.Offset.Y) }).ToList(), } }; }) .ToList(); Console.WriteLine("Loaded Rail Library."); }
// Use this for initialization void Start () { table = this.GetComponentInParent<CombinationTable>(); }