示例#1
0
        public bool Handle(DomainEventHandlerData <DeleteSoldierEvent> data)
        {
            CastleAggregate snapshot = data.Snapshot as CastleAggregate;

            if (snapshot != null)
            {
                Debug.WriteLine("Soldier deleted!");
                --snapshot.SoldiersAmount;
                List <SoldierAggregate> soldiers = snapshot.Soldiers;
                SoldierAggregate        soldierAggregate1;
                if (soldiers == null)
                {
                    soldierAggregate1 = null;
                }
                else
                {
                    Func <SoldierAggregate, bool> predicate = e => e.Id == data.EventObject.SoldierId;
                    soldierAggregate1 = soldiers.FirstOrDefault <SoldierAggregate>(predicate);
                }
                SoldierAggregate soldierAggregate2 = soldierAggregate1;
                if (soldierAggregate2 != null)
                {
                    soldierAggregate2.IsDead = true;
                }
            }
            return(true);
        }
        public bool Handle(DomainEventHandlerData <MoveSoldierEvent> @event)
        {
            GameAggregate snapshot = @event.Snapshot as GameAggregate;

            if (snapshot == null)
            {
                return(false);
            }
            if (@event.EventObject.Soldiers == null)
            {
                return(true);
            }
            var army         = snapshot.UserId == @event.EventObject.CreatedBy ? Army.Blue : Army.Red;
            var soldiers     = army == Army.Blue ? snapshot.UserSoldiers : snapshot.OpponentSoldiers ?? new List <SoldierAggregate>();
            var moveSoldiers = soldiers.Where(e => @event.EventObject.Soldiers.Contains(e.Id.ToString()));
            var moveToCastle = snapshot.Castles.FirstOrDefault(e => e.Id == @event.EventObject.CastleId);

            if (moveToCastle == null)
            {
                return(false);
            }
            if (moveToCastle.Soldiers == null)
            {
                moveToCastle.Soldiers = new List <SoldierAggregate>();
            }
            moveToCastle.Soldiers.AddRange(moveSoldiers);
            soldiers.RemoveAll(e => @event.EventObject.Soldiers.Contains(e.Id.ToString()));
            snapshot.UpdateSoldierAmount();
            return(true);
        }
示例#3
0
        public bool Handle(DomainEventHandlerData <HeroARoundCastleEvent> @event)
        {
            var game   = @event.Snapshot as GameAggregate;
            var castle = game?.Castles?.FirstOrDefault(e => e.Id == @event.EventObject.CastleId);

            if (castle == null)
            {
                return(false);
            }
            if (castle.Heroes == null)
            {
                castle.Heroes = new List <HeroAggregate>();
            }
            castle.Heroes.RemoveAll(e => e.Id == new Guid(@event.EventObject.HeroId));
            var army = game.UserId == @event.EventObject.UserId ? Army.Blue : Army.Red;

            castle.Heroes.Add(new HeroAggregate()
            {
                Id        = new Guid(@event.EventObject.HeroId),
                UserId    = @event.EventObject.UserId,
                Army      = army,
                UpdatedAt = @event.EventObject.ExecuteAt
            });
            return(true);
        }
