mirror of
https://github.com/vcmi/vcmi.git
synced 2025-11-25 22:42:04 +02:00
Black Market and Artifact Merchant (only buying artifacts) support.
This commit is contained in:
@@ -27,6 +27,7 @@ struct TryMoveHero;
|
|||||||
class CGHeroInstance;
|
class CGHeroInstance;
|
||||||
class CGTownInstance;
|
class CGTownInstance;
|
||||||
class CGObjectInstance;
|
class CGObjectInstance;
|
||||||
|
class CGBlackMarket;
|
||||||
class CGDwelling;
|
class CGDwelling;
|
||||||
class CCreatureSet;
|
class CCreatureSet;
|
||||||
class CArmedInstance;
|
class CArmedInstance;
|
||||||
@@ -87,6 +88,7 @@ public:
|
|||||||
virtual void tileHidden(const std::set<int3> &pos){};
|
virtual void tileHidden(const std::set<int3> &pos){};
|
||||||
virtual void tileRevealed(const std::set<int3> &pos){};
|
virtual void tileRevealed(const std::set<int3> &pos){};
|
||||||
virtual void newObject(const CGObjectInstance * obj){}; //eg. ship built in shipyard
|
virtual void newObject(const CGObjectInstance * obj){}; //eg. ship built in shipyard
|
||||||
|
virtual void availableArtifactsChanged(const CGBlackMarket *bm = NULL){}; //bm may be NULL, then artifacts are changed in the global pool (used by merchants in towns)
|
||||||
virtual void yourTurn(){};
|
virtual void yourTurn(){};
|
||||||
virtual void centerView (int3 pos, int focusTime){};
|
virtual void centerView (int3 pos, int focusTime){};
|
||||||
virtual void availableCreaturesChanged(const CGDwelling *town){};
|
virtual void availableCreaturesChanged(const CGDwelling *town){};
|
||||||
|
|||||||
@@ -513,7 +513,9 @@ void CSlider::moveTo(int to)
|
|||||||
else
|
else
|
||||||
slider->pos.y = pos.y+16;
|
slider->pos.y = pos.y+16;
|
||||||
}
|
}
|
||||||
moved(to);
|
|
||||||
|
if(moved)
|
||||||
|
moved(to);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CSlider::clickLeft(tribool down, bool previousState)
|
void CSlider::clickLeft(tribool down, bool previousState)
|
||||||
|
|||||||
@@ -1989,4 +1989,10 @@ void CPlayerInterface::showMarketWindow(const IMarket *market, const CGHeroInsta
|
|||||||
{
|
{
|
||||||
CMarketplaceWindow *cmw = new CMarketplaceWindow(market, visitor, market->availableModes().front());
|
CMarketplaceWindow *cmw = new CMarketplaceWindow(market, visitor, market->availableModes().front());
|
||||||
GH.pushInt(cmw);
|
GH.pushInt(cmw);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CPlayerInterface::availableArtifactsChanged(const CGBlackMarket *bm /*= NULL*/)
|
||||||
|
{
|
||||||
|
if(CMarketplaceWindow *cmw = dynamic_cast<CMarketplaceWindow*>(GH.topInt()))
|
||||||
|
cmw->artifactsChanged(false);
|
||||||
}
|
}
|
||||||
@@ -167,6 +167,7 @@ public:
|
|||||||
void tileHidden(const std::set<int3> &pos); //called when given tiles become hidden under fog of war
|
void tileHidden(const std::set<int3> &pos); //called when given tiles become hidden under fog of war
|
||||||
void tileRevealed(const std::set<int3> &pos); //called when fog of war disappears from given tiles
|
void tileRevealed(const std::set<int3> &pos); //called when fog of war disappears from given tiles
|
||||||
void newObject(const CGObjectInstance * obj);
|
void newObject(const CGObjectInstance * obj);
|
||||||
|
void availableArtifactsChanged(const CGBlackMarket *bm = NULL); //bm may be NULL, then artifacts are changed in the global pool (used by merchants in towns)
|
||||||
void yourTurn();
|
void yourTurn();
|
||||||
void availableCreaturesChanged(const CGDwelling *town);
|
void availableCreaturesChanged(const CGDwelling *town);
|
||||||
void heroBonusChanged(const CGHeroInstance *hero, const Bonus &bonus, bool gain);//if gain hero received bonus, else he lost it
|
void heroBonusChanged(const CGHeroInstance *hero, const Bonus &bonus, bool gain);//if gain hero received bonus, else he lost it
|
||||||
|
|||||||
@@ -597,11 +597,21 @@ void CIntObject::printAtMiddleLoc( const std::string & text, int x, int y, EFont
|
|||||||
CSDL_Ext::printAtMiddle(text, pos.x + x, pos.y + y, font, kolor, dst, refresh);
|
CSDL_Ext::printAtMiddle(text, pos.x + x, pos.y + y, font, kolor, dst, refresh);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CIntObject::printAtMiddleLoc(const std::string & text, const Point &p, EFonts font, SDL_Color kolor, SDL_Surface * dst, bool refresh /*= false*/)
|
||||||
|
{
|
||||||
|
printAtMiddleLoc(text, p.x, p.y, font, kolor, dst, refresh);
|
||||||
|
}
|
||||||
|
|
||||||
void CIntObject::blitAtLoc( SDL_Surface * src, int x, int y, SDL_Surface * dst )
|
void CIntObject::blitAtLoc( SDL_Surface * src, int x, int y, SDL_Surface * dst )
|
||||||
{
|
{
|
||||||
blitAt(src, pos.x + x, pos.y + y, dst);
|
blitAt(src, pos.x + x, pos.y + y, dst);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CIntObject::blitAtLoc(SDL_Surface * src, const Point &p, SDL_Surface * dst)
|
||||||
|
{
|
||||||
|
blitAtLoc(src, p.x, p.y, dst);
|
||||||
|
}
|
||||||
|
|
||||||
void CIntObject::printAtMiddleWBLoc( const std::string & text, int x, int y, EFonts font, int charpr, SDL_Color kolor, SDL_Surface * dst, bool refrsh /*= false*/ )
|
void CIntObject::printAtMiddleWBLoc( const std::string & text, int x, int y, EFonts font, int charpr, SDL_Color kolor, SDL_Surface * dst, bool refrsh /*= false*/ )
|
||||||
{
|
{
|
||||||
CSDL_Ext::printAtMiddleWB(text, pos.x + x, pos.y + y, font, charpr, kolor, dst, refrsh);
|
CSDL_Ext::printAtMiddleWB(text, pos.x + x, pos.y + y, font, charpr, kolor, dst, refrsh);
|
||||||
|
|||||||
@@ -382,8 +382,10 @@ public:
|
|||||||
void printAtLoc(const std::string & text, int x, int y, EFonts font, SDL_Color kolor, SDL_Surface * dst, bool refresh = false);
|
void printAtLoc(const std::string & text, int x, int y, EFonts font, SDL_Color kolor, SDL_Surface * dst, bool refresh = false);
|
||||||
void printToLoc(const std::string & text, int x, int y, EFonts font, SDL_Color kolor, SDL_Surface * dst, bool refresh = false);
|
void printToLoc(const std::string & text, int x, int y, EFonts font, SDL_Color kolor, SDL_Surface * dst, bool refresh = false);
|
||||||
void printAtMiddleLoc(const std::string & text, int x, int y, EFonts font, SDL_Color kolor, SDL_Surface * dst, bool refresh = false);
|
void printAtMiddleLoc(const std::string & text, int x, int y, EFonts font, SDL_Color kolor, SDL_Surface * dst, bool refresh = false);
|
||||||
|
void printAtMiddleLoc(const std::string & text, const Point &p, EFonts font, SDL_Color kolor, SDL_Surface * dst, bool refresh = false);
|
||||||
void printAtMiddleWBLoc(const std::string & text, int x, int y, EFonts font, int charpr, SDL_Color kolor, SDL_Surface * dst, bool refrsh = false);
|
void printAtMiddleWBLoc(const std::string & text, int x, int y, EFonts font, int charpr, SDL_Color kolor, SDL_Surface * dst, bool refrsh = false);
|
||||||
void blitAtLoc(SDL_Surface * src, int x, int y, SDL_Surface * dst);
|
void blitAtLoc(SDL_Surface * src, int x, int y, SDL_Surface * dst);
|
||||||
|
void blitAtLoc(SDL_Surface * src, const Point &p, SDL_Surface * dst);
|
||||||
bool isItInLoc(const SDL_Rect &rect, int x, int y);
|
bool isItInLoc(const SDL_Rect &rect, int x, int y);
|
||||||
bool isItInLoc(const SDL_Rect &rect, const Point &p);
|
bool isItInLoc(const SDL_Rect &rect, const Point &p);
|
||||||
const Rect & center(const Rect &r); //sets pos so that r will be in the center of screen, returns new position
|
const Rect & center(const Rect &r); //sets pos so that r will be in the center of screen, returns new position
|
||||||
|
|||||||
@@ -2794,6 +2794,7 @@ CMarketplaceWindow::CMarketplaceWindow(const IMarket *Market, const CGHeroInstan
|
|||||||
:market(Market), hero(Hero), hLeft(NULL), hRight(NULL), readyToTrade(false)
|
:market(Market), hero(Hero), hLeft(NULL), hRight(NULL), readyToTrade(false)
|
||||||
{
|
{
|
||||||
OBJ_CONSTRUCTION_CAPTURING_ALL;
|
OBJ_CONSTRUCTION_CAPTURING_ALL;
|
||||||
|
|
||||||
type = BLOCK_ADV_HOTKEYS;
|
type = BLOCK_ADV_HOTKEYS;
|
||||||
mode = Mode;
|
mode = Mode;
|
||||||
|
|
||||||
@@ -2802,6 +2803,7 @@ CMarketplaceWindow::CMarketplaceWindow(const IMarket *Market, const CGHeroInstan
|
|||||||
|
|
||||||
std::string bgName;
|
std::string bgName;
|
||||||
std::vector<int> *rIds = NULL, *lIds = NULL;
|
std::vector<int> *rIds = NULL, *lIds = NULL;
|
||||||
|
bool sliderNeeded = true;
|
||||||
|
|
||||||
switch(Mode)
|
switch(Mode)
|
||||||
{
|
{
|
||||||
@@ -2835,6 +2837,14 @@ CMarketplaceWindow::CMarketplaceWindow(const IMarket *Market, const CGHeroInstan
|
|||||||
lIds->push_back(-1);
|
lIds->push_back(-1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case RESOURCE_ARTIFACT:
|
||||||
|
bgName = "TPMRKABS.bmp";
|
||||||
|
ltype = RESOURCE;
|
||||||
|
rtype = ARTIFACT;
|
||||||
|
sliderNeeded = false;
|
||||||
|
|
||||||
|
rIds = new std::vector<int>(market->availableItemsIds(mode));
|
||||||
}
|
}
|
||||||
|
|
||||||
bg = new CPicture(bgName);
|
bg = new CPicture(bgName);
|
||||||
@@ -2865,20 +2875,34 @@ CMarketplaceWindow::CMarketplaceWindow(const IMarket *Market, const CGHeroInstan
|
|||||||
delNull(rIds);
|
delNull(rIds);
|
||||||
delNull(lIds);
|
delNull(lIds);
|
||||||
|
|
||||||
//slider and buttons must be created after bg
|
|
||||||
slider = new CSlider(231,490,137,boost::bind(&CMarketplaceWindow::sliderMoved,this,_1),0,0);
|
|
||||||
|
|
||||||
|
|
||||||
ok = new AdventureMapButton("","",boost::bind(&CGuiHandler::popIntTotally,&GH,this),516,520,"IOK6432.DEF",SDLK_RETURN);
|
ok = new AdventureMapButton("","",boost::bind(&CGuiHandler::popIntTotally,&GH,this),516,520,"IOK6432.DEF",SDLK_RETURN);
|
||||||
ok->assignedKeys.insert(SDLK_ESCAPE);
|
ok->assignedKeys.insert(SDLK_ESCAPE);
|
||||||
deal = new AdventureMapButton("","",boost::bind(&CMarketplaceWindow::makeDeal,this),307,520,"TPMRKB.DEF");
|
deal = new AdventureMapButton("","",boost::bind(&CMarketplaceWindow::makeDeal,this),307,520,"TPMRKB.DEF");
|
||||||
max = new AdventureMapButton("","",boost::bind(&CMarketplaceWindow::setMax,this),229,520,"IRCBTNS.DEF");
|
deal->block(true);
|
||||||
|
|
||||||
|
|
||||||
|
//slider and buttons must be created after bg
|
||||||
|
if(sliderNeeded)
|
||||||
|
{
|
||||||
|
slider = new CSlider(231,490,137,0,0,0);
|
||||||
|
slider->moved = boost::bind(&CMarketplaceWindow::sliderMoved,this,_1);
|
||||||
|
max = new AdventureMapButton("","",boost::bind(&CMarketplaceWindow::setMax,this),229,520,"IRCBTNS.DEF");
|
||||||
|
max->block(true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
slider = NULL;
|
||||||
|
max = NULL;
|
||||||
|
deal->pos.x -= 38;
|
||||||
|
}
|
||||||
|
|
||||||
//left side
|
//left side
|
||||||
switch(Mode)
|
switch(Mode)
|
||||||
{
|
{
|
||||||
case RESOURCE_RESOURCE:
|
case RESOURCE_RESOURCE:
|
||||||
case RESOURCE_PLAYER:
|
case RESOURCE_PLAYER:
|
||||||
|
case RESOURCE_ARTIFACT:
|
||||||
printAtMiddle(CGI->generaltexth->allTexts[270],154,148,FONT_SMALL,zwykly,*bg); //kingdom res.
|
printAtMiddle(CGI->generaltexth->allTexts[270],154,148,FONT_SMALL,zwykly,*bg); //kingdom res.
|
||||||
break;
|
break;
|
||||||
case CREATURE_RESOURCE:
|
case CREATURE_RESOURCE:
|
||||||
@@ -2891,6 +2915,7 @@ CMarketplaceWindow::CMarketplaceWindow(const IMarket *Market, const CGHeroInstan
|
|||||||
{
|
{
|
||||||
case RESOURCE_RESOURCE:
|
case RESOURCE_RESOURCE:
|
||||||
case CREATURE_RESOURCE:
|
case CREATURE_RESOURCE:
|
||||||
|
case RESOURCE_ARTIFACT:
|
||||||
printAtMiddle(CGI->generaltexth->allTexts[168],445,148,FONT_SMALL,zwykly,*bg); //available for trade
|
printAtMiddle(CGI->generaltexth->allTexts[168],445,148,FONT_SMALL,zwykly,*bg); //available for trade
|
||||||
break;
|
break;
|
||||||
case RESOURCE_PLAYER:
|
case RESOURCE_PLAYER:
|
||||||
@@ -2906,8 +2931,6 @@ CMarketplaceWindow::CMarketplaceWindow(const IMarket *Market, const CGHeroInstan
|
|||||||
new AdventureMapButton("","",boost::bind(&CMarketplaceWindow::setMode,this, CREATURE_RESOURCE), 516, 450,"TPMRKBU4.DEF");
|
new AdventureMapButton("","",boost::bind(&CMarketplaceWindow::setMode,this, CREATURE_RESOURCE), 516, 450,"TPMRKBU4.DEF");
|
||||||
|
|
||||||
|
|
||||||
max->block(true);
|
|
||||||
deal->block(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CMarketplaceWindow::~CMarketplaceWindow()
|
CMarketplaceWindow::~CMarketplaceWindow()
|
||||||
@@ -2944,7 +2967,13 @@ void CMarketplaceWindow::showAll(SDL_Surface * to)
|
|||||||
if(readyToTrade)
|
if(readyToTrade)
|
||||||
{
|
{
|
||||||
blitAt(hLeft->getSurface(),pos.x+141,pos.y+457,to);
|
blitAt(hLeft->getSurface(),pos.x+141,pos.y+457,to);
|
||||||
printAtMiddle(boost::lexical_cast<std::string>( slider->value * r1 ),pos.x+156,pos.y+505,FONT_SMALL,zwykly,to);
|
int val = -1;
|
||||||
|
if(slider)
|
||||||
|
val = slider->value * r1;
|
||||||
|
else
|
||||||
|
val = (deal->blocked) ? 0 : r1;
|
||||||
|
|
||||||
|
printAtMiddle(boost::lexical_cast<std::string>(val),pos.x+156,pos.y+505,FONT_SMALL,zwykly,to);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -2960,6 +2989,11 @@ void CMarketplaceWindow::showAll(SDL_Surface * to)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Point rightSubOffset;
|
||||||
|
Point selectionPos;
|
||||||
|
Point selectionSubOffset;
|
||||||
|
std::string selectionSub;
|
||||||
|
|
||||||
//right side
|
//right side
|
||||||
switch(rtype)
|
switch(rtype)
|
||||||
{
|
{
|
||||||
@@ -2974,24 +3008,40 @@ void CMarketplaceWindow::showAll(SDL_Surface * to)
|
|||||||
printAtMiddle(CGI->generaltexth->allTexts[164],right[i]->pos.x+36,right[i]->pos.y+57,FONT_SMALL,zwykly,to);
|
printAtMiddle(CGI->generaltexth->allTexts[164],right[i]->pos.x+36,right[i]->pos.y+57,FONT_SMALL,zwykly,to);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(readyToTrade)
|
selectionPos = Point(429, 457);
|
||||||
{
|
selectionSubOffset = Point(14, 47);
|
||||||
blitAt(hRight->getSurface(),pos.x+429,pos.y+457,to);
|
selectionSub = boost::lexical_cast<std::string>( slider->value * r2 );
|
||||||
printAtMiddle(boost::lexical_cast<std::string>( slider->value * r2 ),pos.x+443,pos.y+505,FONT_SMALL,zwykly,to);
|
break;
|
||||||
}
|
|
||||||
|
case ARTIFACT:
|
||||||
|
if(hLeft) //print prices
|
||||||
|
for(int i=0; i<right.size();i++)
|
||||||
|
if(right[i]->id != hLeft->id || mode != RESOURCE_RESOURCE)
|
||||||
|
printAtMiddle(rSubs[i], right[i]->pos.x+18, right[i]->pos.y+57, FONT_SMALL, zwykly, to);
|
||||||
|
|
||||||
|
selectionPos = Point(425, 447);
|
||||||
|
selectionSubOffset = Point(18, 57);
|
||||||
|
selectionSub = (deal->blocked) ? "0" : "1";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PLAYER:
|
case PLAYER:
|
||||||
BOOST_FOREACH(CTradeableItem *i, right)
|
BOOST_FOREACH(CTradeableItem *i, right)
|
||||||
printAtMiddle(CGI->generaltexth->capColors[i->id], i->pos.x + 31, i->pos.y + 76, FONT_SMALL, zwykly, to);
|
printAtMiddle(CGI->generaltexth->capColors[i->id], i->pos.x + 31, i->pos.y + 76, FONT_SMALL, zwykly, to);
|
||||||
|
|
||||||
if(readyToTrade)
|
selectionPos = Point(417, 451);
|
||||||
{
|
selectionSubOffset = rightSubOffset = Point(31, 76);
|
||||||
blitAt(hRight->getSurface(),pos.x+417,pos.y+451,to);
|
selectionSub = hRight ? CGI->generaltexth->capColors[hRight->id] : "";
|
||||||
printAtMiddle(CGI->generaltexth->capColors[hRight->id], pos.x+417 + 31, pos.y+451 + 76, FONT_SMALL, zwykly, to);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(readyToTrade)
|
||||||
|
{
|
||||||
|
assert(hRight);
|
||||||
|
blitAtLoc(hRight->getSurface(), selectionPos, to);
|
||||||
|
printAtMiddleLoc(selectionSub, selectionPos + selectionSubOffset, FONT_SMALL, zwykly, to);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMarketplaceWindow::setMax()
|
void CMarketplaceWindow::setMax()
|
||||||
@@ -3001,7 +3051,13 @@ void CMarketplaceWindow::setMax()
|
|||||||
|
|
||||||
void CMarketplaceWindow::makeDeal()
|
void CMarketplaceWindow::makeDeal()
|
||||||
{
|
{
|
||||||
if(!slider->value)
|
int sliderValue = 0;
|
||||||
|
if(slider)
|
||||||
|
sliderValue = slider->value;
|
||||||
|
else
|
||||||
|
sliderValue = !deal->blocked; //should always be 1
|
||||||
|
|
||||||
|
if(!sliderValue)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
int leftIdToSend = -1;
|
int leftIdToSend = -1;
|
||||||
@@ -3010,8 +3066,16 @@ void CMarketplaceWindow::makeDeal()
|
|||||||
else
|
else
|
||||||
leftIdToSend = hLeft->id;
|
leftIdToSend = hLeft->id;
|
||||||
|
|
||||||
LOCPLINT->cb->trade(market->o, mode, leftIdToSend, hRight->id, slider->value*r1, hero);
|
if(mode != RESOURCE_ARTIFACT)
|
||||||
slider->moveTo(0);
|
{
|
||||||
|
LOCPLINT->cb->trade(market->o, mode, leftIdToSend, hRight->id, slider->value*r1, hero);
|
||||||
|
slider->moveTo(0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOCPLINT->cb->trade(market->o, mode, leftIdToSend, hRight->id, r2, hero);
|
||||||
|
}
|
||||||
|
|
||||||
hLeft = NULL;
|
hLeft = NULL;
|
||||||
hRight = NULL;
|
hRight = NULL;
|
||||||
selectionChanged(true);
|
selectionChanged(true);
|
||||||
@@ -3038,18 +3102,29 @@ void CMarketplaceWindow::selectionChanged(bool side)
|
|||||||
else
|
else
|
||||||
assert(0);
|
assert(0);
|
||||||
|
|
||||||
slider->setAmount(newAmount / r1);
|
if(slider)
|
||||||
slider->moveTo(0);
|
{
|
||||||
max->block(false);
|
slider->setAmount(newAmount / r1);
|
||||||
deal->block(false);
|
slider->moveTo(0);
|
||||||
|
max->block(false);
|
||||||
|
deal->block(false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
deal->block(LOCPLINT->cb->getResourceAmount(hLeft->id) < r1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
max->block(true);
|
if(slider)
|
||||||
|
{
|
||||||
|
max->block(true);
|
||||||
|
slider->setAmount(0);
|
||||||
|
slider->moveTo(0);
|
||||||
|
}
|
||||||
deal->block(true);
|
deal->block(true);
|
||||||
slider->setAmount(0);
|
|
||||||
slider->moveTo(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(side && hLeft) //left selection changed, recalculate offers
|
if(side && hLeft) //left selection changed, recalculate offers
|
||||||
{
|
{
|
||||||
rSubs.clear();
|
rSubs.clear();
|
||||||
@@ -3057,7 +3132,10 @@ void CMarketplaceWindow::selectionChanged(bool side)
|
|||||||
int h1, h2;
|
int h1, h2;
|
||||||
for(int i=0;i<right.size();i++)
|
for(int i=0;i<right.size();i++)
|
||||||
{
|
{
|
||||||
market->getOffer(hLeft->id, i, h1, h2, mode);
|
if(rtype != ARTIFACT)
|
||||||
|
market->getOffer(hLeft->id, i, h1, h2, mode);
|
||||||
|
else
|
||||||
|
market->getOffer(hLeft->id, right[i]->id, h1, h2, mode);
|
||||||
|
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
oss << h2;
|
oss << h2;
|
||||||
@@ -3101,6 +3179,14 @@ void CMarketplaceWindow::getPositionsFor(std::vector<Rect> &poss, bool Right, ET
|
|||||||
dx = 83;
|
dx = 83;
|
||||||
dy = 98;
|
dy = 98;
|
||||||
assert(!Right);
|
assert(!Right);
|
||||||
|
|
||||||
|
case ARTIFACT://45,123
|
||||||
|
x = 342-288;
|
||||||
|
y = 181;
|
||||||
|
w = 44;
|
||||||
|
h = 44;
|
||||||
|
dx = 83;
|
||||||
|
dy = 79;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -3144,6 +3230,27 @@ void CMarketplaceWindow::garrisonChanged()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CMarketplaceWindow::artifactsChanged(bool left)
|
||||||
|
{
|
||||||
|
assert(!left);
|
||||||
|
if(mode != RESOURCE_ARTIFACT)
|
||||||
|
return;
|
||||||
|
|
||||||
|
std::vector<int> available = market->availableItemsIds(mode);
|
||||||
|
std::set<CTradeableItem *> toRemove;
|
||||||
|
BOOST_FOREACH(CTradeableItem *t, right)
|
||||||
|
if(!vstd::contains(available, t->id))
|
||||||
|
toRemove.insert(t);
|
||||||
|
|
||||||
|
BOOST_FOREACH(CTradeableItem *t, toRemove)
|
||||||
|
{
|
||||||
|
if(active)
|
||||||
|
t->deactivate();
|
||||||
|
right -= t;
|
||||||
|
delChild(t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
CSystemOptionsWindow::CSystemOptionsWindow(const SDL_Rect &pos, CPlayerInterface * owner)
|
CSystemOptionsWindow::CSystemOptionsWindow(const SDL_Rect &pos, CPlayerInterface * owner)
|
||||||
{
|
{
|
||||||
this->pos = pos;
|
this->pos = pos;
|
||||||
|
|||||||
@@ -596,6 +596,7 @@ public:
|
|||||||
void getPositionsFor(std::vector<Rect> &poss, bool Right, EType type) const;
|
void getPositionsFor(std::vector<Rect> &poss, bool Right, EType type) const;
|
||||||
|
|
||||||
void garrisonChanged(); //removes creatures with count 0 from the list (apparently whole stack has been sold)
|
void garrisonChanged(); //removes creatures with count 0 from the list (apparently whole stack has been sold)
|
||||||
|
void artifactsChanged(bool left);
|
||||||
};
|
};
|
||||||
|
|
||||||
class CSystemOptionsWindow : public CIntObject
|
class CSystemOptionsWindow : public CIntObject
|
||||||
|
|||||||
@@ -760,6 +760,21 @@ void NewObject::applyCl(CClient *cl)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SetAvailableArtifacts::applyCl(CClient *cl)
|
||||||
|
{
|
||||||
|
if(id < 0) //artifact merchants globally
|
||||||
|
{
|
||||||
|
for(std::map<ui8, CGameInterface*>::iterator i=cl->playerint.begin();i!=cl->playerint.end();i++)
|
||||||
|
i->second->availableArtifactsChanged(NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const CGBlackMarket *bm = dynamic_cast<const CGBlackMarket *>(cl->getObj(id));
|
||||||
|
assert(bm);
|
||||||
|
INTERFACE_CALL_IF_PRESENT(cl->getTile(bm->visitablePos())->visitableObjects.back()->tempOwner, availableArtifactsChanged, bm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void TradeComponents::applyCl(CClient *cl)
|
void TradeComponents::applyCl(CClient *cl)
|
||||||
{///Shop handler
|
{///Shop handler
|
||||||
switch (CGI->mh->map->objects[objectid]->ID)
|
switch (CGI->mh->map->objects[objectid]->ID)
|
||||||
|
|||||||
2
global.h
2
global.h
@@ -109,7 +109,7 @@ const int WEEKLY_GROWTH = 10; //percent
|
|||||||
|
|
||||||
enum EMarketMode
|
enum EMarketMode
|
||||||
{
|
{
|
||||||
RESOURCE_RESOURCE, RESOURCE_PLAYER, CREATURE_RESOURCE, ARTIFACT_RESOURCE, RESOURCE_ARTIFACT, ARTIFACT_EXP, CREATURE_EXP,
|
RESOURCE_RESOURCE, RESOURCE_PLAYER, CREATURE_RESOURCE, RESOURCE_ARTIFACT, ARTIFACT_RESOURCE, ARTIFACT_EXP, CREATURE_EXP,
|
||||||
MARTKET_AFTER_LAST_PLACEHOLDER
|
MARTKET_AFTER_LAST_PLACEHOLDER
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1945,6 +1945,22 @@ bool CGTownInstance::allowsTrade(EMarketMode mode) const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<int> CGTownInstance::availableItemsIds(EMarketMode mode) const
|
||||||
|
{
|
||||||
|
if(mode == RESOURCE_ARTIFACT)
|
||||||
|
{
|
||||||
|
std::vector<int> ret;
|
||||||
|
BOOST_FOREACH(const CArtifact *a, merchantArtifacts)
|
||||||
|
if(a)
|
||||||
|
ret.push_back(a->id);
|
||||||
|
else
|
||||||
|
ret.push_back(-1);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return IMarket::availableItemsIds(mode);
|
||||||
|
}
|
||||||
|
|
||||||
void CGVisitableOPH::onHeroVisit( const CGHeroInstance * h ) const
|
void CGVisitableOPH::onHeroVisit( const CGHeroInstance * h ) const
|
||||||
{
|
{
|
||||||
if(visitors.find(h->id)==visitors.end())
|
if(visitors.find(h->id)==visitors.end())
|
||||||
@@ -6107,6 +6123,21 @@ bool IMarket::getOffer(int id1, int id2, int &val1, int &val2, EMarketMode mode)
|
|||||||
val1 = 1;
|
val1 = 1;
|
||||||
val2 = 1;
|
val2 = 1;
|
||||||
break;
|
break;
|
||||||
|
case RESOURCE_ARTIFACT:
|
||||||
|
{
|
||||||
|
float effectiveness = std::min(((float)getMarketEfficiency()+3.0f) / 20.0f, 0.6f);
|
||||||
|
float r = VLC->objh->resVals[id1], //value of offered resource
|
||||||
|
g = VLC->arth->artifacts[id2]->price / effectiveness; //value of bought artifact in gold
|
||||||
|
|
||||||
|
if(id1 != 6) //non-gold prices are doubled
|
||||||
|
r /= 2;
|
||||||
|
|
||||||
|
assert(g >= r); //should we allow artifacts cheaper than unit of resource?
|
||||||
|
val1 = (g / r) + 0.5f;
|
||||||
|
val2 = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
assert(0);
|
assert(0);
|
||||||
return false;
|
return false;
|
||||||
@@ -6211,6 +6242,9 @@ bool CGMarket::allowsTrade(EMarketMode mode) const
|
|||||||
}
|
}
|
||||||
case CREATURE_RESOURCE:
|
case CREATURE_RESOURCE:
|
||||||
return ID == 213; //Freelancer's Guild
|
return ID == 213; //Freelancer's Guild
|
||||||
|
case ARTIFACT_RESOURCE:
|
||||||
|
case RESOURCE_ARTIFACT:
|
||||||
|
return ID == 7; //Black Market
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -6258,12 +6292,13 @@ std::vector<int> CGBlackMarket::availableItemsIds(EMarketMode mode) const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGBlackMarket::initObj()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void CGBlackMarket::newTurn() const
|
void CGBlackMarket::newTurn() const
|
||||||
{
|
{
|
||||||
|
if(cb->getDate(2) != 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
SetAvailableArtifacts saa;
|
||||||
|
saa.id = id;
|
||||||
|
cb->pickAllowedArtsSet(saa.arts);
|
||||||
|
cb->sendAndApply(&saa);
|
||||||
}
|
}
|
||||||
@@ -513,6 +513,7 @@ public:
|
|||||||
void getOutOffsets(std::vector<int3> &offsets) const; //offsets to obj pos when we boat can be placed
|
void getOutOffsets(std::vector<int3> &offsets) const; //offsets to obj pos when we boat can be placed
|
||||||
int getMarketEfficiency() const; //=market count
|
int getMarketEfficiency() const; //=market count
|
||||||
bool allowsTrade(EMarketMode mode) const;
|
bool allowsTrade(EMarketMode mode) const;
|
||||||
|
std::vector<int> availableItemsIds(EMarketMode mode) const;
|
||||||
void setPropertyDer(ui8 what, ui32 val);
|
void setPropertyDer(ui8 what, ui32 val);
|
||||||
void newTurn() const;
|
void newTurn() const;
|
||||||
|
|
||||||
@@ -1166,13 +1167,13 @@ class DLL_EXPORT CGBlackMarket : public CGMarket
|
|||||||
public:
|
public:
|
||||||
std::vector<const CArtifact *> artifacts; //available artifacts
|
std::vector<const CArtifact *> artifacts; //available artifacts
|
||||||
|
|
||||||
void initObj();
|
|
||||||
void newTurn() const; //reset artifacts for black market every month
|
void newTurn() const; //reset artifacts for black market every month
|
||||||
std::vector<int> availableItemsIds(EMarketMode mode) const;
|
std::vector<int> availableItemsIds(EMarketMode mode) const;
|
||||||
|
|
||||||
template <typename Handler> void serialize(Handler &h, const int version)
|
template <typename Handler> void serialize(Handler &h, const int version)
|
||||||
{
|
{
|
||||||
h & static_cast<CGMarket&>(*this);
|
h & static_cast<CGMarket&>(*this);
|
||||||
|
h & artifacts;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -196,6 +196,18 @@ void IGameCallback::getAllowedArts(std::vector<CArtifact*> &out, std::vector<CAr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void IGameCallback::pickAllowedArtsSet(std::vector<const CArtifact*> &out)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 2; i++)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < 3 ; j++)
|
||||||
|
{
|
||||||
|
out.push_back(VLC->arth->artifacts[getRandomArt(CArtifact::ART_TREASURE << i)]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out.push_back(VLC->arth->artifacts[getRandomArt(CArtifact::ART_MAJOR)]);
|
||||||
|
}
|
||||||
|
|
||||||
void IGameCallback::getAllowed(std::vector<CArtifact*> &out, int flags)
|
void IGameCallback::getAllowed(std::vector<CArtifact*> &out, int flags)
|
||||||
{
|
{
|
||||||
if(flags & CArtifact::ART_TREASURE)
|
if(flags & CArtifact::ART_TREASURE)
|
||||||
@@ -269,4 +281,4 @@ inline TerrainTile * IGameCallback::getTile( int3 pos )
|
|||||||
const PlayerState * IGameCallback::getPlayerState( int color )
|
const PlayerState * IGameCallback::getPlayerState( int color )
|
||||||
{
|
{
|
||||||
return gs->getPlayer(color, false);
|
return gs->getPlayer(color, false);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ public:
|
|||||||
virtual bool isAllowed(int type, int id); //type: 0 - spell; 1- artifact
|
virtual bool isAllowed(int type, int id); //type: 0 - spell; 1- artifact
|
||||||
virtual ui16 getRandomArt (int flags);
|
virtual ui16 getRandomArt (int flags);
|
||||||
virtual void getAllowedArts(std::vector<CArtifact*> &out, std::vector<CArtifact*> CArtHandler::*arts, int flag);
|
virtual void getAllowedArts(std::vector<CArtifact*> &out, std::vector<CArtifact*> CArtHandler::*arts, int flag);
|
||||||
|
virtual void pickAllowedArtsSet(std::vector<const CArtifact*> &out); //gives 3 treasures, 3 minors, 1 major -> used by Black Market and Artifact Merchant
|
||||||
virtual void getAllowed(std::vector<CArtifact*> &out, int flags); //flags: bitfield uses EartClass
|
virtual void getAllowed(std::vector<CArtifact*> &out, int flags); //flags: bitfield uses EartClass
|
||||||
virtual void getAllowedSpells(std::vector<ui16> &out, ui16 level);
|
virtual void getAllowedSpells(std::vector<ui16> &out, ui16 level);
|
||||||
virtual int3 getMapSize(); //returns size of the map
|
virtual int3 getMapSize(); //returns size of the map
|
||||||
|
|||||||
@@ -647,7 +647,7 @@ struct NewObject : public CPackForClient //518
|
|||||||
struct SetAvailableArtifacts : public CPackForClient //519
|
struct SetAvailableArtifacts : public CPackForClient //519
|
||||||
{
|
{
|
||||||
SetAvailableArtifacts(){type = 519;};
|
SetAvailableArtifacts(){type = 519;};
|
||||||
//void applyCl(CClient *cl);
|
void applyCl(CClient *cl);
|
||||||
DLL_EXPORT void applyGs(CGameState *gs);
|
DLL_EXPORT void applyGs(CGameState *gs);
|
||||||
|
|
||||||
si32 id; //two variants: id < 0: set artifact pool for Artifact Merchants in towns; id >= 0: set pool for adv. map Black Market (id is the id of Black Market instance then)
|
si32 id; //two variants: id < 0: set artifact pool for Artifact Merchants in towns; id >= 0: set pool for adv. map Black Market (id is the id of Black Market instance then)
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ void registerTypes1(Serializer &s)
|
|||||||
s.template registerType<CGObelisk>();
|
s.template registerType<CGObelisk>();
|
||||||
s.template registerType<CGLighthouse>();
|
s.template registerType<CGLighthouse>();
|
||||||
s.template registerType<CGMarket>();
|
s.template registerType<CGMarket>();
|
||||||
|
s.template registerType<CGBlackMarket>();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Serializer> DLL_EXPORT
|
template<typename Serializer> DLL_EXPORT
|
||||||
@@ -124,6 +125,7 @@ void registerTypes2(Serializer &s)
|
|||||||
s.template registerType<AdvmapSpellCast>();
|
s.template registerType<AdvmapSpellCast>();
|
||||||
s.template registerType<OpenWindow>();
|
s.template registerType<OpenWindow>();
|
||||||
s.template registerType<NewObject>();
|
s.template registerType<NewObject>();
|
||||||
|
s.template registerType<SetAvailableArtifacts>();
|
||||||
|
|
||||||
s.template registerType<SaveGame>();
|
s.template registerType<SaveGame>();
|
||||||
s.template registerType<SetSelection>();
|
s.template registerType<SetSelection>();
|
||||||
|
|||||||
@@ -1949,7 +1949,6 @@ void Mapa::readObjects( const unsigned char * bufor, int &i)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
//case 2: //Altar of Sacrifice
|
//case 2: //Altar of Sacrifice
|
||||||
//case 7: //Black Market
|
|
||||||
case 99: //Trading Post
|
case 99: //Trading Post
|
||||||
case 213: //Freelancer's Guild
|
case 213: //Freelancer's Guild
|
||||||
case 221: //Trading Post (snow)
|
case 221: //Trading Post (snow)
|
||||||
@@ -1957,6 +1956,11 @@ void Mapa::readObjects( const unsigned char * bufor, int &i)
|
|||||||
nobj = new CGMarket();
|
nobj = new CGMarket();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 7: //Black Market
|
||||||
|
{
|
||||||
|
nobj = new CGBlackMarket();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
default: //any other object
|
default: //any other object
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1042,6 +1042,14 @@ void CGameHandler::newTurn()
|
|||||||
//unhiding what shouldn't be hidden? //that's handled in netpacks client
|
//unhiding what shouldn't be hidden? //that's handled in netpacks client
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(getDate(2) == 1)
|
||||||
|
{
|
||||||
|
SetAvailableArtifacts saa;
|
||||||
|
saa.id = -1;
|
||||||
|
pickAllowedArtsSet(saa.arts);
|
||||||
|
sendAndApply(&saa);
|
||||||
|
}
|
||||||
|
|
||||||
sendAndApply(&n);
|
sendAndApply(&n);
|
||||||
tlog5 << "Info about turn " << n.day << "has been sent!" << std::endl;
|
tlog5 << "Info about turn " << n.day << "has been sent!" << std::endl;
|
||||||
handleTimeEvents();
|
handleTimeEvents();
|
||||||
@@ -3032,6 +3040,56 @@ bool CGameHandler::buyArtifact( ui32 hid, si32 aid )
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CGameHandler::buyArtifact(const IMarket *m, const CGHeroInstance *h, int rid, int aid)
|
||||||
|
{
|
||||||
|
if(!vstd::contains(m->availableItemsIds(RESOURCE_ARTIFACT), aid))
|
||||||
|
COMPLAIN_RET("That artifact is unavailable!");
|
||||||
|
|
||||||
|
int b1, b2;
|
||||||
|
m->getOffer(rid, aid, b1, b2, RESOURCE_ARTIFACT);
|
||||||
|
|
||||||
|
if(getResource(h->tempOwner, rid) < b1)
|
||||||
|
COMPLAIN_RET("You can't afford to buy this artifact!");
|
||||||
|
|
||||||
|
SetResource sr;
|
||||||
|
sr.player = h->tempOwner;
|
||||||
|
sr.resid = rid;
|
||||||
|
sr.val = getResource(h->tempOwner, rid) - b1;
|
||||||
|
sendAndApply(&sr);
|
||||||
|
|
||||||
|
|
||||||
|
SetAvailableArtifacts saa;
|
||||||
|
if(m->o->ID == TOWNI_TYPE)
|
||||||
|
{
|
||||||
|
saa.id = -1;
|
||||||
|
saa.arts = CGTownInstance::merchantArtifacts;
|
||||||
|
}
|
||||||
|
else if(const CGBlackMarket *bm = dynamic_cast<const CGBlackMarket *>(m->o)) //black market
|
||||||
|
{
|
||||||
|
saa.id = bm->id;
|
||||||
|
saa.arts = bm->artifacts;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
COMPLAIN_RET("Wrong marktet...");
|
||||||
|
|
||||||
|
bool found = false;
|
||||||
|
BOOST_FOREACH(const CArtifact *&art, saa.arts)
|
||||||
|
{
|
||||||
|
if(art && art->id == aid)
|
||||||
|
{
|
||||||
|
art = NULL;
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!found)
|
||||||
|
COMPLAIN_RET("Cannot find selected artifact on the list");
|
||||||
|
|
||||||
|
sendAndApply(&saa);
|
||||||
|
|
||||||
|
giveHeroArtifact(aid, h->id, -2);
|
||||||
|
}
|
||||||
|
|
||||||
bool CGameHandler::tradeResources(const IMarket *market, ui32 val, ui8 player, ui32 id1, ui32 id2)
|
bool CGameHandler::tradeResources(const IMarket *market, ui32 val, ui8 player, ui32 id1, ui32 id2)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -172,7 +172,8 @@ public:
|
|||||||
bool sendResources(ui32 val, ui8 player, ui32 r1, ui32 r2);
|
bool sendResources(ui32 val, ui8 player, ui32 r1, ui32 r2);
|
||||||
bool sellCreatures(ui32 count, const IMarket *market, const CGHeroInstance * hero, ui32 slot, ui32 resourceID);
|
bool sellCreatures(ui32 count, const IMarket *market, const CGHeroInstance * hero, ui32 slot, ui32 resourceID);
|
||||||
bool assembleArtifacts (si32 heroID, ui16 artifactSlot, bool assemble, ui32 assembleTo);
|
bool assembleArtifacts (si32 heroID, ui16 artifactSlot, bool assemble, ui32 assembleTo);
|
||||||
bool buyArtifact( ui32 hid, si32 aid );
|
bool buyArtifact( ui32 hid, si32 aid ); //for blacksmith and mage guild only -> buying for gold in common buildings
|
||||||
|
bool buyArtifact( const IMarket *m, const CGHeroInstance *h, int rid, int aid); //for artifact merchant and black market -> buying for any resource in special building / advobject
|
||||||
bool swapArtifacts(si32 srcHeroID, si32 destHeroID, ui16 srcSlot, ui16 destSlot);
|
bool swapArtifacts(si32 srcHeroID, si32 destHeroID, ui16 srcSlot, ui16 destSlot);
|
||||||
bool garrisonSwap(si32 tid);
|
bool garrisonSwap(si32 tid);
|
||||||
bool upgradeCreature( ui32 objid, ui8 pos, ui32 upgID );
|
bool upgradeCreature( ui32 objid, ui8 pos, ui32 upgID );
|
||||||
|
|||||||
@@ -145,9 +145,12 @@ bool TradeOnMarketplace::applyGh( CGameHandler *gh )
|
|||||||
if(!hero)
|
if(!hero)
|
||||||
COMPLAIN_AND_RETURN("Only hero can sell creatures!");
|
COMPLAIN_AND_RETURN("Only hero can sell creatures!");
|
||||||
return gh->sellCreatures(val, m, hero, r1, r2);
|
return gh->sellCreatures(val, m, hero, r1, r2);
|
||||||
|
case RESOURCE_ARTIFACT:
|
||||||
|
if(!hero)
|
||||||
|
COMPLAIN_AND_RETURN("Only hero can buy artifacts!");
|
||||||
|
return gh->buyArtifact(m, hero, r1, r2);
|
||||||
default:
|
default:
|
||||||
gh->complain("Unknown exchange mode!");
|
COMPLAIN_AND_RETURN("Unknown exchange mode!");
|
||||||
ERROR_AND_RETURN;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user