CvTeam::setHasTech(TechTypes, bool, PlayerTypes, bool, bool)
- Defined in
- CvTeam.cpp, line 5420
- Class
- CvTeam
- Hook name
CivHooks::CvTeam_setHasTech
Hand-placed hooks inside
A replacement for this function that does not call original stops these hooks from running.
Hooks
static bool BeforeCvTeam_setHasTech(CvTeam* self, TechTypes eIndex, bool bNewValue, PlayerTypes ePlayer, bool bFirst, bool bAnnounce);static void AfterCvTeam_setHasTech(CvTeam* self, TechTypes eIndex, bool bNewValue, PlayerTypes ePlayer, bool bFirst, bool bAnnounce);static void ReplaceCvTeam_setHasTech(void (*original)(CvTeam*, TechTypes, bool, PlayerTypes, bool, bool), CvTeam* self, TechTypes eIndex, bool bNewValue, PlayerTypes ePlayer, bool bFirst, bool bAnnounce);CivRegisterBefore<CivHooks::CvTeam_setHasTech>(host, &BeforeCvTeam_setHasTech);CivRegisterAfter<CivHooks::CvTeam_setHasTech>(host, &AfterCvTeam_setHasTech);CivRegisterReplace<CivHooks::CvTeam_setHasTech>(host, &ReplaceCvTeam_setHasTech);
Code
5420void CvTeam::setHasTech(TechTypes eIndex, bool bNewValue, PlayerTypes ePlayer, bool bFirst, bool bAnnounce)5421{5422 CvCity* pCapitalCity;5423 CvCity* pCity;5424 CvString strBuffer;5425 UnitTypes eFreeUnit;5426 bool bFirstResource;5427 5428 if(eIndex == NO_TECH)5429 {5430 return;5431 }54325433 CvTechEntry* pkTechInfo = GC.getTechInfo(eIndex);5434 if(pkTechInfo == NULL)5435 {5436 return;5437 }54385439 if(ePlayer == NO_PLAYER)5440 {5441 ePlayer = getLeaderID();5442 }54435444 CvAssertMsg(eIndex >= 0, "eIndex is expected to be non-negative (invalid Index)");5445 CvAssertMsg(eIndex < GC.getNumTechInfos(), "eIndex is expected to be within maximum bounds (invalid Index)");5446 CvAssertMsg(ePlayer >= 0, "eIndex is expected to be non-negative (invalid Index)");5447 CvAssertMsg(ePlayer < MAX_PLAYERS, "ePlayer is expected to be within maximum bounds (invalid Index)");54485449 if(ePlayer == NO_PLAYER)5450 {5451 return;5452 }54535454 if(GetTeamTechs()->HasTech(eIndex) != bNewValue)5455 {5456#if !defined(NO_ACHIEVEMENTS)5457 CvPlayerAI& kResearchingPlayer = GET_PLAYER(ePlayer);54585459 if( GC.getGame().getActivePlayer() == ePlayer &&5460 strcmp(pkTechInfo->GetType(), "TECH_SATELLITES") == 0 &&5461 strcmp(kResearchingPlayer.getCivilizationTypeKey(), "CIVILIZATION_HUNS") == 0 &&5462 strcmp(GC.getMap().getWorldInfo().GetType(), "WORLDSIZE_HUGE") == 0)5463 {5464 gDLL->UnlockAchievement(ACHIEVEMENT_XP1_30);5465 }5466#endif54675468 if(pkTechInfo->IsRepeat())5469 {5470 GetTeamTechs()->IncrementTechCount(eIndex);54715472 GetTeamTechs()->SetResearchProgress(eIndex, 0, ePlayer);54735474 // Repeating techs are good for score!5475 int iScoreChange = /*10*/ GC.getSCORE_FUTURE_TECH_MULTIPLIER();5476 for(int iI = 0; iI < MAX_PLAYERS; iI++)5477 {5478 const PlayerTypes eLoopPlayer = static_cast<PlayerTypes>(iI);5479 CvPlayerAI& kLoopPlayer = GET_PLAYER(eLoopPlayer);5480 if(kLoopPlayer.isAlive() && kLoopPlayer.getTeam() == GetID())5481 {5482 kLoopPlayer.ChangeScoreFromFutureTech(iScoreChange);5483 }5484 }54855486 // report event to Python5487 ////gDLL->getEventReporterIFace()->techAcquired(eIndex, GetID(), ePlayer, bAnnounce && 1 == GetTeamTechs()->GetTechCount(eIndex));54885489 if(1 == GetTeamTechs()->GetTechCount(eIndex))5490 {5491 if(bAnnounce)5492 {5493 if(GC.getGame().isFinalInitialized())5494 {5495 announceTechToPlayers(eIndex);5496 }5497 }5498 }5499 }5500 else5501 {5502 GetTeamTechs()->SetHasTech(eIndex, bNewValue);55035504 // Tech progress affects city strength, so update5505 CvCity* pLoopCity;5506 int iLoop;55075508 for(int iI = 0; iI < MAX_PLAYERS; iI++)5509 {5510 const PlayerTypes eLoopPlayer = static_cast<PlayerTypes>(iI);5511 CvPlayerAI& kLoopPlayer = GET_PLAYER(eLoopPlayer);5512 if(kLoopPlayer.isAlive() && kLoopPlayer.getTeam() == GetID())5513 {5514 for(pLoopCity = kLoopPlayer.firstCity(&iLoop); pLoopCity != NULL; pLoopCity = kLoopPlayer.nextCity(&iLoop))5515 {5516 pLoopCity->updateStrengthValue();5517 }5518 }5519 }55205521 NotificationTypes eNotificationType = NO_NOTIFICATION_TYPE;55225523 const bool bIsActiveTeam = (GetID() == GC.getGame().getActiveTeam());5524 const int iNumPlots = GC.getMap().numPlots();5525 for(int iPlotLoop = 0; iPlotLoop < iNumPlots; iPlotLoop++)5526 {5527 CvPlot* pLoopPlot = GC.getMap().plotByIndexUnchecked(iPlotLoop);55285529 const ResourceTypes eResource = pLoopPlot->getResourceType();5530 if(eResource != NO_RESOURCE)5531 {5532 CvResourceInfo* pResourceInfo = GC.getResourceInfo(eResource);5533 CvAssert(pResourceInfo);55345535 if(bNewValue)5536 {5537 const TechTypes eTechReveal = static_cast<TechTypes>(pResourceInfo->getTechReveal());5538 // Resource Reveal5539 if(eTechReveal == eIndex)5540 {5541 // update the resources5542 if(pLoopPlot->isRevealed(m_eID))5543 {5544 if(pLoopPlot->getResourceType(m_eID) != NO_RESOURCE)5545 {5546 // Create resource link5547 if(pLoopPlot->isOwned())5548 pLoopPlot->DoFindCityToLinkResourceTo();55495550 // Only update for active team5551 if(bIsActiveTeam)5552 {5553 // If we've force revealed the resource for this team, then don't send another event5554 if(!pLoopPlot->IsResourceForceReveal(GetID()))5555 {5556 pLoopPlot->setLayoutDirty(true);5557 }55585559 // Notify the player that owns this Plot5560 if(pLoopPlot->getOwner() == GC.getGame().getActivePlayer() && pLoopPlot->getTeam() == GetID())5561 {5562 if(!CvPreGame::loadWBScenario() || GC.getGame().getGameTurn() > 0)5563 {5564 strBuffer = GetLocalizedText("TXT_KEY_NOTIFICATION_FOUND_RESOURCE", pResourceInfo->GetTextKey());5565 5566 CvString strSummary = GetLocalizedText("TXT_KEY_NOTIFICATION_SUMMARY_FOUND_RESOURCE", pResourceInfo->GetTextKey());55675568 switch(pResourceInfo->getResourceUsage())5569 {5570 case RESOURCEUSAGE_LUXURY:5571 eNotificationType = NOTIFICATION_DISCOVERED_LUXURY_RESOURCE;5572 break;5573 case RESOURCEUSAGE_STRATEGIC:5574 eNotificationType = NOTIFICATION_DISCOVERED_STRATEGIC_RESOURCE;5575 break;5576 case RESOURCEUSAGE_BONUS:5577 eNotificationType = NOTIFICATION_DISCOVERED_BONUS_RESOURCE;5578 break;5579 }55805581 CvNotifications* pNotifications = GET_PLAYER(pLoopPlot->getOwner()).GetNotifications();5582 if(pNotifications)5583 {5584 pNotifications->Add(eNotificationType, strBuffer, strSummary, pLoopPlot->getX(), pLoopPlot->getY(), eResource);5585 }5586 }5587 }5588 }5589 }5590 }5591 }5592 }5593 // Resource Connection5594 if(pLoopPlot->getTeam() == GetID())5595 {5596 if(pResourceInfo->getTechCityTrade() == eIndex)5597 {5598 if(pLoopPlot->isCity() || pLoopPlot->getImprovementType() != NO_IMPROVEMENT)5599 {5600 // Appropriate Improvement on this Plot?5601 if(pLoopPlot->isCity() || GC.getImprovementInfo(pLoopPlot->getImprovementType())->IsImprovementResourceTrade(eResource))5602 {5603 for(int iI = 0; iI < MAX_PLAYERS; iI++)5604 {5605 const PlayerTypes eLoopPlayer = static_cast<PlayerTypes>(iI);5606 CvPlayerAI& kLoopPlayer = GET_PLAYER(eLoopPlayer);5607 if(kLoopPlayer.isAlive() && kLoopPlayer.getTeam() == GetID() && pLoopPlot->getOwner() == eLoopPlayer)5608 {5609 // We now have a new Tech5610 if(bNewValue)5611 {5612 // slewis - added in so resources wouldn't be double counted when the minor civ researches the technology5613 if (!(kLoopPlayer.isMinorCiv() && pLoopPlot->IsImprovedByGiftFromMajor()))5614 {5615 kLoopPlayer.changeNumResourceTotal(eResource, pLoopPlot->getNumResourceForPlayer(eLoopPlayer));5616 }56175618 // Reconnect resource link5619 if(pLoopPlot->GetResourceLinkedCity() != NULL)5620 {5621 pLoopPlot->SetResourceLinkedCityActive(true);5622 }5623 // Create resource link5624 else5625 {5626 pLoopPlot->DoFindCityToLinkResourceTo();5627 }5628 }5629 // Removing Tech5630 else5631 {5632 kLoopPlayer.changeNumResourceTotal(eResource, -pLoopPlot->getNumResourceForPlayer(eLoopPlayer));56335634 // Disconnect resource link5635 if(pLoopPlot->GetResourceLinkedCity() != NULL)5636 pLoopPlot->SetResourceLinkedCityActive(false);5637 }5638 }5639 }5640 }5641 }5642 }5643 }5644 }5645 }5646 }56475648 processTech(eIndex, ((bNewValue) ? 1 : -1));56495650 //Antiquity site notifications.5651 //Notifications for Artifacts and Hidden Artifacts have to come AFTER processTech because they may not have been spawned yet.5652 if(!CvPreGame::loadWBScenario() || GC.getGame().getGameTurn() > 0)5653 {5654 bool bTechRevealsArtifacts = false;5655 bool bTechRevealsHiddenArtifacts = false;56565657 ResourceTypes eArtifactResource = (ResourceTypes)GC.getInfoTypeForString("RESOURCE_ARTIFACTS", true);5658 CvResourceInfo* pArtifactResource = NULL;5659 if(eArtifactResource != NO_RESOURCE)5660 {5661 pArtifactResource = GC.getResourceInfo(eArtifactResource);5662 bTechRevealsArtifacts = pArtifactResource->getTechReveal() == eIndex; 5663 }56645665 ResourceTypes eHiddenArtifactResource = (ResourceTypes)GC.getInfoTypeForString("RESOURCE_HIDDEN_ARTIFACTS", true);;5666 CvResourceInfo* pHiddenArtifactResource = NULL;5667 if(eHiddenArtifactResource != NO_RESOURCE)5668 {5669 pHiddenArtifactResource = GC.getResourceInfo(eHiddenArtifactResource);5670 bTechRevealsHiddenArtifacts = pHiddenArtifactResource->getTechReveal() == eIndex;5671 }56725673 if(bTechRevealsArtifacts | bTechRevealsHiddenArtifacts)5674 {5675 const PlayerTypes eActivePlayer = GC.getGame().getActivePlayer();5676 const int iNumPlots = GC.getMap().numPlots();5677 for(int iPlotLoop = 0; iPlotLoop < iNumPlots; iPlotLoop++)5678 {5679 CvPlot* pLoopPlot = GC.getMap().plotByIndexUnchecked(iPlotLoop);56805681 if(pLoopPlot->getOwner() == eActivePlayer && pLoopPlot->getTeam() == m_eID && pLoopPlot->isRevealed(m_eID))5682 {5683 const ResourceTypes ePlotResource = pLoopPlot->getResourceType(m_eID);5684 if( (bTechRevealsArtifacts && ePlotResource == eArtifactResource) || 5685 (bTechRevealsHiddenArtifacts && ePlotResource == eHiddenArtifactResource))5686 {5687 CvString strSummary;5688 // CvString strBuffer;5689 ResourceUsageTypes eResourceUsage = RESOURCEUSAGE_LUXURY;5690 NotificationTypes eNotificationType = NO_NOTIFICATION_TYPE;56915692 if(ePlotResource == eArtifactResource)5693 {5694 strBuffer = GetLocalizedText("TXT_KEY_NOTIFICATION_FOUND_ARTIFACTS");5695 strSummary = GetLocalizedText("TXT_KEY_NOTIFICATION_SUMMARY_FOUND_RESOURCE", pArtifactResource->GetTextKey());5696 eResourceUsage = pArtifactResource->getResourceUsage();5697 }5698 else if(ePlotResource == eHiddenArtifactResource)5699 {5700 strBuffer = GetLocalizedText("TXT_KEY_NOTIFICATION_FOUND_HIDDEN_ARTIFACTS");5701 strSummary = GetLocalizedText("TXT_KEY_NOTIFICATION_SUMMARY_FOUND_RESOURCE", pHiddenArtifactResource->GetTextKey());5702 eResourceUsage = pHiddenArtifactResource->getResourceUsage();5703 }57045705 switch(eResourceUsage)5706 {5707 case RESOURCEUSAGE_LUXURY:5708 eNotificationType = NOTIFICATION_DISCOVERED_LUXURY_RESOURCE;5709 break;5710 case RESOURCEUSAGE_STRATEGIC:5711 eNotificationType = NOTIFICATION_DISCOVERED_STRATEGIC_RESOURCE;5712 break;5713 case RESOURCEUSAGE_BONUS:5714 eNotificationType = NOTIFICATION_DISCOVERED_BONUS_RESOURCE;5715 break;5716 }57175718 CvNotifications* pNotifications = GET_PLAYER(pLoopPlot->getOwner()).GetNotifications();5719 if(pNotifications)5720 {5721 pNotifications->Add(eNotificationType, strBuffer, strSummary, pLoopPlot->getX(), pLoopPlot->getY(), ePlotResource);5722 }5723 }5724 }5725 }5726 }57275728 }57295730 if(GetTeamTechs()->HasTech(eIndex))5731 {5732 EraTypes eThisTechsEra = (EraTypes) pkTechInfo->GetEra();57335734 // Era change for this Team?5735 if(GetCurrentEra() < eThisTechsEra)5736 {5737 EraTypes eNewEra = (EraTypes) pkTechInfo->GetEra();5738 //int iEraChange = eNewEra - GetCurrentEra();57395740 //int iVictoryPointChange = iEraChange * /*1*/ GC.getVICTORY_POINTS_PER_ERA();5741 //changeVictoryPoints(iVictoryPointChange);57425743 //strBuffer = GetLocalizedText("TXT_KEY_NOTIFICATION_ERA_VICTORY_POINTS", iVictoryPointChange);5744 //CvString strSummary = GetLocalizedText("TXT_KEY_NOTIFICATION_SUMMARY_ERA_VICTORY_POINTS");5745 //AddNotification(NOTIFICATION_VICTORY, strBuffer, strSummary);57465747 SetCurrentEra(eNewEra);5748 }5749 // DON'T enter a new era with this tech5750 else5751 {5752 // If we have all the techs in the earlier eras, then we're in that era5753 bool bHasAllEarlierTechs = true;5754 for(int iTechLoop = 0; iTechLoop < GC.getNumTechInfos(); iTechLoop++)5755 {5756 const TechTypes eLoopTech = static_cast<TechTypes>(iTechLoop);5757 CvTechEntry* pkLoopTech = GC.getTechInfo(eLoopTech);5758 if(pkLoopTech)5759 {5760 // Only look at techs prior to our era - there's no need to go further5761 if(pkLoopTech->GetEra() <= GetCurrentEra())5762 {5763 if(!GetTeamTechs()->HasTech(eLoopTech))5764 {5765 bHasAllEarlierTechs = false;5766 break;5767 }5768 }5769 }5770 }57715772 if(bHasAllEarlierTechs)5773 {5774 const EraTypes currentEra = GetCurrentEra();5775 const int iNextEra = static_cast<int>(currentEra) + 1;5776 if(iNextEra < GC.getNumEraInfos())5777 {5778 const EraTypes nextEra = static_cast<EraTypes>(iNextEra);5779 const CvEraInfo* pkEraInfo = GC.getEraInfo(nextEra);5780 if(pkEraInfo != NULL)5781 {5782 SetCurrentEra(nextEra);5783 }5784 }57855786 }5787 }57885789 if(pkTechInfo->IsMapVisible())5790 {5791 GC.getMap().setRevealedPlots(GetID(), true, true);5792 GC.getMap().updateDeferredFog();5793 }57945795 DoUpdateBestRoute();57965797 // report event to Python, along with some other key state5798 //////gDLL->getEventReporterIFace()->techAcquired(eIndex, GetID(), ePlayer, bAnnounce);57995800 bFirstResource = false;58015802 for(int iI = 0; iI < MAX_PLAYERS; iI++)5803 {5804 const PlayerTypes eLoopPlayer = static_cast<PlayerTypes>(iI);5805 CvPlayerAI& kPlayer = GET_PLAYER(eLoopPlayer);5806 if(kPlayer.isAlive() && kPlayer.getTeam() == GetID())5807 {5808 if(kPlayer.GetPlayerTechs()->IsResearchingTech(eIndex))5809 {5810 kPlayer.popResearch(eIndex);5811 }58125813 // notify the player they now have the tech, if they want to make immediate changes5814 //GET_PLAYER((PlayerTypes)iI).AI_nowHasTech(eIndex);58155816 kPlayer.invalidateYieldRankCache();5817 }5818 }58195820 if(bFirst)5821 {5822 if(GC.getGame().countKnownTechNumTeams(eIndex) == 1)5823 {5824 if(pkTechInfo->GetFirstFreeUnitClass() != NO_UNITCLASS)5825 {5826 bFirstResource = true;58275828 eFreeUnit = ((UnitTypes)(GET_PLAYER(ePlayer).getCivilizationInfo().getCivilizationUnits(GC.getTechInfo(eIndex)->GetFirstFreeUnitClass())));58295830 if(eFreeUnit != NULL)5831 {5832 pCapitalCity = GET_PLAYER(ePlayer).getCapitalCity();58335834 if(pCapitalCity != NULL)5835 {5836#if defined(MOD_GLOBAL_TRULY_FREE_GP)5837 pCapitalCity->GetCityCitizens()->DoSpawnGreatPerson(eFreeUnit, true, false, MOD_GLOBAL_TRULY_FREE_GP);5838#else5839 pCapitalCity->GetCityCitizens()->DoSpawnGreatPerson(eFreeUnit, true, false);5840#endif5841 }5842 }5843 }58445845 if(pkTechInfo->GetFirstFreeTechs() > 0)5846 {5847 bFirstResource = true;58485849 if(!isHuman())5850 {5851 for(int iI = 0; iI < pkTechInfo->GetFirstFreeTechs(); iI++)5852 {5853 GET_PLAYER(ePlayer).AI_chooseFreeTech();5854 }5855 }5856 else5857 {5858 strBuffer = GetLocalizedText("TXT_KEY_MISC_FIRST_TECH_CHOOSE_FREE", pkTechInfo->GetTextKey());5859 GET_PLAYER(ePlayer).chooseTech(GC.getTechInfo(eIndex)->GetFirstFreeTechs(), strBuffer.GetCString());5860 }58615862 for(int iI = 0; iI < MAX_PLAYERS; iI++)5863 {5864 const PlayerTypes eLoopPlayer = static_cast<PlayerTypes>(iI);5865 CvPlayerAI& kLoopPLayer = GET_PLAYER(eLoopPlayer);5866 if(kLoopPLayer.isAlive() && GC.getGame().getActivePlayer())5867 {5868 if(isHasMet(kLoopPLayer.getTeam()))5869 {5870 strBuffer = GetLocalizedText("TXT_KEY_MISC_SOMEONE_FIRST_TO_TECH", GET_PLAYER(ePlayer).getNameKey(), pkTechInfo->GetTextKey());5871 }5872 else5873 {5874 strBuffer = GetLocalizedText("TXT_KEY_MISC_UNKNOWN_FIRST_TO_TECH", GC.getTechInfo(eIndex)->GetTextKey());5875 }5876 DLLUI->AddMessage(0, eLoopPlayer, false, GC.getEVENT_MESSAGE_TIME(), strBuffer/*, "AS2D_FIRSTTOTECH", MESSAGE_TYPE_MAJOR_EVENT, NULL, (ColorTypes)GC.getInfoTypeForString("COLOR_HIGHLIGHT_TEXT")*/);5877 }5878 }58795880 strBuffer = GetLocalizedText("TXT_KEY_MISC_SOMEONE_FIRST_TO_TECH", GET_PLAYER(ePlayer).getName(), GC.getTechInfo(eIndex)->GetTextKey());5881 GC.getGame().addReplayMessage(REPLAY_MESSAGE_MAJOR_EVENT, ePlayer, strBuffer, -1, -1);5882 }58835884 if(bFirstResource)5885 {5886 for(int iI = 0; iI < MAX_PLAYERS; iI++)5887 {5888 const PlayerTypes eLoopPlayer = static_cast<PlayerTypes>(iI);5889 CvPlayerAI& kPlayer = GET_PLAYER(eLoopPlayer);5890 if(kPlayer.isAlive())5891 {5892 if(!(kPlayer.isHuman()))5893 {5894 if(kPlayer.GetPlayerTechs()->IsResearchingTech(eIndex))5895 {5896 kPlayer.clearResearchQueue();5897 }5898 }5899 }5900 }5901 }5902 }5903 }59045905 if(bAnnounce)5906 {5907 if(GC.getGame().isFinalInitialized()/* && !(gDLL->GetWorldBuilderMode())*/)5908 {5909 announceTechToPlayers(eIndex);59105911 // Resources discovered in a player's territory5912 for(int iI = 0; iI < GC.getMap().numPlots(); iI++)5913 {5914 CvPlot* pLoopPlot = GC.getMap().plotByIndexUnchecked(iI);59155916 if(pLoopPlot->getTeam() == GetID() && pLoopPlot->getOwner() == GC.getGame().getActivePlayer())5917 {5918 ResourceTypes eResource = pLoopPlot->getResourceType();59195920 if(eResource != NO_RESOURCE)5921 {5922 if(GC.getResourceInfo(eResource)->getTechReveal() == eIndex && !isForceRevealedResource(eResource))5923 {5924 pCity = GC.getMap().findCity(pLoopPlot->getX(), pLoopPlot->getY(), NO_PLAYER, GetID(), false);59255926 if(pCity != NULL)5927 {5928 CvResourceInfo* pResourceInfo = GC.getResourceInfo(eResource);59295930 if(strcmp(pResourceInfo->GetType(), "RESOURCE_ARTIFACTS") == 0)5931 {5932 strBuffer = GetLocalizedText("TXT_KEY_MISC_DISCOVERED_ARTIFACTS_NEAR", pCity->getNameKey());5933 }5934 else if(strcmp(pResourceInfo->GetType(), "RESOURCE_HIDDEN_ARTIFACTS") == 0)5935 {5936 strBuffer = GetLocalizedText("TXT_KEY_MISC_DISCOVERED_HIDDEN_ARTIFACTS_NEAR", pCity->getNameKey());5937 }5938 else5939 {5940 strBuffer = GetLocalizedText("TXT_KEY_MISC_YOU_DISCOVERED_RESOURCE", pResourceInfo->GetTextKey(), pCity->getNameKey());5941 }59425943 DLLUI->AddPlotMessage(0, pLoopPlot->GetPlotIndex(), pLoopPlot->getOwner(), false, GC.getEVENT_MESSAGE_TIME(), strBuffer/*, "AS2D_DISCOVERRESOURCE", MESSAGE_TYPE_INFO, GC.getResourceInfo(eResource)->GetButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_WHITE"), pLoopPlot->getX(), pLoopPlot->getY(), true, true*/);5944 }5945 }5946 }5947 }5948 }59495950 // Cities demand a Resource that's been newly revealed5951 CvCity* pLoopCity;5952 int iLoop;5953 PlayerTypes eLoopPlayer;5954 ResourceTypes eResourceDemanded;59555956 // Check all players on this team5957 for(int iPlayerLoop = 0; iPlayerLoop < MAX_MAJOR_CIVS; iPlayerLoop++)5958 {5959 eLoopPlayer = (PlayerTypes) iPlayerLoop;59605961 if(GET_PLAYER(eLoopPlayer).getTeam() == GetID() && eLoopPlayer == GC.getGame().getActivePlayer())5962 {5963 // Look at all Cities5964 for(pLoopCity = GET_PLAYER(eLoopPlayer).firstCity(&iLoop); pLoopCity != NULL; pLoopCity = GET_PLAYER(eLoopPlayer).nextCity(&iLoop))5965 {5966 eResourceDemanded = pLoopCity->GetResourceDemanded();59675968 if(eResourceDemanded != NO_RESOURCE)5969 {5970 // Resource being demanded is revealed by this Tech5971 if(GC.getResourceInfo(eResourceDemanded)->getTechReveal() == eIndex)5972 {5973 strBuffer = GetLocalizedText("TXT_KEY_MISC_RESOURCE_DISCOVERED_CITY_DEMANDS", GC.getResourceInfo(eResourceDemanded)->GetTextKey(), pLoopCity->getNameKey());5974 DLLUI->AddCityMessage(0, pLoopCity->GetIDInfo(), eLoopPlayer, false, GC.getEVENT_MESSAGE_TIME(), strBuffer/*, "AS2D_DISCOVERRESOURCE", MESSAGE_TYPE_INFO, GC.getResourceInfo(eResourceDemanded)->GetButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_WHITE"), pLoopCity->getX(), pLoopCity->getY(), true, true*/);5975 }5976 }5977 }5978 }5979 }5980 }5981 }59825983 for(int iI = 0; iI < MAX_TEAMS; iI++)5984 {5985 const TeamTypes eLoopTeam = static_cast<TeamTypes>(iI);5986 CvTeam& kLoopTeam = GET_TEAM(eLoopTeam);5987 if(kLoopTeam.isAlive())5988 {5989 if(eLoopTeam != GetID())5990 {5991 kLoopTeam.updateTechShare(eIndex);5992 }5993 }5994 }59955996 // Cities that are owed a culture building are granted a culture building5997 CvCity* pLoopCity;5998 int iLoop;5999 PlayerTypes eLoopPlayer;60006001 // Check all players on this team6002 for(int iPlayerLoop = 0; iPlayerLoop < MAX_MAJOR_CIVS; iPlayerLoop++)6003 {6004 eLoopPlayer = (PlayerTypes) iPlayerLoop;60056006 if(GET_PLAYER(eLoopPlayer).getTeam() == GetID())6007 {6008 // Look at all Cities6009 for(pLoopCity = GET_PLAYER(eLoopPlayer).firstCity(&iLoop); pLoopCity != NULL; pLoopCity = GET_PLAYER(eLoopPlayer).nextCity(&iLoop))6010 {6011 if (pLoopCity->IsOwedCultureBuilding())6012 {6013 BuildingTypes eFreeCultureBuilding = pLoopCity->ChooseFreeCultureBuilding();6014 if (eFreeCultureBuilding != NO_BUILDING)6015 {6016 pLoopCity->GetCityBuildings()->SetNumFreeBuilding(eFreeCultureBuilding, 1);6017 pLoopCity->SetOwedCultureBuilding(false);6018 }6019 }60206021#if defined(MOD_BUGFIX_FREE_FOOD_BUILDING)6022 if (pLoopCity->IsOwedFoodBuilding())6023 {6024 BuildingTypes eFreeFoodBuilding = pLoopCity->ChooseFreeFoodBuilding();6025 if (eFreeFoodBuilding != NO_BUILDING)6026 {6027 pLoopCity->GetCityBuildings()->SetNumFreeBuilding(eFreeFoodBuilding, 1);6028 pLoopCity->SetOwedFoodBuilding(false);6029 }6030 }6031#endif6032 }6033 }6034 }6035 }60366037 if(bNewValue)6038 {6039 if(bAnnounce)6040 {6041 if(GC.getGame().isFinalInitialized())6042 {6043 CvAssert(ePlayer != NO_PLAYER);6044 if(GET_PLAYER(ePlayer).isHuman())6045 {6046 if(GET_PLAYER(ePlayer).GetPlayerTechs()->IsResearch() && (GET_PLAYER(ePlayer).GetPlayerTechs()->GetCurrentResearch() == NO_TECH))6047 {6048 strBuffer = GetLocalizedText("TXT_KEY_MISC_WHAT_TO_RESEARCH_NEXT");6049 GET_PLAYER(ePlayer).chooseTech(0, strBuffer, eIndex);6050 }6051 }6052 }6053 }60546055 // espionage logic. Whenever someone gains a tech, reset the stealable techs for all other leaders6056 if(!GET_PLAYER(ePlayer).isMinorCiv() && !GET_PLAYER(ePlayer).isBarbarian())6057 {6058 CvPlayerEspionage* pEspionage = GET_PLAYER(ePlayer).GetEspionage();6059 if(pEspionage)6060 {6061 for(uint ui = 0; ui < MAX_MAJOR_CIVS; ui++)6062 {6063 pEspionage->BuildStealableTechList((PlayerTypes)ui);60646065 // if the player is out of techs to steal, set their number of stealable techs to zero6066 if(pEspionage->m_aaPlayerStealableTechList[ui].size() == 0)6067 {6068 pEspionage->m_aiNumTechsToStealList[ui] = 0;6069 }6070 }6071 }6072 }6073 }60746075 // Update Happiness for all players6076 for(int iPlayerLoop = 0; iPlayerLoop < MAX_MAJOR_CIVS; iPlayerLoop++)6077 {6078 if(GET_PLAYER((PlayerTypes)iPlayerLoop).isAlive() && GET_PLAYER((PlayerTypes) iPlayerLoop).getTeam() == GetID())6079 {6080 GET_PLAYER((PlayerTypes) iPlayerLoop).DoUpdateHappiness();6081 }6082 }60836084 if(GC.getGame().isFinalInitialized())6085 {6086 if(GetID() == GC.getGame().getActiveTeam())6087 {6088 DLLUI->setDirty(MiscButtons_DIRTY_BIT, true);6089 DLLUI->setDirty(SelectionButtons_DIRTY_BIT, true);6090 DLLUI->setDirty(ResearchButtons_DIRTY_BIT, true);6091 }60926093 if(eIndex != NO_TECH && bNewValue)6094 {6095 bool bDontShowRewardPopup = DLLUI->IsOptionNoRewardPopups();60966097#if defined(CIV_HOST_API)6098 CivHandPopupRaised(CivHostTeamPlayers(GetID()), BUTTONPOPUP_TECH_AWARD, -1, 0, eIndex, false, false, "");hand-placed hook: PopupRaised6099#endif6100 // Notification in MP games6101#if defined(MOD_API_EXTENSIONS)6102 if(bDontShowRewardPopup || GC.getGame().isReallyNetworkMultiPlayer())6103#else6104 if(bDontShowRewardPopup || GC.getGame().isNetworkMultiPlayer())6105#endif6106 {6107 Localization::String localizedText = Localization::Lookup("TXT_KEY_MISC_YOU_DISCOVERED_TECH");6108 localizedText << pkTechInfo->GetTextKey();6109 AddNotification(NOTIFICATION_TECH_AWARD, localizedText.toUTF8(), localizedText.toUTF8(), -1, -1, 0, (int) eIndex);6110 }6111 // Popup in SP games6112 else if(GetID() == GC.getGame().getActiveTeam())6113 {6114 CvPopupInfo kPopup(BUTTONPOPUP_TECH_AWARD, GC.getGame().getActivePlayer(), 0, eIndex);6115 //kPopup.setText(localizedText.toUTF8());6116 DLLUI->AddPopup(kPopup);6117 }6118 }6119 }61206121 if(bNewValue)6122 {6123 gDLL->GameplayTechAcquired(GetID(), eIndex);6124 }6125 }6126}
Calls
BaseVector::operator[]BaseVector::operator[]BaseVector::sizeCivHandPopupRaisedCivHostTeamPlayers- CustomMods::isGLOBAL_TRULY_FREE_GP()
- CvBaseInfo::GetTextKey() const
- CvBaseInfo::GetType() const
- CvCity::ChooseFreeCultureBuilding() const
- CvCity::ChooseFreeFoodBuilding() const
- CvCity::GetCityBuildings() const
- CvCity::GetCityCitizens() const
- CvCity::GetIDInfo() const
- CvCity::getNameKey() const
- CvCity::GetResourceDemanded(bool) const
- CvCity::IsOwedCultureBuilding() const
- CvCity::IsOwedFoodBuilding() const
- CvCity::SetOwedCultureBuilding(bool)
- CvCity::SetOwedFoodBuilding(bool)
- CvCity::updateStrengthValue()
- CvCityBuildings::SetNumFreeBuilding(BuildingTypes, int)
- CvCityCitizens::DoSpawnGreatPerson(UnitTypes, bool, bool, bool)
- CvCivilizationInfo::getCivilizationUnits(int) const
- CvGame::addReplayMessage(ReplayMessageTypes, PlayerTypes, const CvString &, int, int)
- CvGame::countKnownTechNumTeams(TechTypes)
- CvGame::getActivePlayer() const
- CvGame::getActiveTeam()
- CvGame::getGameTurn()
- CvGame::isFinalInitialized() const
- CvGame::isReallyNetworkMultiPlayer() const
- CvGlobals::getDLLIFace()
- CvGlobals::GetEngineUserInterface()
- CvGlobals::getEraInfo(EraTypes)
- CvGlobals::getEVENT_MESSAGE_TIME()
- CvGlobals::getGame()
- CvGlobals::getImprovementInfo(ImprovementTypes)
- CvGlobals::getInfoTypeForString(const char *, bool) const
- CvGlobals::getMap()
- CvGlobals::getNumEraInfos()
- CvGlobals::getNumTechInfos()
- CvGlobals::getResourceInfo(ResourceTypes)
- CvGlobals::getSCORE_FUTURE_TECH_MULTIPLIER()
- CvGlobals::getTechInfo(TechTypes)
- CvImprovementEntry::IsImprovementResourceTrade(int) const
- CvMap::findCity(int, int, PlayerTypes, TeamTypes, bool, bool, TeamTypes, DirectionTypes, const CvCity *)
- CvMap::numPlots() const
- CvMap::plotByIndexUnchecked(int) const
- CvMap::setRevealedPlots(TeamTypes, bool, bool)
- CvMap::updateDeferredFog()
- CvNotifications::Add(NotificationTypes, const char *, const char *, int, int, int, int)
- CvPlayer::changeNumResourceTotal(ResourceTypes, int, bool)
- CvPlayer::ChangeScoreFromFutureTech(int)
- CvPlayer::chooseTech(int, const char *, TechTypes)
- CvPlayer::clearResearchQueue()
- CvPlayer::DoUpdateHappiness()
- CvPlayer::firstCity(int *, bool)
- CvPlayer::getCapitalCity()
- CvPlayer::getCivilizationInfo() const
- CvPlayer::GetEspionage() const
- CvPlayer::getName() const
- CvPlayer::getNameKey() const
- CvPlayer::GetNotifications() const
- CvPlayer::GetPlayerTechs() const
- CvPlayer::getTeam() const
- CvPlayer::invalidateYieldRankCache(YieldTypes)
- CvPlayer::isAlive() const
- CvPlayer::isBarbarian() const
- CvPlayer::isHuman() const
- CvPlayer::isMinorCiv() const
- CvPlayer::nextCity(int *, bool)
- CvPlayer::popResearch(TechTypes)
- CvPlayerAI::AI_chooseFreeTech()
- CvPlayerAI::getPlayer(PlayerTypes)
- CvPlayerEspionage::BuildStealableTechList(PlayerTypes)
- CvPlayerTechs::GetCurrentResearch() const
- CvPlayerTechs::IsResearch() const
- CvPlayerTechs::IsResearchingTech(TechTypes) const
- CvPlot::DoFindCityToLinkResourceTo(CvCity *)
- CvPlot::getImprovementType() const
- CvPlot::getNumResourceForPlayer(PlayerTypes) const
- CvPlot::getOwner() const
- CvPlot::GetPlotIndex() const
- CvPlot::GetResourceLinkedCity() const
- CvPlot::getResourceType(TeamTypes) const
- CvPlot::getTeam() const
- CvPlot::getX() const
- CvPlot::getY() const
- CvPlot::isCity() const
- CvPlot::IsImprovedByGiftFromMajor() const
- CvPlot::isOwned() const
- CvPlot::IsResourceForceReveal(TeamTypes) const
- CvPlot::isRevealed(TeamTypes) const
- CvPlot::setLayoutDirty(bool)
- CvPlot::SetResourceLinkedCityActive(bool)
CvPopupInfo::CvPopupInfo- CvPreGame::loadWBScenario()
- CvResourceInfo::getResourceUsage() const
- CvResourceInfo::getTechCityTrade() const
- CvResourceInfo::getTechReveal() const
CvString::CvStringCvString::GetCStringCvString::operator const char *CvString::operator=- CvTeam::AddNotification(NotificationTypes, const char *, const char *, int, int, int, int)
- CvTeam::announceTechToPlayers(TechTypes, bool)
- CvTeam::DoUpdateBestRoute()
- CvTeam::GetCurrentEra() const
- CvTeam::GetID() const
- CvTeam::getLeaderID() const
- CvTeam::getTeam(TeamTypes)
- CvTeam::GetTeamTechs() const
- CvTeam::isAlive() const
- CvTeam::isForceRevealedResource(ResourceTypes) const
- CvTeam::isHasMet(TeamTypes) const
- CvTeam::isHuman() const
- CvTeam::processTech(TechTypes, int)
- CvTeam::SetCurrentEra(EraTypes)
- CvTeam::updateTechShare(TechTypes)
- CvTeamTechs::GetTechCount(TechTypes) const
- CvTeamTechs::HasTech(TechTypes) const
- CvTeamTechs::IncrementTechCount(TechTypes)
- CvTeamTechs::SetHasTech(TechTypes, bool)
- CvTeamTechs::SetResearchProgress(TechTypes, int, PlayerTypes)
- CvTechEntry::GetEra() const
- CvTechEntry::GetFirstFreeTechs() const
- CvTechEntry::GetFirstFreeUnitClass() const
- CvTechEntry::IsMapVisible() const
- CvTechEntry::IsRepeat() const
GetLocalizedTextGetLocalizedText- GetLocalizedText(const char *)
ICvEngineUtility1::GameplayTechAcquiredICvUserInterface1::AddCityMessageICvUserInterface1::AddMessageICvUserInterface1::AddPlotMessageICvUserInterface1::AddPopupICvUserInterface1::IsOptionNoRewardPopupsICvUserInterface1::setDirtyLocalization::LookupLocalization::String::toUTF8operator<<strcmp
Called by
- CvDllNetMessageHandler::ResponseResearch(PlayerTypes, TechTypes, int, PlayerTypes, bool)
- CvEspionageAI::StealTechnology()
- CvGame::initFreeState(CvGameInitialItemsOverrides &)
- CvPlayer::DoHurry(HurryTypes)
- CvPlayer::DoTechFromCityConquer(CvCity *)
- CvPlayer::doAdvancedStartAction(AdvancedStartActionTypes, int, int, int, bool)
- CvPlayer::receiveGoody(CvPlot *, GoodyTypes, CvUnit *)
- CvPlayerAI::AI_chooseFreeTech()
- CvTeam::DoBarbarianTech()
- CvTeam::DoMinorCivTech()
- CvTeam::shareItems(TeamTypes)
- CvTeam::updateTechShare(TechTypes)
- CvTeamTechs::SetResearchProgressTimes100(TechTypes, int, PlayerTypes, int, int)
- SetPlayerInitialItems(CvPlayer &, const CvWorldBuilderMap::Player &)
- SetTeamInitialItems(CvTeam &, const CvWorldBuilderMap::Team &)
- CvLuaTeam::lSetHasTech(lua_State *)