2011-12-19 20:50:54 +00:00
/* $Id$ */
/*
* This file is part of OpenTTD .
* OpenTTD is free software ; you can redistribute it and / or modify it under the terms of the GNU General Public License as published by the Free Software Foundation , version 2.
* OpenTTD is distributed in the hope that it will be useful , but WITHOUT ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE .
* See the GNU General Public License for more details . You should have received a copy of the GNU General Public License along with OpenTTD . If not , see < http : //www.gnu.org/licenses/>.
*/
/** @file game_core.cpp Implementation of Game. */
# include "../stdafx.h"
# include "../core/backup_type.hpp"
# include "../company_base.h"
# include "../company_func.h"
# include "../network/network.h"
2011-12-19 20:55:56 +00:00
# include "../window_func.h"
2011-12-19 20:50:54 +00:00
# include "game.hpp"
2011-12-19 20:55:56 +00:00
# include "game_scanner.hpp"
# include "game_config.hpp"
2011-12-19 20:50:54 +00:00
# include "game_instance.hpp"
2011-12-19 21:05:46 +00:00
# include "game_info.hpp"
2011-12-19 20:50:54 +00:00
/* static */ uint Game : : frame_counter = 0 ;
2011-12-19 20:55:56 +00:00
/* static */ GameInfo * Game : : info = NULL ;
2011-12-19 20:50:54 +00:00
/* static */ GameInstance * Game : : instance = NULL ;
2011-12-19 20:56:59 +00:00
/* static */ GameScannerInfo * Game : : scanner_info = NULL ;
/* static */ GameScannerLibrary * Game : : scanner_library = NULL ;
2011-12-19 20:50:54 +00:00
2011-12-19 21:05:46 +00:00
/* static */ const char * Game : : GetMainScript ( )
{
return Game : : info - > GetMainScript ( ) ;
}
2011-12-19 20:50:54 +00:00
/* static */ void Game : : GameLoop ( )
{
if ( _networking & & ! _network_server ) return ;
2011-12-19 20:55:56 +00:00
if ( Game : : instance = = NULL ) return ;
2011-12-19 20:50:54 +00:00
Game : : frame_counter + + ;
Backup < CompanyByte > cur_company ( _current_company , FILE_LINE ) ;
cur_company . Change ( OWNER_DEITY ) ;
Game : : instance - > GameLoop ( ) ;
cur_company . Restore ( ) ;
/* Occasionally collect garbage */
if ( ( Game : : frame_counter & 255 ) = = 0 ) {
Game : : instance - > CollectGarbage ( ) ;
}
}
/* static */ void Game : : Initialize ( )
{
2011-12-19 20:55:56 +00:00
if ( Game : : instance ! = NULL ) Game : : Uninitialize ( true ) ;
2011-12-19 20:50:54 +00:00
Game : : frame_counter = 0 ;
2011-12-19 20:55:56 +00:00
2011-12-19 20:56:59 +00:00
if ( Game : : scanner_info = = NULL ) {
2011-12-19 20:55:56 +00:00
TarScanner : : DoScan ( TarScanner : : GAME ) ;
2011-12-19 20:56:59 +00:00
Game : : scanner_info = new GameScannerInfo ( ) ;
Game : : scanner_info - > Initialize ( ) ;
Game : : scanner_library = new GameScannerLibrary ( ) ;
Game : : scanner_library - > Initialize ( ) ;
2011-12-19 20:55:56 +00:00
}
2011-12-19 20:56:34 +00:00
}
2011-12-19 20:55:56 +00:00
2011-12-19 20:56:34 +00:00
/* static */ void Game : : StartNew ( )
{
if ( Game : : instance ! = NULL ) return ;
2011-12-19 20:50:54 +00:00
2011-12-19 20:56:34 +00:00
/* Clients shouldn't start GameScripts */
if ( _networking & & ! _network_server ) return ;
2011-12-19 20:55:56 +00:00
2011-12-19 20:56:34 +00:00
GameConfig * config = GameConfig : : GetConfig ( ) ;
GameInfo * info = config - > GetInfo ( ) ;
if ( info = = NULL ) return ;
2011-12-19 20:50:54 +00:00
2011-12-19 20:56:34 +00:00
Backup < CompanyByte > cur_company ( _current_company , FILE_LINE ) ;
cur_company . Change ( OWNER_DEITY ) ;
2011-12-19 20:50:54 +00:00
2011-12-19 20:56:34 +00:00
Game : : info = info ;
Game : : instance = new GameInstance ( ) ;
Game : : instance - > Initialize ( info ) ;
2011-12-19 20:55:56 +00:00
2011-12-19 20:56:34 +00:00
cur_company . Restore ( ) ;
InvalidateWindowData ( WC_AI_DEBUG , 0 , - 1 ) ;
2011-12-19 20:50:54 +00:00
}
2011-12-19 20:55:56 +00:00
/* static */ void Game : : Uninitialize ( bool keepConfig )
2011-12-19 20:50:54 +00:00
{
2011-12-19 21:05:25 +00:00
Backup < CompanyByte > cur_company ( _current_company , FILE_LINE ) ;
2011-12-19 20:50:54 +00:00
delete Game : : instance ;
Game : : instance = NULL ;
2011-12-19 20:55:56 +00:00
2011-12-19 21:05:25 +00:00
cur_company . Restore ( ) ;
2011-12-19 20:55:56 +00:00
if ( keepConfig ) {
Rescan ( ) ;
} else {
2011-12-19 20:56:59 +00:00
delete Game : : scanner_info ;
delete Game : : scanner_library ;
Game : : scanner_info = NULL ;
Game : : scanner_library = NULL ;
2011-12-19 20:55:56 +00:00
if ( _settings_game . game_config ! = NULL ) {
delete _settings_game . game_config ;
_settings_game . game_config = NULL ;
}
if ( _settings_newgame . game_config ! = NULL ) {
delete _settings_newgame . game_config ;
_settings_newgame . game_config = NULL ;
}
}
}
2011-12-19 20:59:36 +00:00
/* static */ void Game : : NewEvent ( ScriptEvent * event )
{
/* AddRef() and Release() need to be called at least once, so do it here */
event - > AddRef ( ) ;
/* Clients should ignore events */
if ( _networking & & ! _network_server ) {
event - > Release ( ) ;
return ;
}
/* Check if Game instance is alive */
if ( Game : : instance = = NULL ) {
event - > Release ( ) ;
return ;
}
/* Queue the event */
Backup < CompanyByte > cur_company ( _current_company , OWNER_DEITY , FILE_LINE ) ;
Game : : instance - > InsertEvent ( event ) ;
cur_company . Restore ( ) ;
event - > Release ( ) ;
}
2011-12-19 20:55:56 +00:00
/* static */ void Game : : ResetConfig ( )
{
/* Check for both newgame as current game if we can reload the GameInfo insde
* the GameConfig . If not , remove the Game from the list . */
if ( _settings_game . game_config ! = NULL & & _settings_game . game_config - > HasScript ( ) ) {
if ( ! _settings_game . game_config - > ResetInfo ( true ) ) {
DEBUG ( script , 0 , " After a reload, the GameScript by the name '%s' was no longer found, and removed from the list. " , _settings_game . game_config - > GetName ( ) ) ;
_settings_game . game_config - > Change ( NULL ) ;
if ( Game : : instance ! = NULL ) {
delete Game : : instance ;
Game : : instance = NULL ;
}
} else if ( Game : : instance ! = NULL ) {
Game : : info = _settings_game . game_config - > GetInfo ( ) ;
}
}
if ( _settings_newgame . game_config ! = NULL & & _settings_newgame . game_config - > HasScript ( ) ) {
if ( ! _settings_newgame . game_config - > ResetInfo ( false ) ) {
DEBUG ( script , 0 , " After a reload, the GameScript by the name '%s' was no longer found, and removed from the list. " , _settings_newgame . game_config - > GetName ( ) ) ;
_settings_newgame . game_config - > Change ( NULL ) ;
}
}
}
/* static */ void Game : : Rescan ( )
{
TarScanner : : DoScan ( TarScanner : : GAME ) ;
2011-12-19 20:56:59 +00:00
Game : : scanner_info - > RescanDir ( ) ;
Game : : scanner_library - > RescanDir ( ) ;
2011-12-19 20:55:56 +00:00
ResetConfig ( ) ;
InvalidateWindowData ( WC_AI_LIST , 0 , 1 ) ;
SetWindowClassesDirty ( WC_AI_DEBUG ) ;
2012-01-02 20:39:50 +00:00
InvalidateWindowClassesData ( WC_AI_SETTINGS ) ;
2011-12-19 20:55:56 +00:00
}
2011-12-19 20:56:34 +00:00
/* static */ void Game : : Save ( )
{
if ( Game : : instance ! = NULL & & ( ! _networking | | _network_server ) ) {
Backup < CompanyByte > cur_company ( _current_company , OWNER_DEITY , FILE_LINE ) ;
Game : : instance - > Save ( ) ;
cur_company . Restore ( ) ;
} else {
GameInstance : : SaveEmpty ( ) ;
}
}
/* static */ void Game : : Load ( int version )
{
if ( Game : : instance ! = NULL & & ( ! _networking | | _network_server ) ) {
Backup < CompanyByte > cur_company ( _current_company , OWNER_DEITY , FILE_LINE ) ;
Game : : instance - > Load ( version ) ;
cur_company . Restore ( ) ;
} else {
/* Read, but ignore, the load data */
GameInstance : : LoadEmpty ( ) ;
}
}
2011-12-19 20:55:56 +00:00
/* static */ char * Game : : GetConsoleList ( char * p , const char * last , bool newest_only )
{
2011-12-19 20:56:59 +00:00
return Game : : scanner_info - > GetConsoleList ( p , last , newest_only ) ;
}
/* static */ char * Game : : GetConsoleLibraryList ( char * p , const char * last )
{
return Game : : scanner_library - > GetConsoleList ( p , last , true ) ;
2011-12-19 20:55:56 +00:00
}
/* static */ const ScriptInfoList * Game : : GetInfoList ( )
{
2011-12-19 20:56:59 +00:00
return Game : : scanner_info - > GetInfoList ( ) ;
2011-12-19 20:55:56 +00:00
}
/* static */ const ScriptInfoList * Game : : GetUniqueInfoList ( )
{
2011-12-19 20:56:59 +00:00
return Game : : scanner_info - > GetUniqueInfoList ( ) ;
2011-12-19 20:55:56 +00:00
}
/* static */ GameInfo * Game : : FindInfo ( const char * name , int version , bool force_exact_match )
{
2011-12-19 20:56:59 +00:00
return Game : : scanner_info - > FindInfo ( name , version , force_exact_match ) ;
}
/* static */ GameLibrary * Game : : FindLibrary ( const char * library , int version )
{
return Game : : scanner_library - > FindLibrary ( library , version ) ;
2011-12-19 20:50:54 +00:00
}
2011-12-19 20:56:59 +00:00
# if defined(ENABLE_NETWORK)
/**
* Check whether we have an Game ( library ) with the exact characteristics as ci .
* @ param ci the characteristics to search on ( shortname and md5sum )
* @ param md5sum whether to check the MD5 checksum
* @ return true iff we have an Game ( library ) matching .
*/
/* static */ bool Game : : HasGame ( const ContentInfo * ci , bool md5sum )
{
return Game : : scanner_info - > HasScript ( ci , md5sum ) ;
}
/* static */ bool Game : : HasGameLibrary ( const ContentInfo * ci , bool md5sum )
{
return Game : : scanner_library - > HasScript ( ci , md5sum ) ;
}
# endif /* defined(ENABLE_NETWORK) */