1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-07-17 01:32:21 +02:00

Working windmill, water wheel, mystical garden (not tested).

Info windows.
Minor changes.
This commit is contained in:
Michał W. Urbańczyk
2007-11-23 22:33:55 +00:00
parent d8103fd242
commit 736af28c05
20 changed files with 472 additions and 122 deletions

View File

@ -93,14 +93,14 @@ public:
void draw(); void draw();
}; };
class CResourceBar class CResourceBar
:public ClickableR, public CIntObject :public ClickableR
{ {
SDL_Surface * bg; SDL_Surface * bg;
void clickRight(tribool down); void clickRight(tribool down);
void refresh(); void refresh();
}; };
class CDataBar class CDataBar
:public ClickableR, public CIntObject :public ClickableR
{ {
SDL_Surface * bg; SDL_Surface * bg;
void clickRight(tribool down); void clickRight(tribool down);

View File

@ -38,6 +38,11 @@ void CCallback::newTurn()
{ {
//std::map<int, PlayerState>::iterator i = gs->players.begin() ; //std::map<int, PlayerState>::iterator i = gs->players.begin() ;
gs->day++; gs->day++;
for (int i=0;i<CGI->objh->objInstances.size();i++)
{
if (CGI->objh->objInstances[i]->state)
CGI->objh->objInstances[i]->state->newTurn();
}
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++)
@ -373,6 +378,37 @@ int CScriptCallback::getSelectedHero()
ret = -1;; ret = -1;;
return ret; return ret;
} }
int CScriptCallback::getDate(int mode)
{
int temp;
switch (mode)
{
case 0:
return gs->day;
break;
case 1:
temp = (gs->day)%7;
if (temp)
return temp;
else return 7;
break;
case 2:
temp = ((gs->day-1)/7)+1;
if (!(temp%4))
return 4;
else
return (temp%4);
break;
case 3:
return ((gs->day-1)/28)+1;
break;
}
return 0;
}
void CScriptCallback::giveResource(int player, int which, int val)
{
gs->players[player].resources[which]+=val;
}
void CLuaCallback::registerFuncs(lua_State * L) void CLuaCallback::registerFuncs(lua_State * L)
{ {
lua_newtable(L); lua_newtable(L);
@ -398,6 +434,7 @@ void CLuaCallback::registerFuncs(lua_State * L)
lua_setglobal(L, "vcmi"); lua_setglobal(L, "vcmi");
#undef REGISTER_C_FUNC(x) #undef REGISTER_C_FUNC(x)
} }
int CLuaCallback::getPos(lua_State * L)//(CGObjectInstance * object); int CLuaCallback::getPos(lua_State * L)//(CGObjectInstance * object);
{ {

View File

@ -61,6 +61,8 @@ public:
void showInfoDialog(int player, std::string text, std::vector<SComponent*> * components); void showInfoDialog(int player, std::string text, std::vector<SComponent*> * components);
int getHeroOwner(int heroID); int getHeroOwner(int heroID);
int getSelectedHero(); int getSelectedHero();
int getDate(int mode=0);
void giveResource(int player, int which, int val);
friend void initGameState(CGameInfo * cgi); friend void initGameState(CGameInfo * cgi);
}; };
class CLuaCallback : public CScriptCallback class CLuaCallback : public CScriptCallback

View File

@ -5,7 +5,6 @@
BOOST_TRIBOOL_THIRD_STATE(outOfRange) BOOST_TRIBOOL_THIRD_STATE(outOfRange)
using namespace boost::logic; using namespace boost::logic;
class CAdvMapInt;
class CCallback; class CCallback;
class CGlobalAI; class CGlobalAI;
class CGHeroInstance; class CGHeroInstance;

164
CLua.cpp
View File

@ -15,6 +15,8 @@
#include "CCallback.h" #include "CCallback.h"
#include "hch/CGeneralTextHandler.h" #include "hch/CGeneralTextHandler.h"
#include <sstream> #include <sstream>
#include "CPlayerInterface.h"
#pragma warning (disable : 4311)
bool getGlobalFunc(lua_State * L, std::string fname) bool getGlobalFunc(lua_State * L, std::string fname)
{ {
unsigned int hash = lua_calchash(fname.c_str(), fname.size()); unsigned int hash = lua_calchash(fname.c_str(), fname.size());
@ -25,7 +27,7 @@ bool getGlobalFunc(lua_State * L, std::string fname)
CObjectScript::CObjectScript() CObjectScript::CObjectScript()
{ {
language == ESLan::UNDEF; language = ESLan::UNDEF;
//std::cout << "Tworze obiekt objectscript "<<this<<std::endl; //std::cout << "Tworze obiekt objectscript "<<this<<std::endl;
} }
@ -107,7 +109,7 @@ void CLua::findFS(std::string fname)
CLuaObjectScript::CLuaObjectScript(std::string filename) CLuaObjectScript::CLuaObjectScript(std::string filename)
{ {
language == ESLan::LUA; language = ESLan::LUA;
open(filename); open(filename);
//binit = bnewobject = bonherovisit = brightext = false; //binit = bnewobject = bonherovisit = brightext = false;
//std::cout << "Tworze obiekt CLuaObjectScript "<<this<<std::endl; //std::cout << "Tworze obiekt CLuaObjectScript "<<this<<std::endl;
@ -163,6 +165,7 @@ std::string CLuaObjectScript::hoverText(CGObjectInstance *os)
} }
std::string ret = lua_tostring(is,1); std::string ret = lua_tostring(is,1);
lua_settop(is, 0); lua_settop(is, 0);
return ret;
} }
std::string CCPPObjectScript::hoverText(CGObjectInstance *os) std::string CCPPObjectScript::hoverText(CGObjectInstance *os)
@ -196,15 +199,6 @@ void CVisitableOPH::onHeroVisit(CGObjectInstance *os, int heroID)
} }
}; };
void CVisitableOPH::onNAHeroVisit(CGObjectInstance *os, int heroID, bool alreadyVisited) void CVisitableOPH::onNAHeroVisit(CGObjectInstance *os, int heroID, bool alreadyVisited)
{
if (!alreadyVisited)
{
switch (os->ID)
{
case 51:
case 23:
case 61:
case 32:
{ {
int w=0, ot=0; int w=0, ot=0;
switch(os->ID) switch(os->ID)
@ -215,7 +209,7 @@ void CVisitableOPH::onNAHeroVisit(CGObjectInstance *os, int heroID, bool already
break; break;
case 23: case 23:
w=1; w=1;
ot=29; ot=39;
break; break;
case 61: case 61:
w=2; w=2;
@ -226,16 +220,30 @@ void CVisitableOPH::onNAHeroVisit(CGObjectInstance *os, int heroID, bool already
ot=59; ot=59;
break; break;
} }
if (!alreadyVisited)
{
switch (os->ID)
{
case 51:
case 23:
case 61:
case 32:
{
cb->changePrimSkill(heroID,w,1); cb->changePrimSkill(heroID,w,1);
std::vector<SComponent*> weko; std::vector<SComponent*> weko;
weko.push_back(new SComponent(SComponent::primskill,1,1)); weko.push_back(new SComponent(SComponent::primskill,w,1));
cb->showInfoDialog(cb->getHeroOwner(heroID),CGI->objh->advobtxt[ot],&weko); cb->showInfoDialog(cb->getHeroOwner(heroID),CGI->objh->advobtxt[ot],&weko); //TODO: maybe we have memory leak with these windows
for (int ii=0; ii<weko.size();ii++) //for (int ii=0; ii<weko.size();ii++)
delete weko[ii]; // delete weko[ii];
break; break;
} }
} }
} }
else
{
ot++;
cb->showInfoDialog(cb->getHeroOwner(heroID),CGI->objh->advobtxt[ot],&std::vector<SComponent*>());
}
} }
std::vector<int> CVisitableOPH::yourObjects() std::vector<int> CVisitableOPH::yourObjects()
@ -282,6 +290,104 @@ std::string CVisitableOPH::hoverText(CGObjectInstance *os)
return CGI->objh->objects[os->defInfo->id].name + add; return CGI->objh->objects[os->defInfo->id].name + add;
} }
void CVisitableOPW::onNAHeroVisit(CGObjectInstance *os, int heroID, bool alreadyVisited)
{
int mid;
switch (os->ID)
{
case 55:
mid = 92;
break;
case 112:
mid = 170;
break;
case 109:
mid = 164;
break;
}
if (alreadyVisited)
{
if (os->ID!=112)
mid++;
else
mid--;
cb->showInfoDialog(cb->getHeroOwner(heroID),CGI->objh->advobtxt[mid],&std::vector<SComponent*>()); //TODO: maybe we have memory leak with these windows
}
else
{
int type, sub, val;
type = SComponent::resource;
switch (os->ID)
{
case 55:
if (rand()%2)
{
sub = 5;
val = 5;
}
else
{
sub = 6;
val = 500;
}
break;
case 112:
mid = 170;
sub = rand() % 6;
val = (rand() % 4) + 3;
break;
case 109:
mid = 164;
sub = 6;
if(cb->getDate(2)<2)
val = 500;
else
val = 1000;
}
SComponent * com = new SComponent((SComponent::Etype)type,sub,val);
std::vector<SComponent*> weko;
weko.push_back(com);
cb->giveResource(cb->getHeroOwner(heroID),sub,val);
cb->showInfoDialog(cb->getHeroOwner(heroID),CGI->objh->advobtxt[mid],&weko);
visited[os] = true;
}
}
void CVisitableOPW::newTurn ()
{
if (cb->getDate(1)==1)
{
for (std::map<CGObjectInstance*,bool>::iterator i = visited.begin(); i != visited.end(); i++)
{
(*i).second = false;
}
}
}
void CVisitableOPW::newObject(CGObjectInstance *os)
{
visited.insert(std::pair<CGObjectInstance*,bool>(os,false));
}
void CVisitableOPW::onHeroVisit(CGObjectInstance *os, int heroID)
{
if(visited[os])
onNAHeroVisit(os,heroID,true);
else
onNAHeroVisit(os,heroID,false);
}
std::vector<int> CVisitableOPW::yourObjects() //returns IDs of objects which are handled by script
{
std::vector<int> ret(3);
ret.push_back(55); //mystical garden
ret.push_back(112); //windmill
ret.push_back(109); //water wheel
return ret;
}
std::string CVisitableOPW::hoverText(CGObjectInstance *os)
{
return CGI->objh->objects[os->defInfo->id].name + " " + ( (visited[os]) ? (CGI->generaltexth->allTexts[352]) : (CGI->generaltexth->allTexts[353])) ;
}
//std::string SComponent::getSubtitle() //std::string SComponent::getSubtitle()
//{ //{
@ -293,29 +399,3 @@ std::string CVisitableOPH::hoverText(CGObjectInstance *os)
//void SComponent::getDescription(Etype Type, int Subtype) //void SComponent::getDescription(Etype Type, int Subtype)
//{ //{
//} //}
SComponent::SComponent(Etype Type, int Subtype, int Val)
{
switch (Type)
{
case primskill:
description = CGI->generaltexth->arraytxt[2+Subtype];
std::ostringstream oss;
oss << ((Val>0)?("+"):("-")) << Val << " " << CGI->heroh->pskillsn[Subtype];
subtitle = oss.str();
break;
}
type = Type;
subtype = Subtype;
val = Val;
}
SDL_Surface * SComponent::getImg()
{
switch (type)
{
case primskill:
return CGI->heroh->pskillsb[subtype].ourImages[0].bitmap;
break;
}
return NULL;
}

