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}