Hooks
static bool BeforeCvDllDatabaseUtility_SetGlobalActionInfo(CvDllDatabaseUtility* self, bool& result);static void AfterCvDllDatabaseUtility_SetGlobalActionInfo(CvDllDatabaseUtility* self, bool& result);static bool ReplaceCvDllDatabaseUtility_SetGlobalActionInfo(bool (*original)(CvDllDatabaseUtility*), CvDllDatabaseUtility* self);// CivHooks.h gives this hook point no types, so nothing checks these hooks' parameters.host->RegisterHook(host->pluginIndex, CivHooks::CvDllDatabaseUtility_SetGlobalActionInfo::ID, CIV_HOOK_BEFORE, (void*)&BeforeCvDllDatabaseUtility_SetGlobalActionInfo);host->RegisterHook(host->pluginIndex, CivHooks::CvDllDatabaseUtility_SetGlobalActionInfo::ID, CIV_HOOK_AFTER, (void*)&AfterCvDllDatabaseUtility_SetGlobalActionInfo);host->RegisterHook(host->pluginIndex, CivHooks::CvDllDatabaseUtility_SetGlobalActionInfo::ID, CIV_HOOK_REPLACE, (void*)&ReplaceCvDllDatabaseUtility_SetGlobalActionInfo);
Code
788bool CvDllDatabaseUtility::SetGlobalActionInfo()789{790 cvStopWatch kPerfTest("SetGlobalActionInfo", "xml-perf.log");791 LogMsg("SetGlobalActionInfo\n");792793 typedef std::vector<CvActionInfo*> ActionInfoVector;794 ActionInfoVector& actionInfos = GC.getActionInfo();795796 //First, clear out action info data797 for(ActionInfoVector::iterator it = actionInfos.begin(); it != actionInfos.end(); ++it)798 {799 CvActionInfo* pActionInfo = (*it);800 delete pActionInfo;801 }802 actionInfos.clear();803804 const int iNumMissionTypes = CvTypes::getNUM_MISSION_TYPES();805806 //Verify action counts807 if(!(NUM_INTERFACEMODE_TYPES > 0))808 {809 LogMsg("NUM_INTERFACE_TYPES is not greater than zero in CvDllDatabaseUtility::SetGlobalActionInfo.");810 }811 if(!(GC.getNumBuildInfos() > 0))812 {813 LogMsg("GC.getNumBuildInfos() is not greater than zero in CvDllDatabaseUtility::SetGlobalActionInfo.");814 }815 if(!(GC.getNumPromotionInfos() > 0))816 {817 LogMsg("GC.getNumPromotionInfos() is not greater than zero in CvDllDatabaseUtility::SetGlobalActionInfo.");818 }819 if(!(GC.getNumSpecialistInfos() > 0))820 {821 LogMsg("GC.getNumSpecialistInfos() is not greater than zero in CvDllDatabaseUtility::SetGlobalActionInfo.");822 }823 if(!(NUM_CONTROL_TYPES > 0))824 {825 LogMsg("NUM_CONTROL_TYPES is not greater than zero in CvDllDatabaseUtility::SetGlobalActionInfo.");826 }827 if(!(GC.getNumAutomateInfos() > 0))828 {829 LogMsg("GC.getNumAutomateInfos() is not greater than zero in CvDllDatabaseUtility::SetGlobalActionInfo.");830 }831 if(!(NUM_COMMAND_TYPES > 0))832 {833 LogMsg("NUM_COMMAND_TYPES is not greater than zero in CvDllDatabaseUtility::SetGlobalActionInfo.");834 }835 if(!(iNumMissionTypes > 0))836 {837 LogMsg("NUM_MISSION_TYPES is not greater than zero in CvDllDatabaseUtility::SetGlobalActionInfo.");838 }839840 int iEstimatedNumActionInfos =841 NUM_INTERFACEMODE_TYPES +842 GC.getNumBuildInfos() +843 GC.getNumPromotionInfos() +844 GC.getNumSpecialistInfos() +845 NUM_CONTROL_TYPES +846 NUM_COMMAND_TYPES +847 GC.getNumAutomateInfos() +848 iNumMissionTypes;849850 int* piBuffer = FNEW(int[iEstimatedNumActionInfos * 4], c_eCiv5GameplayDLL, 0);851 memset(piBuffer,0, sizeof(int) * iEstimatedNumActionInfos * 4);852853 int* piIndexList = piBuffer + iEstimatedNumActionInfos * 0; //FNEW(int[iNumActionInfos], c_eCiv5GameplayDLL, 0);854 int* piPriorityList = piBuffer + iEstimatedNumActionInfos * 1; //FNEW(int[iNumActionInfos], c_eCiv5GameplayDLL, 0);855 int* piActionInfoTypeList = piBuffer + iEstimatedNumActionInfos * 2; //FNEW(int[iNumActionInfos], c_eCiv5GameplayDLL, 0);856 int* piOrderedIndex = piBuffer + iEstimatedNumActionInfos * 3; //FNEW(int[iNumActionInfos], c_eCiv5GameplayDLL, 0);857858859 //Gather all available infos, checking for NULL entries as they may have been removed.860 int iTotalActionInfoCount = 0;861 int i = 0;862 for(i=0; i<NUM_COMMAND_TYPES; i++)863 {864 CvCommandInfo* commandInfo = GC.getCommandInfo((CommandTypes)i);865 if(commandInfo)866 {867 piIndexList[iTotalActionInfoCount] = i;868 piPriorityList[iTotalActionInfoCount] = commandInfo->getOrderPriority();869 piActionInfoTypeList[iTotalActionInfoCount] = ACTIONSUBTYPE_COMMAND;870 iTotalActionInfoCount++;871 }872 }873874 for(i=0; i<NUM_INTERFACEMODE_TYPES; i++)875 {876 CvInterfaceModeInfo* interfaceInfo = GC.getInterfaceModeInfo((InterfaceModeTypes)i);877 if(interfaceInfo)878 {879 piIndexList[iTotalActionInfoCount] = i;880 piPriorityList[iTotalActionInfoCount] = interfaceInfo->getOrderPriority();881 piActionInfoTypeList[iTotalActionInfoCount] = ACTIONSUBTYPE_INTERFACEMODE;882 iTotalActionInfoCount++;883 }884 }885886 for(i=0; i<GC.getNumBuildInfos(); i++)887 {888 CvBuildInfo* buildInfo = GC.getBuildInfo((BuildTypes)i);889 if(buildInfo)890 {891 piIndexList[iTotalActionInfoCount] = i;892 piPriorityList[iTotalActionInfoCount] = buildInfo->getOrderPriority();893 piActionInfoTypeList[iTotalActionInfoCount] = ACTIONSUBTYPE_BUILD;894 iTotalActionInfoCount++;895 }896 }897898 for(i=0; i<GC.getNumPromotionInfos(); i++)899 {900 CvPromotionEntry* promotionEntry = GC.getPromotionInfo((PromotionTypes)i);901 if(promotionEntry)902 {903 piIndexList[iTotalActionInfoCount] = i;904 piPriorityList[iTotalActionInfoCount] = promotionEntry->getOrderPriority();905 piActionInfoTypeList[iTotalActionInfoCount] = ACTIONSUBTYPE_PROMOTION;906 iTotalActionInfoCount++;907 }908 }909910 for(i=0; i<GC.getNumSpecialistInfos(); i++)911 {912 CvSpecialistInfo* specialistInfo = GC.getSpecialistInfo((SpecialistTypes)i);913 if(specialistInfo)914 {915 piIndexList[iTotalActionInfoCount] = i;916 piPriorityList[iTotalActionInfoCount] = specialistInfo->getOrderPriority();917 piActionInfoTypeList[iTotalActionInfoCount] = ACTIONSUBTYPE_SPECIALIST;918 iTotalActionInfoCount++;919 }920 }921922 for(i=0; i<NUM_CONTROL_TYPES; i++)923 {924 CvControlInfo* controlInfo = GC.getControlInfo((ControlTypes)i);925 if(controlInfo)926 {927 piIndexList[iTotalActionInfoCount] = i;928 piPriorityList[iTotalActionInfoCount] = controlInfo->getOrderPriority();929 piActionInfoTypeList[iTotalActionInfoCount] = ACTIONSUBTYPE_CONTROL;930 iTotalActionInfoCount++;931 }932 }933934 for(i=0; i<GC.getNumAutomateInfos(); i++)935 {936 CvAutomateInfo* automateInfo = GC.getAutomateInfo(i);937 if(automateInfo)938 {939 piIndexList[iTotalActionInfoCount] = i;940 piPriorityList[iTotalActionInfoCount] = automateInfo->getOrderPriority();941 piActionInfoTypeList[iTotalActionInfoCount] = ACTIONSUBTYPE_AUTOMATE;942 iTotalActionInfoCount++;943 }944 }945946 for(i=0; i<iNumMissionTypes; i++)947 {948 CvMissionInfo* missionInfo = GC.getMissionInfo((MissionTypes)i);949 if(missionInfo)950 {951 piIndexList[iTotalActionInfoCount] = i;952 piPriorityList[iTotalActionInfoCount] = missionInfo->getOrderPriority();953 piActionInfoTypeList[iTotalActionInfoCount] = ACTIONSUBTYPE_MISSION;954 iTotalActionInfoCount++;955 }956 }957958 //Preallocate959 actionInfos.reserve(iTotalActionInfoCount);960961 //Sort and add action infos.962 orderHotkeyInfo(&piOrderedIndex, piPriorityList, iTotalActionInfoCount);963 for(i = 0; i < iTotalActionInfoCount; i++)964 {965 CvActionInfo* pActionInfo = FNEW(CvActionInfo, c_eCiv5GameplayDLL, 0);966 CvAssert(piIndexList[piOrderedIndex[i]] != -1);967968 pActionInfo->setOriginalIndex(piIndexList[piOrderedIndex[i]]);969 pActionInfo->setSubType((ActionSubTypes)piActionInfoTypeList[piOrderedIndex[i]]);970 if((ActionSubTypes)piActionInfoTypeList[piOrderedIndex[i]] == ACTIONSUBTYPE_COMMAND)971 {972 GC.getCommandInfo((CommandTypes)piIndexList[piOrderedIndex[i]])->setActionInfoIndex(i);973 }974 else if((ActionSubTypes)piActionInfoTypeList[piOrderedIndex[i]] == ACTIONSUBTYPE_INTERFACEMODE)975 {976 GC.getInterfaceModeInfo((InterfaceModeTypes)piIndexList[piOrderedIndex[i]])->setActionInfoIndex(i);977 }978 else if((ActionSubTypes)piActionInfoTypeList[piOrderedIndex[i]] == ACTIONSUBTYPE_BUILD)979 {980 GC.getBuildInfo((BuildTypes)piIndexList[piOrderedIndex[i]])->setMissionType(GC.getInfoTypeForString("MISSION_BUILD"));981 GC.getBuildInfo((BuildTypes)piIndexList[piOrderedIndex[i]])->setActionInfoIndex(i);982 }983 else if((ActionSubTypes)piActionInfoTypeList[piOrderedIndex[i]] == ACTIONSUBTYPE_PROMOTION)984 {985 CvPromotionEntry* pkEntry = GC.getPromotionInfo((PromotionTypes)piIndexList[piOrderedIndex[i]]);986987 pkEntry->SetCommandType(GC.getInfoTypeForString("COMMAND_PROMOTION"));988 pkEntry->setActionInfoIndex(i);989 CvString strHotKey = pkEntry->CreateHotKeyFromDescription(pkEntry->getHotKey(), pkEntry->isShiftDown(), pkEntry->isAltDown(), pkEntry->isCtrlDown());990 pkEntry->setHotKeyDescription(pkEntry->GetDescription(), GC.getCommandInfo((CommandTypes)(pkEntry->GetCommandType()))->GetDescription(), strHotKey);991 }992 else if((ActionSubTypes)piActionInfoTypeList[piOrderedIndex[i]] == ACTIONSUBTYPE_SPECIALIST)993 {994 CvSpecialistInfo* pkSpecialist = GC.getSpecialistInfo((SpecialistTypes)piIndexList[piOrderedIndex[i]]);995996 pkSpecialist->setMissionType(GC.getInfoTypeForString("MISSION_JOIN"));997 pkSpecialist->setActionInfoIndex(i);998 CvString strHotKey = pkSpecialist->CreateHotKeyFromDescription(pkSpecialist->getHotKey(), pkSpecialist->isShiftDown(), pkSpecialist->isAltDown(), pkSpecialist->isCtrlDown());999 pkSpecialist->setHotKeyDescription(pkSpecialist->GetDescription(), GC.getMissionInfo((MissionTypes)(pkSpecialist->getMissionType()))->GetDescription(), strHotKey);1000 }1001 else if((ActionSubTypes)piActionInfoTypeList[piOrderedIndex[i]] == ACTIONSUBTYPE_CONTROL)1002 {1003 GC.getControlInfo((ControlTypes)piIndexList[piOrderedIndex[i]])->setActionInfoIndex(i);1004 }1005 else if((ActionSubTypes)piActionInfoTypeList[piOrderedIndex[i]] == ACTIONSUBTYPE_AUTOMATE)1006 {1007 GC.getAutomateInfo(piIndexList[piOrderedIndex[i]])->setActionInfoIndex(i);1008 }1009 else if((ActionSubTypes)piActionInfoTypeList[piOrderedIndex[i]] == ACTIONSUBTYPE_MISSION)1010 {1011 GC.getMissionInfo((MissionTypes)piIndexList[piOrderedIndex[i]])->setActionInfoIndex(i);1012 }10131014 GC.getActionInfo().push_back(pActionInfo);1015 }10161017 SAFE_DELETE_ARRAY(piBuffer);1018// SAFE_DELETE_ARRAY(piOrderedIndex);1019// SAFE_DELETE_ARRAY(piIndexList);1020// SAFE_DELETE_ARRAY(piPriorityList);1021// SAFE_DELETE_ARRAY(piActionInfoTypeList);10221023 return true;1024}