示例#4
0
        public bool Handle(DomainEventHandlerData <StartBattalionEvent> @event)
        {
            var snap   = @event.Snapshot as GameAggregate;
            var castle = snap?.Castles?.FirstOrDefault(e => e.Id == @event.EventObject.CastleId);

            if (castle == null)
            {
                return(false);
            }
            var movedSoldiers = castle.Soldiers.Where(s => @event.EventObject.Soldiers.Any(e => new Guid(e) == s.Id)).ToList();

            castle.Soldiers.RemoveAll(s => @event.EventObject.Soldiers.Any(e => new Guid(e) == s.Id));
            castle.UpdateSoldierAmount();
            var e2 = new BattalionMovementEvent(castle.Id,
                                                @event.EventObject.DestinationCastleId,
                                                movedSoldiers,
                                                @event.EventObject.Route,
                                                @event.EventObject.CreatedBy,
                                                DateTime.UtcNow, DateTime.UtcNow.Add(@event.EventObject.Route.Duration));

            e2.Id = @event.EventObject.MovementId;
            _domain.AddEvent(snap.Id, e2);
            _gameDomainService.CreateSoldierIfNeed(snap);
            return(true);
        }
        public bool Handle(DomainEventHandlerData <UpkeepCoinEvent> @event)
        {
            var snap = @event.Snapshot as GameAggregate;

            if (snap == null)
            {
                return(false);
            }
            var relateEvents = new List <EventBase>();
            var userCastles  = snap.Castles.Where(e => e.OwnerUserId == snap.UserId).ToList() ?? new List <CastleAggregate>();

            foreach (var castle in userCastles)
            {
                var coins = _gameDomainService.CalculateUpkeepCoin(snap.Id, castle);
                snap.UserCoins -= coins;
                relateEvents.Add(new CastleUpkeepCointEvent(castle.Id, coins, snap.UserId, DateTime.UtcNow, DateTime.UtcNow));
                //var createSoldier = _gameDomainService.GetCreateSoldierIfNeedCreate(snap, castle);
                //if (createSoldier != null)
                //    relateEvents.Add(createSoldier);
                //var isCreated = _gameDomainService.CreateSoldierIfNeed(snap, castle);
                //if (!isCreated && castle.Army != Army.Neutrual && (castle.Army == Army.Blue || !snap.SelfPlaying))
                //{
                //    var troopType = castle.GetDefaultTroopType();
                //    var needCoin = _gameDomainService.GetUpkeepCoinBySoldierType(castle, troopType);
                //    coins = castle.Army == Army.Blue ? snap.UserCoins : snap.OpponentCoins;
                //    if (needCoin > coins && castle.IsProductionState())
                //    {
                //        relateEvents.Add(new SuspendCastleProductionEvent(castle.Id, castle.OwnerUserId));
                //    }
                //}
            }

            var opponentCastles = snap.Castles.Where(e => e.OwnerUserId == snap.OpponentId).ToList() ?? new List <CastleAggregate>();

            foreach (var castle in opponentCastles)
            {
                var coins = _gameDomainService.CalculateUpkeepCoin(snap.Id, castle);
                snap.OpponentCoins -= coins;
                relateEvents.Add(new CastleUpkeepCointEvent(castle.Id, coins, snap.OpponentId, DateTime.UtcNow, DateTime.UtcNow));
                //var createSoldier = _gameDomainService.GetCreateSoldierIfNeedCreate(snap, castle);
                //if (createSoldier != null)
                //    relateEvents.Add(createSoldier);
                //var isCreated = _gameDomainService.CreateSoldierIfNeed(snap, castle);
                //if (!isCreated && castle.Army != Army.Neutrual && (castle.Army == Army.Blue || !snap.SelfPlaying))
                //{
                //    var troopType = castle.GetDefaultTroopType();
                //    var needCoin = _gameDomainService.GetUpkeepCoinBySoldierType(castle, troopType);
                //    coins = castle.Army == Army.Blue ? snap.UserCoins : snap.OpponentCoins;
                //    if (needCoin > coins && castle.IsProductionState())
                //    {
                //        relateEvents.Add(new SuspendCastleProductionEvent(castle.Id, castle.OwnerUserId));
                //    }
                //}
            }

            relateEvents.Add(_gameDomainService.UpkeepCoinEvent(snap.Speed));
            _domainService.AddEvent(snap.Id, relateEvents.ToArray());
            return(true);
        }
