Hooks
static bool BeforeCvPlayerTraits_ConvertBarbarianCamp(CvPlayerTraits* self, CvUnit* pByUnit, CvPlot* pPlot, bool& result);static void AfterCvPlayerTraits_ConvertBarbarianCamp(CvPlayerTraits* self, CvUnit* pByUnit, CvPlot* pPlot, bool& result);static bool ReplaceCvPlayerTraits_ConvertBarbarianCamp(bool (*original)(CvPlayerTraits*, CvUnit*, CvPlot*), CvPlayerTraits* self, CvUnit* pByUnit, CvPlot* pPlot);CivRegisterBefore<CivHooks::CvPlayerTraits_ConvertBarbarianCamp>(host, &BeforeCvPlayerTraits_ConvertBarbarianCamp);CivRegisterAfter<CivHooks::CvPlayerTraits_ConvertBarbarianCamp>(host, &AfterCvPlayerTraits_ConvertBarbarianCamp);CivRegisterReplace<CivHooks::CvPlayerTraits_ConvertBarbarianCamp>(host, &ReplaceCvPlayerTraits_ConvertBarbarianCamp);
Code
4237/// Is there an adjacent barbarian camp that could be converted?4238#if defined(MOD_EVENTS_UNIT_CAPTURE)4239bool CvPlayerTraits::ConvertBarbarianCamp(CvUnit* pByUnit, CvPlot* pPlot)4240#else4241bool CvPlayerTraits::ConvertBarbarianCamp(CvPlot* pPlot)4242#endif4243{4244 UnitHandle pGiftUnit;42454246 // Has this camp already decided not to convert?4247 if(pPlot->IsBarbarianCampNotConverting())4248 {4249 return false;4250 }42514252 // Roll die to see if it converts4253 if(GC.getGame().getJonRandNum(100, "Barbarian Camp Conversion") < m_iLandBarbarianConversionPercent)4254 {4255 pPlot->setImprovementType(NO_IMPROVEMENT);42564257 int iNumGold = /*25*/ GC.getGOLD_FROM_BARBARIAN_CONVERSION();4258 m_pPlayer->GetTreasury()->ChangeGold(iNumGold);42594260 // Set who last cleared the camp here4261 pPlot->SetPlayerThatClearedBarbCampHere(m_pPlayer->GetID());42624263 // Convert the barbarian into our unit4264 FAssertMsg(m_eCampGuardType < GC.getNumUnitInfos(), "Illegal camp guard unit type");4265 pGiftUnit = m_pPlayer->initUnit(m_eCampGuardType, pPlot->getX(), pPlot->getY(), NO_UNITAI, NO_DIRECTION, true /*bNoMove*/);4266 if (!pGiftUnit->jumpToNearestValidPlot())4267 pGiftUnit->kill(false);4268 else4269#if defined(MOD_EVENTS_UNIT_CAPTURE)4270 {4271 if (MOD_EVENTS_UNIT_CAPTURE) {4272 GAMEEVENTINVOKE_HOOK(GAMEEVENT_UnitCaptured, m_pPlayer->GetID(), pByUnit->GetID(), m_pPlayer->GetID(), pGiftUnit->GetID(), false, 2);4273 }4274#endif4275 pGiftUnit->finishMoves();4276#if defined(MOD_EVENTS_UNIT_CAPTURE)4277 }4278#endif42794280 // Convert any extra units4281 for(int iI = 0; iI < m_iLandBarbarianConversionExtraUnits; iI++)4282 {4283 pGiftUnit = m_pPlayer->initUnit(m_eCampGuardType, pPlot->getX(), pPlot->getY(), NO_UNITAI, NO_DIRECTION, true /*bNoMove*/);4284 if (!pGiftUnit->jumpToNearestValidPlot())4285 pGiftUnit->kill(false);4286 else4287#if defined(MOD_EVENTS_UNIT_CAPTURE)4288 {4289 if (MOD_EVENTS_UNIT_CAPTURE) {4290 GAMEEVENTINVOKE_HOOK(GAMEEVENT_UnitCaptured, m_pPlayer->GetID(), pByUnit->GetID(), m_pPlayer->GetID(), pGiftUnit->GetID(), false, 2);4291 }4292#endif4293 pGiftUnit->finishMoves();4294#if defined(MOD_EVENTS_UNIT_CAPTURE)4295 }4296#endif4297 }42984299 if(GC.getLogging() && GC.getAILogging())4300 {4301 CvString logMsg;4302 logMsg.Format("Converted barbarian camp, X: %d, Y: %d", pPlot->getX(), pPlot->getY());4303 m_pPlayer->GetHomelandAI()->LogHomelandMessage(logMsg);4304 }43054306 CvString strBuffer = GetLocalizedText("TXT_KEY_NOTIFICATION_BARB_CAMP_CONVERTS");4307 CvString strSummary = GetLocalizedText("TXT_KEY_NOTIFICATION_SUMMARY_BARB_CAMP_CONVERTS");4308 m_pPlayer->GetNotifications()->Add(NOTIFICATION_GENERIC, strBuffer, strSummary, pPlot->getX(), pPlot->getY(), -1);4309#if !defined(NO_ACHIEVEMENTS)4310 //Increase Stat4311 if(m_pPlayer->isHuman() &&!GC.getGame().isGameMultiPlayer())4312 {4313 gDLL->IncrementSteamStatAndUnlock(ESTEAMSTAT_BARBSCONVERTED, 10, ACHIEVEMENT_SPECIAL_BARBARIANWARLORD);4314 }4315#endif4316 }43174318 // Decided not to4319 else4320 {4321 pPlot->SetBarbarianCampNotConverting(true);4322 return false;4323 }43244325 return true;4326}