mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	* upgrading creatures
* splitted map loading on several functions * buttons can call multiple functions when pressed * minor
This commit is contained in:
		| @@ -16,54 +16,13 @@ AdventureMapButton::AdventureMapButton () | ||||
| 	state=0; | ||||
| 	actOnDown = false; | ||||
| } | ||||
|  | ||||
| AdventureMapButton::AdventureMapButton | ||||
| ( std::string Name, std::string HelpBox, boost::function<void()> Callback, int x, int y, std::string defName, bool activ,  std::vector<std::string> * add, bool playerColoredButton ) | ||||
| AdventureMapButton::AdventureMapButton( std::string Name, std::string HelpBox, boost::function<void()> Callback, int x, int y, std::string defName, bool activ,  std::vector<std::string> * add, bool playerColoredButton) | ||||
| { | ||||
| 	callback = Callback; | ||||
| 	actOnDown = false; | ||||
| 	type=2; | ||||
| 	abs=true; | ||||
| 	active=false; | ||||
| 	ourObj=NULL; | ||||
| 	state=0; | ||||
| 	name=Name; | ||||
| 	helpBox=HelpBox; | ||||
| 	colorChange = playerColoredButton; | ||||
| 	int est = LOCPLINT->playerID; | ||||
| 	CDefHandler * temp = CDefHandler::giveDef(defName);  | ||||
| 	temp->notFreeImgs = true; | ||||
| 	for (int i=0;i<temp->ourImages.size();i++) | ||||
| 	{ | ||||
| 		imgs.resize(1); | ||||
| 		imgs[0].push_back(temp->ourImages[i].bitmap); | ||||
| 		if(playerColoredButton) | ||||
| 			graphics->blueToPlayersAdv(imgs[curimg][i],LOCPLINT->playerID); | ||||
| 	init(Callback, Name, HelpBox, playerColoredButton, defName, add, x, y, activ); | ||||
| } | ||||
| 	delete temp; | ||||
| 	if (add) | ||||
| AdventureMapButton::AdventureMapButton( std::string Name, std::string HelpBox, CFunctionList<void()> Callback, int x, int y, std::string defName, bool activ,  std::vector<std::string> * add, bool playerColoredButton ) | ||||
| { | ||||
| 		imgs.resize(imgs.size()+add->size()); | ||||
| 		for (int i=0; i<add->size();i++) | ||||
| 		{ | ||||
| 			temp = CDefHandler::giveDef((*add)[i]); | ||||
| 			temp->notFreeImgs = true; | ||||
| 			for (int j=0;j<temp->ourImages.size();j++) | ||||
| 			{ | ||||
| 				imgs[i+1].push_back(temp->ourImages[j].bitmap); | ||||
| 				if(playerColoredButton) | ||||
| 					graphics->blueToPlayersAdv(imgs[1+i][j],LOCPLINT->playerID); | ||||
| 			} | ||||
| 			delete temp; | ||||
| 		} | ||||
| 		delete add; | ||||
| 	} | ||||
| 	pos.x=x; | ||||
| 	pos.y=y; | ||||
| 	pos.w = imgs[curimg][0]->w; | ||||
| 	pos.h = imgs[curimg][0]->h  -1; | ||||
| 	if (activ) | ||||
| 		activate(); | ||||
| 	init(Callback, Name, HelpBox, playerColoredButton, defName, add, x, y, activ); | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -81,13 +40,13 @@ void AdventureMapButton::clickLeft (tribool down) | ||||
| 	if (actOnDown && down) | ||||
| 	{ | ||||
| 		pressedL=state; | ||||
| 		if(!callback.empty()) | ||||
| 		//if(!callback.empty()) | ||||
| 			callback(); | ||||
| 	} | ||||
| 	else if (pressedL && (down==false)) | ||||
| 	{ | ||||
| 		pressedL=state; | ||||
| 		if(!callback.empty()) | ||||
| 		//if(!callback.empty()) | ||||
| 			callback(); | ||||
| 	} | ||||
| 	else | ||||
| @@ -139,6 +98,53 @@ void AdventureMapButton::deactivate() | ||||
| 	KeyInterested::deactivate(); | ||||
| } | ||||
|  | ||||
| void AdventureMapButton::init( CFunctionList<void()> Callback, std::string Name, std::string HelpBox, bool playerColoredButton, std::string defName, std::vector<std::string> * add, int x, int y, bool activ ) | ||||
| { | ||||
| 	callback = Callback; | ||||
| 	actOnDown = false; | ||||
| 	type=2; | ||||
| 	abs=true; | ||||
| 	active=false; | ||||
| 	ourObj=NULL; | ||||
| 	state=0; | ||||
| 	name=Name; | ||||
| 	helpBox=HelpBox; | ||||
| 	colorChange = playerColoredButton; | ||||
| 	int est = LOCPLINT->playerID; | ||||
| 	CDefHandler * temp = CDefHandler::giveDef(defName);  | ||||
| 	temp->notFreeImgs = true; | ||||
| 	for (int i=0;i<temp->ourImages.size();i++) | ||||
| 	{ | ||||
| 		imgs.resize(1); | ||||
| 		imgs[0].push_back(temp->ourImages[i].bitmap); | ||||
| 		if(playerColoredButton) | ||||
| 			graphics->blueToPlayersAdv(imgs[curimg][i],LOCPLINT->playerID); | ||||
| 	} | ||||
| 	delete temp; | ||||
| 	if (add) | ||||
| 	{ | ||||
| 		imgs.resize(imgs.size()+add->size()); | ||||
| 		for (int i=0; i<add->size();i++) | ||||
| 		{ | ||||
| 			temp = CDefHandler::giveDef((*add)[i]); | ||||
| 			temp->notFreeImgs = true; | ||||
| 			for (int j=0;j<temp->ourImages.size();j++) | ||||
| 			{ | ||||
| 				imgs[i+1].push_back(temp->ourImages[j].bitmap); | ||||
| 				if(playerColoredButton) | ||||
| 					graphics->blueToPlayersAdv(imgs[1+i][j],LOCPLINT->playerID); | ||||
| 			} | ||||
| 			delete temp; | ||||
| 		} | ||||
| 		delete add; | ||||
| 	} | ||||
| 	pos.x=x; | ||||
| 	pos.y=y; | ||||
| 	pos.w = imgs[curimg][0]->w; | ||||
| 	pos.h = imgs[curimg][0]->h  -1; | ||||
| 	if (activ) | ||||
| 		activate(); | ||||
| } | ||||
|  | ||||
| void CSlider::sliderClicked() | ||||
| { | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| #pragma once | ||||
| #include "CPlayerInterface.h" | ||||
| #include <boost/function.hpp> | ||||
| #include "client/FunctionList.h" | ||||
| #include <boost/bind.hpp> | ||||
| class AdventureMapButton  | ||||
| 	: public ClickableL, public ClickableR, public Hoverable, public KeyInterested, public CButtonBase | ||||
| @@ -9,7 +9,7 @@ public: | ||||
| 	std::string name; //for status bar  | ||||
| 	std::string helpBox; //for right-click help | ||||
| 	char key; //key shortcut | ||||
| 	boost::function<void()> callback; | ||||
| 	CFunctionList<void()> callback; | ||||
| 	bool colorChange, | ||||
| 		actOnDown; //runs when mouse is pressed down over it, not when up | ||||
|  | ||||
| @@ -21,7 +21,10 @@ public: | ||||
| 	void deactivate(); // makes button inactive (but doesn't delete) | ||||
|  | ||||
| 	AdventureMapButton(); //c-tor | ||||
| 	AdventureMapButton( std::string Name, std::string HelpBox, CFunctionList<void()> Callback, int x, int y, std::string defName, bool activ=false,  std::vector<std::string> * add = NULL, bool playerColoredButton = false );//c-tor | ||||
| 	AdventureMapButton( std::string Name, std::string HelpBox, boost::function<void()> Callback, int x, int y, std::string defName, bool activ=false,  std::vector<std::string> * add = NULL, bool playerColoredButton = false );//c-tor | ||||
|  | ||||
| 	void init( CFunctionList<void()> Callback, std::string Name, std::string HelpBox, bool playerColoredButton, std::string defName, std::vector<std::string> * add, int x, int y, bool activ ); | ||||
| }; | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -124,7 +124,7 @@ bool CCallback::dismissCreature(const CArmedInstance *obj, int stackPos) | ||||
| } | ||||
| bool CCallback::upgradeCreature(const CArmedInstance *obj, int stackPos, int newID) | ||||
| { | ||||
| 	//TODO: write | ||||
| 	*cl->serv << ui16(507) << obj->id <<  ui8(stackPos) << ui32(newID); | ||||
| 	return false; | ||||
| } | ||||
| void CCallback::endTurn() | ||||
| @@ -136,40 +136,7 @@ void CCallback::endTurn() | ||||
| } | ||||
| UpgradeInfo CCallback::getUpgradeInfo(const CArmedInstance *obj, int stackPos) | ||||
| { | ||||
| 	UpgradeInfo ret; | ||||
| 	CCreature *base = &CGI->creh->creatures[((CArmedInstance *)obj)->army.slots[stackPos].first]; | ||||
| 	if((obj->ID == 98)  ||  ((obj->ID == 34) && static_cast<const CGHeroInstance*>(obj)->visitedTown)) | ||||
| 	{ | ||||
| 		CGTownInstance * t; | ||||
| 		if(obj->ID == 98) | ||||
| 			t = static_cast<CGTownInstance *>(const_cast<CArmedInstance *>(obj)); | ||||
| 		else | ||||
| 			t = static_cast<const CGHeroInstance*>(obj)->visitedTown; | ||||
| 		for(std::set<si32>::iterator i=t->builtBuildings.begin();  i!=t->builtBuildings.end(); i++) | ||||
| 		{ | ||||
| 			if( (*i) >= 37   &&   (*i) < 44 ) //upgraded creature dwelling | ||||
| 			{ | ||||
| 				int nid = t->town->upgradedCreatures[(*i)-37]; //upgrade offered by that building | ||||
| 				if(base->upgrades.find(nid) != base->upgrades.end()) //possible upgrade | ||||
| 				{ | ||||
| 					ret.newID.push_back(nid); | ||||
| 					ret.cost.push_back(std::set<std::pair<int,int> >()); | ||||
| 					for(int j=0;j<RESOURCE_QUANTITY;j++) | ||||
| 					{ | ||||
| 						int dif = CGI->creh->creatures[nid].cost[j] - base->cost[j]; | ||||
| 						if(dif) | ||||
| 							ret.cost[ret.cost.size()-1].insert(std::make_pair(j,dif)); | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		}//end for | ||||
| 	} | ||||
| 	//TODO: check if hero ability makes some upgrades possible | ||||
|  | ||||
| 	if(ret.newID.size()) | ||||
| 		ret.oldID = base->idNumber; | ||||
|  | ||||
| 	return ret; | ||||
| 	return gs->getUpgradeInfo(const_cast<CArmedInstance*>(obj),stackPos); | ||||
| } | ||||
|  | ||||
| const StartInfo * CCallback::getStartInfo() | ||||
|   | ||||
| @@ -24,13 +24,6 @@ class CStack; | ||||
| struct lua_State; | ||||
| class CClient; | ||||
| //structure gathering info about upgrade possibilites | ||||
| struct UpgradeInfo | ||||
| { | ||||
| 	int oldID; //creature to be upgraded | ||||
| 	std::vector<int> newID; //possible upgrades | ||||
| 	std::vector<std::set<std::pair<int,int> > > cost; // cost[upgrade_serial] -> set of pairs<resource_ID,resource_amount> | ||||
| 	UpgradeInfo(){oldID = -1;}; | ||||
| }; | ||||
|  | ||||
| class ICallback | ||||
| { | ||||
|   | ||||
| @@ -3,9 +3,8 @@ | ||||
| #include "global.h" | ||||
| #include <set> | ||||
| #include <vector> | ||||
| #include <boost/function.hpp> | ||||
| #include "lib/BattleAction.h" | ||||
| BOOST_TRIBOOL_THIRD_STATE(outOfRange) | ||||
| #include "client/FunctionList.h" | ||||
|  | ||||
| using namespace boost::logic; | ||||
| class CCallback; | ||||
| @@ -55,8 +54,8 @@ public: | ||||
| 	virtual void tileRevealed(int3 pos){}; | ||||
| 	virtual void tileHidden(int3 pos){}; | ||||
| 	virtual void receivedResource(int type, int val){}; | ||||
| 	virtual void showInfoDialog(std::string text, std::vector<Component*> &components){}; | ||||
| 	virtual void showSelDialog(std::string text, std::vector<Component*> &components, ui32 askID){}; | ||||
| 	virtual void showInfoDialog(std::string &text, std::vector<Component*> &components){}; | ||||
| 	virtual void showSelDialog(std::string &text, std::vector<Component*> &components, ui32 askID){}; | ||||
| 	virtual void garrisonChanged(const CGObjectInstance * obj){}; | ||||
| 	virtual void buildChanged(const CGTownInstance *town, int buildingID, int what){}; //what: 1 - built, 2 - demolished | ||||
| 	virtual void heroGotLevel(const CGHeroInstance *hero, int pskill, std::vector<ui16> &skills, boost::function<void(ui32)> &callback)=0; //pskill is gained primary skill, interface has to choose one of given skills and call callback with selection id | ||||
|   | ||||
| @@ -1056,6 +1056,43 @@ int CGameState::battleGetStack(int pos) | ||||
| 	return -1; | ||||
| } | ||||
|  | ||||
| UpgradeInfo CGameState::getUpgradeInfo(CArmedInstance *obj, int stackPos) | ||||
| { | ||||
| 	UpgradeInfo ret; | ||||
| 	CCreature *base = &VLC->creh->creatures[obj->army.slots[stackPos].first]; | ||||
| 	if((obj->ID == 98)  ||  ((obj->ID == 34) && static_cast<const CGHeroInstance*>(obj)->visitedTown)) | ||||
| 	{ | ||||
| 		CGTownInstance * t; | ||||
| 		if(obj->ID == 98) | ||||
| 			t = static_cast<CGTownInstance *>(const_cast<CArmedInstance *>(obj)); | ||||
| 		else | ||||
| 			t = static_cast<const CGHeroInstance*>(obj)->visitedTown; | ||||
| 		for(std::set<si32>::iterator i=t->builtBuildings.begin();  i!=t->builtBuildings.end(); i++) | ||||
| 		{ | ||||
| 			if( (*i) >= 37   &&   (*i) < 44 ) //upgraded creature dwelling | ||||
| 			{ | ||||
| 				int nid = t->town->upgradedCreatures[(*i)-37]; //upgrade offered by that building | ||||
| 				if(base->upgrades.find(nid) != base->upgrades.end()) //possible upgrade | ||||
| 				{ | ||||
| 					ret.newID.push_back(nid); | ||||
| 					ret.cost.push_back(std::set<std::pair<int,int> >()); | ||||
| 					for(int j=0;j<RESOURCE_QUANTITY;j++) | ||||
| 					{ | ||||
| 						int dif = VLC->creh->creatures[nid].cost[j] - base->cost[j]; | ||||
| 						if(dif) | ||||
| 							ret.cost[ret.cost.size()-1].insert(std::make_pair(j,dif)); | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		}//end for | ||||
| 	} | ||||
| 	//TODO: check if hero ability makes some upgrades possible | ||||
|  | ||||
| 	if(ret.newID.size()) | ||||
| 		ret.oldID = base->idNumber; | ||||
|  | ||||
| 	return ret; | ||||
| } | ||||
| int BattleInfo::calculateDmg(const CStack* attacker, const CStack* defender) | ||||
| { | ||||
| 	int attackDefenseBonus = attacker->creature->attack - defender->creature->defence; | ||||
|   | ||||
| @@ -111,6 +111,14 @@ public: | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| struct UpgradeInfo | ||||
| { | ||||
| 	int oldID; //creature to be upgraded | ||||
| 	std::vector<int> newID; //possible upgrades | ||||
| 	std::vector<std::set<std::pair<int,int> > > cost; // cost[upgrade_serial] -> set of pairs<resource_ID,resource_amount> | ||||
| 	UpgradeInfo(){oldID = -1;}; | ||||
| }; | ||||
|  | ||||
| class DLL_EXPORT CGameState | ||||
| { | ||||
| private: | ||||
| @@ -141,6 +149,7 @@ private: | ||||
| 	bool battleAttackCreatureStack(int ID, int dest); | ||||
| 	bool battleShootCreatureStack(int ID, int dest); | ||||
| 	int battleGetStack(int pos); //returns ID of stack at given tile | ||||
| 	UpgradeInfo getUpgradeInfo(CArmedInstance *obj, int stackPos); | ||||
| 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 | ||||
| 	 | ||||
|   | ||||
| @@ -1,4 +1,5 @@ | ||||
| #include "stdafx.h" | ||||
| #include <cstdlib> | ||||
| #include "global.h" | ||||
| #include "CHeroWindow.h" | ||||
| #include "CGameInfo.h" | ||||
|   | ||||
							
								
								
									
										214
									
								
								CMessage.cpp
									
									
									
									
									
								
							
							
						
						
									
										214
									
								
								CMessage.cpp
									
									
									
									
									
								
							| @@ -14,6 +14,7 @@ | ||||
| #include <sstream> | ||||
| #include "hch/CGeneralTextHandler.h" | ||||
| #include "client/Graphics.h" | ||||
| #include "CAdvmapInterface.h" | ||||
| SDL_Color tytulowy, tlo, zwykly ; | ||||
| SDL_Rect genRect(int hh, int ww, int xx, int yy); | ||||
|  | ||||
| @@ -86,7 +87,7 @@ void CMessage::dispose() | ||||
| 	delete ok; | ||||
| 	delete cancel; | ||||
| } | ||||
| SDL_Surface * CMessage::drawBox1(int w, int h, int playerColor) | ||||
| SDL_Surface * CMessage::drawBox1(int w, int h, int playerColor) //draws box for window | ||||
| { | ||||
| 	//prepare surface | ||||
| 	SDL_Surface * ret = SDL_CreateRGBSurface(screen->flags, w, h, screen->format->BitsPerPixel, screen->format->Rmask, screen->format->Gmask, screen->format->Bmask, screen->format->Amask); | ||||
| @@ -187,7 +188,7 @@ std::vector<std::string> * CMessage::breakText(std::string text, int line, bool | ||||
| 	} | ||||
| 	return ret; | ||||
| } | ||||
| std::pair<int, int> CMessage::getMaxSizes(std::vector< std::vector<CSelectableComponent*> > * komp) | ||||
| std::pair<int, int> CMessage::getMaxSizes(std::vector< std::vector<SComponent*> > * komp) | ||||
| { | ||||
| 	std::pair<int,int> ret; | ||||
| 	for (int i=0;i<komp->size();i++) | ||||
| @@ -254,7 +255,6 @@ SDL_Surface * CMessage::blitCompsOnSur(std::vector<SComponent*> & comps, int max | ||||
| 		brdtext = breakText(comps[0]->subtitle,12,true,true); | ||||
| 	else | ||||
| 		brdtext = NULL; | ||||
| 	curh += 30; | ||||
| 	comps[0]->pos.x = (ret->w/2) - ((comps[0]->getImg()->w)/2); | ||||
| 	comps[0]->pos.y = curh; | ||||
| 	blitAt(comps[0]->getImg(),comps[0]->pos.x,comps[0]->pos.y,ret); | ||||
| @@ -268,7 +268,7 @@ SDL_Surface * CMessage::blitCompsOnSur(std::vector<SComponent*> & comps, int max | ||||
| 	} | ||||
| 	return ret; | ||||
| } | ||||
| SDL_Surface* CMessage::blitCompsOnSur(SDL_Surface * _or, std::vector< std::vector<CSelectableComponent*> > *  komp, int inter, int &curh, SDL_Surface *ret) | ||||
| SDL_Surface* CMessage::blitCompsOnSur(SDL_Surface * _or, std::vector< std::vector<SComponent*> > *  komp, int inter, int &curh, SDL_Surface *ret) | ||||
| { | ||||
| 	for (int i=0;i<komp->size();i++) | ||||
| 	{ | ||||
| @@ -279,7 +279,11 @@ SDL_Surface* CMessage::blitCompsOnSur(SDL_Surface * _or, std::vector< std::vecto | ||||
| 			if(maxh<(*komp)[i][j]->getImg()->h) | ||||
| 				maxh=(*komp)[i][j]->getImg()->h; | ||||
| 		} | ||||
| 		if(_or) | ||||
| 			totalw += (inter*2+_or->w) * ((*komp)[i].size() - 1); | ||||
| 		else | ||||
| 			totalw += (inter) * ((*komp)[i].size() - 1); | ||||
|  | ||||
| 		curh+=maxh/2; | ||||
| 		int curw = (ret->w/2)-(totalw/2); | ||||
| 		for(int j=0;j<(*komp)[i].size();j++) | ||||
| @@ -290,14 +294,18 @@ SDL_Surface* CMessage::blitCompsOnSur(SDL_Surface * _or, std::vector< std::vecto | ||||
| 			CSDL_Ext::printAtMiddle((*komp)[i][j]->subtitle,curw+(*komp)[i][j]->getImg()->w/2,curh+((*komp)[i][j]->getImg()->h/2)+10,GEOR13,zwykly,ret); | ||||
| 			curw += (*komp)[i][j]->getImg()->w; | ||||
| 			if(j<((*komp)[i].size()-1)) | ||||
| 			{ | ||||
| 				if(_or) | ||||
| 				{ | ||||
| 					curw+=inter; | ||||
| 					blitAt(_or,curw,curh-(_or->h/2),ret); | ||||
| 					curw+=_or->w; | ||||
| 				} | ||||
| 				curw+=inter; | ||||
| 			} | ||||
| 		} | ||||
| 		curh+=maxh/2; | ||||
| 		curh += 20; //todo: check subtitle length | ||||
| 	} | ||||
| 	return ret; | ||||
| } | ||||
| @@ -347,79 +355,21 @@ CSimpleWindow * CMessage::genWindow(std::string text, int player, int Lmar, int | ||||
| 	ret->bitmap = drawBox1(txts.first+Lmar+Rmar,txts.second+Tmar+Bmar,0); | ||||
| 	ret->pos.h=ret->bitmap->h; | ||||
| 	ret->pos.w=ret->bitmap->w; | ||||
| 	for (int i=0; i<txtg->size();i++) | ||||
| 	{ | ||||
| 		int lw=0; | ||||
| 		for (int j=0;j<(*txtg)[i].size();j++) | ||||
| 			lw+=(*txtg)[i][j]->w; | ||||
| 		int pw = ret->bitmap->w/2, ph =  ret->bitmap->h/2; | ||||
| 		//int pw = Tmar, ph = Lmar; | ||||
| 		pw -= lw/2; | ||||
| 		ph -= (19*txtg->size())/2; | ||||
|  | ||||
| 		int tw = pw; | ||||
| 		for (int j=0;j<(*txtg)[i].size();j++) | ||||
| 		{ | ||||
| 				//std::stringstream n; | ||||
| 				//n <<"temp_"<<i<<"__"<<j<<".bmp"; | ||||
| 			blitAt((*txtg)[i][j],tw,ph+i*19,ret->bitmap); | ||||
| 				//SDL_SaveBMP(ret->bitmap,n.str().c_str()); | ||||
| 			tw+=(*txtg)[i][j]->w; | ||||
| 			SDL_FreeSurface((*txtg)[i][j]); | ||||
| 		} | ||||
| 	} | ||||
| 	return ret; | ||||
| } | ||||
|  | ||||
| CInfoWindow * CMessage::genIWindow(std::string text, int player, int charperline, std::vector<SComponent*> & comps) | ||||
| { | ||||
| 	//TODO: support for more than one component | ||||
| 	CInfoWindow * ret = new CInfoWindow(); | ||||
| 	ret->components = comps; | ||||
| 	std::vector<std::string> * brtext = breakText(text,charperline,true,true); | ||||
| 	std::vector<std::vector<SDL_Surface*> > * txtg = drawText(brtext); | ||||
| 	std::pair<int,int> txts = getMaxSizes(txtg); | ||||
| 	txts.second = txts.second | ||||
| 		+ ok->ourImages[0].bitmap->h //button | ||||
| 		+ 15 //after button | ||||
| 		+ 20; // space between subtitle and button | ||||
| 	if (comps.size()) | ||||
| 			txts.second = txts.second | ||||
| 			+ 30 //space to first component | ||||
| 			+ comps[0]->getImg()->h | ||||
| 			+ 5 //img <-> subtitle | ||||
| 			+ 20; //subtitle //!!!!!!!!!!!!!!!!!!!! | ||||
| 	ret->bitmap = drawBox1(txts.first+70,txts.second+70,0); | ||||
| 	ret->pos.h=ret->bitmap->h; | ||||
| 	ret->pos.w=ret->bitmap->w; | ||||
| 	int curh = 30; //gorny margines | ||||
| 	int curh = ret->bitmap->h/2 - (19*txtg->size())/2; | ||||
| 	blitTextOnSur(txtg,curh,ret->bitmap); | ||||
| 	if (comps.size()) | ||||
| 	{ | ||||
| 		blitCompsOnSur(comps,200,0,curh,ret->bitmap); | ||||
| 	} | ||||
| 	curh += 20; //to buttton | ||||
| 	ret->okb.posr.x = (ret->bitmap->w/2) - (ret->okb.imgs[0][0]->w/2); | ||||
| 	ret->okb.posr.y = curh; | ||||
| 	ret->okb.show(); | ||||
| 	curh+=ret->okb.imgs[0][0]->h; | ||||
| 	delete brtext; | ||||
| 	delete txtg; | ||||
| 	return ret; | ||||
| } | ||||
| std::vector< std::vector<CSelectableComponent*> > * CMessage::breakComps(std::vector<CSelectableComponent*> & comps,int maxw, SDL_Surface* _or) | ||||
| std::vector< std::vector<SComponent*> > * CMessage::breakComps(std::vector<SComponent*> & comps,int maxw, SDL_Surface* _or) | ||||
| { | ||||
| 	std::vector< std::vector<CSelectableComponent*> > * ret = new std::vector< std::vector<CSelectableComponent*> >(); | ||||
| 	std::vector< std::vector<SComponent*> > * ret = new std::vector< std::vector<SComponent*> >(); | ||||
| 	ret->resize(1); | ||||
| 	bool wywalicOr=false; | ||||
| 	if (!_or) | ||||
| 	{ | ||||
| 		_or = TTF_RenderText_Blended(GEOR13,CGI->generaltexth->allTexts[4].c_str(),zwykly); | ||||
| 		wywalicOr=true; | ||||
| 	} | ||||
| 	int rvi = 0; | ||||
| 	int curw = 0; | ||||
| 	for(int i=0;i<comps.size();i++) | ||||
| 	{ | ||||
| 		curw += (comps[i]->getImg()->w + 12 + _or->w); | ||||
| 		curw += (comps[i]->getImg()->w + 12 + (_or ? _or->w : 0)); | ||||
| 		if (curw > maxw) | ||||
| 		{ | ||||
| 			curw = 0; | ||||
| @@ -428,10 +378,6 @@ std::vector< std::vector<CSelectableComponent*> > * CMessage::breakComps(std::ve | ||||
| 		} | ||||
| 		(*ret)[rvi].push_back(comps[i]); | ||||
| 	} | ||||
| 	if (wywalicOr) | ||||
| 	{ | ||||
| 		SDL_FreeSurface(_or); | ||||
| 	} | ||||
| 	return ret; | ||||
| } | ||||
|  | ||||
| @@ -460,44 +406,96 @@ SDL_Surface * CMessage::drawBoxTextBitmapSub(int player, std::string text, SDL_S | ||||
| 	return ret; | ||||
| } | ||||
|  | ||||
| void CMessage::drawIWindow(CInfoWindow * ret, std::string text, int player, int charperline) | ||||
| { | ||||
| 	std::vector<std::string> * brtext = breakText(text,charperline,true,true); | ||||
| 	std::vector<std::vector<SDL_Surface*> > * txtg = drawText(brtext); | ||||
| 	std::pair<int,int> txts = getMaxSizes(txtg); | ||||
| 	if(ret->buttons.size()) | ||||
| 		txts.second += 20 + //before button | ||||
| 		ok->ourImages[0].bitmap->h; //button | ||||
| 	if (ret->components.size()) | ||||
| 		txts.second += 30 //space to first component | ||||
| 		+ ret->components[0]->getImg()->h | ||||
| 		+ 5 //img <-> subtitle | ||||
| 		+ 20; //subtitle //TODO: check how much place will be needed for subtitle | ||||
| 	ret->bitmap = drawBox1(txts.first+70,txts.second+70,0); | ||||
| 	ret->pos.h=ret->bitmap->h; | ||||
| 	ret->pos.w=ret->bitmap->w; | ||||
| 	ret->pos.x=300-(ret->pos.w/2); | ||||
| 	ret->pos.y=300-(ret->pos.h/2); | ||||
| 	int curh = 30; //gorny margines | ||||
| 	blitTextOnSur(txtg,curh,ret->bitmap); | ||||
| 	if (ret->components.size()) | ||||
| 	{ | ||||
| 		curh += 30; | ||||
| 		if(ret->components.size()==1) | ||||
| 		{ | ||||
| 			blitCompsOnSur(ret->components,200,0,curh,ret->bitmap); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			SDL_Surface * _or = 0; | ||||
| 			if(dynamic_cast<CSelWindow*>(ret)) //it's selection window, so we'll blit "or" between components | ||||
| 				_or = TTF_RenderText_Blended(GEOR13,CGI->generaltexth->allTexts[4].c_str(),zwykly); | ||||
| 			std::vector< std::vector<SComponent*> > * komp = breakComps(reinterpret_cast<std::vector<SComponent*>&>(ret->components),500,_or); | ||||
| 			blitCompsOnSur(_or,komp,10,curh,ret->bitmap); | ||||
| 			delete komp; | ||||
| 		} | ||||
| 	} | ||||
| 	if(ret->buttons.size()) | ||||
| 	{ | ||||
| 		curh += 20; //to buttton | ||||
| 		int bw = 20*(ret->buttons.size()-1); //total width of buttons - start with distance between them | ||||
| 		for(int i=0; i<ret->buttons.size(); i++) //and add buttons width | ||||
| 			bw+=ret->buttons[i]->imgs[0][0]->w;  | ||||
| 		bw = (ret->bitmap->w/2) - (bw/2); | ||||
| 		for(int i=0; i<ret->buttons.size(); i++) | ||||
| 		{ | ||||
| 			ret->buttons[i]->pos.x = bw + ret->pos.x; | ||||
| 			ret->buttons[i]->pos.y = curh + ret->pos.y; | ||||
| 			bw += ret->buttons[i]->imgs[0][0]->w + 20; | ||||
| 		} | ||||
| 	} | ||||
| 	for(int i=0; i<ret->components.size(); i++) | ||||
| 	{ | ||||
| 		ret->components[i]->pos.x += ret->pos.x; | ||||
| 		ret->components[i]->pos.y += ret->pos.y; | ||||
| 	} | ||||
| 	delete brtext; | ||||
| 	delete txtg; | ||||
| } | ||||
| CSelWindow * CMessage::genSelWindow(std::string text, int player, int charperline, std::vector<CSelectableComponent*> & comps, int owner) | ||||
| { | ||||
| 	CSelWindow * ret = new CSelWindow(); | ||||
| 	for(unsigned i=0;i<comps.size();i++) | ||||
| 	{ | ||||
| 		ret->components.push_back(comps[i]); | ||||
| 		comps[i]->onSelect = boost::bind(&CSelWindow::selectionChange,ret,i); | ||||
| 	} | ||||
| 	std::vector<std::string> * tekst = breakText(text,charperline); | ||||
| 	std::vector<std::vector<SDL_Surface*> > * txtg = drawText(tekst); | ||||
| 	std::pair<int,int> txts = getMaxSizes(txtg); | ||||
| 	txts.first+=45; //side margins | ||||
| 	int curh = 50; //top margin | ||||
| 	SDL_Surface * _or = TTF_RenderText_Blended(GEOR13,CGI->generaltexth->allTexts[4].c_str(),zwykly); | ||||
| 	std::vector< std::vector<CSelectableComponent*> > * komp = breakComps(comps,500,_or); | ||||
| 	std::pair<int,int> txts2 = getMaxSizes(komp); | ||||
| 	ret->pos.h = txts.second //wys. tekstu | ||||
| 		+ txts2.second //wys komponentow | ||||
| 		+ 20 //podpis pod komponentami | ||||
| 		+ 55 //gorny margines | ||||
| 		+ 60 //text <=> comps | ||||
| 		+ 20 //comps <=> button | ||||
| 		+ ok->ourImages[0].bitmap->h //button | ||||
| 		+ 30; //bottom margin | ||||
| 	ret->pos.w = std::max(txts.first,txts.second); | ||||
| 	ret->bitmap = drawBox1(ret->pos.w,ret->pos.h,player); | ||||
| 	blitTextOnSur(txtg,curh,ret->bitmap); | ||||
| 	curh += 50; | ||||
| 	blitCompsOnSur(_or,komp,10,curh,ret->bitmap); | ||||
| 	curh += 30; //to buttton | ||||
| 	ret->okb.posr.x = (ret->bitmap->w/2) - (ret->okb.imgs[0][0]->w/2); | ||||
| 	ret->okb.posr.y = curh; | ||||
| 	ret->okb.show(); | ||||
| 	curh+=ret->okb.imgs[0][0]->h; | ||||
| 	SDL_FreeSurface(_or); | ||||
| 	delete komp; | ||||
| 	delete tekst; | ||||
| 	return ret; | ||||
| 	//CSelWindow * ret = new CSelWindow(); | ||||
| 	//std::vector<std::string> * tekst = breakText(text,charperline); | ||||
| 	//std::vector<std::vector<SDL_Surface*> > * txtg = drawText(tekst); | ||||
| 	//std::pair<int,int> txts = getMaxSizes(txtg); | ||||
| 	//txts.first+=45; //side margins | ||||
| 	//int curh = 50; //top margin | ||||
| 	////std::pair<int,int> txts2 = getMaxSizes(komp); | ||||
| 	//ret->pos.h = txts.second //wys. tekstu | ||||
| 	//	//+ txts2.second //wys komponentow | ||||
| 	//	+ 20 //podpis pod komponentami | ||||
| 	//	+ 55 //gorny margines | ||||
| 	//	+ 60 //text <=> comps | ||||
| 	//	+ 20 //comps <=> button | ||||
| 	//	+ ok->ourImages[0].bitmap->h //button | ||||
| 	//	+ 30; //bottom margin | ||||
| 	//ret->pos.w = std::max(txts.first,txts.second); | ||||
| 	//ret->bitmap = drawBox1(ret->pos.w,ret->pos.h,player); | ||||
| 	//blitTextOnSur(txtg,curh,ret->bitmap); | ||||
| 	//curh += 50; | ||||
| 	//blitCompsOnSur(_or,komp,10,curh,ret->bitmap); | ||||
| 	//curh += 30; //to buttton | ||||
| 	//ret->buttons[0]->pos.x = (ret->bitmap->w/2) - (ret->buttons[0]->imgs[0][0]->w/2); | ||||
| 	//ret->buttons[0]->pos.y = curh; | ||||
| 	//ret->buttons[0]->show(); | ||||
| 	//curh += ret->buttons[0]->imgs[0][0]->h; | ||||
| 	//SDL_FreeSurface(_or); | ||||
| 	//delete komp; | ||||
| 	//delete tekst; | ||||
| 	return NULL; | ||||
| } | ||||
|  | ||||
| SDL_Surface * CMessage::genMessage | ||||
|   | ||||
| @@ -27,13 +27,13 @@ class CMessage | ||||
| public: | ||||
|  | ||||
| 	static std::pair<int,int> getMaxSizes(std::vector<std::vector<SDL_Surface*> > * txtg); | ||||
| 	static std::pair<int, int> getMaxSizes(std::vector< std::vector<CSelectableComponent*> > * komp); | ||||
| 	static std::pair<int, int> getMaxSizes(std::vector< std::vector<SComponent*> > * komp); | ||||
| 	static std::vector<std::vector<SDL_Surface*> > * drawText(std::vector<std::string> * brtext); | ||||
| 	static SDL_Surface * blitTextOnSur(std::vector<std::vector<SDL_Surface*> > * txtg, int & curh, SDL_Surface * ret); | ||||
| 	static SDL_Surface * blitCompsOnSur(std::vector<SComponent*> & comps, int maxw, int inter, int & curh, SDL_Surface * ret); | ||||
| 	static SDL_Surface * blitCompsOnSur(SDL_Surface *_or, std::vector< std::vector<CSelectableComponent*> > *komp, int inter, int &curh, SDL_Surface *ret); | ||||
| 	static CInfoWindow * genIWindow(std::string text, int player, int charperline, std::vector<SComponent*> &comps); | ||||
| 	static std::vector< std::vector<CSelectableComponent*> > * breakComps(std::vector<CSelectableComponent*> &comps, int maxw, SDL_Surface* _or=NULL); | ||||
| 	static SDL_Surface * blitCompsOnSur(SDL_Surface *_or, std::vector< std::vector<SComponent*> > *komp, int inter, int &curh, SDL_Surface *ret); | ||||
| 	static void drawIWindow(CInfoWindow * ret, std::string text, int player, int charperline); | ||||
| 	static std::vector< std::vector<SComponent*> > * breakComps(std::vector<SComponent*> &comps, int maxw, SDL_Surface* _or=NULL); | ||||
| 	static CSelWindow * genSelWindow(std::string text, int player, int charperline, std::vector<CSelectableComponent*> & comps, int owner); | ||||
| 	static CSimpleWindow * genWindow(std::string text, int player, int Lmar=35, int Rmar=35, int Tmar=35, int Bmar=35);//supports h3 text formatting; player sets color of window, Lmar/Rmar/Tmar/Bmar are Left/Right/Top/Bottom margins | ||||
| 	static SDL_Surface * genMessage(std::string title, std::string text, EWindowType type=infoOnly, | ||||
|   | ||||
| @@ -157,11 +157,20 @@ void CGarrisonSlot::clickLeft(tribool down) | ||||
| 			if(owner->highlighted == this) //view info | ||||
| 			{ | ||||
| 				UpgradeInfo pom = LOCPLINT->cb->getUpgradeInfo(getObj(),ID); | ||||
| 				if(pom.oldID>=0) | ||||
| 				{ | ||||
| 					(new CCreInfoWindow | ||||
| 						(creature->idNumber,1,NULL, | ||||
| 					(pom.oldID>=0)?(boost::bind(&CCallback::upgradeCreature,LOCPLINT->cb,getObj(),ID,-1)):(boost::function<void()>()), //if upgrade is possible we'll bind proper function in callback | ||||
| 						boost::bind(&CCallback::upgradeCreature,LOCPLINT->cb,getObj(),ID,pom.newID[0]), //if upgrade is possible we'll bind proper function in callback | ||||
| 						 boost::bind(&CCallback::dismissCreature,LOCPLINT->cb,getObj(),ID))) | ||||
| 							->activate(); | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					(new CCreInfoWindow | ||||
| 						(creature->idNumber,1,NULL,0, boost::bind(&CCallback::dismissCreature,LOCPLINT->cb,getObj(),ID)) ) | ||||
| 						->activate(); | ||||
| 				} | ||||
| 				owner->highlighted = NULL; | ||||
| 				show(); | ||||
| 				refr = true; | ||||
| @@ -454,39 +463,57 @@ void CGarrisonInt::deactivate() | ||||
| 	deactiveteSlots(); | ||||
| } | ||||
|  | ||||
| CInfoWindow::CInfoWindow(std::string text, int player, int charperline, std::vector<SComponent*> &comps, std::vector<std::pair<std::string,CFunctionList<void()> > > &Buttons) | ||||
| { | ||||
| 	for(int i=0;i<Buttons.size();i++) | ||||
| 	{ | ||||
| 		buttons.push_back(new AdventureMapButton("","",Buttons[i].second,0,0,Buttons[i].first)); | ||||
| 		if(!Buttons[i].second) //if no function, then by default we'll set it to close | ||||
| 			buttons[i]->callback += boost::bind(&CInfoWindow::close,this); | ||||
| 	} | ||||
| 	for(int i=0;i<comps.size();i++) | ||||
| 	{ | ||||
| 		components.push_back(comps[i]); | ||||
| 	} | ||||
| 	CMessage::drawIWindow(this,text,player,charperline); | ||||
| } | ||||
| CInfoWindow::CInfoWindow() | ||||
| :okb(NMessage::ok,NULL,&CInfoWindow::okClicked) | ||||
| { | ||||
| 	okb.ourObj = this; | ||||
| 	okb.delg = this; | ||||
| 	okb.notFreeButton=true; | ||||
| } | ||||
|  | ||||
| void CInfoWindow::okClicked(tribool down) | ||||
| { | ||||
| 	if (!down) | ||||
| 		close(); | ||||
| } | ||||
|  | ||||
| void CInfoWindow::close() | ||||
| { | ||||
| 	for (int i=0;i<components.size();i++) | ||||
| 	{ | ||||
| 		components[i]->deactivate(); | ||||
| 		delete components[i]; | ||||
| 	} | ||||
| 	components.clear(); | ||||
| 	okb.deactivate(); | ||||
| 	SDL_FreeSurface(bitmap); | ||||
| 	bitmap = NULL; | ||||
| 	LOCPLINT->removeObjToBlit(this); | ||||
| 	LOCPLINT->curint->activate(); | ||||
| 	deactivate(); | ||||
| 	delete this; | ||||
| } | ||||
| CInfoWindow::~CInfoWindow() | ||||
| void CInfoWindow::show(SDL_Surface * to) | ||||
| { | ||||
| 	CSimpleWindow::show(); | ||||
| 	for(int i=0;i<buttons.size();i++) | ||||
| 		buttons[i]->show(); | ||||
| } | ||||
|  | ||||
| CInfoWindow::~CInfoWindow() | ||||
| { | ||||
| 	for (int i=0;i<components.size();i++) | ||||
| 		delete components[i]; | ||||
| 	for(int i=0;i<buttons.size();i++) | ||||
| 		delete buttons[i]; | ||||
| } | ||||
| void CInfoWindow::activate() | ||||
| { | ||||
| 	for (int i=0;i<components.size();i++) | ||||
| 		components[i]->activate(); | ||||
| 	for(int i=0;i<buttons.size();i++) | ||||
| 		buttons[i]->activate(); | ||||
| } | ||||
| void CInfoWindow::deactivate() | ||||
| { | ||||
| 	for (int i=0;i<components.size();i++) | ||||
| 		components[i]->deactivate(); | ||||
| 	for(int i=0;i<buttons.size();i++) | ||||
| 		buttons[i]->deactivate(); | ||||
| 	LOCPLINT->removeObjToBlit(this); | ||||
| } | ||||
| void CRClickPopup::clickRight (tribool down) | ||||
| { | ||||
| 	if(down) | ||||
| @@ -733,13 +760,22 @@ void CSelWindow::selectionChange(unsigned to) | ||||
| 		blitAt(pom->getImg(),pom->pos.x-pos.x,pom->pos.y-pos.y,bitmap); | ||||
| 	} | ||||
| } | ||||
| void CSelWindow::okClicked(tribool down) | ||||
| CSelWindow::CSelWindow(std::string text, int player, int charperline, std::vector<CSelectableComponent*> &comps, std::vector<std::pair<std::string,boost::function<void()> > > &Buttons) | ||||
| { | ||||
| 	if(!down) | ||||
| 		close(); | ||||
| 	for(int i=0;i<Buttons.size();i++) | ||||
| 	{ | ||||
| 		buttons.push_back(new AdventureMapButton("","",(Buttons[i].second)?(Buttons[i].second):(boost::bind(&CInfoWindow::close,this)),0,0,Buttons[i].first)); | ||||
| 	} | ||||
| 	for(int i=0;i<comps.size();i++) | ||||
| 	{ | ||||
| 		components.push_back(comps[i]); | ||||
| 		comps[i]->onSelect = boost::bind(&CSelWindow::selectionChange,this,i); | ||||
| 	} | ||||
| 	CMessage::drawIWindow(this,text,player,charperline); | ||||
| } | ||||
| void CSelWindow::close() | ||||
| { | ||||
| 	deactivate(); | ||||
| 	int ret = -1; | ||||
| 	for (int i=0;i<components.size();i++) | ||||
| 	{ | ||||
| @@ -747,14 +783,7 @@ void CSelWindow::close() | ||||
| 		{ | ||||
| 			ret = i; | ||||
| 		} | ||||
| 		components[i]->deactivate(); | ||||
| 		delete components[i]; | ||||
| 	} | ||||
| 	components.clear(); | ||||
| 	okb.deactivate(); | ||||
| 	SDL_FreeSurface(bitmap); | ||||
| 	bitmap = NULL; | ||||
| 	LOCPLINT->removeObjToBlit(this); | ||||
| 	LOCPLINT->curint->activate(); | ||||
| 	LOCPLINT->cb->selectionMade(ret,ID); | ||||
| 	delete this; | ||||
| @@ -1881,7 +1910,7 @@ void CPlayerInterface::receivedResource(int type, int val) | ||||
| 	adventureInt->resdatabar.draw(); | ||||
| } | ||||
|  | ||||
| void CPlayerInterface::showSelDialog(std::string text, std::vector<Component*> &components, ui32 askID) | ||||
| void CPlayerInterface::showSelDialog(std::string &text, std::vector<Component*> &components, ui32 askID) | ||||
| //void CPlayerInterface::showSelDialog(std::string text, std::vector<CSelectableComponent*> & components, int askID) | ||||
| { | ||||
| 	boost::unique_lock<boost::mutex> un(*pim); | ||||
| @@ -1889,20 +1918,12 @@ void CPlayerInterface::showSelDialog(std::string text, std::vector<Component*> & | ||||
| 	std::vector<CSelectableComponent*> intComps; | ||||
| 	for(int i=0;i<components.size();i++) | ||||
| 		intComps.push_back(new CSelectableComponent(*components[i])); //will be deleted by CSelWindow::close | ||||
| 	std::vector<std::pair<std::string,boost::function<void()> > > pom; | ||||
| 	pom.push_back(std::pair<std::string,boost::function<void()> >("IOKAY.DEF",0)); | ||||
|  | ||||
| 	CSelWindow * temp = CMessage::genSelWindow(text,LOCPLINT->playerID,35,intComps,playerID); | ||||
| 	CSelWindow * temp = new CSelWindow(text,playerID,35,intComps,pom); | ||||
| 	LOCPLINT->objsToBlit.push_back(temp); | ||||
| 	temp->pos.x=300-(temp->pos.w/2); | ||||
| 	temp->pos.y=300-(temp->pos.h/2); | ||||
| 	temp->okb.pos.x = temp->okb.posr.x + temp->pos.x; | ||||
| 	temp->okb.pos.y = temp->okb.posr.y + temp->pos.y; | ||||
| 	temp->okb.activate(); | ||||
| 	for (int i=0;i<temp->components.size();i++) | ||||
| 	{ | ||||
| 		temp->components[i]->activate(); | ||||
| 		temp->components[i]->pos.x += temp->pos.x; | ||||
| 		temp->components[i]->pos.y += temp->pos.y; | ||||
| 	} | ||||
| 	temp->activate(); | ||||
| 	temp->ID = askID; | ||||
| 	intComps[0]->clickLeft(true); | ||||
| } | ||||
| @@ -2068,42 +2089,34 @@ void CPlayerInterface::showComp(SComponent comp) | ||||
| 	adventureInt->infoBar.showComp(&comp,4000); | ||||
| } | ||||
|  | ||||
| void CPlayerInterface::showInfoDialog(std::string text, std::vector<Component*> &components) | ||||
| void CPlayerInterface::showInfoDialog(std::string &text, std::vector<Component*> &components) | ||||
| { | ||||
| 	curint->deactivate(); //dezaktywacja starego interfejsu | ||||
| 	std::vector<SComponent*> intComps; | ||||
| 	for(int i=0;i<components.size();i++) | ||||
| 		intComps.push_back(new SComponent(*components[i])); | ||||
| 	CInfoWindow * temp = CMessage::genIWindow(text,LOCPLINT->playerID,32,intComps); | ||||
| 	LOCPLINT->objsToBlit.push_back(temp); | ||||
| 	temp->pos.x=300-(temp->pos.w/2); | ||||
| 	temp->pos.y=300-(temp->pos.h/2); | ||||
| 	temp->okb.pos.x = temp->okb.posr.x + temp->pos.x; | ||||
| 	temp->okb.pos.y = temp->okb.posr.y + temp->pos.y; | ||||
| 	temp->okb.activate(); | ||||
| 	for (int i=0;i<temp->components.size();i++) | ||||
| 	{ | ||||
| 		temp->components[i]->activate(); | ||||
| 		temp->components[i]->pos.x += temp->pos.x; | ||||
| 		temp->components[i]->pos.y += temp->pos.y; | ||||
| 	showInfoDialog(text,intComps); | ||||
| } | ||||
| } | ||||
| void CPlayerInterface::showInfoDialog(std::string text, std::vector<SComponent*> & components) | ||||
| void CPlayerInterface::showInfoDialog(std::string &text, std::vector<SComponent*> & components) | ||||
| { | ||||
| 	curint->deactivate(); //dezaktywacja starego interfejsu | ||||
| 	CInfoWindow * temp = CMessage::genIWindow(text,LOCPLINT->playerID,32,components); | ||||
|  | ||||
| 	std::vector<std::pair<std::string,CFunctionList<void()> > > pom; | ||||
| 	pom.push_back(std::pair<std::string,CFunctionList<void()> >("IOKAY.DEF",0)); | ||||
| 	 | ||||
| 	CInfoWindow * temp = new CInfoWindow(text,playerID,32,components,pom); | ||||
| 	temp->buttons[0]->callback += boost::bind(&IActivable::activate,LOCPLINT->curint); | ||||
| 	temp->activate(); | ||||
| 	LOCPLINT->objsToBlit.push_back(temp); | ||||
| 	temp->pos.x=300-(temp->pos.w/2); | ||||
| 	temp->pos.y=300-(temp->pos.h/2); | ||||
| 	temp->okb.pos.x = temp->okb.posr.x + temp->pos.x; | ||||
| 	temp->okb.pos.y = temp->okb.posr.y + temp->pos.y; | ||||
| 	temp->okb.activate(); | ||||
| 	for (int i=0;i<temp->components.size();i++) | ||||
| 	{ | ||||
| 		temp->components[i]->activate(); | ||||
| 		temp->components[i]->pos.x += temp->pos.x; | ||||
| 		temp->components[i]->pos.y += temp->pos.y; | ||||
| } | ||||
| void CPlayerInterface::showYesNoDialog(std::string &text, std::vector<SComponent*> & components, CFunctionList<void()> funcs[2]) | ||||
| { | ||||
| 	curint->deactivate(); //dezaktywacja starego interfejsu | ||||
| 	std::vector<std::pair<std::string,CFunctionList<void()> > > pom; | ||||
| 	pom.push_back(std::pair<std::string,CFunctionList<void()> >("IOKAY.DEF",funcs[0])); | ||||
| 	pom.push_back(std::pair<std::string,CFunctionList<void()> >("ICANCEL.DEF",funcs[1])); | ||||
| 	CInfoWindow * temp = new CInfoWindow(text,playerID,32,components,pom); | ||||
| 	temp->activate(); | ||||
| 	LOCPLINT->objsToBlit.push_back(temp); | ||||
| } | ||||
| void CPlayerInterface::removeObjToBlit(IShowable* obj) | ||||
| { | ||||
| @@ -2960,7 +2973,7 @@ void CCreInfoWindow::show(SDL_Surface * to) | ||||
|  | ||||
| CCreInfoWindow::CCreInfoWindow | ||||
| 		(int Cid, int Type, StackState *State, boost::function<void()> Upg, boost::function<void()> Dsm) | ||||
| :ok(0),dismiss(0),upgrade(0),type(Type),dsm(Dsm) | ||||
| :ok(0),dismiss(0),upgrade(0),type(Type),dsm(Dsm),dependant(0) | ||||
| { | ||||
| 	c = &CGI->creh->creatures[Cid]; | ||||
| 	bitmap = BitmapHandler::loadBitmap("CRSTKPU.bmp"); | ||||
| @@ -3045,7 +3058,10 @@ CCreInfoWindow::CCreInfoWindow | ||||
| 	if(type) | ||||
| 	{ | ||||
| 		if(Upg) | ||||
| 		{ | ||||
| 			upgrade = new AdventureMapButton("",CGI->preth->zelp[446].second,Upg,pos.x+76,pos.y+237,"IVIEWCR.DEF"); | ||||
| 			upgrade->callback += boost::bind(&CCreInfoWindow::close,this); | ||||
| 		} | ||||
| 		if(Dsm) | ||||
| 			dismiss = new AdventureMapButton("",CGI->preth->zelp[445].second,boost::bind(&CCreInfoWindow::dismissF,this),pos.x+21,pos.y+237,"IVIEWCR2.DEF"); | ||||
| 		ok = new AdventureMapButton("",CGI->preth->zelp[445].second,boost::bind(&CCreInfoWindow::close,this),pos.x+216,pos.y+237,"IOKAY.DEF"); | ||||
| @@ -3114,6 +3130,19 @@ void CCreInfoWindow::deactivate() | ||||
| 		upgrade->deactivate(); | ||||
| } | ||||
|  | ||||
| void CCreInfoWindow::onUpgradeYes() | ||||
| { | ||||
| 	dependant->close(); | ||||
| 	dependant->deactivate(); | ||||
| 	delete dependant; | ||||
|   | ||||
| 	LOCPLINT->curint->activate(); | ||||
| } | ||||
|  | ||||
| void CCreInfoWindow::onUpgradeNo() | ||||
| { | ||||
|  | ||||
| } | ||||
| void CLevelWindow::close() | ||||
| { | ||||
| 	deactivate(); | ||||
|   | ||||
| @@ -23,7 +23,6 @@ class CSelectableComponent; | ||||
| class CCreatureSet; | ||||
| class CGObjectInstance; | ||||
| class CSlider; | ||||
|  | ||||
| namespace boost | ||||
| { | ||||
| 	class mutex; | ||||
| @@ -160,19 +159,22 @@ public: | ||||
| class CInfoWindow : public CSimpleWindow //text + comp. + ok button | ||||
| { //window deletes its components when closed | ||||
| public: | ||||
| 	CSCButton<CInfoWindow> okb; | ||||
| 	std::vector<AdventureMapButton *> buttons; | ||||
| 	std::vector<SComponent*> components; | ||||
| 	virtual void okClicked(boost::logic::tribool down); | ||||
| 	virtual void close(); | ||||
| 	virtual void show(SDL_Surface * to = NULL); | ||||
| 	void activate(); | ||||
| 	void deactivate(); | ||||
| 	CInfoWindow(std::string text, int player, int charperline, std::vector<SComponent*> &comps, std::vector<std::pair<std::string,CFunctionList<void()> > > &Buttons); | ||||
| 	CInfoWindow(); | ||||
| 	virtual ~CInfoWindow(); | ||||
| 	~CInfoWindow(); | ||||
| }; | ||||
| class CSelWindow : public CInfoWindow //component selection window | ||||
| { //uwaga - to okno usuwa swoje komponenty przy zamykaniu | ||||
| public: | ||||
| 	void selectionChange(unsigned to); | ||||
| 	void okClicked(boost::logic::tribool down); | ||||
| 	void close(); | ||||
| 	CSelWindow(std::string text, int player, int charperline, std::vector<CSelectableComponent*> &comps, std::vector<std::pair<std::string,boost::function<void()> > > &Buttons); | ||||
| 	CSelWindow(){}; | ||||
| }; | ||||
|  | ||||
| @@ -330,8 +332,8 @@ public: | ||||
| 	void heroCreated(const CGHeroInstance* hero); | ||||
| 	void heroPrimarySkillChanged(const CGHeroInstance * hero, int which, int val); | ||||
| 	void receivedResource(int type, int val); | ||||
| 	void showInfoDialog(std::string text, std::vector<Component*> &components); | ||||
| 	void showSelDialog(std::string text, std::vector<Component*> &components, ui32 askID); | ||||
| 	void showInfoDialog(std::string &text, std::vector<Component*> &components); | ||||
| 	void showSelDialog(std::string &text, std::vector<Component*> &components, ui32 askID); | ||||
| 	void heroVisitsTown(const CGHeroInstance* hero, const CGTownInstance * town); | ||||
| 	void garrisonChanged(const CGObjectInstance * obj); | ||||
| 	void buildChanged(const CGTownInstance *town, int buildingID, int what); //what: 1 - built, 2 - demolished | ||||
| @@ -363,7 +365,8 @@ public: | ||||
| 	void init(ICallback * CB); | ||||
| 	int3 repairScreenPos(int3 pos); | ||||
| 	void removeObjToBlit(IShowable* obj);	 | ||||
| 	void showInfoDialog(std::string text, std::vector<SComponent*> & components); | ||||
| 	void showInfoDialog(std::string &text, std::vector<SComponent*> & components); | ||||
| 	void showYesNoDialog(std::string &text, std::vector<SComponent*> & components, CFunctionList<void()> funcs[2]); | ||||
|  | ||||
| 	CPlayerInterface(int Player, int serial);//c-tor | ||||
| 	~CPlayerInterface();//d-tor | ||||
| @@ -524,6 +527,7 @@ public: | ||||
| 	boost::function<void()> dsm; | ||||
| 	CCreaturePic *anim; | ||||
| 	CCreature *c; | ||||
| 	CInfoWindow *dependant; //it may be dialog asking whther upgrade/dismiss stack (if opened) | ||||
|  | ||||
| 	AdventureMapButton *dismiss, *upgrade, *ok; | ||||
| 	CCreInfoWindow(int Cid, int Type, StackState *State, boost::function<void()> Upg, boost::function<void()> Dsm); | ||||
| @@ -535,6 +539,8 @@ public: | ||||
| 	void keyPressed (SDL_KeyboardEvent & key); | ||||
| 	void deactivate(); | ||||
| 	void show(SDL_Surface * to = NULL); | ||||
| 	void onUpgradeYes(); | ||||
| 	void onUpgradeNo(); | ||||
| }; | ||||
|  | ||||
| class CLevelWindow : public IShowable, public CIntObject | ||||
|   | ||||
							
								
								
									
										36
									
								
								client/FunctionList.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								client/FunctionList.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | ||||
| #pragma  once | ||||
| #include <boost/function.hpp> | ||||
|  | ||||
| template<typename Signature, typename Allocator = std::allocator<void> > | ||||
| class CFunctionList | ||||
| { | ||||
| public: | ||||
| 	std::vector<boost::function<Signature,Allocator> > funcs; | ||||
|  | ||||
| 	CFunctionList(int){}; | ||||
| 	CFunctionList(){}; | ||||
| 	CFunctionList(const boost::function<Signature,Allocator> &first) | ||||
| 	{ | ||||
| 		funcs.push_back(first); | ||||
| 	} | ||||
| 	CFunctionList & operator+=(const boost::function<Signature,Allocator> &first) | ||||
| 	{ | ||||
| 		funcs.push_back(first); | ||||
| 		return *this; | ||||
| 	} | ||||
| 	const boost::function<Signature,Allocator> & operator=(const boost::function<Signature,Allocator> &first) | ||||
| 	{ | ||||
| 		funcs.push_back(first); | ||||
| 		return first; | ||||
| 	} | ||||
| 	operator bool() const | ||||
| 	{ | ||||
| 		return funcs.size(); | ||||
| 	} | ||||
| 	void operator()() const | ||||
| 	{ | ||||
| 		std::vector<boost::function<Signature,Allocator> > funcs2 = funcs; //backup | ||||
| 		for(int i=0;i<funcs2.size(); i++) | ||||
| 			funcs2[i](); | ||||
| 	} | ||||
| }; | ||||
| @@ -444,10 +444,6 @@ | ||||
| 				RelativePath=".\CCreatureAnimation.h" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\hch\CCreatureHandler.h" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\CCursorHandler.h" | ||||
| 				> | ||||
| @@ -524,6 +520,10 @@ | ||||
| 				RelativePath="..\CThreadHelper.h" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\FunctionList.h" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\global.h" | ||||
| 				> | ||||
|   | ||||
| @@ -258,10 +258,6 @@ | ||||
| 		<Filter | ||||
| 			Name="Source Files" | ||||
| 			> | ||||
| 			<File | ||||
| 				RelativePath="..\hch\CAmbarCendamo.cpp" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\hch\CArtHandler.cpp" | ||||
| 				> | ||||
| @@ -324,10 +320,6 @@ | ||||
| 				RelativePath=".\BattleAction.h" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\hch\CAmbarCendamo.h" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\hch\CArtHandler.h" | ||||
| 				> | ||||
|   | ||||
							
								
								
									
										13
									
								
								map.h
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								map.h
									
									
									
									
									
								
							| @@ -485,6 +485,19 @@ struct DLL_EXPORT Mapa | ||||
| 	std::vector<CGTownInstance*> towns; | ||||
|  | ||||
| 	void initFromBytes(unsigned char * bufor); //creates map from decompressed .h3m data | ||||
|  | ||||
| 	void readEvents( unsigned char * bufor, int &i); | ||||
| 	void readObjects( unsigned char * bufor, int &i); | ||||
| 	void readDefInfo( unsigned char * bufor, int &i); | ||||
| 	void readTerrain( unsigned char * bufor, int &i); | ||||
| 	void readPredefinedHeroes( unsigned char * bufor, int &i); | ||||
| 	void readHeader( unsigned char * bufor, int &i); | ||||
| 	void readRumors( unsigned char * bufor, int &i); | ||||
| 	void loadViCLossConditions( unsigned char * bufor, int &i); | ||||
| 	void loadPlayerInfo( int &pom, unsigned char * bufor, int &i); | ||||
| 	void loadHero( CGObjectInstance * &nobj, unsigned char * bufor, int &i); | ||||
| 	void loadTown( CGObjectInstance * &nobj, unsigned char * bufor, int &i); | ||||
| 	int loadSeerHut( unsigned char * bufor, int i, CGObjectInstance * nobj); | ||||
| 	void addBlockVisTiles(CGObjectInstance * obj); | ||||
| 	void removeBlockVisTiles(CGObjectInstance * obj); | ||||
| 	Mapa(std::string filename); //creates map structure from .h3m file | ||||
|   | ||||
| @@ -10,7 +10,6 @@ | ||||
| #include "../map.h" | ||||
| #include "../lib/NetPacks.h" | ||||
| #include "../lib/Connection.h" | ||||
| #include "../CLua.h" | ||||
| #include "../hch/CObjectHandler.h" | ||||
| #include "../hch/CTownHandler.h" | ||||
| #include "../hch/CBuildingHandler.h" | ||||
| @@ -244,153 +243,9 @@ void CGameHandler::startBattle(CCreatureSet army1, CCreatureSet army2, int3 tile | ||||
| { | ||||
|  | ||||
| 	BattleInfo *curB = new BattleInfo; | ||||
| 	//battle start | ||||
| 	{ | ||||
| 		battleResult.set(NULL); | ||||
| 		std::vector<CStack*> & stacks = (curB->stacks); | ||||
|  | ||||
| 		curB->tile = tile; | ||||
| 		curB->siege = 0; //TODO: add sieges | ||||
| 		curB->army1=army1; | ||||
| 		curB->army2=army2; | ||||
| 		curB->hero1=(hero1)?(hero1->id):(-1); | ||||
| 		curB->hero2=(hero2)?(hero2->id):(-1); | ||||
| 		curB->side1=(hero1)?(hero1->tempOwner):(-1); | ||||
| 		curB->side2=(hero2)?(hero2->tempOwner):(-1); | ||||
| 		curB->round = -2; | ||||
| 		curB->activeStack = -1; | ||||
| 		for(std::map<si32,std::pair<ui32,si32> >::iterator i = army1.slots.begin(); i!=army1.slots.end(); i++) | ||||
| 		{ | ||||
| 			stacks.push_back(new CStack(&VLC->creh->creatures[i->second.first],i->second.second,hero1->tempOwner, stacks.size(), true)); | ||||
| 			stacks[stacks.size()-1]->ID = stacks.size()-1; | ||||
| 		} | ||||
| 		//initialization of positions | ||||
| 		switch(army1.slots.size()) //for attacker | ||||
| 		{ | ||||
| 		case 0: | ||||
| 			break; | ||||
| 		case 1: | ||||
| 			stacks[0]->position = 86; //6 | ||||
| 			break; | ||||
| 		case 2: | ||||
| 			stacks[0]->position = 35; //3 | ||||
| 			stacks[1]->position = 137; //9 | ||||
| 			break; | ||||
| 		case 3: | ||||
| 			stacks[0]->position = 35; //3 | ||||
| 			stacks[1]->position = 86; //6 | ||||
| 			stacks[2]->position = 137; //9 | ||||
| 			break; | ||||
| 		case 4: | ||||
| 			stacks[0]->position = 1; //1 | ||||
| 			stacks[1]->position = 69; //5 | ||||
| 			stacks[2]->position = 103; //7 | ||||
| 			stacks[3]->position = 171; //11 | ||||
| 			break; | ||||
| 		case 5: | ||||
| 			stacks[0]->position = 1; //1 | ||||
| 			stacks[1]->position = 35; //3 | ||||
| 			stacks[2]->position = 86; //6 | ||||
| 			stacks[3]->position = 137; //9 | ||||
| 			stacks[4]->position = 171; //11 | ||||
| 			break; | ||||
| 		case 6: | ||||
| 			stacks[0]->position = 1; //1 | ||||
| 			stacks[1]->position = 35; //3 | ||||
| 			stacks[2]->position = 69; //5 | ||||
| 			stacks[3]->position = 103; //7 | ||||
| 			stacks[4]->position = 137; //9 | ||||
| 			stacks[5]->position = 171; //11 | ||||
| 			break; | ||||
| 		case 7: | ||||
| 			stacks[0]->position = 1; //1 | ||||
| 			stacks[1]->position = 35; //3 | ||||
| 			stacks[2]->position = 69; //5 | ||||
| 			stacks[3]->position = 86; //6 | ||||
| 			stacks[4]->position = 103; //7 | ||||
| 			stacks[5]->position = 137; //9 | ||||
| 			stacks[6]->position = 171; //11 | ||||
| 			break; | ||||
| 		default: //fault | ||||
| 			break; | ||||
| 		} | ||||
| 		for(std::map<si32,std::pair<ui32,si32> >::iterator i = army2.slots.begin(); i!=army2.slots.end(); i++) | ||||
| 			stacks.push_back(new CStack(&VLC->creh->creatures[i->second.first],i->second.second,hero2 ? hero2->tempOwner : 255, stacks.size(), false)); | ||||
| 		switch(army2.slots.size()) //for defender | ||||
| 		{ | ||||
| 		case 0: | ||||
| 			break; | ||||
| 		case 1: | ||||
| 			stacks[0+army1.slots.size()]->position = 100; //6 | ||||
| 			break; | ||||
| 		case 2: | ||||
| 			stacks[0+army1.slots.size()]->position = 49; //3 | ||||
| 			stacks[1+army1.slots.size()]->position = 151; //9 | ||||
| 			break; | ||||
| 		case 3: | ||||
| 			stacks[0+army1.slots.size()]->position = 49; //3 | ||||
| 			stacks[1+army1.slots.size()]->position = 100; //6 | ||||
| 			stacks[2+army1.slots.size()]->position = 151; //9 | ||||
| 			break; | ||||
| 		case 4: | ||||
| 			stacks[0+army1.slots.size()]->position = 15; //1 | ||||
| 			stacks[1+army1.slots.size()]->position = 83; //5 | ||||
| 			stacks[2+army1.slots.size()]->position = 117; //7 | ||||
| 			stacks[3+army1.slots.size()]->position = 185; //11 | ||||
| 			break; | ||||
| 		case 5: | ||||
| 			stacks[0+army1.slots.size()]->position = 15; //1 | ||||
| 			stacks[1+army1.slots.size()]->position = 49; //3 | ||||
| 			stacks[2+army1.slots.size()]->position = 100; //6 | ||||
| 			stacks[3+army1.slots.size()]->position = 151; //9 | ||||
| 			stacks[4+army1.slots.size()]->position = 185; //11 | ||||
| 			break; | ||||
| 		case 6: | ||||
| 			stacks[0+army1.slots.size()]->position = 15; //1 | ||||
| 			stacks[1+army1.slots.size()]->position = 49; //3 | ||||
| 			stacks[2+army1.slots.size()]->position = 83; //5 | ||||
| 			stacks[3+army1.slots.size()]->position = 117; //7 | ||||
| 			stacks[4+army1.slots.size()]->position = 151; //9 | ||||
| 			stacks[5+army1.slots.size()]->position = 185; //11 | ||||
| 			break; | ||||
| 		case 7: | ||||
| 			stacks[0+army1.slots.size()]->position = 15; //1 | ||||
| 			stacks[1+army1.slots.size()]->position = 49; //3 | ||||
| 			stacks[2+army1.slots.size()]->position = 83; //5 | ||||
| 			stacks[3+army1.slots.size()]->position = 100; //6 | ||||
| 			stacks[4+army1.slots.size()]->position = 117; //7 | ||||
| 			stacks[5+army1.slots.size()]->position = 151; //9 | ||||
| 			stacks[6+army1.slots.size()]->position = 185; //11 | ||||
| 			break; | ||||
| 		default: //fault | ||||
| 			break; | ||||
| 		} | ||||
| 		for(unsigned g=0; g<stacks.size(); ++g) //shifting positions of two-hex creatures | ||||
| 		{ | ||||
| 			if((stacks[g]->position%17)==1 && stacks[g]->creature->isDoubleWide()) | ||||
| 			{ | ||||
| 				stacks[g]->position += 1; | ||||
| 			} | ||||
| 			else if((stacks[g]->position%17)==15 && stacks[g]->creature->isDoubleWide()) | ||||
| 			{ | ||||
| 				stacks[g]->position -= 1; | ||||
| 			} | ||||
| 		} | ||||
| 		std::stable_sort(stacks.begin(),stacks.end(),cmpst); | ||||
|  | ||||
| 		//block engaged players | ||||
| 		if(hero1->tempOwner<PLAYER_LIMIT) | ||||
| 			states.setFlag(hero1->tempOwner,&PlayerStatus::engagedIntoBattle,true); | ||||
| 		if(hero2 && hero2->tempOwner<PLAYER_LIMIT) | ||||
| 			states.setFlag(hero2->tempOwner,&PlayerStatus::engagedIntoBattle,true); | ||||
|  | ||||
| 		//send info about battles | ||||
| 		BattleStart bs; | ||||
| 		bs.info = curB; | ||||
| 		sendAndApply(&bs); | ||||
|  | ||||
| 	setupBattle(curB, tile, army1, army2, hero1, hero2); //battle start | ||||
| 	NEW_ROUND; | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	//tactic round | ||||
| 	{ | ||||
| @@ -764,6 +619,53 @@ void CGameHandler::handleConnection(std::set<int> players, CConnection &c) | ||||
| 					sendAndApply(&sg); | ||||
| 					break; | ||||
| 				} | ||||
| 			case 507://upgrade creature | ||||
| 				{ | ||||
| 					ui32 objid, upgID; | ||||
| 					ui8 pos; | ||||
| 					c >> objid >> pos >> upgID; | ||||
| 					CArmedInstance *obj = static_cast<CArmedInstance*>(gs->map->objects[objid]); | ||||
| 					UpgradeInfo ui = gs->getUpgradeInfo(obj,pos); | ||||
| 					int player = obj->tempOwner; | ||||
| 					int crQuantity = obj->army.slots[pos].second; | ||||
|  | ||||
| 					//check if upgrade is possible | ||||
| 					if(ui.oldID<0 || !vstd::contains(ui.newID,upgID))  | ||||
| 						break; | ||||
|  | ||||
| 					//check if player has enough resources | ||||
| 					for(int i=0;i<ui.cost.size();i++) | ||||
| 					{ | ||||
| 						for (std::set<std::pair<int,int> >::iterator j=ui.cost[i].begin(); j!=ui.cost[i].end(); j++) | ||||
| 						{ | ||||
| 							if(gs->players[player].resources[j->first] < j->second*crQuantity) | ||||
| 								goto upgend; | ||||
| 						} | ||||
| 					} | ||||
|  | ||||
| 					//take resources | ||||
| 					for(int i=0;i<ui.cost.size();i++) | ||||
| 					{ | ||||
| 						for (std::set<std::pair<int,int> >::iterator j=ui.cost[i].begin(); j!=ui.cost[i].end(); j++) | ||||
| 						{ | ||||
| 							SetResource sr; | ||||
| 							sr.player = player; | ||||
| 							sr.resid = j->first; | ||||
| 							sr.val = gs->players[player].resources[j->first] - j->second*crQuantity; | ||||
| 							sendAndApply(&sr); | ||||
| 						} | ||||
| 					} | ||||
|  | ||||
| 					{ | ||||
| 						//upgrade creature | ||||
| 						SetGarrisons sg; | ||||
| 						sg.garrs[objid] = obj->army; | ||||
| 						sg.garrs[objid].slots[pos].first = upgID; | ||||
| 						sendAndApply(&sg);	 | ||||
| 					}		 | ||||
| upgend: | ||||
| 					break; | ||||
| 				} | ||||
| 			case 2001: | ||||
| 				{ | ||||
| 					ui32 qid, answer; | ||||
| @@ -1090,3 +992,149 @@ void CGameHandler::run() | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void CGameHandler::setupBattle( BattleInfo * curB, int3 tile, CCreatureSet &army1, CCreatureSet &army2, CGHeroInstance * hero1, CGHeroInstance * hero2 ) | ||||
| { | ||||
| 	battleResult.set(NULL); | ||||
| 	std::vector<CStack*> & stacks = (curB->stacks); | ||||
|  | ||||
| 	curB->tile = tile; | ||||
| 	curB->siege = 0; //TODO: add sieges | ||||
| 	curB->army1=army1; | ||||
| 	curB->army2=army2; | ||||
| 	curB->hero1=(hero1)?(hero1->id):(-1); | ||||
| 	curB->hero2=(hero2)?(hero2->id):(-1); | ||||
| 	curB->side1=(hero1)?(hero1->tempOwner):(-1); | ||||
| 	curB->side2=(hero2)?(hero2->tempOwner):(-1); | ||||
| 	curB->round = -2; | ||||
| 	curB->activeStack = -1; | ||||
| 	for(std::map<si32,std::pair<ui32,si32> >::iterator i = army1.slots.begin(); i!=army1.slots.end(); i++) | ||||
| 	{ | ||||
| 		stacks.push_back(new CStack(&VLC->creh->creatures[i->second.first],i->second.second,hero1->tempOwner, stacks.size(), true)); | ||||
| 		stacks[stacks.size()-1]->ID = stacks.size()-1; | ||||
| 	} | ||||
| 	//initialization of positions | ||||
| 	switch(army1.slots.size()) //for attacker | ||||
| 	{ | ||||
| 	case 0: | ||||
| 		break; | ||||
| 	case 1: | ||||
| 		stacks[0]->position = 86; //6 | ||||
| 		break; | ||||
| 	case 2: | ||||
| 		stacks[0]->position = 35; //3 | ||||
| 		stacks[1]->position = 137; //9 | ||||
| 		break; | ||||
| 	case 3: | ||||
| 		stacks[0]->position = 35; //3 | ||||
| 		stacks[1]->position = 86; //6 | ||||
| 		stacks[2]->position = 137; //9 | ||||
| 		break; | ||||
| 	case 4: | ||||
| 		stacks[0]->position = 1; //1 | ||||
| 		stacks[1]->position = 69; //5 | ||||
| 		stacks[2]->position = 103; //7 | ||||
| 		stacks[3]->position = 171; //11 | ||||
| 		break; | ||||
| 	case 5: | ||||
| 		stacks[0]->position = 1; //1 | ||||
| 		stacks[1]->position = 35; //3 | ||||
| 		stacks[2]->position = 86; //6 | ||||
| 		stacks[3]->position = 137; //9 | ||||
| 		stacks[4]->position = 171; //11 | ||||
| 		break; | ||||
| 	case 6: | ||||
| 		stacks[0]->position = 1; //1 | ||||
| 		stacks[1]->position = 35; //3 | ||||
| 		stacks[2]->position = 69; //5 | ||||
| 		stacks[3]->position = 103; //7 | ||||
| 		stacks[4]->position = 137; //9 | ||||
| 		stacks[5]->position = 171; //11 | ||||
| 		break; | ||||
| 	case 7: | ||||
| 		stacks[0]->position = 1; //1 | ||||
| 		stacks[1]->position = 35; //3 | ||||
| 		stacks[2]->position = 69; //5 | ||||
| 		stacks[3]->position = 86; //6 | ||||
| 		stacks[4]->position = 103; //7 | ||||
| 		stacks[5]->position = 137; //9 | ||||
| 		stacks[6]->position = 171; //11 | ||||
| 		break; | ||||
| 	default: //fault | ||||
| 		break; | ||||
| 	} | ||||
| 	for(std::map<si32,std::pair<ui32,si32> >::iterator i = army2.slots.begin(); i!=army2.slots.end(); i++) | ||||
| 		stacks.push_back(new CStack(&VLC->creh->creatures[i->second.first],i->second.second,hero2 ? hero2->tempOwner : 255, stacks.size(), false)); | ||||
| 	switch(army2.slots.size()) //for defender | ||||
| 	{ | ||||
| 	case 0: | ||||
| 		break; | ||||
| 	case 1: | ||||
| 		stacks[0+army1.slots.size()]->position = 100; //6 | ||||
| 		break; | ||||
| 	case 2: | ||||
| 		stacks[0+army1.slots.size()]->position = 49; //3 | ||||
| 		stacks[1+army1.slots.size()]->position = 151; //9 | ||||
| 		break; | ||||
| 	case 3: | ||||
| 		stacks[0+army1.slots.size()]->position = 49; //3 | ||||
| 		stacks[1+army1.slots.size()]->position = 100; //6 | ||||
| 		stacks[2+army1.slots.size()]->position = 151; //9 | ||||
| 		break; | ||||
| 	case 4: | ||||
| 		stacks[0+army1.slots.size()]->position = 15; //1 | ||||
| 		stacks[1+army1.slots.size()]->position = 83; //5 | ||||
| 		stacks[2+army1.slots.size()]->position = 117; //7 | ||||
| 		stacks[3+army1.slots.size()]->position = 185; //11 | ||||
| 		break; | ||||
| 	case 5: | ||||
| 		stacks[0+army1.slots.size()]->position = 15; //1 | ||||
| 		stacks[1+army1.slots.size()]->position = 49; //3 | ||||
| 		stacks[2+army1.slots.size()]->position = 100; //6 | ||||
| 		stacks[3+army1.slots.size()]->position = 151; //9 | ||||
| 		stacks[4+army1.slots.size()]->position = 185; //11 | ||||
| 		break; | ||||
| 	case 6: | ||||
| 		stacks[0+army1.slots.size()]->position = 15; //1 | ||||
| 		stacks[1+army1.slots.size()]->position = 49; //3 | ||||
| 		stacks[2+army1.slots.size()]->position = 83; //5 | ||||
| 		stacks[3+army1.slots.size()]->position = 117; //7 | ||||
| 		stacks[4+army1.slots.size()]->position = 151; //9 | ||||
| 		stacks[5+army1.slots.size()]->position = 185; //11 | ||||
| 		break; | ||||
| 	case 7: | ||||
| 		stacks[0+army1.slots.size()]->position = 15; //1 | ||||
| 		stacks[1+army1.slots.size()]->position = 49; //3 | ||||
| 		stacks[2+army1.slots.size()]->position = 83; //5 | ||||
| 		stacks[3+army1.slots.size()]->position = 100; //6 | ||||
| 		stacks[4+army1.slots.size()]->position = 117; //7 | ||||
| 		stacks[5+army1.slots.size()]->position = 151; //9 | ||||
| 		stacks[6+army1.slots.size()]->position = 185; //11 | ||||
| 		break; | ||||
| 	default: //fault | ||||
| 		break; | ||||
| 	} | ||||
| 	for(unsigned g=0; g<stacks.size(); ++g) //shifting positions of two-hex creatures | ||||
| 	{ | ||||
| 		if((stacks[g]->position%17)==1 && stacks[g]->creature->isDoubleWide()) | ||||
| 		{ | ||||
| 			stacks[g]->position += 1; | ||||
| 		} | ||||
| 		else if((stacks[g]->position%17)==15 && stacks[g]->creature->isDoubleWide()) | ||||
| 		{ | ||||
| 			stacks[g]->position -= 1; | ||||
| 		} | ||||
| 	} | ||||
| 	std::stable_sort(stacks.begin(),stacks.end(),cmpst); | ||||
|  | ||||
| 	//block engaged players | ||||
| 	if(hero1->tempOwner<PLAYER_LIMIT) | ||||
| 		states.setFlag(hero1->tempOwner,&PlayerStatus::engagedIntoBattle,true); | ||||
| 	if(hero2 && hero2->tempOwner<PLAYER_LIMIT) | ||||
| 		states.setFlag(hero2->tempOwner,&PlayerStatus::engagedIntoBattle,true); | ||||
|  | ||||
| 	//send info about battles | ||||
| 	BattleStart bs; | ||||
| 	bs.info = curB; | ||||
| 	sendAndApply(&bs); | ||||
| } | ||||
| @@ -53,7 +53,7 @@ class CGameHandler | ||||
| 	void changeSecSkill(int ID, ui16 which, int val, bool abs=false); | ||||
| 	void moveStack(int stack, int dest); | ||||
| 	void startBattle(CCreatureSet army1, CCreatureSet army2, int3 tile, CGHeroInstance *hero1, CGHeroInstance *hero2); //use hero=NULL for no hero | ||||
|  | ||||
| 	void setupBattle( BattleInfo * curB, int3 tile, CCreatureSet &army1, CCreatureSet &army2, CGHeroInstance * hero1, CGHeroInstance * hero2 ); | ||||
|  | ||||
| public: | ||||
| 	CGameHandler(void); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user