OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
inventory.h
Go to the documentation of this file.
1#pragma once
2
3#include <vector>
4#include <memory>
5#include <string_view>
6#include <string>
7
8#include "game/constants.h"
9
10class Item;
11class World;
12class GameScript;
13class Npc;
14class Interactive;
15class Serialize;
16
17class Inventory final {
18 public:
19 Inventory();
20 Inventory(Inventory&&)=default;
22 ~Inventory();
23
24 bool isEmpty() const;
25
26 void load(Serialize& s, Npc& owner);
27 void load(Serialize& s, Interactive& owner, World &w);
28 void save(Serialize& s) const;
29
35
36 class Iterator {
37 public:
38 const Item& operator* () const;
39 const Item* operator -> () const;
40
41 size_t count() const;
42 bool isEquipped() const;
43 uint8_t slot() const;
44
46
47 bool isValid() const;
48
49 private:
50 Iterator(IteratorType t, const Inventory* owner);
51 void skipHidden();
52
54 const Inventory* owner = nullptr;
55 size_t at = 0;
56 size_t subId = 0;
57 friend class Inventory;
58 };
59
61
62 int32_t priceOf(size_t item) const;
63 int32_t sellPriceOf(size_t item) const;
64 size_t goldCount() const;
65 size_t itemCount(const size_t id) const;
66
67 static void transfer(Inventory& to, Inventory& from, Npc *fromNpc, size_t cls, size_t count, World &wrld);
68
69 Item* getItem(size_t instance);
70 Item* addItem(std::unique_ptr<Item>&& p);
71 Item* addItem(std::string_view name, size_t count, World &owner);
72 Item* addItem(size_t cls, size_t count, World &owner);
73 void delItem(size_t cls, size_t count, Npc &owner);
74 bool use (size_t cls, Npc &owner, uint8_t slotHint, bool force);
75 bool equip (size_t cls, Npc &owner, bool force);
76 bool unequip(size_t cls, Npc &owner);
77 void unequip(Item* cls, Npc &owner);
78 void invalidateCond(Npc &owner);
79 void autoEquipWeapons(Npc &owner);
80 void equipArmor (int32_t cls, Npc &owner);
81 void equipBestArmor (Npc &owner);
82 void equipBestMeleeWeapon (Npc &owner);
83 void equipBestRangedWeapon(Npc &owner);
84 void unequipWeapons(GameScript &vm, Npc &owner);
85 void unequipArmor(GameScript &vm, Npc &owner);
86 void clear(GameScript &vm, Npc &owner, bool includeMissionItm = false);
87 void clear(GameScript &vm, Interactive &owner, bool includeMissionItm = false);
88 bool hasSpell(int32_t spl) const;
89 bool hasMissionItems() const;
90 bool hasRangedWeaponWithAmmo() const;
91
92 void updateArmorView (Npc& owner);
93 void updateSwordView (Npc& owner);
94 void updateBowView (Npc& owner);
95 void updateShieldView(Npc& owner);
96 void updateRuneView (Npc& owner);
97 void updateView (Npc& owner);
98
99 const Item* activeWeapon() const;
102 void switchActiveWeapon(Npc &owner, uint8_t slot);
103 void switchActiveSpell (int32_t spell, Npc &owner);
104
105 Item* currentArmor() { return armor; }
106 Item* currentMeleeWeapon() { return melee; }
107 Item* currentRangedWeapon() { return range; }
108 Item* currentShield() { return shield; }
109 Item* currentSpell(uint8_t s) { return numslot[s]; }
110 const Item* currentSpell(uint8_t s) const { return numslot[s]; }
111 Item* findByFlags(ItmFlags f, uint32_t num) const;
112
113 uint8_t currentSpellSlot() const;
114 bool hasStateItem() const;
115
116 void putCurrentToSlot(Npc& owner, std::string_view slot);
117 void putToSlot (Npc& owner, size_t cls, std::string_view slot);
118 bool clearSlot (Npc& owner, std::string_view slot, bool remove);
119 void putAmmunition (Npc& owner, size_t cls, std::string_view slot);
120 bool putState (Npc& owner, size_t cls, int state);
121
122 static void moveItem(Npc& owner, Inventory& invNpc, Interactive& mobsi);
123
124 void setCurrentItem(size_t cls);
125 void setStateItem (size_t cls);
126
127 private:
128 struct MdlSlot final {
129 std::string slot;
130 Item* item = nullptr;
131 };
132
133 void implLoad(Npc *owner, World &world, Serialize& s);
134 void implPutState(Npc& owner, size_t cls, std::string_view slot);
135
136 bool setSlot (Item*& slot, Item *next, Npc &owner, bool force);
137 bool equipNumSlot(Item *next, uint8_t slotHint, Npc &owner, bool force);
138 void applyArmor (Item& it, Npc &owner, int32_t sgn);
139
140 Item* findByClass(size_t cls);
141 void delItem (Item* it, size_t count, Npc& owner);
142 void invalidateCond(Item*& slot, Npc &owner);
143
144 Item* bestItem (Npc &owner, ItmFlags f);
145 Item* bestArmor (Npc &owner);
146 Item* bestMeleeWeapon(Npc &owner);
147 Item* bestRangedWeapon(Npc &owner);
148
149 void applyWeaponStats(Npc &owner, const Item& weap, int sgn);
150
151 void sortItems() const;
152 static bool less (const Item &il, const Item &ir);
153 static int orderId(const Item& l);
154 uint8_t slotId (Item*& slt) const;
155
156 mutable std::vector<std::unique_ptr<Item>> items;
157 mutable bool sorted=false;
158
159 uint32_t indexOf(const Item* it) const;
160 Item* readPtr(Serialize& fin);
161
162 Item* armor = nullptr;
163 Item* belt = nullptr;
164 Item* amulet = nullptr;
165 Item* ringL = nullptr;
166 Item* ringR = nullptr;
167
168 Item** active = nullptr;
169 Item* melee = nullptr;
170 Item* range = nullptr;
171 Item* shield = nullptr;
172 Item* numslot[8] = {};
173 std::vector<MdlSlot> mdlSlots;
174 MdlSlot ammotSlot, stateSlot;
175 int32_t curItem=0;
176 int32_t stateItem=0;
177 };
const Item & operator*() const
Definition inventory.cpp:15
const Item * operator->() const
Definition inventory.cpp:19
bool isEquipped() const
Definition inventory.cpp:23
size_t count() const
Definition inventory.cpp:33
uint8_t slot() const
Definition inventory.cpp:28
bool isValid() const
Definition inventory.cpp:60
Iterator & operator++()
Definition inventory.cpp:45
void updateRuneView(Npc &owner)
void unequipArmor(GameScript &vm, Npc &owner)
Item * findByFlags(ItmFlags f, uint32_t num) const
void updateBowView(Npc &owner)
int32_t sellPriceOf(size_t item) const
void clear(GameScript &vm, Npc &owner, bool includeMissionItm=false)
void equipBestArmor(Npc &owner)
void setCurrentItem(size_t cls)
bool hasStateItem() const
bool hasRangedWeaponWithAmmo() const
void equipArmor(int32_t cls, Npc &owner)
bool putState(Npc &owner, size_t cls, int state)
@ T_Inventory
Definition inventory.h:31
Item * currentSpell(uint8_t s)
Definition inventory.h:109
void equipBestMeleeWeapon(Npc &owner)
bool equip(size_t cls, Npc &owner, bool force)
void putToSlot(Npc &owner, size_t cls, std::string_view slot)
Item * currentRangedWeapon()
Definition inventory.h:107
void switchActiveWeaponFist()
bool isEmpty() const
Definition inventory.cpp:90
Iterator iterator(IteratorType t) const
static void transfer(Inventory &to, Inventory &from, Npc *fromNpc, size_t cls, size_t count, World &wrld)
void invalidateCond(Npc &owner)
const Item * currentSpell(uint8_t s) const
Definition inventory.h:110
bool unequip(size_t cls, Npc &owner)
bool use(size_t cls, Npc &owner, uint8_t slotHint, bool force)
const Item * activeWeapon() const
Inventory(Inventory &&)=default
Item * currentShield()
Definition inventory.h:108
void updateArmorView(Npc &owner)
void switchActiveWeapon(Npc &owner, uint8_t slot)
uint8_t currentSpellSlot() const
void switchActiveSpell(int32_t spell, Npc &owner)
void updateSwordView(Npc &owner)
void putAmmunition(Npc &owner, size_t cls, std::string_view slot)
bool hasSpell(int32_t spl) const
Item * addItem(std::unique_ptr< Item > &&p)
size_t goldCount() const
Item * currentMeleeWeapon()
Definition inventory.h:106
void delItem(size_t cls, size_t count, Npc &owner)
Inventory & operator=(Inventory &&)=default
int32_t priceOf(size_t item) const
static void moveItem(Npc &owner, Inventory &invNpc, Interactive &mobsi)
Item * currentArmor()
Definition inventory.h:105
void putCurrentToSlot(Npc &owner, std::string_view slot)
void equipBestRangedWeapon(Npc &owner)
void load(Serialize &s, Npc &owner)
void unequipWeapons(GameScript &vm, Npc &owner)
void autoEquipWeapons(Npc &owner)
bool clearSlot(Npc &owner, std::string_view slot, bool remove)
bool hasMissionItems() const
void setStateItem(size_t cls)
void save(Serialize &s) const
size_t itemCount(const size_t id) const
Item * getItem(size_t instance)
void updateView(Npc &owner)
void updateShieldView(Npc &owner)
Definition item.h:14
Definition npc.h:25
Definition world.h:31
static CommandLine * instance
ItmFlags
Definition constants.h:312