summaryrefslogtreecommitdiff
path: root/src/game-server/inventory.hpp
blob: 1fa663730133dad9fb9669fe56c846bdaf426be3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
/*
 *  The Mana World Server
 *  Copyright 2004 The Mana World Development Team
 *
 *  This file is part of The Mana World.
 *
 *  The Mana World is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  any later version.
 *
 *  The Mana World is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with The Mana World; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  $Id$
 */

#ifndef INVENTORY_H
#define INVENTORY_H

#include "game-server/being.hpp"

enum
{
// items in inventory :
    MAX_ITEMS_IN_INVENTORY = 50, // Max 252.
// Equipment rules:
// 1 Brest equipment
    EQUIP_BREST_SLOT = 0,
// 1 arms equipment
    EQUIP_ARMS_SLOT = 1,
// 1 head equipment
    EQUIP_HEAD_SLOT = 2,
// 1 legs equipment
    EQUIP_LEGS_SLOT = 3,
// 1 feet equipment
    EQUIP_FEET_SLOT = 4,
// 2 rings
    EQUIP_RING1_SLOT = 5,
    EQUIP_RING2_SLOT = 6,
// 1 necklace
    EQUIP_NECKLACE_SLOT = 7,
// Fight:
// 2 one-handed weapons
    EQUIP_FIGHT1_SLOT = 8,
    EQUIP_FIGHT2_SLOT = 9,
// or 1 two-handed weapon
// or 1 one-handed weapon + 1 shield.
//  Projectiles
    EQUIP_PROJECTILES_SLOT = 10,
// = 10 total slots for equipment.
    TOTAL_EQUIPMENT_SLOTS = 11,
// Error codes
    NOT_EQUIPPABLE = 253,
    NO_ITEM_TO_EQUIP = 254,
    INVENTORY_FULL = 255
};

/**
 * Stored Item only contains id reference to items
 * in the order not to carry every item info for each carried items
 * in the inventory.
 * Also contains amount.
 */
struct StoredItem
{
    int itemId;
    unsigned char amount;
};

/**
 * Equipped items that keeps which kind of item is in equipment.
 */
struct EquippedItem
{
    int itemId;
    short itemType;
};

/**
 * Class used to store minimal info on player's inventories
 * to keep it fast.
 * See Item and ItemManager to get more info on an item.
 */
class Inventory
{
    public:
        /**
         * Convenience function to get slot from ItemId.
         * If more than one occurence is found, the first is given.
         */
        int getSlotFromId(int itemId);

        /**
         * Returns item.
         */
        StoredItem const &getStoredItemAt(int slot) const
        { return itemList[slot]; };

        /**
         * Looks in inventory and equipment whether an item is present or not.
         */
        bool hasItem(int itemId,
                     bool searchInInventory = true,
                     bool searchInEquipment = true);

        /**
         * Tells an item's amount
         */
        int getItemAmount(int slot) const
        { return itemList[slot].amount; };

        /**
         * Returns item reference ID.
         */
        int getItemId(int slot) const
        { return itemList[slot].itemId; };

        /**
         * Adds a given amount of items.
         * @return Number of items really added.
         */
        int insertItem(int itemId, int amount = 1);

        /**
         * Removes an item given by ID.
         * @return Number of items really removed.
         */
        int removeItemById(int itemId, int amount);

        /**
         * Removes an item given by slot.
         * @return Number of items really removed.
         */
        int removeItemBySlot(int slot, int amount);

        /**
         * Equip an item searched by its id.
         * Can equip more than one item at a time.
         * @return unsigned char value: Returns the slot if successful
         * or the error code if not.
         */
        int equipItem(int itemId);

        /**
         * Unequip an item searched by its id.
         * Can unequip more than one item at a time.
         */
        bool unequipItem(int itemId);

        /**
         * Equips an item searched by its slot index.
         */
        bool equipItem(int inventorySlot, int equipmentSlot);

        /**
         * Unequips an equipped item searched by its slot index.
         */
        bool unequipItem(int inventorySlot, int equipmentSlot);

    private:

        /**
         * Gives the first free slot number in itemList.
         */
        int getInventoryFreeSlot();

        /**
         * Quick equip an equipment with a given equipSlot,
         * an itemId and an itemType.
         * @return the equipment slot if successful,
         * the error code, if not.
         */
        int equipItem_(int itemId,
                       int itemType,
                       int equipmentSlot);

        /**
         * Quick unequip an equipment with a given equipSlot,
         * and an itemId.
         * @return the Equipment slot if successful,
         * the error code, if not.
         */
        int unequipItem_(int itemId,
                         int equipmentSlot);


        // Stored items in inventory and equipment
        std::vector<StoredItem> itemList; /**< Items in inventory */
        std::vector<EquippedItem> equippedItemList; /**< Equipped Items */
        /**
         * Used to know which type of arrow is used with a bow,
         * for instance
         */
        StoredItem equippedProjectiles;
};

#endif