summaryrefslogtreecommitdiffstats
path: root/src/game-server/itemmanager.h
blob: cc4fb0ae2148f4bdbbd4ddcf760aabdc5c483314 (plain)
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
/*
 *  The Mana Server
 *  Copyright (C) 2004-2010  The Mana World Development Team
 *
 *  This file is part of The Mana Server.
 *
 *  The Mana Server 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 Server 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 Server.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef ITEMMANAGER_H
#define ITEMMANAGER_H

#include "utils/xml.h"
#include "utils/string.h"

#include <string>
#include <map>
#include <vector>

class ItemClass;

struct EquipSlotInfo
{
    EquipSlotInfo():
        slotId(0), slotCapacity(0), visibleSlot(false)
    {}

    EquipSlotInfo(unsigned int id, const std::string &name,
                  unsigned int capacity, bool visible):
        slotId(id), slotName(name), slotCapacity(capacity), visibleSlot(visible)
    {}

    unsigned int slotId;
    std::string slotName;
    unsigned int slotCapacity;
    bool visibleSlot;
};


class ItemManager
{
    public:
        ItemManager(const std::string &itemFile, const std::string &equipFile) :
            mItemsFile(itemFile),
            mEquipSlotsFile(equipFile),
            mVisibleEquipSlotCount(0),
            mItemDatabaseVersion(0)
        {}

        ~ItemManager()
        { deinitialize(); }

        /**
         * Loads item reference file.
         */
        void initialize();

        /**
         * Reloads item reference file.
         */
        void reload();

        /**
         * Destroy item classes.
         */
        void deinitialize();

        /**
         * Gets the ItemClass having the given ID.
         */
        ItemClass *getItem(int itemId) const;

        /**
         * Gets the first item type with a specific name.
         * (comparison is case-insensitive).
         * Returns null when there is no item with such
         * a name.
         */
        ItemClass *getItemByName(const std::string &name) const;

        /**
         * Gets the version of the loaded item database.
         */
        unsigned int getDatabaseVersion() const;

        unsigned int getEquipSlotIdFromName(const std::string &name) const;

        unsigned int getEquipSlotCapacity(unsigned int id) const;

        unsigned int getVisibleEquipSlotCount() const
        { return mVisibleEquipSlotCount; }

        bool isEquipSlotVisible(unsigned int id) const;

    private:
        /** Loads the equip slots that a character has available to them. */
        void readEquipSlotsFile();

        /** Loads the main item database. */
        void readItemsFile();
        void readItemNode(xmlNodePtr itemNode);
        void readEquipNode(xmlNodePtr equipNode, ItemClass *item);
        void readEffectNode(xmlNodePtr effectNode, ItemClass *item);

        typedef std::map< int, ItemClass * > ItemClasses;
        ItemClasses mItemClasses; /**< Item reference */
        utils::NameMap<ItemClass*> mItemClassesByName;

        // Map an equip slot id with the equip slot info.
        typedef std::map< unsigned int, EquipSlotInfo* > EquipSlotsInfo;
        // Reference to the vector position of equipSlots
        typedef std::vector< unsigned int > VisibleEquipSlots;

        EquipSlotsInfo mEquipSlotsInfo;
        // Map a string (name of slot) with (str-id, max-per-equip-slot)
        // We only keep a pointer to it: The id map will take care of deletion.
        utils::NameMap<EquipSlotInfo* > mNamedEquipSlotsInfo;

        std::string mItemsFile;
        std::string mEquipSlotsFile;
        unsigned int mVisibleEquipSlotCount; // Cache

        /** Version of the loaded items database file.*/
        unsigned int mItemDatabaseVersion;
};

extern ItemManager *itemManager;

#endif