wxImage SpringUnitSync::GetImage( const wxString& modname, const wxString& image_path, bool useWhiteAsTransparent ) const { wxLogDebugFunc( _T("") ); wxImage cache; susynclib().SetCurrentMod( modname ); int ini = susynclib().OpenFileVFS ( image_path ); ASSERT_EXCEPTION( ini, _T("cannot find side image") ); int FileSize = susynclib().FileSizeVFS(ini); if (FileSize == 0) { susynclib().CloseFileVFS(ini); ASSERT_EXCEPTION( FileSize, _T("image has size 0") ); } uninitialized_array<char> FileContent(FileSize); susynclib().ReadFileVFS(ini, FileContent, FileSize); wxMemoryInputStream FileContentStream( FileContent, FileSize ); cache.LoadFile( FileContentStream, wxBITMAP_TYPE_ANY, -1); cache.InitAlpha(); if ( useWhiteAsTransparent ) { for ( int x = 0; x < cache.GetWidth(); x++ ) for ( int y = 0; y < cache.GetHeight(); y++ ) if ( cache.GetBlue( x, y ) == 255 && cache.GetGreen( x, y ) == 255 && cache.GetRed( x, y ) == 255 ) cache.SetAlpha( x, y, 0 ); // set pixel to be transparent } return cache; }
bool SpringUnitSync::FastLoadUnitSyncLib( const wxString& unitsyncloc ) { LOCK_UNITSYNC; if (!_LoadUnitSyncLib( unitsyncloc )) return false; m_mods_list.clear(); m_mod_array.Clear(); m_unsorted_mod_array.Clear(); m_mods_unchained_hash.clear(); const int numMods = susynclib().GetPrimaryModCount(); wxString name; for ( int i = 0; i < numMods; i++ ) { try { name = susynclib().GetPrimaryModName( i ); m_mods_list[name] = _T("fakehash"); m_mod_array.Add( name ); m_shortname_to_name_map[ std::make_pair(susynclib().GetPrimaryModShortName( i ), susynclib().GetPrimaryModVersion( i )) ] = name; } catch (...) { continue; } } m_unsorted_mod_array = m_mod_array; return true; }
bool SpringUnitSync::FileExists( const wxString& name ) const { int handle = susynclib().OpenFileVFS(name); if ( handle == 0 ) return false; susynclib().CloseFileVFS(handle); return true; }
bool Unitsync::LoadUnitSyncLib(const std::string& unitsyncloc) { LOCK_UNITSYNC; ClearCache(); const bool ret = susynclib().Load(unitsyncloc); if (!ret) { return false; } const std::string datadir = LSL::Util::config().GetDataDir(); const std::string curdatadir = susynclib().GetSpringDataDir(); if (datadir != curdatadir) { LslWarning("Reloading unitsync due to datadir change: %s -> %s", curdatadir.c_str(), datadir.c_str()); SetSpringDataPath(datadir); susynclib().Load(unitsyncloc); } supportsManualUnLoad = LSL::susynclib().GetSpringConfigInt("UnitsyncAutoUnLoadMapsIsSupported", 0) != 0; if (supportsManualUnLoad) { LslDebug("Unitsync supports manual loading of archives (faster, yey!)"); LSL::usync().SetSpringConfigInt("UnitsyncAutoUnLoadMaps", 1); } else { LslDebug("Unitsync doesn't support manual loading of archives :-/"); } m_cache_path = LSL::Util::config().GetCachePath(); PopulateArchiveList(); return true; }
QString Customizations::DataBasePath() { static bool cached = false; if ( cached ) return dataBasePath_; QList<QString> checked_paths; QString sub_path( "lobby/SpringLobby/customizations/" ); sub_path.append( m_shortname ); for ( int i = 0; i < susynclib().GetSpringDataDirCount(); ++i ) { QDir data ( ToQString( susynclib().GetSpringDataDirByIndex(i) ) ); checked_paths.append( data.absolutePath().append("/").append( sub_path ) ); if ( data.cd( sub_path ) ) { dataBasePath_ = data.absolutePath(); break; } } if( dataBasePath_ != QString() ) return dataBasePath_ ; checked_paths.prepend( QString("Couldn't find customization data in any of these directories:\n ") ); throw DataException( checked_paths ); return QString(); }
wxString SpringUnitSync::GetDefaultNick() { wxString name = susynclib().GetSpringConfigString( _T("name"), _T("Player") ); if ( name.IsEmpty() ) { susynclib().SetSpringConfigString( _T("name"), _T("Player") ); return _T("Player"); } return name; }
int SpringUnitSync::GetNumUnits( const wxString& modname ) const { wxLogDebugFunc( _T("") ); susynclib().AddAllArchives( susynclib().GetPrimaryModArchive( m_unsorted_mod_array.Index( modname ) ) ); susynclib().ProcessUnitsNoChecksum(); return susynclib().GetUnitCount(); }
wxArrayString SpringUnitSync::GetPlaybackList( bool ReplayType ) const { wxArrayString ret; if ( !IsLoaded() ) return ret; if ( ReplayType ) return susynclib().FindFilesVFS( _T("demos/*.sdf") ); else return susynclib().FindFilesVFS( _T("Saves/*.ssf") ); }
wxArrayString SpringUnitSync::GetModValidMapList( const wxString& modname ) const { wxArrayString ret; try { unsigned int mapcount = susynclib().GetValidMapCount( modname ); for ( unsigned int i = 0; i < mapcount; i++ ) ret.Add( susynclib().GetValidMapName( i ) ); } catch ( assert_exception& e ) {} return ret; }
static std::string GetGameInfo(int index, const std::string keyname) { const int count = susynclib().GetPrimaryModInfoCount(index); for (int i = 0; i < count; i++) { const std::string key = Util::SafeString(susynclib().GetInfoKey(i)); if (key == keyname) { return Util::SafeString(susynclib().GetInfoValueString(i)); } } return ""; }
wxImage SpringUnitSync::_GetMapImage( const wxString& mapname, const wxString& imagename, wxImage (SpringUnitSyncLib::*loadMethod)(const wxString&) ) { wxImage img; if ( m_map_image_cache.TryGet( mapname + imagename, img ) ) return img; wxString originalsizepath = GetFileCachePath( mapname, m_maps_unchained_hash[mapname], false ) + imagename; try { ASSERT_EXCEPTION( wxFileExists( originalsizepath ), _T("File cached image does not exist") ); img = wxImage( originalsizepath, wxBITMAP_TYPE_PNG ); ASSERT_EXCEPTION( img.Ok(), _T("Failed to load cache image") ); } catch (...) { try { img = (susynclib().*loadMethod)( mapname ); img.SaveFile( originalsizepath, wxBITMAP_TYPE_PNG ); } catch (...) { img = wxImage( 1, 1 ); } } m_map_image_cache.Add( mapname + imagename, img ); return img; }
void SpringUnitSync::UnSetCurrentMod() { try { susynclib().UnSetCurrentMod(); } catch( unitsync_assert ) {} }
int NoGuiSinglePlayerBattle::GetAiIndex( const wxString& name ) { int total = susynclib().GetSkirmishAICount( m_host_mod.name ); for ( int i = 0; i < total; i++ ) { wxArrayString infos = susynclib().GetAIInfo( i ); int namepos = infos.Index( _T("shortName") ); // int versionpos = infos.Index( _T("version") ); wxString ainame; if ( namepos != wxNOT_FOUND ) ainame += infos[namepos +1]; if ( ainame == name ) return i; // if ( versionpos != wxNOT_FOUND ) ainame += _T(" ") + infos[versionpos +1]; } return -1; }
bool SpringUnitSync::_LoadUnitSyncLib( const wxString& unitsyncloc ) { try { susynclib().Load( unitsyncloc, sett().GetForcedSpringConfigFilePath() ); } catch (...) { return false; } return true; }
wxString SpringUnitSync::GetTextfileAsString( const wxString& modname, const wxString& file_path ) { susynclib().SetCurrentMod( modname ); int ini = susynclib().OpenFileVFS ( file_path ); if ( !ini ) return wxEmptyString; int FileSize = susynclib().FileSizeVFS(ini); if (FileSize == 0) { susynclib().CloseFileVFS(ini); return wxEmptyString; } uninitialized_array<char> FileContent(FileSize); susynclib().ReadFileVFS(ini, FileContent, FileSize); return wxString( FileContent, wxConvAuto(), size_t( FileSize ) ); }
wxArrayString SpringUnitSync::GetModDeps( const wxString& modname ) const { wxArrayString ret; try { ret = susynclib().GetModDeps( m_unsorted_mod_array.Index( modname ) ); } catch( unitsync_assert ) {} return ret; }
wxArrayString SpringUnitSync::GetAIInfos( int index ) const { wxArrayString ret; try { ret = susynclib().GetAIInfo( index ); } catch ( unitsync_assert ) {} return ret; }
std::string Unitsync::GetSpringVersion() const { std::string ret; try { ret = susynclib().GetSpringVersion(); } catch (...) { } return ret; }
wxString SpringUnitSync::GetSpringVersion() const { wxLogDebugFunc( _T("") ); wxString ret; try { ret = susynclib().GetSpringVersion(); } catch (...){} return ret; }
GameOptions SpringUnitSync::GetModOptions( const wxString& name ) { wxLogDebugFunc( name ); GameOptions ret; int count = susynclib().GetModOptionCount(name); for (int i = 0; i < count; ++i) { GetOptionEntry( i, ret ); } return ret; }
void Battle::Leave() { m_serv.LeaveBattle( m_opts.battleid ); m_is_self_in = false; for( size_t j = 0; j < GetNumUsers(); ++j ) { User& u = GetUser( j ); if ( u.GetBattleStatus().IsBot() ) OnUserRemoved( u ); } susynclib().UnSetCurrentMod( ); }
void Unitsync::FetchUnitsyncErrors(const std::string& prefix) { auto errors = susynclib().GetUnitsyncErrors(); std::string pre = prefix; if (!prefix.empty()) { pre += " "; } for (const std::string error : errors) { LslWarning("Unitsync: %s%s", pre.c_str(), error.c_str()); } }
GameOptions SpringUnitSync::GetSkirmishOptions( const wxString& modname, const wxString& skirmish_name ) { wxLogDebugFunc( modname ); GameOptions ret; int count = susynclib().GetCustomOptionCount( modname, skirmish_name ); for (int i = 0; i < count; ++i) { GetOptionEntry( i, ret ); } return ret; }
GameOptions SpringUnitSync::GetModCustomizations( const wxString& modname ) { wxLogDebugFunc( modname ); GameOptions ret; int count = susynclib().GetCustomOptionCount( modname, _T("LobbyOptions.lua") ); for (int i = 0; i < count; ++i) { GetOptionEntry( i, ret ); } return ret; }
GameOptions SpringUnitSync::GetAIOptions( const wxString& modname, int index ) { wxLogDebugFunc( TowxString(index) ); GameOptions ret; int count = susynclib().GetAIOptionCount(modname, index); for (int i = 0; i < count; ++i) { GetOptionEntry( i, ret ); } return ret; }
QImage SpringUnitSync::GetQImage( const wxString& modname, const wxString& image_path, bool /*useWhiteAsTransparent*/ ) const { QImage cache; susynclib().SetCurrentMod( modname ); int ini = susynclib().OpenFileVFS ( image_path ); ASSERT_EXCEPTION( ini, _T("cannot find side image") ); int FileSize = susynclib().FileSizeVFS(ini); if (FileSize == 0) { susynclib().CloseFileVFS(ini); ASSERT_EXCEPTION( FileSize, _T("image has size 0") ); } QByteArray cache_data; cache_data.resize(FileSize); susynclib().ReadFileVFS(ini, cache_data.data(), FileSize); bool hu = cache.loadFromData( cache_data ); assert( hu ); return cache; }
wxArrayString SpringUnitSync::GetScreenshotFilenames() const { wxArrayString ret; if ( !IsLoaded() ) return ret; ret = susynclib().FindFilesVFS( _T("screenshots/*.*") ); for ( int i = 0; i < long(ret.Count() - 1); ++i ) { if ( ret[i] == ret[i+1] ) ret.RemoveAt( i+1 ); } ret.Sort(); return ret; }
wxArrayString SpringUnitSync::GetSides( const wxString& modname ) { wxArrayString ret; if ( ! m_sides_cache.TryGet( modname, ret ) ) { try { ret = susynclib().GetSides( modname ); m_sides_cache.Add( modname, ret ); } catch( unitsync_assert ) {} } return ret; }
wxArrayString SpringUnitSync::GetAIList( const wxString& modname ) const { wxLogDebugFunc( _T("") ); wxArrayString ret; if ( usync().VersionSupports( USYNC_GetSkirmishAI ) ) { int total = susynclib().GetSkirmishAICount( modname ); for ( int i = 0; i < total; i++ ) { wxArrayString infos = susynclib().GetAIInfo( i ); int namepos = infos.Index( _T("shortName") ); int versionpos = infos.Index( _T("version") ); wxString ainame; if ( namepos != wxNOT_FOUND ) ainame += infos[namepos +1]; if ( versionpos != wxNOT_FOUND ) ainame += _T(" ") + infos[versionpos +1]; ret.Add( ainame ); } } else { // list dynamic link libraries wxArrayString dlllist = susynclib().FindFilesVFS( wxDynamicLibrary::CanonicalizeName(_T("AI/Bot-libs/*"), wxDL_MODULE) ); for( int i = 0; i < long(dlllist.GetCount()); i++ ) { if ( ret.Index( dlllist[i].BeforeLast( '/') ) == wxNOT_FOUND ) ret.Add ( dlllist[i] ); // don't add duplicates } // list jar files (java AIs) wxArrayString jarlist = susynclib().FindFilesVFS( _T("AI/Bot-libs/*.jar") ); for( int i = 0; i < long(jarlist.GetCount()); i++ ) { if ( ret.Index( jarlist[i].BeforeLast( '/') ) == wxNOT_FOUND ) ret.Add ( jarlist[i] ); // don't add duplicates } } return ret; }
wxArrayString SpringUnitSync::GetUnitsList( const wxString& modname ) { wxLogDebugFunc( modname ); wxArrayString cache; try { cache = GetCacheFile( GetFileCachePath( modname, _T(""), true ) + _T(".units") ); } catch(...) { susynclib().SetCurrentMod( modname ); while ( susynclib().ProcessUnitsNoChecksum() ) {} unsigned int unitcount = susynclib().GetUnitCount(); for ( unsigned int i = 0; i < unitcount; i++ ) { cache.Add( susynclib().GetFullUnitName(i) << _T(" (") << susynclib().GetUnitName(i) << _T(")") ); } SetCacheFile( GetFileCachePath( modname, _T(""), true ) + _T(".units"), cache ); } return cache; }