using System; using System.Collections.Generic; using System.Windows.Forms; using OpenRa.Game.Graphics; using OpenRa.Game.Traits; namespace OpenRa.Game { class World { List actors = new List(); List effects = new List(); List> frameEndActions = new List>(); public void Add(Actor a) { actors.Add(a); ActorAdded(a); } public void Remove(Actor a) { 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 = a => { a.Health = 0; /* make sure everyone sees it as dead */ foreach (var nr in a.traits.WithInterface()) nr.Removed(a); }; public void Tick() { foreach (var a in actors) a.Tick(); foreach (var e in effects) e.Tick(); Renderer.waterFrame += 0.00125f * Game.timestep; Game.viewport.Tick(); foreach (Action a in frameEndActions) a(this); frameEndActions.Clear(); } public IEnumerable Actors { get { return actors; } } public IEnumerable Effects { get { return effects; } } uint nextAID = 0; internal uint NextAID() { return nextAID++; } } }