Sfoglia il codice sorgente

Various fixes, mainly around garrisons.

Michał W. Urbańczyk 14 anni fa
parent
commit
a3ba75b0b7
4 ha cambiato i file con 62 aggiunte e 77 eliminazioni
  1. 7 4
      client/CPlayerInterface.cpp
  2. 46 63
      client/GUIClasses.cpp
  3. 8 9
      client/GUIClasses.h
  4. 1 1
      lib/CCreatureSet.cpp

+ 7 - 4
client/CPlayerInterface.cpp

@@ -487,10 +487,13 @@ void CPlayerInterface::heroInGarrisonChange(const CGTownInstance *town)
 	{
 		c->garr->highlighted = NULL;
 		c->hslotup.hero = town->garrisonHero;
-		c->garr->odown = c->hslotdown.hero = town->visitingHero;
-		c->garr->set2 = town->visitingHero;
-		c->garr->ourUp = LOCPLINT->playerID==(town->garrisonHero ? town->garrisonHero->tempOwner : town->tempOwner);
-		c->garr->ourDown = (town->visitingHero ? LOCPLINT->playerID==town->visitingHero->tempOwner : false);
+		c->hslotdown.hero = town->visitingHero;
+		const CArmedInstance *upperArmy = town;
+		if(town->garrisonHero)
+			upperArmy = town->garrisonHero;
+
+		c->garr->setArmy(upperArmy, 0);
+		c->garr->setArmy(town->visitingHero, 1);
 		c->garr->recreateSlots();
 	}
 	GH.totalRedraw();

+ 46 - 63
client/GUIClasses.cpp

@@ -112,7 +112,7 @@ void CGarrisonSlot::hover (bool on)
 				{
 					temp = CGI->generaltexth->tcommands[32]; //Select %s (visiting)
 				}
-				else if(owner->oup && owner->oup->ID == TOWNI_TYPE)
+				else if(owner->armedObjs[0] && owner->armedObjs[0]->ID == TOWNI_TYPE)
 				{
 					temp = CGI->generaltexth->tcommands[12]; //Select %s (in garrison)
 				}
@@ -156,12 +156,12 @@ void CGarrisonSlot::hover (bool on)
 
 const CArmedInstance * CGarrisonSlot::getObj()
 {
-	return 	(!upg)?(owner->oup):(owner->odown);
+	return 	(!upg)?(owner->armedObjs[0]):(owner->armedObjs[1]);
 }
 
 bool CGarrisonSlot::our()
 {
-	return 	upg?(owner->ourDown):(owner->ourUp);
+	return 	upg?(owner->owned[1]):(owner->owned[0]);
 }
 
 void CGarrisonSlot::clickRight(tribool down, bool previousState)
@@ -246,15 +246,15 @@ void CGarrisonSlot::clickLeft(tribool down, bool previousState)
 					else if(creature != owner->highlighted->creature) //swap
 					{
 						LOCPLINT->cb->swapCreatures(
-							(!upg)?(owner->oup):(owner->odown),
-							(!owner->highlighted->upg)?(owner->oup):(owner->odown),
+							(!upg)?(owner->armedObjs[0]):(owner->armedObjs[1]),
+							(!owner->highlighted->upg)?(owner->armedObjs[0]):(owner->armedObjs[1]),
 							ID,owner->highlighted->ID);
 					}
 					else //merge
 					{
 						LOCPLINT->cb->mergeStacks(
-							(!owner->highlighted->upg)?(owner->oup):(owner->odown),
-							(!upg)?(owner->oup):(owner->odown),
+							(!owner->highlighted->upg)?(owner->armedObjs[0]):(owner->armedObjs[1]),
+							(!upg)?(owner->armedObjs[0]):(owner->armedObjs[1]),
 							owner->highlighted->ID,ID);
 					}
 				}
@@ -353,6 +353,7 @@ void CGarrisonSlot::showAll(SDL_Surface * to)
 			blitAt(imgs[-1],pos,to);
 	}
 }
