Пример #1
0
        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);
            });
        }
Пример #2
0
        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);
        }