1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-24 22:14:36 +02:00

Fixing buildings in castle and related improvements.

This commit is contained in:
Michał W. Urbańczyk 2008-01-19 11:55:04 +00:00
parent 4b772315bb
commit 2e25e040d5
8 changed files with 177 additions and 29 deletions

View File

@ -8,6 +8,57 @@
#include "hch/CTownHandler.h" #include "hch/CTownHandler.h"
#include "AdventureMapButton.h" #include "AdventureMapButton.h"
#include <sstream> #include <sstream>
CBuildingRect::CBuildingRect(Structure *Str)
:str(Str)
{
def = CGI->spriteh->giveDef(Str->defName);
border = area = NULL;
pos.x = str->pos.x;
pos.y = str->pos.y;
pos.w = def->ourImages[0].bitmap->w;
pos.h = def->ourImages[0].bitmap->h;
}
CBuildingRect::~CBuildingRect()
{
delete def;
if(border)
SDL_FreeSurface(border);
if(area)
SDL_FreeSurface(area);
}
void CBuildingRect::activate()
{
MotionInterested::activate();
ClickableL::activate();
ClickableR::activate();
}
void CBuildingRect::deactivate()
{
MotionInterested::deactivate();
ClickableL::deactivate();
ClickableR::deactivate();
}
bool CBuildingRect::operator<(const CBuildingRect & p2) const
{
if(str->pos.z != p2.str->pos.z)
return (str->pos.z) < (p2.str->pos.z);
else
return (str->ID) < (p2.str->ID);
}
void CBuildingRect::mouseMoved (SDL_MouseMotionEvent & sEvent)
{
//todo - handle
}
void CBuildingRect::clickLeft (tribool down)
{
//todo - handle
}
void CBuildingRect::clickRight (tribool down)
{
//todo - handle
}
std::string getBgName(int type) //TODO - co z tym zrobiæ? std::string getBgName(int type) //TODO - co z tym zrobiæ?
{ {
switch (type) switch (type)
@ -38,10 +89,10 @@ class SORTHELP
{ {
public: public:
bool operator () bool operator ()
(const boost::tuples::tuple<int,CDefHandler*,Structure*,SDL_Surface*,SDL_Surface*> *a , (const CBuildingRect *a ,
const boost::tuples::tuple<int,CDefHandler*,Structure*,SDL_Surface*,SDL_Surface*> *b) const CBuildingRect *b)
{ {
return (a->get<0>())<(b->get<0>()); return (*a)<(*b);
} }
} srthlp ; } srthlp ;
@ -55,7 +106,8 @@ CCastleInterface::CCastleInterface(const CGTownInstance * Town, bool Activate)
bigTownPic = CGI->spriteh->giveDef("ITPT.DEF"); bigTownPic = CGI->spriteh->giveDef("ITPT.DEF");
flag = CGI->spriteh->giveDef("CREST58.DEF"); flag = CGI->spriteh->giveDef("CREST58.DEF");
CSDL_Ext::blueToPlayersAdv(townInt,LOCPLINT->playerID); CSDL_Ext::blueToPlayersAdv(townInt,LOCPLINT->playerID);
exit = new AdventureMapButton<CCastleInterface>(CGI->townh->tcommands[8],"",&CCastleInterface::close,744,544,"TSBTNS.DEF",this,Activate); exit = new AdventureMapButton<CCastleInterface>
(CGI->townh->tcommands[8],"",&CCastleInterface::close,744,544,"TSBTNS.DEF",this,Activate);
exit->bitmapOffset = 4; exit->bitmapOffset = 4;
for (std::set<int>::const_iterator i=town->builtBuildings.begin();i!=town->builtBuildings.end();i++) for (std::set<int>::const_iterator i=town->builtBuildings.begin();i!=town->builtBuildings.end();i++)
@ -64,12 +116,13 @@ CCastleInterface::CCastleInterface(const CGTownInstance * Town, bool Activate)
{ {
if(CGI->townh->structures[town->subID].find(*i)!=CGI->townh->structures[town->subID].end()) if(CGI->townh->structures[town->subID].find(*i)!=CGI->townh->structures[town->subID].end())
{ {
CDefHandler *b = CGI->spriteh->giveDef(CGI->townh->structures[town->subID][*i]->defName); //CDefHandler *b = CGI->spriteh->giveDef(CGI->townh->structures[town->subID][*i]->defName);
boost::tuples::tuple<int,CDefHandler*,Structure*,SDL_Surface*,SDL_Surface*> *t buildings.push_back(new CBuildingRect(CGI->townh->structures[town->subID][*i]));
= new boost::tuples::tuple<int,CDefHandler*,Structure*,SDL_Surface*,SDL_Surface*> //boost::tuples::tuple<int,CDefHandler*,Structure*,SDL_Surface*,SDL_Surface*> *t
(*i,b,CGI->townh->structures[town->subID][*i],NULL,NULL); // = new boost::tuples::tuple<int,CDefHandler*,Structure*,SDL_Surface*,SDL_Surface*>
//TODO: obwódki i pola // (*i,b,CGI->townh->structures[town->subID][*i],NULL,NULL);
buildings.push_back(t); ////TODO: obwódki i pola
//buildings.push_back(t);
} }
else continue; else continue;
} }
@ -97,14 +150,6 @@ CCastleInterface::~CCastleInterface()
for(int i=0;i<buildings.size();i++) for(int i=0;i<buildings.size();i++)
{ {
if (buildings[i]->get<1>())
delete (buildings[i]->get<1>());
//if (buildings[i]->get<2>())
// delete (buildings[i]->get<2>());
if (buildings[i]->get<3>())
SDL_FreeSurface(buildings[i]->get<3>());
if (buildings[i]->get<4>())
SDL_FreeSurface(buildings[i]->get<4>());
delete buildings[i]; delete buildings[i];
} }
@ -185,7 +230,11 @@ void CCastleInterface::show()
//flag //flag
blitAt(flag->ourImages[town->getOwner()].bitmap,241,387); blitAt(flag->ourImages[town->getOwner()].bitmap,241,387);
//print garrison //print garrison
for(std::map<int,std::pair<CCreature*,int> >::const_iterator i=town->garrison.slots.begin();i!=town->garrison.slots.end();i++) for(
std::map<int,std::pair<CCreature*,int> >::const_iterator i=town->garrison.slots.begin();
i!=town->garrison.slots.end();
i++
)
{ {
blitAt(CGI->creh->bigImgs[i->second.first->idNumber],305+(62*(i->first)),387); blitAt(CGI->creh->bigImgs[i->second.first->idNumber],305+(62*(i->first)),387);
itoa(i->second.second,temp,10); itoa(i->second.second,temp,10);
@ -195,12 +244,14 @@ void CCastleInterface::show()
//blit buildings //blit buildings
for(int i=0;i<buildings.size();i++) for(int i=0;i<buildings.size();i++)
{ {
blitAt(buildings[i]->get<1>()->ourImages[0].bitmap,buildings[i]->get<2>()->x,buildings[i]->get<2>()->y); blitAt(buildings[i]->def->ourImages[0].bitmap,buildings[i]->pos.x,buildings[i]->pos.y);
} }
} }
void CCastleInterface::activate() void CCastleInterface::activate()
{ {
//for(int i=0;i<buildings.size();i++)
// buildings[i]->activate();
} }
void CCastleInterface::deactivate() void CCastleInterface::deactivate()
{ {

View File

@ -2,16 +2,26 @@
#include "global.h" #include "global.h"
#include "SDL.h" #include "SDL.h"
#include "CPlayerInterface.h" #include "CPlayerInterface.h"
#include "boost/tuple/tuple.hpp" //#include "boost/tuple/tuple.hpp"
class CGTownInstance; class CGTownInstance;
class CTownHandler; class CTownHandler;
struct Structure; struct Structure;
template <typename T> class AdventureMapButton; template <typename T> class AdventureMapButton;
class CBuildingRect : public MotionInterested, public ClickableL, public ClickableR//, public TimeInterested class CBuildingRect : public MotionInterested, public ClickableL, public ClickableR//, public TimeInterested
{ {
public:
Structure* str;
CDefHandler* def;
SDL_Surface* border;
SDL_Surface* area;
CBuildingRect(Structure *Str);
~CBuildingRect();
void activate(); void activate();
void deactivate(); void deactivate();
bool operator<(const CBuildingRect & p2) const;
void mouseMoved (SDL_MouseMotionEvent & sEvent);
void clickLeft (tribool down);
void clickRight (tribool down);
}; };
class CCastleInterface class CCastleInterface
@ -26,7 +36,7 @@ public:
AdventureMapButton<CCastleInterface> * exit; AdventureMapButton<CCastleInterface> * exit;
std::vector<boost::tuples::tuple<int,CDefHandler*,Structure*,SDL_Surface*,SDL_Surface*> *> buildings; //building id, building def, structure struct, border, filling std::vector<CBuildingRect*> buildings; //building id, building def, structure struct, border, filling
CCastleInterface(const CGTownInstance * Town, bool Activate=true); CCastleInterface(const CGTownInstance * Town, bool Activate=true);
~CCastleInterface(); ~CCastleInterface();

View File

@ -5,7 +5,7 @@
0 6 TBCSDOCK.def 478 134 0 6 TBCSDOCK.def 478 134
0 30 TBCSDW_0.def 304 92 0 30 TBCSDW_0.def 304 92
0 31 TBCSDW_1.def 360 130 0 31 TBCSDW_1.def 360 130
0 32 TBCSDW_2.def 363 130 0 32 TBCSDW_2.def 76 57
0 33 TBCSDW_3.def 176 101 0 33 TBCSDW_3.def 176 101
0 34 TBCSDW_4.def 563 211 0 34 TBCSDW_4.def 563 211
0 35 TBCSDW_5.def 174 190 0 35 TBCSDW_5.def 174 190

38
config/buildings2.txt Normal file
View File

@ -0,0 +1,38 @@
0 0
CASTLE 0
0
1
2
3
4
10
11
12
13
5
22
30
37
END
EOD
------------------------------------------------------------------
//File format:
0 0 //for further use - format version and ID mode
CASTLE [Castle ID]
[ID] //Building showed on the top (blitted later)
[ID] //Building showed later...
...
[ID] //even later...
END //end of buildings for this castle
[...] //info for more castles
EOD
Buildings not mentioned in the file will be blitted as first. File can contain data for any count of castles.

View File

@ -1794,6 +1794,18 @@ void CAmbarCendamo::deh3m()
}//else if (ir==5) }//else if (ir==5)
} }
} }
//testowe zczytywanie h3mowych ID
for(int byte=0;byte<6;byte++)
{
for(int bit=0;bit<8;bit++)
{
if(spec->buildingSettings[byte] & (1<<bit))
{
nt->h3mbuildings.insert(byte*8+bit);
}
}
}
} }
else else
{ {

View File

@ -431,7 +431,7 @@ public:
int income; int income;
//TODO: //TODO:
std::set<int> possibleBuildings, builtBuildings; std::set<int> possibleBuildings, builtBuildings, h3mbuildings;
std::vector<int> creatureIncome; //vector by level std::vector<int> creatureIncome; //vector by level
std::vector<int> creaturesLeft; //that can be recruited std::vector<int> creaturesLeft; //that can be recruited

View File

@ -45,7 +45,7 @@ void CTownHandler::loadNames()
tcommands.push_back(tmp); tcommands.push_back(tmp);
} }
//read buildings coords
std::ifstream of("config/buildings.txt"); std::ifstream of("config/buildings.txt");
while(!of.eof()) while(!of.eof())
{ {
@ -53,10 +53,45 @@ void CTownHandler::loadNames()
of >> vinya->townID; of >> vinya->townID;
of >> vinya->ID; of >> vinya->ID;
of >> vinya->defName; of >> vinya->defName;
of >> vinya->x; of >> vinya->pos.x;
of >> vinya->y; of >> vinya->pos.y;
vinya->pos.z = 0;
structures[vinya->townID][vinya->ID] = vinya; structures[vinya->townID][vinya->ID] = vinya;
} }
of.close();
of.clear();
//read building priorities
of.open("config/buildings2.txt");
int format, idt;
std::string s;
of >> format >> idt;
while(!of.eof())
{
std::map<int,std::map<int, Structure*> >::iterator i;
std::map<int, Structure*>::iterator i2;
int itr=1, buildingID;
int castleID;
of >> s;
if (s != "CASTLE")
break;
of >> castleID;
while(1)
{
of >> s;
if (s == "END")
break;
else
if((i=structures.find(castleID))!=structures.end())
if((i2=(i->second.find(buildingID=atoi(s.c_str()))))!=(i->second.end()))
i2->second->pos.z=itr++;
else
std::cout << "Warning: No building "<<buildingID<<" in the castle "<<castleID<<std::endl;
else
std::cout << "Warning: Castle "<<castleID<<" not defined."<<std::endl;
}
}
of.close();
} }
SDL_Surface * CTownHandler::getPic(int ID, bool fort, bool builded) SDL_Surface * CTownHandler::getPic(int ID, bool fort, bool builded)

View File

@ -25,8 +25,10 @@ public:
struct Structure struct Structure
{ {
int ID;
int3 pos;
std::string defName; std::string defName;
int ID, townID, x, y; int townID;
}; };
class CTownHandler class CTownHandler