Code:
if (GC.getDefineINT("RANGED_ATTACKS_USE_MOVES") == 0)
{
setMadeAttack(true);
}
changeMoves(GC.getMOVE_DENOMINATOR());
iDamage = rangeCombatDamage(pDefender);
iUnitDamage = std::max(pDefender->getDamage(), std::min((pDefender->getDamage() + iDamage), airCombatLimit()));
szBuffer = gDLL->getText("TXT_KEY_MISC_YOU_ARE_ATTACKED_BY_AIR", pDefender->getNameKey(), getNameKey(), -(((iUnitDamage - pDefender->getDamage()) * 100) / pDefender->maxHitPoints()));
//red icon over attacking unit
gDLL->getInterfaceIFace()->addMessage(pDefender->getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_COMBAT", MESSAGE_TYPE_INFO, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), this->getX_INLINE(), this->getY_INLINE(), true, true);
//white icon over defending unit
gDLL->getInterfaceIFace()->addMessage(pDefender->getOwnerINLINE(), false, 0, L"", "AS2D_COMBAT", MESSAGE_TYPE_DISPLAY_ONLY, pDefender->getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_WHITE"), pDefender->getX_INLINE(), pDefender->getY_INLINE(), true, true);
szBuffer = gDLL->getText("TXT_KEY_MISC_YOU_ATTACK_BY_AIR", getNameKey(), pDefender->getNameKey(), -(((iUnitDamage - pDefender->getDamage()) * 100) / pDefender->maxHitPoints()));
gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), true, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_COMBAT", MESSAGE_TYPE_INFO, pDefender->getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), pPlot->getX_INLINE(), pPlot->getY_INLINE());
collateralCombat(pPlot, pDefender);
//set damage but don't update entity damage visibility
pDefender->setDamage(iUnitDamage, getOwnerINLINE(), false);
if (pPlot->isActiveVisible(false))
{
// Range strike entity mission
CvMissionDefinition kDefiniton;
kDefiniton.setMissionTime(GC.getMissionInfo(MISSION_RANGE_ATTACK).getTime() * gDLL->getSecsPerTurn());
kDefiniton.setMissionType(MISSION_RANGE_ATTACK);
kDefiniton.setPlot(pDefender->plot());
kDefiniton.setUnit(BATTLE_UNIT_ATTACKER, this);
kDefiniton.setUnit(BATTLE_UNIT_DEFENDER, pDefender);
gDLL->getEntityIFace()->AddMission(&kDefiniton);
//delay death
/************************************************************************************************/
/* UNOFFICIAL_PATCH 05/10/10 jdog5000 */
/* */
/* Bugfix */
/************************************************************************************************/
/* original bts code
pDefender->getGroup()->setMissionTimer(GC.getMissionInfo(MISSION_RANGE_ATTACK).getTime());
*/
// mission timer is not used like this in any other part of code, so it might cause OOS
// issues ... at worst I think unit dies before animation is complete, so no real
// harm in commenting it out.
/************************************************************************************************/
/* UNOFFICIAL_PATCH END */
/************************************************************************************************/
}
//Kathy Artillerieduell start
CvPlot* pAttackerPlot;
int iXAttackerPlot;
int iYAttackerPlot;
pAttackerPlot = this->plot();
iXAttackerPlot = pAttackerPlot->getX();
iYAttackerPlot = pAttackerPlot->getY();
if (pPlot->isWater())
{
if (pDefender->canRangeDefenseAt(pPlot,iXAttackerPlot,iYAttackerPlot))//Tauschen von Defender- und Targetplot
{
int iBreitseiteDamage;
int iBreitseiteUnitDamage;
iBreitseiteDamage = pDefender->rangeCombatDamage(this);
iBreitseiteUnitDamage = std::max(this->getDamage(), std::min((this->getDamage() + iBreitseiteDamage), 100));
szBuffer = gDLL->getText("TXT_KEY_MISC_YOU_ARE_ATTACKED_BY_BREITSEITE", getNameKey(), pDefender->getNameKey(), -(((iBreitseiteUnitDamage - this->getDamage()) * 100) / this->maxHitPoints()));
//red icon over attacking unit
gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_COMBAT", MESSAGE_TYPE_INFO, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), this->getX_INLINE(), this->getY_INLINE(), true, true);
//white icon over defending unit
gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, 0, L"", "AS2D_COMBAT", MESSAGE_TYPE_DISPLAY_ONLY, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_WHITE"), getX_INLINE(), getY_INLINE(), true, true);
szBuffer = gDLL->getText("TXT_KEY_MISC_YOU_ATTACK_BY_BREITSEITE", pDefender->getNameKey(), getNameKey(), -(((iBreitseiteUnitDamage - getDamage()) * 100) / maxHitPoints()));
gDLL->getInterfaceIFace()->addMessage(pDefender->getOwnerINLINE(), true, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_COMBAT", MESSAGE_TYPE_INFO, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), pPlot->getX_INLINE(), pPlot->getY_INLINE());
//set damage but don't update entity damage visibility
setDamage(iBreitseiteUnitDamage, getOwnerINLINE(), false);
if (pPlot->isActiveVisible(false))
{
// Range strike entity mission
CvMissionDefinition kDefiniton;
kDefiniton.setMissionTime(GC.getMissionInfo(MISSION_RANGE_ATTACK).getTime() * gDLL->getSecsPerTurn());
kDefiniton.setMissionType(MISSION_RANGE_ATTACK);
kDefiniton.setPlot(plot());
kDefiniton.setUnit(BATTLE_UNIT_ATTACKER, pDefender);
kDefiniton.setUnit(BATTLE_UNIT_DEFENDER, this);
gDLL->getEntityIFace()->AddMission(&kDefiniton);
}
if (this->isDead())
{
szBuffer = gDLL->getText("TXT_KEY_MISC_YOU_DIED_BY_BREITSEITE", getNameKey(), pDefender->getNameKey(), -(((iBreitseiteUnitDamage - this->getDamage()) * 100) / this->maxHitPoints()));
//red icon over attacking unit
gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_COMBAT", MESSAGE_TYPE_INFO, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), this->getX_INLINE(), this->getY_INLINE(), true, true);
//white icon over defending unit
gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, 0, L"", "AS2D_COMBAT", MESSAGE_TYPE_DISPLAY_ONLY, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_WHITE"), getX_INLINE(), getY_INLINE(), true, true);
bool bInOwnBorders;
bInOwnBorders = false;
if ( pAttackerPlot->getOwner()== pDefender->getOwner() )
{
bInOwnBorders = true;
}
pDefender->changeExperience(1,1,true,bInOwnBorders,true);
}
}
}
else//Artillerieduell Land beginn
{
CvUnit* pBestDefender;
pBestDefender = pPlot->getBestArtillerieDefender(NO_PLAYER, getOwnerINLINE(), this, true,true,false,pAttackerPlot);
if (pBestDefender != NULL)
{
if (getDomainType() == DOMAIN_SEA)//Beginn Land-See-Duell
{
int iBreitseiteDamage;
int iBreitseiteUnitDamage;
iBreitseiteDamage = pBestDefender->rangeCombatDamage(this);
iBreitseiteUnitDamage = std::max(this->getDamage(), std::min((this->getDamage() + iBreitseiteDamage), 100));
szBuffer = gDLL->getText("TXT_KEY_MISC_YOU_ARE_ATTACKED_BY_COASTAL_DEFENSE", getNameKey(), pBestDefender->getNameKey(), -(((iBreitseiteUnitDamage - this->getDamage()) * 100) / this->maxHitPoints()));
//red icon over attacking unit
gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_COMBAT", MESSAGE_TYPE_INFO, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), this->getX_INLINE(), this->getY_INLINE(), true, true);
//white icon over defending unit
gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, 0, L"", "AS2D_COMBAT", MESSAGE_TYPE_DISPLAY_ONLY, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_WHITE"), getX_INLINE(), getY_INLINE(), true, true);
szBuffer = gDLL->getText("TXT_KEY_MISC_YOU_ATTACK_BY_COASTAL_DEFENSE", pBestDefender->getNameKey(), getNameKey(), -(((iBreitseiteUnitDamage - getDamage()) * 100) / maxHitPoints()));
gDLL->getInterfaceIFace()->addMessage(pDefender->getOwnerINLINE(), true, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_COMBAT", MESSAGE_TYPE_INFO, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), pPlot->getX_INLINE(), pPlot->getY_INLINE());
//set damage but don't update entity damage visibility
setDamage(iBreitseiteUnitDamage, getOwnerINLINE(), false);
if (pPlot->isActiveVisible(false))
{
// Range strike entity mission
CvMissionDefinition kDefiniton;
kDefiniton.setMissionTime(GC.getMissionInfo(MISSION_RANGE_ATTACK).getTime() * gDLL->getSecsPerTurn());
kDefiniton.setMissionType(MISSION_RANGE_ATTACK);
kDefiniton.setPlot(plot());
kDefiniton.setUnit(BATTLE_UNIT_ATTACKER, pBestDefender);
kDefiniton.setUnit(BATTLE_UNIT_DEFENDER, this);
gDLL->getEntityIFace()->AddMission(&kDefiniton);
}
if (this->isDead())
{
szBuffer = gDLL->getText("TXT_KEY_MISC_YOU_DIED_BY_COASTAL_DEFENSE", getNameKey(), pBestDefender->getNameKey(), -(((iBreitseiteUnitDamage - this->getDamage()) * 100) / this->maxHitPoints()));
//red icon over attacking unit
gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_COMBAT", MESSAGE_TYPE_INFO, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), this->getX_INLINE(), this->getY_INLINE(), true, true);
//white icon over defending unit
gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, 0, L"", "AS2D_COMBAT", MESSAGE_TYPE_DISPLAY_ONLY, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_WHITE"), getX_INLINE(), getY_INLINE(), true, true);
bool bInOwnBorders;
bInOwnBorders = false;
if ( pAttackerPlot->getOwner()== pBestDefender->getOwner() )
{
bInOwnBorders = true;
}
pBestDefender->changeExperience(1,1,true,bInOwnBorders,true);
}
}
else
{
CvBattleDefinition kBattle;
kBattle.setUnit(BATTLE_UNIT_ATTACKER, this);
kBattle.setUnit(BATTLE_UNIT_DEFENDER, pBestDefender);
kBattle.setDamage(BATTLE_UNIT_ATTACKER, BATTLE_TIME_BEGIN, getDamage());
kBattle.setDamage(BATTLE_UNIT_DEFENDER, BATTLE_TIME_BEGIN, pBestDefender->getDamage());
resolveArtilleryCombat(pBestDefender,pBestDefender->plot(),kBattle);
//Texte und Kampfanimationen fehlen
}//Artillerieduell Land End
}
}
//Kathy Artillerieduell end
return true;
}
Da das Problem immer dann auftritt, wenn zurückgeschossen wird, vermute ich, dass es an "canRangeDefenseAt" liegen könnte: