2013-09-29 09:11:57 +02:00
# include "esmloader.hpp"
# include "esmstore.hpp"
2022-01-22 15:58:41 +01:00
# include <components/esm3/esmreader.hpp>
2022-06-01 22:53:18 +02:00
# include <components/esm3/readerscache.hpp>
2013-09-29 09:11:57 +02:00
namespace MWWorld
{
2022-09-03 18:50:38 +02:00
EsmLoader : : EsmLoader ( MWWorld : : ESMStore & store , ESM : : ReadersCache & readers , ToUTF8 : : Utf8Encoder * encoder , std : : vector < int > & esmVersions )
2022-06-01 22:53:18 +02:00
: mReaders ( readers )
2021-11-23 15:15:22 +01:00
, mStore ( store )
, mEncoder ( encoder )
2022-04-16 16:28:39 +02:00
, mDialogue ( nullptr ) // A content file containing INFO records without a DIAL record appends them to the previous file's dialogue
2022-09-03 18:50:38 +02:00
, mESMVersions ( esmVersions )
2013-09-29 09:11:57 +02:00
{
}
2022-06-08 23:25:50 +02:00
void EsmLoader : : load ( const std : : filesystem : : path & filepath , int & index , Loading : : Listener * listener )
2013-09-29 09:11:57 +02:00
{
2022-06-01 22:53:18 +02:00
const ESM : : ReadersCache : : BusyItem reader = mReaders . get ( static_cast < std : : size_t > ( index ) ) ;
reader - > setEncoder ( mEncoder ) ;
reader - > setIndex ( index ) ;
2022-06-19 13:28:33 +02:00
reader - > open ( filepath ) ;
2022-06-01 22:53:18 +02:00
reader - > resolveParentFileIndices ( mReaders ) ;
assert ( reader - > getGameFiles ( ) . size ( ) = = reader - > getParentFileIndices ( ) . size ( ) ) ;
for ( std : : size_t i = 0 , n = reader - > getParentFileIndices ( ) . size ( ) ; i < n ; + + i )
if ( i = = static_cast < std : : size_t > ( reader - > getIndex ( ) ) )
2022-06-19 13:28:33 +02:00
throw std : : runtime_error ( " File " + reader - > getName ( ) . string ( ) + " asks for parent file " //TODO(Project579): This will probably break in windows with unicode paths
2022-06-01 22:53:18 +02:00
+ reader - > getGameFiles ( ) [ i ] . name
+ " , but it is not available or has been loaded in the wrong order. "
" Please run the launcher to fix this issue. " ) ;
2022-09-03 18:50:38 +02:00
mESMVersions [ index ] = reader - > getVer ( ) ;
2022-06-01 22:53:18 +02:00
mStore . load ( * reader , listener , mDialogue ) ;
2022-06-19 13:28:33 +02:00
if ( ! mMasterFileFormat . has_value ( ) & & ( Misc : : StringUtils : : ciEndsWith ( reader - > getName ( ) . string ( ) , " .esm " ) //TODO(Project579): This will probably break in windows with unicode paths
| | Misc : : StringUtils : : ciEndsWith ( reader - > getName ( ) . string ( ) , " .omwgame " ) ) ) //TODO(Project579): This will probably break in windows with unicode paths
2022-06-01 22:53:18 +02:00
mMasterFileFormat = reader - > getFormat ( ) ;
2013-09-29 09:11:57 +02:00
}
} /* namespace MWWorld */