Pull up StampedEvent.Temporary. Fix temporary event discarding.

This commit is contained in:
2023-01-31 15:26:13 +08:00
parent c16776aee9
commit 507b656eab
2 changed files with 30 additions and 8 deletions

View File

@@ -109,25 +109,31 @@ namespace Cryville.Crtr.Event {
s.AttachSystems(skin, judge); s.AttachSystems(skin, judge);
} }
List<StampedEvent> tempEvents = new List<StampedEvent>(); List<StampedEvent.Temporary> tempEvents = new List<StampedEvent.Temporary>();
public void PushTempEvent(StampedEvent ev) { public void PushTempEvent(StampedEvent.Temporary ev) {
var index = tempEvents.BinarySearch(ev); var index = tempEvents.BinarySearch(ev);
if (index < 0) index = ~index; if (index < 0) index = ~index;
tempEvents.Insert(index, ev); tempEvents.Insert(index, ev);
} }
readonly StampedEvent _dummyEvent = new StampedEvent(); readonly StampedEvent.Temporary _dummyEvent = new StampedEvent.Temporary();
public void StripTempEvents() { public void StripTempEvents() {
_dummyEvent.Time = Time; _dummyEvent.Time = Time;
var index = tempEvents.BinarySearch(_dummyEvent); var index = tempEvents.BinarySearch(_dummyEvent);
if (index < 0) index = ~index; if (index < 0) index = ~index;
for (var i = 0; i < index; i++) { for (var i = index - 1; i >= 0; i--) {
var ev = tempEvents[i]; var ev = tempEvents[i];
if (ev.Container != null) { tempEvents.RemoveAt(i);
states[ev.Container].Discard(ev); if (ev.CanDiscard) {
if (ev.Container != null) {
states[ev.Container].Discard(ev);
}
}
else {
ev.Time = Time;
PushTempEvent(ev);
} }
} }
tempEvents.RemoveRange(0, index);
} }
public override void ForwardOnceToTime(double toTime) { public override void ForwardOnceToTime(double toTime) {
@@ -187,6 +193,11 @@ namespace Cryville.Crtr.Event {
public void BroadcastEndUpdate() { public void BroadcastEndUpdate() {
RootState.BroadcastEndUpdate(); RootState.BroadcastEndUpdate();
foreach (var ev in tempEvents) {
if (ev.Container != null) {
states[ev.Container].Discard(ev);
}
}
tempEvents.Clear(); tempEvents.Clear();
} }

View File

@@ -29,8 +29,19 @@ namespace Cryville.Crtr {
} }
} }
public class Anchor : StampedEvent { public class Temporary : StampedEvent, IComparable<Temporary> {
public bool CanDiscard;
public int CompareTo(Temporary other) {
return base.CompareTo(other);
}
}
public class Anchor : Temporary {
public CAnchor Target; public CAnchor Target;
int m_priority;
public override int Priority { get { return m_priority; } }
public void SetPriority(int value) { m_priority = value; }
}
public override int Priority { public override int Priority {
get { return 0; } get { return 0; }
} }