Beispiel #1
0
        public void engEngine_EvalFitnessForProgramEvent(BaseProgram progProgram,
                                                         BaseEngine sender)
        {
            if (progBestProgramInPreviousGeneration == null)
            {
                progBestProgramInPreviousGeneration = sender.Population[0][0];
            }

            float dAbsoluteFitness = 0;

            // Attempt to gather from 10 different tests.
            float dWorstCaseScenario = 99999999;

            for (int nTestNum = 0; nTestNum < 5; nTestNum++)
            {
                float dFitness = RunnerEvolution.ProgramRunner(m_cWorld, progProgram,
                                                               null, false);
                if (dFitness < dWorstCaseScenario)
                {
                    dWorstCaseScenario = dFitness;
                }

                /* dAbsoluteFitness += RunnerEvolution.ProgramRunner(m_cWorld, progProgram,
                 *   null, false);*/
            }

            progProgram.Fitness = 1000000 - dWorstCaseScenario;
        }
Beispiel #2
0
        private void createServer()
        {
            if (serverThread == null)
            {
                CreateServerThreadArguments args = new CreateServerThreadArguments();

                CanCreate = false;

                BaseEngine    server       = null;
                WcfEngineHost binaryHelper = new WcfEngineHost();
                waitHandle = new ManualResetEvent(false);
                switch (SelectedGame)
                {
                case ServerGame.FiveCardDraw: server = new FiveGameDrawServer(binaryHelper); break;

                case ServerGame.TexasHoldem: server = new TexasHoldemServer(binaryHelper); break;

                case ServerGame.SevenCardStud: server = new SevenCardStudServer(binaryHelper); break;

                case ServerGame.OmahaHoldem: server = new OmahaHoldemServer(binaryHelper); break;
                }
                binaryHelper.Initialize(server, SelectedGame, Port, waitHandle);
                if (multiplayer.IsChecked.Value)
                {
                    server.GameStarted += new DataEventHandler <IEnumerable <Player> >(server_GameStarted);
                }
                playerLimit = server.MaximalPlayersLimit;

                args.game = server;

                NewServerConfiguration config = ConfigurationAccess.Current.NewServerConfiguration;
                config.TournamentMode    = server.TournamentMode = TournamentMode;
                config.AcceptsNewPlayers = server.AcceptPlayersAfterGameStart = AcceptsNewPlayers;
                config.Ante            = server.Ante = Ante;
                config.SmallRaise      = server.SmallRaise = SmallRaise;
                config.RaiseLimit      = server.RaiseLimit = RaiseLimit;
                config.StartingMoney   = server.StartingMoney = StartingMoney;
                config.PlayerTimeLimit = server.ActionTimeout = TimeLimit;
                config.AutoRaiseOnHand = server.AutoIncreaseOnHandDivider = AutoRaiseOnHand;
                config.SelectedGame    = args.gameMode = SelectedGame;
                config.BotCount        = args.botCount = BotCount;
                config.Port            = args.port = Port;

                ServerAddress = "localhost";
                ServerPort    = Port;

                waitHandle.Reset();

                serverThread = new Thread(new ParameterizedThreadStart(StartServer));
                serverThread.Start(args);
                serverThread.Name         = "Game Server Thread";
                serverThread.IsBackground = true;

                if (multiplayer.IsChecked.Value)
                {
                    binaryHelper.PlayerConnected += new DataEventHandler <Player>(client_NewUserConnected);
                }
            }
        }
