ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/cf.schmorp.de/dclient/src/backend/communicator/inventory_manager.cpp
Revision: 1.1
Committed: Mon Oct 18 06:53:59 2010 UTC (16 years ago) by sf-pippijn
Branch: MAIN
Log Message:
gcc 4.5; moved some code; background colour support

File Contents

# User Rev Content
1 sf-pippijn 1.1 #include "deliantra/inventory_manager.h"
2     #include "deliantra/data/constants.h"
3     #include "deliantra/data/inventory.h"
4    
5     #include "adt/array.h"
6    
7     #include <algorithm>
8     #include <cassert>
9    
10     static bool
11     type_name_compare (data::item const &a, data::item const &b)
12     {
13     return a.type != b.type ? a.type < b.type : a.singular < b.singular;
14     }
15    
16    
17     inventory_manager::inventory_manager ()
18     : player_item { }
19     , ground_item { "Floor" }
20     , container_item (&ground_item)
21     , inventory_view (nullptr)
22     , container_view (nullptr)
23     {
24     }
25    
26     inventory_manager::~inventory_manager ()
27     {
28     }
29    
30     void
31     inventory_manager::set_inventory_view (interface::inventory_handler &view)
32     {
33     inventory_view = &view;
34     }
35    
36     void
37     inventory_manager::set_container_view (interface::inventory_handler &view)
38     {
39     container_view = &view;
40     }
41    
42    
43     void
44     inventory_manager::update_container ()
45     {
46     container_item = &ground_item;
47     foreach (data::item const &item, inventories[player_item.tag])
48     if (item.flags & F_OPEN)
49     {
50     assert (container_item == &ground_item);
51     container_item = &item;
52     #if NDEBUG
53     break;
54     #endif
55     }
56     }
57    
58     void
59     inventory_manager::sort ()
60     {
61     foreach (u32 tag, array (player_item.tag, container_item->tag))
62     {
63     data::inventory &inv = inventories[tag];
64     std::stable_sort (inv.begin (), inv.end (), type_name_compare);
65     }
66     }
67    
68     void
69     inventory_manager::update_view () const
70     {
71     foreach (auto pair, array (std::make_pair (&player_item, inventory_view),
72     std::make_pair (container_item, container_view)))
73     {
74     auto found = inventories.find (pair.first->tag);
75     if (found != inventories.end ())
76     pair.second->update (found->second, pair.first->singular);
77     }
78     }
79    
80     void
81     inventory_manager::update ()
82     {
83     update_container ();
84     sort ();
85     update_view ();
86     }
87    
88    
89     data::item &
90     inventory_manager::get (u32 tag)
91     {
92     if (tag == player_item.tag)
93     return player_item;
94     foreach (auto &pair, inventories)
95     foreach (data::item &item, pair.second)
96     if (item.tag == tag)
97     return item;
98     throw "item not found";
99     }
100    
101     void
102     inventory_manager::delinv (u32 tag)
103     {
104     inventories.erase (tag);
105     }
106    
107     void
108     inventory_manager::delitem (std::vector<u32> const &itemtags)
109     {
110     assert (player_item.tag != 0);
111    
112     foreach (auto &pair, inventories)
113     foreach (data::item &item, pair.second)
114     foreach (u32 tag, itemtags)
115     if (item.tag == tag)
116     {
117     assert (tag != player_item.tag);
118     pair.second.erase (item);
119     }
120    
121     update ();
122     }
123    
124     static data::item &
125     merge (data::inventory &inv, data::item const &item)
126     {
127     foreach (data::item &inv_item, inv)
128     if (inv_item.tag == item.tag)
129     return inv_item = item;
130     inv.push_back (item);
131     return inv.back ();
132     }
133    
134     void
135     inventory_manager::item2 (u32 location, std::vector<data::item> const &items)
136     {
137     assert (player_item.tag != 0);
138    
139     data::inventory &inv = inventories[location];
140     foreach (data::item const &item, items)
141     merge (inv, item);
142    
143     update ();
144     }
145    
146     void
147     inventory_manager::player (u32 tag, u32 weight, u32 face, std::string const &name)
148     {
149     player_item.tag = tag;
150     player_item.weight = weight;
151     player_item.face = face;
152     player_item.singular = name;
153     }
154    
155     void
156     inventory_manager::upditem (u08 flags, u32 location, data::item const &item)
157     {
158     data::item *current = &get (item.tag);
159    
160     if (flags & UPD_LOCATION)
161     {
162     data::item save = *current;
163     delitem ({ item.tag });
164     current = &merge (inventories[location], save);
165     }
166    
167     if (flags & UPD_ANIM) current->anim = item.anim;
168     if (flags & UPD_ANIMSPEED) current->animspeed = item.animspeed;
169     if (flags & UPD_FACE) current->face = item.face;
170     if (flags & UPD_FLAGS) current->flags = item.flags;
171     if (flags & UPD_NROF) current->nrof = item.nrof;
172     if (flags & UPD_WEIGHT) current->weight = item.weight;
173    
174     if (flags & UPD_NAME)
175     {
176     current->singular = item.singular;
177     current->plural = item.plural;
178     }
179    
180     update ();
181     }