protected async Task <bool> QueueUnit(int cost, TimeSpan productionTime, Func <IGameObjectFactory, Vector2, Task <Unit> > createUnit) { var point = await mPlacementService.TryAllocatePoint(); if (point == PlacementPoint.Invalid) { return(false); } if (!Player.Money.Spend(cost)) { await mPlacementService.ReleasePoint(point.ID); return(false); } Queued++; mOrders.Enqueue(new Order(productionTime, async() => { Queued--; var unit = await createUnit(Player, point.Position); await mGame.PlaceObject(unit); await mPlacementService.ReleasePoint(point.ID); if (!new Rect(Position, Size).Contains(Waypoint)) { await unit.GoTo(Waypoint); } ; })); return(true); }
public override void Update(TimeSpan deltaTime) { var k = AttachedWorkers <= 0 ? 0 : 1; mBuildTime = mBuildTime.Subtract(TimeSpan.FromSeconds(deltaTime.TotalSeconds * MathUtils.Pow(1 + WorkerInvest, AttachedWorkers - 1) * k)); Progress = (float)(1 - mBuildTime.TotalSeconds / mFullBuildTime.TotalSeconds); Health = Math.Max(Progress * MaxHealth, 5); if (mBuildTime <= TimeSpan.Zero) { mGame.RemoveObject(ID); mCreateBuilding(Position).ContinueWith(t => mGame.PlaceObject(t.Result)); } }