26
CLua.h
View File

@ -25,6 +25,8 @@ public:
virtual void newObject(CGObjectInstance *os){}; virtual void newObject(CGObjectInstance *os){};
virtual void onHeroVisit(CGObjectInstance *os, int heroID){}; virtual void onHeroVisit(CGObjectInstance *os, int heroID){};
virtual std::string hoverText(CGObjectInstance *os){return "";}; virtual std::string hoverText(CGObjectInstance *os){return "";};
virtual void newTurn (){};
//TODO: implement functions below: //TODO: implement functions below:
virtual void equipArtefact(int HID, int AID, int slot, bool putOn){}; //putOn==0 means that artifact is taken off virtual void equipArtefact(int HID, int AID, int slot, bool putOn){}; //putOn==0 means that artifact is taken off
@ -34,7 +36,6 @@ public:
//virtual void mouseClick (down,left,screen?, pos??){}; //virtual void mouseClick (down,left,screen?, pos??){};
virtual void heroLevelUp (int HID){}; //add possibility of changing available sec. skills virtual void heroLevelUp (int HID){}; //add possibility of changing available sec. skills
}; };
class CScript class CScript
{ {
@ -100,19 +101,16 @@ class CVisitableOPH : public CCPPObjectScript //once per hero
friend void initGameState(CGameInfo * cgi); friend void initGameState(CGameInfo * cgi);
}; };
struct SComponent class CVisitableOPW : public CCPPObjectScript //once per week
{ {
enum Etype CVisitableOPW(CScriptCallback * CB):CCPPObjectScript(CB){};
{ std::map<CGObjectInstance*,bool> visited;
primskill, secskill, resource, creature, artifact void onNAHeroVisit(CGObjectInstance *os, int heroID, bool alreadyVisited);
} type; void newObject(CGObjectInstance *os);
int subtype; void onHeroVisit(CGObjectInstance *os, int heroID);
int val; std::vector<int> yourObjects(); //returns IDs of objects which are handled by script
std::string hoverText(CGObjectInstance *os);
void newTurn ();
std::string description; //r-click friend void initGameState(CGameInfo * cgi);
std::string subtitle;
SComponent(Etype Type, int Subtype, int Val);
//SComponent(const & SComponent r);
SDL_Surface * getImg();
}; };

