From eac24739753c87ccf2e1fc5a3a75a9ad110b89fd Mon Sep 17 00:00:00 2001 From: sirati97 Date: Mon, 14 Oct 2019 01:21:03 +0900 Subject: [PATCH] fixed bug that ChangeState would assume standard value for unchanged fields instead of falling back on parent --- .../World/ChangeState/RectChangeState.cs | 13 +++++++++++-- .../ChangeState/TransformableChangeStateBase.cs | 8 ++++++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/ProgressionCore/World/ChangeState/RectChangeState.cs b/ProgressionCore/World/ChangeState/RectChangeState.cs index b4ea263..2199e7f 100644 --- a/ProgressionCore/World/ChangeState/RectChangeState.cs +++ b/ProgressionCore/World/ChangeState/RectChangeState.cs @@ -11,11 +11,14 @@ public RectChangeState(ITileWorld parent, Rect affectedRect, IFeatureResolver ap AffectedRect = affectedRect; ApplicableFeatures = applicableFeatures; _data = new int[affectedRect.Height,affectedRect.Width]; + _changed = new bool[affectedRect.Height,affectedRect.Width]; + } public Rect AffectedRect { get; } public IFeatureResolver ApplicableFeatures { get; } private int[,] _data; + private bool[,] _changed; protected override Coordinate transform(Coordinate coord) @@ -28,14 +31,20 @@ protected override bool IsContained(Coordinate coord, DataIdentifier identifier) return identifier.Resolver == ApplicableFeatures && AffectedRect.IsInside(coord.X, coord.Y); } + protected override bool IsChanged(Coordinate t, DataIdentifier identifier) + { + return identifier.Resolver == ApplicableFeatures && _changed[t.X, t.Y]; + } + protected override int getChange(Coordinate transCoord) { return _data[transCoord.X, transCoord.Y]; } - protected override void setChange(Coordinate transCoord, int v) + protected override void setChange(Coordinate t, int v) { - _data[transCoord.X, transCoord.Y] = v; + _data[t.X, t.Y] = v; + _changed[t.X, t.Y] = true; } } } \ No newline at end of file diff --git a/ProgressionCore/World/ChangeState/TransformableChangeStateBase.cs b/ProgressionCore/World/ChangeState/TransformableChangeStateBase.cs index a5a1fd9..dac3855 100644 --- a/ProgressionCore/World/ChangeState/TransformableChangeStateBase.cs +++ b/ProgressionCore/World/ChangeState/TransformableChangeStateBase.cs @@ -11,13 +11,17 @@ protected TransformableChangeStateBase(ITileWorld parent) : base(parent) { } protected abstract Coordinate transform(Coordinate coord); protected abstract bool IsContained(Coordinate coord, DataIdentifier identifier); + protected abstract bool IsChanged(Coordinate transCoord, DataIdentifier identifier); protected abstract int getChange(Coordinate transCoord); - protected abstract void setChange(Coordinate transCoord, int v); + protected abstract void setChange(Coordinate t, int v); public override int this[Coordinate c, DataIdentifier i] { - get => IsContained(c, i) ? getChange(transform(c)) : Parent[c, i]; + get { + Coordinate t; + return IsContained(c, i) && IsChanged(t= transform(c), i) ? getChange(t) : Parent[c, i]; } + set { if (IsContained(c, i)) { setChange(transform(c), value);