コード例 #1
0
        public void GetCityBytes_WhenPlayersInRegionArentInOrder_ShouldSucceed(
            [Frozen] DefaultMultiObjectLock.Factory lockerFactory,
            IMultiObjectLock locker,
            IMiniMapRegionObject obj1,
            IMiniMapRegionObject obj2,
            MiniMapRegion miniMapRegion)
        {
            obj1.Hash.Returns(1);
            obj2.Hash.Returns(2);

            lockerFactory().Lock(Arg.Is <ILockable[]>(p => p.SequenceEqual(new[] { obj2, obj1 })))
            .Returns(locker);

            locker.When(p => p.SortLocks(Arg.Is <ILockable[]>(a => a.SequenceEqual(new[] { obj2, obj1 }))))
            .Do(args => Array.Sort((ILockable[])args[0], DefaultMultiObjectLock.CompareObject));

            locker.Do(Arg.Any <Func <bool> >()).Returns(callInfo =>
            {
                var action = callInfo.Arg <Func <bool> >();
                return(action());
            });

            miniMapRegion.Add(obj2);
            miniMapRegion.Add(obj1);

            miniMapRegion.GetCityBytes().Should().NotBeNull();
        }
コード例 #2
0
 public DefaultLocker(DefaultMultiObjectLock.Factory multiObjectLockFactory,
                      CallbackLock.Factory callbackLockFactory,
                      IGameObjectLocator locator)
 {
     this.multiObjectLockFactory = multiObjectLockFactory;
     this.callbackLockFactory    = callbackLockFactory;
     this.locator = locator;
 }
コード例 #3
0
        public Region(byte[] map, DefaultMultiObjectLock.Factory lockerFactory, IRegionLocator regionLocator, IRegionObjectListFactory regionObjectListFactory)
        {
            this.map           = map;
            this.lockerFactory = lockerFactory;
            this.regionLocator = regionLocator;

            tileObjects    = regionObjectListFactory.CreateRegionObjectList();
            primaryObjects = regionObjectListFactory.CreateRegionObjectList();
        }
コード例 #4
0
 public BarbarianTribeManager(IDbManager dbManager,
                              IBarbarianTribeFactory barbarianTribeFactory,
                              IBarbarianTribeConfigurator barbarianTribeConfigurator,
                              IRegionManager regionManager,
                              DefaultMultiObjectLock.Factory multiObjectLockFactory,
                              ITileLocator tileLocator)
 {
     this.dbManager                  = dbManager;
     this.barbarianTribeFactory      = barbarianTribeFactory;
     this.barbarianTribeConfigurator = barbarianTribeConfigurator;
     this.regionManager              = regionManager;
     this.multiObjectLockFactory     = multiObjectLockFactory;
     this.tileLocator                = tileLocator;
 }
コード例 #5
0
        public void Lock_CityIdTroopId_WhenTroopIsNotFound_ShouldReturnEmptyLockAndNullCity(
            [Frozen] IGameObjectLocator locator,
            [FrozenMock] DefaultMultiObjectLock.Factory lockFactory,
            IMultiObjectLock cityLock,
            IMultiObjectLock emptyLock,
            ICity city,
            ITroopObject troop,
            DefaultLocker locker)
        {
            lockFactory().Returns(cityLock, emptyLock);

            ICity outCity;

            locator.TryGetObjects(1, out outCity).Returns(call =>
            {
                call[1] = city;
                return(true);
            });

            ITroopObject outTroop;

            city.TryGetTroop(2, out outTroop).Returns(false);

            ICity        lockedCity;
            ITroopObject lockedTroop;
            var          multiObjLock = locker.Lock(1, 2, out lockedCity, out lockedTroop);

            ((object)lockedCity).Should().BeNull();
            lockedTroop.Should().BeNull();
            multiObjLock.Should().Be(emptyLock);
            emptyLock.Received(1)
            .Lock(Arg.Is <ILockable[]>(itemsLocked => !itemsLocked.Any()));
            cityLock.Received(1)
            .Lock(Arg.Is <ILockable[]>(itemsLocked => itemsLocked.SequenceEqual(new[] { city })));
            cityLock.Received(1).UnlockAll();
        }