View File

@ -218,7 +218,9 @@ void initGameState(CGameInfo * cgi)
/****************************C++ OBJECT SCRIPTS************************************************/ /****************************C++ OBJECT SCRIPTS************************************************/
std::map<int,CCPPObjectScript*> scripts; std::map<int,CCPPObjectScript*> scripts;
CScriptCallback * csc = new CScriptCallback(); CScriptCallback * csc = new CScriptCallback();
csc->gs = cgi->state;
handleCPPObjS(&scripts,new CVisitableOPH(csc)); handleCPPObjS(&scripts,new CVisitableOPH(csc));
handleCPPObjS(&scripts,new CVisitableOPW(csc));
//created map //created map
@ -330,6 +332,8 @@ int _tmain(int argc, _TCHAR* argv[])
cgi->screenh = new CScreenHandler; cgi->screenh = new CScreenHandler;
cgi->screenh->initScreen(); cgi->screenh->initScreen();
THC std::cout<<"Preparing first handlers: "<<tmh.getDif()<<std::endl;
//colors initialization //colors initialization
SDL_Color p; SDL_Color p;
p.unused = 0; p.unused = 0;
@ -352,6 +356,7 @@ int _tmain(int argc, _TCHAR* argv[])
p.r = 0x84; p.g = 0x84; p.b = 0x84;//gray p.r = 0x84; p.g = 0x84; p.b = 0x84;//gray
cgi->neutralColor = p;//gray cgi->neutralColor = p;//gray
//colors initialized //colors initialized
THC std::cout<<"Preparing players' colours: "<<tmh.getDif()<<std::endl;
CMessage::init(); CMessage::init();
cgi->townh = new CTownHandler; cgi->townh = new CTownHandler;
cgi->townh->loadNames(); cgi->townh->loadNames();
@ -364,6 +369,7 @@ int _tmain(int argc, _TCHAR* argv[])
cgi->heroh = heroh; cgi->heroh = heroh;
cgi->generaltexth = new CGeneralTextHandler; cgi->generaltexth = new CGeneralTextHandler;
cgi->generaltexth->load(); cgi->generaltexth->load();
THC std::cout<<"Preparing more handlers: "<<tmh.getDif()<<std::endl;
//initializing hero flags //initializing hero flags
@ -641,7 +647,7 @@ int _tmain(int argc, _TCHAR* argv[])
//hero flags initialized //hero flags initialized
THC std::cout<<"Preparing first handlers: "<<tmh.getDif()<<std::endl; THC std::cout<<"Initializing colours and flags: "<<tmh.getDif()<<std::endl;
CPreGame * cpg = new CPreGame(); //main menu and submenus CPreGame * cpg = new CPreGame(); //main menu and submenus
THC std::cout<<"Initialization CPreGame (together): "<<tmh.getDif()<<std::endl; THC std::cout<<"Initialization CPreGame (together): "<<tmh.getDif()<<std::endl;
cpg->mush = mush; cpg->mush = mush;

