public override void Callback(object custom) { IBarbarianTribe barbarianTribe; if (!gameObjectLocator.TryGetObjects(barbarianTribeId, out barbarianTribe)) { throw new Exception("Barb tribe is missing"); } CallbackLock.CallbackLockHandler lockHandler = delegate { var toBeLocked = new List <ILockable>(); toBeLocked.AddRange(barbarianTribe.Battle.LockList); toBeLocked.Add(barbarianTribe); return(toBeLocked.ToArray()); }; locker.Lock(lockHandler, null, barbarianTribe).Do(() => { if (barbarianTribe.Battle.ExecuteTurn()) { // Battle continues, just save it and reschedule dbManager.Save(barbarianTribe.Battle); endTime = SystemClock.Now.AddSeconds(formula.GetBattleInterval(barbarianTribe.Battle.Defenders, barbarianTribe.Battle.Attackers)); StateChange(ActionState.Fired); return; } // Battle has ended // Delete the battle world.Remove(barbarianTribe.Battle); dbManager.Delete(barbarianTribe.Battle); barbarianTribe.BeginUpdate(); barbarianTribe.Battle = null; barbarianTribe.State = GameObjectStateFactory.NormalState(); var initialBarbResources = formula.BarbarianTribeResources(barbarianTribe); if (!initialBarbResources.Equals(barbarianTribe.Resource)) { // Lower camps remaining barbarianTribe.CampRemains--; // Reset resources barbarianTribe.Resource.Clear(); barbarianTribe.Resource.Add(formula.BarbarianTribeResources(barbarianTribe)); } barbarianTribe.EndUpdate(); StateChange(ActionState.Completed); }); }
public BarbarianTribe CreateBarbarianTribe(uint id, byte level, Position position, int count) { if (level <= 0 || level > 10) { return(null); } var worker = actionWorkerFactory.CreateActionWorker(null, new SimpleLocation(LocationType.BarbarianTribe, id)); var barbarianTribe = new BarbarianTribe(id, level, position.X, position.Y, count, kernel.Get <IDbManager>(), worker); var resources = formula.BarbarianTribeResources(barbarianTribe); barbarianTribe.Resource.Clear(); barbarianTribe.Resource.Add(resources); worker.LockDelegate = () => barbarianTribe; return(barbarianTribe); }