コード例 #6
0
        public void Load(Container container)
        {
            container.Options.ConstructorResolutionBehavior = new MostResolvableConstructorBehavior(container);

            container.Register <IKernel>(() => new Ioc(container), Lifestyle.Singleton);

            #region World/Map

            var worldRegistration = Lifestyle.Singleton.CreateRegistration <World>(container);
            container.AddRegistration(typeof(IWorld), worldRegistration);
            container.AddRegistration(typeof(IGameObjectLocator), worldRegistration);

            container.Register <IGlobal, Global>(Lifestyle.Singleton);
            container.Register <IRegionManager, RegionManager>(Lifestyle.Singleton);
            container.Register <IRegionLocator, RegionLocator>(Lifestyle.Singleton);
            container.Register <RegionObjectList>();
            container.Register <ICityManager, CityManager>(Lifestyle.Singleton);
            container.Register <IForestManager, ForestManager>(Lifestyle.Singleton);
            container.Register <IRoadManager, RoadManager>(Lifestyle.Singleton);
            container.Register <IRoadPathFinder, RoadPathFinder>();

            container.Register <IThemeManager, ThemeManager>(Lifestyle.Singleton);
            container.Register <IStoreManager, StoreManager>(Lifestyle.Singleton);

            container.Register <StoreSync>(Lifestyle.Singleton);

            #endregion

            #region General Comms

            container.Register <BlockingBufferManager>(() => new BlockingBufferManager(2048, 7500), Lifestyle.Singleton);
            container.Register <SocketAwaitablePool>(() => new SocketAwaitablePool(100), Lifestyle.Singleton);
            container.Register <IChannel, Channel>(Lifestyle.Singleton);
            container.Register <IPolicyServer, PolicyServer>(Lifestyle.Singleton);
            container.Register <INetworkServer, AsyncTcpServer>(Lifestyle.Singleton);
            container.Register <TServer>(() =>
            {
                var logger = LoggerFactory.Current.GetLogger <TSimpleServer>();
                return(new TSimpleServer(new Notification.Processor(container.GetInstance <NotificationHandler>()), new TServerSocket(46000), logger.Warn));
            }, Lifestyle.Singleton);

            container.Register <Chat>(Lifestyle.Singleton);
            container.Register <ICityTriggerManager, CityTriggerManager>(Lifestyle.Singleton);

            container.Register <IQueueListener, QueueListener>(Lifestyle.Singleton);
            container.Register <IQueueCommandProcessor>(() => new QueueCommandProcessor(container.GetInstance <PlayerQueueCommandsModule>()), Lifestyle.Singleton);

            if (Config.database_load_players)
            {
                container.Register <ILoginHandler, MainSiteLoginHandler>(Lifestyle.Singleton);
            }
            else
            {
                container.Register <ILoginHandler, DummyLoginHandler>(Lifestyle.Singleton);
            }

            #endregion

            #region Tribes

            container.Register <ITribeManager, TribeManager>(Lifestyle.Singleton);
            container.Register <ITribeLogger, TribeLogger>();

            #endregion

            #region Locking

            container.Register <DefaultMultiObjectLock.Factory>(() => () => new DefaultMultiObjectLock(container.GetInstance <IDbManager>()), Lifestyle.Singleton);

            container.Register <ILocker>(() =>
            {
                DefaultMultiObjectLock.Factory multiObjectLockFactory = () => new DefaultMultiObjectLock(container.GetInstance <IDbManager>());

                return(new DefaultLocker(multiObjectLockFactory,
                                         () => new CallbackLock(multiObjectLockFactory),
                                         container.GetInstance <IGameObjectLocator>()));
            }, Lifestyle.Singleton);

            #endregion

            #region Formulas

            container.Register <Formula>(Lifestyle.Singleton);
            container.Register <RequirementFormula>(Lifestyle.Singleton);

            #endregion

            #region CSV Factories

            container.Register <FactoriesInitializer>(Lifestyle.Singleton);
            container.Register <ActionRequirementFactory>(Lifestyle.Singleton);
            container.Register <IStructureCsvFactory, StructureCsvFactory>(Lifestyle.Singleton);
            container.Register <EffectRequirementFactory>(Lifestyle.Singleton);
            container.Register <InitFactory>(Lifestyle.Singleton);
            container.Register <PropertyFactory>(Lifestyle.Singleton);
            container.Register <IRequirementCsvFactory, RequirementCsvFactory>(Lifestyle.Singleton);
            container.Register <TechnologyFactory>(Lifestyle.Singleton);
            container.Register <UnitFactory>(Lifestyle.Singleton);
            container.Register <IObjectTypeFactory, ObjectTypeFactory>(Lifestyle.Singleton);
            container.Register <UnitModFactory>(Lifestyle.Singleton);
            container.Register <MapFactory>(Lifestyle.Singleton);

            #endregion

            #region Database

            container.Register <IDbManager>(() => new MySqlDbManager(LoggerFactory.Current.GetLogger <IDbManager>(),
                                                                     Config.database_host,
                                                                     Config.database_username,
                                                                     Config.database_password,
                                                                     Config.database_database,
                                                                     Config.database_timeout,
                                                                     Config.database_max_connections,
                                                                     Config.database_verbose), Lifestyle.Singleton);

            #endregion

            #region Battle

            container.Register <IBattleReport, BattleReport>();

            container.Register <IBattleManagerFactory, BattleManagerFactory>();

            container.Register <IBattleReportWriter, SqlBattleReportWriter>();

            container.Register <ICombatUnitFactory, CombatUnitFactory>(Lifestyle.Singleton);

            container.Register <IBattleFormulas, BattleFormulas>(Lifestyle.Singleton);

            #endregion

            #region Processor

            container.Register <CommandLineProcessor>(() => new CommandLineProcessor(container.GetInstance <AssignmentCommandLineModule>(),
                                                                                     container.GetInstance <PlayerCommandLineModule>(),
                                                                                     container.GetInstance <CityCommandLineModule>(),
                                                                                     container.GetInstance <ResourcesCommandLineModule>(),
                                                                                     container.GetInstance <TribeCommandLineModule>(),
                                                                                     container.GetInstance <StrongholdCommandLineModule>(),
                                                                                     container.GetInstance <RegionCommandsLineModule>(),
                                                                                     container.GetInstance <BarbarianTribeCommandsLineModule>(),
                                                                                     container.GetInstance <SystemCommandLineModule>(),
                                                                                     container.GetInstance <BarbarianTribeCommandsLineModule>()),
                                                      Lifestyle.Singleton);

            container.Register <IProcessor>(() => new Processor(container.GetInstance <AssignmentCommandsModule>(),
                                                                container.GetInstance <BattleCommandsModule>(),
                                                                container.GetInstance <EventCommandsModule>(),
                                                                container.GetInstance <ChatCommandsModule>(),
                                                                container.GetInstance <CommandLineCommandsModule>(),
                                                                container.GetInstance <LoginCommandsModule>(),
                                                                container.GetInstance <MarketCommandsModule>(),
                                                                container.GetInstance <MiscCommandsModule>(),
                                                                container.GetInstance <PlayerCommandsModule>(),
                                                                container.GetInstance <RegionCommandsModule>(),
                                                                container.GetInstance <StructureCommandsModule>(),
                                                                container.GetInstance <TribeCommandsModule>(),
                                                                container.GetInstance <TribesmanCommandsModule>(),
                                                                container.GetInstance <StrongholdCommandsModule>(),
                                                                container.GetInstance <ProfileCommandsModule>(),
                                                                container.GetInstance <TroopCommandsModule>(),
                                                                container.GetInstance <StoreCommandsModule>()),
                                            Lifestyle.Singleton);

            #endregion

            #region Utils

            container.Register <SmartThreadPool>(() => new SmartThreadPool(), Lifestyle.Singleton);

            container.Register <IScheduler>(() =>
            {
                ITaskScheduler taskScheduler;
                if (Config.scheduler_use_smartthreadpoool)
                {
                    var threadPool = container.GetInstance <SmartThreadPool>();
                    taskScheduler  = new SmartThreadPoolTaskScheduler(threadPool.CreateWorkItemsGroup(Config.scheduler_threads));
                }
                else
                {
                    taskScheduler = new LimitedConcurrencyLevelTaskScheduler.TaskFactory(new LimitedConcurrencyLevelTaskScheduler(Config.scheduler_threads));
                }

                return(new ThreadedScheduler(taskScheduler));
            }, Lifestyle.Singleton);
            container.Register <ITileLocator, TileLocator>();
            container.Register <GetRandom>(() => new Random().Next);
            container.Register <Procedure>(Lifestyle.Singleton);
            container.Register <BattleProcedure>(Lifestyle.Singleton);
            container.Register <StrongholdBattleProcedure>(Lifestyle.Singleton);
            container.Register <CityBattleProcedure>(Lifestyle.Singleton);
            container.Register <BarbarianTribeBattleProcedure>(Lifestyle.Singleton);
            container.Register <CallbackProcedure>(Lifestyle.Singleton);
            container.Register <Random>(() => new Random());
            container.Register <ISystemVariableManager, SystemVariableManager>(Lifestyle.Singleton);
            container.Register <SystemVariablesUpdater>(Lifestyle.Singleton);

            #endregion

            #region Stronghold

            container.Register <IStrongholdManager, StrongholdManager>(Lifestyle.Singleton);

            container.Register <IStrongholdConfigurator>(() => new StrongholdConfigurator(
                                                             new NameGenerator(Path.Combine(Config.maps_folder, "strongholdnames.txt")),
                                                             container.GetInstance <MapFactory>(),
                                                             container.GetInstance <ITileLocator>(),
                                                             container.GetInstance <IRegionManager>()), Lifestyle.Singleton);
            if (Config.stronghold_bypass_activation)
            {
                container.Register <IStrongholdActivationCondition, DummyActivationCondition>();
            }
            else
            {
                container.Register <IStrongholdActivationCondition, StrongholdActivationCondition>();
            }
            container.Register <StrongholdActivationChecker>(Lifestyle.Singleton);
            container.Register <StrongholdChecker>(Lifestyle.Singleton);

            container.Register <IStrongholdFactory, StrongholdFactory>();
            container.Register <IStrongholdManagerLogger, StrongholdManagerLogger>();

            #endregion

            #region Barbarian Tribe

            container.Register <IBarbarianTribeManager, BarbarianTribeManager>(Lifestyle.Singleton);
            container.Register <IBarbarianTribeConfigurator, BarbarianTribeWeightedConfigurator>(Lifestyle.Singleton);
            container.Register <IBarbarianTribeFactory, BarbarianTribeFactory>();
            container.Register <BarbarianTribeChecker>(Lifestyle.Singleton);

            #endregion

            #region City

            container.Register <ICityChannel, CityChannel>(Lifestyle.Singleton);
            container.Register <ICityFactory, CityFactory>(Lifestyle.Singleton);
            container.Register <IGameObjectFactory, GameObjectFactory>(Lifestyle.Singleton);

            #endregion

            var allTypes         = this.GetType().Assembly.GetTypes();
            var allRegistrations = container.GetCurrentRegistrations().ToDictionary(p => p.ServiceType, p => p.Registration);
            foreach (var factoryInterfaceType in allTypes.Where(type => type.IsInterface && type.Name.EndsWith("Factory")))
            {
                var implementingTypes = allTypes.Where(type => type.IsInterface == false &&
                                                       type.IsAbstract == false &&
                                                       type.IsGenericTypeDefinition == false &&
                                                       factoryInterfaceType.IsAssignableFrom(type))
                                        .ToArray();

                if (implementingTypes.Length == 0)
                {
                    throw new Exception(string.Format("Factory without any implementations. Implement type {0}", factoryInterfaceType.Name));
                }

                // Check if already registered
                if (allRegistrations.ContainsKey(factoryInterfaceType))
                {
                    continue;
                }

                if (implementingTypes.Length > 1)
                {
                    throw new Exception(string.Format("Found interface factory that has more than 1 implementation and was not registered {0}", factoryInterfaceType.Name));
                }

                container.Register(factoryInterfaceType, implementingTypes.First(), Lifestyle.Singleton);
            }
        }
コード例 #7
0
 public MiniMapRegion(DefaultMultiObjectLock.Factory lockerFactory, IGlobal global)
 {
     this.lockerFactory = lockerFactory;
     this.global        = global;
 }
コード例 #8
0
 public CallbackLock(DefaultMultiObjectLock.Factory multiObjectLockFactory)
 {
     this.multiObjectLockFactory = multiObjectLockFactory;
 }