Bazaar developer reference

CvMinorCivQuest::IsComplete()

Defined in
CvMinorCivAI.cpp, line 478
Class
CvMinorCivQuest
Hook name
CivHooks::CvMinorCivQuest_IsComplete
Lua events
GameEvents.QuestIsCompleted

Hooks

static bool BeforeCvMinorCivQuest_IsComplete(CvMinorCivQuest* self, bool& result);static void AfterCvMinorCivQuest_IsComplete(CvMinorCivQuest* self, bool& result);static bool ReplaceCvMinorCivQuest_IsComplete(bool (*original)(CvMinorCivQuest*), CvMinorCivQuest* self);CivRegisterBefore<CivHooks::CvMinorCivQuest_IsComplete>(host, &BeforeCvMinorCivQuest_IsComplete);CivRegisterAfter<CivHooks::CvMinorCivQuest_IsComplete>(host, &AfterCvMinorCivQuest_IsComplete);CivRegisterReplace<CivHooks::CvMinorCivQuest_IsComplete>(host, &ReplaceCvMinorCivQuest_IsComplete);

Code

477// Checks if the conditions for completing the quest are met.  Does not actually complete the quest.478bool CvMinorCivQuest::IsComplete()479{480	CvPlayer* pMinor = &GET_PLAYER(m_eMinor);481	CvPlayer* pAssignedPlayer = &GET_PLAYER(m_eAssignedPlayer);482483	if(!pMinor)484	{485		CvAssertMsg(false, "Minor player not found! Please send Anton your save file and version.");486		return false;487	}488	if(!pAssignedPlayer)489	{490		CvAssertMsg(false, "Assigned player not found! Please send Anton your save file and version.");491		return false;492	}493494#if defined(MOD_EVENTS_QUESTS)495    if (UseEvents() && !IsInternal()) {496        // Always for non-contests, only at the end for contests497        if (!m_pQuestInfo->isContest() || GetEndTurn() == GC.getGame().getGameTurn()) {498            if (GAMEEVENTINVOKE_TESTANY(GAMEEVENT_QuestIsCompleted, m_eAssignedPlayer, m_eMinor, m_eType, (GetEndTurn() == GC.getGame().getGameTurn())) == GAMEEVENTRETURN_TRUE) {499                return true;500            }501        }502        503        return false;504    } else {505#endif506	if(m_eType == MINOR_CIV_QUEST_ROUTE)507	{508		if (pAssignedPlayer->IsCapitalConnectedToPlayer(m_eMinor))509		{510			return true;511		}512	}513	else if(m_eType == MINOR_CIV_QUEST_KILL_CAMP)514	{515		int iX = m_iData1;516		int iY = m_iData2;517		CvPlot* pPlot = GC.getMap().plot(iX, iY);518519		if(pPlot)520		{521			// No longer a camp here?522			if(pPlot->getImprovementType() != GC.getBARBARIAN_CAMP_IMPROVEMENT())523			{524				// Did this guy clear it?525				if(pPlot->GetPlayerThatClearedBarbCampHere() == m_eAssignedPlayer)526				{527					return true;528				}529			}530		}531	}532	else if(m_eType == MINOR_CIV_QUEST_CONNECT_RESOURCE)533	{534		ResourceTypes eResource = (ResourceTypes) m_iData1;535536		// Player has the Resource?537		if(pAssignedPlayer->getNumResourceTotal(eResource, /*bIncludeImport*/ true) > 0)538		{539			return true;540		}541	}542	else if(m_eType == MINOR_CIV_QUEST_CONSTRUCT_WONDER)543	{544		BuildingTypes eWonder = (BuildingTypes) m_iData1;545546		// Player built the Wonder?547		if(pAssignedPlayer->countNumBuildings(eWonder) > 0)548		{549			return true;550		}551	}552	else if(m_eType == MINOR_CIV_QUEST_GREAT_PERSON)553	{554		UnitTypes eUnit = (UnitTypes) m_iData1;555556		// Player has the Great Person?557		int iLoop;558		for(CvUnit* pLoopUnit = pAssignedPlayer->firstUnit(&iLoop); NULL != pLoopUnit; pLoopUnit = pAssignedPlayer->nextUnit(&iLoop))559		{560			if(pLoopUnit->getUnitType() == eUnit)561			{562				return true;563			}564		}565	}566	else if(m_eType == MINOR_CIV_QUEST_KILL_CITY_STATE)567	{568		PlayerTypes eTargetCityState = (PlayerTypes) m_iData1;569		CvPlayer* pTargetCityState = &GET_PLAYER(eTargetCityState);570		if(pTargetCityState)571		{572			CvTeam* pTargetCityStateTeam = &GET_TEAM(pTargetCityState->getTeam());573			if(pTargetCityStateTeam)574			{575				// Player killed the City State?576				if(pTargetCityStateTeam->GetKilledByTeam() == pAssignedPlayer->getTeam())577				{578					return true;579				}580			}581		}582	}583	else if(m_eType == MINOR_CIV_QUEST_FIND_PLAYER)584	{585		PlayerTypes ePlayerToFind = (PlayerTypes) m_iData1;586587		// Player found the target player?588		if(GET_TEAM(pAssignedPlayer->getTeam()).IsHasFoundPlayersTerritory(ePlayerToFind))589		{590			return true;591		}592	}593	else if(m_eType == MINOR_CIV_QUEST_FIND_NATURAL_WONDER)594	{595		int iNumWondersFoundBefore = m_iData1;596597		// Player found a new NW?598		if(GET_TEAM(pAssignedPlayer->getTeam()).GetNumNaturalWondersDiscovered() > iNumWondersFoundBefore)599		{600			return true;601		}602	}603	else if(m_eType == MINOR_CIV_QUEST_GIVE_GOLD)604	{605		int iGoldGiftedBefore = m_iData2;606607		// Has the player given gold since the quest began?608		if(pMinor->GetMinorCivAI()->GetNumGoldGifted(m_eAssignedPlayer) > iGoldGiftedBefore)609		{610			return true;611		}612	}613	else if(m_eType == MINOR_CIV_QUEST_PLEDGE_TO_PROTECT)614	{615		// Has the player pledged?616		if(pMinor->GetMinorCivAI()->IsProtectedByMajor(m_eAssignedPlayer))617		{618			return true;619		}620	}621	else if(m_eType == MINOR_CIV_QUEST_CONTEST_CULTURE)622	{623		// Is it time to compare the score?624		if(GetEndTurn() == GC.getGame().getGameTurn())625			if(IsContestLeader(GetPlayerAssignedTo()))626				return true;627	}628	else if(m_eType == MINOR_CIV_QUEST_CONTEST_FAITH)629	{630		// Is it time to compare the score?631		if(GetEndTurn() == GC.getGame().getGameTurn())632			if(IsContestLeader(GetPlayerAssignedTo()))633				return true;634	}635	else if(m_eType == MINOR_CIV_QUEST_CONTEST_TECHS)636	{637		// Is it time to compare the score?638		if(GetEndTurn() == GC.getGame().getGameTurn())639			if(IsContestLeader(GetPlayerAssignedTo()))640				return true;641	}642	else if(m_eType == MINOR_CIV_QUEST_INVEST)643	{644		if(GetEndTurn() == GC.getGame().getGameTurn())645			return true;646	}647	else if(m_eType == MINOR_CIV_QUEST_BULLY_CITY_STATE)648	{649		// Has the player bullied since the quest began?650		PlayerTypes eTargetMinor = (PlayerTypes) m_iData1;651		CvPlayer* pTargetMinor = &GET_PLAYER(eTargetMinor);652		if(pTargetMinor)653		{654			int iMostRecentBullyTurn = pTargetMinor->GetMinorCivAI()->GetTurnLastBulliedByMajor(m_eAssignedPlayer);655			if(iMostRecentBullyTurn > m_iData2)656				return true;657		}658	}659	else if(m_eType == MINOR_CIV_QUEST_DENOUNCE_MAJOR)660	{661		// Has the player denounced that major yet?662		PlayerTypes eTargetMajor = (PlayerTypes) m_iData1;663		CvPlayer* pTargetMajor = &GET_PLAYER(eTargetMajor);664		if(pTargetMajor)665		{666			if(pAssignedPlayer->GetDiplomacyAI()->IsDenouncedPlayer(eTargetMajor))667				return true;668		}669	}670	else if(m_eType == MINOR_CIV_QUEST_SPREAD_RELIGION)671	{672		// Does the CS have the right majority religion?673		ReligionTypes eReligion = (ReligionTypes) m_iData1;674		if(pMinor->getCapitalCity())675		{676			if(pMinor->getCapitalCity()->GetCityReligions()->GetReligiousMajority() == eReligion)677				return true;678		}679	}680	else if(m_eType == MINOR_CIV_QUEST_TRADE_ROUTE)681	{682		if(GC.getGame().GetGameTrade()->IsPlayerConnectedToPlayer(m_eMinor,m_eAssignedPlayer))683			return true;684	}685#if defined(MOD_EVENTS_QUESTS)686	}687#endif688689	return false;690}

Calls

Called by