Beispiel #3
0
        void server_GameStarted(object sender, DataEventArgs <IEnumerable <Player> > e)
        {
            BaseEngine server = (BaseEngine)sender;

            server.GameStarted -= new DataEventHandler <IEnumerable <Player> >(server_GameStarted);
            waitHandle.Reset();
            // the wait handle was passed to the gui helper, don't set it anymore
            waitHandle = null;
        }
        void engEngine_EvalFitnessForProgramEvent(BaseProgram progProgram,
                                                  BaseEngine sender)
        {
            progProgram.Fitness = 0;
            Hashtable hsVariables = progProgram.GetVariables();
            Variable  varX        = (Variable)hsVariables["X"];
            Variable  varY        = (Variable)hsVariables["Y"];

            for (int nY = 0;
                 nY < fstBitmap.Height;
                 nY += nSkippedPixelsInImage)
            {
                for (int nX = 0;
                     nX < fstBitmap.Width;
                     nX += nSkippedPixelsInImage)
                {
                    varX.Value = (float)nX / fstBitmap.Width;
                    varY.Value = (float)nY / fstBitmap.Height;
                    Color clrPixel        = fstBitmap.GetPixel(nX, nY);
                    byte  nGrayScaleColor = (byte)((clrPixel.R + clrPixel.G + clrPixel.B) / 3);
                    float fExpectedResult = (float)((nGrayScaleColor / 128.0) - 1);
                    progProgram.Run();
                    float fActualResult = progProgram.Result;
                    float fDifference   = Math.Abs(fExpectedResult - fActualResult);
                    progProgram.Fitness += fDifference;
                    byte nActualGrayScaleColor = (byte)((fActualResult + 1) * 128.0);
                }
            }

            // @debug 6.2.2013 : in each generation, we select different pixels.

            /*for (int nY = 0;
             *   nY < fstBitmap.Height;
             *   nY ++)
             * {
             *  for (int nX = (sender.GenerationNum % nSkippedPixelsInImage);
             *       nX < fstBitmap.Width;
             *       nX += nSkippedPixelsInImage)
             *  {
             *      varX.Value = (float)nX / fstBitmap.Width;
             *      varY.Value = (float)nY / fstBitmap.Height;
             *      Color clrPixel = fstBitmap.GetPixel(nX, nY);
             *      byte nGrayScaleColor = (byte)((clrPixel.R + clrPixel.G + clrPixel.B) / 3);
             *      float fExpectedResult = (float)((nGrayScaleColor / 128.0) - 1);
             *      progProgram.Run();
             *      float fActualResult = progProgram.Result;
             *      float fDifference = Math.Abs(fExpectedResult - fActualResult);
             *      progProgram.Fitness += fDifference;
             *      byte nActualGrayScaleColor = (byte)((fActualResult + 1) * 128.0);
             *  }
             * }*/
        }
 void engEngine_GenerationIsCompleteEvent(Statistics stsStatistics, BaseEngine sender)
 {
     this.strLabelString = "Generation number " + stsStatistics.GenerationNumber
                           + " : min fitness = " + stsStatistics.MinFitnessProgram.Fitness
                           + ", Total nodes = " + stsStatistics.TotalNodes;
     try
     {
         Graphics g = this.CreateGraphics();
         ((TreeProgram)stsStatistics.MinFitnessProgram).Draw(g, this.Width, this.Height, this);
     }
     catch (System.Exception ex)
     {
     }
 }
        public static void Start()
        {
            var assetManager = AssetManager.GetAssetManager(EngineId.Ultima);

            Asset  = assetManager.GetAssetPack(null).Result;
            Data   = assetManager.GetDataPack(null).Result;
            Engine = new UltimaEngine(assetManager, Asset, Data, null);

            var scale = ConvertUtils.ExteriorCellSideLengthInMeters;

            //Engine.SpawnPlayerAndUpdate(PlayerPrefab, new Vector3(4 * scale, 20, 25 * scale));
            //Engine.SpawnPlayerAndUpdate(PlayerPrefab, new Vector3(15 * scale, 20, 25 * scale));
            Engine.SpawnPlayerAndUpdate(PlayerPrefab, new Vector3(11 * scale, 10, 29 * scale));
        }