示例#6
0
        public static bool Publish <T>(DomainEventHandlerData <T> @event) where T : EventBase
        {
            Func <DomainEventHandlerData <IEventBase>, bool> func;

            if (!Routes.TryGetValue(@event.Event.GetType(), out func))
            {
                return(false);
            }
            return((bool)func.DynamicInvoke((object)@event));
        }
        public bool Handle(DomainEventHandlerData <BattleEvent> @event)
        {
            var snap   = @event.Snapshot as GameAggregate;
            var castle = snap?.Castles.FirstOrDefault(e => e.Id == @event.EventObject.AtCastleId);

            if (castle?.Siege?.Soldiers == null)
            {
                return(false);
            }
            var attacking = castle.Siege.Soldiers;
            var defending = castle.Soldiers.Where(e => !e.IsDead).ToList();
            // boost strength
            var hero = castle.Heroes?.FirstOrDefault(e => e.Army != castle.Army);
            var attackingBoostStrength = hero == null ? 0 : _repository.GetHeroById(hero.UserId, hero.Id.ToString())?.Leadership ?? 0;

            hero = castle.Heroes?.FirstOrDefault(e => e.Army == castle.Army);
            var defendingBoostStrength = hero == null ? 0 : _repository.GetHeroById(hero.UserId, hero.Id.ToString())?.Leadership ?? 0;

            var battle = _gameDomainService.AttackSequence(@event.EventObject.Id,
                                                           castle,
                                                           castle.Siege.OwnerUserId,
                                                           castle.OwnerUserId,
                                                           attacking,
                                                           defending,
                                                           attackingBooststrength: attackingBoostStrength,
                                                           defendingBooststrength: defendingBoostStrength);

            // attacking win
            if (attacking.Count(e => !e.IsDead && e.CastleTroopType.Health > 0) > 0)
            {
                // add event
                // for user
                _domain.AddEvent(snap.Id, new OccupiedCastleEvent(castle.Siege.OwnerUserId, castle.Id, battle, DateTime.UtcNow));
                // for old owner of castle
                if (!string.IsNullOrEmpty(castle.OwnerUserId))
                {
                    _domain.AddEvent(snap.Id, new CastleHasBeenOccupiedEvent(castle.OwnerUserId, castle.Id, battle, DateTime.UtcNow));
                }
            }
            else
            {
                // defending win
                castle.Soldiers = castle.Soldiers.Where(e => e.CastleTroopType.Health > 0 && !e.IsDead).ToList();
                castle.UpdateSoldierAmount();
                _gameDomainService.CreateSoldierIfNeed(snap);
                // for depending
                if (!string.IsNullOrEmpty(castle.OwnerUserId))
                {
                    _domain.AddEvent(snap.Id, new DefendedCastleEvent(castle.OwnerUserId, castle.Id, battle, DateTime.UtcNow));
                }
                // for attacking
                _domain.AddEvent(snap.Id, new FailedAttackCastleEvent(castle.Siege.OwnerUserId, castle.Id, battle, DateTime.UtcNow));
            }
            return(true);
        }
        public bool Handle(DomainEventHandlerData <SiegeCastleEvent> @event)
        {
            var snap = @event.Snapshot as GameAggregate;

            if (snap == null)
            {
                return(false);
            }
            _domain.AddEvent(snap.Id, new BattleEvent(@event.EventObject.CastleId, DateTime.UtcNow, DateTime.UtcNow));
            return(true);
        }
示例#9
0
        public bool Handle(DomainEventHandlerData <SelectOpponentArmySettingEvent> @event)
        {
            var snap = @event.Snapshot as GameAggregate;

            if (snap == null)
            {
                return(false);
            }
            snap.OpponentArmySetting = @event.EventObject.ArmySetting;
            return(true);
        }
示例#10
0
        public bool Handle(DomainEventHandlerData <FailedAttackCastleEvent> @event)
        {
            var snap   = @event.Snapshot as GameAggregate;
            var castle = snap?.Castles.FirstOrDefault(e => e.Id == @event.EventObject.CastleId);

            if (castle == null)
            {
                return(false);
            }
            castle.Siege = null;
            return(true);
        }
