Bazaar developer reference

CvPlayer::doGoody(CvPlot *, CvUnit *)

Defined in
CvPlayer.cpp, line 7333
Class
CvPlayer
Hook name
CivHooks::CvPlayer_doGoody

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}

Calls

Called by