summaryrefslogtreecommitdiffstats
path: root/src/game-server/itemmanager.h
blob: ac3c0b84205aac3f54b348d11ce8bb069bf7a492 (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
/*
 *  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 id, const std::string &name,
                  unsigned capacity, bool visible):
        slotId(id), slotName(name), slotCapacity(capacity), visibleSlot(visible)
    {}

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


class ItemManager
{
    public:
        ItemManager() :
            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 getDatabaseVersion() const;

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

        unsigned getEquipSlotCapacity(unsigned id) const;

        unsigned getVisibleEquipSlotCount() const
        { return mVisibleEquipSlotCount; }

        bool isEquipSlotVisible(unsigned id) const;

        void readItemNode(xmlNodePtr itemNode, const std::string &filename);

        void readEquipSlotNode(xmlNodePtr node);

        void checkStatus();

    private:
        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, EquipSlotInfo* > EquipSlotsInfo;
        // Reference to the vector position of equipSlots
        typedef std::vector< unsigned > 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;

        unsigned mVisibleEquipSlotCount; // Cache

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

extern ItemManager *itemManager;

#endif