using System; using System.Collections.Generic; namespace GeometryTD.Core { public enum RunNodeType { None = 0, Combat = 1, Event = 2, Shop = 3, BossCombat = 4 } public enum RunNodeCompletionStatus { None = 0, Completed = 1, Exception = 2 } [Serializable] public sealed class RunItemState { public int ItemId { get; set; } public int StackCount { get; set; } public RunItemState Clone() { return new RunItemState { ItemId = ItemId, StackCount = StackCount }; } } [Serializable] public sealed class RunNodeExecutionContext { public string RunId { get; set; } public int RunSeed { get; set; } public int NodeId { get; set; } public RunNodeType NodeType { get; set; } public int SequenceIndex { get; set; } public LevelThemeType ThemeType { get; set; } public int ThemeStageIndex { get; set; } public List CurrentThemePool { get; set; } = new List(); public List ThemeHistory { get; set; } = new List(); public int CurrentNodeContinueChallengeLayer { get; set; } public List RunItems { get; set; } = new List(); public RunNodeExecutionContext Clone() { return new RunNodeExecutionContext { RunId = RunId, RunSeed = RunSeed, NodeId = NodeId, NodeType = NodeType, SequenceIndex = SequenceIndex, ThemeType = ThemeType, ThemeStageIndex = ThemeStageIndex, CurrentThemePool = RunStateCloneUtility.CloneThemeList(CurrentThemePool), ThemeHistory = RunStateCloneUtility.CloneThemeList(ThemeHistory), CurrentNodeContinueChallengeLayer = CurrentNodeContinueChallengeLayer, RunItems = RunStateCloneUtility.CloneRunItems(RunItems) }; } public RunNodeCompletionSnapshot CreateCompletionSnapshot(BackpackInventoryData inventorySnapshot) { return new RunNodeCompletionSnapshot { InventorySnapshot = InventoryCloneUtility.CloneInventory(inventorySnapshot), ThemeType = ThemeType, ThemeStageIndex = ThemeStageIndex, CurrentThemePool = RunStateCloneUtility.CloneThemeList(CurrentThemePool), ThemeHistory = RunStateCloneUtility.CloneThemeList(ThemeHistory), CurrentNodeContinueChallengeLayer = CurrentNodeContinueChallengeLayer, RunItems = RunStateCloneUtility.CloneRunItems(RunItems) }; } } [Serializable] public sealed class RunNodeCompletionSnapshot { public BackpackInventoryData InventorySnapshot { get; set; } public LevelThemeType ThemeType { get; set; } public int ThemeStageIndex { get; set; } public List CurrentThemePool { get; set; } = new List(); public List ThemeHistory { get; set; } = new List(); public int CurrentNodeContinueChallengeLayer { get; set; } public List RunItems { get; set; } = new List(); public RunNodeCompletionSnapshot Clone() { return new RunNodeCompletionSnapshot { InventorySnapshot = InventoryCloneUtility.CloneInventory(InventorySnapshot), ThemeType = ThemeType, ThemeStageIndex = ThemeStageIndex, CurrentThemePool = RunStateCloneUtility.CloneThemeList(CurrentThemePool), ThemeHistory = RunStateCloneUtility.CloneThemeList(ThemeHistory), CurrentNodeContinueChallengeLayer = CurrentNodeContinueChallengeLayer, RunItems = RunStateCloneUtility.CloneRunItems(RunItems) }; } } public static class RunStateCloneUtility { public static List CloneThemeList(IReadOnlyList source) { List cloned = new List(); if (source == null) { return cloned; } for (int i = 0; i < source.Count; i++) { cloned.Add(source[i]); } return cloned; } public static List CloneRunItems(IReadOnlyList source) { List cloned = new List(); if (source == null) { return cloned; } for (int i = 0; i < source.Count; i++) { RunItemState item = source[i]; if (item != null) { cloned.Add(item.Clone()); } } return cloned; } } }