mirror of
https://github.com/vcmi/vcmi.git
synced 2025-08-13 19:54:17 +02:00
New files / project files for VC9.
This commit is contained in:
175
lib/CCreatureSet.cpp
Normal file
175
lib/CCreatureSet.cpp
Normal file
@@ -0,0 +1,175 @@
|
||||
#define VCMI_DLL
|
||||
#include "CCreatureSet.h"
|
||||
#include "../hch/CCreatureHandler.h"
|
||||
#include "VCMI_Lib.h"
|
||||
#include <assert.h>
|
||||
|
||||
const CStackInstance CCreatureSet::operator[](TSlot slot) const
|
||||
{
|
||||
TSlots::const_iterator i = slots.find(slot);
|
||||
if (i != slots.end())
|
||||
return i->second;
|
||||
else
|
||||
throw std::string("That slot is empty!");
|
||||
}
|
||||
|
||||
const CCreature* CCreatureSet::getCreature(TSlot slot) const /*workaround of map issue */
|
||||
{
|
||||
TSlots::const_iterator i = slots.find(slot);
|
||||
if (i != slots.end())
|
||||
return i->second.type;
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool CCreatureSet::setCreature(TSlot slot, TCreature type, TQuantity quantity) /*slots 0 to 6 */
|
||||
{
|
||||
slots[slot] = CStackInstance(type, quantity); //brutal force
|
||||
if (quantity == 0)
|
||||
slots.erase(slot);
|
||||
|
||||
if (slots.size() > 7)
|
||||
return false;
|
||||
else
|
||||
return true;
|
||||
}
|
||||
|
||||
TSlot CCreatureSet::getSlotFor(TCreature creature, ui32 slotsAmount/*=7*/) const /*returns -1 if no slot available */
|
||||
{
|
||||
for(TSlots::const_iterator i=slots.begin(); i!=slots.end(); ++i)
|
||||
{
|
||||
if(i->second.type->idNumber == creature)
|
||||
{
|
||||
return i->first; //if there is already such creature we return its slot id
|
||||
}
|
||||
}
|
||||
for(ui32 i=0; i<slotsAmount; i++)
|
||||
{
|
||||
if(slots.find(i) == slots.end())
|
||||
{
|
||||
return i; //return first free slot
|
||||
}
|
||||
}
|
||||
return -1; //no slot available
|
||||
}
|
||||
|
||||
int CCreatureSet::getAmount(TSlot slot) const
|
||||
{
|
||||
TSlots::const_iterator i = slots.find(slot);
|
||||
if (i != slots.end())
|
||||
return i->second.count;
|
||||
else
|
||||
return 0; //TODO? consider issuing a warning
|
||||
}
|
||||
|
||||
bool CCreatureSet::mergableStacks(std::pair<TSlot, TSlot> &out, TSlot preferable /*= -1*/) /*looks for two same stacks, returns slot positions */
|
||||
{
|
||||
//try to match creature to our preferred stack
|
||||
if(preferable >= 0 && vstd::contains(slots, preferable))
|
||||
{
|
||||
const CCreature *cr = slots[preferable].type;
|
||||
for(TSlots::const_iterator j=slots.begin(); j!=slots.end(); ++j)
|
||||
{
|
||||
if(cr == j->second.type && j->first != preferable)
|
||||
{
|
||||
out.first = preferable;
|
||||
out.second = j->first;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for(TSlots::const_iterator i=slots.begin(); i!=slots.end(); ++i)
|
||||
{
|
||||
for(TSlots::const_iterator j=slots.begin(); j!=slots.end(); ++j)
|
||||
{
|
||||
if(i->second.type == j->second.type && i->first != j->first)
|
||||
{
|
||||
out.first = i->first;
|
||||
out.second = j->first;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void CCreatureSet::sweep()
|
||||
{
|
||||
for(TSlots::iterator i=slots.begin(); i!=slots.end(); ++i)
|
||||
{
|
||||
if(!i->second.count)
|
||||
{
|
||||
slots.erase(i);
|
||||
sweep();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CCreatureSet::addToSlot(TSlot slot, TCreature cre, TQuantity count)
|
||||
{
|
||||
assert(slot >= 0);
|
||||
const CCreature *c = &VLC->creh->creatures[cre];
|
||||
assert(!vstd::contains(slots, slot) || slots[slot].type == c); //that slot was empty or contained same type creature
|
||||
slots[slot].type = c;
|
||||
slots[slot].count += count;
|
||||
}
|
||||
|
||||
void CCreatureSet::addToSlot(TSlot slot, const CStackInstance &stack)
|
||||
{
|
||||
addToSlot(slot, stack.type->idNumber, stack.count);
|
||||
}
|
||||
|
||||
bool CCreatureSet::validTypes(bool allowUnrandomized /*= false*/) const
|
||||
{
|
||||
for(TSlots::const_iterator i=slots.begin(); i!=slots.end(); ++i)
|
||||
{
|
||||
bool isRand = (i->second.idRand != -1);
|
||||
if(!isRand)
|
||||
{
|
||||
assert(i->second.type);
|
||||
assert(i->second.type == &VLC->creh->creatures[i->second.type->idNumber]);
|
||||
}
|
||||
else
|
||||
assert(allowUnrandomized);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
CStackInstance::CStackInstance()
|
||||
{
|
||||
init();
|
||||
}
|
||||
|
||||
CStackInstance::CStackInstance(TCreature id, TQuantity Count)
|
||||
{
|
||||
init();
|
||||
setType(id);
|
||||
count = Count;
|
||||
}
|
||||
|
||||
CStackInstance::CStackInstance(const CCreature *cre, TQuantity Count)
|
||||
{
|
||||
init();
|
||||
type = cre;
|
||||
count = Count;
|
||||
}
|
||||
|
||||
void CStackInstance::init()
|
||||
{
|
||||
experience = 0;
|
||||
count = 0;
|
||||
type = NULL;
|
||||
idRand = -1;
|
||||
}
|
||||
|
||||
int CStackInstance::getQuantityID() const
|
||||
{
|
||||
return CCreature::getQuantityID(count);
|
||||
}
|
||||
|
||||
void CStackInstance::setType(int creID)
|
||||
{
|
||||
type = &VLC->creh->creatures[creID];
|
||||
}
|
70
lib/CCreatureSet.h
Normal file
70
lib/CCreatureSet.h
Normal file
@@ -0,0 +1,70 @@
|
||||
#ifndef __CCREATURESET_H__
|
||||
#define __CCREATURESET_H__
|
||||
|
||||
#include "../global.h"
|
||||
#include <map>
|
||||
|
||||
class CCreature;
|
||||
class CGHeroInstance;
|
||||
|
||||
//a few typedefs for CCreatureSet
|
||||
typedef si32 TSlot;
|
||||
typedef si32 TQuantity;
|
||||
typedef ui32 TCreature; //creature id
|
||||
|
||||
|
||||
class DLL_EXPORT CStackInstance
|
||||
{
|
||||
public:
|
||||
int idRand; //hlp variable used during loading game -> "id" placeholder for randomization
|
||||
const CCreature *type;
|
||||
TQuantity count;
|
||||
ui32 experience; //TODO: handle
|
||||
//TODO: stack artifacts
|
||||
|
||||
template <typename Handler> void serialize(Handler &h, const int version)
|
||||
{
|
||||
h/* & owner*/ & type & count & experience;
|
||||
}
|
||||
|
||||
int getQuantityID() const;
|
||||
void init();
|
||||
CStackInstance();
|
||||
CStackInstance(TCreature id, TQuantity count);
|
||||
CStackInstance(const CCreature *cre, TQuantity count);
|
||||
void setType(int creID);
|
||||
};
|
||||
|
||||
|
||||
typedef std::map<TSlot, CStackInstance> TSlots;
|
||||
|
||||
class DLL_EXPORT CCreatureSet //seven combined creatures
|
||||
{
|
||||
public:
|
||||
TSlots slots; //slots[slot_id]=> pair(creature_id,creature_quantity)
|
||||
ui8 formation; //false - wide, true - tight
|
||||
|
||||
const CStackInstance operator[](TSlot slot) const;
|
||||
|
||||
void addToSlot(TSlot slot, TCreature cre, TQuantity count); //Adds stack to slot. Slot must be empty or with same type creature
|
||||
void addToSlot(TSlot slot, const CStackInstance &stack); //Adds stack to slot. Slot must be empty or with same type creature
|
||||
|
||||
const CCreature* getCreature(TSlot slot) const; //workaround of map issue;
|
||||
int getAmount (TSlot slot) const;
|
||||
bool setCreature (TSlot slot, TCreature type, TQuantity quantity); //slots 0 to 6
|
||||
TSlot getSlotFor(TCreature creature, ui32 slotsAmount=7) const; //returns -1 if no slot available
|
||||
bool mergableStacks(std::pair<TSlot, TSlot> &out, TSlot preferable = -1); //looks for two same stacks, returns slot positions;
|
||||
bool validTypes(bool allowUnrandomized = false) const; //checks if all types of creatures are set properly
|
||||
|
||||
template <typename Handler> void serialize(Handler &h, const int version)
|
||||
{
|
||||
h & slots & formation;
|
||||
}
|
||||
operator bool() const
|
||||
{
|
||||
return slots.size() > 0;
|
||||
}
|
||||
void sweep();
|
||||
};
|
||||
|
||||
#endif // __CCREATURESET_H__
|
@@ -376,6 +376,10 @@
|
||||
RelativePath="..\hch\CCreatureHandler.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\CCreatureSet.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\hch\CDefObjInfoHandler.h"
|
||||
>
|
||||
@@ -453,6 +457,10 @@
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<File
|
||||
RelativePath=".\CCreatureSet.cpp"
|
||||
>
|
||||
</File>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
|
Reference in New Issue
Block a user