/// <summary> /// Starts the game and its management/handlers etc. /// </summary> public async void StartAsync(MySqlConnectionSettings mySqlConnSettings) { if (_loadingInProgress) { _logger.UpdateLog("Game loading in progress!"); return; } _loadingInProgress = true; try { if (this.State == GameState.Active) { _logger.UpdateLog("The game is already active!"); return; } _mySqlConnSettings = mySqlConnSettings; int counter; try { //GAME DATA using (MySqlDbManager gwdDbManager = new MySqlDbManager(_mySqlConnSettings)) { #region Connection starting //CONNECTION STARTING _logger.UpdateLog("Starting connection for data loading..."); bool connectionSuccess = false; using (BoxedData connStartData = await gwdDbManager.StartConnectionTaskStart()) { if (!String.IsNullOrEmpty(connStartData.Msg)) { _logger.UpdateLog(connStartData.Msg); } connectionSuccess = (bool)connStartData.Data; } if (!connectionSuccess) { throw new Exception("connection not estabilished!"); } #endregion #region Account data //ACCOUNT DATA _accountData = new AccountData(_logger); _accountData.LoadAccountsAsync(gwdDbManager); while (!_accountData.IsLoaded) { await Task.Factory.StartNew(() => Thread.Sleep(1000)); if (_accountData.LoadingError) { throw new Exception("account data loading failure!"); } } //_accountData.ShowAccountsInLog(); //NOTE: only for testing (shows secret account details)! #endregion #region Game world data //GAME DATA LOADING _gameWorldData = new GameWorldData(_logger); _gameWorldData.LoadWorldDataAsync(gwdDbManager); counter = 0; while (!_gameWorldData.IsLoaded) { await Task.Factory.StartNew(() => Thread.Sleep(1000)); counter++; if (_gameWorldData.LoadingError) { throw new Exception("game world data loading failure!"); } } _logger.UpdateLog($"Game data loading ended in {counter} seconds."); #endregion } //PLAYER HANDLER _playerHandler = new PlayerHandler(_logger); //GAME STATE HANDLER _gameStateHandler = new GameStateHandler(_logger, _gameWorldData, _gameWorldData, _playerHandler); //CHAT HANDLER _chatHandler = new ChatHandler(_logger, _gameWorldData, _playerHandler); //COMMAND HANDLER _commandHandler = new CommandHandler(_logger); _commandHandler.RegisterCommandHandlingStrategy(new CmdPingStrategy()); _commandHandler.RegisterCommandHandlingStrategy(new MoveCharRequestStrategy(_logger, _gameStateHandler, _gameWorldData, _playerHandler)); _commandHandler.RegisterCommandHandlingStrategy(new CmdChatStrategy(_logger, _chatHandler)); _commandHandler.RegisterCommandHandlingStrategy(new SwitchPlaceRequestStrategy(_logger, _gameStateHandler, _gameWorldData, _gameWorldData, _playerHandler)); _commandHandler.RegisterCommandHandlingStrategy(new CmdGetLocationCharsStrategy(_logger, _gameWorldData)); _commandHandler.RegisterCommandHandlingStrategy(new CmdGetWorldDetailsStrategy(_logger, _gameWorldData)); _commandHandler.RegisterCommandHandlingStrategy(new CmdLoginStrategy(_logger, _accountData, _playerHandler)); _commandHandler.RegisterCommandHandlingStrategy(new CmdLogoutStrategy(_playerHandler)); _commandHandler.RegisterCommandHandlingStrategy(new CmdGetAccountCharsStrategy(_logger, _accountData, _gameWorldData)); _commandHandler.RegisterCommandHandlingStrategy(new CmdChooseCharacterStrategy(_logger, _accountData, _gameWorldData, _playerHandler)); //CONNECTION HANDLER _tcpConnectionHandler = TcpConnectionHandler.GetInstance(_tcpLogger, _commandHandler, _playerHandler); _tcpConnectionHandler.StartConnection(_uiHandler.GetTcpConnectionSettings()); //REGULAR OPERATION HANDLER _regularOperationHandler = new RegularOperationHandler(_logger); //ETC this.State = GameState.Active; } catch (Exception exception) { this.State = GameState.Error; _logger.UpdateLog($"An error occured during game starting: {exception.Message}"); } } finally { _logger.UpdateLog($"*** ENDED WITH GAME STATE [{this.State.ToString()}]"); _loadingInProgress = false; } }