Beispiel #7
0
        public VehicleStats(GunDetailed gun, BaseTurretWithTraverse turret, BaseEngine engine, BaseSuspension tracks, BaseVehicle vehicle, CamoInfo camo)
        {
            Camo = camo;
            var profile = vehicle.default_profile;
            int weight  = profile.hull_weight + gun.weight + turret.weight + engine.weight + tracks.weight;

            Weight               = weight / 1000.0;
            HorsePower           = engine.power;
            HorsePowerToTonRatio = HorsePower / Weight;
            TraverseSpeed        = tracks.traverse_speed * ((double)engine.power / profile.engine.power) * (profile.weight / (double)weight);
            SpeedForward         = profile.speed_forward;
            SpeedBackward        = profile.speed_backward;

            //var gunShells = API.GUNS[profile.gun_id]
            //Shells = gunShells.ToDictionary(s => s.type, s => new ShellInfo(s));
            //DefaultShell = gunShells[0];
            Info         = new VehicleInfo(vehicle);
            SignalRange  = profile.signal_range;
            TurretArmor  = new ArmorStats();
            HullArmor    = new ArmorStats(profile.armor.hull);
            FireChance   = engine.fire_chance;
            LoadLimit    = tracks.load_limit;
            AmmoCapacity = profile.max_ammo;
            Hitpoints    = profile.hull_hp + turret.hp;

            Dispersion         = gun.dispersion;
            AimTime            = gun.aim_time;
            ClipCapacity       = gun.clip_capacity;
            GunElevation       = gun.move_up_arc;
            GunDepression      = gun.move_down_arc;
            ReloadTime         = gun.reload_time;
            GunTraverseSpeed   = gun.traverse_speed;
            ClipReloadTime     = gun.clip_reload_time;
            FireRate           = gun.fire_rate;
            DamagePerMinute    = FireRate * DefaultShell.damage;
            AdvDamagePerMinute = (FireRate + 1) * DefaultShell.damage;

            ViewRange           = turret.view_range;
            GunArcLeft          = turret.traverse_left_arc;
            GunArcRight         = turret.traverse_right_arc;
            TurretTraverseSpeed = turret.traverse_speed;

            ModulesInfo = new Dictionary <ModuleType, BaseModule>(4);
            ModulesInfo.Add(ModuleType.vehicleEngine, engine);
            ModulesInfo.Add(ModuleType.vehicleGun, gun);
            ModulesInfo.Add(ModuleType.vehicleTurret, turret);
            ModulesInfo.Add(ModuleType.vehicleChassis, tracks);
            ModulesInfo.Add(ModuleType.vehicleHull, new BaseModule(vehicle.name, profile.hull_weight, vehicle.tier));
        }
Beispiel #8
0
        public void engEngine_GenerationIsCompleteEvent(Statistics stsStatistics,
                                                        BaseEngine sender)
        {
            strLabelString = "Generation num = " + stsStatistics.GenerationNumber + ", Min fitness = " +
                             stsStatistics.MinFitnessProgram.Fitness + ", Min fitness nodes = " + stsStatistics.MinFitnessProgram.Size;
            ((TreeProgram)stsStatistics.MinFitnessProgram).Draw(pnlDrawProgram.CreateGraphics(), pnlDrawProgram.Width, pnlDrawProgram.Height, this);

            if (((stsStatistics.GenerationNumber % 10) == 0) && (stsStatistics.GenerationNumber != 0))
            {
                for (int i = 0; i < 5; i++)
                {
                    RunnerEvolution.ProgramRunner(m_cWorld, stsStatistics.MinFitnessProgram,
                                                  pnlWorldView.CreateGraphics(), true);
                }
            }


            // Show statistics about the islands. Make a graph about the islands fitnesses.
            progBestProgramInPreviousGeneration = stsStatistics.MinFitnessProgram;

            float dMinimalFitnessInPopulation = stsStatistics.MinFitnessProgram.Fitness;
            float dMaxMinFitnessInIslands     = 0;

            for (int i = 0; i < sender.NumberOfIslands; i++)
            {
                BaseProgram cMinFitnessProgramForIsland = stsStatistics.GetMinFitnessProgramForIsland(i);
                if (cMinFitnessProgramForIsland.Fitness > dMaxMinFitnessInIslands)
                {
                    dMaxMinFitnessInIslands = cMinFitnessProgramForIsland.Fitness;
                }
            }

            int      ISLAND_BAR_WIDTH = (int)(pnlViewIslands.Width / sender.NumberOfIslands);
            Graphics g = pnlViewIslands.CreateGraphics();

            g.Clear(Color.Black);
            for (int i = 0; i < sender.NumberOfIslands; i++)
            {
                float dIslandFitness          = stsStatistics.GetMinFitnessProgramForIsland(i).Fitness;
                float dPrecentageOfMinFitness = (dIslandFitness - dMinimalFitnessInPopulation) / (dMaxMinFitnessInIslands - dMinimalFitnessInPopulation);
                g.FillRectangle(Brushes.RoyalBlue, i * ISLAND_BAR_WIDTH, pnlViewIslands.Height - (pnlViewIslands.Height * dPrecentageOfMinFitness), ISLAND_BAR_WIDTH, pnlViewIslands.Height);
            }

            // Write the max and min fitnesses value on the graph.
            g.DrawString(dMaxMinFitnessInIslands.ToString(), new Font("Times New Roman", 12.0f), Brushes.Red, 0, 0);
            g.DrawString(dMinimalFitnessInPopulation.ToString(), new Font("Times New Roman", 12.0f), Brushes.Red, 0, pnlViewIslands.Height - 20);
        }