示例#11
0
        public bool Handle(DomainEventHandlerData <EndGameEvent> @event)
        {
            var game = @event.Snapshot as GameAggregate;

            if (game == null)
            {
                return(false);
            }
            game.Status = GameStatus.Ended;
            game.Winner = @event.EventObject.Winner;
            return(true);
        }
        public bool Handle(DomainEventHandlerData <SuspendCastleProductionEvent> @event)
        {
            var snap   = @event.Snapshot as GameAggregate;
            var castle = snap?.Castles.FirstOrDefault(e => e.Id == @event.EventObject.CastleId);

            if (castle == null)
            {
                return(false);
            }
            castle.SuspendProduction();
            return(true);
        }
        public bool Handle(DomainEventHandlerData <UpdateOpponentInfoEvent> @event)
        {
            var game = @event.Snapshot as GameAggregate;

            if (game == null)
            {
                return(false);
            }
            game.OpponentId     = @event.EventObject.OpponentId;
            game.OpponentHeroId = @event.EventObject.OpponentHeroId;
            return(true);
        }
        public bool Handle(DomainEventHandlerData <ChangeCastleTroopTypeEvent> @event)
        {
            var snap   = @event.Snapshot as GameAggregate;
            var castle = snap?.Castles?.FirstOrDefault(e => e.Id == @event.EventObject.CastleId);

            if (castle == null)
            {
                return(false);
            }
            //castle.ProducedTroopTypes = new List<string>()
            //{
            //    @event.EventObject.TroopType
            //};
            return(true);
        }
示例#15
0
        public bool Handle(DomainEventHandlerData <ChangeGameStatusEvent> @event)
        {
            GameAggregate snapshot = @event.Snapshot as GameAggregate;

            if (snapshot == null)
            {
                return(false);
            }
            GameAggregate         gameAggregate = snapshot;
            ChangeGameStatusEvent eventObject   = @event.EventObject;
            int num = eventObject != null ? (int)eventObject.Status : 0;

            gameAggregate.Status = (GameStatus)num;
            return(true);
        }
示例#16
0
        public bool Handle(DomainEventHandlerData <RestartCastleProductionEvent> @event)
        {
            var snap   = @event.Snapshot as GameAggregate;
            var castle = snap?.Castles.FirstOrDefault(e => e.Id == @event.EventObject.CastleId);

            if (castle == null)
            {
                return(false);
            }
            //var troop = castle.GetDefaultTroopType();
            //var needCoins = _gameDomainService.GetUpkeepCoinBySoldierType(castle, troop);
            //if (snap.CanProduce(castle, needCoins))
            //    castle.RestartProduction();
            return(true);
        }
示例#17
0
        public bool Handle(DomainEventHandlerData <UpgradeCastleEvent> @event)
        {
            var snap   = @event.Snapshot as GameAggregate;
            var castle = snap?.Castles.FirstOrDefault(e => e.Id == @event.EventObject.CastleId);

            if (castle == null)
            {
                return(false);
            }
            castle.Strength++;
            var coins = _domainService.GetCoinsToUpgradeCastle(castle.Strength);

            _domain.AddEvent(snap.Id, new DeficitCoinsEvent(coins, castle.Army, castle.OwnerUserId));
            return(true);
        }
        public bool Handle(DomainEventHandlerData <HeroLeftCastleEvent> @event)
        {
            var game   = @event.Snapshot as GameAggregate;
            var castle = game?.Castles?.FirstOrDefault(e => e.Id == @event.EventObject.CastleId);

            if (castle == null)
            {
                return(false);
            }
            if (castle.Heroes == null)
            {
                castle.Heroes = new List <HeroAggregate>();
            }
            castle.Heroes.RemoveAll(e => e.Id == new Guid(@event.EventObject.HeroId));
            return(true);
        }
        public bool Handle(DomainEventHandlerData <AddCastleEvent> @event)
        {
            GameAggregate snapshot = @event.Snapshot as GameAggregate;

            if (snapshot == null)
            {
                return(false);
            }
            if (snapshot.Castles == null)
            {
                snapshot.Castles = new List <CastleAggregate>();
            }
            snapshot.Castles.Add(new CastleAggregate()
            {
                Id = @event.EventObject.Id
            });
            return(true);
        }
