mirror of
https://github.com/vcmi/vcmi.git
synced 2025-09-16 09:26:28 +02:00
cleared up rendering of tower shooters
This commit is contained in:
@@ -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)
|
||||
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)
|
||||
{
|
||||
owner->stacksController->showStack(canvas, turret);
|
||||
showWallPiece(canvas, wallPiece, owner->pos.topLeft());
|
||||
owner->stacksController->showStack(canvas, getTurretStack(wallPiece));
|
||||
}
|
||||
showWallPiece(canvas, wallPiece, owner->pos.topLeft());
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user