فهرست منبع

cleared up rendering of tower shooters

Ivan Savenko 2 سال پیش
والد
کامیت
92ca0d9877
3فایلهای تغییر یافته به همراه54 افزوده شده و 62 حذف شده
  1. 49 58
      client/battle/CBattleSiegeController.cpp
  2. 4 0
      client/battle/CBattleSiegeController.h
  3. 1 4
      client/battle/CBattleStacksController.cpp

+ 49 - 58
client/battle/CBattleSiegeController.cpp

@@ -128,9 +128,9 @@ bool CBattleSiegeController::getWallPieceExistance(EWallVisual::EWallVisual 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);
+	case EWallVisual::KEEP_BATTLEMENT:   return town->hasBuilt(BuildingID::CITADEL) && EWallState::EWallState(owner->curInt->cb->battleGetWallState(EWallPart::KEEP)) != EWallState::DESTROYED;
+	case EWallVisual::UPPER_BATTLEMENT:  return town->hasBuilt(BuildingID::CASTLE) && EWallState::EWallState(owner->curInt->cb->battleGetWallState(EWallPart::UPPER_TOWER)) != EWallState::DESTROYED;
+	case EWallVisual::BOTTOM_BATTLEMENT: return town->hasBuilt(BuildingID::CASTLE) && EWallState::EWallState(owner->curInt->cb->battleGetWallState(EWallPart::BOTTOM_TOWER)) != EWallState::DESTROYED;
 	default:                             return true;
 	}
 }
