2015-09-10 20:30:35 +00:00
# include "SCLY.hpp"
# include "ScriptObjects/ScriptTypes.hpp"
namespace Retro
{
namespace DNAMP1
{
void SCLY : : read ( Athena : : io : : IStreamReader & rs )
{
fourCC = rs . readUint32Little ( ) ;
version = rs . readUint32Big ( ) ;
layerCount = rs . readUint32Big ( ) ;
rs . enumerateBig ( layerSizes , layerCount ) ;
atUint32 i = 0 ;
rs . enumerate < ScriptLayer > ( layers , layerCount , [ & i , this ] ( Athena : : io : : IStreamReader & rs , ScriptLayer & layer ) {
atUint64 start = rs . position ( ) ;
layer . read ( rs ) ;
rs . seek ( start + layerSizes [ i + + ] , Athena : : Begin ) ;
} ) ;
}
void SCLY : : write ( Athena : : io : : IStreamWriter & ws ) const
{
ws . writeUint32Big ( fourCC ) ;
ws . writeUint32Big ( version ) ;
ws . writeUint32Big ( layerCount ) ;
ws . enumerateBig ( layerSizes ) ;
ws . enumerate ( layers ) ;
}
2015-10-18 04:08:45 +00:00
size_t SCLY : : binarySize ( size_t __isz ) const
{
__isz + = 12 ;
__isz + = layerSizes . size ( ) * 4 ;
return __EnumerateSize ( __isz , layers ) ;
}
2015-10-27 00:19:03 +00:00
void SCLY : : exportToLayerDirectories ( const PAK : : Entry & entry , PAKRouter < PAKBridge > & pakRouter , bool force ) const
2015-09-10 20:30:35 +00:00
{
for ( atUint32 i = 0 ; i < layerCount ; i + + )
{
HECL : : ProjectPath layerPath = pakRouter . getAreaLayerWorking ( entry . id , i ) ;
2015-11-21 01:16:07 +00:00
if ( layerPath . getPathType ( ) = = HECL : : ProjectPath : : Type : : None )
2015-09-10 20:30:35 +00:00
layerPath . makeDir ( ) ;
HECL : : ProjectPath yamlFile = HECL : : ProjectPath ( layerPath , _S ( " objects.yaml " ) ) ;
2015-11-21 01:16:07 +00:00
if ( force | | yamlFile . getPathType ( ) = = HECL : : ProjectPath : : Type : : None )
2015-09-10 20:30:35 +00:00
{
FILE * yaml = HECL : : Fopen ( yamlFile . getAbsolutePath ( ) . c_str ( ) , _S ( " wb " ) ) ;
layers [ i ] . toYAMLFile ( yaml ) ;
fclose ( yaml ) ;
}
}
}
2015-10-27 00:19:03 +00:00
void SCLY : : addCMDLRigPairs ( PAKRouter < PAKBridge > & pakRouter ,
std : : unordered_map < UniqueID32 , std : : pair < UniqueID32 , UniqueID32 > > & addTo ) const
{
for ( const ScriptLayer & layer : layers )
layer . addCMDLRigPairs ( pakRouter , addTo ) ;
}
void SCLY : : ScriptLayer : : addCMDLRigPairs ( PAKRouter < PAKBridge > & pakRouter ,
std : : unordered_map < UniqueID32 , std : : pair < UniqueID32 , UniqueID32 > > & addTo ) const
{
2015-11-29 05:59:34 +00:00
for ( const std : : unique_ptr < IScriptObject > & obj : objects )
2015-10-27 00:19:03 +00:00
obj - > addCMDLRigPairs ( pakRouter , addTo ) ;
}
void SCLY : : nameIDs ( PAKRouter < PAKBridge > & pakRouter ) const
{
for ( const ScriptLayer & layer : layers )
layer . nameIDs ( pakRouter ) ;
}
void SCLY : : ScriptLayer : : nameIDs ( PAKRouter < PAKBridge > & pakRouter ) const
{
2015-11-29 05:59:34 +00:00
for ( const std : : unique_ptr < IScriptObject > & obj : objects )
2015-10-27 00:19:03 +00:00
obj - > nameIDs ( pakRouter ) ;
}
2016-01-04 05:31:02 +00:00
void SCLY : : read ( Athena : : io : : YAMLDocReader & docin )
2015-09-10 20:30:35 +00:00
{
fourCC = docin . readUint32 ( " fourCC " ) ;
version = docin . readUint32 ( " version " ) ;
layerCount = docin . readUint32 ( " layerCount " ) ;
docin . enumerate ( " layerSizes " , layerSizes , layerCount ) ;
docin . enumerate ( " layers " , layers , layerCount ) ;
}
2016-01-04 05:31:02 +00:00
void SCLY : : write ( Athena : : io : : YAMLDocWriter & docout ) const
2015-09-10 20:30:35 +00:00
{
docout . writeUint32 ( " fourCC " , fourCC ) ;
docout . writeUint32 ( " version " , version ) ;
docout . writeUint32 ( " layerCount " , layerCount ) ;
docout . enumerate ( " layerSizes " , layerSizes ) ;
docout . enumerate ( " layers " , layers ) ;
}
2015-10-01 00:46:37 +00:00
const char * SCLY : : DNAType ( )
{
return " Retro::DNAMP1::SCLY " ;
}
2015-09-10 20:30:35 +00:00
void SCLY : : ScriptLayer : : read ( Athena : : io : : IStreamReader & rs )
{
unknown = rs . readUByte ( ) ;
objectCount = rs . readUint32Big ( ) ;
objects . reserve ( objectCount ) ;
for ( atUint32 i = 0 ; i < objectCount ; i + + )
{
atUint8 type = rs . readUByte ( ) ;
atUint32 len = rs . readUint32Big ( ) ;
atUint64 start = rs . position ( ) ;
auto iter = std : : find_if ( SCRIPT_OBJECT_DB . begin ( ) , SCRIPT_OBJECT_DB . end ( ) , [ & type ] ( const ScriptObjectSpec * obj ) - > bool
{ return obj - > type = = type ; } ) ;
if ( iter ! = SCRIPT_OBJECT_DB . end ( ) )
{
2015-11-29 05:59:34 +00:00
std : : unique_ptr < IScriptObject > obj ( ( * iter ) - > a ( ) ) ;
2015-09-10 20:30:35 +00:00
obj - > type = type ;
obj - > read ( rs ) ;
2015-11-29 05:59:34 +00:00
objects . push_back ( std : : move ( obj ) ) ;
2015-10-12 09:30:18 +00:00
size_t actualLen = rs . position ( ) - start ;
if ( actualLen ! = len )
2015-10-13 01:04:36 +00:00
Log . report ( LogVisor : : FatalError , _S ( " Error while reading object of type 0x%.2X, did not read the expected amount of data, read 0x%x, expected 0x%x " ) , ( atUint32 ) type , actualLen , len ) ;
2015-09-10 20:30:35 +00:00
rs . seek ( start + len , Athena : : Begin ) ;
}
else
Log . report ( LogVisor : : FatalError , _S ( " Unable to find type 0x%X in object database " ) , ( atUint32 ) type ) ;
}
}
2016-01-04 05:31:02 +00:00
void SCLY : : ScriptLayer : : read ( Athena : : io : : YAMLDocReader & rs )
2015-09-10 20:30:35 +00:00
{
unknown = rs . readUByte ( " unknown " ) ;
objectCount = rs . readUint32 ( " objectCount " ) ;
objects . reserve ( objectCount ) ;
rs . enterSubVector ( " objects " ) ;
for ( atUint32 i = 0 ; i < objectCount ; i + + )
{
rs . enterSubRecord ( nullptr ) ;
atUint8 type = rs . readUByte ( " type " ) ;
auto iter = std : : find_if ( SCRIPT_OBJECT_DB . begin ( ) , SCRIPT_OBJECT_DB . end ( ) , [ & type ] ( const ScriptObjectSpec * obj ) - > bool
{ return obj - > type = = type ; } ) ;
if ( iter ! = SCRIPT_OBJECT_DB . end ( ) )
{
2015-11-29 05:59:34 +00:00
std : : unique_ptr < IScriptObject > obj ( ( * iter ) - > a ( ) ) ;
2016-01-04 05:31:02 +00:00
obj - > read ( rs ) ;
2015-09-10 20:30:35 +00:00
obj - > type = type ;
2015-11-29 05:59:34 +00:00
objects . push_back ( std : : move ( obj ) ) ;
2015-09-10 20:30:35 +00:00
}
else
Log . report ( LogVisor : : FatalError , _S ( " Unable to find type 0x%X in object database " ) , ( atUint32 ) type ) ;
rs . leaveSubRecord ( ) ;
}
rs . leaveSubVector ( ) ;
}
void SCLY : : ScriptLayer : : write ( Athena : : io : : IStreamWriter & ws ) const
{
ws . writeUByte ( unknown ) ;
ws . writeUint32Big ( objectCount ) ;
2015-11-29 05:59:34 +00:00
for ( const std : : unique_ptr < IScriptObject > & obj : objects )
2015-09-10 20:30:35 +00:00
{
ws . writeByte ( obj - > type ) ;
obj - > write ( ws ) ;
}
}
2015-10-18 04:08:45 +00:00
size_t SCLY : : ScriptLayer : : binarySize ( size_t __isz ) const
{
__isz + = 5 ;
2015-11-29 05:59:34 +00:00
for ( const std : : unique_ptr < IScriptObject > & obj : objects )
2015-10-18 04:08:45 +00:00
{
__isz + = 1 ;
__isz = obj - > binarySize ( __isz ) ;
}
return __isz ;
}
2016-01-04 05:31:02 +00:00
void SCLY : : ScriptLayer : : write ( Athena : : io : : YAMLDocWriter & ws ) const
2015-09-10 20:30:35 +00:00
{
ws . writeUByte ( " unknown " , unknown ) ;
ws . writeUint32 ( " objectCount " , objectCount ) ;
ws . enterSubVector ( " objects " ) ;
2015-11-29 05:59:34 +00:00
for ( const std : : unique_ptr < IScriptObject > & obj : objects )
2015-09-10 20:30:35 +00:00
{
ws . enterSubRecord ( nullptr ) ;
ws . writeUByte ( " type " , obj - > type ) ;
2016-01-04 05:31:02 +00:00
obj - > write ( ws ) ;
2015-09-10 20:30:35 +00:00
ws . leaveSubRecord ( ) ;
} ;
ws . leaveSubVector ( ) ;
}
2015-10-01 00:46:37 +00:00
const char * SCLY : : ScriptLayer : : DNAType ( )
{
return " Retro::DNAMP1::SCLY::ScriptLayer " ;
}
2015-09-10 20:30:35 +00:00
}
}