Browse Source

Battles: move hexes enum to GameConstants and fix wall position

Before we had hex 62 marked as destructible wall while actually it's must be 78.
Arseniy Shestakov 9 years ago
parent
commit
11dc428b1e
5 changed files with 44 additions and 31 deletions
  1. 0 7
      lib/BattleHex.h
  2. 10 5
      lib/CBattleCallback.cpp
  3. 15 1
      lib/GameConstants.h
  4. 2 1
      lib/NetPacksLib.cpp
  5. 17 17
      server/CGameHandler.cpp

+ 0 - 7
lib/BattleHex.h

@@ -16,13 +16,6 @@
 // for battle stacks' positions
 struct DLL_LINKAGE BattleHex
 {
-	enum ESiegeHexes : si16
-	{
-		GATE_BRIDGE = 94,
-		GATE_OUTER = 95,
-		GATE_INNER = 96
-	};
-
 	static const si16 INVALID = -1;
 	enum EDir { RIGHT, BOTTOM_RIGHT, BOTTOM_LEFT, LEFT, TOP_LEFT, TOP_RIGHT };
 

+ 10 - 5
lib/CBattleCallback.cpp

@@ -1151,7 +1151,7 @@ AccessibilityInfo CBattleInfoCallback::getAccesibility() const
 			accessability = EAccessibility::UNAVAILABLE;
 			break;
 		}
-		ret[95] = ret[96] = accessability;
+		ret[ESiegeHex::GATE_OUTER] = ret[ESiegeHex::GATE_INNER] = accessability;
 	}
 
 	//tiles occupied by standing stacks
@@ -1172,14 +1172,19 @@ AccessibilityInfo CBattleInfoCallback::getAccesibility() const
 	//walls
 	if(battleGetSiegeLevel() > 0)
 	{
-		static const int permanentlyLocked[] = {12, 45, 78, 112, 147, 165};
+		static const int permanentlyLocked[] = {12, 45, 62, 112, 147, 165};
 		for(auto hex : permanentlyLocked)
 			ret[hex] = EAccessibility::UNAVAILABLE;
 
 		//TODO likely duplicated logic
-		static const std::pair<int, BattleHex> lockedIfNotDestroyed[] = //(which part of wall, which hex is blocked if this part of wall is not destroyed
-			{std::make_pair(2, BattleHex(182)), std::make_pair(3, BattleHex(130)),
-			std::make_pair(4, BattleHex(62)), std::make_pair(5, BattleHex(29))};
+		static const std::pair<int, BattleHex> lockedIfNotDestroyed[] =
+		{
+			//which part of wall, which hex is blocked if this part of wall is not destroyed
+			std::make_pair(2, BattleHex(ESiegeHex::DESTRUCTIBLE_WALL_4)),
+			std::make_pair(3, BattleHex(ESiegeHex::DESTRUCTIBLE_WALL_3)),
+			std::make_pair(4, BattleHex(ESiegeHex::DESTRUCTIBLE_WALL_2)),
+			std::make_pair(5, BattleHex(ESiegeHex::DESTRUCTIBLE_WALL_1))
+		};
 
 		for(auto & elem : lockedIfNotDestroyed)
 		{

+ 15 - 1
lib/GameConstants.h

@@ -510,7 +510,7 @@ namespace EWallState
 	};
 }
 
-enum class EDrawbridgeState
+enum class EDrawbridgeState : ui8
 {
 	NONE,
 	RAISED,
@@ -519,6 +519,20 @@ enum class EDrawbridgeState
 	LOWERED_BORKED //gate is destroyed
 };
 