示例#20
0
        public bool Handle(DomainEventHandlerData <DefendedSiegeEvent> @event)
        {
            var snap   = @event.Snapshot as GameAggregate;
            var castle = snap?.Castles.FirstOrDefault(e => e.Id == @event.EventObject.CastleId);

            if (castle?.Siege == null)
            {
                return(false);
            }
            castle.Siege.Soldiers = castle.Siege.Soldiers.Where(e => e.CastleTroopType.Health > 0).ToList();
            _gameDomainService.AddSiegeEvent(snap, castle, castle.Siege.Soldiers);
            //_domain.AddEvent(snap.Id, new SiegeCastleEvent(castle.Siege.OwnerUserId,
            //    castle.Id,
            //    castle.Siege.Soldiers,
            //    DateTime.UtcNow,
            //    DateTime.UtcNow.AddMinutes(_gameSettings.SiegeTime)));
            return(true);
        }
示例#21
0
        public bool Handle(DomainEventHandlerData <CreateSoldierEvent> data)
        {
            GameAggregate snapshot = data.Snapshot as GameAggregate;

            if (snapshot == null)
            {
                return(false);
            }
            if (data.EventObject.Army == Army.Blue)
            {
                if (snapshot.UserSoldiers == null)
                {
                    snapshot.UserSoldiers = new List <SoldierAggregate>();
                }
                ++snapshot.UserSoldiersAmount;
            }
            else
            {
                if (snapshot.OpponentSoldiers == null)
                {
                    snapshot.OpponentSoldiers = new List <SoldierAggregate>();
                }
                ++snapshot.OpponentSoldierAmount;
            }
            SoldierAggregate soldierAggregate = new SoldierAggregate {
                Id = Guid.NewGuid()
            };
            var castleTroopType = snapshot.GetTroopTypeData(data.EventObject.Army, data.EventObject.TroopType);

            if (castleTroopType != null)
            {
                soldierAggregate.CastleTroopType = castleTroopType;
                if (data.EventObject.Army == Army.Blue)
                {
                    snapshot.UserSoldiers.Add(soldierAggregate);
                }
                else
                {
                    snapshot.OpponentSoldiers.Add(soldierAggregate);
                }
            }
            _gameDomainService.CreateSoldierIfNeed(snapshot, data.EventObject.Army);
            return(true);
        }
示例#22
0
        public bool Handle(DomainEventHandlerData <InitCastleEvent> @event)
        {
            GameAggregate snapshot = @event.Snapshot as GameAggregate;
            var           castle   = snapshot?.Castles?.FirstOrDefault(e => e.Id == @event.EventObject.Id);

            if (castle == null)
            {
                return(false);
            }
            castle.Name             = @event.EventObject.Name;
            castle.Army             = @event.EventObject.Army;
            castle.Position         = @event.EventObject.Position;
            castle.MaxResourceLimit = @event.EventObject.MaxResourceLimit;
            castle.OwnerUserId      = @event.EventObject.OwnerUserId;
            castle.OwnerId          = @event.EventObject.OwnerId;
            castle.Soldiers         = new List <SoldierAggregate>();
            castle.Strength         = @event.EventObject.Strength;
            return(true);
        }
        public bool Handle(DomainEventHandlerData <OccupiedSiegeInCastleEvent> @event)
        {
            var snap   = @event.Snapshot as GameAggregate;
            var castle = snap?.Castles.FirstOrDefault(e => e.Id == @event.EventObject.CastleId);

            if (castle == null)
            {
                return(false);
            }
            castle.Siege = new SiegeAggregate()
            {
                Id          = Guid.NewGuid(),
                OwnerUserId = @event.EventObject.CreatedBy,
                Soldiers    = @event.EventObject.Soldiers,
                BattleAt    = _gameDomainService.GetBattleTime(snap.Speed)
            };
            // add event
            _gameDomainService.AddSiegeEvent(snap, castle, @event.EventObject.Soldiers);
            return(true);
        }
        public bool Handle(DomainEventHandlerData <CollectedCoinEvent> @event)
        {
            var snap = @event.Snapshot as GameAggregate;

            if (snap == null)
            {
                return(false);
            }
            switch (@event.EventObject.Army)
            {
            case Army.Red:
                snap.OpponentCoins += @event.EventObject.Coins;
                break;

            case Army.Blue:
                snap.UserCoins += @event.EventObject.Coins;
                break;
            }
            return(true);
        }
