Sfoglia il codice sorgente

* setting army formation
* minor changes

Michał W. Urbańczyk 17 anni fa
parent
commit
70673674dc

+ 15 - 11
AdventureMapButton.cpp

@@ -159,6 +159,20 @@ void AdventureMapButton::block( bool on )
 	bitmapOffset = on ? 2 : 0;
 	show();
 }
+void CHighlightableButton::select(bool on)
+{
+	selected = on;
+	state = selected ? 3 : 0;
+	if(selected)
+		callback();
+	else 
+		callback2();
+	if(hoverTexts.size()>1)
+	{
+		hover(false);
+		hover(true);
+	}
+}
 
 void CHighlightableButton::clickLeft( tribool down )
 {
@@ -172,17 +186,7 @@ void CHighlightableButton::clickLeft( tribool down )
 	if (pressedL && (down==false))
 	{
 		pressedL=state;
-		selected = !selected;
-		state = selected ? 3 : 0;
-		if(selected)
-			callback();
-		else 
-			callback2();
-		if(hoverTexts.size()>1)
-		{
-			hover(false);
-			hover(true);
-		}
+		select(!selected);
 	}
 	else
 	{

+ 1 - 0
AdventureMapButton.h

@@ -36,6 +36,7 @@ public:
 	CHighlightableButton(const CFunctionList<void()> &onSelect, const CFunctionList<void()> &onDeselect, const std::map<int,std::string> &Name, const std::string &HelpBox, bool playerColoredButton, const std::string &defName, std::vector<std::string> * add, int x, int y, bool activ );
 	bool selected;
 	CFunctionList<void()> callback2; //when disselecting
+	void select(bool on);
 	void clickLeft (tribool down);
 };
 

+ 6 - 0
CCallback.cpp

@@ -586,4 +586,10 @@ 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);
+}
+
+void CCallback::setFormation(const CGHeroInstance * hero, bool loose)
+{
+	hero->looseFormation = loose;
+	*cl->serv << ui16(512) << hero->id << ui8(loose);
 }

+ 2 - 0
CCallback.h

@@ -42,6 +42,7 @@ public:
 	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 trade(int mode, int id1, int id2, int val1)=0; //mode==0: sell val1 units of id1 resource for id2 resiurce
+	virtual void setFormation(const CGHeroInstance * hero, bool loose)=0;
 
 //get info
 	virtual bool verifyPath(CPath * path, bool blockSea)=0;
@@ -121,6 +122,7 @@ public:
 	void swapGarrisonHero(const CGTownInstance *town);
 	void buyArtifact(const CGHeroInstance *hero, int aid);
 	void trade(int mode, int id1, int id2, int val1);
+	void setFormation(const CGHeroInstance * hero, bool loose);
 
 //get info
 	bool verifyPath(CPath * path, bool blockSea);

+ 17 - 5
CHeroWindow.cpp

@@ -48,8 +48,8 @@ CHeroWindow::CHeroWindow(int playerColor):
 	dismissButton = new AdventureMapButton(std::string(), CGI->generaltexth->heroscrn[28], boost::bind(&CHeroWindow::dismissCurrent,this), 519, 437, "hsbtns2.def", false, NULL, false);
 	questlogButton = new AdventureMapButton(CGI->generaltexth->heroscrn[0], std::string(), boost::bind(&CHeroWindow::questlog,this), 379, 437, "hsbtns4.def", false, NULL, false);
 
-	gar1button = new AdventureMapButton(CGI->generaltexth->heroscrn[23], CGI->generaltexth->heroscrn[29], boost::bind(&CHeroWindow::gar1,this), 546, 491, "hsbtns6.def", false, NULL, false);
-	gar3button = new AdventureMapButton(CGI->generaltexth->heroscrn[24], CGI->generaltexth->heroscrn[30], boost::bind(&CHeroWindow::gar3,this), 546, 527, "hsbtns7.def", false, NULL, false);
+	gar1button = new CHighlightableButton(0,0,map_list_of(0,CGI->generaltexth->heroscrn[23]), CGI->generaltexth->heroscrn[29], false, "hsbtns6.def" , NULL,546, 491, false);
+	gar3button = new CHighlightableButton(0,0,map_list_of(0,CGI->generaltexth->heroscrn[24]), CGI->generaltexth->heroscrn[30], false,  "hsbtns7.def", NULL, 546, 527, false);
 	gar2button = new CHighlightableButton(0, 0, map_list_of(0,CGI->generaltexth->heroscrn[26])(3,CGI->generaltexth->heroscrn[25]), CGI->generaltexth->heroscrn[31], false, "hsbtns8.def", NULL, 604, 491, false);
 	gar4button = new AdventureMapButton(CGI->generaltexth->allTexts[256], CGI->generaltexth->heroscrn[32], boost::function<void()>(), 604, 527, "hsbtns9.def", false, NULL, false);
 	boost::algorithm::replace_first(gar4button->hoverTexts[0],"%s",CGI->generaltexth->allTexts[43]);
@@ -307,9 +307,21 @@ void CHeroWindow::setHero(const CGHeroInstance *Hero)
 	else
 	{
 		gar2button->block(false);
-		gar2button->callback = boost::bind(vstd::assign<bool,bool>,boost::ref(hero->tacticFormationEnabled), true);
-		gar2button->callback2 = boost::bind(vstd::assign<bool,bool>,boost::ref(hero->tacticFormationEnabled), true);
-	}
+		gar2button->callback = vstd::assigno(hero->tacticFormationEnabled,true);
+		gar2button->callback2 = vstd::assigno(hero->tacticFormationEnabled,false);
+	}
+	gar1button->callback.clear();
+	gar1button->callback = vstd::assigno(hero->looseFormation,true);
+	gar1button->callback += boost::bind(&CHighlightableButton::select, gar3button, false);
+	gar1button->callback += boost::bind(&CCallback::setFormation, LOCPLINT->cb, Hero, true);
+	gar3button->callback.clear();
+	gar3button->callback = vstd::assigno(hero->looseFormation,false);
+	gar3button->callback += boost::bind(&CHighlightableButton::select, gar1button, false);
+	gar3button->callback += boost::bind(&CCallback::setFormation, LOCPLINT->cb, Hero, false);
+	if(hero->looseFormation)
+		gar1button->select(true);
+	else
+		gar3button->select(true);
 	redrawCurBack();
 }
 