+namespace ESiegeHex
+{
+	enum ESiegeHex : si16
+	{
+		DESTRUCTIBLE_WALL_1 = 29,
+		DESTRUCTIBLE_WALL_2 = 78,
+		DESTRUCTIBLE_WALL_3 = 130,
+		DESTRUCTIBLE_WALL_4 = 182,
+		GATE_BRIDGE = 94,
+		GATE_OUTER = 95,
+		GATE_INNER = 96
+	};
+}
+
 namespace ETileType
 {
 	enum ETileType

+ 2 - 1
lib/NetPacksLib.cpp

@@ -1210,7 +1210,8 @@ DLL_LINKAGE void BattleObstaclePlaced::applyGs( CGameState *gs )
 
 DLL_LINKAGE void BattleDrawbridgeStateChanged::applyGs(CGameState *gs)
 {
-	gs->curB->si.drawbridgeState = state;
+	if(gs->curB)
+		gs->curB->si.drawbridgeState = state;
 }
 
 void BattleResult::applyGs( CGameState *gs )

+ 17 - 17
server/CGameHandler.cpp

@@ -1050,11 +1050,11 @@ int CGameHandler::moveStack(int stack, BattleHex dest)
 
 	auto isGateDrawbridgeHex = [&](BattleHex hex) -> bool
 	{
-		if(gs->curB->town->subID == ETownType::FORTRESS && hex == BattleHex::GATE_BRIDGE)
+		if(gs->curB->town->subID == ETownType::FORTRESS && hex == ESiegeHex::GATE_BRIDGE)
 			return true;
-		if(hex == BattleHex::GATE_OUTER)
+		if(hex == ESiegeHex::GATE_OUTER)
 			return true;
-		if(hex == BattleHex::GATE_INNER)
+		if(hex == ESiegeHex::GATE_INNER)
 			return true;
 
 		return false;
@@ -1114,11 +1114,11 @@ int CGameHandler::moveStack(int stack, BattleHex dest)
 			{
 				auto needOpenGates = [&](BattleHex hex) -> bool
 				{
-					if(gs->curB->town->subID == ETownType::FORTRESS && hex == BattleHex::GATE_BRIDGE)
+					if(gs->curB->town->subID == ETownType::FORTRESS && hex == ESiegeHex::GATE_BRIDGE)
 						return true;
-					if(hex == BattleHex::GATE_BRIDGE && i-1 >= 0 && path.first[i-1] == BattleHex::GATE_OUTER)
+					if(hex == ESiegeHex::GATE_BRIDGE && i-1 >= 0 && path.first[i-1] == ESiegeHex::GATE_OUTER)
 						return true;
-					else if(hex == BattleHex::GATE_OUTER || hex == BattleHex::GATE_INNER)
+					else if(hex == ESiegeHex::GATE_OUTER || hex == ESiegeHex::GATE_INNER)
 						return true;
 
 					return false;
@@ -1146,24 +1146,24 @@ int CGameHandler::moveStack(int stack, BattleHex dest)
 
 				if(!gateMayCloseAtHex.isValid() && dbState != EDrawbridgeState::RAISED)
 				{
-					if(hex == BattleHex::GATE_INNER && i-1 >= 0 && path.first[i-1] != BattleHex::GATE_OUTER)
+					if(hex == ESiegeHex::GATE_INNER && i-1 >= 0 && path.first[i-1] != ESiegeHex::GATE_OUTER)
 					{
 						gateMayCloseAtHex = path.first[i-1];
 					}
 					if(gs->curB->town->subID == ETownType::FORTRESS)
 					{
-						if(hex == BattleHex::GATE_BRIDGE && i-1 >= 0 && path.first[i-1] != BattleHex::GATE_OUTER)
+						if(hex == ESiegeHex::GATE_BRIDGE && i-1 >= 0 && path.first[i-1] != ESiegeHex::GATE_OUTER)
 						{
 							gateMayCloseAtHex = path.first[i-1];
 						}
-						else if(hex == BattleHex::GATE_OUTER && i-1 >= 0 &&
-							path.first[i-1] != BattleHex::GATE_INNER &&
-							path.first[i-1] != BattleHex::GATE_BRIDGE)
+						else if(hex == ESiegeHex::GATE_OUTER && i-1 >= 0 &&
+							path.first[i-1] != ESiegeHex::GATE_INNER &&
+							path.first[i-1] != ESiegeHex::GATE_BRIDGE)
 						{
 							gateMayCloseAtHex = path.first[i-1];
 						}
 					}
-					else if(hex == BattleHex::GATE_OUTER && i-1 >= 0 && path.first[i-1] != BattleHex::GATE_INNER)
+					else if(hex == ESiegeHex::GATE_OUTER && i-1 >= 0 && path.first[i-1] != ESiegeHex::GATE_INNER)
 					{
 						gateMayCloseAtHex = path.first[i-1];
 					}
@@ -3608,21 +3608,21 @@ void CGameHandler::updateDrawbridgeState()
 	}
 	else if(db.state == EDrawbridgeState::LOWERED)
 	{
-		if(!gs->curB->battleGetStackByPos(BattleHex(BattleHex::GATE_OUTER), false) &&
-			!gs->curB->battleGetStackByPos(BattleHex(BattleHex::GATE_INNER), false))
+		if(!gs->curB->battleGetStackByPos(BattleHex(ESiegeHex::GATE_OUTER), false) &&
+			!gs->curB->battleGetStackByPos(BattleHex(ESiegeHex::GATE_INNER), false))
 		{
 			if(gs->curB->town->subID == ETownType::FORTRESS)
 			{
-				if(!gs->curB->battleGetStackByPos(BattleHex(BattleHex::GATE_BRIDGE), false))
+				if(!gs->curB->battleGetStackByPos(BattleHex(ESiegeHex::GATE_BRIDGE), false))
 					db.state = EDrawbridgeState::RAISED;
 			}
-			else if(gs->curB->battleGetStackByPos(BattleHex(BattleHex::GATE_BRIDGE)))
+			else if(gs->curB->battleGetStackByPos(BattleHex(ESiegeHex::GATE_BRIDGE)))
 				db.state = EDrawbridgeState::RAISED_BLOCKED;
 			else
 				db.state = EDrawbridgeState::RAISED;
 		}
 	}
-	else if(gs->curB->battleGetStackByPos(BattleHex(BattleHex::GATE_BRIDGE), false))
+	else if(gs->curB->battleGetStackByPos(BattleHex(ESiegeHex::GATE_BRIDGE), false))
 		db.state = EDrawbridgeState::RAISED_BLOCKED;
 	else
 		db.state = EDrawbridgeState::RAISED;