bool CvUnit::canBribeBarbarian(const CvPlot* pPlot, bool bTestVisible) const
{
CvUnit* pLoopUnit;
if (!m_pUnitInfo->isBribeBarbarian())
{
return false;
}
if (isBarbarian())
{
return false;
}
// Can't buy units if they are not in a legal plot
CLLNode<IDInfo>* pUnitNode = pPlot->headUnitNode();
while (pUnitNode != NULL)
{
pLoopUnit = ::getUnit(pUnitNode->m_data);
pUnitNode = pPlot->nextUnitNode(pUnitNode);
if (NULL != pLoopUnit)
{
if (pLoopUnit->isBarbarian())
{
if (pLoopUnit->getTeam() != getTeam())
{
return true;
}
}
}
}
return false;
}
bool CvUnit::BribeBarbarian()
{
FAssertMsg(pUnit != NULL, "City is not assigned a valid value");
int iPass;
CvPlot* pPlot = plot();
if (!canBribeBarbarian(pPlot))
{
return false;
}
for (iPass = 0; iPass < 2; iPass++)
{
CLLNode<IDInfo>* pUnitNode = pPlot->headUnitNode();
CvUnit* pLoopUnit;
while (pUnitNode != NULL)
{
pLoopUnit = ::getUnit(pUnitNode->m_data);
pUnitNode = pPlot->nextUnitNode(pUnitNode);
if (pLoopUnit->isBarbarian())
{
if (iPass == 0)
{
CvWString szBuffer;
pLoopUnit->kill(true);
szBuffer = gDLL->getText("TXT_KEY_MISC_BRIBE_BARBARIAN", pLoopUnit->getNameKey());
gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), true, GC.getEVENT_MESSAGE_TIME(), szBuffer, GC.getEraInfo(GC.getGameINLINE().getCurrentEra()).getAudioUnitVictoryScript(), MESSAGE_TYPE_INFO, NULL, (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), pPlot->getX_INLINE(), pPlot->getY_INLINE());
}
}
}
}
if (pPlot->isActiveVisible(false))
{
// Bribe Barbarian entity mission
CvMissionDefinition kDefiniton;
kDefiniton.setMissionTime(GC.getMissionInfo(MISSION_BRIBE_BARBARIAN).getTime() * gDLL->getSecsPerTurn());
kDefiniton.setMissionType(MISSION_BRIBE_BARBARIAN);
kDefiniton.setPlot(pPlot);
kDefiniton.setUnit(BATTLE_UNIT_ATTACKER, this);
kDefiniton.setUnit(BATTLE_UNIT_DEFENDER, NULL);
gDLL->getEntityIFace()->AddMission(&kDefiniton);
}
kill(true);
return true;
}