仅为特定条件重置变量的值,并为其他所有条件重置固定值



我正在为游戏进行更新。

在游戏中,有不同数量武器的单位。如:Baneblade超重型坦克(Baneblade Cannoon,Demolisher Cannon和Heavy Bolter(。
有些武器具有特殊的武器特性,而另一些则没有。属性为零的武器显示为"(不为空,仅为空格(。
在我的例子中,Baneblade Cannon是"",Demolisher Cannon是"Siege",Heavy Bolter是""
我想做的是:如果武器具有"Siege"特性,敌人的掩护将被忽略,它会0

我可以这样做:

for (int w = 0; w < 4; w++)
{
... // some other codes
int nDefCover = g_arrTerrainTypes[m_arrUnitEx[nDef].nTerrain].nCover; //     to reset nCover
const auto& traits = m_arrUnitEx[nAtt].unit.pType->arrWeapons[w]->strTraits;
// I check if a number w weapon has "Siege" string
if (traits.Find("Siege") != std::string::npos) 
{
// nCover gives the value of enemy's cover.
g_arrTerrainTypes[m_arrUnitEx[nDef].nTerrain].nCover = 0;
}
... // some other weapon trait codes
if (traits.Find("") != std::string::npos)
{
g_arrTerrainTypes[m_arrUnitEx[nDef].nTerrain].nCover = nDefCover;
}
}

在此之后,我必须重置nCover值,否则从现在开始,所有武器都将忽略敌人的掩护加成。我只想攻城武器忽略掩护。
因此,我使用g_arrTerrainTypes[m_arrUnitEx[nDef].nTerrain].nCover = nDefCover;nCover重置为其他武器的实际价值。

但是系统是这样工作的:
它看起来是第一个 武器.它是""的,所以它会nCover更改为其原始值。
它看第二把武器,它是"Siege",所以它nCover改为0
它看第三种武器,它是"",所以它会改变nCover到原来的值。
最后,nCover返回其原始值,Siege武器特性毫无意义。这就像001的情况。
如果一个单位的最后一个武器槽中有Siege武器,则此代码可以工作,但武器顺序会随着每个单位而变化。
如何将Siege武器的nCover更改为0,但对于其他所有情况,在不更改武器nCover的情况下更改为其原始值Siege?我应该用一个循环来做到这一点,但找不到放在哪里以及我应该使用哪个循环。

我的意思是你应该计算每种武器的伤害,而不是之后, 所以你应该有这样的东西:

for (auto& weapon : m_arrUnitEx[nAtt].unit.pType->arrWeapons)
{
// if (distance(nAtt, nDef) > weapon.range) continue;
dealDamage(weapon, nDef);
}

跟:

void dealDamage(Weapon& weapon, int nDef)
{
const auto& traits = weapon.strTraits;
int nDefCover = g_arrTerrainTypes[m_arrUnitEx[nDef].nTerrain].nCover;
if (traits.Find("Siege") != std::string::npos) 
{
nDefCover = 0;
}
m_arrUnitEx[nDef].hitPoints -= computeDamage(weapon, nDefCover);
--weapon.ammo;
}

我以一种我无法想象的奇怪方式解决了这个问题......
首先,我从代码顶部和 ifs 中删除了 nDefCover 定义。
然后我在上面的const auto& traits写了一个定义:nFinalAccuracy = max(0, min(100, nFinalAccuracy));

之后,我将nDefCover的值添加到nFinalAccuracySiege和其他必要武器的价值中。
最终代码是:

for (int w = 0; w < 4; w++)
{
nFinalAccuracy = max(0, min(100, nFinalAccuracy));
const auto& traits = m_arrUnitEx[nAtt].unit.pType->arrWeapons[w]->strTraits;
if (traits.Find("Siege") != std::string::npos)
{
nFinalAccuracy = max(0, min(100, (nFinalAccuracy + nDefCover)));
}  
if (traits.Find("Siege") != std::string::npos && traits.Find("Titankiller") != std::string::npos)
{
nFinalAccuracy = 100;
}
if (traits.Find("Siege") != std::string::npos && traits.Find("Terror") != std::string::npos)
{
nFinalAccuracy = max(0, min(100, (nFinalAccuracy + nDefCover)));
}
if (m_arrUnitEx[nDef].unit.pType->nUnitClass == UC_AIRCRAFT && traits.Find("AA") != std::string::npos)
{
nFinalAccuracy = 100;
}
if (traits.Find("Terror") != std::string::npos)
{   
m_arrUnitEx[nDef].unit.nMorale.actual = m_arrUnitEx[nDef].unit.nMorale.actual - 10;
}
}

我认为它的工作原理是;武器开火,计算敌人和玩家单位的主动权,对双方施加伤害并继续下一个武器,在检查其他武器的特性之前,它会将nFinalAccuracy重置为原始值。
到目前为止,代码似乎适用于任何武器。

最新更新