1 #include "ItemModel.h"
2
3 #include <utility>
4
5 #include "JsonObject.h"
6 #include "MagazineModel.h"
7 #include "WeaponModels.h"
8
9
ItemModel(uint16_t itemIndex,ST::string internalName,uint32_t usItemClass,uint8_t classIndex,ItemCursor cursor)10 ItemModel::ItemModel(uint16_t itemIndex,
11 ST::string internalName,
12 uint32_t usItemClass,
13 uint8_t classIndex,
14 ItemCursor cursor)
15 {
16 this->itemIndex = itemIndex;
17 this->internalName = std::move(internalName);
18 this->usItemClass = usItemClass;
19 this->ubClassIndex = classIndex;
20 this->ubCursor = cursor;
21 this->ubGraphicType = 0;
22 this->ubGraphicNum = 0;
23 this->ubWeight = 0;
24 this->ubPerPocket = 0;
25 this->usPrice = 0;
26 this->ubCoolness = 0;
27 this->bReliability = 0;
28 this->bRepairEase = 0;
29 this->fFlags = 0;
30 }
31
ItemModel(uint16_t itemIndex,ST::string internalName,uint32_t usItemClass,uint8_t ubClassIndex,ItemCursor ubCursor,uint8_t ubGraphicType,uint8_t ubGraphicNum,uint8_t ubWeight,uint8_t ubPerPocket,uint16_t usPrice,uint8_t ubCoolness,int8_t bReliability,int8_t bRepairEase,uint16_t fFlags)32 ItemModel::ItemModel(uint16_t itemIndex,
33 ST::string internalName,
34 uint32_t usItemClass,
35 uint8_t ubClassIndex,
36 ItemCursor ubCursor,
37 uint8_t ubGraphicType,
38 uint8_t ubGraphicNum,
39 uint8_t ubWeight,
40 uint8_t ubPerPocket,
41 uint16_t usPrice,
42 uint8_t ubCoolness,
43 int8_t bReliability,
44 int8_t bRepairEase,
45 uint16_t fFlags)
46 {
47 this->itemIndex = itemIndex;
48 this->internalName = internalName;
49 this->usItemClass = usItemClass;
50 this->ubClassIndex = ubClassIndex;
51 this->ubCursor = ubCursor;
52 this->ubGraphicType = ubGraphicType;
53 this->ubGraphicNum = ubGraphicNum;
54 this->ubWeight = ubWeight;
55 this->ubPerPocket = ubPerPocket;
56 this->usPrice = usPrice;
57 this->ubCoolness = ubCoolness;
58 this->bReliability = bReliability;
59 this->bRepairEase = bRepairEase;
60 this->fFlags = fFlags;
61 }
62
63 ItemModel::~ItemModel() = default;
64
getInternalName() const65 const ST::string& ItemModel::getInternalName() const { return internalName; }
66
getItemIndex() const67 uint16_t ItemModel::getItemIndex() const { return itemIndex; }
getItemClass() const68 uint32_t ItemModel::getItemClass() const { return usItemClass; }
getClassIndex() const69 uint8_t ItemModel::getClassIndex() const { return ubClassIndex; }
getCursor() const70 ItemCursor ItemModel::getCursor() const { return ubCursor; }
getGraphicType() const71 uint8_t ItemModel::getGraphicType() const { return ubGraphicType; }
getGraphicNum() const72 uint8_t ItemModel::getGraphicNum() const { return ubGraphicNum; }
getWeight() const73 uint8_t ItemModel::getWeight() const { return ubWeight; }
getPerPocket() const74 uint8_t ItemModel::getPerPocket() const { return ubPerPocket; }
getPrice() const75 uint16_t ItemModel::getPrice() const { return usPrice; }
getCoolness() const76 uint8_t ItemModel::getCoolness() const { return ubCoolness; }
getReliability() const77 int8_t ItemModel::getReliability() const { return bReliability; }
getRepairEase() const78 int8_t ItemModel::getRepairEase() const { return bRepairEase; }
getFlags() const79 uint16_t ItemModel::getFlags() const { return fFlags; }
80
isAmmo() const81 bool ItemModel::isAmmo() const { return usItemClass == IC_AMMO; }
isArmour() const82 bool ItemModel::isArmour() const { return usItemClass == IC_ARMOUR; }
isBlade() const83 bool ItemModel::isBlade() const { return usItemClass == IC_BLADE; }
isBomb() const84 bool ItemModel::isBomb() const { return usItemClass == IC_BOMB; }
isExplosive() const85 bool ItemModel::isExplosive() const { return usItemClass & (IC_GRENADE | IC_BOMB); }
isFace() const86 bool ItemModel::isFace() const { return usItemClass == IC_FACE; }
isGrenade() const87 bool ItemModel::isGrenade() const { return usItemClass == IC_GRENADE; }
isGun() const88 bool ItemModel::isGun() const { return usItemClass == IC_GUN; }
isKey() const89 bool ItemModel::isKey() const { return usItemClass == IC_KEY; }
isKit() const90 bool ItemModel::isKit() const { return usItemClass == IC_KIT; }
isLauncher() const91 bool ItemModel::isLauncher() const { return usItemClass == IC_LAUNCHER; }
isMedkit() const92 bool ItemModel::isMedkit() const { return usItemClass == IC_MEDKIT; }
isMisc() const93 bool ItemModel::isMisc() const { return usItemClass == IC_MISC; }
isMoney() const94 bool ItemModel::isMoney() const { return usItemClass == IC_MONEY; }
isPunch() const95 bool ItemModel::isPunch() const { return usItemClass == IC_PUNCH; }
isTentacles() const96 bool ItemModel::isTentacles() const { return usItemClass == IC_TENTACLES; }
isThrowingKnife() const97 bool ItemModel::isThrowingKnife() const { return usItemClass == IC_THROWING_KNIFE; }
isThrown() const98 bool ItemModel::isThrown() const { return usItemClass == IC_THROWN; }
isWeapon() const99 bool ItemModel::isWeapon() const { return usItemClass & (IC_GUN | IC_BLADE | IC_THROWING_KNIFE | IC_LAUNCHER | IC_TENTACLES); }
100
isTwoHanded() const101 bool ItemModel::isTwoHanded() const { return fFlags & ITEM_TWO_HANDED; }
isInBigGunList() const102 bool ItemModel::isInBigGunList() const { return fFlags & ITEM_BIGGUNLIST; }
103
serializeFlags(JsonObject & obj) const104 void ItemModel::serializeFlags(JsonObject &obj) const
105 {
106 if(getFlags() & ITEM_DAMAGEABLE) { obj.AddMember("bDamageable", true); }
107 if(getFlags() & ITEM_REPAIRABLE) { obj.AddMember("bRepairable", true); }
108 if(getFlags() & ITEM_WATER_DAMAGES) { obj.AddMember("bWaterDamages", true); }
109 if(getFlags() & ITEM_METAL) { obj.AddMember("bMetal", true); }
110 if(getFlags() & ITEM_SINKS) { obj.AddMember("bSinks", true); }
111 if(getFlags() & ITEM_SHOW_STATUS) { obj.AddMember("bShowStatus", true); }
112 if(getFlags() & ITEM_HIDDEN_ADDON) { obj.AddMember("bHiddenAddon", true); }
113 if(getFlags() & ITEM_TWO_HANDED) { obj.AddMember("bTwoHanded", true); }
114 if(getFlags() & ITEM_NOT_BUYABLE) { obj.AddMember("bNotBuyable", true); }
115 if(getFlags() & ITEM_ATTACHMENT) { obj.AddMember("bAttachment", true); }
116 if(getFlags() & ITEM_BIGGUNLIST) { obj.AddMember("bBigGunList", true); }
117 if(getFlags() & ITEM_NOT_EDITOR) { obj.AddMember("bNotEditor", true); }
118 if(getFlags() & ITEM_DEFAULT_UNDROPPABLE) { obj.AddMember("bDefaultUndroppable", true); }
119 if(getFlags() & ITEM_UNAERODYNAMIC) { obj.AddMember("bUnaerodynamic", true); }
120 if(getFlags() & ITEM_ELECTRONIC) { obj.AddMember("bElectronic", true); }
121 if(getFlags() & ITEM_INSEPARABLE) { obj.AddMember("bInseparable", true); }
122 }
123
deserializeFlags(JsonObjectReader & obj) const124 uint32_t ItemModel::deserializeFlags(JsonObjectReader &obj) const
125 {
126 uint32_t flags = 0;
127 if(obj.getOptionalBool("bDamageable")) { flags |= ITEM_DAMAGEABLE; }
128 if(obj.getOptionalBool("bRepairable")) { flags |= ITEM_REPAIRABLE; }
129 if(obj.getOptionalBool("bWaterDamages")) { flags |= ITEM_WATER_DAMAGES; }
130 if(obj.getOptionalBool("bMetal")) { flags |= ITEM_METAL; }
131 if(obj.getOptionalBool("bSinks")) { flags |= ITEM_SINKS; }
132 if(obj.getOptionalBool("bShowStatus")) { flags |= ITEM_SHOW_STATUS; }
133 if(obj.getOptionalBool("bHiddenAddon")) { flags |= ITEM_HIDDEN_ADDON; }
134 if(obj.getOptionalBool("bTwoHanded")) { flags |= ITEM_TWO_HANDED; }
135 if(obj.getOptionalBool("bNotBuyable")) { flags |= ITEM_NOT_BUYABLE; }
136 if(obj.getOptionalBool("bAttachment")) { flags |= ITEM_ATTACHMENT; }
137 if(obj.getOptionalBool("bBigGunList")) { flags |= ITEM_BIGGUNLIST; }
138 if(obj.getOptionalBool("bNotEditor")) { flags |= ITEM_NOT_EDITOR; }
139 if(obj.getOptionalBool("bDefaultUndroppable")){ flags |= ITEM_DEFAULT_UNDROPPABLE; }
140 if(obj.getOptionalBool("bUnaerodynamic")) { flags |= ITEM_UNAERODYNAMIC; }
141 if(obj.getOptionalBool("bElectronic")) { flags |= ITEM_ELECTRONIC; }
142 if(obj.getOptionalBool("bInseparable")) { flags |= ITEM_INSEPARABLE; }
143 return flags;
144 }
145
146 /** Check if the given attachment can be attached to the item. */
canBeAttached(uint16_t attachment) const147 bool ItemModel::canBeAttached(uint16_t attachment) const
148 {
149 return false;
150 }
151
serializeTo(JsonObject & obj) const152 void ItemModel::serializeTo(JsonObject &obj) const
153 {
154 obj.AddMember("itemIndex", itemIndex);
155 obj.AddMember("internalName", internalName);
156 obj.AddMember("usItemClass", (uint32_t)getItemClass());
157 obj.AddMember("ubClassIndex", getClassIndex());
158 obj.AddMember("ubCursor", getCursor());
159 obj.AddMember("ubGraphicType", getGraphicType());
160 obj.AddMember("ubGraphicNum", getGraphicNum());
161 obj.AddMember("ubWeight", getWeight());
162 obj.AddMember("ubPerPocket", getPerPocket());
163 obj.AddMember("usPrice", getPrice());
164 obj.AddMember("ubCoolness", getCoolness());
165 obj.AddMember("bReliability", getReliability());
166 obj.AddMember("bRepairEase", getRepairEase());
167
168 serializeFlags(obj);
169 }
170
deserialize(JsonObjectReader & obj)171 const ItemModel* ItemModel::deserialize(JsonObjectReader &obj)
172 {
173 auto* item = new ItemModel(
174 obj.GetUInt("itemIndex"),
175 obj.GetString("internalName"),
176 obj.GetUInt("usItemClass"),
177 obj.GetUInt("ubClassIndex"),
178 (ItemCursor)obj.GetUInt("ubCursor"),
179 obj.GetUInt("ubGraphicType"),
180 obj.GetUInt("ubGraphicNum"),
181 obj.GetUInt("ubWeight"),
182 obj.GetUInt("ubPerPocket"),
183 obj.GetUInt("usPrice"),
184 obj.GetUInt("ubCoolness"),
185 obj.GetInt("bReliability"),
186 obj.GetInt("bRepairEase"),
187 0
188 );
189 item->fFlags = item->deserializeFlags(obj);
190 return item;
191 }