public IObjectStatus Merge(IObjectStatus oldStatus) { if (!(oldStatus is OnFireObjectStatus oldFire)) { throw new InvalidOperationException($"Unable to merge {nameof(OnFireObjectStatus)} status with {oldStatus.GetType().Name}"); } return(oldFire); }
public IObjectStatus Merge(IObjectStatus oldStatus) { if (!(oldStatus is PassiveObjectStatusBase passiveStatus) || !string.Equals(oldStatus.Type, Type)) { throw new InvalidOperationException($"Unable to merge {GetType().Name} status with {oldStatus.GetType().Name}"); } if (passiveStatus.timeToLive > timeToLive) { return(passiveStatus); } return(this); }
public void Add(IObjectStatus status) { if (statusFilter(status.Type)) { return; } if (statuses.ContainsKey(status.Type)) { statuses[status.Type] = status.Merge(statuses[status.Type]); } else { var owner = CurrentGame.Map.GetDestroyableObject(ownerId); CurrentGame.Journal.Write(new StatusAddedMessage(owner, status.Type), owner); statuses.Add(status.Type, status); } }