示例#25
0
        public bool Handle(DomainEventHandlerData <OccupiedCastleEvent> @event)
        {
            var snap   = @event.Snapshot as GameAggregate;
            var castle = snap?.Castles.FirstOrDefault(e => e.Id == @event.EventObject.CastleId);

            if (castle?.Siege == null)
            {
                return(false);
            }
            var liveSoldiers = castle.Siege.Soldiers?.Where(e => e.CastleTroopType.Health > 0).ToList() ?? new List <SoldierAggregate>();

            castle.Soldiers = liveSoldiers;
            castle.UpdateSoldierAmount();
            var army = snap.UserId == castle.Siege.OwnerUserId ? Army.Blue : Army.Red;

            castle.Siege = null;
            castle.Army  = army;
            if (army == Army.Blue)
            {
                castle.OwnerId     = snap.UserHeroId;
                castle.OwnerUserId = snap.UserId;
            }
            else
            {
                castle.OwnerId     = snap.OpponentHeroId;
                castle.OwnerUserId = snap.OpponentId;
            }
            // check end game status
            bool isBlueWin = snap.Castles.All(e => e.Army == Army.Blue);
            var  isRedWin  = snap.Castles.All(e => e.Army == Army.Red);

            if (isBlueWin || isRedWin)
            {
                _domain.AddEvent(snap.Id, new EndGameEvent(isBlueWin ? Army.Blue : Army.Red, DateTime.UtcNow));
                return(true);
            }
            _gameDomainService.CreateSoldierIfNeed(snap);
            return(true);
        }
示例#26
0
        public bool Handle(DomainEventHandlerData <InitGameEvent> @event)
        {
            var game = @event.Snapshot as GameAggregate;

            if (game == null)
            {
                return(false);
            }
            game.UserId          = @event.EventObject.UserId;
            game.UserHeroId      = @event.EventObject.UserHeroId;
            game.OpponentId      = @event.EventObject.OpponentId;
            game.OpponentHeroId  = @event.EventObject.OpponentHeroId;
            game.SelfPlaying     = @event.EventObject.SelfPlaying;
            game.Speed           = @event.EventObject.Speed;
            game.Difficulty      = @event.EventObject.Difficulty;
            game.UserArmySetting = @event.EventObject.UserArmySetting;

            game.UserProducedTroopTypes     = @event.EventObject.UserProducedTroopTypes;
            game.UserTroopTypes             = @event.EventObject.UserTroopTypes;
            game.OpponentTroopTypes         = @event.EventObject.OpponentTroopTypes;
            game.OpponentProducedTroopTypes = @event.EventObject.OpponentProducedTroopTypes;
            return(true);
        }
示例#27
0
        private static void InvokeHandler(Type @interface, IHandlerRegistrar bus, Type executorType)
        {
            var commandType            = @interface.GenericTypeArguments[0];
            var registerExecutorMethod = bus
                                         .GetType().GetRuntimeMethods()
                                         .Where(mi => mi.Name == "RegisterHandler")
                                         .Where(mi => mi.IsGenericMethod)
                                         .Where(mi => mi.GetGenericArguments().Count() == 1)
                                         .Single(mi => mi.GetParameters().Count() == 1)
                                         .MakeGenericMethod(commandType);

            var del = new Func <dynamic, bool>(x =>
            {
                dynamic handler = _container.Resolve(@interface);
                var d1          = typeof(DomainEventHandlerData <>);
                Type[] typeArgs = { x.Event.GetType() };
                var makeme      = d1.MakeGenericType(typeArgs);
                var a           = DomainEventHandlerData <EventBase> .CreateDynamicInstance(makeme, x);
                return(handler.Handle(a));
            });

            registerExecutorMethod.Invoke(bus, new object[] { del });
        }
        public bool Handle(DomainEventHandlerData <RevenueCointEvent> @event)
        {
            var snap = @event.Snapshot as GameAggregate;

            if (snap == null)
            {
                return(false);
            }
            var relateEvents = new List <EventBase>();
            var userCastles  = snap.Castles.Where(e => e.OwnerUserId == snap.UserId).ToList() ?? new List <CastleAggregate>();

            foreach (var castle in userCastles)
            {
                var coins = _gameDomainService.CalculateCoin(snap, castle);
                snap.UserCoins += coins;
                relateEvents.Add(new CastleRevenueCointEvent(castle.Id, coins, snap.UserId, DateTime.UtcNow, DateTime.UtcNow));
                //var createSoldier = _gameDomainService.GetCreateSoldierIfNeedCreate(snap, castle);
                //if (createSoldier != null)
                //    relateEvents.Add(createSoldier);
            }

            var opponentCastles = snap.Castles.Where(e => e.OwnerUserId == snap.OpponentId).ToList() ?? new List <CastleAggregate>();

            foreach (var castle in opponentCastles)
            {
                var coins = _gameDomainService.CalculateCoin(snap, castle);
                snap.OpponentCoins += coins;
                relateEvents.Add(new CastleRevenueCointEvent(castle.Id, coins, snap.OpponentId, DateTime.UtcNow, DateTime.UtcNow));
                //var createSoldier = _gameDomainService.GetCreateSoldierIfNeedCreate(snap, castle);
                //if (createSoldier != null)
                //    relateEvents.Add(createSoldier);
            }
            relateEvents.Add(_gameDomainService.RevenueCoinEvent(snap.Speed));
            _domainService.AddEvent(snap.Id, relateEvents.ToArray());
            return(true);
        }
