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); }
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); }
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); }
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); }
public bool Handle(DomainEventHandlerData <SelectOpponentArmySettingEvent> @event) { var snap = @event.Snapshot as GameAggregate; if (snap == null) { return(false); } snap.OpponentArmySetting = @event.EventObject.ArmySetting; return(true); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }