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 }