Beispiel #9
0
        public void engEngine_EvalFitnessForProgramEvent(BaseProgram progProgram,
                                                         BaseEngine sender)
        {
            if (progBestProgramInPreviousGeneration == null)
            {
                progBestProgramInPreviousGeneration = sender.Population[0][0];
            }

            float dAbsoluteFitness = 0;

            // Attempt to gather from 20 different tests.
            for (int nTestNum = 0; nTestNum < 5; nTestNum++)
            {
                dAbsoluteFitness += CAEvolution.ProgramRunner(progProgram,
                                                              progBestProgramInPreviousGeneration, null, false);
            }

            progProgram.Fitness = 100000 - dAbsoluteFitness;
        }
Beispiel #10
0
        public static void Start()
        {
            var assetUri = "game://Morrowind/Morrowind.bsa";
            var dataUri  = "game://Morrowind/Morrowind.esm";

            //var assetUri = "game://Oblivion/Oblivion*";
            //var dataUri = "game://Oblivion/Oblivion.esm";

            var assetManager = AssetManager.GetAssetManager(EngineId.Tes);

            Asset  = assetManager.GetAssetPack(assetUri).Result;
            Data   = assetManager.GetDataPack(dataUri).Result;
            Engine = new BaseEngine(assetManager, Asset, Data);

            // engine
            Engine.SpawnPlayer(PlayerPrefab, new Vector3(-137.94f, 2.30f, -1037.6f)); // new Vector3Int(-2, -9)

            // engine - oblivion
            //Engine.SpawnPlayer(PlayerPrefab, new Vector3Int(0, 0, 60), new Vector3(0, 0, 0));
        }
Beispiel #11
0
        private async void InitAsync()
        {
            TheCDEngines.MyContentEngine?.RegisterEvent(eEngineEvents.PreShutdown, OnPreShutdown);

            await TheBaseEngine.WaitForEnginesStartedAsync();

            await TheBaseEngine.WaitForStorageReadinessAsync(true);

            TheBaseAssets.MyCmdArgs.TryGetValue("SafSearchPath", out var searchPath);
            if (TheBaseAssets.MyCmdArgs.TryGetValue("SafUserBasePath", out var userBasePath) && !Path.IsPathRooted(userBasePath))
            {
                userBasePath = Path.Combine(TheBaseAssets.MyServiceHostInfo.BaseDirectory, "ClientBin", userBasePath);
            }
            _serviceHost = new ServiceHost(InstallInfrastructureServices, searchPath, userBasePath);

            _isInitialized       = true;
            TheThing.StatusLevel = 1;
            TheThing.LastMessage = "Plug-in initialized";
            FireEvent(eThingEvents.Initialized, TheThing, true, false);
            BaseEngine.ProcessInitialized();
        }
