Hooks
static bool BeforeCvPlayerCulture_DoArchaeologyChoice(CvPlayerCulture* self, ArchaeologyChoiceType eChoice);static void AfterCvPlayerCulture_DoArchaeologyChoice(CvPlayerCulture* self, ArchaeologyChoiceType eChoice);static void ReplaceCvPlayerCulture_DoArchaeologyChoice(void (*original)(CvPlayerCulture*, ArchaeologyChoiceType), CvPlayerCulture* self, ArchaeologyChoiceType eChoice);CivRegisterBefore<CivHooks::CvPlayerCulture_DoArchaeologyChoice>(host, &BeforeCvPlayerCulture_DoArchaeologyChoice);CivRegisterAfter<CivHooks::CvPlayerCulture_DoArchaeologyChoice>(host, &AfterCvPlayerCulture_DoArchaeologyChoice);CivRegisterReplace<CivHooks::CvPlayerCulture_DoArchaeologyChoice>(host, &ReplaceCvPlayerCulture_DoArchaeologyChoice);
Code
2222/// Make things happen at an archaeology dig2223void CvPlayerCulture::DoArchaeologyChoice (ArchaeologyChoiceType eChoice)2224{2225 CvGameCulture *pCulture = GC.getGame().GetGameCulture();2226 BuildingClassTypes eBuildingToHouse;2227 int iSlot;2228 CvCity *pHousingCity;2229 CvPlot *pPlot;2230 CvUnit *pUnit = GetNextDigCompleteArchaeologist(&pPlot);2231 if (pUnit)2232 {2233 GreatWorkSlotType eArtArtifactSlot = CvTypes::getGREAT_WORK_SLOT_ART_ARTIFACT();2234 GreatWorkSlotType eWritingSlot = CvTypes::getGREAT_WORK_SLOT_LITERATURE();2235 GreatWorkType eGreatArtifact = CultureHelpers::GetArtifact(pPlot);2236 GreatWorkClass eClass = (GreatWorkClass)GC.getInfoTypeForString("GREAT_WORK_ARTIFACT");22372238 switch (eChoice)2239 {2240 case ARCHAEOLOGY_DO_NOTHING:2241 break;2242 case ARCHAEOLOGY_LANDMARK:2243 {2244 ImprovementTypes eLandmarkImprovement = (ImprovementTypes)GC.getInfoTypeForString("IMPROVEMENT_LANDMARK");2245 if (eLandmarkImprovement != NO_IMPROVEMENT)2246 {2247 pPlot->setImprovementType(eLandmarkImprovement, m_pPlayer->GetID());2248#if defined(MOD_BUGFIX_MINOR)2249 // Clear the pillage state just in case something weird happened on this plot before the dig site was revealed2250#if defined(MOD_EVENTS_TILE_IMPROVEMENTS)2251 pPlot->SetImprovementPillaged(false, false);2252#else2253 pPlot->SetImprovementPillaged(false);2254#endif2255#endif2256 pUnit->kill(true);22572258 if (pPlot->getOwner() != NO_PLAYER)2259 {2260 CvPlayer &kOwner = GET_PLAYER(pPlot->getOwner());22612262 // City-state owned territory?2263 if (kOwner.isMinorCiv())2264 {2265 int iFriendship = GC.getLANDMARK_MINOR_FRIENDSHIP_CHANGE();2266 kOwner.GetMinorCivAI()->ChangeFriendshipWithMajor(m_pPlayer->GetID(), iFriendship);2267 }22682269 // AI major civ owned territory?2270 else if (!kOwner.isHuman())2271 {2272 kOwner.GetDiplomacyAI()->ChangeNumLandmarksBuiltForMe(m_pPlayer->GetID(), 1);2273 }2274 }2275 }2276 }2277 break;2278 case ARCHAEOLOGY_ARTIFACT_PLAYER1:2279 {2280 if (pPlot->getOwner() != pUnit->getOwner() && pPlot->getOwner() != NO_PLAYER)2281 {2282 GET_PLAYER(pPlot->getOwner()).GetDiplomacyAI()->ChangeNegativeArchaeologyPoints(pUnit->getOwner(), 10);2283 }2284 pHousingCity = m_pPlayer->GetCulture()->GetClosestAvailableGreatWorkSlot(pUnit->getX(),pUnit->getY(), eArtArtifactSlot, &eBuildingToHouse, &iSlot);2285 int iGWindex = pCulture->CreateGreatWork(eGreatArtifact, eClass, pPlot->GetArchaeologicalRecord().m_ePlayer1, pPlot->GetArchaeologicalRecord().m_eEra, "");2286 pHousingCity->GetCityBuildings()->SetBuildingGreatWork(eBuildingToHouse, iSlot, iGWindex);2287 pPlot->setImprovementType(NO_IMPROVEMENT);2288 pUnit->kill(true);2289 }2290 break;2291 case ARCHAEOLOGY_ARTIFACT_PLAYER2:2292 {2293 if (pPlot->getOwner() != pUnit->getOwner() && pPlot->getOwner() != NO_PLAYER)2294 {2295 GET_PLAYER(pPlot->getOwner()).GetDiplomacyAI()->ChangeNegativeArchaeologyPoints(pUnit->getOwner(), 10);2296 }2297 pHousingCity = m_pPlayer->GetCulture()->GetClosestAvailableGreatWorkSlot(pUnit->getX(),pUnit->getY(), eArtArtifactSlot, &eBuildingToHouse, &iSlot);2298 int iGWindex = pCulture->CreateGreatWork(eGreatArtifact, eClass, pPlot->GetArchaeologicalRecord().m_ePlayer2, pPlot->GetArchaeologicalRecord().m_eEra, "");2299 pHousingCity->GetCityBuildings()->SetBuildingGreatWork(eBuildingToHouse, iSlot, iGWindex);2300 pPlot->setImprovementType(NO_IMPROVEMENT);2301 pUnit->kill(true);2302 }2303 break;23042305 case ARCHAEOLOGY_ARTIFACT_WRITING:2306 {2307 if (pPlot->getOwner() != pUnit->getOwner() && pPlot->getOwner() != NO_PLAYER)2308 {2309 GET_PLAYER(pPlot->getOwner()).GetDiplomacyAI()->ChangeNegativeArchaeologyPoints(pUnit->getOwner(), 10);2310 }2311 pHousingCity = m_pPlayer->GetCulture()->GetClosestAvailableGreatWorkSlot(pUnit->getX(),pUnit->getY(), eWritingSlot, &eBuildingToHouse, &iSlot);2312 int iGWindex = pCulture->CreateGreatWork(eGreatArtifact, (GreatWorkClass)GC.getInfoTypeForString("GREAT_WORK_LITERATURE"), pPlot->GetArchaeologicalRecord().m_ePlayer1, pPlot->GetArchaeologicalRecord().m_eEra, "");2313 pHousingCity->GetCityBuildings()->SetBuildingGreatWork(eBuildingToHouse, iSlot, iGWindex);2314 pPlot->setImprovementType(NO_IMPROVEMENT);2315 pUnit->kill(true);2316 }2317 break;23182319 case ARCHAEOLOGY_CULTURE_BOOST:2320 {2321 if (pPlot->getOwner() != pUnit->getOwner() && pPlot->getOwner() != NO_PLAYER)2322 {2323 GET_PLAYER(pPlot->getOwner()).GetDiplomacyAI()->ChangeNegativeArchaeologyPoints(pUnit->getOwner(), 10);2324 }23252326 // Culture boost based on 8 previous turns; same as GREAT_WRITER; move to XML?2327 int iValue = m_pPlayer->GetCultureYieldFromPreviousTurns(GC.getGame().getGameTurn(), 8 /*iPreviousTurnsToCount */);23282329 // Modify based on game speed2330 iValue *= GC.getGame().getGameSpeedInfo().getCulturePercent();2331 iValue /= 100;23322333 m_pPlayer->changeJONSCulture(iValue);23342335 pPlot->setImprovementType(NO_IMPROVEMENT);2336 pUnit->kill(true);2337 }2338 break;2339 }23402341 m_pPlayer->SetNumArchaeologyChoices(m_pPlayer->GetNumArchaeologyChoices() - 1);2342 m_pPlayer->GetCulture()->RemoveDigCompletePlot(pPlot);2343 }2344}