View File

@ -275,45 +275,76 @@ CInfoWindow * CMessage::genIWindow(std::string text, int player, int charperline
{ {
//TODO: support for more than one component //TODO: support for more than one component
CInfoWindow * ret = new CInfoWindow(); CInfoWindow * ret = new CInfoWindow();
ret->components = comps;
std::vector<std::string> * brtext = breakText(text,32,true,true); //for (int i=0;i<comps.size();i++)
std::vector<std::string> * brdtext = breakText(comps[0]->subtitle,12,true,true); // comps[i]->
std::vector<std::string> * brtext = breakText(text,charperline,true,true);
std::vector<std::string> * brdtext;
if (comps.size())
brdtext = breakText(comps[0]->subtitle,12,true,true);
else
brdtext = NULL;
std::vector<std::vector<SDL_Surface*> > * txtg = drawText(brtext); std::vector<std::vector<SDL_Surface*> > * txtg = drawText(brtext);
std::pair<int,int> txts = getMaxSizes(txtg); std::pair<int,int> txts = getMaxSizes(txtg);
txts.second = txts.second
+ ok->ourImages[0].bitmap->h //button
+ 15 //after button
+ 20; // space between subtitle and button
if (comps.size())
txts.second = txts.second txts.second = txts.second
+ 30 //space to first component + 30 //space to first component
+ comps[0]->getImg()->h + comps[0]->getImg()->h
+ brdtext->size() * 10 //subtitle //!!!!!!!!!!!!!!!!!!!! + 5 //img <-> subtitle
+ 20 // space between subtitle and button + brdtext->size() * 10; //subtitle //!!!!!!!!!!!!!!!!!!!!
+ ok->ourImages[0].bitmap->h //button
+ 30; //after button
ret->bitmap = drawBox1(txts.first+70,txts.second+70,0); ret->bitmap = drawBox1(txts.first+70,txts.second+70,0);
ret->pos.h=ret->bitmap->h; ret->pos.h=ret->bitmap->h;
ret->pos.w=ret->bitmap->w; ret->pos.w=ret->bitmap->w;
int curh = 30; //gorny margines
for (int i=0; i<txtg->size();i++)
{
int lw=0;
for (int j=0;j<(*txtg)[i].size();j++)
lw+=(*txtg)[i][j]->w;
int pw = ret->bitmap->w/2;
//int pw = Tmar, ph = Lmar;
pw -= lw/2;
//for (int i=0; i<txtg->size();i++) int tw = pw;
//{ for (int j=0;j<(*txtg)[i].size();j++) //blit text
// int lw=0; {
// for (int j=0;j<(*txtg)[i].size();j++) //std::stringstream n;
// lw+=(*txtg)[i][j]->w; //n <<"temp_"<<i<<"__"<<j<<".bmp";
// int pw = ret->bitmap->w/2, ph = ret->bitmap->h/2; //SDL_SaveBMP(ret->bitmap,n.str().c_str());
// //int pw = Tmar, ph = Lmar; blitAt((*txtg)[i][j],tw,curh+i*19,ret->bitmap);
// pw -= lw/2; tw+=(*txtg)[i][j]->w;
// ph -= (19*txtg->size())/2; SDL_FreeSurface((*txtg)[i][j]);
}
}
curh += (19 * txtg->size()); //wys. tekstu
// int tw = pw; if (comps.size())
// for (int j=0;j<(*txtg)[i].size();j++) {
// { curh += 30;
// //std::stringstream n; comps[0]->pos.x = (ret->bitmap->w/2) - ((comps[0]->getImg()->w)/2);
// //n <<"temp_"<<i<<"__"<<j<<".bmp"; comps[0]->pos.y = curh;
// blitAt((*txtg)[i][j],tw,ph+i*19,ret->bitmap); blitAt(comps[0]->getImg(),comps[0]->pos.x,comps[0]->pos.y,ret->bitmap);
// //SDL_SaveBMP(ret->bitmap,n.str().c_str()); curh += comps[0]->getImg()->h + 5; //obrazek + przerwa
// tw+=(*txtg)[i][j]->w; for (int i=0; i<brdtext->size();i++) //descr.
// SDL_FreeSurface((*txtg)[i][j]); {
// } SDL_Surface * tesu = TTF_RenderText_Blended(GEOR13,(*brdtext)[i].c_str(),zwykly);
//} blitAt(tesu,((comps[0]->getImg()->w - tesu->w)/2)+comps[0]->pos.x,curh,ret->bitmap);
curh+=tesu->h;
SDL_FreeSurface(tesu);
}
}
curh += 20; //to buttton
ret->okb.posr.x = (ret->bitmap->w/2) - (ret->okb.imgs[0][0]->w/2);
ret->okb.posr.y = curh;
ret->okb.show();
curh+=ret->okb.imgs[0][0]->h;
return ret; return ret;
} }

