using System; using System.Collections.Generic; using OpenRa.Game.Effects; using OpenRa.Game.Support; namespace OpenRa.Game { class World { List actors = new List(); List effects = new List(); List> frameEndActions = new List>(); public void Add(Actor a) { a.IsInWorld = true; actors.Add(a); ActorAdded(a); } public void Remove(Actor a) { a.IsInWorld = false; actors.Remove(a); ActorRemoved(a); } public void Add(IEffect b) { effects.Add(b); } public void Remove(IEffect b) { effects.Remove(b); } public void AddFrameEndTask( Action a ) { frameEndActions.Add( a ); } public event Action ActorAdded = _ => { }; public event Action ActorRemoved = _ => { }; public void Tick() { foreach (var a in actors) a.Tick(); foreach (var e in effects) e.Tick(); Game.viewport.Tick(); var acts = frameEndActions; frameEndActions = new List>(); foreach (var a in acts) a(this); } public IEnumerable Actors { get { return actors; } } public IEnumerable Effects { get { return effects; } } uint nextAID = 0; internal uint NextAID() { return nextAID++; } public int SyncHash() { using (new PerfSample("synchash")) { int ret = 0; foreach (var a in Actors) ret += (int)a.ActorID * Sync.CalculateSyncHash(a); return ret; } } } }