浏览代码

Next batch of siege fixes

Ivan Savenko 2 年之前
父节点
当前提交
9f21569a79

+ 4 - 0
client/battle/CBattleFieldController.cpp

@@ -77,6 +77,10 @@ CBattleFieldController::CBattleFieldController(CBattleInterface * owner):
 		hex->myInterface = owner;
 		bfield.push_back(hex);
 	}
+
+	auto accessibility = owner->curInt->cb->getAccesibility();
+	for(int i = 0; i < accessibility.size(); i++)
+		stackCountOutsideHexes[i] = (accessibility[i] == EAccessibility::ACCESSIBLE);
 }
 
 void CBattleFieldController::showBackgroundImage(std::shared_ptr<CCanvas> canvas)

+ 12 - 16
client/battle/CBattleSiegeController.cpp

@@ -91,7 +91,7 @@ std::string CBattleSiegeController::getWallPieceImageName(EWallVisual::EWallVisu
 		return prefix + "WA5.BMP";
 	case EWallVisual::MOAT:
 		return prefix + "MOAT.BMP";
-	case EWallVisual::BACKGROUND_MOAT:
+	case EWallVisual::MOAT_BANK:
 		return prefix + "MLIP.BMP";
 	case EWallVisual::KEEP_BATTLEMENT:
 		return prefix + "MANC.BMP";
@@ -124,19 +124,15 @@ bool CBattleSiegeController::getWallPieceExistance(EWallVisual::EWallVisual what
 	//FIXME: use this instead of buildings test?
 	//ui8 siegeLevel = owner->curInt->cb->battleGetSiegeLevel();
 
-	bool isMoat = (what == EWallVisual::BACKGROUND_MOAT || what == EWallVisual::MOAT);
-	bool isKeep = what == EWallVisual::KEEP_BATTLEMENT;
-	bool isTower = (what == EWallVisual::UPPER_BATTLEMENT || what == EWallVisual::BOTTOM_BATTLEMENT);
-
-	bool hasMoat = town->hasBuilt(BuildingID::CITADEL) && town->town->faction->index != ETownType::TOWER;
-	bool hasKeep = town->hasBuilt(BuildingID::CITADEL);
-	bool hasTower = town->hasBuilt(BuildingID::CASTLE);
-
-	if ( isMoat ) return hasMoat;
-	if ( isKeep ) return hasKeep;
-	if ( isTower ) return hasTower;
-
-	return true;
+	switch (what)
+	{
+	case EWallVisual::MOAT:              return town->hasBuilt(BuildingID::CITADEL) && town->town->faction->index != ETownType::TOWER;
+	case EWallVisual::MOAT_BANK:         return town->hasBuilt(BuildingID::CITADEL) && town->town->faction->index != ETownType::TOWER && town->town->faction->index != ETownType::NECROPOLIS;
+	case EWallVisual::KEEP_BATTLEMENT:   return town->hasBuilt(BuildingID::CITADEL);
+	case EWallVisual::UPPER_BATTLEMENT:  return town->hasBuilt(BuildingID::CASTLE);
+	case EWallVisual::BOTTOM_BATTLEMENT: return town->hasBuilt(BuildingID::CASTLE);
+	default:                             return true;
+	}
 }
 
 BattleHex CBattleSiegeController::getWallPiecePosition(EWallVisual::EWallVisual what) const
@@ -256,8 +252,8 @@ void CBattleSiegeController::showAbsoluteObstacles(std::shared_ptr<CCanvas> canv
 	if (getWallPieceExistance(EWallVisual::MOAT))
 		showWallPiece(canvas, EWallVisual::MOAT, owner->pos.topLeft());
 
-	if (getWallPieceExistance(EWallVisual::BACKGROUND_MOAT))
-		showWallPiece(canvas, EWallVisual::BACKGROUND_MOAT, owner->pos.topLeft());
+	if (getWallPieceExistance(EWallVisual::MOAT_BANK))
+		showWallPiece(canvas, EWallVisual::MOAT_BANK, owner->pos.topLeft());
 }
 
 void CBattleSiegeController::showBattlefieldObjects(std::shared_ptr<CCanvas> canvas, const BattleHex & location )

+ 1 - 1
client/battle/CBattleSiegeController.h

@@ -41,7 +41,7 @@ namespace EWallVisual
 		BOTTOM_STATIC_WALL,
 		UPPER_STATIC_WALL,
 		MOAT,
-		BACKGROUND_MOAT,
+		MOAT_BANK,
 		KEEP_BATTLEMENT,
 		BOTTOM_BATTLEMENT,
 		UPPER_BATTLEMENT,

+ 2 - 2
client/battle/CBattleStacksController.cpp

@@ -498,8 +498,8 @@ void CBattleStacksController::startAction(const BattleAction* action)
 		if (creAnims[action->stackNumber]->framesInGroup(CCreatureAnim::MOVE_START))
 			addNewAnim(new CMovementStartAnimation(owner, stack));
 
-		if(shouldRotate(stack, stack->getPosition(), actionTarget.at(0).hexValue))
-			addNewAnim(new CReverseAnimation(owner, stack, stack->getPosition(), true));
+		//if(shouldRotate(stack, stack->getPosition(), actionTarget.at(0).hexValue))
+		//	addNewAnim(new CReverseAnimation(owner, stack, stack->getPosition(), true));
 	}
 }
 

