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