1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-07-15 01:24:45 +02:00

* next part of thieves' guild window

This commit is contained in:
mateuszb
2010-02-01 17:51:33 +00:00
parent 94fa59cf45
commit f5a719c2da
6 changed files with 164 additions and 7 deletions

View File

@ -135,6 +135,23 @@ int CCallback::estimateSpellDamage(const CSpell * sp) const
return gs->curB->calculateSpellDmg(sp, ourHero, NULL); return gs->curB->calculateSpellDmg(sp, ourHero, NULL);
} }
void CCallback::getThievesGuildInfo(SThievesGuildInfo & thi, const CGObjectInstance * obj)
{
boost::shared_lock<boost::shared_mutex> lock(*gs->mx);
if(obj == NULL)
return;
if(obj->ID == TOWNI_TYPE) //it is a town
{
gs->obtainPlayersStats(thi, gs->players[player].towns.size());
}
else if(obj->ID == 97) //Den of Thieves
{
gs->obtainPlayersStats(thi, 20);
}
}
int CCallback::howManyTowns() const int CCallback::howManyTowns() const
{ {
boost::shared_lock<boost::shared_mutex> lock(*gs->mx); boost::shared_lock<boost::shared_mutex> lock(*gs->mx);

View File

@ -132,6 +132,7 @@ public:
virtual const CMapHeader * getMapHeader()const =0; virtual const CMapHeader * getMapHeader()const =0;
virtual int getSpellCost(const CSpell * sp, const CGHeroInstance * caster) const =0; //when called during battle, takes into account creatures' spell cost reduction virtual int getSpellCost(const CSpell * sp, const CGHeroInstance * caster) const =0; //when called during battle, takes into account creatures' spell cost reduction
virtual int estimateSpellDamage(const CSpell * sp) const =0; //estimates damage of given spell; returns 0 if spell causes no dmg virtual int estimateSpellDamage(const CSpell * sp) const =0; //estimates damage of given spell; returns 0 if spell causes no dmg
virtual void getThievesGuildInfo(SThievesGuildInfo & thi, const CGObjectInstance * obj)=0; //get thieves' guild info obtainable while visiting given object
//hero //hero
virtual int howManyHeroes(bool includeGarrisoned = true)const =0; virtual int howManyHeroes(bool includeGarrisoned = true)const =0;
@ -264,6 +265,7 @@ public:
const CMapHeader * getMapHeader()const ; const CMapHeader * getMapHeader()const ;
int getSpellCost(const CSpell * sp, const CGHeroInstance * caster) const; //when called during battle, takes into account creatures' spell cost reduction int getSpellCost(const CSpell * sp, const CGHeroInstance * caster) const; //when called during battle, takes into account creatures' spell cost reduction
int estimateSpellDamage(const CSpell * sp) const; //estimates damage of given spell; returns 0 if spell causes no dmg int estimateSpellDamage(const CSpell * sp) const; //estimates damage of given spell; returns 0 if spell causes no dmg
void getThievesGuildInfo(SThievesGuildInfo & thi, const CGObjectInstance * obj); //get thieves' guild info obtainable while visiting given object
std::vector < const CGObjectInstance * > getBlockingObjs(int3 pos) const; std::vector < const CGObjectInstance * > getBlockingObjs(int3 pos) const;
std::vector < const CGObjectInstance * > getVisitableObjs(int3 pos) const; std::vector < const CGObjectInstance * > getVisitableObjs(int3 pos) const;

View File

@ -3098,7 +3098,7 @@ void CTavernWindow::recruitb()
void CTavernWindow::thievesguildb() void CTavernWindow::thievesguildb()
{ {
GH.pushInt(new CThievesGuildWindow()); GH.pushInt( new CThievesGuildWindow(LOCPLINT->castleInt->town) );
} }
CTavernWindow::~CTavernWindow() CTavernWindow::~CTavernWindow()
@ -4774,8 +4774,12 @@ void CThievesGuildWindow::bexitf()
GH.popIntTotally(this); GH.popIntTotally(this);
} }
CThievesGuildWindow::CThievesGuildWindow() CThievesGuildWindow::CThievesGuildWindow(const CGObjectInstance * _owner)
:owner(_owner)
{ {
SThievesGuildInfo tgi; //info to be displayed
LOCPLINT->cb->getThievesGuildInfo(tgi, owner);
pos = Rect( (conf.cc.resx - 800) / 2, (conf.cc.resy - 600) / 2, 800, 600 ); pos = Rect( (conf.cc.resx - 800) / 2, (conf.cc.resy - 600) / 2, 800, 600 );
//loading backround and converting to more bpp form //loading backround and converting to more bpp form
@ -4794,15 +4798,15 @@ CThievesGuildWindow::CThievesGuildWindow()
for(int g=0; g<12; ++g) for(int g=0; g<12; ++g)
{ {
int y; int y;
if(g == 9) if(g == 9) //best hero
{ {
y = 400; y = 400;
} }
else if(g == 10) else if(g == 10) //personality
{ {
y = 460; y = 460;
} }
else if(g == 11) else if(g == 11) //best monster
{ {
y = 510; y = 510;
} }
@ -4813,10 +4817,24 @@ CThievesGuildWindow::CThievesGuildWindow()
printAtMiddle(CGI->generaltexth->jktexts[24+g], 135, y, FONT_MEDIUM, tytulowy, background); printAtMiddle(CGI->generaltexth->jktexts[24+g], 135, y, FONT_MEDIUM, tytulowy, background);
} }
for(int g=0; g<8; ++g) CDefHandler * strips = CDefHandler::giveDef("PRSTRIPS.DEF");
static const std::string colorToBox[] = {"PRRED.BMP", "PRBLUE.BMP", "PRTAN.BMP", "PRGREEN.BMP", "PRORANGE.BMP", "PRPURPLE.BMP", "PRTEAL.BMP", "PRPINK.BMP"};
for(int g=0; g<tgi.playerColors.size(); ++g)
{ {
if(g > 0)
{
blitAt(strips->ourImages[g-1].bitmap, 250 + 66*g, 7, background);
}
printAtMiddle(CGI->generaltexth->jktexts[16+g], 283 + 66*g, 20, FONT_MEDIUM, tytulowy, background); printAtMiddle(CGI->generaltexth->jktexts[16+g], 283 + 66*g, 20, FONT_MEDIUM, tytulowy, background);
SDL_Surface * box = BitmapHandler::loadBitmap(colorToBox[tgi.playerColors[g]]);
blitAt(box, 253 + 66*g, 334, background);
SDL_FreeSurface(box);
} }
delete strips;
} }
CThievesGuildWindow::~CThievesGuildWindow() CThievesGuildWindow::~CThievesGuildWindow()

View File

@ -829,6 +829,8 @@ class CHillFortWindow : public CIntObject //garrison dialog? shop?
class CThievesGuildWindow : public CIntObject class CThievesGuildWindow : public CIntObject
{ {
const CGObjectInstance * owner;
CStatusBar * statusBar; CStatusBar * statusBar;
AdventureMapButton * exitb; AdventureMapButton * exitb;
SDL_Surface * background; SDL_Surface * background;
@ -841,7 +843,7 @@ public:
void bexitf(); void bexitf();
CThievesGuildWindow(); CThievesGuildWindow(const CGObjectInstance * _owner);
~CThievesGuildWindow(); ~CThievesGuildWindow();
}; };

View File

@ -3089,6 +3089,107 @@ bool CGameState::checkForStandardLoss( ui8 player ) const
return !p.heroes.size() && !p.towns.size(); return !p.heroes.size() && !p.towns.size();
} }
void CGameState::obtainPlayersStats(SThievesGuildInfo & tgi, int level)
{
struct HLP
{
typedef std::pair< ui8, si64 > TStat;
//converts [<player's color, value>] to vec[place] -> platers
static std::vector< std::list< ui8 > > getRank( std::vector<TStat> stats )
{
std::sort(stats.begin(), stats.end(), HLP());
//put first element
std::vector< std::list<ui8> > ret;
std::list<ui8> tmp;
tmp.push_back( stats[0].first );
ret.push_back( tmp );
//the rest of elements
for(int g=1; g<stats.size(); ++g)
{
if(stats[g].second == stats[g-1].second)
{
(ret.end()-1)->push_back( stats[g].first );
}
else
{
//create next occupied rank
std::list<ui8> tmp;
tmp.push_back(stats[g].first);
ret.push_back(tmp);
}
}
return ret;
}
bool operator()(const TStat & a, const TStat & b) const
{
return a.second > b.second;
}
};
#define FILL_FIELD(FIELD, VAL_GETTER) \
{ \
std::vector< std::pair< ui8, si64 > > stats; \
for(std::map<ui8, PlayerState>::const_iterator g = players.begin(); g != players.end(); ++g) \
{ \
if(g->second.color == 255) \
continue; \
std::pair< ui8, si64 > stat; \
stat.first = g->second.color; \
stat.second = VAL_GETTER; \
stats.push_back(stat); \
} \
tgi.FIELD = HLP::getRank(stats); \
}
for(std::map<ui8, PlayerState>::const_iterator g = players.begin(); g != players.end(); ++g)
{
if(g->second.color != 255)
tgi.playerColors.push_back(g->second.color);
}
if(level >= 1) //num of towns & num of heroes
{
//num of towns
FILL_FIELD(numOfTowns, g->second.towns.size())
//num of heroes
FILL_FIELD(numOfHeroes, g->second.heroes.size())
}
if(level >= 2) //gold
{
FILL_FIELD(gold, g->second.resources[6])
}
if(level >= 2) //wood & ore
{
FILL_FIELD(woodOre, g->second.resources[0] + g->second.resources[1])
}
if(level >= 3) //mercury, sulfur, crystal, gems
{
FILL_FIELD(woodOre, g->second.resources[2] + g->second.resources[3] + g->second.resources[4] + g->second.resources[5])
}
if(level >= 4) //obelisks found
{
//TODO
}
if(level >= 5) //artifacts
{
//TODO
}
if(level >= 6) //army strength
{
//TODO
}
if(level >= 7) //income
{
//TODO
}
#undef FILL_FIELD
}
int CGameState::lossCheck( ui8 player ) const int CGameState::lossCheck( ui8 player ) const
{ {
const PlayerState *p = getPlayer(player); const PlayerState *p = getPlayer(player);

View File

@ -9,6 +9,7 @@
#endif #endif
#include <set> #include <set>
#include <vector> #include <vector>
#include <list>
#include "StackFeature.h" #include "StackFeature.h"
#ifdef _WIN32 #ifdef _WIN32
#include <tchar.h> #include <tchar.h>
@ -57,6 +58,21 @@ namespace boost
class shared_mutex; class shared_mutex;
} }
struct DLL_EXPORT SThievesGuildInfo
{
std::vector<ui8> playerColors; //colors of players that are in-game
std::vector< std::list< ui8 > > numOfTowns, numOfHeroes, gold, woodOre, mercSulfCrystGems, obelisks, artifacts, army, income; // [place] -> [colours of players]
//TODO: best hero, personality, best monster
template <typename Handler> void serialize(Handler &h, const int version)
{
h & playerColors & numOfTowns & numOfHeroes & gold & woodOre & mercSulfCrystGems & obelisks & artifacts & army & income;
}
};
struct DLL_EXPORT PlayerState struct DLL_EXPORT PlayerState
{ {
public: public:
@ -391,6 +407,7 @@ public:
int lossCheck(ui8 player) const; //checks if given player is loser; -1 if std loss, 1 if special, 0 else int lossCheck(ui8 player) const; //checks if given player is loser; -1 if std loss, 1 if special, 0 else
ui8 checkForStandardWin() const; //returns color of player that accomplished standard victory conditions or 255 if no winner ui8 checkForStandardWin() const; //returns color of player that accomplished standard victory conditions or 255 if no winner
bool checkForStandardLoss(ui8 player) const; //checks if given player lost the game bool checkForStandardLoss(ui8 player) const; //checks if given player lost the game
void obtainPlayersStats(SThievesGuildInfo & tgi, int level); //fills tgi with info about other players that is available at given level of thieves' guild
bool isVisible(int3 pos, int player); bool isVisible(int3 pos, int player);
bool isVisible(const CGObjectInstance *obj, int player); bool isVisible(const CGObjectInstance *obj, int player);