View File

@ -13,6 +13,7 @@ class CDefHandler;
struct SComponent; struct SComponent;
namespace NMessage namespace NMessage
{ {
extern CDefHandler * ok, *cancel;
extern std::vector<std::vector<SDL_Surface*> > piecesOfBox; //in colors of all players extern std::vector<std::vector<SDL_Surface*> > piecesOfBox; //in colors of all players
extern SDL_Surface * background ; extern SDL_Surface * background ;
} }

View File

@ -14,6 +14,7 @@
#include <sstream> #include <sstream>
#include "hch/CHeroHandler.h" #include "hch/CHeroHandler.h"
#include "SDL_framerate.h" #include "SDL_framerate.h"
#include "hch/CGeneralTextHandler.h"
using namespace CSDL_Ext; using namespace CSDL_Ext;
class OCM_HLP_CGIN class OCM_HLP_CGIN
@ -24,12 +25,143 @@ public:
return (*a.first)<(*b.first); return (*a.first)<(*b.first);
} }
} ocmptwo_cgin ; } ocmptwo_cgin ;
CInfoWindow::CInfoWindow()
:okb(NMessage::ok,NULL,&CInfoWindow::okClicked)
{
okb.ourObj = this;
okb.delg = this;
}
void CInfoWindow::okClicked(tribool down)
{
if (!down)
close();
}
void CInfoWindow::close()
{
for (int i=0;i<components.size();i++)
delete components[i];
okb.deactivate();
SDL_FreeSurface(bitmap);
bitmap = NULL;
LOCPLINT->removeObjToBlit(this);
//delete this;
LOCPLINT->adventureInt->show();
}
CInfoWindow::~CInfoWindow()
{
}
SComponent::SComponent(Etype Type, int Subtype, int Val)
{
std::ostringstream oss;
switch (Type)
{
case primskill:
description = CGI->generaltexth->arraytxt[2+Subtype];
oss << ((Val>0)?("+"):("-")) << Val << " " << CGI->heroh->pskillsn[Subtype];
subtitle = oss.str();
break;
case resource:
//description = CGI->generaltexth->arraytxt[2+Subtype];
std::ostringstream oss;
oss << Val;
subtitle = oss.str();
break;
}
type = Type;
subtype = Subtype;
val = Val;
SDL_Surface * temp = getImg();
pos.w = temp->w;
pos.h = temp->h;
}
SDL_Surface * SComponent::getImg()
{
switch (type)
{
case primskill:
return CGI->heroh->pskillsb->ourImages[subtype].bitmap;
break;
case resource:
return CGI->heroh->resources->ourImages[subtype].bitmap;
break;
}
return NULL;
}
void SComponent::clickRight (tribool down)
{
LOCPLINT->adventureInt->handleRightClick(description,down,this);
}
void SComponent::activate()
{
ClickableR::activate();
}
void SComponent::deactivate()
{
ClickableR::deactivate();
}
CSimpleWindow::~CSimpleWindow() CSimpleWindow::~CSimpleWindow()
{ {
if (bitmap) if (bitmap)
{
SDL_FreeSurface(bitmap); SDL_FreeSurface(bitmap);
bitmap=NULL; bitmap=NULL;
} }
}
template <typename T>CSCButton<T>::CSCButton(CDefHandler * img, CIntObject * obj, void(T::*poin)(tribool), T* Delg)
{
ourObj = obj;
delg = Delg;
func = poin;
imgs.resize(1);
for (int i =0; i<img->ourImages.size();i++)
{
imgs[0].push_back(img->ourImages[i].bitmap);
}
pos.w = imgs[0][0]->w;
pos.h = imgs[0][0]->h;
state = 0;
}
template <typename T> void CSCButton<T>::clickLeft (tribool down)
{
if (down)
{
state=1;
}
else
{
state=0;
}
show();
if (delg)
(delg->*func)(down);
pressedL=state;
}
template <typename T> void CSCButton<typename T>::activate()
{
ClickableL::activate();
}
template <typename T> void CSCButton<typename T>::deactivate()
{
ClickableL::deactivate();
}
template <typename T> void CSCButton<typename T>::show()
{
if (delg)
{
blitAt(imgs[curimg][state],posr.x,posr.y,delg->bitmap);
updateRect(&genRect(pos.h,pos.w,posr.x,posr.y),delg->bitmap);
}
else
{
CButtonBase::show();
}
}
CButtonBase::CButtonBase() CButtonBase::CButtonBase()
{ {
curimg=0; curimg=0;
@ -1061,7 +1193,20 @@ void CPlayerInterface::heroPrimarySkillChanged(const CGHeroInstance * hero, int
adventureInt->infoBar.draw(); adventureInt->infoBar.draw();
return; return;
} }
void CPlayerInterface::showInfoDialog(std::string text, std::vector<SComponent*> components) void CPlayerInterface::showInfoDialog(std::string text, std::vector<SComponent*> & components)
{ {
; adventureInt->hide();
CInfoWindow * temp = CMessage::genIWindow(text,LOCPLINT->playerID,32,components);
LOCPLINT->objsToBlit.push_back(temp);
temp->pos.x=300-(temp->pos.w/2);
temp->pos.y=300-(temp->pos.h/2);
temp->okb.pos.x = temp->okb.posr.x + temp->pos.x;
temp->okb.pos.y = temp->okb.posr.y + temp->pos.y;
temp->okb.activate();
}
void CPlayerInterface::removeObjToBlit(CSimpleWindow* obj)
{
objsToBlit.erase
(std::find(objsToBlit.begin(),objsToBlit.end(),obj));
//delete obj;
} }

View File

@ -10,7 +10,7 @@ class CDefHandler;
struct HeroMoveDetails; struct HeroMoveDetails;
class CDefEssential; class CDefEssential;
class CGHeroInstance; class CGHeroInstance;
struct SComponent; class CAdvMapInt;
class CIntObject //interface object class CIntObject //interface object
{ {
public: public:
@ -25,19 +25,13 @@ public:
CSimpleWindow():bitmap(NULL),owner(NULL){}; CSimpleWindow():bitmap(NULL),owner(NULL){};
virtual ~CSimpleWindow(); virtual ~CSimpleWindow();
}; };
class CInfoWindow : public CSimpleWindow //text + comp. + ok button
{
public:
std::vector<SComponent *> components;
CInfoWindow(){};
};
class CButtonBase : public virtual CIntObject //basic buttton class class CButtonBase : public virtual CIntObject //basic buttton class
{ {
public: public:
int type; //advmapbutton=2 int type; //advmapbutton=2
bool abs; bool abs;
bool active; bool active;
CIntObject * ourObj; CIntObject * ourObj; // "owner"
int state; int state;
std::vector< std::vector<SDL_Surface*> > imgs; std::vector< std::vector<SDL_Surface*> > imgs;
int curimg; int curimg;
@ -45,6 +39,7 @@ public:
virtual void activate()=0; virtual void activate()=0;
virtual void deactivate()=0; virtual void deactivate()=0;
CButtonBase(); CButtonBase();
virtual ~CButtonBase(){};
}; };
class ClickableL : public virtual CIntObject //for left-clicks class ClickableL : public virtual CIntObject //for left-clicks
{ {
@ -87,6 +82,54 @@ public:
virtual void activate()=0; virtual void activate()=0;
virtual void deactivate()=0; virtual void deactivate()=0;
}; };
template <typename T> class CSCButton: public CButtonBase, public ClickableL //prosty guzik, ktory tylko zmienia obrazek
{
public:
int3 posr; //position in the bitmap
int state;
T* delg;
void(T::*func)(tribool);
CSCButton(CDefHandler * img, CIntObject * obj, void(T::*poin)(tribool), T* Delg=NULL);
void clickLeft (tribool down);
void activate();
void deactivate();
void show();
};
class CInfoWindow : public CSimpleWindow //text + comp. + ok button
{
public:
CSCButton<CInfoWindow> okb;
std::vector<SComponent*> components;
void okClicked(tribool down);
void close();
CInfoWindow();
~CInfoWindow();
};
class SComponent : public ClickableR
{
public:
enum Etype
{
primskill, secskill, resource, creature, artifact
} type;
int subtype;
int val;
std::string description; //r-click
std::string subtitle;
SComponent(Etype Type, int Subtype, int Val);
//SComponent(const & SComponent r);
SDL_Surface * getImg();
void clickRight (tribool down);
void activate();
void deactivate();
};
class CPlayerInterface : public CGameInterface class CPlayerInterface : public CGameInterface
{ {
public: public:
@ -121,7 +164,8 @@ public:
void handleEvent(SDL_Event * sEvent); void handleEvent(SDL_Event * sEvent);
void init(CCallback * CB); void init(CCallback * CB);
int3 repairScreenPos(int3 pos); int3 repairScreenPos(int3 pos);
void showInfoDialog(std::string text, std::vector<SComponent*> components); void showInfoDialog(std::string text, std::vector<SComponent*> & components);
void removeObjToBlit(CSimpleWindow* obj);
CPlayerInterface(int Player, int serial); CPlayerInterface(int Player, int serial);
}; };

Binary file not shown.

View File

@ -91,13 +91,13 @@ public:
: Button(Pos,Fun,Imgs,Sel,gr),key(My){ourPoinGroup=gr;}; : Button(Pos,Fun,Imgs,Sel,gr),key(My){ourPoinGroup=gr;};
void select(bool on=true) {(*this).Button::select(on);ourPoinGroup->setYour(this);CPG->printRating();} void select(bool on=true) {(*this).Button::select(on);ourPoinGroup->setYour(this);CPG->printRating();}
}; };
template <class T=ttt> class CPoinGroup :public CGroup<T> template <class T> class CPoinGroup :public CGroup<T>
{ {
public: public:
int * gdzie; //where (po polsku, bo by by�o s�owo kluczowe :/) int * gdzie; //where (po polsku, bo by by�o s�owo kluczowe :/)
void setYour(IntSelBut<T> * your){*gdzie=your->key;}; void setYour(IntSelBut<T> * your){*gdzie=your->key;};
}; };
template <class T=ttt> class CGroup template <class T> class CGroup
{ {
public: public:
Button<T> * selected; Button<T> * selected;

View File

@ -40,6 +40,7 @@ void CHeroHandler::loadPortraits()
} }
of.close(); of.close();
pskillsb = CGI->spriteh->giveDef("PSKILL.DEF"); pskillsb = CGI->spriteh->giveDef("PSKILL.DEF");
resources = CGI->spriteh->giveDef("RESOUR82.DEF");
std::string strs = CGI->bitmaph->getTextFile("PRISKILL.TXT"); std::string strs = CGI->bitmaph->getTextFile("PRISKILL.TXT");
int itr=0; int itr=0;

