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

* version set to 0.63

* mostly done morketplace
* more logging around netcode
This commit is contained in:
Michał W. Urbańczyk 2008-09-07 03:38:37 +00:00
parent 2af92aa170
commit 3d147a7be8
18 changed files with 479 additions and 16 deletions

View File

@ -116,7 +116,6 @@ void AdventureMapButton::init(const CFunctionList<void()> &Callback, const std::
state=0; state=0;
hoverTexts = Name; hoverTexts = Name;
helpBox=HelpBox; helpBox=HelpBox;
colorChange = playerColoredButton;
int est = LOCPLINT->playerID; int est = LOCPLINT->playerID;
CDefHandler * temp = CDefHandler::giveDef(defName); CDefHandler * temp = CDefHandler::giveDef(defName);
temp->notFreeImgs = true; temp->notFreeImgs = true;
@ -320,3 +319,10 @@ CSlider::CSlider(int x, int y, int totalw, boost::function<void(int)> Moved, int
moveTo(value); moveTo(value);
} }
void CSlider::block( bool on )
{
left.block(on);
right.block(on);
slider.block(on);
}

View File

@ -63,6 +63,7 @@ public:
void mouseMoved (SDL_MouseMotionEvent & sEvent); void mouseMoved (SDL_MouseMotionEvent & sEvent);
void moveRight(); void moveRight();
void moveTo(int to); void moveTo(int to);
void block(bool on);
void activate(); // makes button active void activate(); // makes button active
void deactivate(); // makes button inactive (but doesn't delete) void deactivate(); // makes button inactive (but doesn't delete)
void show(SDL_Surface * to = NULL); void show(SDL_Surface * to = NULL);

View File

@ -28,6 +28,21 @@
#endif #endif
extern CSharedCond<std::set<IPack*> > mess; extern CSharedCond<std::set<IPack*> > mess;
int gcd(int x, int y)
{
int temp;
if (y > x)
swap(x,y);
while (y != 0)
{
temp = y;
y = x-y;
x = temp;
if (y > x)
swap(x,y);
}
return x;
}
HeroMoveDetails::HeroMoveDetails(int3 Src, int3 Dst, CGHeroInstance*Ho) HeroMoveDetails::HeroMoveDetails(int3 Src, int3 Dst, CGHeroInstance*Ho)
:src(Src),dst(Dst),ho(Ho) :src(Src),dst(Dst),ho(Ho)
{ {
@ -543,4 +558,30 @@ std::vector < const CGObjectInstance * > CCallback::getVisitableObjs( int3 pos )
BOOST_FOREACH(const CGObjectInstance * obj, gs->map->terrain[pos.x][pos.y][pos.z].visitableObjects) BOOST_FOREACH(const CGObjectInstance * obj, gs->map->terrain[pos.x][pos.y][pos.z].visitableObjects)
ret.push_back(obj); ret.push_back(obj);
return ret; return ret;
}
void CCallback::getMarketOffer( int t1, int t2, int &give, int &rec, int mode/*=0*/ )
{
if(mode) return; //TODO - support
boost::shared_lock<boost::shared_mutex> lock(*gs->mx);
//if(gs->resVals[t1] >= gs->resVals[t2])
float r = gs->resVals[t1],
g = gs->resVals[t2] / gs->getMarketEfficiency(player,mode);
if(r>g)
{
rec = r / g;
give = 1;
}
else
{
give = g / r;
rec = 1;
}
}
void CCallback::trade( int mode, int id1, int id2, int val1 )
{
int p1, p2;
getMarketOffer(id1,id2,p1,p2,mode);
*cl->serv << ui16(511) << ui8(player) << ui32(mode) << ui32(id1) << ui32(id2) << ui32(val1);
} }

View File

