@ -8,38 +8,77 @@ namespace ESM {
unsigned int Creature : : sRecordId = REC_CREA ;
unsigned int Creature : : sRecordId = REC_CREA ;
void Creature : : load ( ESMReader & esm )
void Creature : : load ( ESMReader & esm )
{
{
mPersistent = esm . getRecordFlags ( ) & 0x0400 ;
mPersistent = esm . getRecordFlags ( ) & 0x0400 ;
mModel = esm . getHNString ( " MODL " ) ;
mAiPackage . mList . clear ( ) ;
mOriginal = esm . getHNOString ( " CNAM " ) ;
mInventory . mList . clear ( ) ;
mName = esm . getHNOString ( " FNAM " ) ;
mSpells . mList . clear ( ) ;
mScript = esm . getHNOString ( " SCRI " ) ;
esm . getHNT ( mData , " NPDT " , 96 ) ;
esm . getHNT ( mFlags , " FLAG " ) ;
mScale = 1.0 ;
esm . getHNOT ( mScale , " XSCL " ) ;
mInventory . load ( esm ) ;
mSpells . load ( esm ) ;
if ( esm . isNextSub ( " AIDT " ) )
mScale = 1.f ;
mHasAI = false ;
bool hasNpdt = false ;
bool hasFlags = false ;
while ( esm . hasMoreSubs ( ) )
{
esm . getSubName ( ) ;
uint32_t name = esm . retSubName ( ) . val ;
switch ( name )
{
{
case ESM : : FourCC < ' M ' , ' O ' , ' D ' , ' L ' > : : value :
mModel = esm . getHString ( ) ;
break ;
case ESM : : FourCC < ' C ' , ' N ' , ' A ' , ' M ' > : : value :
mOriginal = esm . getHString ( ) ;
break ;
case ESM : : FourCC < ' F ' , ' N ' , ' A ' , ' M ' > : : value :
mName = esm . getHString ( ) ;
break ;
case ESM : : FourCC < ' S ' , ' C ' , ' R ' , ' I ' > : : value :
mScript = esm . getHString ( ) ;
break ;
case ESM : : FourCC < ' N ' , ' P ' , ' D ' , ' T ' > : : value :
esm . getHT ( mData , 96 ) ;
hasNpdt = true ;
break ;
case ESM : : FourCC < ' F ' , ' L ' , ' A ' , ' G ' > : : value :
esm . getHT ( mFlags ) ;
hasFlags = true ;
break ;
case ESM : : FourCC < ' X ' , ' S ' , ' C ' , ' L ' > : : value :
esm . getHT ( mScale ) ;
break ;
case ESM : : FourCC < ' N ' , ' P ' , ' C ' , ' O ' > : : value :
mInventory . add ( esm ) ;
break ;
case ESM : : FourCC < ' N ' , ' P ' , ' C ' , ' S ' > : : value :
mSpells . add ( esm ) ;
break ;
case ESM : : FourCC < ' A ' , ' I ' , ' D ' , ' T ' > : : value :
esm . getHExact ( & mAiData , sizeof ( mAiData ) ) ;
esm . getHExact ( & mAiData , sizeof ( mAiData ) ) ;
mHasAI = true ;
mHasAI = true ;
break ;
case AI_Wander :
case AI_Activate :
case AI_Escort :
case AI_Follow :
case AI_Travel :
case AI_CNDT :
mAiPackage . add ( esm ) ;
break ;
default :
esm . fail ( " Unknown subrecord " ) ;
}
}
if ( ! hasNpdt )
esm . fail ( " Missing NPDT subrecord " ) ;
if ( ! hasFlags )
esm . fail ( " Missing FLAG subrecord " ) ;
}
}
else
mHasAI = false ;
mAiPackage . load ( esm ) ;
esm . skipRecord ( ) ;
}
void Creature : : save ( ESMWriter & esm ) const
void Creature : : save ( ESMWriter & esm ) const
{
{
esm . writeHNCString ( " MODL " , mModel ) ;
esm . writeHNCString ( " MODL " , mModel ) ;
esm . writeHNOCString ( " CNAM " , mOriginal ) ;
esm . writeHNOCString ( " CNAM " , mOriginal ) ;
esm . writeHNOCString ( " FNAM " , mName ) ;
esm . writeHNOCString ( " FNAM " , mName ) ;
@ -56,7 +95,7 @@ void Creature::save(ESMWriter &esm) const
esm . writeHNT ( " AIDT " , mAiData , sizeof ( mAiData ) ) ;
esm . writeHNT ( " AIDT " , mAiData , sizeof ( mAiData ) ) ;
}
}
mAiPackage . save ( esm ) ;
mAiPackage . save ( esm ) ;
}
}
void Creature : : blank ( )
void Creature : : blank ( )
{
{