1
0
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:
Ivan Savenko
2022-11-30 22:05:25 +02:00
parent 6d4bcba842
commit 92ca0d9877
3 changed files with 54 additions and 62 deletions

View File

@@ -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());
}
}

View File

@@ -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);

View File

@@ -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