+
 CGarrisonInt::~CGarrisonInt()
 {/*
 	for(size_t i = 0; i<splitButtons.size(); i++)
@@ -401,11 +402,11 @@ void CGarrisonInt::createSlots()
 		w = 58;
 	}
 
-	if(set1)
-		createSet(slotsUp, set1, 0, 0, w+interx, 0);
+	if(armedObjs[0])
+		createSet(slotsUp, armedObjs[0], 0, 0, w+interx, 0);
 
-	if(set2)
-		createSet (slotsDown, set2, garOffset.x, garOffset.y, w+interx, 1);
+	if(armedObjs[1])
+		createSet (slotsDown, armedObjs[1], garOffset.x, garOffset.y, w+interx, 1);
 }
 
 void CGarrisonInt::deleteSlots()
@@ -451,26 +452,18 @@ void CGarrisonInt::splitClick()
 }
 void CGarrisonInt::splitStacks(int am2)
 {
-	LOCPLINT->cb->splitStack(
-		(highlighted->upg)?(odown):(oup),
-		(pb)?(odown):(oup),
-		highlighted->ID,
-		p2,
-		am2);
-
+	LOCPLINT->cb->splitStack(armedObjs[highlighted->upg], armedObjs[pb], highlighted->ID, p2, am2);
 }
+
 CGarrisonInt::CGarrisonInt(int x, int y, int inx, const Point &garsOffset, 
                             SDL_Surface *&pomsur, const Point& SurOffset, 
                             const CArmedInstance *s1, const CArmedInstance *s2, 
                             bool _removableUnits, bool smallImgs, bool _twoRows )
-
-	:interx(inx), garOffset(garsOffset), surOffset(SurOffset), highlighted(NULL), sur(pomsur), splitting(false),
-	 smallIcons(smallImgs), removableUnits (_removableUnits), twoRows(_twoRows), oup(s1), odown(s2)
+	: interx(inx), garOffset(garsOffset), surOffset(SurOffset), highlighted(NULL), sur(pomsur), splitting(false),
+	smallIcons(smallImgs), removableUnits (_removableUnits), twoRows(_twoRows)
 {
-	ourUp =  s1?(s1->tempOwner == LOCPLINT->playerID || s1->tempOwner == 254):false; //254 - neutral objects (pandora, banks)
-	ourDown = s2?(s2->tempOwner == LOCPLINT->playerID || s2->tempOwner == 254):false;
-	set1 = LOCPLINT->cb->getGarrison(s1);
-	set2 = LOCPLINT->cb->getGarrison(s2);
+	setArmy(s1, false);
+	setArmy(s2, true);
 	pos.x += x;
 	pos.y += y;
 	createSlots();
@@ -485,6 +478,12 @@ void CGarrisonInt::activate()
 	CIntObject::activate();
 }
 
+void CGarrisonInt::setArmy(const CArmedInstance *army, bool bottomGarrison)
+{
+	owned[bottomGarrison] =  army ? (army->tempOwner == LOCPLINT->playerID || army->tempOwner == 254) : false; //254 - neutral objects (pandora, banks)
+	armedObjs[bottomGarrison] = army;
+}
+
 CInfoWindow::CInfoWindow(std::string Text, int player, const std::vector<SComponent*> &comps, std::vector<std::pair<std::string,CFunctionList<void()> > > &Buttons, bool delComps)
 {
 	OBJ_CONSTRUCTION_CAPTURING_ALL;
@@ -3629,7 +3628,7 @@ void CAltarWindow::makeDeal()
 		}
 
 		arts->commonInfo->reset();
-		arts->scrollBackpack(0);
+		//arts->scrollBackpack(0);
 		deal->block(true);
 	}
 
@@ -4451,58 +4450,42 @@ void CGarrisonWindow::close()
 	GH.popIntTotally(this);
 }
 
-void CGarrisonWindow::activate()
+CGarrisonWindow::CGarrisonWindow( const CArmedInstance *up, const CGHeroInstance *down, bool removableUnits )
 {
-	quit->activate();
-	garr->activate();
+	OBJ_CONSTRUCTION_CAPTURING_ALL;
+	bg = new CPicture("GARRISON.bmp");
+	bg->colorizeAndConvert(LOCPLINT->playerID);
+	pos = bg->center();
+
+	garr = new CGarrisonInt(92, 127, 4, Point(0,96), bg->bg, Point(93,127), up, down, removableUnits);
+	{
+		AdventureMapButton *split = new AdventureMapButton(CGI->generaltexth->tcommands[3],"",boost::bind(&CGarrisonInt::splitClick,garr),88,314,"IDV6432.DEF");
+		removeChild(split);
+		garr->addSplitBtn(split);
+	}
+	quit = new AdventureMapButton(CGI->generaltexth->tcommands[8],"",boost::bind(&CGarrisonWindow::close,this),399,314,"IOK6432.DEF",SDLK_RETURN);
 }
 
-void CGarrisonWindow::deactivate()
+CGarrisonWindow::~CGarrisonWindow()
 {
-	quit->deactivate();
-	garr->deactivate();
 }
 
-void CGarrisonWindow::show(SDL_Surface * to)
+void CGarrisonWindow::showAll(SDL_Surface * to)
 {
-	blitAt(bg,pos,to);
-	quit->show(to);
-	garr->show(to);
+	CIntObject::showAll(to);
 
 	std::string title;
-	if (garr->odown->tempOwner == garr->oup->tempOwner)
+	if (garr->armedObjs[1]->tempOwner == garr->armedObjs[0]->tempOwner)
 		title = CGI->generaltexth->allTexts[709];
 	else
 	{
 		title = CGI->generaltexth->allTexts[35];
-		boost::algorithm::replace_first(title, "%s", garr->oup->Slots().begin()->second->type->namePl);
+		boost::algorithm::replace_first(title, "%s", garr->armedObjs[0]->Slots().begin()->second->type->namePl);
 	}
 
-	blitAt(graphics->flags->ourImages[garr->odown->getOwner()].bitmap,pos.x+28,pos.y+124,to);
-	blitAt(graphics->portraitLarge[static_cast<const CGHeroInstance*>(garr->odown)->portrait],pos.x+29,pos.y+222,to);
-	printAtMiddle(title,pos.x+275,pos.y+30,FONT_BIG,tytulowy,to);
-}
-
-CGarrisonWindow::CGarrisonWindow( const CArmedInstance *up, const CGHeroInstance *down, bool removableUnits )
-{
-	bg = BitmapHandler::loadBitmap("GARRISON.bmp");
-	SDL_SetColorKey(bg,SDL_SRCCOLORKEY,SDL_MapRGB(bg->format,0,255,255));
-	graphics->blueToPlayersAdv(bg,LOCPLINT->playerID);
-	pos.x = screen->w/2 - bg->w/2;
-	pos.y = screen->h/2 - bg->h/2;
-	pos.w = screen->w;
-	pos.h = screen->h;
-
-	garr = new CGarrisonInt(pos.x+92, pos.y+127, 4, Point(0,96), bg, Point(93,127), up, down, removableUnits);
-	garr->addSplitBtn(new AdventureMapButton(CGI->generaltexth->tcommands[3],"",boost::bind(&CGarrisonInt::splitClick,garr),pos.x+88,pos.y+314,"IDV6432.DEF"));
-	quit = new AdventureMapButton(CGI->generaltexth->tcommands[8],"",boost::bind(&CGarrisonWindow::close,this),pos.x+399,pos.y+314,"IOK6432.DEF",SDLK_RETURN);
-}
-
-CGarrisonWindow::~CGarrisonWindow()
-{
-	SDL_FreeSurface(bg);
-	delete quit;
-	delete garr;
+	blitAtLoc(graphics->flags->ourImages[garr->armedObjs[1]->getOwner()].bitmap,28,124,to);
+	blitAtLoc(graphics->portraitLarge[static_cast<const CGHeroInstance*>(garr->armedObjs[1])->portrait],29,222,to);
+	printAtMiddleLoc(title,275,30,FONT_BIG,tytulowy,to);
 }
 
 IShowActivable::IShowActivable()

+ 8 - 9
client/GUIClasses.h

@@ -237,14 +237,16 @@ public:
 	     smallIcons, //true - 32x32 imgs, false - 58x64
 	     removableUnits,//player can remove units from up
 	     twoRows,//slots will be placed in 2 rows
-		 ourUp,ourDown;//player owns up or down army
+		 owned[2];//player owns up or down army [0] upper, [1] lower
 
-	const CCreatureSet *set1; //top set of creatures
-	const CCreatureSet *set2; //bottom set of creatures
+// 	const CCreatureSet *set1; //top set of creatures
+// 	const CCreatureSet *set2; //bottom set of creatures
 
 	std::vector<CGarrisonSlot*> slotsUp, slotsDown; //slots of upper and lower garrison
-	const CArmedInstance *oup, *odown; //upper and lower garrisons (heroes or towns)
+	const CArmedInstance *armedObjs[2]; //[0] is upper, [1] is down
+	//const CArmedInstance *oup, *odown; //upper and lower garrisons (heroes or towns)
 
+	void setArmy(const CArmedInstance *army, bool bottomGarrison);
 	void addSplitBtn(AdventureMapButton * button);
 	void createSet(std::vector<CGarrisonSlot*> &ret, const CCreatureSet * set, int posX, int distance, int posY, int Upg );
 	
@@ -1006,14 +1008,11 @@ public:
 class CGarrisonWindow : public CWindowWithGarrison
 {
 public:
-	SDL_Surface *bg; //background surface
+	CPicture *bg; //background surface
 	AdventureMapButton *quit;
 
 	void close();
-	void activate();
-	void deactivate();
-	void show(SDL_Surface * to);
-	void showAll(SDL_Surface * to){show(to);};
+	void showAll(SDL_Surface * to);
 	CGarrisonWindow(const CArmedInstance *up, const CGHeroInstance *down, bool removableUnits); //c-tor
 	~CGarrisonWindow(); //d-tor
 };

+ 1 - 1
lib/CCreatureSet.cpp

@@ -328,7 +328,7 @@ CStackInstance * CCreatureSet::detachStack(TSlot slot)
 	assert(hasStackAtSlot(slot));
 	CStackInstance *ret = stacks[slot];
 
-	if(CArmedInstance *armedObj = castToArmyObj())
+	//if(CArmedInstance *armedObj = castToArmyObj())
 	{
 		ret->setArmyObj(NULL); //detaches from current armyobj
 	}