Beispiel #12
0
        public void engEngine_GenerationIsCompleteEvent(Statistics stsStatistics,
                                                        BaseEngine sender)
        {
            strLabelString = "Generation num = " + stsStatistics.GenerationNumber + ", Min fitness = " +
                             stsStatistics.MinFitnessProgram.Fitness + ", Min fitness nodes = " + stsStatistics.MinFitnessProgram.Size;
            ((TreeProgram)stsStatistics.MinFitnessProgram).Draw(pnlDrawProgram.CreateGraphics(), pnlDrawProgram.Width, pnlDrawProgram.Height, this);

            if ((stsStatistics.GenerationNumber % 20) == 0)
            {
                CAEvolution.ProgramRunner(stsStatistics.MinFitnessProgram,
                                          progBestProgramInPreviousGeneration, pnlMatrixDisplay.CreateGraphics(), true);

                CAEvolution.ProgramRunner(stsStatistics.MinFitnessProgram,
                                          progBestProgramInPreviousGeneration, pnlMatrixDisplay.CreateGraphics(), true);

                CAEvolution.ProgramRunner(stsStatistics.MinFitnessProgram,
                                          progBestProgramInPreviousGeneration, pnlMatrixDisplay.CreateGraphics(), true);
            }

            progBestProgramInPreviousGeneration = stsStatistics.MinFitnessProgram;
        }
Beispiel #13
0
        public async Task <List <Tuple <string, string> > > GetPositionNumber(List <string> in_lstEngineSelected,
                                                                              string in_strKeyWords,
                                                                              string in_strDomainUR,
                                                                              int in_iWithin
                                                                              )
        {
            List <Tuple <string, string> > res = new List <Tuple <string, string> >();
            EngineFactory factory = new EngineFactory();

            foreach (var item in in_lstEngineSelected)
            {
                BaseEngine engine = factory.GetEngine(item.ToLower());
                engine.SetDomainURL(in_strDomainUR);
                engine.SetKeyWords(in_strKeyWords);
                engine.SetWithinNumber(in_iWithin);

                res.Add(new Tuple <string, string>(item, await engine.GetPositionNumber()));
            }

            return(res);
        }
Beispiel #14
0
 private void StartServer(object threadArguments)
 {
     try
     {
         CreateServerThreadArguments args = (CreateServerThreadArguments)threadArguments;
         BaseEngine server = args.game;
         server.Initialize();
         Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(serverInitialized));
         if (args.botCount > 0)
         {
             spawBots(args.botCount, args.gameMode, args.port);
         }
         Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(serverIsUp));
         server.Run();
     }
     catch
     {
     }
     finally
     {
         serverThread = null;
     }
 }
Beispiel #15
0
 public BaseGameImpl(string name, BaseEngine <TGame, TPlayer, TRoom, TContainer, TThing> engine)
 {
     this.Name        = name;
     this.Engine      = engine;
     this.Engine.Game = this;
 }
Beispiel #16
0
 /// <summary>
 /// Initializes the helper with the required parameters
 /// </summary>
 /// <param name="engine">The engine which runs the game</param>
 /// <param name="game">The running game</param>
 public void Initialize(BaseEngine engine, ServerGame game)
 {
     this.owner = engine;
     this.game  = game;
 }