View File

@ -69,7 +69,7 @@ public:
unsigned int getTileCost(EterrainType & ttype, Eroad & rdtype, Eriver & rvtype); unsigned int getTileCost(EterrainType & ttype, Eroad & rdtype, Eriver & rvtype);
unsigned int getLowestCreatureSpeed(); unsigned int getLowestCreatureSpeed();
unsigned int getAdditiveMoveBonus(); unsigned int getAdditiveMoveBonus();
unsigned float getMultiplicativeMoveBonus(); float getMultiplicativeMoveBonus();
static int3 convertPosition(int3 src, bool toh3m); //toh3m=true: manifest->h3m; toh3m=false: h3m->manifest 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' 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 int getSightDistance() const; //returns sight distance of this hero
@ -89,7 +89,7 @@ public:
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 ,
CDefHandler * pskillsb; //82x93 CDefHandler * pskillsb, *resources; //82x93
std::vector<std::string> pskillsn; std::vector<std::string> pskillsn;
unsigned int level(unsigned int experience); unsigned int level(unsigned int experience);
void loadHeroes(); void loadHeroes();

View File

@ -6,7 +6,6 @@
#include <cctype> #include <cctype>
#include <cstring> #include <cstring>
#include "boost/filesystem.hpp" // includes all needed Boost.Filesystem declarations #include "boost/filesystem.hpp" // includes all needed Boost.Filesystem declarations
int readNormalNr (int pos, int bytCon, unsigned char * str) int readNormalNr (int pos, int bytCon, unsigned char * str)
{ {
int ret=0; int ret=0;

View File

@ -8,6 +8,7 @@
#include "CDefObjInfoHandler.h" #include "CDefObjInfoHandler.h"
#include "../CLua.h" #include "../CLua.h"
#include "CHeroHandler.h" #include "CHeroHandler.h"
#include <boost/algorithm/string/replace.hpp>
void CObjectHandler::loadObjects() void CObjectHandler::loadObjects()
{ {
int ID=0; int ID=0;
@ -28,6 +29,8 @@ void CObjectHandler::loadObjects()
while (it<buf.length()-1) while (it<buf.length()-1)
{ {
CGeneralTextHandler::loadToIt(temp,buf,it,3); CGeneralTextHandler::loadToIt(temp,buf,it,3);
temp = temp.substr(1,temp.length()-2);
boost::algorithm::replace_all(temp,"\"\"","\"");
advobtxt.push_back(temp); advobtxt.push_back(temp);
} }
@ -122,9 +125,9 @@ bool CGObjectInstance::visitableAt(int x, int y) const //returns true if ibject
} }
bool CGObjectInstance::operator<(const CGObjectInstance & cmp) const //screen printing priority comparing bool CGObjectInstance::operator<(const CGObjectInstance & cmp) const //screen printing priority comparing
{ {
if(defInfo->printPriority==1 && defInfo->printPriority==0) if(defInfo->printPriority==1 && cmp.defInfo->printPriority==0)
return true; return true;
if(defInfo->printPriority==1 && defInfo->printPriority==0) if(cmp.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;
@ -277,6 +280,7 @@ CGObjectInstance::CGObjectInstance(const CGObjectInstance & right)
defInfo = right.defInfo; defInfo = right.defInfo;
info = right.info; info = right.info;
defObjInfoNumber = right.defObjInfoNumber; defObjInfoNumber = right.defObjInfoNumber;
blockVisit = false;
//state = new CLuaObjectScript(right.state->); //state = new CLuaObjectScript(right.state->);
//*state = *right.state; //*state = *right.state;
//state = right.state; //state = right.state;
@ -291,6 +295,7 @@ CGObjectInstance& CGObjectInstance::operator=(const CGObjectInstance & right)
defInfo = right.defInfo; defInfo = right.defInfo;
info = right.info; info = right.info;
defObjInfoNumber = right.defObjInfoNumber; defObjInfoNumber = right.defObjInfoNumber;
blockVisit = right.blockVisit;
//state = new CLuaObjectScript(); //state = new CLuaObjectScript();
//*state = *right.state; //*state = *right.state;
tempOwner = right.tempOwner; tempOwner = right.tempOwner;

View File

@ -367,6 +367,7 @@ public:
int defObjInfoNumber; int defObjInfoNumber;
int tempOwner; //uzywane dla szybkosci, skrypt ma obowiazek aktualizowac te zmienna int tempOwner; //uzywane dla szybkosci, skrypt ma obowiazek aktualizowac te zmienna
bool blockVisit;
virtual bool isHero() const; virtual bool isHero() const;
int getOwner() const; int getOwner() const;
@ -405,7 +406,7 @@ public:
unsigned int getTileCost(EterrainType & ttype, Eroad & rdtype, Eriver & rvtype); unsigned int getTileCost(EterrainType & ttype, Eroad & rdtype, Eriver & rvtype);
unsigned int getLowestCreatureSpeed(); unsigned int getLowestCreatureSpeed();
unsigned int getAdditiveMoveBonus(); unsigned int getAdditiveMoveBonus();
unsigned float getMultiplicativeMoveBonus(); float getMultiplicativeMoveBonus();
static int3 convertPosition(int3 src, bool toh3m); //toh3m=true: manifest->h3m; toh3m=false: h3m->manifest 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' 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 int getSightDistance() const; //returns sight distance of this hero

4
map.h
View File

@ -1,6 +1,6 @@
#ifndef MAPD_H #ifndef MAPD_H
#define MAPD_H #define MAPD_H
#pragma warning (disable : 4482)
#include <string> #include <string>
#include <vector> #include <vector>
#include "global.h" #include "global.h"
@ -174,7 +174,7 @@ public:
struct Mapa struct Mapa
{ {
Eformat version; // version of map Eformat Eformat version; // version of map Eformat
bool twoLevel; // if map has underground level int twoLevel; // if map has underground level
int difficulty; // 0 easy - 4 impossible int difficulty; // 0 easy - 4 impossible
int levelLimit; int levelLimit;
bool areAnyPLayers; // if there are any playable players on map bool areAnyPLayers; // if there are any playable players on map

View File

@ -1524,6 +1524,7 @@ std::string CMapHandler::getDefName(int id, int subid)
if(CGI->dobjinfo->objs[i].type==id && CGI->dobjinfo->objs[i].subtype==subid) if(CGI->dobjinfo->objs[i].type==id && CGI->dobjinfo->objs[i].subtype==subid)
return CGI->dobjinfo->objs[i].defName; return CGI->dobjinfo->objs[i].defName;
} }
throw new std::exception("Def not found.");
} }
bool CMapHandler::printObject(CGObjectInstance *obj) bool CMapHandler::printObject(CGObjectInstance *obj)