Browse Source

* version set to 0.63
* mostly done morketplace
* more logging around netcode

Michał W. Urbańczyk 17 years ago
parent
commit
3d147a7be8

+ 7 - 1
AdventureMapButton.cpp

@@ -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);
+}

+ 1 - 0
AdventureMapButton.h

@@ -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);

+ 41 - 0
CCallback.cpp

@@ -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);
 }
 }

+ 5 - 1
CCallback.h

@@ -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

+ 8 - 3
CCastleInterface.cpp

@@ -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;

+ 1 - 1
CCastleInterface.h

@@ -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;
 
 

+ 28 - 0
CGameState.cpp

@@ -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;

+ 2 - 0
CGameState.h

@@ -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
 
 

+ 264 - 1
CPlayerInterface.cpp

@@ -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();
+		}
+	}
 }
 }

+ 42 - 0
CPlayerInterface.h

@@ -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

+ 1 - 0
client/Graphics.cpp

@@ -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;

+ 1 - 0
client/Graphics.h

@@ -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 - 0
config/resources.txt

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

+ 7 - 2
global.h

@@ -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)
 	{
 	{

+ 42 - 4
lib/Connection.cpp

@@ -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));
-    socket->connect(*endpoint_iterator, error);
-	if (error){ delete socket;	throw "Can't establish connection :("; }
-	init();
+    tcp::resolver::iterator end, pom, endpoint_iterator = resolver.resolve(tcp::resolver::query(host,port),error);
+	if(error)
+	{
+		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, 

+ 1 - 1
map.cpp

@@ -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)
 {
 {

+ 23 - 1
server/CGameHandler.cpp

@@ -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++)

+ 3 - 1
server/CVCMIServer.cpp

@@ -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)