Beispiel #17
0
        BaseEngine m_engEngine; // The engine

        #endregion

        #region Constructor

        /// <summary>
        /// Consturct a new statistics from an Engine class
        /// </summary>
        /// <param name="engEngine">The engine</param>
        public Statistics(BaseEngine engEngine)
        {
            this.m_engEngine = engEngine;
        }
 public MTCPClientEngine(BaseEngine engine) : base(engine)
 {
 }
        void engEngine_GenerationIsCompleteEvent(Statistics stsStatistics,
                                                 BaseEngine sender)
        {
            this.strLabelString = "Generation number " + stsStatistics.GenerationNumber
                                  + " : min fitness = " + stsStatistics.MinFitnessProgram.Fitness
                                  + " skipped pixels : " + nSkippedPixelsInImage
                                  + ", Total nodes = " + stsStatistics.TotalNodes;

            BaseProgram progMinFitness = stsStatistics.MinFitnessProgram;

            // If the generation is between 10-20, 40-50, 60-70 and so forth,
            // Make 10 generations of "tree minimizing which should minimize its fitness
            // According to tree size.

            /*
             * if (((stsStatistics.GenerationNumber / 50) % 2) == 1)
             *           {
             *               float fMinFitness = progMinFitness.Fitness;
             *               foreach (BaseProgram[] islIsland in sender.Population)
             *               {
             *                   foreach (BaseProgram progProgram in islIsland)
             *                   {
             *                       TreeProgram treProgram = (TreeProgram)progProgram;
             *                       if (treProgram.Fitness <= fMinFitness)
             *                       {
             *                           treProgram.Fitness = fMinFitness * (1 - ((float)1 / treProgram.Depth));
             *                       }
             *                   }
             *               }
             *           }*/


            FastBitmap fstOutputBitmap = null;

            if ((stsStatistics.GenerationNumber % 1) == 0)
            {
                fstOutputBitmap =
                    new FastBitmap(fstBitmap.Width * 6, fstBitmap.Height * 6);

                Hashtable hsVariables = progMinFitness.GetVariables();
                Variable  varX        = (Variable)hsVariables["X"];
                Variable  varY        = (Variable)hsVariables["Y"];

                for (int nY = 0;
                     nY < fstOutputBitmap.Height;
                     nY++)
                {
                    for (int nX = 0;
                         nX < fstOutputBitmap.Width;
                         nX++)
                    {
                        varX.Value = (float)nX / fstOutputBitmap.Width;
                        varY.Value = (float)nY / fstOutputBitmap.Height;
                        progMinFitness.Run();
                        float fActualResult         = progMinFitness.Result;
                        byte  nActualGrayScaleColor = (byte)((fActualResult + 1.0F) * 127.0F);
                        fstOutputBitmap.SetPixel(nX, nY,
                                                 nActualGrayScaleColor, nActualGrayScaleColor, nActualGrayScaleColor);
                    }
                }


                fstOutputBitmap.Draw(this.CreateGraphics(), 0, 0,
                                     this.Width, this.Height);
            }

            /*else
             * {
             *  fstOutputBitmap =
             *      new FastBitmap(fstBitmap.Width * 6, fstBitmap.Height * 6);
             * }*/


//              try
//              {
//                 Graphics g = this.CreateGraphics();
//                 stsStatistics.MinFitnessProgram.Draw(g, this.Width, this.Height, this);
//              }
//              catch (System.Exception ex)
//              {
//              }
        }
Beispiel #20
0
 /// <summary>
 /// Initializes the host with all of the required information. This method must be called prior to the call to
 /// <see cref="BaseEngine.Run"/> method
 /// </summary>
 /// <param name="owner">The owning engine which configures the environment</param>
 /// <param name="game">The running game</param>
 /// <param name="port">The port in which the server will listen</param>
 /// <param name="waitHandle">The wait handle which is used to communicate with the engine helper</param>
 public void Initialize(BaseEngine owner, ServerGame game, int port, WaitHandle waitHandle)
 {
     concreteHelper.Initialize(owner, game);
     this.port       = port;
     this.waitHandle = waitHandle;
 }
 public MTCPServerEngine(BaseEngine engine) : base(engine)
 {
 }
