using System.Collections.Generic; using GeometryTD.Definition; using GeometryTD.Procedure; namespace GeometryTD.Factory { public static class RunStateFactory { public static RunState CreateFixedRun( LevelThemeType themeType, BackpackInventoryData initialInventorySnapshot, string runId = null, int runSeed = 0) { IReadOnlyList fixedNodeSeeds = FixedRunNodeSequenceBuilder.Build(themeType); return Create(themeType, initialInventorySnapshot, fixedNodeSeeds, runId, runSeed); } public static RunState Create( LevelThemeType themeType, BackpackInventoryData initialInventorySnapshot, IEnumerable nodeSeeds, string runId = null, int runSeed = 0) { List nodes = new List(); if (nodeSeeds != null) { int sequenceIndex = 0; foreach (RunNodeSeed seed in nodeSeeds) { if (seed == null) { continue; } nodes.Add(new RunNodeState { NodeId = seed.NodeId > 0 ? seed.NodeId : sequenceIndex + 1, NodeType = seed.NodeType, ThemeType = seed.ThemeType == LevelThemeType.None ? themeType : seed.ThemeType, LinkedLevelId = seed.LinkedLevelId, SequenceIndex = seed.SequenceIndex >= 0 ? seed.SequenceIndex : sequenceIndex, Status = sequenceIndex == 0 ? RunNodeStatus.Available : RunNodeStatus.Locked }); sequenceIndex++; } } return new RunState(runId, runSeed, themeType, nodes, initialInventorySnapshot); } public static int CreateRunSeed() { int seed = System.Guid.NewGuid().GetHashCode(); return seed == 0 ? 1 : seed; } } }