151 lines
5.1 KiB
C#
151 lines
5.1 KiB
C#
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<LevelThemeType> CurrentThemePool { get; set; } = new List<LevelThemeType>();
|
|
public List<LevelThemeType> ThemeHistory { get; set; } = new List<LevelThemeType>();
|
|
public int CurrentNodeContinueChallengeLayer { get; set; }
|
|
public List<RunItemState> RunItems { get; set; } = new List<RunItemState>();
|
|
|
|
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<LevelThemeType> CurrentThemePool { get; set; } = new List<LevelThemeType>();
|
|
public List<LevelThemeType> ThemeHistory { get; set; } = new List<LevelThemeType>();
|
|
public int CurrentNodeContinueChallengeLayer { get; set; }
|
|
public List<RunItemState> RunItems { get; set; } = new List<RunItemState>();
|
|
|
|
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<LevelThemeType> CloneThemeList(IReadOnlyList<LevelThemeType> source)
|
|
{
|
|
List<LevelThemeType> cloned = new List<LevelThemeType>();
|
|
if (source == null)
|
|
{
|
|
return cloned;
|
|
}
|
|
|
|
for (int i = 0; i < source.Count; i++)
|
|
{
|
|
cloned.Add(source[i]);
|
|
}
|
|
|
|
return cloned;
|
|
}
|
|
|
|
public static List<RunItemState> CloneRunItems(IReadOnlyList<RunItemState> source)
|
|
{
|
|
List<RunItemState> cloned = new List<RunItemState>();
|
|
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;
|
|
}
|
|
}
|
|
}
|