Beispiel #22
0
        /// <summary>
        /// The console application entry class
        /// </summary>
        /// <param name="args">
        /// The command line arguments.
        /// </param>
        static void Main(string[] args)
        {
            try
            {
                // print the command line usage if the arguments do not match
                if (args.Length < 2)
                {
                    Console.WriteLine("Usage: <server address | Game Mode> <port>");
                    Console.WriteLine("server address: ip or dns");
                    Console.WriteLine("Game Mode: texas,five,seven,omaha");
                    Console.WriteLine("port: the port in which the server runs");
                }
                else
                {
                    int        port     = -1;
                    string     serverIp = string.Empty;
                    ServerGame game     = ServerGame.FiveCardDraw;
                    port = int.Parse(args[1]);
                    // test to see if the game mode is recognized
                    if (args[0] == "texas")
                    {
                        game = ServerGame.TexasHoldem;
                    }
                    else if (args[0] == "five")
                    {
                        game = ServerGame.FiveCardDraw;
                    }
                    else if (args[0] == "seven")
                    {
                        game = ServerGame.SevenCardStud;
                    }
                    else if (args[0] == "omaha")
                    {
                        game = ServerGame.OmahaHoldem;
                    }
                    else // assume the argument is an ip or dns
                    {
                        serverIp = args[0];
                    }
                    // found a match to the game
                    if (serverIp == string.Empty)
                    {
                        BaseEngine    server       = null;
                        WcfEngineHost binaryHelper = new WcfEngineHost();
                        switch (game)
                        {
                        case ServerGame.FiveCardDraw: server = new FiveGameDrawServer(binaryHelper); break;

                        case ServerGame.TexasHoldem: server = new TexasHoldemServer(binaryHelper); break;

                        case ServerGame.SevenCardStud: server = new SevenCardStudServer(binaryHelper); break;

                        case ServerGame.OmahaHoldem: server = new OmahaHoldemServer(binaryHelper); break;
                        }
                        System.Threading.ManualResetEvent waitHandle = new System.Threading.ManualResetEvent(false);
                        binaryHelper.Initialize(server, game, port, waitHandle);
                        // initialize the server and run until the game is over
                        server.Initialize();
                        Console.WriteLine("Press enter to stop the registration");
                        Console.ReadLine();
                        waitHandle.Set();
                        server.Run();
                        waitHandle.Close();
                    }
                    else
                    {
                        // if the arguments count is higher than 2 assume the process started will be played by an AI engine.
                        bool useAi = args.Length > 2;
                        // this is the base client which will hold the connected game
                        ClientHelperBridge     clientBridge = new ClientHelperBridge();
                        RulesInterpreterBridge rulesBridge  = new RulesInterpreterBridge();
                        BaseWcfClient          client       = new BaseWcfClient(clientBridge);
                        clientBridge.ClientHelper = new ConsoleClientHelper(rulesBridge);
                        ServerDetails result = client.Initialize(serverIp, port);

                        // check the result of the connection
                        if (result.CanConnect)
                        {
                            IClientHelper outerClient = null;
                            if (useAi)
                            {
                                switch (result.Game)
                                {
                                case ServerGame.FiveCardDraw: outerClient = new FiveGameDrawClient(new AiFiveCardDrawClient(new ConsoleFiveGameDrawClient(rulesBridge), rulesBridge)); break;

                                case ServerGame.OmahaHoldem: outerClient = new OmahaHoldemClient(new AiClientHelper(new ConsoleTexasHoldemClient(rulesBridge, 4), rulesBridge)); break;

                                case ServerGame.SevenCardStud: outerClient = new GameClient <SevenCardStudGame>(new AiClientHelper(new ConsoleClientHelper(rulesBridge), rulesBridge)); break;

                                case ServerGame.TexasHoldem: outerClient = new GameClient <TexasHoldem>(new AiClientHelper(new ConsoleTexasHoldemClient(rulesBridge), rulesBridge)); break;
                                }
                            }
                            else
                            {
                                switch (result.Game)
                                {
                                case ServerGame.FiveCardDraw: outerClient = new FiveGameDrawClient(new ConsoleFiveGameDrawClient(rulesBridge)); break;

                                case ServerGame.OmahaHoldem: outerClient = new OmahaHoldemClient(new ConsoleTexasHoldemClient(rulesBridge, 4)); break;

                                case ServerGame.SevenCardStud: outerClient = new GameClient <SevenCardStudGame>(new ConsoleClientHelper(rulesBridge)); break;

                                case ServerGame.TexasHoldem: outerClient = new GameClient <TexasHoldem>(new ConsoleTexasHoldemClient(rulesBridge)); break;
                                }
                            }

                            IRulesInterpreter interpreter = (IRulesInterpreter)outerClient;
                            rulesBridge.Interpreter = interpreter;

                            if (result.Game == ServerGame.FiveCardDraw)
                            {
                                clientBridge.FiveCardHelper = (IFiveCardClientHelper)outerClient;
                            }
                            else
                            {
                                clientBridge.ClientHelper = outerClient;
                            }

                            client.Connect();
                            // run until the game is over
                            client.Run();
                            client.Disconnect();
                        }
                        else
                        {
                            Console.WriteLine("Game is in progress. Server refused connection");
                        }
                    }
                }
            }
            catch (Exception e)
            {
                // an error occured. print an unfriendly message
                Console.WriteLine("Uh oh, I did bad");
                // when a debugger is attached, break it so you can learn of the error.
                if (System.Diagnostics.Debugger.IsAttached)
                {
                    Console.WriteLine(e.Message);
                    System.Diagnostics.Debugger.Break();
                }
            }
        }
 internal MTCPNetworkEngine(BaseEngine engine) : base(engine)
 {
 }