1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-06 09:09:40 +02:00

Battles: implement basic drawbridge mechanics

Movement to blocking hex 94 not yet properly handled as stack movement code need to be rewritten first.
Also gate destruction not immidiately affect drawbridge state.
This commit is contained in:
Arseniy Shestakov
2016-01-29 22:43:35 +03:00
parent 1e008b9756
commit 57328bdc83
4 changed files with 59 additions and 2 deletions

View File

@@ -442,6 +442,15 @@ si8 CBattleInfoEssentials::battleGetWallState(int partOfWall) const
return getBattle()->si.wallState[partOfWall]; return getBattle()->si.wallState[partOfWall];
} }
EDrawbridgeState CBattleInfoEssentials::battleGetDrawbridgeState() const
{
RETURN_IF_NOT_BATTLE(EDrawbridgeState::NONE);
if(getBattle()->town == nullptr || getBattle()->town->fortLevel() == CGTownInstance::NONE)
return EDrawbridgeState::NONE;
return getBattle()->si.drawbridgeState;
}
si8 CBattleInfoCallback::battleHasWallPenalty( const CStack * stack, BattleHex destHex ) const si8 CBattleInfoCallback::battleHasWallPenalty( const CStack * stack, BattleHex destHex ) const
{ {
return battleHasWallPenalty(stack, stack->position, destHex); return battleHasWallPenalty(stack, stack->position, destHex);
@@ -1129,9 +1138,20 @@ AccessibilityInfo CBattleInfoCallback::getAccesibility() const
} }
//gate -> should be before stacks //gate -> should be before stacks
if(battleGetSiegeLevel() > 0 && battleGetWallState(EWallPart::GATE) != EWallState::DESTROYED) if(battleGetSiegeLevel() > 0)
{ {
ret[95] = ret[96] = EAccessibility::GATE; //block gate's hexes EAccessibility::EAccessibility accessability = EAccessibility::ACCESSIBLE;
switch(battleGetDrawbridgeState())
{
case EDrawbridgeState::RAISED:
accessability = EAccessibility::GATE;
break;
case EDrawbridgeState::RAISED_BLOCKED:
accessability = EAccessibility::UNAVAILABLE;
break;
}
ret[95] = ret[96] = accessability;
} }
//tiles occupied by standing stacks //tiles occupied by standing stacks

View File

@@ -199,6 +199,7 @@ public:
// for determining state of a part of the wall; format: parameter [0] - keep, [1] - bottom tower, [2] - bottom wall, // for determining state of a part of the wall; format: parameter [0] - keep, [1] - bottom tower, [2] - bottom wall,
// [3] - below gate, [4] - over gate, [5] - upper wall, [6] - uppert tower, [7] - gate; returned value: 1 - intact, 2 - damaged, 3 - destroyed; 0 - no battle // [3] - below gate, [4] - over gate, [5] - upper wall, [6] - uppert tower, [7] - gate; returned value: 1 - intact, 2 - damaged, 3 - destroyed; 0 - no battle
si8 battleGetWallState(int partOfWall) const; si8 battleGetWallState(int partOfWall) const;
EDrawbridgeState battleGetDrawbridgeState() const;
//helpers //helpers
///returns all stacks, alive or dead or undead or mechanical :) ///returns all stacks, alive or dead or undead or mechanical :)

View File

@@ -1148,6 +1148,7 @@ int CGameHandler::moveStack(int stack, BattleHex dest)
handleDamageFromObstacle(*theLastObstacle, curStack); handleDamageFromObstacle(*theLastObstacle, curStack);
} }
} }
updateDrawbridgeState();
return ret; return ret;
} }
@@ -3449,6 +3450,40 @@ bool CGameHandler::queryReply(QueryID qid, ui32 answer, PlayerColor player)
static EndAction end_action; static EndAction end_action;
void CGameHandler::updateDrawbridgeState()
{
BattleDrawbridgeStateChanged db;
db.state = gs->curB->si.drawbridgeState;
if(gs->curB->si.wallState[EWallPart::GATE] == EWallState::DESTROYED)
{
db.state = EDrawbridgeState::LOWERED_BORKED;
}
else if(db.state == EDrawbridgeState::LOWERED)
{
if(gs->curB->battleGetStackByPos(BattleHex(94), false) ||
gs->curB->battleGetStackByPos(BattleHex(95), false) ||
gs->curB->battleGetStackByPos(BattleHex(96), false))
{
db.state = EDrawbridgeState::LOWERED;
}
else
db.state = EDrawbridgeState::RAISED;
}
else if(db.state == EDrawbridgeState::RAISED || db.state == EDrawbridgeState::RAISED_BLOCKED)
{
if(gs->curB->battleGetStackByPos(BattleHex(94), false))
db.state = EDrawbridgeState::RAISED_BLOCKED;
else if(gs->curB->battleGetStackByPos(BattleHex(95), false) ||
gs->curB->battleGetStackByPos(BattleHex(96), false))
{
db.state = EDrawbridgeState::LOWERED;
}
else
db.state = EDrawbridgeState::RAISED;
}
sendAndApply(&db);
}
bool CGameHandler::makeBattleAction( BattleAction &ba ) bool CGameHandler::makeBattleAction( BattleAction &ba )
{ {
bool ok = true; bool ok = true;

View File

@@ -200,6 +200,7 @@ public:
PlayerColor getPlayerAt(CConnection *c) const; PlayerColor getPlayerAt(CConnection *c) const;
void playerMessage( PlayerColor player, const std::string &message, ObjectInstanceID currObj); void playerMessage( PlayerColor player, const std::string &message, ObjectInstanceID currObj);
void updateDrawbridgeState();
bool makeBattleAction(BattleAction &ba); bool makeBattleAction(BattleAction &ba);
bool makeAutomaticAction(const CStack *stack, BattleAction &ba); //used when action is taken by stack without volition of player (eg. unguided catapult attack) bool makeAutomaticAction(const CStack *stack, BattleAction &ba); //used when action is taken by stack without volition of player (eg. unguided catapult attack)
bool makeCustomAction(BattleAction &ba); bool makeCustomAction(BattleAction &ba);