Hooks
static bool BeforeCvPlot_changeBuildProgress(CvPlot* self, BuildTypes eBuild, int iChange, PlayerTypes ePlayer, bool& result);static void AfterCvPlot_changeBuildProgress(CvPlot* self, BuildTypes eBuild, int iChange, PlayerTypes ePlayer, bool& result);static bool ReplaceCvPlot_changeBuildProgress(bool (*original)(CvPlot*, BuildTypes, int, PlayerTypes), CvPlot* self, BuildTypes eBuild, int iChange, PlayerTypes ePlayer);CivRegisterBefore<CivHooks::CvPlot_changeBuildProgress>(host, &BeforeCvPlot_changeBuildProgress);CivRegisterAfter<CivHooks::CvPlot_changeBuildProgress>(host, &AfterCvPlot_changeBuildProgress);CivRegisterReplace<CivHooks::CvPlot_changeBuildProgress>(host, &ReplaceCvPlot_changeBuildProgress);
Code
9787// Returns true if build finished...9788bool CvPlot::changeBuildProgress(BuildTypes eBuild, int iChange, PlayerTypes ePlayer)9789{9790 CvCity* pCity;9791 CvString strBuffer;9792 int iProduction;9793 bool bFinished = false;9794 CvPlayer &kPlayer = GET_PLAYER(ePlayer);97959796 CvBuildInfo* pkBuildInfo = GC.getBuildInfo(eBuild);9797 CvAssert(pkBuildInfo);97989799 //This shouldn't happen.9800 if(pkBuildInfo == NULL)9801 return false;98029803 if(iChange != 0)9804 {9805 if(NULL == m_paiBuildProgress)9806 {9807 m_paiBuildProgress = FNEW(short[GC.getNumBuildInfos()], c_eCiv5GameplayDLL, 0);9808 for(int iI = 0; iI < GC.getNumBuildInfos(); ++iI)9809 {9810 m_paiBuildProgress[iI] = 0;9811 }9812 }98139814 ImprovementTypes eImprovement = (ImprovementTypes)pkBuildInfo->getImprovement();9815 if (eImprovement != NO_IMPROVEMENT)9816 {9817 if (eImprovement != m_eImprovementTypeUnderConstruction)9818 {9819 SilentlyResetAllBuildProgress();9820 m_eImprovementTypeUnderConstruction = eImprovement;9821 }9822 }98239824 m_paiBuildProgress[eBuild] += iChange;9825 CvAssert(getBuildProgress(eBuild) >= 0);98269827 if(getBuildProgress(eBuild) >= getBuildTime(eBuild, ePlayer))9828 {9829 m_paiBuildProgress[eBuild] = 0;98309831 // Constructed Improvement9832 if (eImprovement != NO_IMPROVEMENT)9833 {9834 setImprovementType(eImprovement, ePlayer);9835 9836#if defined(MOD_BUGFIX_MINOR)9837 // Building a GP improvement on a resource needs to clear any previous pillaged state9838 if (GC.getImprovementInfo(eImprovement)->IsCreatedByGreatPerson()) {9839#if defined(MOD_EVENTS_TILE_IMPROVEMENTS)9840 SetImprovementPillaged(false, false);9841#else9842 SetImprovementPillaged(false);9843#endif9844 }9845#endif98469847 // Unowned plot, someone has to foot the bill9848 if(getOwner() == NO_PLAYER)9849 {9850 if(MustPayMaintenanceHere(ePlayer))9851 {9852 kPlayer.GetTreasury()->ChangeBaseImprovementGoldMaintenance(GC.getImprovementInfo(eImprovement)->GetGoldMaintenance());9853 }9854 SetPlayerResponsibleForImprovement(ePlayer);9855 }98569857 CvImprovementEntry& newImprovementEntry = *GC.getImprovementInfo(eImprovement);98589859 // If this improvement removes the underlying resource, do that9860 if (newImprovementEntry.IsRemovesResource())9861 {9862 if (getResourceType() != NO_RESOURCE)9863 {9864 setResourceType(NO_RESOURCE, 0);9865 }9866 }98679868 // If we want to prompt the user about archaeology, let's record that9869 if (newImprovementEntry.IsPromptWhenComplete())9870 {9871 CvAssertMsg (GetArchaeologicalRecord().m_eArtifactType != NO_GREAT_WORK_ARTIFACT_CLASS, "Archaeological dig complete but no archeology data found!");98729873 kPlayer.SetNumArchaeologyChoices(kPlayer.GetNumArchaeologyChoices() + 1);9874 kPlayer.GetCulture()->AddDigCompletePlot(this);98759876 if(kPlayer.isHuman())9877 {9878 CvNotifications* pNotifications;9879 Localization::String locString;9880 Localization::String locSummary;9881 pNotifications = kPlayer.GetNotifications();9882 if(pNotifications)9883 {9884 strBuffer = GetLocalizedText("TXT_KEY_NOTIFICATION_CHOOSE_ARCHAEOLOGY");9885 CvString strSummary = GetLocalizedText("TXT_KEY_NOTIFICATION_SUMMARY_CHOOSE_ARCHAEOLOGY");9886 pNotifications->Add(NOTIFICATION_CHOOSE_ARCHAEOLOGY, strBuffer, strSummary, getX(), getY(), kPlayer.GetID());9887 CancelActivePlayerEndTurn();9888 }98899890#if !defined(NO_ACHIEVEMENTS)9891 // Raiders of the Lost Ark achievement9892 const char* szCivKey = kPlayer.getCivilizationTypeKey();9893 if(getOwner() != NO_PLAYER && !GC.getGame().isNetworkMultiPlayer() && strcmp(szCivKey, "CIVILIZATION_AMERICA") == 0)9894 {9895 CvPlayer &kPlotOwner = GET_PLAYER(getOwner());9896 szCivKey = kPlotOwner.getCivilizationTypeKey();9897 if(strcmp(szCivKey, "CIVILIZATION_EGYPT") == 0)9898 {9899 for (int i = 0; i < MAX_MAJOR_CIVS; i++)9900 {9901 CvPlayer &kLoopPlayer = GET_PLAYER((PlayerTypes)i);9902 if (kLoopPlayer.GetID() != NO_PLAYER && kLoopPlayer.isAlive())9903 {9904 szCivKey = kLoopPlayer.getCivilizationTypeKey();9905 if (strcmp(szCivKey, "CIVILIZATION_GERMANY"))9906 {9907 CvUnit *pLoopUnit;9908 int iUnitLoop;9909 for(pLoopUnit = kLoopPlayer.firstUnit(&iUnitLoop); pLoopUnit != NULL; pLoopUnit = kLoopPlayer.nextUnit(&iUnitLoop))9910 {9911 if(strcmp(pLoopUnit->getUnitInfo().GetType(), "UNIT_ARCHAEOLOGIST") == 0)9912 {9913 if (plotDistance(pLoopUnit->getX(), pLoopUnit->getY(), getX(), getY()) <= 2)9914 {9915 gDLL->UnlockAchievement(ACHIEVEMENT_XP2_33);9916 }9917 }9918 }9919 }9920 }9921 }9922 }9923 }9924#endif9925 }9926 else9927 { 9928 ArchaeologyChoiceType eChoice = kPlayer.GetCulture()->GetArchaeologyChoice(this);9929 kPlayer.GetCulture()->DoArchaeologyChoice (eChoice);9930 }9931 }9932 }99339934 // Constructed Route9935 if(pkBuildInfo->getRoute() != NO_ROUTE)9936 {9937 const RouteTypes eRoute = (RouteTypes)pkBuildInfo->getRoute();9938 CvRouteInfo* pkRouteInfo = GC.getRouteInfo(eRoute);9939 if(pkRouteInfo)9940 {9941 setRouteType(eRoute);99429943 // Unowned plot, someone has to foot the bill9944 if(getOwner() == NO_PLAYER)9945 {9946 if(MustPayMaintenanceHere(ePlayer))9947 {9948 kPlayer.GetTreasury()->ChangeBaseImprovementGoldMaintenance(pkRouteInfo->GetGoldMaintenance());9949 }9950 SetPlayerResponsibleForRoute(ePlayer);9951 }9952 }9953 }99549955 // Remove Feature9956 if(getFeatureType() != NO_FEATURE)9957 {9958 if(pkBuildInfo->isFeatureRemove(getFeatureType()))9959 {9960 CvAssertMsg(ePlayer != NO_PLAYER, "ePlayer should be valid");99619962 iProduction = getFeatureProduction(eBuild, ePlayer, &pCity);99639964 if(iProduction > 0)9965 {9966 pCity->changeFeatureProduction(iProduction);9967 if(pCity->getOwner() == GC.getGame().getActivePlayer())9968 {9969 strBuffer = GetLocalizedText("TXT_KEY_MISC_CLEARING_FEATURE_RESOURCE", GC.getFeatureInfo(getFeatureType())->GetTextKey(), iProduction, pCity->getNameKey());9970 GC.GetEngineUserInterface()->AddCityMessage(0, pCity->GetIDInfo(), pCity->getOwner(), false, GC.getEVENT_MESSAGE_TIME(), strBuffer);9971 }9972 }99739974 setFeatureType(NO_FEATURE);9975 }9976 }99779978 // Repairing a Pillaged Tile9979 if(pkBuildInfo->isRepair())9980 {9981 if(IsImprovementPillaged())9982 {9983 SetImprovementPillaged(false);9984 }9985 else if(IsRoutePillaged())9986 {9987 SetRoutePillaged(false);9988 }9989 }99909991 if(pkBuildInfo->IsRemoveRoute())9992 {9993 setRouteType(NO_ROUTE);9994 }99959996 bFinished = true;99979998 ICvEngineScriptSystem1* pkScriptSystem = gDLL->GetScriptSystem();9999 if(pkScriptSystem)10000 {10001 CvLuaArgsHandle args;10002 args->Push(ePlayer);10003 args->Push(getX());10004 args->Push(getY());10005 args->Push(eImprovement);1000610007 bool bResult;10008 LuaSupport::CallHook(pkScriptSystem, "BuildFinished", args.get(), bResult);10009 }10010 }10011 }1001210013 return bFinished;10014}