using System; using System.Collections.Generic; namespace OpenRa.Game { class Player { public int Palette; public int Kills; public string PlayerName; public Race Race; public Player( int palette, string playerName, Race race ) { this.Palette = palette; this.PlayerName = playerName; this.Race = race; } public float GetSiloFullness() { return 0.5f; /* todo: work this out the same way as RA */ } public void GiveCash( int num ) { // TODO: increase cash } public bool TakeCash( int num ) { // TODO: decrease cash. // returns: if enough cash was available, true return true; } public void Tick() { foreach( var p in production ) { if( p.Value != null ) p.Value.Tick( this ); } } // Key: Production category. Categories are: Building, Infantry, Vehicle, Ship, Plane (and one per super, if they're done in here) readonly Dictionary production = new Dictionary(); public void ProductionInit( string category ) { production.Add( category, null ); } public ProductionItem Producing( string category ) { return production[ category ]; } public void CancelProduction( string category ) { var item = production[ category ]; if( item == null ) return; GiveCash( item.TotalCost - item.RemainingCost ); // refund what's been paid so far. FinishProduction( category ); } public void FinishProduction( string category ) { production[ category ] = null; } public void BeginProduction( string group, ProductionItem item ) { if( production[ group ] != null ) return; production[ group ] = item; } } class ProductionItem { public readonly string Item; public readonly int TotalTime; public readonly int TotalCost; public int RemainingTime { get; private set; } public int RemainingCost { get; private set; } public bool Paused = false, Done = false; public Action OnComplete; public ProductionItem( string item, int time, int cost, Action onComplete ) { Item = item; RemainingTime = TotalTime = time; RemainingCost = TotalCost = cost; OnComplete = onComplete; } public void Tick( Player player ) { if( Paused || Done ) return; var costThisFrame = RemainingCost / RemainingTime; if( costThisFrame == 0 && !player.TakeCash( costThisFrame ) ) return; RemainingCost -= costThisFrame; RemainingTime -= 1; if( RemainingTime > 0 ) return; // item finished; do whatever needs done. Done = true; if (OnComplete != null) OnComplete(); } } }