@@ -138,24 +138,24 @@ bool CBattleSiegeController::getWallPieceExistance(EWallVisual::EWallVisual what
 BattleHex CBattleSiegeController::getWallPiecePosition(EWallVisual::EWallVisual what) const
 {
 	static const std::array<BattleHex, 18> wallsPositions = {
-		BattleHex::INVALID, // background, handled separately
-		BattleHex::HEX_BEFORE_ALL,
-		135,
-		BattleHex::HEX_AFTER_ALL,
-		182,
-		130,
-		78,
-		12,
-		BattleHex::HEX_BEFORE_ALL,
-		BattleHex::HEX_BEFORE_ALL, //gates // 94,
-		112,
-		165,
-		45,
-		BattleHex::INVALID, //moat, printed as obstacle // BattleHex::HEX_BEFORE_ALL,
-		BattleHex::INVALID, //moat, printed as obstacle
-		135,
-		BattleHex::HEX_AFTER_ALL,
-		BattleHex::HEX_BEFORE_ALL
+		BattleHex::INVALID,        // BACKGROUND,         // handled separately
+		BattleHex::HEX_BEFORE_ALL, // BACKGROUND_WALL,
+		135,                       // KEEP,
+		BattleHex::HEX_AFTER_ALL,  // BOTTOM_TOWER,
+		182,                       // BOTTOM_WALL,
+		130,                       // WALL_BELLOW_GATE,
+		78,                        // WALL_OVER_GATE,
+		12,                        // UPPER_WALL,
+		BattleHex::HEX_BEFORE_ALL, // UPPER_TOWER,
+		BattleHex::HEX_BEFORE_ALL, // GATE,               // 94
+		112,                       // GATE_ARCH,
+		165,                       // BOTTOM_STATIC_WALL,
+		45,                        // UPPER_STATIC_WALL,
+		BattleHex::INVALID,        // MOAT,               // printed as absolute obstacle
+		BattleHex::INVALID,        // MOAT_BANK,          // printed as absolute obstacle
+		135,                       // KEEP_BATTLEMENT,
+		BattleHex::HEX_AFTER_ALL,  // BOTTOM_BATTLEMENT,
+		BattleHex::HEX_BEFORE_ALL, // UPPER_BATTLEMENT,
 	};
 
 	return wallsPositions[what];
@@ -256,6 +256,29 @@ void CBattleSiegeController::showAbsoluteObstacles(std::shared_ptr<CCanvas> canv
 		showWallPiece(canvas, EWallVisual::MOAT_BANK, offset);
 }
 
+BattleHex CBattleSiegeController::getTurretBattleHex(EWallVisual::EWallVisual wallPiece) const
+{
+	switch(wallPiece)
+	{
+	case EWallVisual::KEEP_BATTLEMENT:   return BattleHex::CASTLE_CENTRAL_TOWER;
+	case EWallVisual::BOTTOM_BATTLEMENT: return BattleHex::CASTLE_BOTTOM_TOWER;
+	case EWallVisual::UPPER_BATTLEMENT:  return BattleHex::CASTLE_UPPER_TOWER;
+	}
+	assert(0);
+	return BattleHex::INVALID;
+}
+
+const CStack * CBattleSiegeController::getTurretStack(EWallVisual::EWallVisual wallPiece) const
+{
+	for (auto & stack : owner->curInt->cb->battleGetAllStacks(true))
+	{
+		if ( stack->initialPosition == getTurretBattleHex(wallPiece))
+			return stack;
+	}
+	assert(0);
+	return nullptr;
+}
+
 void CBattleSiegeController::showBattlefieldObjects(std::shared_ptr<CCanvas> canvas, const BattleHex & location )
 {
 	for (int i = EWallVisual::WALL_FIRST; i <= EWallVisual::WALL_LAST; ++i)
@@ -268,45 +291,13 @@ void CBattleSiegeController::showBattlefieldObjects(std::shared_ptr<CCanvas> can
 		if ( getWallPiecePosition(wallPiece) != location)
 			continue;
 
-		if (wallPiece != EWallVisual::KEEP_BATTLEMENT &&
-			wallPiece != EWallVisual::BOTTOM_BATTLEMENT &&
-			wallPiece != EWallVisual::UPPER_BATTLEMENT)
-		{
-			showWallPiece(canvas, wallPiece, owner->pos.topLeft());
-			continue;
-		}
-
-		// tower. check if tower is alive - stack is found
-		BattleHex stackPos;
-		switch(wallPiece)
-		{
-		case EWallVisual::KEEP_BATTLEMENT:
-			stackPos = BattleHex::CASTLE_CENTRAL_TOWER;
-			break;
-		case EWallVisual::BOTTOM_BATTLEMENT:
-			stackPos = BattleHex::CASTLE_BOTTOM_TOWER;
-			break;
-		case EWallVisual::UPPER_BATTLEMENT:
-			stackPos = BattleHex::CASTLE_UPPER_TOWER;
-			break;
-		}
-
-		const CStack *turret = nullptr;
-
-		for (auto & stack : owner->curInt->cb->battleGetAllStacks(true))
-		{
-			if(stack->initialPosition == stackPos)
-			{
-				turret = stack;
-				break;
-			}
-		}
-
-		if (turret)
+		if (wallPiece == EWallVisual::KEEP_BATTLEMENT ||
+			wallPiece == EWallVisual::BOTTOM_BATTLEMENT ||
+			wallPiece == EWallVisual::UPPER_BATTLEMENT)
 		{
-			owner->stacksController->showStack(canvas, turret);
-			showWallPiece(canvas, wallPiece, owner->pos.topLeft());
+			owner->stacksController->showStack(canvas, getTurretStack(wallPiece));
 		}
+		showWallPiece(canvas, wallPiece, owner->pos.topLeft());
 	}
 }
 

+ 4 - 0
client/battle/CBattleSiegeController.h

@@ -16,6 +16,7 @@ VCMI_LIB_NAMESPACE_BEGIN
 
 struct CatapultAttack;
 class CCreature;
+class CStack;
 class CGTownInstance;
 
 VCMI_LIB_NAMESPACE_END
@@ -85,6 +86,9 @@ class CBattleSiegeController
 
 	void showWallPiece(std::shared_ptr<CCanvas> canvas, EWallVisual::EWallVisual what, const Point & offset);
 
+	BattleHex getTurretBattleHex(EWallVisual::EWallVisual wallPiece) const;
+	const CStack * getTurretStack(EWallVisual::EWallVisual wallPiece) const;
+
 public:
 	CBattleSiegeController(CBattleInterface * owner, const CGTownInstance *siegeTown);
 

+ 1 - 4
client/battle/CBattleStacksController.cpp

@@ -113,16 +113,13 @@ void CBattleStacksController::showBattlefieldObjects(std::shared_ptr<CCanvas> ca
 		return stack->getPosition();
 	};
 
-	auto stacks = owner->curInt->cb->battleGetAllStacks(true);
+	auto stacks = owner->curInt->cb->battleGetAllStacks(false);
 
 	for (auto & stack : stacks)
 	{
 		if (stackAnimation.find(stack->ID) == stackAnimation.end()) //e.g. for summoned but not yet handled stacks
 			continue;
 
-		//if (stack->initialPosition < 0) // turret shooters are handled separately
-		//	continue;
-
 		//FIXME: hack to ignore ghost stacks
 		if ((stackAnimation[stack->ID]->getType() == CCreatureAnim::DEAD || stackAnimation[stack->ID]->getType() == CCreatureAnim::HOLDING) && stack->isGhost())
 			continue;//ignore