@ -41,6 +41,7 @@ public:
virtual void endTurn()=0; virtual void endTurn()=0;
virtual void swapGarrisonHero(const CGTownInstance *town)=0; virtual void swapGarrisonHero(const CGTownInstance *town)=0;
virtual void buyArtifact(const CGHeroInstance *hero, int aid)=0; //used to buy artifacts in towns (including spell book in the guild and war machines in blacksmith) virtual void buyArtifact(const CGHeroInstance *hero, int aid)=0; //used to buy artifacts in towns (including spell book in the guild and war machines in blacksmith)
virtual void trade(int mode, int id1, int id2, int val1)=0; //mode==0: sell val1 units of id1 resource for id2 resiurce
//get info //get info
virtual bool verifyPath(CPath * path, bool blockSea)=0; virtual bool verifyPath(CPath * path, bool blockSea)=0;
@ -62,6 +63,7 @@ public:
virtual const StartInfo * getStartInfo()=0; virtual const StartInfo * getStartInfo()=0;
virtual std::vector < const CGObjectInstance * > getBlockingObjs(int3 pos)=0; virtual std::vector < const CGObjectInstance * > getBlockingObjs(int3 pos)=0;
virtual std::vector < const CGObjectInstance * > getVisitableObjs(int3 pos)=0; virtual std::vector < const CGObjectInstance * > getVisitableObjs(int3 pos)=0;
virtual void getMarketOffer(int t1, int t2, int &give, int &rec, int mode=0)=0;
//battle //battle
virtual int battleGetBattlefieldType()=0; // 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 virtual int battleGetBattlefieldType()=0; // 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
@ -118,6 +120,7 @@ public:
void endTurn(); void endTurn();
void swapGarrisonHero(const CGTownInstance *town); void swapGarrisonHero(const CGTownInstance *town);
void buyArtifact(const CGHeroInstance *hero, int aid); void buyArtifact(const CGHeroInstance *hero, int aid);
void trade(int mode, int id1, int id2, int val1);
//get info //get info
bool verifyPath(CPath * path, bool blockSea); bool verifyPath(CPath * path, bool blockSea);
@ -138,9 +141,10 @@ public:
int getMySerial(); int getMySerial();
const CCreatureSet* getGarrison(const CGObjectInstance *obj); const CCreatureSet* getGarrison(const CGObjectInstance *obj);
UpgradeInfo getUpgradeInfo(const CArmedInstance *obj, int stackPos); UpgradeInfo getUpgradeInfo(const CArmedInstance *obj, int stackPos);
virtual const StartInfo * getStartInfo(); const StartInfo * getStartInfo();
std::vector < const CGObjectInstance * > getBlockingObjs(int3 pos); std::vector < const CGObjectInstance * > getBlockingObjs(int3 pos);
std::vector < const CGObjectInstance * > getVisitableObjs(int3 pos); std::vector < const CGObjectInstance * > getVisitableObjs(int3 pos);
void getMarketOffer(int t1, int t2, int &give, int &rec, int mode=0);
//battle //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 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

View File

