khanat-opennel-code/code/ryzom/common/src/game_share/visual_slot_manager.cpp
2010-05-06 02:08:41 +02:00

229 lines
7 KiB
C++

// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
/////////////
// INCLUDE //
/////////////
#include "stdpch.h"
// Misc
#include "nel/misc/file.h"
#include "nel/misc/stream.h"
#include "nel/misc/path.h"
// Game Share
#include "slot_types.h"
#include "visual_slot_manager.h"
////////////////////
// STATIC MEMBERS //
////////////////////
CVisualSlotManager *CVisualSlotManager::_Instance = 0;
////////////////////
// STATIC METHODS //
////////////////////
//---------------------------------------------------
// getInstance :
// Instanciate CVisualSlotManager. There can be only one instance (singleton)
// \return CVisualSlotManager * : Pointer on CVisualSlotManager.
//---------------------------------------------------
CVisualSlotManager * CVisualSlotManager::getInstance()
{
if(_Instance == 0)
{
_Instance = new CVisualSlotManager();
if(_Instance)
_Instance->init();
}
return _Instance;
}// getInstance //
// release memory
void CVisualSlotManager::releaseInstance()
{
if( _Instance )
delete _Instance;
_Instance = NULL;
}
/////////////
// METHODS //
/////////////
//-----------------------------------------------
// CVisualSlotManager :
// Constructor
//-----------------------------------------------
CVisualSlotManager::CVisualSlotManager()
{
}// CVisualSlotManager //
//-----------------------------------------------
// init :
// Load a visual slot file.
//-----------------------------------------------
void CVisualSlotManager::init()
{
const std::string filename = "visual_slot.tab";
// Open the file.
NLMISC::CIFile f;
if(f.open(NLMISC::CPath::lookup(filename, false, false)))
{
// Dump entities.
f.serialCont(_VisualSlot);
// Close the File.
f.close();
// Display elements read.
// for(uint i=0; i<_VisualSlot.size(); ++i)
// {
// for(uint j=0; j<_VisualSlot[i].Element.size(); ++j)
// nlinfo("Visu: %d Num: %d Id: %d sheet: %s", i, _VisualSlot[i].Element[j].Index, _VisualSlot[i].Element[j].SheetId.asInt(), _VisualSlot[i].Element[j].SheetId.toString().c_str());
// }
}
else
nlwarning("VSMngr:load: cannot open the file '%s'.", filename.c_str());
}// init //
//-----------------------------------------------
// rightItem2Index :
// Return the visual slot index from a sheet Id for items in right hand.
// \todo GUIGUI : Use map for faster search for example
//-----------------------------------------------
uint32 CVisualSlotManager::rightItem2Index(const NLMISC::CSheetId &id)
{
if(SLOTTYPE::RIGHT_HAND_SLOT < _VisualSlot.size())
{
for(uint i=0; i<_VisualSlot[SLOTTYPE::RIGHT_HAND_SLOT].Element.size(); ++i)
if(_VisualSlot[SLOTTYPE::RIGHT_HAND_SLOT].Element[i].SheetId == id)
return _VisualSlot[SLOTTYPE::RIGHT_HAND_SLOT].Element[i].Index;
}
else
nlwarning("VSMngr:rightItem2Index: Bad slot -> you probably need to rebuild the tab.");
// No Item
return 0;
}// rightItem2Index //
//-----------------------------------------------
// leftItem2Index :
// Return the visual slot index from a sheet Id for items in left hand.
// \todo GUIGUI : Use map for faster search for example
//-----------------------------------------------
uint32 CVisualSlotManager::leftItem2Index(const NLMISC::CSheetId &id)
{
if(SLOTTYPE::LEFT_HAND_SLOT < _VisualSlot.size())
{
for(uint i=0; i<_VisualSlot[SLOTTYPE::LEFT_HAND_SLOT].Element.size(); ++i)
if(_VisualSlot[SLOTTYPE::LEFT_HAND_SLOT].Element[i].SheetId == id)
return _VisualSlot[SLOTTYPE::LEFT_HAND_SLOT].Element[i].Index;
}
else
nlwarning("VSMngr:leftItem2Index: Bad slot -> you probably need to rebuild the tab.");
// No Item
return 0;
}// leftItem2Index //
//-----------------------------------------------
// sheet2Index :
// Return the visual index from a sheet Id and the visual slot.
// \todo GUIGUI : Use map for faster search for example
//-----------------------------------------------
uint32 CVisualSlotManager::sheet2Index(const NLMISC::CSheetId &id, SLOTTYPE::EVisualSlot slot)
{
if((uint)slot < _VisualSlot.size())
{
for(uint i=0; i<_VisualSlot[slot].Element.size(); ++i)
if(_VisualSlot[slot].Element[i].SheetId == id)
return _VisualSlot[slot].Element[i].Index;
}
else
nlwarning("VSMngr:sheet2Index: Bad slot '%d' -> you probably need to rebuild the tab.", (sint)slot);
// No Item
return 0;
}// sheet2Index //
//-----------------------------------------------
// index2Sheet :
// Return the sheet Id from visual index and the visual slot.
//-----------------------------------------------
NLMISC::CSheetId * CVisualSlotManager::index2Sheet(uint32 index, SLOTTYPE::EVisualSlot slot)
{
if((uint)slot < _VisualSlot.size())
{
for(uint i=0; i<_VisualSlot[slot].Element.size(); ++i)
if(_VisualSlot[slot].Element[i].Index == index)
return &_VisualSlot[slot].Element[i].SheetId;
}
else
nlwarning("VSMngr:index2Sheet: Bad slot '%d' -> you probably need to rebuild the tab.", (sint)slot);
// No SheetId
return NULL;
}
//-----------------------------------------------
// sheet2Index :
// \warning The result vector is not cleared before beeing filled.
//-----------------------------------------------
void CVisualSlotManager::sheet2Index(const NLMISC::CSheetId &id, std::vector<TIdxbyVS> &result)
{
for(uint i=0; i<_VisualSlot.size(); ++i)
{
for(uint j=0; j<_VisualSlot[i].Element.size(); ++j)
{
if(_VisualSlot[i].Element[j].SheetId == id)
{
TIdxbyVS idxbyVS;
idxbyVS.Index = _VisualSlot[i].Element[j].Index;
idxbyVS.VisualSlot = (SLOTTYPE::EVisualSlot)i;
result.push_back(idxbyVS);
}
}
}
}// sheet2Index //
//-----------------------------------------------
// getNbIndex :
// Return the number of different index for a visual slot.
//-----------------------------------------------
uint32 CVisualSlotManager::getNbIndex(SLOTTYPE::EVisualSlot slot) const
{
uint32 count = 0;
if((uint)slot < _VisualSlot.size())
{
for(uint i=0; i<_VisualSlot[slot].Element.size(); ++i)
if(_VisualSlot[slot].Element[i].Index > count)
count = _VisualSlot[slot].Element[i].Index;
}
else
nlwarning("VSMngr:getNbIndex: Bad slot '%d' -> you probably need to rebuild the tab.", (sint)slot);
// No Item
return count;
}// getNbIndex //