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