@ -280,7 +280,7 @@ void CHeroGSlot::show()
if(hero) //there is hero if(hero) //there is hero
blitAt(graphics->portraitLarge[hero->portrait],pos); blitAt(graphics->portraitLarge[hero->portrait],pos);
else if(!upg) //up garrison else if(!upg) //up garrison
blitAt((static_cast<CCastleInterface*>(LOCPLINT->curint))->flag->ourImages[(static_cast<CCastleInterface*>(LOCPLINT->curint))->town->getOwner()].bitmap,pos); blitAt(graphics->flags->ourImages[(static_cast<CCastleInterface*>(LOCPLINT->curint))->town->getOwner()].bitmap,pos);
if(highlight) if(highlight)
blitAt(graphics->bigImgs[-1],pos); blitAt(graphics->bigImgs[-1],pos);
} }
@ -348,7 +348,6 @@ CCastleInterface::CCastleInterface(const CGTownInstance * Town, bool Activate)
cityBg = BitmapHandler::loadBitmap(getBgName(Town->subID)); cityBg = BitmapHandler::loadBitmap(getBgName(Town->subID));
hall = CDefHandler::giveDef("ITMTL.DEF"); hall = CDefHandler::giveDef("ITMTL.DEF");
fort = CDefHandler::giveDef("ITMCL.DEF"); fort = CDefHandler::giveDef("ITMCL.DEF");
flag = CDefHandler::giveDef("CREST58.DEF");
hBuild = NULL; hBuild = NULL;
count=0; count=0;
town = Town; town = Town;
@ -436,7 +435,6 @@ CCastleInterface::~CCastleInterface()
delete split; delete split;
delete hall; delete hall;
delete fort; delete fort;
delete flag;
delete garr; delete garr;
delete townlist; delete townlist;
delete statusbar; delete statusbar;
@ -517,6 +515,13 @@ void CCastleInterface::buildingClicked(int building)
case 10: case 11: case 12: case 13: case 10: case 11: case 12: case 13:
enterHall(); enterHall();
break; break;
case 14:
{
deactivate();
CMarketplaceWindow *cmw = new CMarketplaceWindow(0);
cmw->activate();
break;
}
case 16: case 16:
{ {
const CGHeroInstance *hero = town->visitingHero; const CGHeroInstance *hero = town->visitingHero;

View File

@ -58,7 +58,7 @@ public:
CStatusBar * statusbar; CStatusBar * statusbar;
unsigned char animval, count; unsigned char animval, count;
CDefHandler *hall,*fort, *flag; CDefHandler *hall,*fort;
CDefEssential* bicons; //150x70 buildings imgs CDefEssential* bicons; //150x70 buildings imgs
CTownList * townlist; CTownList * townlist;

View File

@ -21,6 +21,12 @@
boost::rand48 ran; boost::rand48 ran;
#ifdef min
#undef min
#endif
#ifdef max
#undef max
#endif
CGObjectInstance * createObject(int id, int subid, int3 pos, int owner) CGObjectInstance * createObject(int id, int subid, int3 pos, int owner)
{ {
@ -931,6 +937,7 @@ void CGameState::init(StartInfo * si, Mapa * map, int Seed)
startres.push_back(k); startres.push_back(k);
} }
tis.close(); tis.close();
tis.clear();
for (std::map<ui8,PlayerState>::iterator i = players.begin(); i!=players.end(); i++) for (std::map<ui8,PlayerState>::iterator i = players.begin(); i!=players.end(); i++)
{ {
(*i).second.resources.resize(RESOURCE_QUANTITY); (*i).second.resources.resize(RESOURCE_QUANTITY);
@ -938,6 +945,15 @@ void CGameState::init(StartInfo * si, Mapa * map, int Seed)
(*i).second.resources[x] = startres[x]; (*i).second.resources[x] = startres[x];
} }
tis.open("config/resources.txt");
tis >> k;
int pom;
for(int i=0;i<k;i++)
{
tis >> pom;
resVals.push_back(pom);
}
/*************************HEROES************************************************/ /*************************HEROES************************************************/
for (int i=0; i<map->heroes.size();i++) //heroes instances for (int i=0; i<map->heroes.size();i++) //heroes instances
{ {
@ -1253,6 +1269,18 @@ UpgradeInfo CGameState::getUpgradeInfo(CArmedInstance *obj, int stackPos)
return ret; return ret;
} }
float CGameState::getMarketEfficiency( int player, int mode/*=0*/ )
{
boost::shared_lock<boost::shared_mutex> lock(*mx);
if(mode) return -1; //todo - support other modes
int mcount = 0;
for(int i=0;i<players[player].towns.size();i++)
if(vstd::contains(players[player].towns[i]->builtBuildings,14))
mcount++;
float ret = std::min(((float)mcount+1.0f)/20.0f,0.5f);
return ret;
}
int BattleInfo::calculateDmg(const CStack* attacker, const CStack* defender) int BattleInfo::calculateDmg(const CStack* attacker, const CStack* defender)
{ {
int attackDefenseBonus = attacker->creature->attack - defender->creature->defence; int attackDefenseBonus = attacker->creature->attack - defender->creature->defence;

View File

@ -130,6 +130,7 @@ private:
Mapa * map; Mapa * map;
std::map<ui8,PlayerState> players; //ID <-> playerstate std::map<ui8,PlayerState> players; //ID <-> playerstate
std::map<int, CGDefInfo*> villages, forts, capitols; //def-info for town graphics std::map<int, CGDefInfo*> villages, forts, capitols; //def-info for town graphics
std::vector<ui32> resVals;
boost::shared_mutex *mx; boost::shared_mutex *mx;
@ -150,6 +151,7 @@ private:
bool battleShootCreatureStack(int ID, int dest); bool battleShootCreatureStack(int ID, int dest);
int battleGetStack(int pos); //returns ID of stack at given tile int battleGetStack(int pos); //returns ID of stack at given tile
UpgradeInfo getUpgradeInfo(CArmedInstance *obj, int stackPos); UpgradeInfo getUpgradeInfo(CArmedInstance *obj, int stackPos);
float getMarketEfficiency(int player, int mode=0);
public: public:
int getDate(int mode=0) const; //mode=0 - total days in game, mode=1 - day of week, mode=2 - current week, mode=3 - current month int getDate(int mode=0) const; //mode=0 - total days in game, mode=1 - day of week, mode=2 - current week, mode=3 - current month

View File

@ -31,10 +31,12 @@
#include "timeHandler.h" #include "timeHandler.h"
#include <boost/algorithm/string.hpp> #include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/replace.hpp> #include <boost/algorithm/string/replace.hpp>
#include <boost/assign/std/vector.hpp>
#include <boost/thread.hpp> #include <boost/thread.hpp>
#include <cmath> #include <cmath>
#include <queue> #include <queue>
#include <sstream> #include <sstream>
using namespace boost::assign;
using namespace CSDL_Ext; using namespace CSDL_Ext;
extern TTF_Font * GEOR16; extern TTF_Font * GEOR16;
@ -52,7 +54,6 @@ public:
return (*a.first)<(*b.first); return (*a.first)<(*b.first);
} }
} ocmptwo_cgin ; } ocmptwo_cgin ;
void CGarrisonSlot::hover (bool on) void CGarrisonSlot::hover (bool on)
{ {
Hoverable::hover(on); Hoverable::hover(on);
@ -3420,4 +3421,266 @@ CCustomImgComponent::~CCustomImgComponent()
{ {
if(free) if(free)
SDL_FreeSurface(bmp); SDL_FreeSurface(bmp);
}
CMarketplaceWindow::CTradeableItem::CTradeableItem( int Type, int ID, bool Left)
{
left = Left;
type = Type;
id = ID;
}
void CMarketplaceWindow::CTradeableItem::show( SDL_Surface * to/*=NULL*/ )
{
SDL_Surface *hlp = getSurface();
blitAt(hlp,pos.x+19,pos.y+9,to);
}
void CMarketplaceWindow::CTradeableItem::clickLeft( boost::logic::tribool down )
{
CMarketplaceWindow *mw = static_cast<CMarketplaceWindow *>(LOCPLINT->curint->subInt);
if(down)
{
if(left)
{
if(mw->hLeft != this)
mw->hLeft = this;
else
return;
}
else
{
if(mw->hRight != this)
mw->hRight = this;
else
return;
}
mw->selectionChanged(left);
}
}
void CMarketplaceWindow::CTradeableItem::activate()
{
ClickableL::activate();
}
void CMarketplaceWindow::CTradeableItem::deactivate()
{
ClickableL::deactivate();
}
SDL_Surface * CMarketplaceWindow::CTradeableItem::getSurface()
{
switch(type)
{
case 0:
return graphics->resources32->ourImages[id].bitmap;
case 1:
return graphics->artDefs->ourImages[id].bitmap;
default:
return NULL;
}
}
void initItems( std::vector<CMarketplaceWindow::CTradeableItem*> &i, std::vector<SDL_Rect> &p, int type, int amount, bool left, std::vector<int> *ids/*=NULL*/ )
{
i.resize(amount);
for(int j=0;j<amount;j++)
{
i[j] = new CMarketplaceWindow::CTradeableItem(type,(ids && ids->size()>j) ? (*ids)[j] : j, left);
i[j]->pos = p[j];
}
}
void CMarketplaceWindow::setMode( int mode )
{
std::vector<SDL_Rect> lpos, rpos;
clear();
switch(mode)
{
case 0:
{
SDL_Surface *bg2 = BitmapHandler::loadBitmap("TPMRKRES.bmp");
SDL_SetColorKey(bg2,SDL_SRCCOLORKEY,SDL_MapRGB(bg2->format,0,255,255));
graphics->blueToPlayersAdv(bg2,LOCPLINT->playerID);
bg = SDL_ConvertSurface(bg2,screen->format,0);
SDL_FreeSurface(bg2);
lpos += genRect(66,69,39,180), genRect(66,69,122,180), genRect(66,69,204,180),
genRect(66,69,39,259), genRect(66,69,122,259), genRect(66,69,204,259),
genRect(66,69,122,338);
for(int i=0;i<lpos.size();i++)
{
lpos[i].x += pos.x;
lpos[i].y += pos.y;
rpos.push_back(lpos[i]);
rpos[rpos.size()-1].x += 288;
}
initItems(left,lpos,0,7,true,NULL);
initItems(right,rpos,0,7,false,NULL);
printAtMiddle(CGI->generaltexth->allTexts[158],303,28,GEORXX,tytulowy,bg); //title
printAtMiddle(CGI->generaltexth->allTexts[270],158,148,GEOR13,zwykly,bg); //kingdom res.
printAtMiddle(CGI->generaltexth->allTexts[168],450,148,GEOR13,zwykly,bg); //available for trade
}
}
}
void CMarketplaceWindow::clear()
{
for(int i=0;i<left.size();i++)
delete left[i];
for(int i=0;i<right.size();i++)
delete right[i];
left.clear();
right.clear();
SDL_FreeSurface(bg);
}
CMarketplaceWindow::CMarketplaceWindow(int Mode)
{
mode = Mode;
bg = NULL;
ok = max = deal = NULL;
pos.x = screen->w/2 - 300;
pos.y = screen->h/2 - 296;
slider = new CSlider(pos.x+231,pos.y+490,137,boost::bind(&CMarketplaceWindow::sliderMoved,this,_1),0,0);
setMode(mode);
hLeft = hRight = NULL;
ok = new AdventureMapButton("","",boost::bind(&CMarketplaceWindow::deactivate,this),pos.x+516,pos.y+520,"IOK6432.DEF");
ok->callback += boost::bind(&CMarketplaceWindow::clear,this); //clear
ok->callback += boost::bind(vstd::delObj<CMarketplaceWindow>,this); //will delete
ok->callback += boost::bind(&CMainInterface::activate,LOCPLINT->curint);
deal = new AdventureMapButton("","",boost::bind(&CMarketplaceWindow::makeDeal,this),pos.x+307,pos.y+520,"TPMRKB.DEF");
max = new AdventureMapButton("","",boost::bind(&CMarketplaceWindow::setMax,this),pos.x+229,pos.y+520,"IRCBTNS.DEF");
max->block(true);
deal->block(true);
}
CMarketplaceWindow::~CMarketplaceWindow()
{
delete slider;
}
void CMarketplaceWindow::show( SDL_Surface * to/*=NULL*/ )
{
blitAt(bg,pos);
if(hRight)
CSDL_Ext::drawBorder(screen,hRight->pos.x-1,hRight->pos.y-1,hRight->pos.w+2,hRight->pos.h+2,int3(255,231,148));
if(hLeft)
CSDL_Ext::drawBorder(screen,hLeft->pos.x-1,hLeft->pos.y-1,hLeft->pos.w+2,hLeft->pos.h+2,int3(255,231,148));
ok->show();
deal->show();
max->show();
slider->show();
for(int i=0;i<left.size();i++)
left[i]->show();
for(int i=0;i<right.size();i++)
right[i]->show();
if(mode==0)
{
char buf[15];
for(int i=0;i<left.size();i++)
{
SDL_itoa(LOCPLINT->cb->getResourceAmount(i),buf,10);
printAtMiddle(buf,left[i]->pos.x+35,left[i]->pos.y+56,GEOR13,zwykly);
}
if(hLeft) //print prices
{
for(int i=0; i<right.size();i++)
{
if(right[i]->id != hLeft->id)
printAtMiddle(rSubs[i],right[i]->pos.x+35,right[i]->pos.y+56,GEOR13,zwykly);
else
printAtMiddle(CGI->generaltexth->allTexts[164],right[i]->pos.x+35,right[i]->pos.y+56,GEOR13,zwykly);
}
}
if(hLeft && hRight && hLeft->id!= hRight->id)
{
blitAt(hLeft->getSurface(),pos.x+142,pos.y+457,screen);
blitAt(hRight->getSurface(),pos.x+430,pos.y+457,screen);
SDL_itoa(slider->value * r1,buf,10);
printAtMiddle(buf,pos.x+158,pos.y+504,GEOR13,zwykly);
SDL_itoa(slider->value * r2,buf,10);
printAtMiddle(buf,pos.x+446,pos.y+504,GEOR13,zwykly);
}
}
}
void CMarketplaceWindow::activate()
{
LOCPLINT->objsToBlit += this;
LOCPLINT->curint->subInt = this;
for(int i=0;i<left.size();i++)
left[i]->activate();
for(int i=0;i<right.size();i++)
right[i]->activate();
ok->activate();
max->activate();
deal->activate();
slider->activate();
}
void CMarketplaceWindow::deactivate()
{
LOCPLINT->objsToBlit -= this;
LOCPLINT->curint->subInt = NULL;
for(int i=0;i<left.size();i++)
left[i]->deactivate();
for(int i=0;i<right.size();i++)
right[i]->deactivate();
ok->deactivate();
max->deactivate();
deal->deactivate();
slider->deactivate();
}
void CMarketplaceWindow::setMax()
{
slider->moveTo(slider->amount);
}
void CMarketplaceWindow::makeDeal()
{
LOCPLINT->cb->trade(mode,hLeft->id,hRight->id,slider->value*r1);
slider->moveTo(0);
hLeft = NULL;
selectionChanged(true);
}
void CMarketplaceWindow::sliderMoved( int to )
{
}
void CMarketplaceWindow::selectionChanged(bool side)
{
if(hLeft && hRight && hLeft->id!= hRight->id)
{
LOCPLINT->cb->getMarketOffer(hLeft->id,hRight->id,r1,r2,0);
slider->amount = LOCPLINT->cb->getResourceAmount(hLeft->id) / r1;
slider->moveTo(0);
max->block(false);
deal->block(false);
}
else
{
max->block(true);
deal->block(true);
slider->amount = 0;
slider->moveTo(0);
}
if(side && hLeft) //left selection changed, recalculate offers
{
rSubs.clear();
rSubs.resize(right.size());
int h1, h2;
for(int i=0;i<right.size();i++)
{
std::ostringstream oss;
LOCPLINT->cb->getMarketOffer(hLeft->id,i,h1,h2,0);
oss << h2;
if(h1!=1)
oss << "/" << h1;
rSubs[i] = oss.str();
}
}
} }

View File

@ -592,6 +592,48 @@ public:
~CMinorResDataBar(); ~CMinorResDataBar();
}; };
class CMarketplaceWindow : public IShowActivable, public CIntObject
{
public:
class CTradeableItem : public ClickableL
{
public:
int type; //0 - res, 1 - artif big, 2 - artif small, 3 - player flag
int id;
bool left;
CFunctionList<void()> callback;
void activate();
void deactivate();
void show(SDL_Surface * to=NULL);
void clickLeft(boost::logic::tribool down);
SDL_Surface *getSurface();
CTradeableItem(int Type, int ID, bool Left);
};
SDL_Surface *bg;
std::vector<CTradeableItem*> left, right;
std::vector<std::string> rSubs;
CTradeableItem *hLeft, *hRight; //highlighted items (NULL if no highlight)
int mode,//0 - res<->res; 1 - res<->plauer; 2 - buy artifact; 3 - sell artifact
r1, r2;
AdventureMapButton *ok, *max, *deal;
CSlider *slider;
void activate();
void deactivate();
void show(SDL_Surface * to=NULL);
void setMax();
void sliderMoved(int to);
void makeDeal();
void selectionChanged(bool side); //true == left
CMarketplaceWindow(int Mode=0);
~CMarketplaceWindow();
void setMode(int mode);
void clear();
};
extern CPlayerInterface * LOCPLINT; extern CPlayerInterface * LOCPLINT;
#endif //CPLAYERINTERFACE_H #endif //CPLAYERINTERFACE_H