+ 1 - 8
CHeroWindow.h

@@ -91,14 +91,8 @@ class CHeroWindow: public IShowActivable, public virtual CIntObject
 
 	//buttons
 	AdventureMapButton * gar4button; //splitting
-	//std::vector< AdventureMapButton<CHeroWindow> * > heroList; //list of heroes
 	std::vector<LClickableAreaHero *> heroListMi; //new better list of heroes
 
-	//artifact places
-	//CArtPlace * artHead, * artLRing, * artRRing, * artLHand, * artRhand,
-	//	* artFeet, * artSpellBook, * artMach1, * artMach2, * artMach3,
-	//	* artMach4, * artMisc1, * artMisc2, * artMisc3, * artMisc4,
-	//	* artMisc5, * artTorso, * artNeck, * artShoulders; //hero's artifacts
 	std::vector<CArtPlace *> artWorn; // 0 - head; 1 - shoulders; 2 - neck; 3 - right hand; 4 - left hand; 5 - torso; 6 - right ring; 7 - left ring; 8 - feet; 9 - misc1; 10 - misc2; 11 - misc3; 12 - misc4; 13 - mach1; 14 - mach2; 15 - mach3; 16 - mach4; 17 - spellbook; 18 - misc5
 	std::vector<CArtPlace *> backpack; //hero's visible backpack (only 5 elements!)
 	int backpackPos; //unmber of first art visible in backpack (in hero's vector)
@@ -111,9 +105,8 @@ class CHeroWindow: public IShowActivable, public virtual CIntObject
 	std::vector<LRClickableAreaWTextComp *> secSkillAreas;
 public:
 	AdventureMapButton * quitButton, * dismissButton, * questlogButton, //general
-		* gar1button, * gar3button, //garrison / formation handling
 		* leftArtRoll, * rightArtRoll;
-	CHighlightableButton *gar2button;
+	CHighlightableButton *gar2button, *gar1button, *gar3button; //garrison / formation handling;
 	int player;
 	CHeroWindow(int playerColor); //c-tor
 	~CHeroWindow(); //d-tor

+ 1 - 1
client/Client.cpp

@@ -412,7 +412,7 @@ void CClient::process(int what)
 			CGHeroInstance *h = gs->getHero(bs.heroid);
 			if(vstd::contains(playerint,h->tempOwner))
 			{
-				boost::function<void(ui32)> callback = boost::function<void(ui32)>(boost::bind(&CCallback::selectionMade,cb,_1,bs.id));
+				boost::function<void(ui32)> callback = boost::function<void(ui32)>(boost::bind(&CCallback::selectionMade,LOCPLINT->cb,_1,bs.id));
 				playerint[h->tempOwner]->heroGotLevel((const CGHeroInstance *)h,(int)bs.primskill,bs.skills, callback);
 			}
 			break;

+ 1 - 1
client/VCMI_client.vcproj

@@ -565,7 +565,7 @@
 			>
 		</File>
 		<File
-			RelativePath=".\ClassDiagram1.cd"
+			RelativePath=".\ttt.txt"
 			>
 		</File>
 	</Files>

+ 19 - 0
global.h

@@ -157,6 +157,25 @@ namespace vstd
 	{
 		a1 = a2;
 	}
+	template <typename t1, typename t2>
+	struct assigner
+	{
+	public:
+		t1 &op1;
+		t2 op2;
+		assigner(t1 &a1, t2 a2)
+			:op1(a1), op2(a2)
+		{}
+		void operator()()
+		{
+			op1 = op2;
+		}
+	};
+	template <typename t1, typename t2>
+	assigner<t1,t2> assigno(t1 &a1, const t2 &a2)
+	{
+		return assigner<t1,t2>(a1,a2);
+	}
 	template <typename t1, typename t2, typename t3>
 	bool equal(const t1 &a1, const t3 t1::* point, const t2 &a2)
 	{

+ 1 - 0
hch/CObjectHandler.cpp

@@ -397,6 +397,7 @@ CGObjectInstance::~CGObjectInstance()
 }
 CGHeroInstance::CGHeroInstance()
 {
+	looseFormation = true;
 	tacticFormationEnabled = inTownGarrison = false;
 	portrait = level = exp = -1;
 	isStanding = true;

+ 1 - 1
hch/CObjectHandler.h

@@ -82,7 +82,7 @@ public:
 	mutable int moveDir; //format:	123
 					//		8 4
 					//		765
-	mutable bool isStanding, tacticFormationEnabled;
+	mutable ui8 isStanding, tacticFormationEnabled, looseFormation;
 	CHero * type;
 	ui32 exp; //experience point
 	int level; //current level of hero

+ 8 - 0
server/CGameHandler.cpp

@@ -849,6 +849,14 @@ upgend:
 					sr.val = gs->players[player].resources[id2] + (int)uzysk;
 					sendAndApply(&sr);
 
+					break;
+				}
+			case 512:
+				{
+					si32 hid;
+					ui8 formation;
+					c >> hid >> formation;
+					gs->getHero(hid)->army.formation = !formation;
 					break;
 				}
 			case 2001: