Hooks
static bool BeforeCvPlayer_doGoody(CvPlayer* self, CvPlot* pPlot, CvUnit* pUnit);static void AfterCvPlayer_doGoody(CvPlayer* self, CvPlot* pPlot, CvUnit* pUnit);static void ReplaceCvPlayer_doGoody(void (*original)(CvPlayer*, CvPlot*, CvUnit*), CvPlayer* self, CvPlot* pPlot, CvUnit* pUnit);CivRegisterBefore<CivHooks::CvPlayer_doGoody>(host, &BeforeCvPlayer_doGoody);CivRegisterAfter<CivHooks::CvPlayer_doGoody>(host, &AfterCvPlayer_doGoody);CivRegisterReplace<CivHooks::CvPlayer_doGoody>(host, &ReplaceCvPlayer_doGoody);
Code
7333void CvPlayer::doGoody(CvPlot* pPlot, CvUnit* pUnit)7334{7335 CvHandicapInfo& playerHandicapInfo = getHandicapInfo();73367337 GoodyTypes eGoody;73387339 CvAssertMsg(pPlot->isGoody(), "pPlot->isGoody is expected to be true");73407341 if(!isBarbarian())7342 {7343 m_bEverPoppedGoody = true;7344 pPlot->removeGoody();73457346 // Minors don't get Goodies :(7347 if(isMinorCiv())7348 {7349 return;7350 }73517352 // Need to have Goodies in the Handicap file to pick from7353 if(playerHandicapInfo.getNumGoodies() > 0)7354 {7355 // Make a list of valid Goodies to pick randomly from7356 int iValidGoodiesLoop;7357 bool bValid;73587359 std::vector<GoodyTypes> avValidGoodies;7360 for(int iGoodyLoop = 0; iGoodyLoop < playerHandicapInfo.getNumGoodies(); iGoodyLoop++)7361 {7362 eGoody = (GoodyTypes) playerHandicapInfo.getGoodies(iGoodyLoop);7363 bValid = false;73647365 // Check to see if we've already verified this Goody is valid (since there can be multiples in the vector)7366 for(iValidGoodiesLoop = 0; iValidGoodiesLoop < (int) avValidGoodies.size(); iValidGoodiesLoop++)7367 {7368 if(avValidGoodies[iValidGoodiesLoop] == eGoody)7369 {7370 avValidGoodies.push_back(eGoody);7371 bValid = true;7372 break;7373 }7374 }73757376 if(bValid)7377 continue;73787379 if(canReceiveGoody(pPlot, eGoody, pUnit))7380 {7381 avValidGoodies.push_back(eGoody);7382 }7383 }73847385#if defined(MOD_GLOBAL_ANYTIME_GOODY_GOLD)7386 // Any valid Goodies? If not, add back the gold goody hut(s)7387 if(MOD_GLOBAL_ANYTIME_GOODY_GOLD && avValidGoodies.size() == 0)7388 {7389 for(int iGoodyLoop = 0; iGoodyLoop < playerHandicapInfo.getNumGoodies(); iGoodyLoop++)7390 {7391 eGoody = (GoodyTypes) playerHandicapInfo.getGoodies(iGoodyLoop);73927393 Database::SingleResult kResult;7394 const bool bResult = DB.SelectAt(kResult, "GoodyHuts", eGoody);7395 DEBUG_VARIABLE(bResult);7396 CvAssertMsg(bResult, "Cannot find goody info.");73977398 CvGoodyInfo kGoodyInfo;7399 kGoodyInfo.CacheResult(kResult);74007401 if (kGoodyInfo.getGold() > 0)7402 {7403 avValidGoodies.push_back(eGoody);7404 }7405 }7406 }7407#endif74087409 // Any valid Goodies?7410 if(avValidGoodies.size() > 0)7411 {7412#if defined(MOD_BUGFIX_MINOR)7413 // Fix the bug where the AI won't get anything for Goody Hut pickers!!!7414 if (pUnit && pUnit->isHasPromotion((PromotionTypes)GC.getPROMOTION_GOODY_HUT_PICKER()) && GC.getGame().getActivePlayer() == GetID())7415 {7416#else7417 if (pUnit && pUnit->isHasPromotion((PromotionTypes)GC.getPROMOTION_GOODY_HUT_PICKER()))7418 {7419 if(GC.getGame().getActivePlayer() == GetID())7420#endif7421 {7422 CvPopupInfo kPopupInfo(BUTTONPOPUP_CHOOSE_GOODY_HUT_REWARD, GetID(), pUnit->GetID());7423 GC.GetEngineUserInterface()->AddPopup(kPopupInfo);7424 // We are adding a popup that the player must make a choice in, make sure they are not in the end-turn phase.7425 CancelActivePlayerEndTurn();7426 }7427 }7428 else7429 {7430 int iRand = GC.getGame().getJonRandNum(avValidGoodies.size(), "Picking a Goody result");7431 eGoody = (GoodyTypes) avValidGoodies[iRand];7432 receiveGoody(pPlot, eGoody, pUnit);7433 }7434 7435#if !defined(NO_ACHIEVEMENTS)7436 if (pUnit && isHuman() && !GC.getGame().isGameMultiPlayer())7437 {7438 pUnit->ChangeNumGoodyHutsPopped(pUnit->GetNumGoodyHutsPopped() + 1);7439 if (pUnit->isHasPromotion((PromotionTypes)GC.getPROMOTION_GOODY_HUT_PICKER()) && pUnit->GetNumGoodyHutsPopped() >= 5)7440 {7441 gDLL->UnlockAchievement(ACHIEVEMENT_XP2_25);7442 }7443 }7444#endif7445 }74467447 pPlot->AddArchaeologicalRecord(CvTypes::getARTIFACT_ANCIENT_RUIN(), m_eID, NO_PLAYER);7448 }7449 }7450}