View File

@ -192,6 +192,7 @@ Graphics::Graphics()
tasks += GET_DEF(resources32,"RESOURCE.DEF"); tasks += GET_DEF(resources32,"RESOURCE.DEF");
tasks += GET_DEF(smi,"CPRSMALL.DEF"); tasks += GET_DEF(smi,"CPRSMALL.DEF");
tasks += GET_DEF(smi2,"TWCRPORT.DEF"); tasks += GET_DEF(smi2,"TWCRPORT.DEF");
tasks += GET_DEF(flags,"CREST58.DEF");
std::ifstream ifs("config/cr_bgs.txt"); std::ifstream ifs("config/cr_bgs.txt");
int id; int id;

View File

@ -30,6 +30,7 @@ public:
CDefHandler * pskillsm; //42x42 CDefHandler * pskillsm; //42x42
CDefHandler * un44; //many things CDefHandler * un44; //many things
CDefHandler * smallIcons, *resources32; //resources 32x32 CDefHandler * smallIcons, *resources32; //resources 32x32
CDefHandler * flags;
//creatures //creatures
std::map<int,SDL_Surface*> smallImgs; //creature ID -> small 32x32 img of creature; //ID=-2 is for blank (black) img; -1 for the border std::map<int,SDL_Surface*> smallImgs; //creature ID -> small 32x32 img of creature; //ID=-2 is for blank (black) img; -1 for the border
std::map<int,SDL_Surface*> bigImgs; //creature ID -> big 58x64 img of creature; //ID=-2 is for blank (black) img; -1 for the border std::map<int,SDL_Surface*> bigImgs; //creature ID -> big 58x64 img of creature; //ID=-2 is for blank (black) img; -1 for the border

