mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-28 23:06:24 +02:00
* fixed initialization of map of players
* functions in callback for getting info about towns * added info about towns to CGameState * minor changes
This commit is contained in:
parent
b0e72f334e
commit
6d0bcef157
@ -3,8 +3,13 @@
|
||||
#include "hch\CLodHandler.h"
|
||||
#include "hch\CPreGameTextHandler.h"
|
||||
#include "hch\CGeneralTextHandler.h"
|
||||
#include "hch\CTownHandler.h"
|
||||
#include "CPathfinder.h"
|
||||
#include "CGameInfo.h"
|
||||
#include "SDL_Extensions.h"
|
||||
#include "CCallback.h"
|
||||
#include <boost/assign/std/vector.hpp>
|
||||
#include "mapHandler.h"
|
||||
extern TTF_Font * TNRB16, *TNR, *GEOR13, *GEORXX; //fonts
|
||||
|
||||
using namespace boost::logic;
|
||||
@ -281,7 +286,8 @@ void CHeroList::keyPressed (SDL_KeyboardEvent & key)
|
||||
{
|
||||
}
|
||||
void CHeroList::draw()
|
||||
{ for (int iT=0+from;iT<5+from;iT++)
|
||||
{
|
||||
for (int iT=0+from;iT<5+from;iT++)
|
||||
{
|
||||
int i = iT-from;
|
||||
if (iT>=items.size())
|
||||
@ -322,9 +328,24 @@ CTownList::CTownList()
|
||||
pos = genRect(192,48,747,196);
|
||||
arrup = CGI->spriteh->giveDef("IAM014.DEF");
|
||||
arrdo = CGI->spriteh->giveDef("IAM015.DEF");
|
||||
|
||||
arrupp.x=747;
|
||||
arrupp.y=196;
|
||||
arrdop.x=747;
|
||||
arrdop.y=372;
|
||||
posporx = 747;
|
||||
pospory = 211;
|
||||
|
||||
from = 0;
|
||||
|
||||
}
|
||||
void CTownList::genList()
|
||||
{
|
||||
int howMany = LOCPLINT->cb->howManyTowns();
|
||||
for (int i=0;i<howMany;i++)
|
||||
{
|
||||
items.push_back(LOCPLINT->cb->getTownInfo(i,0));
|
||||
}
|
||||
}
|
||||
void CTownList::select(int which)
|
||||
{
|
||||
@ -345,7 +366,33 @@ void CTownList::keyPressed (SDL_KeyboardEvent & key)
|
||||
{
|
||||
}
|
||||
void CTownList::draw()
|
||||
{
|
||||
{
|
||||
for (int iT=0+from;iT<5+from;iT++)
|
||||
{
|
||||
int i = iT-from;
|
||||
if (iT>=items.size())
|
||||
{
|
||||
blitAtWR(CGI->townh->getPic(-1),posporx,pospory+i*32);
|
||||
continue;
|
||||
}
|
||||
|
||||
blitAtWR(CGI->townh->getPic(items[i]->type),posporx,pospory+i*32);
|
||||
|
||||
if (selected == iT)
|
||||
{
|
||||
blitAtWR(CGI->townh->getPic(-2),posporx,pospory+i*32);
|
||||
}
|
||||
//TODO: dodac oznaczanie zbudowania w danej turze i posiadania fortu
|
||||
}
|
||||
if (from>0)
|
||||
blitAtWR(arrup->ourImages[0].bitmap,arrupp.x,arrupp.y);
|
||||
else
|
||||
blitAtWR(arrup->ourImages[2].bitmap,arrupp.x,arrupp.y);
|
||||
|
||||
if (items.size()-from>5)
|
||||
blitAtWR(arrdo->ourImages[0].bitmap,arrdop.x,arrdop.y);
|
||||
else
|
||||
blitAtWR(arrdo->ourImages[2].bitmap,arrdop.x,arrdop.y);
|
||||
}
|
||||
CStatusBar::CStatusBar(int x, int y)
|
||||
{
|
||||
@ -758,7 +805,10 @@ CResDataBar::CResDataBar()
|
||||
pos = genRect(bg->h,bg->w,3,575);
|
||||
|
||||
txtpos += (std::pair<int,int>(35,577)),(std::pair<int,int>(120,577)),(std::pair<int,int>(205,577)),
|
||||
(std::pair<int,int>(290,577)),(std::pair<int,int>(375,577)),(std::pair<int,int>(460,577)),(std::pair<int,int>(545,577));
|
||||
(std::pair<int,int>(290,577)),(std::pair<int,int>(375,577)),(std::pair<int,int>(460,577)),
|
||||
(std::pair<int,int>(545,577)),(std::pair<int,int>(620,577));
|
||||
datetext = CGI->generaltexth->allTexts[62]+": %s, " + CGI->generaltexth->allTexts[63] + ": %s, " +
|
||||
CGI->generaltexth->allTexts[64] + ": %s";
|
||||
|
||||
}
|
||||
CResDataBar::~CResDataBar()
|
||||
@ -774,8 +824,14 @@ void CResDataBar::draw()
|
||||
itoa(LOCPLINT->cb->getResourceAmount(i),buf,10);
|
||||
printAt(buf,txtpos[i].first,txtpos[i].second,GEOR13,zwykly);
|
||||
}
|
||||
delete buf;
|
||||
std::vector<std::string> temp;
|
||||
itoa(LOCPLINT->cb->getDate(3),buf,10); temp+=std::string(buf);
|
||||
itoa(LOCPLINT->cb->getDate(2),buf,10); temp+=std::string(buf);
|
||||
itoa(LOCPLINT->cb->getDate(1),buf,10); temp+=std::string(buf);
|
||||
printAt(processStr(datetext,temp),txtpos[7].first,txtpos[7].second,GEOR13,zwykly);
|
||||
temp.clear();
|
||||
updateRect(&pos,ekran);
|
||||
delete buf;
|
||||
}
|
||||
|
||||
CAdvMapInt::CAdvMapInt(int Player)
|
||||
@ -824,6 +880,8 @@ endTurn(CGI->preth->advEndTurn.first,CGI->preth->advEndTurn.second,
|
||||
|
||||
heroList.init();
|
||||
heroList.genList();
|
||||
//townList.init();
|
||||
townList.genList();
|
||||
|
||||
gems.push_back(CGI->spriteh->giveDef("agemLL.def"));
|
||||
gems.push_back(CGI->spriteh->giveDef("agemLR.def"));
|
||||
@ -907,6 +965,8 @@ void CAdvMapInt::show()
|
||||
minimap.draw();
|
||||
heroList.activate();
|
||||
heroList.draw();
|
||||
townList.activate();
|
||||
townList.draw();
|
||||
|
||||
resdatabar.draw();
|
||||
|
||||
|
@ -1,18 +1,16 @@
|
||||
#ifndef CADVENTUREMAPINTERFACE_H
|
||||
#define CADVENTUREMAPINTERFACE_H
|
||||
#include <typeinfo>
|
||||
#include "SDL.h"
|
||||
#include "hch\CDefHandler.h"
|
||||
#include "SDL_Extensions.h"
|
||||
#include "CGameInterface.h"
|
||||
#include "CGameInfo.h"
|
||||
#include "SDL_Extensions.h"
|
||||
#include <boost/logic/tribool.hpp>
|
||||
#include "global.h"
|
||||
#include "CPathfinder.h"
|
||||
#include "mapHandler.h"
|
||||
#include "SDL.h"
|
||||
#include "CGameInterface.h"
|
||||
#include <boost/logic/tribool.hpp>
|
||||
#include <map>
|
||||
|
||||
class CDefHandler;
|
||||
class CCallback;
|
||||
class CTownInstance;
|
||||
class CPath;
|
||||
|
||||
class AdventureMapButton
|
||||
: public ClickableL, public ClickableR, public Hoverable, public KeyInterested, public CButtonBase
|
||||
@ -81,6 +79,8 @@ class CTownList
|
||||
: public CList
|
||||
{
|
||||
public:
|
||||
std::vector<const CTownInstance*> items;
|
||||
int posporx,pospory;
|
||||
|
||||
CTownList();
|
||||
void genList();
|
||||
@ -165,6 +165,7 @@ class CResDataBar
|
||||
public:
|
||||
SDL_Surface * bg;
|
||||
std::vector<std::pair<int,int> > txtpos;
|
||||
std::string datetext;
|
||||
|
||||
void clickRight (tribool down);
|
||||
void activate();
|
||||
|
@ -2,6 +2,7 @@
|
||||
#include "CCallback.h"
|
||||
#include "CPathfinder.h"
|
||||
#include "hch\CHeroHandler.h"
|
||||
#include "hch\CTownHandler.h"
|
||||
#include "CGameInfo.h"
|
||||
#include "hch\CAmbarCendamo.h"
|
||||
#include "mapHandler.h"
|
||||
@ -51,6 +52,28 @@ bool CCallback::moveHero(int ID, int3 destPoint)
|
||||
}
|
||||
|
||||
|
||||
int CCallback::howManyTowns()
|
||||
{
|
||||
return gs->players[gs->currentPlayer].towns.size();
|
||||
}
|
||||
const CTownInstance * CCallback::getTownInfo(int val, bool mode) //mode = 0 -> val = serial; mode = 1 -> val = ID
|
||||
{
|
||||
if (!mode)
|
||||
return gs->players[gs->currentPlayer].towns[val];
|
||||
else
|
||||
{
|
||||
//TODO: add some smart ID to the CTownInstance
|
||||
|
||||
|
||||
//for (int i=0; i<gs->players[gs->currentPlayer].towns.size();i++)
|
||||
//{
|
||||
// if (gs->players[gs->currentPlayer].towns[i]->someID==val)
|
||||
// return gs->players[gs->currentPlayer].towns[i];
|
||||
//}
|
||||
return NULL;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
int CCallback::howManyHeroes(int player)
|
||||
{
|
||||
if (gs->currentPlayer!=player) //TODO: checking if we are allowed to give that info
|
||||
@ -73,7 +96,30 @@ const CHeroInstance * CCallback::getHeroInfo(int player, int val, bool mode) //m
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int CCallback::getResourceAmount(int type)
|
||||
{
|
||||
return gs->players[gs->currentPlayer].resources[type];
|
||||
}
|
||||
|
||||
int CCallback::getDate(int mode)
|
||||
{
|
||||
int temp;
|
||||
switch (mode)
|
||||
{
|
||||
case 0:
|
||||
return gs->day;
|
||||
case 1:
|
||||
temp = (gs->day)%7;
|
||||
if (temp)
|
||||
return temp;
|
||||
else return 7;
|
||||
case 2:
|
||||
temp = ((gs->day-1)/7)+1;
|
||||
if (temp%4)
|
||||
return temp;
|
||||
else return 4;
|
||||
case 3:
|
||||
return ((gs->day-1)/28)+1;
|
||||
}
|
||||
}
|
@ -2,6 +2,7 @@
|
||||
#define CCALLBACK_H
|
||||
class CGameState;
|
||||
class CHeroInstance;
|
||||
class CTownInstance;
|
||||
struct HeroMoveDetails
|
||||
{
|
||||
int3 src, dst; //source and destination points
|
||||
@ -20,9 +21,13 @@ public:
|
||||
CCallback(CGameState * GS):gs(GS){};
|
||||
bool moveHero(int ID, int3 destPoint);
|
||||
|
||||
int howManyTowns();
|
||||
const CTownInstance * getTownInfo(int val, bool mode); //mode = 0 -> val = serial; mode = 1 -> val = ID
|
||||
|
||||
int howManyHeroes(int player);
|
||||
const CHeroInstance * getHeroInfo(int player, int val, bool mode); //mode = 0 -> val = serial; mode = 1 -> val = ID
|
||||
int getResourceAmount(int type);
|
||||
int getDate(int mode=0); //mode=0 - total days in game, mode=1 - day of week, mode=2 - current week, mode=3 - current month
|
||||
};
|
||||
|
||||
#endif //CCALLBACK_H
|
@ -7,6 +7,8 @@
|
||||
#include "global.h"
|
||||
#include "CGameState.h"
|
||||
#include "CCallback.h"
|
||||
#include "CPathfinder.h"
|
||||
#include "mapHandler.h"
|
||||
#include <sstream>
|
||||
|
||||
int internalFunc(void * nothingUsed)
|
||||
|
@ -2,11 +2,13 @@
|
||||
#include "CGameInterface.h"
|
||||
#include "CAdvMapInterface.h"
|
||||
#include "CMessage.h"
|
||||
#include "mapHandler.h"
|
||||
#include "SDL_Extensions.h"
|
||||
#include "SDL_framerate.h"
|
||||
#include "CScreenHandler.h"
|
||||
#include "CCursorHandler.h"
|
||||
#include "CCallback.h"
|
||||
#include "SDL_Extensions.h"
|
||||
using namespace CSDL_Ext;
|
||||
class OCM_HLP_CGIN
|
||||
{
|
||||
@ -730,6 +732,7 @@ void CPlayerInterface::heroMoved(const HeroMoveDetails & details)
|
||||
delObjRect(hp.x, hp.y, hp.z, ho->id);
|
||||
}
|
||||
CGI->heroh->heroInstances[details.heroID]->pos = details.dst; //actualizing hero position
|
||||
CGI->heroh->heroInstances[details.heroID]->ourObject->pos = details.dst; //copy of hero's position
|
||||
ho->moveDir = 0; //move ended
|
||||
//move finished
|
||||
}
|
||||
|
@ -2,16 +2,19 @@
|
||||
#define CGAMEINTERFACE_H
|
||||
|
||||
#include "SDL.h"
|
||||
#include "hch\CDefHandler.h"
|
||||
#include "SDL_Extensions.h"
|
||||
#include <boost/logic/tribool.hpp>
|
||||
#include "SDL_framerate.h"
|
||||
|
||||
BOOST_TRIBOOL_THIRD_STATE(outOfRange)
|
||||
|
||||
using namespace boost::logic;
|
||||
|
||||
class CAdvMapInt;
|
||||
class CCallback;
|
||||
class CHeroInstance;
|
||||
class CDefHandler;
|
||||
struct HeroMoveDetails;
|
||||
|
||||
class CIntObject //interface object
|
||||
{
|
||||
public:
|
||||
|
@ -13,17 +13,19 @@ public:
|
||||
std::vector<int> resources;
|
||||
std::vector<CHeroInstance *> heroes;
|
||||
std::vector<CTownInstance *> towns;
|
||||
PlayerState():color(-1){};
|
||||
};
|
||||
|
||||
class CGameState
|
||||
{
|
||||
int currentPlayer;
|
||||
|
||||
int day; //total number of days in game
|
||||
std::map<int,PlayerState> players; //color <-> playerstate
|
||||
public:
|
||||
friend CCallback;
|
||||
friend int _tmain(int argc, _TCHAR* argv[]);
|
||||
friend void initGameState(CGameInfo * cgi);
|
||||
friend void CAmbarCendamo::deh3m();
|
||||
CCallback * cb; //for communication between PlayerInterface/AI and GameState
|
||||
};
|
||||
|
||||
|
81
CMT.cpp
81
CMT.cpp
@ -55,12 +55,6 @@
|
||||
#define CHUNK 16384
|
||||
const char * NAME = "VCMI 0.3 \"Tol Galen\"";
|
||||
|
||||
/* Compress from file source to file dest until EOF on source.
|
||||
def() returns Z_OK on success, Z_MEM_ERROR if memory could not be
|
||||
allocated for processing, Z_STREAM_ERROR if an invalid compression
|
||||
level is supplied, Z_VERSION_ERROR if the version of zlib.h and the
|
||||
version of the library linked do not match, or Z_ERRNO if there is
|
||||
an error reading or writing the files. */
|
||||
SDL_Surface * ekran, * screen, * screen2;
|
||||
TTF_Font * TNRB16, *TNR, *GEOR13, *GEORXX, *GEORM;
|
||||
|
||||
@ -85,10 +79,43 @@ TTF_Font * TNRB16, *TNR, *GEOR13, *GEORXX, *GEORM;
|
||||
|
||||
void initGameState(CGameInfo * cgi)
|
||||
{
|
||||
cgi->state->day=1;
|
||||
/*********creating players entries in gs****************************************/
|
||||
for (int i=0; i<cgi->scenarioOps.playerInfos.size();i++)
|
||||
{
|
||||
std::pair<int,PlayerState> ins(cgi->scenarioOps.playerInfos[i].color,PlayerState());
|
||||
cgi->state->players.insert(ins);
|
||||
}
|
||||
/******************RESOURCES****************************************************/
|
||||
//TODO: zeby komputer dostawal inaczej niz gracz
|
||||
std::vector<int> startres;
|
||||
std::ifstream tis("config/startres.txt");
|
||||
int k;
|
||||
for (int j=0;j<cgi->scenarioOps.difficulty;j++)
|
||||
{
|
||||
tis >> k;
|
||||
for (int z=0;z<RESOURCE_QUANTITY;z++)
|
||||
tis>>k;
|
||||
}
|
||||
tis >> k;
|
||||
for (int i=0;i<RESOURCE_QUANTITY;i++)
|
||||
{
|
||||
tis >> k;
|
||||
startres.push_back(k);
|
||||
}
|
||||
tis.close();
|
||||
for (std::map<int,PlayerState>::iterator i = cgi->state->players.begin(); i!=cgi->state->players.end(); i++)
|
||||
{
|
||||
(*i).second.resources.resize(RESOURCE_QUANTITY);
|
||||
for (int x=0;x<RESOURCE_QUANTITY;x++)
|
||||
(*i).second.resources[x] = startres[x];
|
||||
|
||||
}
|
||||
|
||||
/*************************HEROES************************************************/
|
||||
for (int i=0; i<cgi->heroh->heroInstances.size();i++) //heroes instances
|
||||
{
|
||||
if (!cgi->heroh->heroInstances[i]->type || cgi->heroh->heroInstances[i]->owner<0 || cgi->heroh->heroInstances[i]->owner==255)
|
||||
if (!cgi->heroh->heroInstances[i]->type || cgi->heroh->heroInstances[i]->owner<0)
|
||||
continue;
|
||||
CHeroInstance * vhi = new CHeroInstance();
|
||||
*vhi=*(cgi->heroh->heroInstances[i]);
|
||||
@ -121,31 +148,6 @@ void initGameState(CGameInfo * cgi)
|
||||
|
||||
cgi->state->players[vhi->owner].heroes.push_back(vhi);
|
||||
|
||||
}
|
||||
/******************RESOURCES****************************************************/
|
||||
//TODO: zeby komputer dostawal inaczej niz gracz
|
||||
std::vector<int> startres;
|
||||
std::ifstream tis("config/startres.txt");
|
||||
int k;
|
||||
for (int j=0;j<cgi->scenarioOps.difficulty;j++)
|
||||
{
|
||||
tis >> k;
|
||||
for (int z=0;z<RESOURCE_QUANTITY;z++)
|
||||
tis>>k;
|
||||
}
|
||||
tis >> k;
|
||||
for (int i=0;i<RESOURCE_QUANTITY;i++)
|
||||
{
|
||||
tis >> k;
|
||||
startres.push_back(k);
|
||||
}
|
||||
tis.close();
|
||||
for (std::map<int,PlayerState>::iterator i = cgi->state->players.begin(); i!=cgi->state->players.end(); i++)
|
||||
{
|
||||
(*i).second.resources.resize(RESOURCE_QUANTITY);
|
||||
for (int x=0;x<RESOURCE_QUANTITY;x++)
|
||||
(*i).second.resources[x] = startres[x];
|
||||
|
||||
}
|
||||
/*************************FOG**OF**WAR******************************************/
|
||||
for(std::map<int, PlayerState>::iterator k=cgi->state->players.begin(); k!=cgi->state->players.end(); ++k)
|
||||
@ -164,7 +166,14 @@ void initGameState(CGameInfo * cgi)
|
||||
k->second.fogOfWarMap[g][h][v] = 1;
|
||||
}
|
||||
/****************************TOWNS************************************************/
|
||||
for (int i=0;i<cgi->townh->townInstances.size();i++)
|
||||
{
|
||||
CTownInstance * vti = new CTownInstance();
|
||||
(*vti)=*(cgi->townh->townInstances[i]);
|
||||
|
||||
|
||||
cgi->state->players[vti->owner].towns.push_back(vti);
|
||||
}
|
||||
}
|
||||
|
||||
int _tmain(int argc, _TCHAR* argv[])
|
||||
@ -228,13 +237,9 @@ int _tmain(int argc, _TCHAR* argv[])
|
||||
GEORXX = TTF_OpenFont("Fonts\\tnrb.ttf",22);
|
||||
GEORM = TTF_OpenFont("Fonts\\georgia.ttf",10);
|
||||
|
||||
//initializing audio
|
||||
CMusicHandler * mush = new CMusicHandler;
|
||||
CMusicHandler * mush = new CMusicHandler; //initializing audio
|
||||
mush->initMusics();
|
||||
//CSndHandler snd("Heroes3.snd");
|
||||
//snd.extract("AELMMOVE.wav","snddd.wav");
|
||||
//audio initialized
|
||||
|
||||
/*if(Mix_PlayMusic(mush->mainMenuWoG, -1)==-1) //uncomment this fragment to have music
|
||||
{
|
||||
printf("Mix_PlayMusic: %s\n", Mix_GetError());
|
||||
@ -287,8 +292,6 @@ int _tmain(int argc, _TCHAR* argv[])
|
||||
cgi->playerColors.push_back(p);//pink
|
||||
p.r = 0x84; p.g = 0x84; p.b = 0x84;//gray
|
||||
cgi->neutralColor = p;//gray
|
||||
|
||||
cgi->playerColorInfo.push_back(cgi->spriteh->giveDef("agemLL.def")); //todo: finish
|
||||
//colors initialized
|
||||
|
||||
cgi->townh = new CTownHandler;
|
||||
|
BIN
CPreGame.cpp
BIN
CPreGame.cpp
Binary file not shown.
@ -1503,6 +1503,7 @@ void CAmbarCendamo::deh3m()
|
||||
nobj->info = spec;
|
||||
//////////// rewriting info to CTownInstance class /////////////////////
|
||||
CTownInstance * nt = new CTownInstance;
|
||||
nt->owner = spec->player;
|
||||
nt->type = CTownHandler::getTypeByDefName(map.defy[nobj->defNumber].name);
|
||||
nt->builded = 0;
|
||||
nt->destroyed = 0;
|
||||
@ -1512,7 +1513,7 @@ void CAmbarCendamo::deh3m()
|
||||
nt->pos = int3(spec->x, spec->y, spec->z);
|
||||
nt->possibleSpells = spec->possibleSpells;
|
||||
nt->obligatorySpells = spec->obligatorySpells;
|
||||
CGI->state->players[spec->player].towns.push_back(nt);
|
||||
CGI->townh->townInstances.push_back(nt);
|
||||
break;
|
||||
}
|
||||
case EDefType::PLAYERONLY_DEF:
|
||||
|
@ -11,6 +11,7 @@
|
||||
class CBuilding;
|
||||
class CSpell;
|
||||
class CHero;
|
||||
class CTownInstance;
|
||||
|
||||
class CTown
|
||||
{
|
||||
@ -30,6 +31,9 @@ public:
|
||||
void loadNames();
|
||||
SDL_Surface * getPic(int ID, bool fort=true, bool builded=false); //ID=-1 - blank; -2 - border; -3 - random
|
||||
static int getTypeByDefName(std::string name);
|
||||
|
||||
std::vector<CTownInstance *> townInstances;
|
||||
|
||||
};
|
||||
|
||||
class CTownInstance
|
||||
|
Loading…
Reference in New Issue
Block a user