1 #include "loadspel.hpp" 2 3 #include "esmreader.hpp" 4 #include "esmwriter.hpp" 5 #include "defs.hpp" 6 7 namespace ESM 8 { 9 unsigned int Spell::sRecordId = REC_SPEL; 10 load(ESMReader & esm,bool & isDeleted)11 void Spell::load(ESMReader &esm, bool &isDeleted) 12 { 13 isDeleted = false; 14 15 mEffects.mList.clear(); 16 17 bool hasName = false; 18 bool hasData = false; 19 while (esm.hasMoreSubs()) 20 { 21 esm.getSubName(); 22 switch (esm.retSubName().intval) 23 { 24 case ESM::SREC_NAME: 25 mId = esm.getHString(); 26 hasName = true; 27 break; 28 case ESM::FourCC<'F','N','A','M'>::value: 29 mName = esm.getHString(); 30 break; 31 case ESM::FourCC<'S','P','D','T'>::value: 32 esm.getHT(mData, 12); 33 hasData = true; 34 break; 35 case ESM::FourCC<'E','N','A','M'>::value: 36 ENAMstruct s; 37 esm.getHT(s, 24); 38 mEffects.mList.push_back(s); 39 break; 40 case ESM::SREC_DELE: 41 esm.skipHSub(); 42 isDeleted = true; 43 break; 44 default: 45 esm.fail("Unknown subrecord"); 46 break; 47 } 48 } 49 50 if (!hasName) 51 esm.fail("Missing NAME subrecord"); 52 if (!hasData && !isDeleted) 53 esm.fail("Missing SPDT subrecord"); 54 } 55 save(ESMWriter & esm,bool isDeleted) const56 void Spell::save(ESMWriter &esm, bool isDeleted) const 57 { 58 esm.writeHNCString("NAME", mId); 59 60 if (isDeleted) 61 { 62 esm.writeHNCString("DELE", ""); 63 return; 64 } 65 66 esm.writeHNOCString("FNAM", mName); 67 esm.writeHNT("SPDT", mData, 12); 68 mEffects.save(esm); 69 } 70 blank()71 void Spell::blank() 72 { 73 mData.mType = 0; 74 mData.mCost = 0; 75 mData.mFlags = 0; 76 77 mName.clear(); 78 mEffects.mList.clear(); 79 } 80 } 81