+ 1 - 1
client/battle/CCreatureAnimation.cpp

@@ -314,7 +314,7 @@ void CCreatureAnimation::nextFrame(std::shared_ptr<CCanvas> canvas, bool facingR
 
 		image->setBorderPallete(borderPallete);
 
-		canvas->draw(image, pos.topLeft());
+		canvas->draw(image, pos.topLeft(), Rect(0, 0, pos.w, pos.h));
 	}
 }
 

+ 4 - 4
client/gui/CAnimation.cpp

@@ -92,8 +92,8 @@ public:
 	// Keep the original palette, in order to do color switching operation
 	void savePalette();
 
-	void draw(SDL_Surface * where, int posX=0, int posY=0, Rect *src=nullptr, ui8 alpha=255) const override;
-	void draw(SDL_Surface * where, SDL_Rect * dest, SDL_Rect * src, ui8 alpha=255) const override;
+	void draw(SDL_Surface * where, int posX=0, int posY=0, const Rect *src=nullptr, ui8 alpha=255) const override;
+	void draw(SDL_Surface * where, const SDL_Rect * dest, const SDL_Rect * src, ui8 alpha=255) const override;
 	std::shared_ptr<IImage> scaleFast(float scale) const override;
 	void exportBitmap(const boost::filesystem::path & path) const override;
 	void playerColored(PlayerColor player) override;
@@ -647,7 +647,7 @@ SDLImage::SDLImage(std::string filename)
 	}
 }
 
-void SDLImage::draw(SDL_Surface *where, int posX, int posY, Rect *src, ui8 alpha) const
+void SDLImage::draw(SDL_Surface *where, int posX, int posY, const Rect *src, ui8 alpha) const
 {
 	if(!surf)
 		return;
@@ -657,7 +657,7 @@ void SDLImage::draw(SDL_Surface *where, int posX, int posY, Rect *src, ui8 alpha
 	draw(where, &destRect, src);
 }
 
-void SDLImage::draw(SDL_Surface* where, SDL_Rect* dest, SDL_Rect* src, ui8 alpha) const
+void SDLImage::draw(SDL_Surface* where, const SDL_Rect* dest, const SDL_Rect* src, ui8 alpha) const
 {
 	if (!surf)
 		return;

+ 2 - 2
client/gui/CAnimation.h

@@ -40,8 +40,8 @@ public:
 	using BorderPallete = std::array<SDL_Color, 3>;
 
 	//draws image on surface "where" at position
-	virtual void draw(SDL_Surface * where, int posX = 0, int posY = 0, Rect * src = nullptr, ui8 alpha = 255) const=0;
-	virtual void draw(SDL_Surface * where, SDL_Rect * dest, SDL_Rect * src, ui8 alpha = 255) const = 0;
+	virtual void draw(SDL_Surface * where, int posX = 0, int posY = 0, const Rect * src = nullptr, ui8 alpha = 255) const=0;
+	virtual void draw(SDL_Surface * where, const SDL_Rect * dest, const SDL_Rect * src, ui8 alpha = 255) const = 0;
 
 	virtual std::shared_ptr<IImage> scaleFast(float scale) const = 0;
 

+ 5 - 0
client/gui/CCanvas.cpp

@@ -37,6 +37,11 @@ void CCanvas::draw(std::shared_ptr<IImage> image, const Point & pos)
 	image->draw(surface, pos.x, pos.y);
 }
 
+void CCanvas::draw(std::shared_ptr<IImage> image, const Point & pos, const Rect & sourceRect)
+{
+	image->draw(surface, pos.x, pos.y, &sourceRect);
+}
+
 void CCanvas::draw(std::shared_ptr<CCanvas> image, const Point & pos)
 {
 	blitAt(image->surface, pos.x, pos.y, surface);

+ 4 - 1
client/gui/CCanvas.h

@@ -30,9 +30,12 @@ public:
 
 	~CCanvas();
 
-	/// renders image onto this canvas
+	/// renders image onto this canvas at specified position
 	void draw(std::shared_ptr<IImage> image, const Point & pos);
 
+	/// renders section of image bounded by sourceRect at specified position
+	void draw(std::shared_ptr<IImage> image, const Point & pos, const Rect & sourceRect);
+
 	/// renders another canvas onto this canvas
 	void draw(std::shared_ptr<CCanvas> image, const Point & pos);
 

+ 1 - 1
config/factions/necropolis.json

@@ -222,7 +222,7 @@
 				},
 				"moat" :
 				{
-					"bank" : { "x" : 406, "y" : 77 },
+					"bank" : { "x" : -1, "y" : -1 }, // Should not be present
 					"moat" : { "x" : 406, "y" : 77 }
 				},
 				"static" :