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

Almost finished building of buildings.

This commit is contained in:
Michał W. Urbańczyk 2008-03-21 00:03:31 +00:00
parent db12ede837
commit 1e61235aa9
11 changed files with 155 additions and 25 deletions

@ -120,9 +120,9 @@ void AdventureMapButton<T>::clickRight (tribool down)
template <typename T>
void AdventureMapButton<T>::hover (bool on)
{
Hoverable::hover(on);
if(name.size()) //if there is no name, there is nohing to display also
{
Hoverable::hover(on);
if (on)
LOCPLINT->statusbar->print(name);
else if (LOCPLINT->statusbar->getCurrent()==name)

@ -12,7 +12,7 @@
#include "hch/CGeneralTextHandler.h"
#include "CAdvmapInterface.h"
#include "CPlayerInterface.h"
#include "hch/CBuildingHandler.h"
LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...);
int CCallback::lowestSpeed(CGHeroInstance * chi)
@ -50,6 +50,10 @@ void CCallback::newTurn()
{
(*i).second.heroes[j]->movement = valMovePoints((*i).second.heroes[j]);
}
for(int j=0;j<i->second.towns.size();j++)
{
i->second.towns[j]->builded=0;
}
}
}
bool CCallback::moveHero(int ID, CPath * path, int idtype, int pathType)
@ -515,6 +519,20 @@ bool CCallback::swapArifacts(const CGHeroInstance * hero1, bool worn1, int pos1,
return true;
}
bool CCallback::buildBuilding(const CGTownInstance *town, int buildingID)
{
CGTownInstance * t = const_cast<CGTownInstance *>(town);
CBuilding *b = CGI->buildh->buildings[t->subID][buildingID];
//TODO: check if we are allowed to build
t->builtBuildings.insert(buildingID);
for(int i=0;i<7;i++)
gs->players[player].resources[i]-=b->resources[i];
t->builded++;
return true;
}
int CCallback::battleGetBattlefieldType()
{
return CGI->mh->ttiles[CGI->state->curB->tile.x][CGI->state->curB->tile.y][CGI->state->curB->tile.z].terType;

@ -92,6 +92,7 @@ public:
bool dismissHero(const CGHeroInstance * hero);
const CCreatureSet* getGarrison(const CGObjectInstance *obj);
bool swapArifacts(const CGHeroInstance * hero1, bool worn1, int pos1, const CGHeroInstance * hero2, bool worn2, int pos2);
bool buildBuilding(const CGTownInstance *town, int buildingID);
//battle
int battleGetBattlefieldType(); // 1. sand/shore 2. sand/mesas 3. dirt/birches 4. dirt/hills 5. dirt/pines 6. grass/hills 7. grass/pines 8. lava 9. magic plains 10. snow/mountains 11. snow/trees 12. subterranean 13. swamp/trees 14. fiery fields 15. rock lands 16. magic clouds 17. lucid pools 18. holy ground 19. clover field 20. evil fog 21. "favourable winds" text on magic plains background 22. cursed ground 23. rough 24. ship to ship 25. ship
int battleGetObstaclesAtTile(int tile); //returns bitfield

@ -11,6 +11,7 @@
#include <sstream>
#include "CMessage.h"
#include "hch/CGeneralTextHandler.h"
extern TTF_Font * GEOR16;
CBuildingRect::CBuildingRect(Structure *Str)
:str(Str)
{
@ -539,6 +540,7 @@ void CHallInterface::CResDataBar::show(SDL_Surface * to)
CHallInterface::CResDataBar::CResDataBar()
{
bg = CGI->bitmaph->loadBitmap("Z2ESBAR.bmp");
SDL_SetColorKey(bg,SDL_SRCCOLORKEY,SDL_MapRGB(bg->format,0,255,255));
CSDL_Ext::blueToPlayersAdv(bg,LOCPLINT->playerID);
pos.x = 7;
pos.y = 575;
@ -557,7 +559,7 @@ void CHallInterface::CBuildingBox::hover(bool on)
{
std::string toPrint = CGI->townh->hcommands[state];
std::vector<std::string> name;
name.push_back(CGI->buildh->buildings[LOCPLINT->castleInt->town->subID][ID]->name);
name.push_back(CGI->buildh->buildings[LOCPLINT->castleInt->town->subID][BID]->name);
LOCPLINT->statusbar->print(CSDL_Ext::processStr(toPrint,name));
}
else
@ -565,13 +567,25 @@ void CHallInterface::CBuildingBox::hover(bool on)
}
void CHallInterface::CBuildingBox::clickLeft (tribool down)
{
if(pressedL && (!down))
{
LOCPLINT->castleInt->hallInt->deactivate();
new CHallInterface::CBuildWindow(LOCPLINT->castleInt->town->subID,BID,state,0);
}
ClickableL::clickLeft(down);
}
void CHallInterface::CBuildingBox::clickRight (tribool down)
{
if(down)
{
LOCPLINT->castleInt->hallInt->deactivate();
new CHallInterface::CBuildWindow(LOCPLINT->castleInt->town->subID,BID,state,1);
}
ClickableR::clickRight(down);
}
void CHallInterface::CBuildingBox::show(SDL_Surface * to)
{
blitAt(LOCPLINT->castleInt->bicons->ourImages[ID].bitmap,pos.x,pos.y);
blitAt(LOCPLINT->castleInt->bicons->ourImages[BID].bitmap,pos.x,pos.y);
int pom, pom2=-1;
switch (state)
{
@ -597,7 +611,7 @@ void CHallInterface::CBuildingBox::show(SDL_Surface * to)
blitAt(LOCPLINT->castleInt->hallInt->bars->ourImages[pom].bitmap,pos.x-1,pos.y+71);
if(pom2>=0)
blitAt(LOCPLINT->castleInt->hallInt->status->ourImages[pom2].bitmap,pos.x+135, pos.y+54);
CSDL_Ext::printAtMiddle(CGI->buildh->buildings[LOCPLINT->castleInt->town->subID][ID]->name,pos.x-1+LOCPLINT->castleInt->hallInt->bars->ourImages[0].bitmap->w/2,pos.y+71+LOCPLINT->castleInt->hallInt->bars->ourImages[0].bitmap->h/2, GEOR13,zwykly);
CSDL_Ext::printAtMiddle(CGI->buildh->buildings[LOCPLINT->castleInt->town->subID][BID]->name,pos.x-1+LOCPLINT->castleInt->hallInt->bars->ourImages[0].bitmap->w/2,pos.y+71+LOCPLINT->castleInt->hallInt->bars->ourImages[0].bitmap->h/2, GEOR13,zwykly);
}
void CHallInterface::CBuildingBox::activate()
{
@ -615,13 +629,13 @@ CHallInterface::CBuildingBox::~CBuildingBox()
{
}
CHallInterface::CBuildingBox::CBuildingBox(int id)
:ID(id)
:BID(id)
{
pos.w = 150;
pos.h = 70;
}
CHallInterface::CBuildingBox::CBuildingBox(int id, int x, int y)
:ID(id)
:BID(id)
{
pos.x = x;
pos.y = y;
@ -638,6 +652,8 @@ CHallInterface::CHallInterface(CCastleInterface * owner)
status = CGI->spriteh->giveDefEss("TPTHCHK.DEF");
exit = new AdventureMapButton<CHallInterface>
(CGI->townh->tcommands[8],"",&CHallInterface::close,748,556,"TPMAGE1.DEF",this,false,NULL,false);
//preparing boxes with buildings//
boxes.resize(5);
for(int i=0;i<5;i++) //for each row
{
@ -666,8 +682,17 @@ CHallInterface::CHallInterface(CCastleInterface * owner)
if(owner->town->forbiddenBuildings.find(CGI->buildh->hall[owner->town->subID].second[i][j][k])!=owner->town->forbiddenBuildings.end())
boxes[i][boxes[i].size()-1]->state = 2; //forbidden
else if(owner->town->builded >= MAX_BUILDING_PER_TURN)
boxes[i][boxes[i].size()-1]->state = 4; //already built
boxes[i][boxes[i].size()-1]->state = 5; //already built
//checking resources
CBuilding * pom = CGI->buildh->buildings[owner->town->subID][CGI->buildh->hall[owner->town->subID].second[i][j][k]];
for(int res=0;res<7;res++) //TODO: support custom amount of resources
{
if(pom->resources[res]>LOCPLINT->cb->getResourceAmount(res))
boxes[i][boxes[i].size()-1]->state = 6; //lack of res
}
//checking for requirements
for( std::set<int>::iterator ri = CGI->townh->requirements[owner->town->subID][ID].begin();
ri != CGI->townh->requirements[owner->town->subID][ID].end();
ri++ )
@ -679,13 +704,6 @@ CHallInterface::CHallInterface(CCastleInterface * owner)
//TODO: check if capital is already built, check if there is water for shipyard
CBuilding * pom = CGI->buildh->buildings[owner->town->subID][CGI->buildh->hall[owner->town->subID].second[i][j][k]];
for(int res=0;res<7;res++) //TODO: support custom amount of resources
{
if(pom->resources[res]>LOCPLINT->cb->getResourceAmount(res))
boxes[i][boxes[i].size()-1]->state = 6; //lack of res
}
break;
@ -746,7 +764,6 @@ void CHallInterface::deactivate()
for(int j=0;j<boxes[i].size();j++)
{
boxes[i][j]->deactivate();
delete boxes[i][j];
}
}
exit->deactivate();
@ -754,19 +771,101 @@ void CHallInterface::deactivate()
void CHallInterface::CBuildWindow::activate()
{
buy->activate();
cancel->activate();
ClickableR::activate();
LOCPLINT->objsToBlit.push_back(this);
}
void CHallInterface::CBuildWindow::deactivate()
{
buy->deactivate();
cancel->deactivate();
ClickableR::deactivate();
LOCPLINT->objsToBlit.erase(std::find(LOCPLINT->objsToBlit.begin(),LOCPLINT->objsToBlit.end(),this));
}
void CHallInterface::CBuildWindow::Buy()
{
LOCPLINT->cb->buildBuilding(LOCPLINT->castleInt->town,bid);
close();
}
void CHallInterface::CBuildWindow::close()
{
deactivate();
delete this;
LOCPLINT->castleInt->hallInt->activate();
LOCPLINT->castleInt->hallInt->show();
}
void CHallInterface::CBuildWindow::clickRight (tribool down)
{
if((!down || indeterminate(down)) && mode)
close();
}
void CHallInterface::CBuildWindow::show(SDL_Surface * to)
{
SDL_Rect pom = genRect(bitmap->h-1,bitmap->w-1,pos.x,pos.y);
SDL_Rect poms = pom; poms.x=0;poms.y=0;
SDL_BlitSurface(bitmap,&poms,to?to:ekran,&pom);
buy->show();
cancel->show();
}
std::string getTextForState(int state)
{
if(state<7)
return CGI->townh->hcommands[state];
switch (state)
{
case 7:
return CGI->generaltexth->allTexts[219]; //all prereq. are met
default:
return "Error, wrong state!";
}
}
CHallInterface::CBuildWindow::CBuildWindow(int Tid, int Bid, int State, bool Mode)
:tid(Tid),bid(Bid),mode(Mode), state(State)
{
bitmap = CGI->bitmaph->loadBitmap("TPUBUILD.bmp");
SDL_Surface *hhlp = CGI->bitmaph->loadBitmap("TPUBUILD.bmp");
bitmap = SDL_ConvertSurface(hhlp,ekran->format,0); //na 8bitowej mapie by sie psulo
SDL_SetColorKey(hhlp,SDL_SRCCOLORKEY,SDL_MapRGB(hhlp->format,0,255,255));
SDL_FreeSurface(hhlp);
pos.x = ekran->w/2 - bitmap->w/2;
pos.y = ekran->h/2 - bitmap->h/2;
CSDL_Ext::blueToPlayersAdv(bitmap,LOCPLINT->playerID);
blitAt(LOCPLINT->castleInt->bicons->ourImages[bid].bitmap,125,50,bitmap);
std::vector<std::string> pom; pom.push_back(CGI->buildh->buildings[tid][bid]->name);
CSDL_Ext::printAtMiddleWB(CGI->buildh->buildings[tid][bid]->description,197,168,GEOR16,40,zwykly,bitmap);
CSDL_Ext::printAtMiddleWB(getTextForState(state),197,248,GEOR13,50,zwykly,bitmap);
CSDL_Ext::printAtMiddle(CSDL_Ext::processStr(CGI->townh->hcommands[7],pom),197,30,GEOR16,tytulowy,bitmap);
int resamount=0; for(int i=0;i<7;i++) if(CGI->buildh->buildings[tid][bid]->resources[i]) resamount++;
int ah = (resamount>4) ? 304 : 341;
int cn=-1, it=0;
int row1w = std::min(resamount,4) * 32 + (std::min(resamount,4)-1) * 45,
row2w = (resamount-4) * 32 + (resamount-5) * 45;
char buf[15];
while(++cn<7)
{
if(!CGI->buildh->buildings[tid][bid]->resources[cn])
continue;
itoa(CGI->buildh->buildings[tid][bid]->resources[cn],buf,10);
if(it<4)
{
CSDL_Ext::printAtMiddle(buf,(bitmap->w/2-row1w/2)+77*it+16,ah+42,GEOR16,zwykly,bitmap);
blitAt(CGI->townh->resources->ourImages[cn].bitmap,(bitmap->w/2-row1w/2)+77*it++,ah,bitmap);
}
else
{
CSDL_Ext::printAtMiddle(buf,(bitmap->w/2-row2w/2)+77*it+16-308,ah+42,GEOR16,zwykly,bitmap);
blitAt(CGI->townh->resources->ourImages[cn].bitmap,(bitmap->w/2-row2w/2)+77*it++ - 308,ah,bitmap);
}
if(it==4)
ah+=75;
}
buy = new AdventureMapButton<CBuildWindow>("","",&CBuildWindow::Buy,pos.x+45,pos.y+446,"IBUY30.DEF",this,true,NULL,false);
cancel = new AdventureMapButton<CBuildWindow>("","",&CBuildWindow::close,pos.x+290,pos.y+445,"ICANCEL.DEF",this,true,NULL,false);
activate();
}
CHallInterface::CBuildWindow::~CBuildWindow()
{
SDL_FreeSurface(bitmap);
delete buy;
delete cancel;
}

@ -75,7 +75,7 @@ public:
class CBuildingBox : public Hoverable, public ClickableL, public ClickableR
{
public:
int ID;
int BID;
int state;// 0 - no more than one capitol, 1 - lack of water, 2 - forbidden, 3 - Add another level to Mage Guild, 4 - already built, 5 - cannot build, 6 - cannot afford, 7 - build
//(-1) - forbidden in this town, 0 - possible, 1 - lack of res, 2 - requirements/buildings per turn limit, (3) - already exists
void hover(bool on);
@ -89,16 +89,20 @@ public:
~CBuildingBox();
};
class CBuildWindow: public IShowable, public CIntObject
class CBuildWindow: public IShowable, public ClickableR
{
public:
int tid, bid, state; //town id, building id, state
bool mode; // 0 - normal (with buttons), 1 - r-click popup
SDL_Surface * bitmap; //main window bitmap, with blitted res/text, without buttons/subtitle in "statusbar"
AdventureMapButton<CBuildWindow> *buy, *cancel;
void activate();
void deactivate();
void clickRight (tribool down);
void show(SDL_Surface * to=NULL);
void Buy();
void close();
CBuildWindow(int Tid, int Bid, int State, bool Mode);
~CBuildWindow();
};

@ -729,6 +729,13 @@ ClickableR::ClickableR()
{
pressedR=false;
}
void ClickableR::clickRight(tribool down)
{
if (down)
pressedR=true;
else
pressedR=false;
}
void ClickableR::activate()
{
LOCPLINT->rclickable.push_back(this);

@ -1,4 +1,4 @@
2
5
0
1 0
2 1

@ -166,7 +166,7 @@ void CBuildingHandler::loadBuildings()
it = last + 1;
ss >> last;
(hall[tid].second)[j][box].push_back(last);
areboxes = it; //wyzeruje jak nie znajdzie kolejnej zpasji = koniec linii
areboxes = it; //wyzeruje jak nie znajdzie kolejnej spacji = koniec linii
if(!it)
it = seppos+1;
}

@ -25,8 +25,8 @@ namespace NLoadHandlerHelp
struct Entry
{
unsigned char name[12], //filename
hlam_1[4], //
hlam_2[4]; //
hlam_1[4], //???
hlam_2[4]; //probably type of file
std::string nameStr;
int offset, //from beginning
realSize, //size without compression

@ -7,6 +7,7 @@
CTownHandler::CTownHandler()
{
smallIcons = CGI->spriteh->giveDef("ITPA.DEF");
resources = CGI->spriteh->giveDef("RESOURCE.DEF");
}
CTownHandler::~CTownHandler()
{
@ -236,7 +237,7 @@ void CTownHandler::loadNames()
of >> town;
while(true)
{
of.getline(bufname,75);
of.getline(bufname,75);if(!(*bufname))of.getline(bufname,75);
std::istringstream ifs(bufname);
ifs >> build;
if(build<0)

@ -39,8 +39,8 @@ struct Structure
class CTownHandler
{
CDefHandler * smallIcons;
public:
CDefHandler * smallIcons, *resources; //resources 32x32
CTownHandler();
~CTownHandler();
std::vector<CTown> towns;