Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/orxonox/objects/pickup/PickupInventory.cc @ 3073

Last change on this file since 3073 was 3073, checked in by landauf, 15 years ago

merged pickups2 branch back to trunk. not yet tested.

  • Property svn:eol-style set to native
File size: 13.1 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Daniel 'Huty' Haggenmueller
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29#include "PickupInventory.h"
30
31#include "EquipmentItem.h"
32#include "PassiveItem.h"
33#include "UsableItem.h"
34
35#include "core/CoreIncludes.h"
36#include "core/ConsoleCommand.h"
37#include "core/input/InputManager.h"
38
39#include "gui/GUIManager.h"
40#include "objects/controllers/HumanController.h"
41#include "objects/worldentities/pawns/Pawn.h"
42
43#include <CEGUIImage.h>
44#include <CEGUIImageset.h>
45#include <CEGUIImagesetManager.h>
46#include <CEGUIWindow.h>
47#include <CEGUIWindowManager.h>
48#include <elements/CEGUITabControl.h>
49
50namespace orxonox
51{
52    orxonox::ConsoleCommand& function_PickupInventory_ToggleInventory_0 =
53        orxonox::CommandExecutor::addConsoleCommandShortcut(orxonox::createConsoleCommand(orxonox::createFunctor(&PickupInventory::toggleInventory), "toggleInventory"), true);
54
55    PickupInventory* PickupInventory::pickupInventory_s = NULL;
56    PickupInventory* PickupInventory::getSingleton()
57    {
58        if(!PickupInventory::pickupInventory_s)
59            PickupInventory::pickupInventory_s = new PickupInventory();
60
61        return PickupInventory::pickupInventory_s;
62    }
63
64    PickupInventory::PickupInventory()
65    {
66        this->bInventoryVisible_ = false;
67        this->visibleEquipmentWindows_ = this->visibleUsableWIndows_ = 0;
68
69        // Create some windows to avoid creating them while playing
70        CEGUI::WindowManager* winMgr = CEGUI::WindowManager::getSingletonPtr();
71        for(int i = 0; i < 10; i++)
72        {
73            std::ostringstream id;
74            id << i;
75
76            PickupInventory::createItemWindows(winMgr, "equ/" + id.str(), i % 5, i / 5);
77            PickupInventory::createItemWindows(winMgr, "use/" + id.str(), i % 5, i / 5);
78        }
79        this->createdEquipmentWindows_ = this->createdUsableWindows_ = 10;
80    }
81    PickupInventory::~PickupInventory()
82    {
83    }
84
85   
86
87    void PickupInventory::toggleInventory()
88    {
89        if(PickupInventory::getSingleton()->isVisible()) {
90            GUIManager::getInstancePtr()->executeCode("hideGUI(\"PickupInventory\")");
91            GUIManager::getInstancePtr()->executeCode("hideCursor()");
92            InputManager::getInstance().requestLeaveState("guiMouseOnly");
93        }
94        else
95        {
96            GUIManager::getInstancePtr()->showGUI("PickupInventory");
97            GUIManager::getInstancePtr()->executeCode("showCursor()");
98            InputManager::getInstance().requestEnterState("guiMouseOnly");
99        }
100        PickupInventory::getSingleton()->setVisible(!PickupInventory::getSingleton()->isVisible());
101    }
102
103    unsigned int PickupInventory::getCurrentUsableIndex()
104    {
105        Pawn* pawn = HumanController::getLocalControllerEntityAsPawn();
106        if(pawn && pawn->getPickups().getCurrentUsable())
107        {
108            UsableItem* use = pawn->getPickups().getCurrentUsable();
109            std::deque<UsableItem*> items = pawn->getPickups().getUsableItems();
110            for(unsigned int i = 0; i < items.size(); i++)
111            {
112                if(items.at(i) == use)
113                    return i;
114            }
115        }
116
117        return 0;
118    }
119    bool PickupInventory::isCurrentUsable(const BaseItem* item)
120    {
121        Pawn* pawn = HumanController::getLocalControllerEntityAsPawn();
122        if(pawn)
123            return (pawn->getPickups().getCurrentUsable() == item);
124        else
125            return false;
126    }
127    void PickupInventory::selectUsable(unsigned int i)
128    {
129        Pawn* pawn = HumanController::getLocalControllerEntityAsPawn();
130        if(pawn)
131        {
132            std::deque<UsableItem*> items = pawn->getPickups().getUsableItems();
133            if(i < items.size())
134                pawn->getPickups().setCurrentUsable(items.at(i));
135        }
136    }
137
138    unsigned int PickupInventory::getEquipmentCount()
139    {
140        Pawn* pawn = HumanController::getLocalControllerEntityAsPawn();
141        if(pawn)
142            return pawn->getPickups().getEquipmentItems().size();
143        else
144            return 0;
145    }
146    unsigned int PickupInventory::getUsableCount()
147    {
148        Pawn* pawn = HumanController::getLocalControllerEntityAsPawn();
149        if(pawn)
150            return pawn->getPickups().getUsableItems().size();
151        else
152            return 0;
153    }
154    unsigned int PickupInventory::getPassiveCount()
155    {
156        Pawn* pawn = HumanController::getLocalControllerEntityAsPawn();
157        if(pawn)
158            return pawn->getPickups().getPassiveItems().size();
159        else
160            return 0;
161    }
162    BaseItem* PickupInventory::getEquipmentItem(unsigned int i)
163    {
164        Pawn* pawn = HumanController::getLocalControllerEntityAsPawn();
165        if(pawn)
166        {
167            std::deque<EquipmentItem*> l = pawn->getPickups().getEquipmentItems();
168            if (i >= l.size()) { return NULL; }
169            return l.at(i);
170        }
171        else
172            return NULL;
173    }
174    BaseItem* PickupInventory::getUsableItem(unsigned int i)
175    {
176        Pawn* pawn = HumanController::getLocalControllerEntityAsPawn();
177        if(pawn)
178        {
179            std::deque<UsableItem*> l = pawn->getPickups().getUsableItems();
180            if (i >= l.size()) { return NULL; }
181            return l.at(i);
182        }
183        else
184            return NULL;
185    }
186    BaseItem* PickupInventory::getPassiveItem(unsigned int i)
187    {
188        Pawn* pawn = HumanController::getLocalControllerEntityAsPawn();
189        if(pawn)
190        {
191            std::deque<PassiveItem*> l = pawn->getPickups().getPassiveItems();
192            if (i >= l.size()) { return NULL; }
193            return l.at(i);
194        }
195        else
196            return NULL;
197    }
198
199    std::string PickupInventory::getImageForItem(const BaseItem* item)
200    {
201        if(!item)
202            return "";
203
204        std::string name = "pickup_" + item->getGUIImage();
205
206        if(!CEGUI::ImagesetManager::getSingletonPtr()->isImagesetPresent(name))
207        {
208            CEGUI::ImagesetManager::getSingletonPtr()->createImagesetFromImageFile(name, item->getGUIImage(), "");
209        }
210
211        return "set:" + name + " image:full_image";
212    }
213
214    void PickupInventory::clearInventory(CEGUI::WindowManager* winMgr, CEGUI::Window* equipPane, CEGUI::Window* usablePane)
215    {
216        for(unsigned int i = 0; i < this->visibleEquipmentWindows_; i++)
217        {
218            std::ostringstream id;
219            id << i;
220
221            winMgr->getWindow("orxonox/Inventory/Frame/equ/" + id.str())->setVisible(false);
222            winMgr->getWindow("orxonox/Inventory/Title/equ/" + id.str())->setVisible(false);
223            winMgr->getWindow("orxonox/Inventory/Items/equ/" + id.str())->setVisible(false);
224
225            /*equipPane->removeChildWindow("orxonox/Inventory/Frame/equ/" + id.str());
226            equipPane->removeChildWindow("orxonox/Inventory/Title/equ/" + id.str());
227            equipPane->removeChildWindow("orxonox/Inventory/Items/equ/" + id.str());*/
228        }
229        for(unsigned int i = 0; i < this->visibleUsableWIndows_; i++)
230        {
231            std::ostringstream id;
232            id << i;
233
234            winMgr->getWindow("orxonox/Inventory/Frame/use/" + id.str())->setVisible(false);
235            winMgr->getWindow("orxonox/Inventory/Title/use/" + id.str())->setVisible(false);
236            winMgr->getWindow("orxonox/Inventory/Items/use/" + id.str())->setVisible(false);
237
238            /*usablePane->removeChildWindow("orxonox/Inventory/Frame/use/" + id.str());
239            usablePane->removeChildWindow("orxonox/Inventory/Title/use/" + id.str());
240            usablePane->removeChildWindow("orxonox/Inventory/Items/use/" + id.str());*/
241        }
242    }
243    void PickupInventory::updateTabs(CEGUI::WindowManager *winMgr, CEGUI::Window *equipWindow, CEGUI::Window *usableWindow)
244    {
245        this->updateEquipment(winMgr, equipWindow);
246        this->updateUsable(winMgr, usableWindow);
247    }
248
249    void PickupInventory::updateEquipment(CEGUI::WindowManager* winMgr, CEGUI::Window* target)
250    {
251        Pawn* pawn;
252        if(pawn = HumanController::getLocalControllerEntityAsPawn())
253        {
254            std::deque<EquipmentItem*> items = pawn->getPickups().getEquipmentItems();
255            for(unsigned int i = 0; i < items.size(); i++)
256            {
257                std::ostringstream id;
258                id << "equ/" << i;
259
260                EquipmentItem* item = items.at(i);
261
262                if(this->createdEquipmentWindows_ <= i)
263                {
264                    PickupInventory::createItemWindows(winMgr, id.str(), i % 5, i / 5);
265                    this->createdEquipmentWindows_++;
266                }
267
268                PickupInventory::setWindowProperties(winMgr, target, id.str(), item, "FFFFFFFF");
269            }
270            this->visibleEquipmentWindows_ = items.size();
271        }
272    }
273    void PickupInventory::updateUsable(CEGUI::WindowManager* winMgr, CEGUI::Window* target)
274    {
275        Pawn* pawn;
276        if(pawn = HumanController::getLocalControllerEntityAsPawn())
277        {
278            std::deque<UsableItem*> items = pawn->getPickups().getUsableItems();
279            for(unsigned int i = 0; i < items.size(); i++)
280            {
281                std::ostringstream id;
282                id << "use/" << i;
283
284                UsableItem* item = items.at(i);
285                std::string colour;
286
287                if(PickupInventory::isCurrentUsable(item))
288                    colour = "FFFF5555";
289                else
290                    colour = "FFFFFFFF";
291
292                if(this->createdUsableWindows_ <= i)
293                {
294                    PickupInventory::createItemWindows(winMgr, id.str(), i % 5, i / 5);
295                    this->createdUsableWindows_++;
296                }
297
298                PickupInventory::setWindowProperties(winMgr, target, id.str(), item, colour);
299            }
300            this->visibleUsableWIndows_ = items.size();
301        }
302    }
303
304    void PickupInventory::createItemWindows(CEGUI::WindowManager* winMgr, const std::string& id, int x, int y)
305    { 
306        if(!winMgr) { return; }
307
308        CEGUI::Window* frame = winMgr->createWindow("TaharezLook/StaticImage", "orxonox/Inventory/Frame/" + id);
309        frame->setPosition(CEGUI::UVector2(CEGUI::UDim(0, 5 + x * 70), CEGUI::UDim(0, 5 + y * 90)));
310        frame->setSize(CEGUI::UVector2(CEGUI::UDim(0, 65), CEGUI::UDim(0, 65)));
311        frame->setVisible(false);
312
313        CEGUI::Window* text = winMgr->createWindow("TaharezLook/StaticText", "orxonox/Inventory/Title/" + id);
314        text->setPosition(CEGUI::UVector2(CEGUI::UDim(0, 5 + x * 70), CEGUI::UDim(0, 70 + y * 90)));
315        text->setSize(CEGUI::UVector2(CEGUI::UDim(0, 65), CEGUI::UDim(0, 20)));
316        text->setProperty("FrameEnabled", "False");
317        text->setProperty("BackgroundEnabled", "False");
318        text->setProperty("HorzFormatting", "HorzCentred");
319        text->setProperty("VertFormatting", "VertCentred");
320        text->setProperty("TextColours", "tl:FFFFFFFF tr:FFFFFFFF bl:FFFFFFFF br:FFFFFFFF");
321        text->setVisible(false);
322
323        CEGUI::Window* btn = winMgr->createWindow("TaharezLook/Button", "orxonox/Inventory/Items/" + id);
324        btn->setPosition(CEGUI::UVector2(CEGUI::UDim(0, 8 + x * 70), CEGUI::UDim(0, 8 + y * 90)));
325        btn->setSize(CEGUI::UVector2(CEGUI::UDim(0, 59), CEGUI::UDim(0, 59)));
326        btn->subscribeScriptedEvent("Clicked", "itemClicked");
327        btn->setVisible(false);
328    }
329    void PickupInventory::setWindowProperties(CEGUI::WindowManager* winMgr, CEGUI::Window* target, const std::string& id, const BaseItem* item, const std::string& textColour)
330    {
331        CEGUI::Window* txt = winMgr->getWindow("orxonox/Inventory/Title/" + id);
332        CEGUI::Window* btn = winMgr->getWindow("orxonox/Inventory/Items/" + id);
333        CEGUI::Window* frm = winMgr->getWindow("orxonox/Inventory/Frame/" + id);
334
335        frm->setVisible(true);
336
337        txt->setVisible(true);
338        txt->setProperty("Text", item->getGUIText());
339        txt->setProperty("TextColours", "tl:" + textColour + " tr:" + textColour + " bl:" + textColour + " br:" + textColour + "");
340
341        std::string image = PickupInventory::getImageForItem(item);
342        btn->setVisible(true);
343        btn->setProperty("NormalImage", image);
344        btn->setProperty("HoverImage", image);
345        btn->setProperty("PushedImage", image);
346        btn->setProperty("DisabledImage", image);
347        btn->setProperty("Tooltip", item->getGUIText());
348
349        target->addChildWindow(frm);
350        target->addChildWindow(txt);
351        target->addChildWindow(btn);
352    }
353}
Note: See TracBrowser for help on using the repository browser.