1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-11-28 08:48:48 +02:00

Our changes.

Restructured instances classes.
Still very instable.
This commit is contained in:
Michał W. Urbańczyk 2007-10-27 19:38:48 +00:00
parent c18e4573f1
commit 4f316cd7e6
22 changed files with 888 additions and 525 deletions

View File

@ -13,6 +13,7 @@
#include "CMessage.h" #include "CMessage.h"
#include <boost/algorithm/string.hpp> #include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/replace.hpp> #include <boost/algorithm/string/replace.hpp>
#include "CLua.h"
extern TTF_Font * TNRB16, *TNR, *GEOR13, *GEORXX; //fonts extern TTF_Font * TNRB16, *TNR, *GEOR13, *GEORXX; //fonts
using namespace boost::logic; using namespace boost::logic;
@ -176,7 +177,7 @@ void CHeroList::genList()
int howMany = LOCPLINT->cb->howManyHeroes(); int howMany = LOCPLINT->cb->howManyHeroes();
for (int i=0;i<howMany;i++) for (int i=0;i<howMany;i++)
{ {
items.push_back(std::pair<const CHeroInstance *,CPath *>(LOCPLINT->cb->getHeroInfo(LOCPLINT->playerID,i,0),NULL)); items.push_back(std::pair<const CGHeroInstance *,CPath *>(LOCPLINT->cb->getHeroInfo(LOCPLINT->playerID,i,0),NULL));
} }
} }
void CHeroList::select(int which) void CHeroList::select(int which)
@ -633,7 +634,7 @@ void CMinimap::draw()
blitAt(map[LOCPLINT->adventureInt->position.z],0,0,temps); blitAt(map[LOCPLINT->adventureInt->position.z],0,0,temps);
//draw heroes //draw heroes
std::vector <const CHeroInstance *> * hh = LOCPLINT->cb->getHeroesInfo(false); std::vector <const CGHeroInstance *> * hh = LOCPLINT->cb->getHeroesInfo(false);
int mw = map[0]->w, mh = map[0]->h, int mw = map[0]->w, mh = map[0]->h,
wo = mw/CGI->mh->sizes.x, ho = mh/CGI->mh->sizes.y; wo = mw/CGI->mh->sizes.x, ho = mh/CGI->mh->sizes.y;
for (int i=0; i<hh->size();i++) for (int i=0; i<hh->size();i++)
@ -645,7 +646,7 @@ void CMinimap::draw()
{ {
for (int jj=0; jj<ho; jj++) for (int jj=0; jj<ho; jj++)
{ {
SDL_PutPixel(temps,maplgp.x+ii,maplgp.y+jj,CGI->playerColors[(*hh)[i]->owner].r,CGI->playerColors[(*hh)[i]->owner].g,CGI->playerColors[(*hh)[i]->owner].b); SDL_PutPixel(temps,maplgp.x+ii,maplgp.y+jj,CGI->playerColors[(*hh)[i]->state->owner].r,CGI->playerColors[(*hh)[i]->state->owner].g,CGI->playerColors[(*hh)[i]->state->owner].b);
} }
} }
} }
@ -816,7 +817,7 @@ void CTerrainRect::clickLeft(tribool down)
if ( (currentPath->endPos()) == mp) if ( (currentPath->endPos()) == mp)
{ //move { //move
CPath sended(*currentPath); //temporary path - engine will operate on it CPath sended(*currentPath); //temporary path - engine will operate on it
LOCPLINT->cb->moveHero( ((const CHeroInstance*)LOCPLINT->adventureInt->selection.selected)->type->ID,&sended,1,0); LOCPLINT->cb->moveHero( ((const CGHeroInstance*)LOCPLINT->adventureInt->selection.selected)->type->ID,&sended,1,0);
} }
else else
{ {
@ -824,7 +825,7 @@ void CTerrainRect::clickLeft(tribool down)
currentPath=NULL; currentPath=NULL;
} }
} }
const CHeroInstance * currentHero = LOCPLINT->adventureInt->heroList.items[LOCPLINT->adventureInt->heroList.selected].first; const CGHeroInstance * currentHero = LOCPLINT->adventureInt->heroList.items[LOCPLINT->adventureInt->heroList.selected].first;
int3 bufpos = currentHero->getPosition(false); int3 bufpos = currentHero->getPosition(false);
//bufpos.x-=1; //bufpos.x-=1;
currentPath = LOCPLINT->adventureInt->heroList.items[LOCPLINT->adventureInt->heroList.selected].second = CGI->pathf->getPath(bufpos,mp,currentHero,1); currentPath = LOCPLINT->adventureInt->heroList.items[LOCPLINT->adventureInt->heroList.selected].second = CGI->pathf->getPath(bufpos,mp,currentHero,1);
@ -1041,7 +1042,7 @@ void CTerrainRect::show()
} }
} }
if ( ((currentPath->nodes[i].dist)-(*(currentPath->nodes.end()-1)).dist) > ((const CHeroInstance*)(LOCPLINT->adventureInt->selection.selected))->movement) if ( ((currentPath->nodes[i].dist)-(*(currentPath->nodes.end()-1)).dist) > ((const CGHeroInstance*)(LOCPLINT->adventureInt->selection.selected))->movement)
pn+=25; pn+=25;
if (pn>=0) if (pn>=0)
{ {
@ -1239,7 +1240,7 @@ void CAdvMapInt::fmoveHero()
if (!terrain.currentPath) if (!terrain.currentPath)
return; return;
CPath sended(*(terrain.currentPath)); //temporary path - engine will operate on it CPath sended(*(terrain.currentPath)); //temporary path - engine will operate on it
LOCPLINT->cb->moveHero( ((const CHeroInstance*)LOCPLINT->adventureInt->selection.selected)->type->ID,&sended,1,0); LOCPLINT->cb->moveHero( ((const CGHeroInstance*)LOCPLINT->adventureInt->selection.selected)->type->ID,&sended,1,0);
} }
void CAdvMapInt::fshowSpellbok() void CAdvMapInt::fshowSpellbok()
{ {

View File

@ -11,7 +11,8 @@ class CDefHandler;
class CCallback; class CCallback;
class CTownInstance; class CTownInstance;
class CPath; class CPath;
class CGHeroInstance;
class CGTownInstance;
class AdventureMapButton class AdventureMapButton
: public ClickableL, public ClickableR, public Hoverable, public KeyInterested, public CButtonBase : public ClickableL, public ClickableR, public Hoverable, public KeyInterested, public CButtonBase
{ {
@ -26,7 +27,7 @@ public:
void hover (bool on); void hover (bool on);
void keyPressed (SDL_KeyboardEvent & key); void keyPressed (SDL_KeyboardEvent & key);
void activate(); // makes button active void activate(); // makes button active
void deactivate(); // makes button inactive (but don't deletes) void deactivate(); // makes button inactive (but doesn't delete)
AdventureMapButton(); //c-tor AdventureMapButton(); //c-tor
AdventureMapButton( std::string Name, std::string HelpBox, void(CAdvMapInt::*Function)(), int x, int y, std::string defName, bool activ=false, std::vector<std::string> * add = NULL );//c-tor AdventureMapButton( std::string Name, std::string HelpBox, void(CAdvMapInt::*Function)(), int x, int y, std::string defName, bool activ=false, std::vector<std::string> * add = NULL );//c-tor
@ -59,7 +60,7 @@ class CHeroList
{ {
public: public:
CDefHandler *mobile, *mana; CDefHandler *mobile, *mana;
std::vector<std::pair<const CHeroInstance*, CPath *> > items; std::vector<std::pair<const CGHeroInstance*, CPath *> > items;
int posmobx, posporx, posmanx, posmoby, pospory, posmany; int posmobx, posporx, posmanx, posmoby, pospory, posmany;
CHeroList(); CHeroList();
@ -79,7 +80,7 @@ class CTownList
: public CList : public CList
{ {
public: public:
std::vector<const CTownInstance*> items; std::vector<const CGTownInstance*> items;
int posporx,pospory; int posporx,pospory;
CTownList(); CTownList();

View File

@ -8,7 +8,8 @@
#include "mapHandler.h" #include "mapHandler.h"
#include "CGameState.h" #include "CGameState.h"
#include "CGameInterface.h" #include "CGameInterface.h"
int CCallback::lowestSpeed(CHeroInstance * chi) #include "CLua.h"
int CCallback::lowestSpeed(CGHeroInstance * chi)
{ {
int min = 150; int min = 150;
for ( std::map<int,std::pair<CCreature*,int> >::iterator i = chi->army.slots.begin(); for ( std::map<int,std::pair<CCreature*,int> >::iterator i = chi->army.slots.begin();
@ -19,7 +20,7 @@ int CCallback::lowestSpeed(CHeroInstance * chi)
} }
return min; return min;
} }
int CCallback::valMovePoints(CHeroInstance * chi) int CCallback::valMovePoints(CGHeroInstance * chi)
{ {
int ret = 1270+70*lowestSpeed(chi); int ret = 1270+70*lowestSpeed(chi);
if (ret>2000) if (ret>2000)
@ -43,7 +44,7 @@ void CCallback::newTurn()
} }
bool CCallback::moveHero(int ID, CPath * path, int idtype, int pathType) bool CCallback::moveHero(int ID, CPath * path, int idtype, int pathType)
{ {
CHeroInstance * hero = NULL; CGHeroInstance * hero = NULL;
if (idtype==0) if (idtype==0)
{ {
@ -97,8 +98,8 @@ bool CCallback::moveHero(int ID, CPath * path, int idtype, int pathType)
HeroMoveDetails curd; HeroMoveDetails curd;
curd.src = stpos; curd.src = stpos;
curd.dst = endpos; curd.dst = endpos;
curd.ho = hero->ourObject; //curd.ho = hero->ourObject;
curd.owner = hero->owner; curd.owner = hero->state->owner;
/*if(player!=-1) /*if(player!=-1)
{ {
hero->pos = endpos; hero->pos = endpos;
@ -148,10 +149,15 @@ bool CCallback::moveHero(int ID, CPath * path, int idtype, int pathType)
} }
++nn; ++nn;
} }
std::vector< CGObjectInstance * > vis = CGI->mh->getVisitableObjs(hero->getPosition(false));
for (int iii=0; iii<vis.size(); iii++)
std::cout<< CGI->objh->objects[5].name<<std::endl;
} }
else else
return true; //move ended - no more movement points return true; //move ended - no more movement points
hero->ourObject->pos = curd.dst; hero->pos = curd.dst;
} }
return true; return true;
} }
@ -161,7 +167,7 @@ int CCallback::howManyTowns()
{ {
return gs->players[gs->currentPlayer].towns.size(); return gs->players[gs->currentPlayer].towns.size();
} }
const CTownInstance * CCallback::getTownInfo(int val, bool mode) //mode = 0 -> val = serial; mode = 1 -> val = ID const CGTownInstance * CCallback::getTownInfo(int val, bool mode) //mode = 0 -> val = serial; mode = 1 -> val = ID
{ {
if (!mode) if (!mode)
return gs->players[gs->currentPlayer].towns[val]; return gs->players[gs->currentPlayer].towns[val];
@ -183,7 +189,7 @@ int CCallback::howManyHeroes()
{ {
return gs->players[player].heroes.size(); return gs->players[player].heroes.size();
} }
const CHeroInstance * CCallback::getHeroInfo(int player, int val, bool mode) //mode = 0 -> val = serial; mode = 1 -> val = ID const CGHeroInstance * CCallback::getHeroInfo(int player, int val, bool mode) //mode = 0 -> val = serial; mode = 1 -> val = ID
{ {
if (gs->currentPlayer!=player) //TODO: checking if we are allowed to give that info if (gs->currentPlayer!=player) //TODO: checking if we are allowed to give that info
return NULL; return NULL;
@ -283,9 +289,9 @@ bool CCallback::isVisible(int3 pos, int Player)
return gs->players[Player].fogOfWarMap[pos.x][pos.y][pos.z]; return gs->players[Player].fogOfWarMap[pos.x][pos.y][pos.z];
} }
std::vector < const CHeroInstance *> * CCallback::getHeroesInfo(bool onlyOur) std::vector < const CGHeroInstance *> * CCallback::getHeroesInfo(bool onlyOur)
{ {
std::vector < const CHeroInstance *> * ret = new std::vector < const CHeroInstance *>(); std::vector < const CGHeroInstance *> * ret = new std::vector < const CGHeroInstance *>();
for ( std::map<int, PlayerState>::iterator i=gs->players.begin() ; i!=gs->players.end();i++) for ( std::map<int, PlayerState>::iterator i=gs->players.begin() ; i!=gs->players.end();i++)
{ {
for (int j=0;j<(*i).second.heroes.size();j++) for (int j=0;j<(*i).second.heroes.size();j++)

View File

@ -7,12 +7,12 @@ class CGameState;
class CHeroInstance; class CHeroInstance;
class CTownInstance; class CTownInstance;
class CPath; class CPath;
class CObjectInstance; class CGObjectInstance;
struct HeroMoveDetails struct HeroMoveDetails
{ {
int3 src, dst; //source and destination points int3 src, dst; //source and destination points
CObjectInstance * ho; //object instance of this hero CGHeroInstance * ho; //object instance of this hero
int owner; int owner;
}; };
@ -22,8 +22,8 @@ private:
void newTurn(); void newTurn();
CCallback(CGameState * GS, int Player):gs(GS),player(Player){}; CCallback(CGameState * GS, int Player):gs(GS),player(Player){};
CGameState * gs; CGameState * gs;
int lowestSpeed(CHeroInstance * chi); //speed of the slowest stack int lowestSpeed(CGHeroInstance * chi); //speed of the slowest stack
int valMovePoints(CHeroInstance * chi); int valMovePoints(CGHeroInstance * chi);
bool isVisible(int3 pos, int Player); bool isVisible(int3 pos, int Player);
protected: protected:
@ -38,17 +38,20 @@ public:
bool verifyPath(CPath * path, bool blockSea); bool verifyPath(CPath * path, bool blockSea);
int getDate(int mode=0); //mode=0 - total days in game, mode=1 - day of week, mode=2 - current week, mode=3 - current month int getDate(int mode=0); //mode=0 - total days in game, mode=1 - day of week, mode=2 - current week, mode=3 - current month
PseudoV< PseudoV< PseudoV<unsigned char> > > & getVisibilityMap(); //returns visibility map (TODO: make it const) PseudoV< PseudoV< PseudoV<unsigned char> > > & getVisibilityMap(); //returns visibility map (TODO: make it const)
const CHeroInstance * getHeroInfo(int player, int val, bool mode); //mode = 0 -> val = serial; mode = 1 -> val = ID const CGHeroInstance * getHeroInfo(int player, int val, bool mode); //mode = 0 -> val = serial; mode = 1 -> val = ID
int getResourceAmount(int type); int getResourceAmount(int type);
int howManyHeroes(); int howManyHeroes();
const CTownInstance * getTownInfo(int val, bool mode); //mode = 0 -> val = serial; mode = 1 -> val = ID const CGTownInstance * getTownInfo(int val, bool mode); //mode = 0 -> val = serial; mode = 1 -> val = ID
int howManyTowns(); int howManyTowns();
std::vector < std::string > getObjDescriptions(int3 pos); //returns descriptions of objects at pos in order from the lowest to the highest std::vector < std::string > getObjDescriptions(int3 pos); //returns descriptions of objects at pos in order from the lowest to the highest
std::vector < const CHeroInstance *> * getHeroesInfo(bool onlyOur=true); std::vector < const CGHeroInstance *> * getHeroesInfo(bool onlyOur=true);
bool isVisible(int3 pos); bool isVisible(int3 pos);
//friends //friends
friend int _tmain(int argc, _TCHAR* argv[]); friend int _tmain(int argc, _TCHAR* argv[]);
}; };
class CLuaCallback
{
};
#endif //CCALLBACK_H #endif //CCALLBACK_H

View File

@ -46,7 +46,7 @@ int internalFunc(void * callback)
case 'M': //move heroa case 'M': //move heroa
{ {
readed>>heronum>>dest; readed>>heronum>>dest;
const CHeroInstance * hero = cb->getHeroInfo(0,heronum,0); const CGHeroInstance * hero = cb->getHeroInfo(0,heronum,0);
CPath * path = CGI->pathf->getPath(hero->getPosition(false),dest,hero); CPath * path = CGI->pathf->getPath(hero->getPosition(false),dest,hero);
cb->moveHero(heronum, path, 0, 0); cb->moveHero(heronum, path, 0, 0);
delete path; delete path;

View File

@ -22,7 +22,7 @@ using namespace CSDL_Ext;
class OCM_HLP_CGIN class OCM_HLP_CGIN
{ {
public: public:
bool operator ()(const std::pair<CObjectInstance*,std::pair<SDL_Rect, std::vector<std::list<int3>>>> & a, const std::pair<CObjectInstance*,std::pair<SDL_Rect, std::vector<std::list<int3>>>> & b) const bool operator ()(const std::pair<CGObjectInstance*,std::pair<SDL_Rect, std::vector<std::list<int3>>>> & a, const std::pair<CGObjectInstance*,std::pair<SDL_Rect, std::vector<std::list<int3>>>> & b) const
{ {
return (*a.first)<(*b.first); return (*a.first)<(*b.first);
} }
@ -289,7 +289,7 @@ void CPlayerInterface::heroMoved(const HeroMoveDetails & details)
{ {
adventureInt->minimap.draw(); adventureInt->minimap.draw();
//initializing objects and performing first step of move //initializing objects and performing first step of move
CObjectInstance * ho = details.ho; //object representing this hero CGHeroInstance * ho = details.ho; //object representing this hero
int3 hp = details.src; int3 hp = details.src;
if (adventureInt->terrain.currentPath) //&& hero is moving if (adventureInt->terrain.currentPath) //&& hero is moving
@ -843,10 +843,10 @@ void CPlayerInterface::heroMoved(const HeroMoveDetails & details)
//move finished //move finished
adventureInt->heroList.draw(); adventureInt->heroList.draw();
} }
void CPlayerInterface::heroKilled(const CHeroInstance * hero) void CPlayerInterface::heroKilled(const CGHeroInstance*)
{ {
} }
void CPlayerInterface::heroCreated(const CHeroInstance * hero) void CPlayerInterface::heroCreated(const CGHeroInstance * hero)
{ {
} }
@ -862,7 +862,7 @@ SDL_Surface * CPlayerInterface::infoWin(void * specific) //specific=0 => draws i
SDL_Surface * ret = copySurface(hInfo); SDL_Surface * ret = copySurface(hInfo);
SDL_SetColorKey(ret,SDL_SRCCOLORKEY,SDL_MapRGB(ret->format,0,255,255)); SDL_SetColorKey(ret,SDL_SRCCOLORKEY,SDL_MapRGB(ret->format,0,255,255));
blueToPlayersAdv(ret,playerID,1); blueToPlayersAdv(ret,playerID,1);
const CHeroInstance * curh = (const CHeroInstance *)adventureInt->selection.selected; const CGHeroInstance * curh = (const CGHeroInstance *)adventureInt->selection.selected;
printAt(curh->name,75,15,GEOR13,zwykly,ret); printAt(curh->name,75,15,GEOR13,zwykly,ret);
for (int i=0;i<PRIMARY_SKILLS;i++) for (int i=0;i<PRIMARY_SKILLS;i++)
{ {

View File

@ -15,6 +15,7 @@ class CHeroInstance;
class CDefHandler; class CDefHandler;
struct HeroMoveDetails; struct HeroMoveDetails;
class CDefEssential; class CDefEssential;
class CGHeroInstance;
class CIntObject //interface object class CIntObject //interface object
{ {
public: public:
@ -93,8 +94,8 @@ public:
virtual void init(CCallback * CB)=0{}; virtual void init(CCallback * CB)=0{};
virtual void yourTurn()=0{}; virtual void yourTurn()=0{};
virtual void heroKilled(const CHeroInstance * hero)=0{}; virtual void heroKilled(const CGHeroInstance*)=0{};
virtual void heroCreated(const CHeroInstance * hero)=0{}; virtual void heroCreated(const CGHeroInstance*)=0{};
virtual void heroMoved(const HeroMoveDetails & details)=0; virtual void heroMoved(const HeroMoveDetails & details)=0;
}; };
@ -109,8 +110,8 @@ class CGlobalAI : public CGameInterface // AI class (to derivate)
public: public:
//CGlobalAI(); //CGlobalAI();
virtual void yourTurn(){}; virtual void yourTurn(){};
virtual void heroKilled(const CHeroInstance * hero){}; virtual void heroKilled(const CGHeroInstance*){};
virtual void heroCreated(const CHeroInstance * hero){}; virtual void heroCreated(const CGHeroInstance*){};
}; };
class CPlayerInterface : public CGameInterface class CPlayerInterface : public CGameInterface
{ {
@ -138,8 +139,8 @@ public:
//overloaded funcs from Interface //overloaded funcs from Interface
void yourTurn(); void yourTurn();
void heroMoved(const HeroMoveDetails & details); void heroMoved(const HeroMoveDetails & details);
void heroKilled(const CHeroInstance * hero); void heroKilled(const CGHeroInstance*);
void heroCreated(const CHeroInstance * hero); void heroCreated(const CGHeroInstance*);
SDL_Surface * infoWin(void * specific); //specific=0 => draws info about selected town/hero //TODO - gdy sie dorobi sensowna hierarchie klas ins. to wywalic tego brzydkiego void* SDL_Surface * infoWin(void * specific); //specific=0 => draws info about selected town/hero //TODO - gdy sie dorobi sensowna hierarchie klas ins. to wywalic tego brzydkiego void*
void handleEvent(SDL_Event * sEvent); void handleEvent(SDL_Event * sEvent);

View File

@ -14,8 +14,8 @@ public:
//std::vector<std::vector<std::vector<char> > > fogOfWarMap; //true - visible, false - hidden //std::vector<std::vector<std::vector<char> > > fogOfWarMap; //true - visible, false - hidden
PseudoV< PseudoV< PseudoV<unsigned char> > > fogOfWarMap; //true - visible, false - hidden PseudoV< PseudoV< PseudoV<unsigned char> > > fogOfWarMap; //true - visible, false - hidden
std::vector<int> resources; std::vector<int> resources;
std::vector<CHeroInstance *> heroes; std::vector<CGHeroInstance *> heroes;
std::vector<CTownInstance *> towns; std::vector<CGTownInstance *> towns;
PlayerState():color(-1){}; PlayerState():color(-1){};
}; };

View File

@ -7,7 +7,8 @@
#include <luabind/function.hpp> #include <luabind/function.hpp>
#include <luabind/class.hpp> #include <luabind/class.hpp>
#include "CLuaHandler.h" #include "CLuaHandler.h"
#include "boost/filesystem.hpp"
#include <boost/algorithm/string.hpp>
void piszpowitanie2(std::string i) //simple global function for testing void piszpowitanie2(std::string i) //simple global function for testing
{ {
std::cout<<"powitanie2zc++. Liczba dnia to " << i; std::cout<<"powitanie2zc++. Liczba dnia to " << i;
@ -53,4 +54,27 @@ void CLuaHandler::test()
} }
} }
lua_close (lua); lua_close (lua);
}
std::vector<std::string> * CLuaHandler::searchForScripts(std::string fol)
{
std::vector<std::string> * ret = new std::vector<std::string> ();
boost::filesystem::path folder(fol);
if (!boost::filesystem::exists(folder))
throw new std::exception("No such folder!");
boost::filesystem::directory_iterator end_itr;
for
(
boost::filesystem::directory_iterator it(folder);
it!=end_itr;
it++
)
{
if(boost::algorithm::ends_with((it->path().leaf()),".lua"))
{
ret->push_back(fol+"/"+(it->path().leaf()));
}
}
return ret;
} }

View File

@ -12,6 +12,9 @@ class CLuaHandler
{ {
public: public:
CLuaHandler(); CLuaHandler();
static std::vector<std::string> * searchForScripts(std::string fol);
~CLuaHandler(); ~CLuaHandler();
void test(); void test();

16
CMT.cpp
View File

@ -44,6 +44,7 @@
#include "CGameState.h" #include "CGameState.h"
#include "CCallback.h" #include "CCallback.h"
#include "CLuaHandler.h" #include "CLuaHandler.h"
#include "CLua.h"
#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__) #if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__)
# include <fcntl.h> # include <fcntl.h>
# include <io.h> # include <io.h>
@ -96,9 +97,9 @@ void initGameState(CGameInfo * cgi)
/*************************HEROES************************************************/ /*************************HEROES************************************************/
for (int i=0; i<cgi->heroh->heroInstances.size();i++) //heroes instances for (int i=0; i<cgi->heroh->heroInstances.size();i++) //heroes instances
{ {
if (!cgi->heroh->heroInstances[i]->type || cgi->heroh->heroInstances[i]->owner<0) if (!cgi->heroh->heroInstances[i]->type || cgi->heroh->heroInstances[i]->state->owner<0)
continue; continue;
CHeroInstance * vhi = new CHeroInstance(); CGHeroInstance * vhi = new CGHeroInstance();
*vhi=*(cgi->heroh->heroInstances[i]); *vhi=*(cgi->heroh->heroInstances[i]);
if (!vhi->level) if (!vhi->level)
{ {
@ -138,7 +139,7 @@ void initGameState(CGameInfo * cgi)
vhi->army.slots[2].second = (rand()%(vhi->type->high3stack-vhi->type->low3stack))+vhi->type->low3stack; vhi->army.slots[2].second = (rand()%(vhi->type->high3stack-vhi->type->low3stack))+vhi->type->low3stack;
} }
cgi->state->players[vhi->owner].heroes.push_back(vhi); cgi->state->players[vhi->state->owner].heroes.push_back(vhi);
} }
/*************************FOG**OF**WAR******************************************/ /*************************FOG**OF**WAR******************************************/
@ -173,12 +174,12 @@ void initGameState(CGameInfo * cgi)
/****************************TOWNS************************************************/ /****************************TOWNS************************************************/
for (int i=0;i<cgi->townh->townInstances.size();i++) for (int i=0;i<cgi->townh->townInstances.size();i++)
{ {
CTownInstance * vti = new CTownInstance(); CGTownInstance * vti = new CGTownInstance();
(*vti)=*(cgi->townh->townInstances[i]); (*vti)=*(cgi->townh->townInstances[i]);
if (vti->name.length()==0) // if town hasn't name we draw it if (vti->name.length()==0) // if town hasn't name we draw it
vti->name=vti->town->names[rand()%vti->town->names.size()]; vti->name=vti->town->names[rand()%vti->town->names.size()];
cgi->state->players[vti->owner].towns.push_back(vti); cgi->state->players[vti->state->owner].towns.push_back(vti);
} }
for(std::map<int, PlayerState>::iterator k=cgi->state->players.begin(); k!=cgi->state->players.end(); ++k) for(std::map<int, PlayerState>::iterator k=cgi->state->players.begin(); k!=cgi->state->players.end(); ++k)
@ -203,8 +204,13 @@ void initGameState(CGameInfo * cgi)
int _tmain(int argc, _TCHAR* argv[]) int _tmain(int argc, _TCHAR* argv[])
{ {
CLuaHandler luatest; CLuaHandler luatest;
luatest.test(); luatest.test();
CLuaHandler::searchForScripts("scripts");
CLua * lua = new CLua("test.lua");
//CBIKHandler cb; //CBIKHandler cb;
//cb.open("CSECRET.BIK"); //cb.open("CSECRET.BIK");

View File

@ -13,7 +13,7 @@ int3 CPath::endPos()
return int3(nodes[0].coord.x,nodes[0].coord.y,nodes[0].coord.z); return int3(nodes[0].coord.x,nodes[0].coord.y,nodes[0].coord.z);
} }
CPath * CPathfinder::getPath(int3 src, int3 dest, const CHeroInstance * hero, unsigned char type) //TODO: test it (seems to be finished, but relies on unwritten functions :() CPath * CPathfinder::getPath(int3 src, int3 dest, const CGHeroInstance * hero, unsigned char type) //TODO: test it (seems to be finished, but relies on unwritten functions :()
{ {
//check input //check input
if ((src.x < 0)||(src.y < 0)||(src.z < 0)||(dest.x < 0)||(dest.y < 0)||(dest.z < 0)) if ((src.x < 0)||(src.y < 0)||(src.z < 0)||(dest.x < 0)||(dest.y < 0)||(dest.z < 0))

View File

@ -4,6 +4,7 @@
#include <queue> #include <queue>
#include <vector> #include <vector>
class CHeroInstance; class CHeroInstance;
class CGHeroInstance;
struct CPathNode struct CPathNode
{ {
bool accesible; //true if a hero can be on this node bool accesible; //true if a hero can be on this node
@ -29,7 +30,7 @@ class CPathfinder
private: private:
std::vector< std::vector<CPathNode *> > graph; std::vector< std::vector<CPathNode *> > graph;
public: public:
CPath * getPath(int3 src, int3 dest, const CHeroInstance * hero, unsigned char type=0); //calculates path between src and dest; returns pointer to CPath or NULL if path does not exists; type - type of calculation: 0 - positions are normal positions of hero; 1 - given places are tiles blocked by hero CPath * getPath(int3 src, int3 dest, const CGHeroInstance * hero, unsigned char type=0); //calculates path between src and dest; returns pointer to CPath or NULL if path does not exists; type - type of calculation: 0 - positions are normal positions of hero; 1 - given places are tiles blocked by hero
CPath * getPath(const int3 & src, const int3 & dest, const CHeroInstance * hero, int (*getDist)(int3 & a, int3 & b), unsigned char type=0); //calculates path between src and dest; returns pointer to CPath or NULL if path does not exists; uses getDist to calculate distance; type - type of calculation: 0 - positions are normal positions of hero; 1 - given places are tiles blocked by hero CPath * getPath(const int3 & src, const int3 & dest, const CHeroInstance * hero, int (*getDist)(int3 & a, int3 & b), unsigned char type=0); //calculates path between src and dest; returns pointer to CPath or NULL if path does not exists; uses getDist to calculate distance; type - type of calculation: 0 - positions are normal positions of hero; 1 - given places are tiles blocked by hero
static void convertPath(CPath * path, unsigned int mode); //mode=0 -> from 'manifest' to 'object' static void convertPath(CPath * path, unsigned int mode); //mode=0 -> from 'manifest' to 'object'

File diff suppressed because it is too large Load Diff

View File

@ -34,7 +34,7 @@ public:
std::vector<std::string> resDefNames; std::vector<std::string> resDefNames;
//// ////
void loadDefs(); void loadDefs();
EDefType getDefType(DefInfo& a); //returns type of object in def EDefType getDefType(CGDefInfo * a); //returns type of object in def
CCreatureSet readCreatureSet(int pos, int number = 7); //reads creature set in most recently encountered format; reades number units (default is 7) CCreatureSet readCreatureSet(int pos, int number = 7); //reads creature set in most recently encountered format; reades number units (default is 7)
}; };
#endif //CAMBARCENDAMO_H #endif //CAMBARCENDAMO_H

View File

@ -13,7 +13,7 @@ class CHeroClass;
class CObjectInstance; class CObjectInstance;
class CDefHandler; class CDefHandler;
class CGameInfo; class CGameInfo;
class CGHeroInstance;
class CHero class CHero
{ {
public: public:
@ -85,7 +85,7 @@ public:
class CHeroHandler class CHeroHandler
{ {
public: public:
std::vector<CHeroInstance *> heroInstances; std::vector<CGHeroInstance *> heroInstances;
std::vector<CHero*> heroes; //by³o nodrze std::vector<CHero*> heroes; //by³o nodrze
std::vector<CHeroClass *> heroClasses; std::vector<CHeroClass *> heroClasses;
std::vector<CDefHandler *> flags1, flags2, flags3, flags4; //flags blitted on heroes when std::vector<CDefHandler *> flags1, flags2, flags3, flags4; //flags blitted on heroes when

View File

@ -4,9 +4,9 @@
#include "CGeneralTextHandler.h" #include "CGeneralTextHandler.h"
#include "CLodHandler.h" #include "CLodHandler.h"
#include "CAmbarCendamo.h" #include "CAmbarCendamo.h"
#include "mapHandler.h" #include "../mapHandler.h"
#include "CDefObjInfoHandler.h" #include "CDefObjInfoHandler.h"
#include "../CLua.h"
void CObjectHandler::loadObjects() void CObjectHandler::loadObjects()
{ {
int ID=0; int ID=0;
@ -24,42 +24,241 @@ void CObjectHandler::loadObjects()
bool CObjectInstance::operator <(const CObjectInstance &cmp) const bool CObjectInstance::operator <(const CObjectInstance &cmp) const
{ {
if(CGI->ac->map.defy[this->defNumber].printPriority==1 && CGI->ac->map.defy[cmp.defNumber].printPriority==0) //if(CGI->ac->map.defy[this->defNumber].printPriority==1 && CGI->ac->map.defy[cmp.defNumber].printPriority==0)
// return true;
//if(CGI->ac->map.defy[cmp.defNumber].printPriority==1 && CGI->ac->map.defy[this->defNumber].printPriority==0)
// return false;
//if(this->pos.y<cmp.pos.y)
// return true;
//if(this->pos.y>cmp.pos.y)
// return false;
//if(CGI->ac->map.defy[this->defNumber].isOnDefList && !(CGI->ac->map.defy[cmp.defNumber].isOnDefList))
// return true;
//if(CGI->ac->map.defy[cmp.defNumber].isOnDefList && !(CGI->ac->map.defy[this->defNumber].isOnDefList))
// return false;
//if(!CGI->ac->map.defy[this->defNumber].isVisitable() && CGI->ac->map.defy[cmp.defNumber].isVisitable())
// return true;
//if(!CGI->ac->map.defy[cmp.defNumber].isVisitable() && CGI->ac->map.defy[this->defNumber].isVisitable())
// return false;
//if(this->pos.x<cmp.pos.x)
// return true;
return false;
}
int CObjectInstance::getWidth() const
{
return -1;//CGI->mh->reader->map.defy[defNumber].handler->ourImages[0].bitmap->w/32;
}
int CObjectInstance::getHeight() const
{
return -1;//CGI->mh->reader->map.defy[defNumber].handler->ourImages[0].bitmap->h/32;
}
bool CObjectInstance::visitableAt(int x, int y) const
{
//if(x<0 || y<0 || x>=getWidth() || y>=getHeight() || defObjInfoNumber<0)
// return false;
//if((CGI->dobjinfo->objs[defObjInfoNumber].visitMap[y+6-getHeight()] >> (7-(8-getWidth()+x) )) & 1)
// return true;
return false;
}
bool CGObjectInstance::isHero() const
{
return false;
}
int CGObjectInstance::getOwner() const
{
return state->getOwner();
}
int CGObjectInstance::getWidth() const//returns width of object graphic in tiles
{
return defInfo->handler->ourImages[0].bitmap->w/32;
}
int CGObjectInstance::getHeight() const //returns height of object graphic in tiles
{
return defInfo->handler->ourImages[0].bitmap->h/32;
}
bool CGObjectInstance::visitableAt(int x, int y) const //returns true if ibject is visitable at location (x, y) form left top tile of image (x, y in tiles)
{
if(x<0 || y<0 || x>=getWidth() || y>=getHeight() || defInfo==NULL)
return false;
if((defInfo->visitMap[y+6-getHeight()] >> (7-(8-getWidth()+x) )) & 1)
return true; return true;
if(CGI->ac->map.defy[cmp.defNumber].printPriority==1 && CGI->ac->map.defy[this->defNumber].printPriority==0) return false;
}
bool CGObjectInstance::operator<(const CGObjectInstance & cmp) const //screen printing priority comparing
{
if(defInfo->printPriority==1 && defInfo->printPriority==0)
return true;
if(defInfo->printPriority==1 && defInfo->printPriority==0)
return false; return false;
if(this->pos.y<cmp.pos.y) if(this->pos.y<cmp.pos.y)
return true; return true;
if(this->pos.y>cmp.pos.y) if(this->pos.y>cmp.pos.y)
return false; return false;
if(CGI->ac->map.defy[this->defNumber].isOnDefList && !(CGI->ac->map.defy[cmp.defNumber].isOnDefList)) if(defInfo->isOnDefList && !(defInfo->isOnDefList))
return true; return true;
if(CGI->ac->map.defy[cmp.defNumber].isOnDefList && !(CGI->ac->map.defy[this->defNumber].isOnDefList)) if(defInfo->isOnDefList && !(defInfo->isOnDefList))
return false; return false;
if(!CGI->ac->map.defy[this->defNumber].isVisitable() && CGI->ac->map.defy[cmp.defNumber].isVisitable()) if(!defInfo->isVisitable() && defInfo->isVisitable())
return true; return true;
if(!CGI->ac->map.defy[cmp.defNumber].isVisitable() && CGI->ac->map.defy[this->defNumber].isVisitable()) if(!defInfo->isVisitable() && defInfo->isVisitable())
return false; return false;
if(this->pos.x<cmp.pos.x) if(this->pos.x<cmp.pos.x)
return true; return true;
return false; return false;
} }
int CObjectInstance::getWidth() const
{
return CGI->mh->reader->map.defy[defNumber].handler->ourImages[0].bitmap->w/32;
}
int CObjectInstance::getHeight() const bool CGDefInfo::isVisitable()
{ {
return CGI->mh->reader->map.defy[defNumber].handler->ourImages[0].bitmap->h/32; for (int i=6; i<12; i++)
} {
if (bytes[i])
bool CObjectInstance::visitableAt(int x, int y) const return true;
{ }
if(x<0 || y<0 || x>=getWidth() || y>=getHeight())
return false;
if((CGI->dobjinfo->objs[defObjInfoNumber].visitMap[y] >> (7-x)) & 1)
return true;
return false; return false;
} }
bool CGHeroInstance::isHero() const
{
return true;
}
unsigned int CGHeroInstance::getTileCost(EterrainType & ttype, Eroad & rdtype, Eriver & rvtype)
{
unsigned int ret = type->heroClass->terrCosts[ttype];
switch(rdtype)
{
case Eroad::dirtRoad:
ret*=0.75;
break;
case Eroad::grazvelRoad:
ret*=0.667;
break;
case Eroad::cobblestoneRoad:
ret*=0.5;
break;
}
return ret;
}
unsigned int CGHeroInstance::getLowestCreatureSpeed()
{
unsigned int sl = 100;
for(int h=0; h<army.slots.size(); ++h)
{
if(army.slots[h].first->speed<sl)
sl = army.slots[h].first->speed;
}
return sl;
}
int3 CGHeroInstance::convertPosition(int3 src, bool toh3m) //toh3m=true: manifest->h3m; toh3m=false: h3m->manifest
{
if (toh3m)
{
src.x+=1;
return src;
}
else
{
src.x-=1;
return src;
}
}
int3 CGHeroInstance::getPosition(bool h3m) const //h3m=true - returns position of hero object; h3m=false - returns position of hero 'manifestation'
{
if (h3m)
return pos;
else return convertPosition(pos,false);
}
int CGHeroInstance::getSightDistance() const //returns sight distance of this hero
{
return 6;
}
void CGHeroInstance::setPosition(int3 Pos, bool h3m) //as above, but sets position
{
if (h3m)
pos = Pos;
else
pos = convertPosition(Pos,true);
}
bool CGHeroInstance::canWalkOnSea() const
{
//TODO: write it - it should check if hero is flying, or something similiar
return false;
}
int CGHeroInstance::getCurrentLuck() const
{
//TODO: write it
return 0;
}
int CGHeroInstance::getCurrentMorale() const
{
//TODO: write it
return 0;
}
int CGTownInstance::getSightDistance() const //returns sight distance
{
return 10;
}
CGTownInstance::CGTownInstance()
{
pos = int3(-1,-1,-1);
builded=-1;
destroyed=-1;
garrisonHero=NULL;
state->owner=-1;
town=NULL;
}
CGObjectInstance::CGObjectInstance()
{
//std::cout << "Tworze obiekt "<<this<<std::endl;
state = new CLuaObjectScript();
defObjInfoNumber = -1;
}
CGObjectInstance::~CGObjectInstance()
{
//std::cout << "Usuwam obiekt "<<this<<std::endl;
if (state)
delete state;
state=NULL;
}
CGHeroInstance::~CGHeroInstance()
{
}
CGTownInstance::~CGTownInstance()
{}
CGObjectInstance::CGObjectInstance(const CGObjectInstance & right)
{
pos = right.pos;
ID = right.ID;
subID = right.subID;
id = right.id;
defInfo = right.defInfo;
info = right.info;
defObjInfoNumber = right.defObjInfoNumber;
state = new CLuaObjectScript();
*state = *right.state;
}
CGObjectInstance& CGObjectInstance::operator=(const CGObjectInstance & right)
{
pos = right.pos;
ID = right.ID;
subID = right.subID;
id = right.id;
defInfo = right.defInfo;
info = right.info;
defObjInfoNumber = right.defObjInfoNumber;
state = new CLuaObjectScript();
*state = *right.state;
return *this;
}

View File

@ -8,7 +8,13 @@
#include "CAbilityHandler.h" #include "CAbilityHandler.h"
#include "CSpellHandler.h" #include "CSpellHandler.h"
#include "CHeroHandler.h" #include "CHeroHandler.h"
class CScript;
class CObjectScript;
class CGHeroInstance;
class CTown;
class CHero;
class CBuilding;
class CSpell;
class CSpecObjInfo //class with object - specific info (eg. different information for creatures and heroes); use inheritance to make object - specific classes class CSpecObjInfo //class with object - specific info (eg. different information for creatures and heroes); use inheritance to make object - specific classes
{ {
}; };
@ -60,7 +66,7 @@ public:
std::vector<CAbility *> abilities; //hero's abilities std::vector<CAbility *> abilities; //hero's abilities
std::vector<int> abilityLevels; //hero ability levels std::vector<int> abilityLevels; //hero ability levels
bool defaultMainStats; //if true attack, defence, power and knowledge are typical bool defaultMainStats; //if true attack, defence, power and knowledge are typical
CHeroInstance * myInstance; //pointer to appropriate hero instance CGHeroInstance * myInstance; //pointer to appropriate hero instance
}; };
class CCreatureObjInfo : public CSpecObjInfo class CCreatureObjInfo : public CSpecObjInfo
@ -307,11 +313,108 @@ public:
bool operator<(const CObjectInstance & cmp) const; //screen printing priority comparing bool operator<(const CObjectInstance & cmp) const; //screen printing priority comparing
}; };
class CGDefInfo
{
public:
std::string name;
int bytes [42];
unsigned char visitMap[6];
unsigned char blockMap[6];
//CSemiDefHandler * handler;
CDefHandler * handler;
int printPriority;
bool isOnDefList;
bool isVisitable();
};
class CGObjectInstance
{
public:
int3 pos; //h3m pos
int ID, subID; //normal ID (this one from OH3 maps ;])
int id;//number of object in CObjectHandler's vector
CGDefInfo * defInfo;
CObjectScript * state;
CSpecObjInfo * info;
int defObjInfoNumber;
virtual bool isHero() const;
int getOwner() const;
int getWidth() const; //returns width of object graphic in tiles
int getHeight() const; //returns height of object graphic in tiles
bool visitableAt(int x, int y) const; //returns true if ibject is visitable at location (x, y) form left top tile of image (x, y in tiles)
bool operator<(const CGObjectInstance & cmp) const; //screen printing priority comparing
CGObjectInstance();
virtual ~CGObjectInstance();
CGObjectInstance(const CGObjectInstance & right);
CGObjectInstance& operator=(const CGObjectInstance & right);
};
class CGHeroInstance : public CGObjectInstance
{
public:
int moveDir;
bool isStanding;
bool flagPrinted;
CHero * type;
int exp; //experience point
int level; //current level of hero
std::string name; //may be custom
std::string biography; //may be custom
int portrait; //may be custom
CCreatureSet army; //army
int mana; // remaining spell points
std::vector<int> primSkills; //0-attack, 1-defence, 2-spell power, 3-knowledge
std::vector<std::pair<int,int> > secSkills; //first - ID of skill, second - level of skill (0 - basic, 1 - adv., 2 - expert)
int movement; //remaining movement points
bool inTownGarrison; // if hero is in town garrison
virtual bool isHero() const;
unsigned int getTileCost(EterrainType & ttype, Eroad & rdtype, Eriver & rvtype);
unsigned int getLowestCreatureSpeed();
unsigned int getAdditiveMoveBonus();
unsigned float getMultiplicativeMoveBonus();
static int3 convertPosition(int3 src, bool toh3m); //toh3m=true: manifest->h3m; toh3m=false: h3m->manifest
int3 getPosition(bool h3m) const; //h3m=true - returns position of hero object; h3m=false - returns position of hero 'manifestation'
int getSightDistance() const; //returns sight distance of this hero
void setPosition(int3 Pos, bool h3m); //as above, but sets position
bool canWalkOnSea() const;
int getCurrentLuck() const;
int getCurrentMorale() const;
virtual ~CGHeroInstance();
};
class CGTownInstance : public CGObjectInstance
{
public:
CTown * town;
std::string name; // name of town
CCreatureSet garrison;
int builded; //how many buildings has been built this turn
int destroyed; //how many buildings has been destroyed this turn
//TODO:
std::vector<CBuilding *> allBuildings, possibleBuildings, builtBuildings;
std::vector<int> creatureIncome; //vector by level
std::vector<int> creaturesLeft; //that can be recruited
CHero * garrisonHero;
std::vector<CSpell *> possibleSpells, obligatorySpells, availableSpells;
int getSightDistance() const; //returns sight distance
CGTownInstance();
virtual ~CGTownInstance();
};
class CObjectHandler class CObjectHandler
{ {
public: public:
std::vector<CObject> objects; //vector of objects; i-th object in vector has subnumber i std::vector<CObject> objects; //vector of objects; i-th object in vector has subnumber i
std::vector<CObjectInstance*> objInstances; //vector with objects on map std::vector<CGObjectInstance*> objInstances; //vector with objects on map
void loadObjects(); void loadObjects();
}; };

View File

@ -12,7 +12,7 @@ class CBuilding;
class CSpell; class CSpell;
class CHero; class CHero;
class CTownInstance; class CTownInstance;
class CGTownInstance;
class CTown class CTown
{ {
public: public:
@ -33,7 +33,7 @@ public:
SDL_Surface * getPic(int ID, bool fort=true, bool builded=false); //ID=-1 - blank; -2 - border; -3 - random SDL_Surface * getPic(int ID, bool fort=true, bool builded=false); //ID=-1 - blank; -2 - border; -3 - random
static int getTypeByDefName(std::string name); static int getTypeByDefName(std::string name);
std::vector<CTownInstance *> townInstances; std::vector<CGTownInstance *> townInstances;
}; };

4
map.h
View File

@ -6,7 +6,7 @@
#include "global.h" #include "global.h"
#include "hch\CSemiDefHandler.h" #include "hch\CSemiDefHandler.h"
#include "hch\CDefHandler.h" #include "hch\CDefHandler.h"
class CGDefInfo;
enum ESortBy{name,playerAm,size,format, viccon,loscon}; enum ESortBy{name,playerAm,size,format, viccon,loscon};
struct Sresource struct Sresource
{ {
@ -184,7 +184,7 @@ struct Mapa
TerrainTile** terrain; TerrainTile** terrain;
TerrainTile** undergroungTerrain; // used only if there is underground level TerrainTile** undergroungTerrain; // used only if there is underground level
std::vector<Rumor> rumors; std::vector<Rumor> rumors;
std::vector<DefInfo> defy; // list of .def files std::vector<CGDefInfo *> defy; // list of .def files
PlayerInfo players[8]; // info about players PlayerInfo players[8]; // info about players
std::vector<int> teams; // teams[i] = team of player no i std::vector<int> teams; // teams[i] = team of player no i
LossCondition lossCondition; LossCondition lossCondition;

View File

@ -14,7 +14,7 @@ extern SDL_Surface * ekran;
class OCM_HLP class OCM_HLP
{ {
public: public:
bool operator ()(const std::pair<CObjectInstance*,std::pair<SDL_Rect, std::vector<std::list<int3>>>> & a, const std::pair<CObjectInstance*,std::pair<SDL_Rect, std::vector<std::list<int3>>>> & b) bool operator ()(const std::pair<CGObjectInstance*,std::pair<SDL_Rect, std::vector<std::list<int3>>>> & a, const std::pair<CGObjectInstance*,std::pair<SDL_Rect, std::vector<std::list<int3>>>> & b)
{ {
return (*a.first)<(*b.first); return (*a.first)<(*b.first);
} }
@ -404,7 +404,7 @@ void CMapHandler::init()
{ {
/*CGI->objh->objInstances[f]->pos.x+=1; /*CGI->objh->objInstances[f]->pos.x+=1;
CGI->objh->objInstances[f]->pos.y+=1;*/ CGI->objh->objInstances[f]->pos.y+=1;*/
CDefHandler * curd = CGI->ac->map.defy[CGI->objh->objInstances[f]->defNumber].handler; CDefHandler * curd = CGI->objh->objInstances[f]->defInfo->handler;
for(int fx=0; fx<curd->ourImages[0].bitmap->w/32; ++fx) for(int fx=0; fx<curd->ourImages[0].bitmap->w/32; ++fx)
{ {
for(int fy=0; fy<curd->ourImages[0].bitmap->h/32; ++fy) for(int fy=0; fy<curd->ourImages[0].bitmap->h/32; ++fy)
@ -414,19 +414,19 @@ void CMapHandler::init()
cr.h = 32; cr.h = 32;
cr.x = fx*32; cr.x = fx*32;
cr.y = fy*32; cr.y = fy*32;
std::pair<CObjectInstance*,std::pair<SDL_Rect, std::vector<std::list<int3>>>> toAdd = std::make_pair(CGI->objh->objInstances[f], std::make_pair(cr, std::vector<std::list<int3>>())); std::pair<CGObjectInstance*,std::pair<SDL_Rect, std::vector<std::list<int3>>>> toAdd = std::make_pair(CGI->objh->objInstances[f], std::make_pair(cr, std::vector<std::list<int3>>()));
///initializing places that will be coloured by blitting (flag colour / player colour positions) ///initializing places that will be coloured by blitting (flag colour / player colour positions)
if(toAdd.first->defObjInfoNumber>=0 && CGI->dobjinfo->objs[toAdd.first->defObjInfoNumber].isVisitable()) if(toAdd.first->defObjInfoNumber>=0 && CGI->dobjinfo->objs[toAdd.first->defObjInfoNumber].isVisitable())
{ {
toAdd.second.second.resize(CGI->mh->reader->map.defy[toAdd.first->defNumber].handler->ourImages.size()); toAdd.second.second.resize(toAdd.first->defInfo->handler->ourImages.size());
for(int no = 0; no<CGI->mh->reader->map.defy[toAdd.first->defNumber].handler->ourImages.size(); ++no) for(int no = 0; no<toAdd.first->defInfo->handler->ourImages.size(); ++no)
{ {
bool breakNow = true; bool breakNow = true;
for(int dx=0; dx<32; ++dx) for(int dx=0; dx<32; ++dx)
{ {
for(int dy=0; dy<32; ++dy) for(int dy=0; dy<32; ++dy)
{ {
SDL_Surface * curs = CGI->mh->reader->map.defy[toAdd.first->defNumber].handler->ourImages[no].bitmap; SDL_Surface * curs = toAdd.first->defInfo->handler->ourImages[no].bitmap;
Uint32* point = (Uint32*)( (Uint8*)curs->pixels + curs->pitch * (fy*32+dy) + curs->format->BytesPerPixel*(fx*32+dx)); Uint32* point = (Uint32*)( (Uint8*)curs->pixels + curs->pitch * (fy*32+dy) + curs->format->BytesPerPixel*(fx*32+dx));
Uint8 r, g, b, a; Uint8 r, g, b, a;
SDL_GetRGBA(*point, curs->format, &r, &g, &b, &a); SDL_GetRGBA(*point, curs->format, &r, &g, &b, &a);
@ -460,7 +460,7 @@ void CMapHandler::init()
{ {
if(CGI->objh->objInstances[f]->defObjInfoNumber == -1) if(CGI->objh->objInstances[f]->defObjInfoNumber == -1)
continue; continue;
CDefHandler * curd = CGI->ac->map.defy[CGI->objh->objInstances[f]->defNumber].handler; CDefHandler * curd = CGI->objh->objInstances[f]->defInfo->handler;
for(int fx=0; fx<8; ++fx) for(int fx=0; fx<8; ++fx)
{ {
for(int fy=0; fy<6; ++fy) for(int fy=0; fy<6; ++fy)
@ -566,17 +566,18 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level,
sr.y = (by)*32; sr.y = (by)*32;
SDL_Rect pp = ttiles[x+bx][y+by][level].objects[h].second.first; SDL_Rect pp = ttiles[x+bx][y+by][level].objects[h].second.first;
if(ttiles[x+bx][y+by][level].objects[h].first->isHero && ttiles[x+bx][y+by][level].objects[h].first->moveDir && !ttiles[x+bx][y+by][level].objects[h].first->isStanding) CGHeroInstance * themp = (dynamic_cast<CGHeroInstance*>(ttiles[x+bx][y+by][level].objects[h].first));
if(themp && themp->moveDir && !themp->isStanding)
{ {
int imgVal = 8; int imgVal = 8;
SDL_Surface * tb; SDL_Surface * tb;
switch(ttiles[x+bx][y+by][level].objects[h].first->moveDir) switch(themp->moveDir)
{ {
case 1: case 1:
{ {
if(((CHeroObjInfo*)ttiles[x+bx][y+by][level].objects[h].first->info)->myInstance->type==NULL) if(((CHeroObjInfo*)themp->info)->myInstance->type==NULL)
continue; continue;
std::vector<Cimage> & iv = ((CHeroObjInfo*)ttiles[x+bx][y+by][level].objects[h].first->info)->myInstance->type->heroClass->moveAnim->ourImages; std::vector<Cimage> & iv = ((CHeroObjInfo*)themp->info)->myInstance->type->heroClass->moveAnim->ourImages;
int gg; int gg;
for(gg=0; gg<iv.size(); ++gg) for(gg=0; gg<iv.size(); ++gg)
{ {
@ -589,7 +590,7 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level,
SDL_BlitSurface(tb,&pp,su,&sr); SDL_BlitSurface(tb,&pp,su,&sr);
pp.y+=imgVal*2-32; pp.y+=imgVal*2-32;
sr.y-=16; sr.y-=16;
SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[gg+anim%imgVal+35].bitmap, &pp, su, &sr); SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->getOwner()]->ourImages[gg+anim%imgVal+35].bitmap, &pp, su, &sr);
break; break;
} }
case 2: case 2:
@ -609,7 +610,7 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level,
SDL_BlitSurface(tb,&pp,su,&sr); SDL_BlitSurface(tb,&pp,su,&sr);
pp.y+=imgVal*2-32; pp.y+=imgVal*2-32;
sr.y-=16; sr.y-=16;
SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[gg+anim%imgVal+35].bitmap, &pp, su, &sr); SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->getOwner()]->ourImages[gg+anim%imgVal+35].bitmap, &pp, su, &sr);
break; break;
} }
case 3: case 3:
@ -629,7 +630,7 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level,
SDL_BlitSurface(tb,&pp,su,&sr); SDL_BlitSurface(tb,&pp,su,&sr);
pp.y+=imgVal*2-32; pp.y+=imgVal*2-32;
sr.y-=16; sr.y-=16;
SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[gg+anim%imgVal+35].bitmap, &pp, su, &sr); SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->getOwner()]->ourImages[gg+anim%imgVal+35].bitmap, &pp, su, &sr);
break; break;
} }
case 4: case 4:
@ -649,7 +650,7 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level,
SDL_BlitSurface(tb,&pp,su,&sr); SDL_BlitSurface(tb,&pp,su,&sr);
pp.y+=imgVal*2-32; pp.y+=imgVal*2-32;
sr.y-=16; sr.y-=16;
SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[gg+anim%imgVal+35].bitmap, &pp, su, &sr); SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->getOwner()]->ourImages[gg+anim%imgVal+35].bitmap, &pp, su, &sr);
break; break;
} }
case 5: case 5:
@ -669,7 +670,7 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level,
SDL_BlitSurface(tb,&pp,su,&sr); SDL_BlitSurface(tb,&pp,su,&sr);
pp.y+=imgVal*2-32; pp.y+=imgVal*2-32;
sr.y-=16; sr.y-=16;
SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[gg+anim%imgVal+35].bitmap, &pp, su, &sr); SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->getOwner()]->ourImages[gg+anim%imgVal+35].bitmap, &pp, su, &sr);
break; break;
} }
case 6: //ok case 6: //ok
@ -689,7 +690,7 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level,
SDL_BlitSurface(tb,&pp,su,&sr); SDL_BlitSurface(tb,&pp,su,&sr);
pp.y+=imgVal*2-32; pp.y+=imgVal*2-32;
sr.y-=16; sr.y-=16;
SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[gg+anim%imgVal+35].bitmap, &pp, su, &sr); SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->getOwner()]->ourImages[gg+anim%imgVal+35].bitmap, &pp, su, &sr);
break; break;
} }
case 7: case 7:
@ -709,7 +710,7 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level,
SDL_BlitSurface(tb,&pp,su,&sr); SDL_BlitSurface(tb,&pp,su,&sr);
pp.y+=imgVal*2-32; pp.y+=imgVal*2-32;
sr.y-=16; sr.y-=16;
SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[gg+anim%imgVal+35].bitmap, &pp, su, &sr); SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->getOwner()]->ourImages[gg+anim%imgVal+35].bitmap, &pp, su, &sr);
break; break;
} }
case 8: case 8:
@ -729,16 +730,16 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level,
SDL_BlitSurface(tb,&pp,su,&sr); SDL_BlitSurface(tb,&pp,su,&sr);
pp.y+=imgVal*2-32; pp.y+=imgVal*2-32;
sr.y-=16; sr.y-=16;
SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[gg+anim%imgVal+35].bitmap, &pp, su, &sr); SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->getOwner()]->ourImages[gg+anim%imgVal+35].bitmap, &pp, su, &sr);
break; break;
} }
} }
} }
else if(ttiles[x+bx][y+by][level].objects[h].first->isHero && ttiles[x+bx][y+by][level].objects[h].first->moveDir && ttiles[x+bx][y+by][level].objects[h].first->isStanding) else if(themp && themp->moveDir && themp->isStanding)
{ {
int imgVal = 8; int imgVal = 8;
SDL_Surface * tb; SDL_Surface * tb;
switch(ttiles[x+bx][y+by][level].objects[h].first->moveDir) switch(themp->moveDir)
{ {
case 1: case 1:
{ {
@ -760,8 +761,8 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level,
SDL_Rect bufr = sr; SDL_Rect bufr = sr;
bufr.x-=2*32; bufr.x-=2*32;
bufr.y-=1*32; bufr.y-=1*32;
SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[13*8+anim%imgVal].bitmap, NULL, su, &bufr); SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->getOwner()]->ourImages[13*8+anim%imgVal].bitmap, NULL, su, &bufr);
ttiles[x+bx][y+by][level].objects[h].first->flagPrinted = true; themp->flagPrinted = true;
} }
break; break;
} }
@ -785,8 +786,8 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level,
SDL_Rect bufr = sr; SDL_Rect bufr = sr;
bufr.x-=2*32; bufr.x-=2*32;
bufr.y-=1*32; bufr.y-=1*32;
SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[anim%imgVal].bitmap, NULL, su, &bufr); SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->getOwner()]->ourImages[anim%imgVal].bitmap, NULL, su, &bufr);
ttiles[x+bx][y+by][level].objects[h].first->flagPrinted = true; themp->flagPrinted = true;
} }
break; break;
} }
@ -810,8 +811,8 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level,
SDL_Rect bufr = sr; SDL_Rect bufr = sr;
bufr.x-=2*32; bufr.x-=2*32;
bufr.y-=1*32; bufr.y-=1*32;
SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[8+anim%imgVal].bitmap, NULL, su, &bufr); SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->getOwner()]->ourImages[8+anim%imgVal].bitmap, NULL, su, &bufr);
ttiles[x+bx][y+by][level].objects[h].first->flagPrinted = true; themp->flagPrinted = true;
} }
break; break;
} }
@ -835,8 +836,8 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level,
SDL_Rect bufr = sr; SDL_Rect bufr = sr;
bufr.x-=2*32; bufr.x-=2*32;
bufr.y-=1*32; bufr.y-=1*32;
SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[2*8+anim%imgVal].bitmap, NULL, su, &bufr); SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->getOwner()]->ourImages[2*8+anim%imgVal].bitmap, NULL, su, &bufr);
ttiles[x+bx][y+by][level].objects[h].first->flagPrinted = true; themp->flagPrinted = true;
} }
break; break;
} }
@ -860,8 +861,8 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level,
SDL_Rect bufr = sr; SDL_Rect bufr = sr;
bufr.x-=2*32; bufr.x-=2*32;
bufr.y-=1*32; bufr.y-=1*32;
SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[3*8+anim%imgVal].bitmap, NULL, su, &bufr); SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->getOwner()]->ourImages[3*8+anim%imgVal].bitmap, NULL, su, &bufr);
ttiles[x+bx][y+by][level].objects[h].first->flagPrinted = true; themp->flagPrinted = true;
} }
break; break;
} }
@ -885,8 +886,8 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level,
SDL_Rect bufr = sr; SDL_Rect bufr = sr;
bufr.x-=2*32; bufr.x-=2*32;
bufr.y-=1*32; bufr.y-=1*32;
SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[4*8+anim%imgVal].bitmap, NULL, su, &bufr); SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->getOwner()]->ourImages[4*8+anim%imgVal].bitmap, NULL, su, &bufr);
ttiles[x+bx][y+by][level].objects[h].first->flagPrinted = true; themp->flagPrinted = true;
} }
break; break;
} }
@ -910,8 +911,8 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level,
SDL_Rect bufr = sr; SDL_Rect bufr = sr;
bufr.x-=2*32; bufr.x-=2*32;
bufr.y-=1*32; bufr.y-=1*32;
SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[15*8+anim%imgVal].bitmap, NULL, su, &bufr); SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->getOwner()]->ourImages[15*8+anim%imgVal].bitmap, NULL, su, &bufr);
ttiles[x+bx][y+by][level].objects[h].first->flagPrinted = true; themp->flagPrinted = true;
} }
break; break;
} }
@ -935,8 +936,8 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level,
SDL_Rect bufr = sr; SDL_Rect bufr = sr;
bufr.x-=2*32; bufr.x-=2*32;
bufr.y-=1*32; bufr.y-=1*32;
SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->owner]->ourImages[14*8+anim%imgVal].bitmap, NULL, su, &bufr); SDL_BlitSurface(CGI->heroh->flags4[ttiles[x+bx][y+by][level].objects[h].first->getOwner()]->ourImages[14*8+anim%imgVal].bitmap, NULL, su, &bufr);
ttiles[x+bx][y+by][level].objects[h].first->flagPrinted = true; themp->flagPrinted = true;
} }
break; break;
} }
@ -944,8 +945,8 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level,
} }
else else
{ {
int imgVal = CGI->ac->map.defy[ttiles[x+bx][y+by][level].objects[h].first->defNumber].handler->ourImages.size(); int imgVal = ttiles[x+bx][y+by][level].objects[h].first->defInfo->handler->ourImages.size();
SDL_BlitSurface(CGI->ac->map.defy[ttiles[x+bx][y+by][level].objects[h].first->defNumber].handler->ourImages[anim%imgVal].bitmap,&pp,su,&sr); SDL_BlitSurface(ttiles[x+bx][y+by][level].objects[h].first->defInfo->handler->ourImages[anim%imgVal].bitmap,&pp,su,&sr);
} }
//printing appropriate flag colour //printing appropriate flag colour
if(ttiles[x+bx][y+by][level].objects[h].second.second.size()) if(ttiles[x+bx][y+by][level].objects[h].second.second.size())
@ -954,10 +955,10 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level,
for(std::list<int3>::iterator g=curl.begin(); g!=curl.end(); ++g) for(std::list<int3>::iterator g=curl.begin(); g!=curl.end(); ++g)
{ {
SDL_Color ourC; SDL_Color ourC;
int own = ttiles[x+bx][y+by][level].objects[h].first->owner; int own = ttiles[x+bx][y+by][level].objects[h].first->getOwner();
if(ttiles[x+bx][y+by][level].objects[h].first->owner!=255 && ttiles[x+bx][y+by][level].objects[h].first->owner!=254) if(ttiles[x+bx][y+by][level].objects[h].first->getOwner()!=255 && ttiles[x+bx][y+by][level].objects[h].first->getOwner()!=254)
ourC = CGI->playerColors[ttiles[x+bx][y+by][level].objects[h].first->owner]; ourC = CGI->playerColors[ttiles[x+bx][y+by][level].objects[h].first->getOwner()];
else if(ttiles[x+bx][y+by][level].objects[h].first->owner==255) else if(ttiles[x+bx][y+by][level].objects[h].first->getOwner()==255)
ourC = CGI->neutralColor; ourC = CGI->neutralColor;
else continue; else continue;
CSDL_Ext::SDL_PutPixelWithoutRefresh(su, bx*32 + g->x%32 , by*32 + g->y%32, ourC.r , ourC.g, ourC.b, 0); CSDL_Ext::SDL_PutPixelWithoutRefresh(su, bx*32 + g->x%32 , by*32 + g->y%32, ourC.r , ourC.g, ourC.b, 0);
@ -971,7 +972,7 @@ SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level,
for(int qq=0; qq<CGI->heroh->heroInstances.size(); ++qq) for(int qq=0; qq<CGI->heroh->heroInstances.size(); ++qq)
{ {
CGI->heroh->heroInstances[qq]->ourObject->flagPrinted = false; //CGI->heroh->heroInstances[qq]->ourObject->flagPrinted = false;
} }
///flags enabled ///flags enabled
@ -1341,7 +1342,7 @@ SDL_Surface * CMapHandler::getVisBitmap(int x, int y, PseudoV< PseudoV< PseudoV<
// return undVisibility[x+Woff][y+Hoff]; // return undVisibility[x+Woff][y+Hoff];
//} //}
int CMapHandler::getCost(int3 &a, int3 &b, const CHeroInstance *hero) int CMapHandler::getCost(int3 &a, int3 &b, const CGHeroInstance *hero)
{ {
int ret = hero->type->heroClass->terrCosts[CGI->mh->ttiles[a.x][a.y][a.z].malle]; int ret = hero->type->heroClass->terrCosts[CGI->mh->ttiles[a.x][a.y][a.z].malle];
if(!(a.x==b.x || a.y==b.y)) if(!(a.x==b.x || a.y==b.y))
@ -1353,7 +1354,7 @@ int CMapHandler::getCost(int3 &a, int3 &b, const CHeroInstance *hero)
std::vector < std::string > CMapHandler::getObjDescriptions(int3 pos) std::vector < std::string > CMapHandler::getObjDescriptions(int3 pos)
{ {
std::vector < std::pair<CObjectInstance*,std::pair<SDL_Rect, std::vector<std::list<int3>>>> > objs = ttiles[pos.x][pos.y][pos.z].objects; std::vector < std::pair<CGObjectInstance*,std::pair<SDL_Rect, std::vector<std::list<int3>>>> > objs = ttiles[pos.x][pos.y][pos.z].objects;
std::vector<std::string> ret; std::vector<std::string> ret;
for(int g=0; g<objs.size(); ++g) for(int g=0; g<objs.size(); ++g)
{ {
@ -1362,19 +1363,21 @@ std::vector < std::string > CMapHandler::getObjDescriptions(int3 pos)
) //checking position blocking ) //checking position blocking
{ {
unsigned char * blm = CGI->dobjinfo->objs[objs[g].first->defObjInfoNumber].blockMap; unsigned char * blm = CGI->dobjinfo->objs[objs[g].first->defObjInfoNumber].blockMap;
ret.push_back(CGI->objh->objects[CGI->ac->map.defy[objs[g].first->defNumber].bytes[16]].name); ret.push_back(
CGI->objh->objects[objs[g].first->defInfo->bytes[16]].name
);
} }
} }
return ret; return ret;
} }
std::vector < CObjectInstance * > CMapHandler::getVisitableObjs(int3 pos) std::vector < CGObjectInstance * > CMapHandler::getVisitableObjs(int3 pos)
{ {
std::vector < CObjectInstance * > ret; std::vector < CGObjectInstance * > ret;
for(int h=0; h<ttiles[pos.x][pos.y][pos.z].objects.size(); ++h) for(int h=0; h<ttiles[pos.x][pos.y][pos.z].objects.size(); ++h)
{ {
CObjectInstance * curi = ttiles[pos.x][pos.y][pos.z].objects[h].first; CGObjectInstance * curi = ttiles[pos.x][pos.y][pos.z].objects[h].first;
if(curi->visitableAt(curi->pos.x - pos.x, curi->pos.y - pos.y)) if(curi->visitableAt(- curi->pos.x + pos.x + curi->getWidth() - 1, -curi->pos.y + pos.y + curi->getHeight() - 1))
ret.push_back(curi); ret.push_back(curi);
} }
return ret; return ret;

View File

@ -29,8 +29,8 @@ struct TerrainTile2
bool visitable; //false = not visitable; true = visitable bool visitable; //false = not visitable; true = visitable
bool blocked; //false = free; true = blocked; bool blocked; //false = free; true = blocked;
std::vector < std::pair<CObjectInstance*,std::pair<SDL_Rect, std::vector<std::list<int3>>>> > objects; //poiters to objects being on this tile with rects to be easier to blit this tile on screen std::vector < std::pair<CGObjectInstance*,std::pair<SDL_Rect, std::vector<std::list<int3>>>> > objects; //poiters to objects being on this tile with rects to be easier to blit this tile on screen
std::vector <CObjectInstance*> visitableObjects; //pointers to objects hero is visiting being on this tile std::vector <CGObjectInstance*> visitableObjects; //pointers to objects hero is visiting being on this tile
}; };
@ -77,9 +77,9 @@ public:
SDL_Surface mirrorImage(SDL_Surface *src); //what is this?? SDL_Surface mirrorImage(SDL_Surface *src); //what is this??
SDL_Surface * getVisBitmap(int x, int y, PseudoV< PseudoV< PseudoV<unsigned char> > > & visibilityMap, int lvl); SDL_Surface * getVisBitmap(int x, int y, PseudoV< PseudoV< PseudoV<unsigned char> > > & visibilityMap, int lvl);
int getCost(int3 & a, int3 & b, const CHeroInstance * hero); int getCost(int3 & a, int3 & b, const CGHeroInstance * hero);
std::vector< std::string > getObjDescriptions(int3 pos); //returns desriptions of objects blocking given position std::vector< std::string > getObjDescriptions(int3 pos); //returns desriptions of objects blocking given position
std::vector< CObjectInstance * > getVisitableObjs(int3 pos); //returns vector of visitable objects at certain position std::vector< CGObjectInstance * > getVisitableObjs(int3 pos); //returns vector of visitable objects at certain position
void init(); void init();
SDL_Surface * terrainRect(int x, int y, int dx, int dy, int level=0, unsigned char anim=0, PseudoV< PseudoV< PseudoV<unsigned char> > > & visibilityMap = CGI->mh->visibility); SDL_Surface * terrainRect(int x, int y, int dx, int dy, int level=0, unsigned char anim=0, PseudoV< PseudoV< PseudoV<unsigned char> > > & visibilityMap = CGI->mh->visibility);
SDL_Surface * terrBitmap(int x, int y); SDL_Surface * terrBitmap(int x, int y);