示例#29
0
 public bool Handle(DomainEventHandlerData <SiegeHasBeenOccupiedEvent> @event)
 {
     return(true);
 }
        public bool Handle(DomainEventHandlerData <BattalionMovementEvent> @event)
        {
            var snap   = @event.Snapshot as GameAggregate;
            var castle = snap?.Castles?.FirstOrDefault(e => e.Id == @event.EventObject.CastleId);

            if (castle == null)
            {
                return(false);
            }
            var destination = snap.Castles?.FirstOrDefault(e => e.Id == @event.EventObject.DestinationCastleId);

            if (destination == null)
            {
                return(false);
            }
            if (castle.Army == destination.Army)
            {
                // just add soldier
                if (destination.Soldiers == null)
                {
                    destination.Soldiers = new List <SoldierAggregate>();
                }
                var soldierCanAdd = destination.MaxResourceLimit - destination.Soldiers.Count;
                if (soldierCanAdd > 0)
                {
                    var canAddSoldiers = @event.EventObject.Soldiers
                                         .Where(e => destination.Soldiers.All(f => f.Id != e.Id))
                                         .OrderByDescending(e => e.CastleTroopType.Health)
                                         .Take(
                        soldierCanAdd);
                    destination.Soldiers.AddRange(canAddSoldiers);
                    destination.UpdateSoldierAmount();
                }
                if (@event.EventObject.Soldiers.Count > soldierCanAdd)
                {
                    //todo: fill all soldier still in battalion to closest castle
                }
                return(true);
            }
            // check siege of destination castle
            if (destination.Siege == null)
            {
                _gameDomainService.AddSiegeEvent(snap, castle, destination, @event.EventObject.Soldiers);
            }
            else if (destination.Siege.OwnerUserId != castle.OwnerUserId)
            {
                // start battle
                _domain.AddEvent(snap.Id,
                                 new BattleVersusSiegeEvent(
                                     castle.OwnerUserId,
                                     destination.Id,
                                     @event.EventObject.Soldiers,
                                     DateTime.UtcNow));
            }
            else
            {
                // add more soldier to siege
                if (destination.Siege.Soldiers == null)
                {
                    destination.Siege.Soldiers = new List <SoldierAggregate>();
                }
                var canAddSoldiers = @event.EventObject.Soldiers.Where(e => destination.Siege.Soldiers.All(f => f.Id != e.Id)).ToList();
                destination.Siege.Soldiers.AddRange(canAddSoldiers);
                castle.Soldiers.RemoveAll(e => canAddSoldiers.Any(f => f.Id == e.Id));
                destination.UpdateSoldierAmount();
                castle.UpdateSoldierAmount();
            }
            return(true);
        }