Remove Season.Past so all lookups go through World
This commit is contained in:
parent
81c9aa4859
commit
5e5483367d
@ -114,17 +114,17 @@ public static class PathFinder
|
||||
List<Season> adjacents = [];
|
||||
|
||||
// The immediate past and all immediate futures are adjacent.
|
||||
if (season.Past != null) adjacents.Add(season.Past);
|
||||
if (season.PastId != null) adjacents.Add(world.GetSeason(season.PastId));
|
||||
adjacents.AddRange(season.Futures);
|
||||
|
||||
// Find all adjacent timelines by finding all timelines that branched off of this season's
|
||||
// timeline, i.e. all futures of this season's past that have different timelines. Also
|
||||
// include any timelines that branched off of the timeline this timeline branched off from.
|
||||
List<Season> adjacentTimelineRoots = new();
|
||||
List<Season> adjacentTimelineRoots = [];
|
||||
Season? current;
|
||||
for (current = season;
|
||||
current?.Past?.Timeline != null && current.Past.Timeline == current.Timeline;
|
||||
current = current.Past)
|
||||
current?.PastId != null && world.GetSeason(current.PastId).Timeline == current.Timeline;
|
||||
current = world.GetSeason(current.PastId))
|
||||
{
|
||||
adjacentTimelineRoots.AddRange(
|
||||
current.Futures.Where(s => s.Timeline != current.Timeline));
|
||||
@ -135,10 +135,10 @@ public static class PathFinder
|
||||
// then current is the branch timeline's root season (current.past.timeline !=
|
||||
// current.timeline). There are co-branches if this season is in a branched timeline, since
|
||||
// the first timeline by definition cannot have co-branches.
|
||||
if (current?.Past != null)
|
||||
if (current?.PastId != null && world.GetSeason(current.PastId) is Season past)
|
||||
{
|
||||
IEnumerable<Season> cobranchRoots = current.Past.Futures
|
||||
.Where(s => s.Timeline != current.Timeline && s.Timeline != current.Past.Timeline);
|
||||
IEnumerable<Season> cobranchRoots = past.Futures
|
||||
.Where(s => s.Timeline != current.Timeline && s.Timeline != past.Timeline);
|
||||
adjacentTimelineRoots.AddRange(cobranchRoots);
|
||||
}
|
||||
|
||||
|
@ -10,13 +10,6 @@ public class Season
|
||||
/// </summary>
|
||||
public const int FIRST_TURN = 0;
|
||||
|
||||
/// <summary>
|
||||
/// The season immediately preceding this season.
|
||||
/// If this season is an alternate timeline root, the past is from the origin timeline.
|
||||
/// The initial season does not have a past.
|
||||
/// </summary>
|
||||
public Season? Past { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The designation of the season immediately preceding this season.
|
||||
/// If this season is an alternate timeline root, the past is from the origin timeline.
|
||||
@ -54,7 +47,6 @@ public class Season
|
||||
|
||||
private Season(Season? past, int turn, string timeline, TimelineFactory factory)
|
||||
{
|
||||
this.Past = past;
|
||||
this.PastId = past?.ToString();
|
||||
this.Turn = turn;
|
||||
this.Timeline = timeline;
|
||||
|
@ -245,9 +245,12 @@ public class World
|
||||
/// </summary>
|
||||
public Season GetTimelineRoot(Season season)
|
||||
{
|
||||
Season? past = season.Past;
|
||||
return past != null && season.Timeline == past.Timeline
|
||||
? GetTimelineRoot(season.Past!)
|
||||
if (season.PastId is null) {
|
||||
return season;
|
||||
}
|
||||
Season past = SeasonLookup[season.PastId];
|
||||
return season.Timeline == past.Timeline
|
||||
? GetTimelineRoot(past)
|
||||
: season;
|
||||
}
|
||||
|
||||
|
@ -171,7 +171,7 @@ public class MovementAdjudicatorTest
|
||||
// Confirm the future was created
|
||||
Assert.That(updated.Seasons.Count, Is.EqualTo(2));
|
||||
Season future = updated.Seasons.Single(s => s != updated.RootSeason);
|
||||
Assert.That(future.Past, Is.EqualTo(updated.RootSeason));
|
||||
Assert.That(future.PastId, Is.EqualTo(updated.RootSeason.ToString()));
|
||||
Assert.That(future.Futures, Is.Empty);
|
||||
Assert.That(future.Timeline, Is.EqualTo(updated.RootSeason.Timeline));
|
||||
Assert.That(future.Turn, Is.EqualTo(Season.FIRST_TURN + 1));
|
||||
@ -200,7 +200,7 @@ public class MovementAdjudicatorTest
|
||||
|
||||
// Confirm the future was created
|
||||
Season s2 = updated.GetSeason("a", 1);
|
||||
Assert.That(s2.Past, Is.EqualTo(s1));
|
||||
Assert.That(s2.PastId, Is.EqualTo(s1.ToString()));
|
||||
Assert.That(s2.Futures, Is.Empty);
|
||||
Assert.That(s2.Timeline, Is.EqualTo(s1.Timeline));
|
||||
Assert.That(s2.Turn, Is.EqualTo(s1.Turn + 1));
|
||||
@ -250,7 +250,7 @@ public class MovementAdjudicatorTest
|
||||
|
||||
// Confirm the future was created
|
||||
Season s2 = updated.GetSeason(s1.Timeline, s1.Turn + 1);
|
||||
Assert.That(s2.Past, Is.EqualTo(s1));
|
||||
Assert.That(s2.PastId, Is.EqualTo(s1.ToString()));
|
||||
Assert.That(s2.Futures, Is.Empty);
|
||||
Assert.That(s2.Timeline, Is.EqualTo(s1.Timeline));
|
||||
Assert.That(s2.Turn, Is.EqualTo(s1.Turn + 1));
|
||||
|
Loading…
Reference in New Issue
Block a user