2
config/resources.txt Normal file
View File

@ -0,0 +1,2 @@
8
250 500 250 500 500 500 1 0

View File

@ -16,7 +16,7 @@ typedef boost::int8_t si8; //signed int 8 bits (1 byte)
#define THC #define THC
#endif #endif
#define NAME_VER ("VCMI 0.62") #define NAME_VER ("VCMI 0.63")
#ifdef _WIN32 #ifdef _WIN32
@ -141,7 +141,7 @@ namespace vstd
return -1; return -1;
} }
template <typename T1, typename T2, typename Func> template <typename T1, typename T2, typename Func>
int findPos(const std::vector<T1> & c, const T2 &s, Func &f) //Func(T1,T2) must say if these elements matches int findPos(const std::vector<T1> & c, const T2 &s, const Func &f) //Func(T1,T2) must say if these elements matches
{ {
for(int i=0;i<c.size();i++) for(int i=0;i<c.size();i++)
if(f(c[i],s)) if(f(c[i],s))
@ -162,6 +162,11 @@ namespace vstd
c.erase(itr); c.erase(itr);
return true; return true;
} }
template <typename t1>
void delObj(t1 *a1)
{
delete a1;
}
template <typename t1, typename t2> template <typename t1, typename t2>
void assign(t1 &a1, const t2 &a2) void assign(t1 &a1, const t2 &a2)
{ {

View File

@ -42,10 +42,48 @@ CConnection::CConnection(std::string host, std::string port, std::string Name, s
boost::system::error_code error = asio::error::host_not_found; boost::system::error_code error = asio::error::host_not_found;
socket = new tcp::socket(*io_service); socket = new tcp::socket(*io_service);
tcp::resolver resolver(*io_service); tcp::resolver resolver(*io_service);
tcp::resolver::iterator endpoint_iterator = resolver.resolve(tcp::resolver::query(host,port)); tcp::resolver::iterator end, pom, endpoint_iterator = resolver.resolve(tcp::resolver::query(host,port),error);
socket->connect(*endpoint_iterator, error); if(error)
if (error){ delete socket; throw "Can't establish connection :("; } {
init(); std::cout << "Problem with resolving. " << std::endl << error <<std::endl;
goto connerror1;
}
pom = endpoint_iterator;
if(pom != end)
std::cout<<"Found endpoints:" << std::endl;
else
{
std::cout<< "Critical problem: No endpoints found!" << std::endl;
goto connerror1;
}
while(pom != end)
{
std::cout << (boost::asio::ip::tcp::endpoint&)*pom << std::endl;
pom++;
}
while(endpoint_iterator != end)
{
socket->connect(*endpoint_iterator, error);
if(!error)
{
init();
return;
}
else
{
std::cout << "Problem with connecting. " << std::endl;
}
}
//we shouldn't be here - error handling
connerror1:
if(error)
std::cout << error <<std::endl;
else
std::cout << "No error info. " << std::endl;
delete io_service;
delete socket;
throw std::string("Can't establish connection :(");
} }
CConnection::CConnection( CConnection::CConnection(
boost::asio::basic_stream_socket<boost::asio::ip::tcp , boost::asio::stream_socket_service<boost::asio::ip::tcp> > * Socket, boost::asio::basic_stream_socket<boost::asio::ip::tcp , boost::asio::stream_socket_service<boost::asio::ip::tcp> > * Socket,

View File

@ -477,8 +477,8 @@ void Mapa::initFromBytes(unsigned char * bufor)
if(!objects[f]->defInfo) if(!objects[f]->defInfo)
continue; continue;
addBlockVisTiles(objects[f]); addBlockVisTiles(objects[f]);
} }
std::cout<<"\tCalculating blocked/visitable tiles: "<<th.getDif()<<std::endl;
} }
void Mapa::removeBlockVisTiles(CGObjectInstance * obj) void Mapa::removeBlockVisTiles(CGObjectInstance * obj)
{ {

View File

@ -811,6 +811,26 @@ upgend:
sha.artifWorn[9+aid] = aid; sha.artifWorn[9+aid] = aid;
sendAndApply(&sha); sendAndApply(&sha);
} }
break;
}
case 511: //trade at marketplace
{
ui8 player;
ui32 mode, id1, id2, val;
c >> player >> mode >> id1 >> id2 >> val;
val = std::min(si32(val),gs->players[player].resources[id1]);
double uzysk = (double)gs->resVals[id1] * val * gs->getMarketEfficiency(player);
uzysk /= gs->resVals[id2];
SetResource sr;
sr.player = player;
sr.resid = id1;
sr.val = gs->players[player].resources[id1] - val;
sendAndApply(&sr);
sr.resid = id2;
sr.val = gs->players[player].resources[id2] + (int)uzysk;
sendAndApply(&sr);
break; break;
} }
case 2001: case 2001:
@ -954,9 +974,11 @@ CGameHandler::~CGameHandler(void)
void CGameHandler::init(StartInfo *si, int Seed) void CGameHandler::init(StartInfo *si, int Seed)
{ {
Mapa *map = new Mapa(si->mapname); Mapa *map = new Mapa(si->mapname);
std::cout << "Map loaded!" << std::endl;
gs = new CGameState(); gs = new CGameState();
std::cout << "Gamestate created!" << std::endl;
gs->init(si,map,Seed); gs->init(si,map,Seed);
std::cout << "Gamestate initialized!" << std::endl;
/****************************LUA OBJECT SCRIPTS************************************************/ /****************************LUA OBJECT SCRIPTS************************************************/
//std::vector<std::string> * lf = CLuaHandler::searchForScripts("scripts/lua/objects"); //files //std::vector<std::string> * lf = CLuaHandler::searchForScripts("scripts/lua/objects"); //files
//for (int i=0; i<lf->size(); i++) //for (int i=0; i<lf->size(); i++)

View File

@ -26,6 +26,7 @@ bool end2 = false;
CVCMIServer::CVCMIServer() CVCMIServer::CVCMIServer()
: io(new io_service()), acceptor(new tcp::acceptor(*io, tcp::endpoint(tcp::v4(), 3030))) : io(new io_service()), acceptor(new tcp::acceptor(*io, tcp::endpoint(tcp::v4(), 3030)))
{ {
std::cout << "CVCMIServer created!" <<std::endl;
} }
CVCMIServer::~CVCMIServer() CVCMIServer::~CVCMIServer()
{ {
@ -94,9 +95,10 @@ void CVCMIServer::start()
acceptor->accept(*s,error); acceptor->accept(*s,error);
if (error) if (error)
{ {
std::cout<<"Got connection but there is an error " << std::endl; std::cout<<"Got connection but there is an error " << std::endl << error;
return; return;
} }
std::cout<<"We've accepted someone... " << std::endl;
CConnection *connection = new CConnection(s,NAME,std::cout); CConnection *connection = new CConnection(s,NAME,std::cout);
std::cout<<"Got connection!" << std::endl; std::cout<<"Got connection!" << std::endl;
while(!end2) while(!end2)